xref: /aosp_15_r20/art/tools/veridex/veridex.h (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
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