/* * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef ART_TOOLS_VERIDEX_RESOLVER_H_ #define ART_TOOLS_VERIDEX_RESOLVER_H_ #include "dex/dex_file.h" #include "veridex.h" namespace art { class HiddenApi; class VeridexResolver; /** * Map from the start of a dex file (ie DexFile::Begin()), to * its corresponding resolver. */ using DexResolverMap = std::map; class VeridexResolver { public: VeridexResolver(const DexFile& dex_file, const DexResolverMap& dex_resolvers, TypeMap& type_map) : dex_file_(dex_file), type_map_(type_map), dex_resolvers_(dex_resolvers), type_infos_(dex_file.NumTypeIds(), VeriClass()), method_infos_(dex_file.NumMethodIds(), nullptr), field_infos_(dex_file.NumFieldIds(), nullptr) {} // Run on the defined classes of that dex file and populate our // local type cache. void Run(); // Return the class declared at `index`. VeriClass* GetVeriClass(dex::TypeIndex index); // Return the method declared at `method_index`. VeriMethod GetMethod(uint32_t method_index); // Return the field declared at `field_index`. VeriField GetField(uint32_t field_index); // Do a JLS lookup in `kls` to find a method. VeriMethod LookupMethodIn(const VeriClass& kls, const char* method_name, const Signature& method_signature); // Do a JLS lookup in `kls` to find a field. VeriField LookupFieldIn(const VeriClass& kls, const char* field_name, const char* field_type); // Lookup a method declared in `kls`. VeriMethod LookupDeclaredMethodIn(const VeriClass& kls, const char* method_name, const char* signature) const; // Resolve all type_id/method_id/field_id. void ResolveAll(); // The dex file this resolver is associated to. const DexFile& GetDexFile() const { return dex_file_; } const DexFile& GetDexFileOf(const VeriClass& kls) { return GetResolverOf(kls)->dex_file_; } private: // Return the resolver where `kls` is from. VeridexResolver* GetResolverOf(const VeriClass& kls) const; const DexFile& dex_file_; TypeMap& type_map_; const DexResolverMap& dex_resolvers_; std::vector type_infos_; std::vector method_infos_; std::vector field_infos_; }; } // namespace art #endif // ART_TOOLS_VERIDEX_RESOLVER_H_