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