17f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray/* 27f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray * Copyright (C) 2018 The Android Open Source Project 37f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray * 47f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray * Licensed under the Apache License, Version 2.0 (the "License"); 57f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray * you may not use this file except in compliance with the License. 67f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray * You may obtain a copy of the License at 77f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray * 87f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray * http://www.apache.org/licenses/LICENSE-2.0 97f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray * 107f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray * Unless required by applicable law or agreed to in writing, software 117f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray * distributed under the License is distributed on an "AS IS" BASIS, 127f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray * See the License for the specific language governing permissions and 147f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray * limitations under the License. 157f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray */ 167f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray 177f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray#ifndef ART_TOOLS_VERIDEX_VERIDEX_H_ 187f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray#define ART_TOOLS_VERIDEX_VERIDEX_H_ 197f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray 207f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray#include <map> 217f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray 227f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray#include "dex/dex_file.h" 237f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray#include "dex/primitive.h" 247f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray 257f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffraynamespace art { 267f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray 272a843c81e61128d2c1723c064786f8b7193c62f5Nicolas Geoffraystatic int gTargetSdkVersion = 1000; // Will be initialized after parsing options. 282a843c81e61128d2c1723c064786f8b7193c62f5Nicolas Geoffray 297f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray/** 30242758af3cf6eae389f43d3804acaabaa4ba93daNicolas Geoffray * Abstraction for fields defined in dex files. Currently, that's a pointer into their 31242758af3cf6eae389f43d3804acaabaa4ba93daNicolas Geoffray * `encoded_field` description. 32242758af3cf6eae389f43d3804acaabaa4ba93daNicolas Geoffray */ 33242758af3cf6eae389f43d3804acaabaa4ba93daNicolas Geoffrayusing VeriField = const uint8_t*; 34242758af3cf6eae389f43d3804acaabaa4ba93daNicolas Geoffray 35242758af3cf6eae389f43d3804acaabaa4ba93daNicolas Geoffray/** 36242758af3cf6eae389f43d3804acaabaa4ba93daNicolas Geoffray * Abstraction for methods defined in dex files. Currently, that's a pointer into their 37242758af3cf6eae389f43d3804acaabaa4ba93daNicolas Geoffray * `encoded_method` description. 38242758af3cf6eae389f43d3804acaabaa4ba93daNicolas Geoffray */ 39242758af3cf6eae389f43d3804acaabaa4ba93daNicolas Geoffrayusing VeriMethod = const uint8_t*; 40242758af3cf6eae389f43d3804acaabaa4ba93daNicolas Geoffray 41242758af3cf6eae389f43d3804acaabaa4ba93daNicolas Geoffray/** 427f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray * Abstraction for classes defined, or implicitly defined (for arrays and primitives) 437f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray * in dex files. 447f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray */ 457f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffrayclass VeriClass { 467f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray public: 477f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray VeriClass(const VeriClass& other) = default; 487f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray VeriClass() = default; 497f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray VeriClass(Primitive::Type k, uint8_t dims, const DexFile::ClassDef* cl) 507f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray : kind_(k), dimensions_(dims), class_def_(cl) {} 517f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray 527f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray bool IsUninitialized() const { 537f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray return kind_ == Primitive::Type::kPrimNot && dimensions_ == 0 && class_def_ == nullptr; 547f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray } 557f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray 567f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray bool IsPrimitive() const { 577f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray return kind_ != Primitive::Type::kPrimNot && dimensions_ == 0; 587f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray } 597f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray 607f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray bool IsArray() const { 617f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray return dimensions_ != 0; 627f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray } 637f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray 64988a6f52ab94df8cd46242a810f4fea5a94f2b95Nicolas Geoffray Primitive::Type GetKind() const { return kind_; } 65988a6f52ab94df8cd46242a810f4fea5a94f2b95Nicolas Geoffray uint8_t GetDimensions() const { return dimensions_; } 66988a6f52ab94df8cd46242a810f4fea5a94f2b95Nicolas Geoffray const DexFile::ClassDef* GetClassDef() const { return class_def_; } 67988a6f52ab94df8cd46242a810f4fea5a94f2b95Nicolas Geoffray 68988a6f52ab94df8cd46242a810f4fea5a94f2b95Nicolas Geoffray static VeriClass* object_; 69242758af3cf6eae389f43d3804acaabaa4ba93daNicolas Geoffray static VeriClass* class_; 70295cba006e5212c06fde5ec956c81c507b2974e6Nicolas Geoffray static VeriClass* class_loader_; 71242758af3cf6eae389f43d3804acaabaa4ba93daNicolas Geoffray static VeriClass* string_; 72242758af3cf6eae389f43d3804acaabaa4ba93daNicolas Geoffray static VeriClass* throwable_; 73988a6f52ab94df8cd46242a810f4fea5a94f2b95Nicolas Geoffray static VeriClass* boolean_; 74988a6f52ab94df8cd46242a810f4fea5a94f2b95Nicolas Geoffray static VeriClass* byte_; 75988a6f52ab94df8cd46242a810f4fea5a94f2b95Nicolas Geoffray static VeriClass* char_; 76988a6f52ab94df8cd46242a810f4fea5a94f2b95Nicolas Geoffray static VeriClass* short_; 77988a6f52ab94df8cd46242a810f4fea5a94f2b95Nicolas Geoffray static VeriClass* integer_; 78988a6f52ab94df8cd46242a810f4fea5a94f2b95Nicolas Geoffray static VeriClass* float_; 79988a6f52ab94df8cd46242a810f4fea5a94f2b95Nicolas Geoffray static VeriClass* double_; 80988a6f52ab94df8cd46242a810f4fea5a94f2b95Nicolas Geoffray static VeriClass* long_; 81988a6f52ab94df8cd46242a810f4fea5a94f2b95Nicolas Geoffray static VeriClass* void_; 82988a6f52ab94df8cd46242a810f4fea5a94f2b95Nicolas Geoffray 83242758af3cf6eae389f43d3804acaabaa4ba93daNicolas Geoffray static VeriMethod forName_; 84242758af3cf6eae389f43d3804acaabaa4ba93daNicolas Geoffray static VeriMethod getField_; 85242758af3cf6eae389f43d3804acaabaa4ba93daNicolas Geoffray static VeriMethod getDeclaredField_; 86242758af3cf6eae389f43d3804acaabaa4ba93daNicolas Geoffray static VeriMethod getMethod_; 87242758af3cf6eae389f43d3804acaabaa4ba93daNicolas Geoffray static VeriMethod getDeclaredMethod_; 88242758af3cf6eae389f43d3804acaabaa4ba93daNicolas Geoffray static VeriMethod getClass_; 89295cba006e5212c06fde5ec956c81c507b2974e6Nicolas Geoffray static VeriMethod loadClass_; 90242758af3cf6eae389f43d3804acaabaa4ba93daNicolas Geoffray 912a843c81e61128d2c1723c064786f8b7193c62f5Nicolas Geoffray static VeriField sdkInt_; 922a843c81e61128d2c1723c064786f8b7193c62f5Nicolas Geoffray 937f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray private: 947f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray Primitive::Type kind_; 957f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray uint8_t dimensions_; 967f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray const DexFile::ClassDef* class_def_; 977f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray}; 987f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray 99242758af3cf6eae389f43d3804acaabaa4ba93daNicolas Geoffrayinline bool IsGetMethod(VeriMethod method) { 100242758af3cf6eae389f43d3804acaabaa4ba93daNicolas Geoffray return method == VeriClass::getMethod_ || method == VeriClass::getDeclaredMethod_; 101242758af3cf6eae389f43d3804acaabaa4ba93daNicolas Geoffray} 1027f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray 103242758af3cf6eae389f43d3804acaabaa4ba93daNicolas Geoffrayinline bool IsGetField(VeriMethod method) { 104242758af3cf6eae389f43d3804acaabaa4ba93daNicolas Geoffray return method == VeriClass::getField_ || method == VeriClass::getDeclaredField_; 105242758af3cf6eae389f43d3804acaabaa4ba93daNicolas Geoffray} 1067f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray 107988a6f52ab94df8cd46242a810f4fea5a94f2b95Nicolas Geoffray/** 108988a6f52ab94df8cd46242a810f4fea5a94f2b95Nicolas Geoffray * Map from name to VeriClass to quickly lookup classes. 109988a6f52ab94df8cd46242a810f4fea5a94f2b95Nicolas Geoffray */ 1107f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffrayusing TypeMap = std::map<std::string, VeriClass*>; 1117f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray 1127f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray} // namespace art 1137f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray 1147f3d60a35703334c86cb633d94b26911d4b252d9Nicolas Geoffray#endif // ART_TOOLS_VERIDEX_VERIDEX_H_ 115