oat_file.h revision 9aa352e92b6ca0f2250cb7f54dfbf4b1be714c19
12faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes/* 22faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Copyright (C) 2011 The Android Open Source Project 32faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 42faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License"); 52faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * you may not use this file except in compliance with the License. 62faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * You may obtain a copy of the License at 72faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 82faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 92faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 102faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Unless required by applicable law or agreed to in writing, software 112faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 122faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * See the License for the specific language governing permissions and 142faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * limitations under the License. 152faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes */ 16e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom 17fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#ifndef ART_RUNTIME_OAT_FILE_H_ 18fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#define ART_RUNTIME_OAT_FILE_H_ 19e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom 203f5838d7d0b9fc63db0ccc35c2ea05ed29264986Vladimir Marko#include <list> 21700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom#include <string> 22e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom#include <vector> 23e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom 243f5838d7d0b9fc63db0ccc35c2ea05ed29264986Vladimir Marko#include "base/mutex.h" 25539690a351d8c325707368729aafa2b4fa134d4cVladimir Marko#include "base/stringpiece.h" 262dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "dex_file.h" 272dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "invoke_type.h" 282dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mem_map.h" 2998d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang#include "mirror/class.h" 302dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "oat.h" 31700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom#include "os.h" 329aa352e92b6ca0f2250cb7f54dfbf4b1be714c19David Sehr#include "type_lookup_table.h" 339aa352e92b6ca0f2250cb7f54dfbf4b1be714c19David Sehr#include "utf.h" 346bc4374e3fa00e3ee5e832e1761c43e0b8a71558Nicolas Geoffray#include "utils.h" 357b49e6cade09bc65b3b5f22d45fc9d0a7184e4f2David Brazdil#include "vdex_file.h" 36e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom 37e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstromnamespace art { 38e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom 39ba150c37d582eeeb8c11ba5245edc281cf31793cBrian Carlstromclass BitVector; 40700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstromclass ElfFile; 41700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstromclass MemMap; 42700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstromclass OatMethodOffsets; 4333e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogersclass OatHeader; 4407b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhlerclass OatDexFile; 45700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom 465351da0225d027a19420153615634a1c78966bcaMathieu Chartiernamespace gc { 475351da0225d027a19420153615634a1c78966bcaMathieu Chartiernamespace collector { 485351da0225d027a19420153615634a1c78966bcaMathieu Chartierclass DummyOatFile; 495351da0225d027a19420153615634a1c78966bcaMathieu Chartier} // namespace collector 505351da0225d027a19420153615634a1c78966bcaMathieu Chartier} // namespace gc 515351da0225d027a19420153615634a1c78966bcaMathieu Chartier 527b49e6cade09bc65b3b5f22d45fc9d0a7184e4f2David Brazdil// Runtime representation of the OAT file format which holds compiler output. 537b49e6cade09bc65b3b5f22d45fc9d0a7184e4f2David Brazdil// The class opens an OAT file from storage and maps it to memory, typically with 547b49e6cade09bc65b3b5f22d45fc9d0a7184e4f2David Brazdil// dlopen and provides access to its internal data structures (see OatWriter for 557b49e6cade09bc65b3b5f22d45fc9d0a7184e4f2David Brazdil// for more details about the OAT format). 567b49e6cade09bc65b3b5f22d45fc9d0a7184e4f2David Brazdil// In the process of loading OAT, the class also loads the associated VDEX file 577b49e6cade09bc65b3b5f22d45fc9d0a7184e4f2David Brazdil// with the input DEX files (see VdexFile for details about the VDEX format). 587b49e6cade09bc65b3b5f22d45fc9d0a7184e4f2David Brazdil// The raw DEX data are accessible transparently through the OatDexFile objects. 597b49e6cade09bc65b3b5f22d45fc9d0a7184e4f2David Brazdil 60049cff0ed5e28aa17a17e456efe3121b6d58910fAndreas Gampeclass OatFile { 61e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom public: 62f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao // Special classpath that skips shared library check. 63f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao static constexpr const char* kSpecialSharedLibrary = "&"; 64f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao 6507b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler typedef art::OatDexFile OatDexFile; 6607b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler 6784d7605f93f1e6e86a16e02017e305c90e93117aAlex Light // Opens an oat file contained within the given elf file. This is always opened as 6884d7605f93f1e6e86a16e02017e305c90e93117aAlex Light // non-executable at the moment. 69c93b3be140f6a57a572f2a4cdaf46aba87235a02David Brazdil static OatFile* OpenWithElfFile(ElfFile* elf_file, 70c93b3be140f6a57a572f2a4cdaf46aba87235a02David Brazdil VdexFile* vdex_file, 71c93b3be140f6a57a572f2a4cdaf46aba87235a02David Brazdil const std::string& location, 72e5fed03772144595c0904faf3d6974cc55214c8cRichard Uhler const char* abs_dex_location, 73b1d8c314b55bb2df2b2bb72a3daaf5db65b7ebc7Igor Murashkin std::string* error_msg); 742cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier // Open an oat file. Returns null on failure. Requested base can 75e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom // optionally be used to request where the file should be loaded. 76e5fed03772144595c0904faf3d6974cc55214c8cRichard Uhler // See the ResolveRelativeEncodedDexLocation for a description of how the 77e5fed03772144595c0904faf3d6974cc55214c8cRichard Uhler // abs_dex_location argument is used. 78e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom static OatFile* Open(const std::string& filename, 79a004aa933a58428489e42d77f707c2b063b73747Brian Carlstrom const std::string& location, 8013735955f39b3b304c37d2b2840663c131262c18Ian Rogers uint8_t* requested_base, 8146774767fcf7780d1455e755729198648d08742eIgor Murashkin uint8_t* oat_file_begin, 828d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers bool executable, 830b4cbd0c2a75b47ae09d21e5d73d2b1709cb5b9eMathieu Chartier bool low_4gb, 84e5fed03772144595c0904faf3d6974cc55214c8cRichard Uhler const char* abs_dex_location, 85b1d8c314b55bb2df2b2bb72a3daaf5db65b7ebc7Igor Murashkin std::string* error_msg); 86e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom 87700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom // Open an oat file from an already opened File. 88265091e581c9f643b37e7966890911f09e223269Brian Carlstrom // Does not use dlopen underneath so cannot be used for runtime use 89265091e581c9f643b37e7966890911f09e223269Brian Carlstrom // where relocations may be required. Currently used from 90265091e581c9f643b37e7966890911f09e223269Brian Carlstrom // ImageWriter which wants to open a writable version from an existing 91265091e581c9f643b37e7966890911f09e223269Brian Carlstrom // file descriptor for patching. 92b1d8c314b55bb2df2b2bb72a3daaf5db65b7ebc7Igor Murashkin static OatFile* OpenWritable(File* file, const std::string& location, 93e5fed03772144595c0904faf3d6974cc55214c8cRichard Uhler const char* abs_dex_location, 94b1d8c314b55bb2df2b2bb72a3daaf5db65b7ebc7Igor Murashkin std::string* error_msg); 95a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light // Opens an oat file from an already opened File. Maps it PROT_READ, MAP_PRIVATE. 96b1d8c314b55bb2df2b2bb72a3daaf5db65b7ebc7Igor Murashkin static OatFile* OpenReadable(File* file, const std::string& location, 97e5fed03772144595c0904faf3d6974cc55214c8cRichard Uhler const char* abs_dex_location, 98b1d8c314b55bb2df2b2bb72a3daaf5db65b7ebc7Igor Murashkin std::string* error_msg); 99700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom 100049cff0ed5e28aa17a17e456efe3121b6d58910fAndreas Gampe virtual ~OatFile(); 101e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom 1029dcc4572949f6a8231a1b4ed859676ba6f411726Alex Light bool IsExecutable() const { 1039dcc4572949f6a8231a1b4ed859676ba6f411726Alex Light return is_executable_; 1049dcc4572949f6a8231a1b4ed859676ba6f411726Alex Light } 1059dcc4572949f6a8231a1b4ed859676ba6f411726Alex Light 106d1537b569b6cd18297c5e02d13cdd588c4366c51Richard Uhler bool HasPatchInfo() const; 107d1537b569b6cd18297c5e02d13cdd588c4366c51Richard Uhler 1087ba649636c4475c3992fa15a57acd2546d69ff38Andreas Gampe bool IsPic() const; 1097ba649636c4475c3992fa15a57acd2546d69ff38Andreas Gampe 1100de1133ba600f299b3d67938f650720d9f859eb2Sebastien Hertz // Indicates whether the oat file was compiled with full debugging capability. 1110de1133ba600f299b3d67938f650720d9f859eb2Sebastien Hertz bool IsDebuggable() const; 1120de1133ba600f299b3d67938f650720d9f859eb2Sebastien Hertz 11329d38e77c553c6cf71fc4dafe2d22b4e3f814872Andreas Gampe CompilerFilter::Filter GetCompilerFilter() const; 114b077e15d2d11b7c81aacbcd4a46c2b1e9c9ba20dCalin Juravle 115e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom const std::string& GetLocation() const { 116e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom return location_; 117e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom } 118e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom 119e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom const OatHeader& GetOatHeader() const; 120e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom 12107b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler class OatMethod FINAL { 1223320cf46afd082398aa401b246e6f301cebdf64dBrian Carlstrom public: 123e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier void LinkMethod(ArtMethod* method) const; 124ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom 125c04c800e7bda94abfadc8c2d30f58c50b261b612Nicolas Geoffray uint32_t GetCodeOffset() const; 126ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom 127c04c800e7bda94abfadc8c2d30f58c50b261b612Nicolas Geoffray const void* GetQuickCode() const; 1282cbaccb67e22c0b313a9785bfc65bcb4b25d0676Brian Carlstrom 1292cbaccb67e22c0b313a9785bfc65bcb4b25d0676Brian Carlstrom // Returns size of quick code. 130ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers uint32_t GetQuickCodeSize() const; 1312cbaccb67e22c0b313a9785bfc65bcb4b25d0676Brian Carlstrom uint32_t GetQuickCodeSizeOffset() const; 1322cbaccb67e22c0b313a9785bfc65bcb4b25d0676Brian Carlstrom 1332cbaccb67e22c0b313a9785bfc65bcb4b25d0676Brian Carlstrom // Returns OatQuickMethodHeader for debugging. Most callers should 1342cbaccb67e22c0b313a9785bfc65bcb4b25d0676Brian Carlstrom // use more specific methods such as GetQuickCodeSize. 1352cbaccb67e22c0b313a9785bfc65bcb4b25d0676Brian Carlstrom const OatQuickMethodHeader* GetOatQuickMethodHeader() const; 1362cbaccb67e22c0b313a9785bfc65bcb4b25d0676Brian Carlstrom uint32_t GetOatQuickMethodHeaderOffset() const; 1370c717dd1c56bd29cf860d0feda8e629dab2cadb3Logan Chien 1387624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko size_t GetFrameSizeInBytes() const; 1397624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko uint32_t GetCoreSpillMask() const; 1407624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko uint32_t GetFpSpillMask() const; 1412cbaccb67e22c0b313a9785bfc65bcb4b25d0676Brian Carlstrom 1428a630577ed2d9e9571c3434c505e5de223b23c07Vladimir Marko const uint8_t* GetVmapTable() const; 1432cbaccb67e22c0b313a9785bfc65bcb4b25d0676Brian Carlstrom uint32_t GetVmapTableOffset() const; 1442cbaccb67e22c0b313a9785bfc65bcb4b25d0676Brian Carlstrom uint32_t GetVmapTableOffsetOffset() const; 1458a630577ed2d9e9571c3434c505e5de223b23c07Vladimir Marko 146ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom // Create an OatMethod with offsets relative to the given base address 147957ca1cd025104fccb0b08928f955f9bdb4ab91cMathieu Chartier OatMethod(const uint8_t* base, const uint32_t code_offset) 148957ca1cd025104fccb0b08928f955f9bdb4ab91cMathieu Chartier : begin_(base), code_offset_(code_offset) { 14997b52f89e5e0b52a08d4b9a3953d0973a3cf5636Ian Rogers } 150758a801b66c134361a7b43f7e83f85d1fb800c4cAndreas Gampe OatMethod(const OatMethod&) = default; 15197b52f89e5e0b52a08d4b9a3953d0973a3cf5636Ian Rogers ~OatMethod() {} 1523320cf46afd082398aa401b246e6f301cebdf64dBrian Carlstrom 153758a801b66c134361a7b43f7e83f85d1fb800c4cAndreas Gampe OatMethod& operator=(const OatMethod&) = default; 154758a801b66c134361a7b43f7e83f85d1fb800c4cAndreas Gampe 15597b52f89e5e0b52a08d4b9a3953d0973a3cf5636Ian Rogers // A representation of an invalid OatMethod, used when an OatMethod or OatClass can't be found. 15697b52f89e5e0b52a08d4b9a3953d0973a3cf5636Ian Rogers // See ClassLinker::FindOatMethodFor. 15797b52f89e5e0b52a08d4b9a3953d0973a3cf5636Ian Rogers static const OatMethod Invalid() { 158957ca1cd025104fccb0b08928f955f9bdb4ab91cMathieu Chartier return OatMethod(nullptr, -1); 15997b52f89e5e0b52a08d4b9a3953d0973a3cf5636Ian Rogers } 1604fcdc94d22a4608e355aa8df36240181149d10e8Nicolas Geoffray 161ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom private: 162ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom template<class T> 163ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom T GetOatPointer(uint32_t offset) const { 164ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom if (offset == 0) { 1652cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier return nullptr; 166ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom } 16730fab40ee5a07af6b8c3b6b0e9438071695a57f4Ian Rogers return reinterpret_cast<T>(begin_ + offset); 168ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom } 1693320cf46afd082398aa401b246e6f301cebdf64dBrian Carlstrom 170e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier const uint8_t* begin_; 171e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier uint32_t code_offset_; 172ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom 173ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom friend class OatClass; 1743320cf46afd082398aa401b246e6f301cebdf64dBrian Carlstrom }; 1753320cf46afd082398aa401b246e6f301cebdf64dBrian Carlstrom 17607b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler class OatClass FINAL { 177e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom public: 178ba150c37d582eeeb8c11ba5245edc281cf31793cBrian Carlstrom mirror::Class::Status GetStatus() const { 179ba150c37d582eeeb8c11ba5245edc281cf31793cBrian Carlstrom return status_; 180ba150c37d582eeeb8c11ba5245edc281cf31793cBrian Carlstrom } 181ba150c37d582eeeb8c11ba5245edc281cf31793cBrian Carlstrom 182ba150c37d582eeeb8c11ba5245edc281cf31793cBrian Carlstrom OatClassType GetType() const { 183ba150c37d582eeeb8c11ba5245edc281cf31793cBrian Carlstrom return type_; 184ba150c37d582eeeb8c11ba5245edc281cf31793cBrian Carlstrom } 1850755ec5ea1dce0b549fc1adefeb52d89f119ebecBrian Carlstrom 186eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier // Get the OatMethod entry based on its index into the class 1872cbaccb67e22c0b313a9785bfc65bcb4b25d0676Brian Carlstrom // defintion. Direct methods come first, followed by virtual 1882cbaccb67e22c0b313a9785bfc65bcb4b25d0676Brian Carlstrom // methods. Note that runtime created methods such as miranda 189e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom // methods are not included. 190aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom const OatMethod GetOatMethod(uint32_t method_index) const; 191e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom 1922cbaccb67e22c0b313a9785bfc65bcb4b25d0676Brian Carlstrom // Return a pointer to the OatMethodOffsets for the requested 1932cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier // method_index, or null if none is present. Note that most 1942cbaccb67e22c0b313a9785bfc65bcb4b25d0676Brian Carlstrom // callers should use GetOatMethod. 1952cbaccb67e22c0b313a9785bfc65bcb4b25d0676Brian Carlstrom const OatMethodOffsets* GetOatMethodOffsets(uint32_t method_index) const; 1962cbaccb67e22c0b313a9785bfc65bcb4b25d0676Brian Carlstrom 1972cbaccb67e22c0b313a9785bfc65bcb4b25d0676Brian Carlstrom // Return the offset from the start of the OatFile to the 1982cbaccb67e22c0b313a9785bfc65bcb4b25d0676Brian Carlstrom // OatMethodOffsets for the requested method_index, or 0 if none 1992cbaccb67e22c0b313a9785bfc65bcb4b25d0676Brian Carlstrom // is present. Note that most callers should use GetOatMethod. 2002cbaccb67e22c0b313a9785bfc65bcb4b25d0676Brian Carlstrom uint32_t GetOatMethodOffsetsOffset(uint32_t method_index) const; 2012cbaccb67e22c0b313a9785bfc65bcb4b25d0676Brian Carlstrom 20297b52f89e5e0b52a08d4b9a3953d0973a3cf5636Ian Rogers // A representation of an invalid OatClass, used when an OatClass can't be found. 20397b52f89e5e0b52a08d4b9a3953d0973a3cf5636Ian Rogers // See ClassLinker::FindOatClass. 20497b52f89e5e0b52a08d4b9a3953d0973a3cf5636Ian Rogers static OatClass Invalid() { 20597b52f89e5e0b52a08d4b9a3953d0973a3cf5636Ian Rogers return OatClass(nullptr, mirror::Class::kStatusError, kOatClassNoneCompiled, 0, nullptr, 20697b52f89e5e0b52a08d4b9a3953d0973a3cf5636Ian Rogers nullptr); 20797b52f89e5e0b52a08d4b9a3953d0973a3cf5636Ian Rogers } 2084fcdc94d22a4608e355aa8df36240181149d10e8Nicolas Geoffray 209e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom private: 2100755ec5ea1dce0b549fc1adefeb52d89f119ebecBrian Carlstrom OatClass(const OatFile* oat_file, 2112dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::Class::Status status, 212ba150c37d582eeeb8c11ba5245edc281cf31793cBrian Carlstrom OatClassType type, 213ba150c37d582eeeb8c11ba5245edc281cf31793cBrian Carlstrom uint32_t bitmap_size, 214ba150c37d582eeeb8c11ba5245edc281cf31793cBrian Carlstrom const uint32_t* bitmap_pointer, 2150755ec5ea1dce0b549fc1adefeb52d89f119ebecBrian Carlstrom const OatMethodOffsets* methods_pointer); 2163320cf46afd082398aa401b246e6f301cebdf64dBrian Carlstrom 21797b52f89e5e0b52a08d4b9a3953d0973a3cf5636Ian Rogers const OatFile* const oat_file_; 218ba150c37d582eeeb8c11ba5245edc281cf31793cBrian Carlstrom 21997b52f89e5e0b52a08d4b9a3953d0973a3cf5636Ian Rogers const mirror::Class::Status status_; 220ba150c37d582eeeb8c11ba5245edc281cf31793cBrian Carlstrom 22197b52f89e5e0b52a08d4b9a3953d0973a3cf5636Ian Rogers const OatClassType type_; 222ba150c37d582eeeb8c11ba5245edc281cf31793cBrian Carlstrom 22397b52f89e5e0b52a08d4b9a3953d0973a3cf5636Ian Rogers const uint32_t* const bitmap_; 224ba150c37d582eeeb8c11ba5245edc281cf31793cBrian Carlstrom 22597b52f89e5e0b52a08d4b9a3953d0973a3cf5636Ian Rogers const OatMethodOffsets* const methods_pointer_; 226e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom 22707b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler friend class art::OatDexFile; 228e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom }; 2299a37efc6e1a8dd9fe6978f209fb493510267c528Richard Uhler 2309a37efc6e1a8dd9fe6978f209fb493510267c528Richard Uhler // Get the OatDexFile for the given dex_location within this oat file. 2319a37efc6e1a8dd9fe6978f209fb493510267c528Richard Uhler // If dex_location_checksum is non-null, the OatDexFile will only be 2329a37efc6e1a8dd9fe6978f209fb493510267c528Richard Uhler // returned if it has a matching checksum. 2339a37efc6e1a8dd9fe6978f209fb493510267c528Richard Uhler // If error_msg is non-null and no OatDexFile is returned, error_msg will 2349a37efc6e1a8dd9fe6978f209fb493510267c528Richard Uhler // be updated with a description of why no OatDexFile was returned. 2358d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers const OatDexFile* GetOatDexFile(const char* dex_location, 236756ee4e090bc1e1812b41fb7b4661df601a32ef9Brian Carlstrom const uint32_t* const dex_location_checksum, 2379a37efc6e1a8dd9fe6978f209fb493510267c528Richard Uhler /*out*/std::string* error_msg = nullptr) const 23890443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier REQUIRES(!secondary_lookup_lock_); 2398d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers 240aa4497db59f1eeec954f2ba5da6d458fcdf9b3a4Vladimir Marko const std::vector<const OatDexFile*>& GetOatDexFiles() const { 241aa4497db59f1eeec954f2ba5da6d458fcdf9b3a4Vladimir Marko return oat_dex_files_storage_; 242aa4497db59f1eeec954f2ba5da6d458fcdf9b3a4Vladimir Marko } 243e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom 24430fab40ee5a07af6b8c3b6b0e9438071695a57f4Ian Rogers size_t Size() const { 24530fab40ee5a07af6b8c3b6b0e9438071695a57f4Ian Rogers return End() - Begin(); 246e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom } 247e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom 2486ea1a0e2168c8d9b6d97c075c73a72d84080f45bMingyao Yang bool Contains(const void* p) const { 2496ea1a0e2168c8d9b6d97c075c73a72d84080f45bMingyao Yang return p >= Begin() && p < End(); 2506ea1a0e2168c8d9b6d97c075c73a72d84080f45bMingyao Yang } 2516ea1a0e2168c8d9b6d97c075c73a72d84080f45bMingyao Yang 2525c42c29b89286e5efa4a4613132b09051ce5945bVladimir Marko size_t BssSize() const { 2535c42c29b89286e5efa4a4613132b09051ce5945bVladimir Marko return BssEnd() - BssBegin(); 2545c42c29b89286e5efa4a4613132b09051ce5945bVladimir Marko } 2555c42c29b89286e5efa4a4613132b09051ce5945bVladimir Marko 2567b49e6cade09bc65b3b5f22d45fc9d0a7184e4f2David Brazdil size_t DexSize() const { 2577b49e6cade09bc65b3b5f22d45fc9d0a7184e4f2David Brazdil return DexEnd() - DexBegin(); 2587b49e6cade09bc65b3b5f22d45fc9d0a7184e4f2David Brazdil } 2597b49e6cade09bc65b3b5f22d45fc9d0a7184e4f2David Brazdil 26013735955f39b3b304c37d2b2840663c131262c18Ian Rogers const uint8_t* Begin() const; 26113735955f39b3b304c37d2b2840663c131262c18Ian Rogers const uint8_t* End() const; 26253cb16b98acf3cf6f3a1e2204ad4958ecf1b5a3cAlex Light 2635c42c29b89286e5efa4a4613132b09051ce5945bVladimir Marko const uint8_t* BssBegin() const; 2645c42c29b89286e5efa4a4613132b09051ce5945bVladimir Marko const uint8_t* BssEnd() const; 2655c42c29b89286e5efa4a4613132b09051ce5945bVladimir Marko 2667b49e6cade09bc65b3b5f22d45fc9d0a7184e4f2David Brazdil const uint8_t* DexBegin() const; 2677b49e6cade09bc65b3b5f22d45fc9d0a7184e4f2David Brazdil const uint8_t* DexEnd() const; 2687b49e6cade09bc65b3b5f22d45fc9d0a7184e4f2David Brazdil 269e5fed03772144595c0904faf3d6974cc55214c8cRichard Uhler // Returns the absolute dex location for the encoded relative dex location. 270e5fed03772144595c0904faf3d6974cc55214c8cRichard Uhler // 2712cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier // If not null, abs_dex_location is used to resolve the absolute dex 272e5fed03772144595c0904faf3d6974cc55214c8cRichard Uhler // location of relative dex locations encoded in the oat file. 273e5fed03772144595c0904faf3d6974cc55214c8cRichard Uhler // For example, given absolute location "/data/app/foo/base.apk", encoded 274e5fed03772144595c0904faf3d6974cc55214c8cRichard Uhler // dex locations "base.apk", "base.apk:classes2.dex", etc. would be resolved 275e5fed03772144595c0904faf3d6974cc55214c8cRichard Uhler // to "/data/app/foo/base.apk", "/data/app/foo/base.apk:classes2.dex", etc. 276e5fed03772144595c0904faf3d6974cc55214c8cRichard Uhler // Relative encoded dex locations that don't match the given abs_dex_location 277e5fed03772144595c0904faf3d6974cc55214c8cRichard Uhler // are left unchanged. 278e5fed03772144595c0904faf3d6974cc55214c8cRichard Uhler static std::string ResolveRelativeEncodedDexLocation( 279e5fed03772144595c0904faf3d6974cc55214c8cRichard Uhler const char* abs_dex_location, const std::string& rel_dex_location); 280e5fed03772144595c0904faf3d6974cc55214c8cRichard Uhler 2817848da48a0a4241dedc1cc83ac4931e61575eb92Andreas Gampe // Create a dependency list (dex locations and checksums) for the given dex files. 2827848da48a0a4241dedc1cc83ac4931e61575eb92Andreas Gampe static std::string EncodeDexFileDependencies(const std::vector<const DexFile*>& dex_files); 2837848da48a0a4241dedc1cc83ac4931e61575eb92Andreas Gampe 2847848da48a0a4241dedc1cc83ac4931e61575eb92Andreas Gampe // Check the given dependency list against their dex files - thus the name "Static," this does 2857848da48a0a4241dedc1cc83ac4931e61575eb92Andreas Gampe // not check the class-loader environment, only whether there have been file updates. 286b1d8c314b55bb2df2b2bb72a3daaf5db65b7ebc7Igor Murashkin static bool CheckStaticDexFileDependencies(const char* dex_dependencies, std::string* msg); 2877848da48a0a4241dedc1cc83ac4931e61575eb92Andreas Gampe 2887848da48a0a4241dedc1cc83ac4931e61575eb92Andreas Gampe // Get the dex locations of a dependency list. Note: this is *not* cleaned for synthetic 2897848da48a0a4241dedc1cc83ac4931e61575eb92Andreas Gampe // locations of multidex files. 2907848da48a0a4241dedc1cc83ac4931e61575eb92Andreas Gampe static bool GetDexLocationsFromDependencies(const char* dex_dependencies, 291b1d8c314b55bb2df2b2bb72a3daaf5db65b7ebc7Igor Murashkin std::vector<std::string>* locations); 2927848da48a0a4241dedc1cc83ac4931e61575eb92Andreas Gampe 293049cff0ed5e28aa17a17e456efe3121b6d58910fAndreas Gampe protected: 294049cff0ed5e28aa17a17e456efe3121b6d58910fAndreas Gampe OatFile(const std::string& filename, bool executable); 295e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom 296049cff0ed5e28aa17a17e456efe3121b6d58910fAndreas Gampe private: 297e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom // The oat file name. 298e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom // 299e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom // The image will embed this to link its associated oat file. 300e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom const std::string location_; 301e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom 3027b49e6cade09bc65b3b5f22d45fc9d0a7184e4f2David Brazdil // Pointer to the Vdex file with the Dex files for this Oat file. 3037b49e6cade09bc65b3b5f22d45fc9d0a7184e4f2David Brazdil std::unique_ptr<VdexFile> vdex_; 3047b49e6cade09bc65b3b5f22d45fc9d0a7184e4f2David Brazdil 305700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom // Pointer to OatHeader. 30613735955f39b3b304c37d2b2840663c131262c18Ian Rogers const uint8_t* begin_; 307700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom 308700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom // Pointer to end of oat region for bounds checking. 30913735955f39b3b304c37d2b2840663c131262c18Ian Rogers const uint8_t* end_; 310700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom 3112cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier // Pointer to the .bss section, if present, otherwise null. 31206d7aaa75f3d6d21fe904d54208b28e486673d97Vladimir Marko uint8_t* bss_begin_; 3135c42c29b89286e5efa4a4613132b09051ce5945bVladimir Marko 3142cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier // Pointer to the end of the .bss section, if present, otherwise null. 31506d7aaa75f3d6d21fe904d54208b28e486673d97Vladimir Marko uint8_t* bss_end_; 3165c42c29b89286e5efa4a4613132b09051ce5945bVladimir Marko 3179dcc4572949f6a8231a1b4ed859676ba6f411726Alex Light // Was this oat_file loaded executable? 3189dcc4572949f6a8231a1b4ed859676ba6f411726Alex Light const bool is_executable_; 3199dcc4572949f6a8231a1b4ed859676ba6f411726Alex Light 320aa4497db59f1eeec954f2ba5da6d458fcdf9b3a4Vladimir Marko // Owning storage for the OatDexFile objects. 321aa4497db59f1eeec954f2ba5da6d458fcdf9b3a4Vladimir Marko std::vector<const OatDexFile*> oat_dex_files_storage_; 322aa4497db59f1eeec954f2ba5da6d458fcdf9b3a4Vladimir Marko 3233f5838d7d0b9fc63db0ccc35c2ea05ed29264986Vladimir Marko // NOTE: We use a StringPiece as the key type to avoid a memory allocation on every 3243f5838d7d0b9fc63db0ccc35c2ea05ed29264986Vladimir Marko // lookup with a const char* key. The StringPiece doesn't own its backing storage, 3253f5838d7d0b9fc63db0ccc35c2ea05ed29264986Vladimir Marko // therefore we're using the OatDexFile::dex_file_location_ as the backing storage 3263f5838d7d0b9fc63db0ccc35c2ea05ed29264986Vladimir Marko // for keys in oat_dex_files_ and the string_cache_ entries for the backing storage 3273f5838d7d0b9fc63db0ccc35c2ea05ed29264986Vladimir Marko // of keys in secondary_oat_dex_files_ and oat_dex_files_by_canonical_location_. 328bad0267eaab9d6a522d05469ff90501deefdb88bMathieu Chartier typedef AllocationTrackingSafeMap<StringPiece, const OatDexFile*, kAllocatorTagOatFile> Table; 3293f5838d7d0b9fc63db0ccc35c2ea05ed29264986Vladimir Marko 330aa4497db59f1eeec954f2ba5da6d458fcdf9b3a4Vladimir Marko // Map each location and canonical location (if different) retrieved from the 331aa4497db59f1eeec954f2ba5da6d458fcdf9b3a4Vladimir Marko // oat file to its OatDexFile. This map doesn't change after it's constructed in Setup() 332aa4497db59f1eeec954f2ba5da6d458fcdf9b3a4Vladimir Marko // and therefore doesn't need any locking and provides the cheapest dex file lookup 3332cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier // for GetOatDexFile() for a very frequent use case. Never contains a null value. 334aa4497db59f1eeec954f2ba5da6d458fcdf9b3a4Vladimir Marko Table oat_dex_files_; 3353f5838d7d0b9fc63db0ccc35c2ea05ed29264986Vladimir Marko 3363f5838d7d0b9fc63db0ccc35c2ea05ed29264986Vladimir Marko // Lock guarding all members needed for secondary lookup in GetOatDexFile(). 3373f5838d7d0b9fc63db0ccc35c2ea05ed29264986Vladimir Marko mutable Mutex secondary_lookup_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER; 3383f5838d7d0b9fc63db0ccc35c2ea05ed29264986Vladimir Marko 3393f5838d7d0b9fc63db0ccc35c2ea05ed29264986Vladimir Marko // If the primary oat_dex_files_ lookup fails, use a secondary map. This map stores 3403f5838d7d0b9fc63db0ccc35c2ea05ed29264986Vladimir Marko // the results of all previous secondary lookups, whether successful (non-null) or 3413f5838d7d0b9fc63db0ccc35c2ea05ed29264986Vladimir Marko // failed (null). If it doesn't contain an entry we need to calculate the canonical 3423f5838d7d0b9fc63db0ccc35c2ea05ed29264986Vladimir Marko // location and use oat_dex_files_by_canonical_location_. 3433f5838d7d0b9fc63db0ccc35c2ea05ed29264986Vladimir Marko mutable Table secondary_oat_dex_files_ GUARDED_BY(secondary_lookup_lock_); 3443f5838d7d0b9fc63db0ccc35c2ea05ed29264986Vladimir Marko 3453f5838d7d0b9fc63db0ccc35c2ea05ed29264986Vladimir Marko // Cache of strings. Contains the backing storage for keys in the secondary_oat_dex_files_ 3463f5838d7d0b9fc63db0ccc35c2ea05ed29264986Vladimir Marko // and the lazily initialized oat_dex_files_by_canonical_location_. 3473f5838d7d0b9fc63db0ccc35c2ea05ed29264986Vladimir Marko // NOTE: We're keeping references to contained strings in form of StringPiece and adding 3483f5838d7d0b9fc63db0ccc35c2ea05ed29264986Vladimir Marko // new strings to the end. The adding of a new element must not touch any previously stored 3493f5838d7d0b9fc63db0ccc35c2ea05ed29264986Vladimir Marko // elements. std::list<> and std::deque<> satisfy this requirement, std::vector<> doesn't. 3503f5838d7d0b9fc63db0ccc35c2ea05ed29264986Vladimir Marko mutable std::list<std::string> string_cache_ GUARDED_BY(secondary_lookup_lock_); 351e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom 3525351da0225d027a19420153615634a1c78966bcaMathieu Chartier friend class gc::collector::DummyOatFile; // For modifying begin_ and end_. 353e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom friend class OatClass; 35407b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler friend class art::OatDexFile; 355e3c845cdb5884e770287a5c0c65c8bb64733c388Elliott Hughes friend class OatDumper; // For GetBase and GetLimit 356049cff0ed5e28aa17a17e456efe3121b6d58910fAndreas Gampe friend class OatFileBase; 357e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom DISALLOW_COPY_AND_ASSIGN(OatFile); 358e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom}; 359e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom 36007b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler// OatDexFile should be an inner class of OatFile. Unfortunately, C++ doesn't 36107b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler// support forward declarations of inner classes, and we want to 36207b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler// forward-declare OatDexFile so that we can store an opaque pointer to an 36307b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler// OatDexFile in DexFile. 36407b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhlerclass OatDexFile FINAL { 36507b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler public: 36607b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler // Opens the DexFile referred to by this OatDexFile from within the containing OatFile. 367b1d8c314b55bb2df2b2bb72a3daaf5db65b7ebc7Igor Murashkin std::unique_ptr<const DexFile> OpenDexFile(std::string* error_msg) const; 36807b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler 36907b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler const OatFile* GetOatFile() const { 37007b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler return oat_file_; 37107b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler } 37207b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler 37307b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler // Returns the size of the DexFile refered to by this OatDexFile. 37407b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler size_t FileSize() const; 37507b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler 37607b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler // Returns original path of DexFile that was the source of this OatDexFile. 37707b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler const std::string& GetDexFileLocation() const { 37807b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler return dex_file_location_; 37907b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler } 38007b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler 38107b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler // Returns the canonical location of DexFile that was the source of this OatDexFile. 38207b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler const std::string& GetCanonicalDexFileLocation() const { 38307b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler return canonical_dex_file_location_; 38407b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler } 38507b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler 38607b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler // Returns checksum of original DexFile that was the source of this OatDexFile; 38707b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler uint32_t GetDexFileLocationChecksum() const { 38807b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler return dex_file_location_checksum_; 38907b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler } 39007b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler 39107b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler // Returns the OatClass for the class specified by the given DexFile class_def_index. 39207b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler OatFile::OatClass GetOatClass(uint16_t class_def_index) const; 39307b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler 39407b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler // Returns the offset to the OatClass information. Most callers should use GetOatClass. 39507b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler uint32_t GetOatClassOffset(uint16_t class_def_index) const; 39607b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler 39706d7aaa75f3d6d21fe904d54208b28e486673d97Vladimir Marko uint8_t* GetDexCacheArrays() const { 39809d0943f5efe92c1f3a6b9dbdf255adb0f960a22Vladimir Marko return dex_cache_arrays_; 39909d0943f5efe92c1f3a6b9dbdf255adb0f960a22Vladimir Marko } 40009d0943f5efe92c1f3a6b9dbdf255adb0f960a22Vladimir Marko 401d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko const uint8_t* GetLookupTableData() const { 402d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko return lookup_table_data_; 403d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko } 404d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko 4052ba8895b4257d0e32a7b269bc2e7f6a3ec39a86aAndreas Gampe const uint8_t* GetDexFilePointer() const { 4062ba8895b4257d0e32a7b269bc2e7f6a3ec39a86aAndreas Gampe return dex_file_pointer_; 4072ba8895b4257d0e32a7b269bc2e7f6a3ec39a86aAndreas Gampe } 4082ba8895b4257d0e32a7b269bc2e7f6a3ec39a86aAndreas Gampe 4099aa352e92b6ca0f2250cb7f54dfbf4b1be714c19David Sehr // Looks up a class definition by its class descriptor. Hash must be 4109aa352e92b6ca0f2250cb7f54dfbf4b1be714c19David Sehr // ComputeModifiedUtf8Hash(descriptor). 4119aa352e92b6ca0f2250cb7f54dfbf4b1be714c19David Sehr static const DexFile::ClassDef* FindClassDef(const DexFile& dex_file, 4129aa352e92b6ca0f2250cb7f54dfbf4b1be714c19David Sehr const char* descriptor, 4139aa352e92b6ca0f2250cb7f54dfbf4b1be714c19David Sehr size_t hash); 4149aa352e92b6ca0f2250cb7f54dfbf4b1be714c19David Sehr 4159aa352e92b6ca0f2250cb7f54dfbf4b1be714c19David Sehr TypeLookupTable* GetTypeLookupTable() const { 4169aa352e92b6ca0f2250cb7f54dfbf4b1be714c19David Sehr return lookup_table_.get(); 4179aa352e92b6ca0f2250cb7f54dfbf4b1be714c19David Sehr } 4189aa352e92b6ca0f2250cb7f54dfbf4b1be714c19David Sehr 41907b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler ~OatDexFile(); 42007b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler 42107b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler private: 42207b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler OatDexFile(const OatFile* oat_file, 42307b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler const std::string& dex_file_location, 42407b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler const std::string& canonical_dex_file_location, 42507b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler uint32_t dex_file_checksum, 42607b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler const uint8_t* dex_file_pointer, 427d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko const uint8_t* lookup_table_data, 42809d0943f5efe92c1f3a6b9dbdf255adb0f960a22Vladimir Marko const uint32_t* oat_class_offsets_pointer, 42906d7aaa75f3d6d21fe904d54208b28e486673d97Vladimir Marko uint8_t* dex_cache_arrays); 43007b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler 43107b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler const OatFile* const oat_file_; 43207b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler const std::string dex_file_location_; 43307b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler const std::string canonical_dex_file_location_; 43407b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler const uint32_t dex_file_location_checksum_; 43507b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler const uint8_t* const dex_file_pointer_; 436d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko const uint8_t* lookup_table_data_; 43707b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler const uint32_t* const oat_class_offsets_pointer_; 43806d7aaa75f3d6d21fe904d54208b28e486673d97Vladimir Marko uint8_t* const dex_cache_arrays_; 4399aa352e92b6ca0f2250cb7f54dfbf4b1be714c19David Sehr mutable std::unique_ptr<TypeLookupTable> lookup_table_; 44007b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler 44107b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler friend class OatFile; 442049cff0ed5e28aa17a17e456efe3121b6d58910fAndreas Gampe friend class OatFileBase; 44307b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler DISALLOW_COPY_AND_ASSIGN(OatDexFile); 44407b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler}; 44507b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler 446e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom} // namespace art 447e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom 448fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif // ART_RUNTIME_OAT_FILE_H_ 449