1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2018 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker *
4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker *
8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker *
10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker */
16*795d594fSAndroid Build Coastguard Worker
17*795d594fSAndroid Build Coastguard Worker #ifndef ART_TOOLS_VERIDEX_VERIDEX_H_
18*795d594fSAndroid Build Coastguard Worker #define ART_TOOLS_VERIDEX_VERIDEX_H_
19*795d594fSAndroid Build Coastguard Worker
20*795d594fSAndroid Build Coastguard Worker #include <map>
21*795d594fSAndroid Build Coastguard Worker
22*795d594fSAndroid Build Coastguard Worker #include "dex/primitive.h"
23*795d594fSAndroid Build Coastguard Worker
24*795d594fSAndroid Build Coastguard Worker namespace art {
25*795d594fSAndroid Build Coastguard Worker
26*795d594fSAndroid Build Coastguard Worker namespace dex {
27*795d594fSAndroid Build Coastguard Worker struct ClassDef;
28*795d594fSAndroid Build Coastguard Worker } // namespace dex
29*795d594fSAndroid Build Coastguard Worker
30*795d594fSAndroid Build Coastguard Worker static int gTargetSdkVersion = 1000; // Will be initialized after parsing options.
31*795d594fSAndroid Build Coastguard Worker
32*795d594fSAndroid Build Coastguard Worker /**
33*795d594fSAndroid Build Coastguard Worker * Abstraction for fields defined in dex files. Currently, that's a pointer into their
34*795d594fSAndroid Build Coastguard Worker * `encoded_field` description.
35*795d594fSAndroid Build Coastguard Worker */
36*795d594fSAndroid Build Coastguard Worker using VeriField = const uint8_t*;
37*795d594fSAndroid Build Coastguard Worker
38*795d594fSAndroid Build Coastguard Worker /**
39*795d594fSAndroid Build Coastguard Worker * Abstraction for methods defined in dex files. Currently, that's a pointer into their
40*795d594fSAndroid Build Coastguard Worker * `encoded_method` description.
41*795d594fSAndroid Build Coastguard Worker */
42*795d594fSAndroid Build Coastguard Worker using VeriMethod = const uint8_t*;
43*795d594fSAndroid Build Coastguard Worker
44*795d594fSAndroid Build Coastguard Worker /**
45*795d594fSAndroid Build Coastguard Worker * Abstraction for classes defined, or implicitly defined (for arrays and primitives)
46*795d594fSAndroid Build Coastguard Worker * in dex files.
47*795d594fSAndroid Build Coastguard Worker */
48*795d594fSAndroid Build Coastguard Worker class VeriClass {
49*795d594fSAndroid Build Coastguard Worker public:
50*795d594fSAndroid Build Coastguard Worker VeriClass() = default;
VeriClass(Primitive::Type k,uint8_t dims,const dex::ClassDef * cl)51*795d594fSAndroid Build Coastguard Worker VeriClass(Primitive::Type k, uint8_t dims, const dex::ClassDef* cl)
52*795d594fSAndroid Build Coastguard Worker : kind_(k), dimensions_(dims), class_def_(cl) {}
53*795d594fSAndroid Build Coastguard Worker
IsUninitialized()54*795d594fSAndroid Build Coastguard Worker bool IsUninitialized() const {
55*795d594fSAndroid Build Coastguard Worker return kind_ == Primitive::Type::kPrimNot && dimensions_ == 0 && class_def_ == nullptr;
56*795d594fSAndroid Build Coastguard Worker }
57*795d594fSAndroid Build Coastguard Worker
IsPrimitive()58*795d594fSAndroid Build Coastguard Worker bool IsPrimitive() const {
59*795d594fSAndroid Build Coastguard Worker return kind_ != Primitive::Type::kPrimNot && dimensions_ == 0;
60*795d594fSAndroid Build Coastguard Worker }
61*795d594fSAndroid Build Coastguard Worker
IsArray()62*795d594fSAndroid Build Coastguard Worker bool IsArray() const {
63*795d594fSAndroid Build Coastguard Worker return dimensions_ != 0;
64*795d594fSAndroid Build Coastguard Worker }
65*795d594fSAndroid Build Coastguard Worker
GetKind()66*795d594fSAndroid Build Coastguard Worker Primitive::Type GetKind() const { return kind_; }
GetDimensions()67*795d594fSAndroid Build Coastguard Worker uint8_t GetDimensions() const { return dimensions_; }
GetClassDef()68*795d594fSAndroid Build Coastguard Worker const dex::ClassDef* GetClassDef() const { return class_def_; }
69*795d594fSAndroid Build Coastguard Worker
70*795d594fSAndroid Build Coastguard Worker static VeriClass* object_;
71*795d594fSAndroid Build Coastguard Worker static VeriClass* class_;
72*795d594fSAndroid Build Coastguard Worker static VeriClass* class_loader_;
73*795d594fSAndroid Build Coastguard Worker static VeriClass* string_;
74*795d594fSAndroid Build Coastguard Worker static VeriClass* throwable_;
75*795d594fSAndroid Build Coastguard Worker static VeriClass* boolean_;
76*795d594fSAndroid Build Coastguard Worker static VeriClass* byte_;
77*795d594fSAndroid Build Coastguard Worker static VeriClass* char_;
78*795d594fSAndroid Build Coastguard Worker static VeriClass* short_;
79*795d594fSAndroid Build Coastguard Worker static VeriClass* integer_;
80*795d594fSAndroid Build Coastguard Worker static VeriClass* float_;
81*795d594fSAndroid Build Coastguard Worker static VeriClass* double_;
82*795d594fSAndroid Build Coastguard Worker static VeriClass* long_;
83*795d594fSAndroid Build Coastguard Worker static VeriClass* void_;
84*795d594fSAndroid Build Coastguard Worker
85*795d594fSAndroid Build Coastguard Worker static VeriMethod forName_;
86*795d594fSAndroid Build Coastguard Worker static VeriMethod getField_;
87*795d594fSAndroid Build Coastguard Worker static VeriMethod getDeclaredField_;
88*795d594fSAndroid Build Coastguard Worker static VeriMethod getMethod_;
89*795d594fSAndroid Build Coastguard Worker static VeriMethod getDeclaredMethod_;
90*795d594fSAndroid Build Coastguard Worker static VeriMethod getClass_;
91*795d594fSAndroid Build Coastguard Worker static VeriMethod loadClass_;
92*795d594fSAndroid Build Coastguard Worker
93*795d594fSAndroid Build Coastguard Worker static VeriField sdkInt_;
94*795d594fSAndroid Build Coastguard Worker
95*795d594fSAndroid Build Coastguard Worker private:
96*795d594fSAndroid Build Coastguard Worker Primitive::Type kind_;
97*795d594fSAndroid Build Coastguard Worker uint8_t dimensions_;
98*795d594fSAndroid Build Coastguard Worker const dex::ClassDef* class_def_;
99*795d594fSAndroid Build Coastguard Worker };
100*795d594fSAndroid Build Coastguard Worker
IsGetMethod(VeriMethod method)101*795d594fSAndroid Build Coastguard Worker inline bool IsGetMethod(VeriMethod method) {
102*795d594fSAndroid Build Coastguard Worker return method == VeriClass::getMethod_ || method == VeriClass::getDeclaredMethod_;
103*795d594fSAndroid Build Coastguard Worker }
104*795d594fSAndroid Build Coastguard Worker
IsGetField(VeriMethod method)105*795d594fSAndroid Build Coastguard Worker inline bool IsGetField(VeriMethod method) {
106*795d594fSAndroid Build Coastguard Worker return method == VeriClass::getField_ || method == VeriClass::getDeclaredField_;
107*795d594fSAndroid Build Coastguard Worker }
108*795d594fSAndroid Build Coastguard Worker
109*795d594fSAndroid Build Coastguard Worker /**
110*795d594fSAndroid Build Coastguard Worker * Map from name to VeriClass to quickly lookup classes.
111*795d594fSAndroid Build Coastguard Worker */
112*795d594fSAndroid Build Coastguard Worker using TypeMap = std::map<std::string, VeriClass*>;
113*795d594fSAndroid Build Coastguard Worker
114*795d594fSAndroid Build Coastguard Worker } // namespace art
115*795d594fSAndroid Build Coastguard Worker
116*795d594fSAndroid Build Coastguard Worker #endif // ART_TOOLS_VERIDEX_VERIDEX_H_
117