1418d20fc407052d4152157f61e7453359f902383Elliott Hughes/* 2418d20fc407052d4152157f61e7453359f902383Elliott Hughes * Copyright (C) 2011 The Android Open Source Project 3418d20fc407052d4152157f61e7453359f902383Elliott Hughes * 4418d20fc407052d4152157f61e7453359f902383Elliott Hughes * Licensed under the Apache License, Version 2.0 (the "License"); 5418d20fc407052d4152157f61e7453359f902383Elliott Hughes * you may not use this file except in compliance with the License. 6418d20fc407052d4152157f61e7453359f902383Elliott Hughes * You may obtain a copy of the License at 7418d20fc407052d4152157f61e7453359f902383Elliott Hughes * 8418d20fc407052d4152157f61e7453359f902383Elliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 9418d20fc407052d4152157f61e7453359f902383Elliott Hughes * 10418d20fc407052d4152157f61e7453359f902383Elliott Hughes * Unless required by applicable law or agreed to in writing, software 11418d20fc407052d4152157f61e7453359f902383Elliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 12418d20fc407052d4152157f61e7453359f902383Elliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13418d20fc407052d4152157f61e7453359f902383Elliott Hughes * See the License for the specific language governing permissions and 14418d20fc407052d4152157f61e7453359f902383Elliott Hughes * limitations under the License. 15418d20fc407052d4152157f61e7453359f902383Elliott Hughes */ 160e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 17fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#ifndef ART_RUNTIME_CLASS_LINKER_H_ 18fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#define ART_RUNTIME_CLASS_LINKER_H_ 190e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 206d4d9fcb4f01e287ee29e81cd1c941ee5d11d379Ian Rogers#include <string> 210e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro#include <utility> 220e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro#include <vector> 230e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 245369c40f75fdcb1be7a7c06db212ce965c83a164Mathieu Chartier#include "base/allocator.h" 25761600567d73b23324ae0251e871c15d6849ffd8Elliott Hughes#include "base/macros.h" 2676b6167407c2b6f5d40ad895b2793a6b037f54b2Elliott Hughes#include "base/mutex.h" 277e93b50433cde2a44d99212e8040299bde498546Brian Carlstrom#include "dex_file.h" 2894f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi#include "gc_root.h" 29e5448b5a12003b405b22cde3b94f962ab4888a87Elliott Hughes#include "gtest/gtest.h" 30590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier#include "jni.h" 3158ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom#include "oat_file.h" 3283c8ee000d525017ead8753fce6bc1020249b96aMathieu Chartier#include "object_callbacks.h" 330e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 340e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapironamespace art { 3598d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang 361d54e73444e017d3a65234e0f193846f3e27472bIan Rogersnamespace gc { 371d54e73444e017d3a65234e0f193846f3e27472bIan Rogersnamespace space { 381d54e73444e017d3a65234e0f193846f3e27472bIan Rogers class ImageSpace; 391d54e73444e017d3a65234e0f193846f3e27472bIan Rogers} // namespace space 401d54e73444e017d3a65234e0f193846f3e27472bIan Rogers} // namespace gc 412dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersnamespace mirror { 4233e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers class ClassLoader; 4333e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers class DexCache; 4433e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers class DexCacheTest_Open_Test; 4533e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers class IfTable; 4633e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers template<class T> class ObjectArray; 4733e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers class StackTraceElement; 4833e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers} // namespace mirror 491d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 50cf4c6c41b0084dc4567ff709fb8ce9ebd72b26acElliott Hughesclass InternTable; 51c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartiertemplate<class T> class ObjectLock; 522b7c4d196c8abe32f4ca633534917da9de53c359Mathieu Chartierclass ScopedObjectAccessAlreadyRunnable; 53eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartiertemplate<class T> class Handle; 54cf4c6c41b0084dc4567ff709fb8ce9ebd72b26acElliott Hughes 552dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogerstypedef bool (ClassVisitor)(mirror::Class* c, void* arg); 56a215526d5c789cbef0f81a1f9aba22541a841ccaElliott Hughes 57893263b7d5bc2ca43a91ecb8071867f5134fc60aMathieu Chartierenum VisitRootFlags : uint8_t; 58893263b7d5bc2ca43a91ecb8071867f5134fc60aMathieu Chartier 590e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiroclass ClassLinker { 600e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro public: 61590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier explicit ClassLinker(InternTable* intern_table); 62590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier ~ClassLinker(); 6358ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom 64507e6180ad271eb719c67ce7394852c731d975a5Alex Light // Initialize class linker by bootstraping from dex files. 65507e6180ad271eb719c67ce7394852c731d975a5Alex Light void InitWithoutImage(const std::vector<const DexFile*>& boot_class_path) 66b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 679ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom 68590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier // Initialize class linker from one or more images. 69590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier void InitFromImage() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 70565f50731db360584d0080af7f14f0b7ca10371cCarl Shapiro 7164bf5a33d55aa779ef452552a466943002d39e4fElliott Hughes // Finds a class by its descriptor, loading it if necessary. 7274eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom // If class_loader is null, searches boot_class_path_. 739837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers mirror::Class* FindClass(Thread* self, const char* descriptor, 740cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::ClassLoader> class_loader) 75b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 76aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom 77194116c836080de14245a3a7c4617d07b8abf8cfMathieu Chartier // Find a class in the path class loader, loading it if necessary. 78194116c836080de14245a3a7c4617d07b8abf8cfMathieu Chartier mirror::Class* FindClassInPathClassLoader(ScopedObjectAccessAlreadyRunnable& soa, 79194116c836080de14245a3a7c4617d07b8abf8cfMathieu Chartier Thread* self, const char* descriptor, 80194116c836080de14245a3a7c4617d07b8abf8cfMathieu Chartier Handle<mirror::ClassLoader> class_loader) 81194116c836080de14245a3a7c4617d07b8abf8cfMathieu Chartier SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 82194116c836080de14245a3a7c4617d07b8abf8cfMathieu Chartier 839837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers // Finds a class by its descriptor using the "system" class loader, ie by searching the 849837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers // boot_class_path_. 859837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers mirror::Class* FindSystemClass(Thread* self, const char* descriptor) 869837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 879837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers 889837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers // Finds the array class given for the element class. 89b74cd29802f364b4cec88f4913fa38ade26b8fabMathieu Chartier mirror::Class* FindArrayClass(Thread* self, mirror::Class** element_class) 90b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 91aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom 9279cfc0e93e210e548b45459478a154168d2d8cc2Ian Rogers // Returns true if the class linker is initialized. 93590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier bool IsInitialized() const; 94590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 95aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom // Define a new a class based on a ClassDef from a DexFile 96c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier mirror::Class* DefineClass(const char* descriptor, 970cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::ClassLoader> class_loader, 982dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers const DexFile& dex_file, const DexFile::ClassDef& dex_class_def) 99b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 10064bf5a33d55aa779ef452552a466943002d39e4fElliott Hughes 10164bf5a33d55aa779ef452552a466943002d39e4fElliott Hughes // Finds a class by its descriptor, returning NULL if it isn't wasn't loaded 10264bf5a33d55aa779ef452552a466943002d39e4fElliott Hughes // by the given 'class_loader'. 1032dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::Class* LookupClass(const char* descriptor, const mirror::ClassLoader* class_loader) 104b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 105b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 1060e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 1076fa602d614d418f38afebb4d44f42e7dc0b4bd94Elliott Hughes // Finds all the classes with the given descriptor, regardless of ClassLoader. 1082dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers void LookupClasses(const char* descriptor, std::vector<mirror::Class*>& classes) 109b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 110b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 1116fa602d614d418f38afebb4d44f42e7dc0b4bd94Elliott Hughes 1122dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::Class* FindPrimitiveClass(char type) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 113d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes 114ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom // General class unloading is not supported, this is used to prune 115ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom // unwanted classes during image writing. 1162dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool RemoveClass(const char* descriptor, const mirror::ClassLoader* class_loader) 117b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 118b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 119ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom 1207dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers void DumpAllClasses(int flags) 121b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 122b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 1239d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes 1247dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers void DumpForSigQuit(std::ostream& os) 1257dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 1267dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 127cac6cc72c3331257fa6437b36a131e5d551e2f3cElliott Hughes 1287dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers size_t NumLoadedClasses() 1297dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 1307dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 131e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes 132b63ec393a5c4ba2be1d34dd871cda811eaa803c7Brian Carlstrom // Resolve a String with the given index from the DexFile, storing the 133aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom // result in the DexCache. The referrer is used to identify the 134aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom // target DexCache and ClassLoader to use for resolution. 135ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers mirror::String* ResolveString(uint32_t string_idx, mirror::ArtMethod* referrer) 1362dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 137aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom 138aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom // Resolve a String with the given index from the DexFile, storing the 1399ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // result in the DexCache. 1402dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::String* ResolveString(const DexFile& dex_file, uint32_t string_idx, 1410cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::DexCache> dex_cache) 142b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 1439ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom 144b63ec393a5c4ba2be1d34dd871cda811eaa803c7Brian Carlstrom // Resolve a Type with the given index from the DexFile, storing the 1459ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // result in the DexCache. The referrer is used to identity the 1469ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // target DexCache and ClassLoader to use for resolution. 147ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers mirror::Class* ResolveType(const DexFile& dex_file, uint16_t type_idx, mirror::Class* referrer) 148590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 1499ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom 150b63ec393a5c4ba2be1d34dd871cda811eaa803c7Brian Carlstrom // Resolve a Type with the given index from the DexFile, storing the 1510cfe1fb7060576d047f7f894fc0d8b87de84fcabIan Rogers // result in the DexCache. The referrer is used to identify the 152b63ec393a5c4ba2be1d34dd871cda811eaa803c7Brian Carlstrom // target DexCache and ClassLoader to use for resolution. 153ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers mirror::Class* ResolveType(uint16_t type_idx, mirror::ArtMethod* referrer) 1542dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 1550cfe1fb7060576d047f7f894fc0d8b87de84fcabIan Rogers 156ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers mirror::Class* ResolveType(uint16_t type_idx, mirror::ArtField* referrer) 1572dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 158b63ec393a5c4ba2be1d34dd871cda811eaa803c7Brian Carlstrom 1599ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // Resolve a type with the given ID from the DexFile, storing the 1609ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // result in DexCache. The ClassLoader is used to search for the 1619ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // type, since it may be referenced from but not contained within 1629ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // the given DexFile. 163590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier mirror::Class* ResolveType(const DexFile& dex_file, uint16_t type_idx, 1640cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::DexCache> dex_cache, 1650cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::ClassLoader> class_loader) 166b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 1679ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom 1689ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // Resolve a method with a given ID from the DexFile, storing the 1699ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // result in DexCache. The ClassLinker and ClassLoader are used as 1709ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // in ResolveType. What is unique is the method type argument which 1719ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // is used to determine if this method is a direct, static, or 1729ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // virtual method. 173ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom mirror::ArtMethod* ResolveMethod(const DexFile& dex_file, 174ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom uint32_t method_idx, 1750cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::DexCache> dex_cache, 1760cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::ClassLoader> class_loader, 1770cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::ArtMethod> referrer, 178ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom InvokeType type) 179b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 1809ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom 1810cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier mirror::ArtMethod* GetResolvedMethod(uint32_t method_idx, mirror::ArtMethod* referrer, 1820cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier InvokeType type) 1830cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 1840cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier mirror::ArtMethod* ResolveMethod(Thread* self, uint32_t method_idx, mirror::ArtMethod** referrer, 185ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom InvokeType type) 1862dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 187161928613d3f097108319de60494fab1aab8d48aBrian Carlstrom 1880cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier mirror::ArtField* GetResolvedField(uint32_t field_idx, mirror::Class* field_declaring_class) 1890cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 190ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers mirror::ArtField* ResolveField(uint32_t field_idx, mirror::ArtMethod* referrer, 191ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom bool is_static) 1922dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 193b9edb841423dfe60e193fcffd25994398c91baa2Brian Carlstrom 194161928613d3f097108319de60494fab1aab8d48aBrian Carlstrom // Resolve a field with a given ID from the DexFile, storing the 1959ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // result in DexCache. The ClassLinker and ClassLoader are used as 1969ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // in ResolveType. What is unique is the is_static argument which is 1979ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // used to determine if we are resolving a static or non-static 1989ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // field. 199ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom mirror::ArtField* ResolveField(const DexFile& dex_file, 200ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom uint32_t field_idx, 2010cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::DexCache> dex_cache, 2020cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::ClassLoader> class_loader, 203ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom bool is_static) 204b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 2059ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom 206b067ac2fe225c76fc9eb9434ef62cbb797bfa425Ian Rogers // Resolve a field with a given ID from the DexFile, storing the 207b067ac2fe225c76fc9eb9434ef62cbb797bfa425Ian Rogers // result in DexCache. The ClassLinker and ClassLoader are used as 208b067ac2fe225c76fc9eb9434ef62cbb797bfa425Ian Rogers // in ResolveType. No is_static argument is provided so that Java 209b067ac2fe225c76fc9eb9434ef62cbb797bfa425Ian Rogers // field resolution semantics are followed. 2100cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier mirror::ArtField* ResolveFieldJLS(const DexFile& dex_file, uint32_t field_idx, 2110cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::DexCache> dex_cache, 2120cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::ClassLoader> class_loader) 213b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 214b067ac2fe225c76fc9eb9434ef62cbb797bfa425Ian Rogers 215ad25ac568407ceb14334e8551dd1c4dd0fd6993cIan Rogers // Get shorty from method index without resolution. Used to do handlerization. 216ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom const char* MethodShorty(uint32_t method_idx, mirror::ArtMethod* referrer, uint32_t* length) 217b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 218ad25ac568407ceb14334e8551dd1c4dd0fd6993cIan Rogers 219f4c21c9f6440c3980c47a297519f758796dbc039Elliott Hughes // Returns true on success, false if there's an exception pending. 22025c3325bf95036bf325fc7cb21b4fd6d40282857Brian Carlstrom // can_run_clinit=false allows the compiler to attempt to init a class, 22125c3325bf95036bf325fc7cb21b4fd6d40282857Brian Carlstrom // given the restriction that no <clinit> execution is possible. 2220cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier bool EnsureInitialized(Handle<mirror::Class> c, bool can_init_fields, bool can_init_parents) 223b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 2240e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 2252a20cfd0b7fc81099f5de0da782ebcc1cb262792Elliott Hughes // Initializes classes that have instances in the image but that have 2262a20cfd0b7fc81099f5de0da782ebcc1cb262792Elliott Hughes // <clinit> methods so they could not be initialized by the compiler. 227b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers void RunRootClinits() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 2282a20cfd0b7fc81099f5de0da782ebcc1cb262792Elliott Hughes 22900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers void RegisterDexFile(const DexFile& dex_file) 23000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers LOCKS_EXCLUDED(dex_lock_) 231b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 2320cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier void RegisterDexFile(const DexFile& dex_file, Handle<mirror::DexCache> dex_cache) 23300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers LOCKS_EXCLUDED(dex_lock_) 234b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 2350e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 2368d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers const OatFile* RegisterOatFile(const OatFile* oat_file) 23700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers LOCKS_EXCLUDED(dex_lock_); 238866c8627626b7c47fb69b498b341772d7dfa7f60Brian Carlstrom 2398a48741b96ca9cc5835cac72ac133c4ca480930fBrian Carlstrom const std::vector<const DexFile*>& GetBootClassPath() { 2408a48741b96ca9cc5835cac72ac133c4ca480930fBrian Carlstrom return boot_class_path_; 2418a48741b96ca9cc5835cac72ac133c4ca480930fBrian Carlstrom } 2428a48741b96ca9cc5835cac72ac133c4ca480930fBrian Carlstrom 2437dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers void VisitClasses(ClassVisitor* visitor, void* arg) 244ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 2457dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 246ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers 247ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers // Less efficient variant of VisitClasses that copies the class_table_ into secondary storage 248ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers // so that it can visit individual classes without holding the doesn't hold the 249ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers // Locks::classlinker_classes_lock_. As the Locks::classlinker_classes_lock_ isn't held this code 250ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers // can race with insertion and deletion of classes while the visitor is being called. 2517dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers void VisitClassesWithoutClassesLock(ClassVisitor* visitor, void* arg) 2527dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 25300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers 25452e4b43d62896b56f8c2bd041e528472bb4a0d8dMathieu Chartier void VisitClassRoots(RootCallback* callback, void* arg, VisitRootFlags flags) 25594f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 25694f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 257893263b7d5bc2ca43a91ecb8071867f5134fc60aMathieu Chartier void VisitRoots(RootCallback* callback, void* arg, VisitRootFlags flags) 25894f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi LOCKS_EXCLUDED(dex_lock_) 25994f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 26000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers 261e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi mirror::DexCache* FindDexCache(const DexFile& dex_file) 26200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers LOCKS_EXCLUDED(dex_lock_) 263b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 264e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi bool IsDexFileRegistered(const DexFile& dex_file) 265b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers LOCKS_EXCLUDED(dex_lock_) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 266e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi void FixupDexCaches(mirror::ArtMethod* resolution_method) 26700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers LOCKS_EXCLUDED(dex_lock_) 268b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 2691d9f52b7ca91c6d30b7acfac1c9ab24d93fff470Brian Carlstrom 270262bf46ddc91e5b4fbd367127ff21a1877d939f2jeffhao // Generate an oat file from a dex file 2718d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers bool GenerateOatFile(const char* dex_filename, 272d601af8d9549ca95a911afb2fc67c4e562da661fBrian Carlstrom int oat_fd, 27360836d5a9bcf8b30984aae4279a4f6233b0bf622Vladimir Marko const char* oat_cache_filename, 274719d1a33f6569864f529e5a3fff59e7bca97aad0Ian Rogers std::string* error_msg) 2758d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers LOCKS_EXCLUDED(Locks::mutator_lock_); 276262bf46ddc91e5b4fbd367127ff21a1877d939f2jeffhao 277833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe // Find or create the oat file holding dex_location. Then load all corresponding dex files 278833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe // (if multidex) into the given vector. 279833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe bool OpenDexFilesFromOat(const char* dex_location, const char* oat_location, 280833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe std::vector<std::string>* error_msgs, 281833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe std::vector<const DexFile*>* dex_files) 2828d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers LOCKS_EXCLUDED(dex_lock_, Locks::mutator_lock_); 283f6174e8a1566bb357e82506f7ec97dc359c90eb2jeffhao 284345c4b19758703793ed31024cfb79940e2c63b75Alex Light // Returns true if the given oat file has the same image checksum as the image it is paired with. 285345c4b19758703793ed31024cfb79940e2c63b75Alex Light static bool VerifyOatImageChecksum(const OatFile* oat_file, const InstructionSet instruction_set); 286345c4b19758703793ed31024cfb79940e2c63b75Alex Light // Returns true if the oat file checksums match with the image and the offsets are such that it 287345c4b19758703793ed31024cfb79940e2c63b75Alex Light // could be loaded with it. 288345c4b19758703793ed31024cfb79940e2c63b75Alex Light static bool VerifyOatChecksums(const OatFile* oat_file, const InstructionSet instruction_set, 289345c4b19758703793ed31024cfb79940e2c63b75Alex Light std::string* error_msg); 29028db0129e5d7ef642cf8845c86c0e11832817085Brian Carlstrom // Returns true if oat file contains the dex file with the given location and checksum. 291345c4b19758703793ed31024cfb79940e2c63b75Alex Light static bool VerifyOatAndDexFileChecksums(const OatFile* oat_file, 292345c4b19758703793ed31024cfb79940e2c63b75Alex Light const char* dex_location, 293345c4b19758703793ed31024cfb79940e2c63b75Alex Light uint32_t dex_location_checksum, 294345c4b19758703793ed31024cfb79940e2c63b75Alex Light InstructionSet instruction_set, 295345c4b19758703793ed31024cfb79940e2c63b75Alex Light std::string* error_msg); 296afe25515c358617321d69ab4f25003e3d905d613Brian Carlstrom 297418d20fc407052d4152157f61e7453359f902383Elliott Hughes // TODO: replace this with multiple methods that allocate the correct managed type. 2984417536522fd2a9d8215d8672331984769c9520bShih-wei Liao template <class T> 2992dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::ObjectArray<T>* AllocObjectArray(Thread* self, size_t length) 3002dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 3014417536522fd2a9d8215d8672331984769c9520bShih-wei Liao 3022dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::ObjectArray<mirror::Class>* AllocClassArray(Thread* self, size_t length) 3032dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 304418d20fc407052d4152157f61e7453359f902383Elliott Hughes 3052dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::ObjectArray<mirror::String>* AllocStringArray(Thread* self, size_t length) 3062dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 30766f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier 308ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom mirror::ObjectArray<mirror::ArtMethod>* AllocArtMethodArray(Thread* self, size_t length) 3092dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 3104445a7e3398a6143939168097a3aa275b734504dIan Rogers 3112dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::IfTable* AllocIfTable(Thread* self, size_t ifcount) 3122dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 31323435d0df17e19fe312a08ff151464d4b9f83e81Ian Rogers 314ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom mirror::ObjectArray<mirror::ArtField>* AllocArtFieldArray(Thread* self, size_t length) 3152dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 31666f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier 3172dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::ObjectArray<mirror::StackTraceElement>* AllocStackTraceElementArray(Thread* self, 3182dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers size_t length) 319b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 32055df06be4369f5d8ab5eb61a5d22809255171036Shih-wei Liao 3210cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier void VerifyClass(Handle<mirror::Class> klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 3222dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool VerifyClassUsingOatFile(const DexFile& dex_file, mirror::Class* klass, 3232dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::Class::Status& oat_file_class_status) 324b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 325c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier void ResolveClassExceptionHandlerTypes(const DexFile& dex_file, 3260cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::Class> klass) 327b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 328ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom void ResolveMethodExceptionHandlerTypes(const DexFile& dex_file, mirror::ArtMethod* klass) 329b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 33098eacac683b78e60799323e8c7d59e7214808639jeffhao 3312b7c4d196c8abe32f4ca633534917da9de53c359Mathieu Chartier mirror::Class* CreateProxyClass(ScopedObjectAccessAlreadyRunnable& soa, jstring name, 3322b7c4d196c8abe32f4ca633534917da9de53c359Mathieu Chartier jobjectArray interfaces, jobject loader, jobjectArray methods, 3332b7c4d196c8abe32f4ca633534917da9de53c359Mathieu Chartier jobjectArray throws) 334b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 335ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers std::string GetDescriptorForProxy(mirror::Class* proxy_class) 336b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 337ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers mirror::ArtMethod* FindMethodForProxy(mirror::Class* proxy_class, 338ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers mirror::ArtMethod* proxy_method) 33900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers LOCKS_EXCLUDED(dex_lock_) 340b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 34195caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson 3421984651929744dd603fd082e23eacd877b9bc177Ian Rogers // Get the oat code for a method when its class isn't yet initialized 343ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers const void* GetQuickOatCodeFor(mirror::ArtMethod* method) 344ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 34563bc11efaac0c041e849ab401f9fc368631a00f5Ian Rogers#if defined(ART_USE_PORTABLE_COMPILER) 346ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers const void* GetPortableOatCodeFor(mirror::ArtMethod* method, bool* have_portable_code) 347b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 34863bc11efaac0c041e849ab401f9fc368631a00f5Ian Rogers#endif 3491984651929744dd603fd082e23eacd877b9bc177Ian Rogers 350e35517ad40e0713df8420aeb5d3540f146a59f62Mathieu Chartier // Get the oat code for a method from a method index. 351ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers const void* GetQuickOatCodeFor(const DexFile& dex_file, uint16_t class_def_idx, uint32_t method_idx) 352ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 35363bc11efaac0c041e849ab401f9fc368631a00f5Ian Rogers#if defined(ART_USE_PORTABLE_COMPILER) 354ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers const void* GetPortableOatCodeFor(const DexFile& dex_file, uint16_t class_def_idx, uint32_t method_idx) 35533e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 35663bc11efaac0c041e849ab401f9fc368631a00f5Ian Rogers#endif 357e35517ad40e0713df8420aeb5d3540f146a59f62Mathieu Chartier 3587934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom pid_t GetClassesLockOwner(); // For SignalCatcher. 3597934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom pid_t GetDexLockOwner(); // For SignalCatcher. 36024a3c2e9924e8765c4a9b4d383cb8f3b922f9c9fBrian Carlstrom 3610aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao const void* GetPortableResolutionTrampoline() const { 3620aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao return portable_resolution_trampoline_; 3630aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao } 3640aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao 3652da882315a61072664f7ce3c212307342e907207Andreas Gampe const void* GetQuickGenericJniTrampoline() const { 366f0972a410a0665dbe32bd96df09a572d69f9f3a3Dmitry Petrochenko return quick_generic_jni_trampoline_; 367f0972a410a0665dbe32bd96df09a572d69f9f3a3Dmitry Petrochenko } 3682da882315a61072664f7ce3c212307342e907207Andreas Gampe 3690aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao const void* GetQuickResolutionTrampoline() const { 3700aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao return quick_resolution_trampoline_; 3710aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao } 3720aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao 37388474b416eb257078e590bf9bc7957cee604a186Jeff Hao const void* GetPortableImtConflictTrampoline() const { 37488474b416eb257078e590bf9bc7957cee604a186Jeff Hao return portable_imt_conflict_trampoline_; 37588474b416eb257078e590bf9bc7957cee604a186Jeff Hao } 37688474b416eb257078e590bf9bc7957cee604a186Jeff Hao 37788474b416eb257078e590bf9bc7957cee604a186Jeff Hao const void* GetQuickImtConflictTrampoline() const { 37888474b416eb257078e590bf9bc7957cee604a186Jeff Hao return quick_imt_conflict_trampoline_; 37988474b416eb257078e590bf9bc7957cee604a186Jeff Hao } 38088474b416eb257078e590bf9bc7957cee604a186Jeff Hao 3818a630577ed2d9e9571c3434c505e5de223b23c07Vladimir Marko const void* GetQuickToInterpreterBridgeTrampoline() const { 3828a630577ed2d9e9571c3434c505e5de223b23c07Vladimir Marko return quick_to_interpreter_bridge_trampoline_; 3838a630577ed2d9e9571c3434c505e5de223b23c07Vladimir Marko } 3848a630577ed2d9e9571c3434c505e5de223b23c07Vladimir Marko 38588474b416eb257078e590bf9bc7957cee604a186Jeff Hao InternTable* GetInternTable() const { 38688474b416eb257078e590bf9bc7957cee604a186Jeff Hao return intern_table_; 38788474b416eb257078e590bf9bc7957cee604a186Jeff Hao } 38888474b416eb257078e590bf9bc7957cee604a186Jeff Hao 389848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers // Attempts to insert a class into a class table. Returns NULL if 390848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers // the class was inserted, otherwise returns an existing class with 391848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers // the same descriptor and ClassLoader. 3927dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers mirror::Class* InsertClass(const char* descriptor, mirror::Class* klass, size_t hash) 393848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 394848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 395848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers 396590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier // Special code to allocate an art method, use this instead of class->AllocObject. 397590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier mirror::ArtMethod* AllocArtMethod(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 39861e019d291583029c01b61b93bea750f2b663c37Carl Shapiro 39998d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang mirror::ObjectArray<mirror::Class>* GetClassRoots() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 40094f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi mirror::ObjectArray<mirror::Class>* class_roots = class_roots_.Read(); 40198d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang DCHECK(class_roots != NULL); 40298d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang return class_roots; 40398d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang } 40498d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang 405590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier private: 4069c290012b7f505ae1943ab87236f775b97a46e2dNicolas Geoffray bool FindOatMethodFor(mirror::ArtMethod* method, OatFile::OatMethod* oat_method) 407b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 4088532191c4fc8e005f7d432fec40fd9f2936275c6TDYa 40956d947fbc9bc2992e2f93112fafb73e50d2aaa7aBrian Carlstrom OatFile& GetImageOatFile(gc::space::ImageSpace* space) 41000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers LOCKS_EXCLUDED(dex_lock_) 411b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 412a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom 4139837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers void FinishInit(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 414a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom 41575cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom // For early bootstrapping by Init 4166fac447555dc94a935b78198479cce645c837b89Ian Rogers mirror::Class* AllocClass(Thread* self, mirror::Class* java_lang_Class, uint32_t class_size) 417b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 41875cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom 4192dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Alloc* convenience functions to avoid needing to pass in mirror::Class* 42075cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom // values that are known to the ClassLinker such as 42175cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom // kObjectArrayClass and kJavaLangString etc. 4226fac447555dc94a935b78198479cce645c837b89Ian Rogers mirror::Class* AllocClass(Thread* self, uint32_t class_size) 423c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 4242dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::DexCache* AllocDexCache(Thread* self, const DexFile& dex_file) 425b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 426ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom mirror::ArtField* AllocArtField(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 427bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers 4282dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::Class* CreatePrimitiveClass(Thread* self, Primitive::Type type) 4292dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 4302dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::Class* InitializePrimitiveClass(mirror::Class* primitive_class, Primitive::Type type) 431b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 4325b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom 433a331b3cc392132c7333d36649a8310f38f4822ccBrian Carlstrom 4349837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers mirror::Class* CreateArrayClass(Thread* self, const char* descriptor, 4350cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::ClassLoader> class_loader) 436b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 437578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom 43800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers void AppendToBootClassPath(const DexFile& dex_file) 439b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 4400cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier void AppendToBootClassPath(const DexFile& dex_file, Handle<mirror::DexCache> dex_cache) 441b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 442578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom 4435fe594f576225dd7d333835e39c448a71ea9b433Elliott Hughes void ConstructFieldMap(const DexFile& dex_file, const DexFile::ClassDef& dex_class_def, 444ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom mirror::Class* c, SafeMap<uint32_t, mirror::ArtField*>& field_map) 445b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 4465fe594f576225dd7d333835e39c448a71ea9b433Elliott Hughes 44798d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang // Precomputes size needed for Class, in the case of a non-temporary class this size must be 44898d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang // sufficient to hold all static fields. 44998d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang uint32_t SizeOfClassWithoutEmbeddedTables(const DexFile& dex_file, 45098d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang const DexFile::ClassDef& dex_class_def); 4514873d465a1eb6dfbdeddb085c81239d39db60c42Brian Carlstrom 452f615a61aef972cfc1dc23931ac2ed0da14c3fedbBrian Carlstrom void LoadClass(const DexFile& dex_file, 453f615a61aef972cfc1dc23931ac2ed0da14c3fedbBrian Carlstrom const DexFile::ClassDef& dex_class_def, 4540cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::Class> klass, 4552dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::ClassLoader* class_loader) 456b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 457d3c5bebcb52a67cb06e7ab303eaf45f230c08b60Vladimir Marko void LoadClassMembers(const DexFile& dex_file, 458d3c5bebcb52a67cb06e7ab303eaf45f230c08b60Vladimir Marko const byte* class_data, 4590cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::Class> klass, 460d3c5bebcb52a67cb06e7ab303eaf45f230c08b60Vladimir Marko mirror::ClassLoader* class_loader, 461d3c5bebcb52a67cb06e7ab303eaf45f230c08b60Vladimir Marko const OatFile::OatClass* oat_class) 462d3c5bebcb52a67cb06e7ab303eaf45f230c08b60Vladimir Marko SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 463565f50731db360584d0080af7f14f0b7ca10371cCarl Shapiro 4642dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers void LoadField(const DexFile& dex_file, const ClassDataItemIterator& it, 4650cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::Class> klass, Handle<mirror::ArtField> dst) 4662dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 467934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom 468ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom mirror::ArtMethod* LoadMethod(Thread* self, const DexFile& dex_file, 469ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom const ClassDataItemIterator& dex_method, 4700cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::Class> klass) 4712dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 472934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom 4732dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers void FixupStaticTrampolines(mirror::Class* klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 4741984651929744dd603fd082e23eacd877b9bc177Ian Rogers 4759c290012b7f505ae1943ab87236f775b97a46e2dNicolas Geoffray // Finds the associated oat class for a dex_file and descriptor. Returns whether the class 4769c290012b7f505ae1943ab87236f775b97a46e2dNicolas Geoffray // was found, and sets the data in oat_class. 4779c290012b7f505ae1943ab87236f775b97a46e2dNicolas Geoffray bool FindOatClass(const DexFile& dex_file, uint16_t class_def_idx, OatFile::OatClass* oat_class) 47833e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 479aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom 4800cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier void RegisterDexFileLocked(const DexFile& dex_file, Handle<mirror::DexCache> dex_cache) 48100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers EXCLUSIVE_LOCKS_REQUIRED(dex_lock_) 482b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 483e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi bool IsDexFileRegisteredLocked(const DexFile& dex_file) 484b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers SHARED_LOCKS_REQUIRED(dex_lock_, Locks::mutator_lock_); 485aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom 4860cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier bool InitializeClass(Handle<mirror::Class> klass, bool can_run_clinit, 487c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier bool can_init_parents) 488b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 4890cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier bool WaitForInitializeClass(Handle<mirror::Class> klass, Thread* self, 490c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier ObjectLock<mirror::Class>& lock); 4910cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier bool ValidateSuperClassDescriptors(Handle<mirror::Class> klass) 492b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 4930e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 4949837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers bool IsSameDescriptorInDifferentClassContexts(Thread* self, const char* descriptor, 4950cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::ClassLoader> class_loader1, 4960cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::ClassLoader> class_loader2) 497b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 4980e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 4999837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers bool IsSameMethodSignatureInDifferentClassContexts(Thread* self, mirror::ArtMethod* method, 500ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers mirror::Class* klass1, 501ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers mirror::Class* klass2) 502b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5030e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 50498d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang bool LinkClass(Thread* self, const char* descriptor, Handle<mirror::Class> klass, 50598d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang Handle<mirror::ObjectArray<mirror::Class>> interfaces, 50698d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang mirror::Class** new_class) 507b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5080e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 5090cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier bool LinkSuperClass(Handle<mirror::Class> klass) 510b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5110e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 5120cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier bool LoadSuperAndInterfaces(Handle<mirror::Class> klass, const DexFile& dex_file) 513b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5140e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 515bfd9a4378eacaf2dc2bbe05ad48c5164fc93c9feMathieu Chartier bool LinkMethods(Thread* self, Handle<mirror::Class> klass, 5160cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::ObjectArray<mirror::Class>> interfaces) 517b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5180e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 519bfd9a4378eacaf2dc2bbe05ad48c5164fc93c9feMathieu Chartier bool LinkVirtualMethods(Thread* self, Handle<mirror::Class> klass) 520b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5210e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 5220cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier bool LinkInterfaceMethods(Handle<mirror::Class> klass, 5230cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::ObjectArray<mirror::Class>> interfaces) 524b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5250e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 52698d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang bool LinkStaticFields(Handle<mirror::Class> klass, size_t* class_size) 527b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5280cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier bool LinkInstanceFields(Handle<mirror::Class> klass) 529b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 53098d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang bool LinkFields(Handle<mirror::Class> klass, bool is_static, size_t* class_size) 531b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5320cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier void LinkCode(Handle<mirror::ArtMethod> method, const OatFile::OatClass* oat_class, 533f0972a410a0665dbe32bd96df09a572d69f9f3a3Dmitry Petrochenko const DexFile& dex_file, uint32_t dex_method_index, uint32_t method_index) 534f0972a410a0665dbe32bd96df09a572d69f9f3a3Dmitry Petrochenko SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5350cfe1fb7060576d047f7f894fc0d8b87de84fcabIan Rogers 5360cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier void CreateReferenceInstanceOffsets(Handle<mirror::Class> klass) 537b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5380cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier void CreateReferenceStaticOffsets(Handle<mirror::Class> klass) 539b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5400cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier void CreateReferenceOffsets(Handle<mirror::Class> klass, bool is_static, 54100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers uint32_t reference_offsets) 542b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5430e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 54458ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom // For use by ImageWriter to find DexCaches for its roots 545e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi ReaderWriterMutex* DexLock() 546e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) LOCK_RETURNED(dex_lock_) { 547e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi return &dex_lock_; 54858ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom } 549e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi size_t GetDexCacheCount() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_, dex_lock_) { 550e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi return dex_caches_.size(); 551e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi } 552e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi mirror::DexCache* GetDexCache(size_t idx) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_, dex_lock_); 55358ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom 554be4e64303cc66bda0a12eaab835caa0bcfda3cd9Vladimir Marko const OatFile::OatDexFile* FindOpenedOatDexFileForDexFile(const DexFile& dex_file) 55533e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers LOCKS_EXCLUDED(dex_lock_) 55633e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 557833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe 558be4e64303cc66bda0a12eaab835caa0bcfda3cd9Vladimir Marko // Find an opened oat dex file that contains dex_location. If oat_location is not nullptr, 559be4e64303cc66bda0a12eaab835caa0bcfda3cd9Vladimir Marko // the file must have that location, else any oat location is accepted. 560be4e64303cc66bda0a12eaab835caa0bcfda3cd9Vladimir Marko const OatFile::OatDexFile* FindOpenedOatDexFile(const char* oat_location, 561be4e64303cc66bda0a12eaab835caa0bcfda3cd9Vladimir Marko const char* dex_location, 562be4e64303cc66bda0a12eaab835caa0bcfda3cd9Vladimir Marko const uint32_t* dex_location_checksum) 563719d1a33f6569864f529e5a3fff59e7bca97aad0Ian Rogers LOCKS_EXCLUDED(dex_lock_); 564a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light 565a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light // Will open the oat file directly without relocating, even if we could/should do relocation. 566a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light const OatFile* FindOatFileFromOatLocation(const std::string& oat_location, 567a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light std::string* error_msg) 568a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light LOCKS_EXCLUDED(dex_lock_); 569a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light 57000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers const OatFile* FindOpenedOatFileFromOatLocation(const std::string& oat_location) 5718d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers LOCKS_EXCLUDED(dex_lock_); 572833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe 573a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light const OatFile* OpenOatFileFromDexLocation(const std::string& dex_location, 574a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light InstructionSet isa, 575a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light bool* already_opened, 576a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light bool* obsolete_file_cleanup_failed, 577a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light std::vector<std::string>* error_msg) 578a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light LOCKS_EXCLUDED(dex_lock_, Locks::mutator_lock_); 579a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light 5800a112bbbcd761c749c346bfec0ec39c1ef37a590Alex Light const OatFile* GetInterpretedOnlyOat(const std::string& oat_path, 5810a112bbbcd761c749c346bfec0ec39c1ef37a590Alex Light InstructionSet isa, 5820a112bbbcd761c749c346bfec0ec39c1ef37a590Alex Light std::string* error_msg); 5830a112bbbcd761c749c346bfec0ec39c1ef37a590Alex Light 584a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light const OatFile* PatchAndRetrieveOat(const std::string& input, const std::string& output, 585a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light const std::string& image_location, InstructionSet isa, 586a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light std::string* error_msg) 587a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light LOCKS_EXCLUDED(Locks::mutator_lock_); 588a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light 589a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light bool CheckOatFile(const OatFile* oat_file, InstructionSet isa, 590a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light bool* checksum_verified, std::string* error_msg); 591a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light int32_t GetRequiredDelta(const OatFile* oat_file, InstructionSet isa); 592a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light 593833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe // Note: will not register the oat file. 594833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe const OatFile* FindOatFileInOatLocationForDexFile(const char* dex_location, 595833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe uint32_t dex_location_checksum, 596833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe const char* oat_location, 597833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe std::string* error_msg) 5988d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers LOCKS_EXCLUDED(dex_lock_); 599e3359f7ad7671c5816f17145ca3a01516512e8d6Ian Rogers 600833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe // Creates the oat file from the dex_location to the oat_location. Needs a file descriptor for 601833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe // the file to be written, which is assumed to be under a lock. 602833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe const OatFile* CreateOatFileForDexLocation(const char* dex_location, 603833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe int fd, const char* oat_location, 604833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe std::vector<std::string>* error_msgs) 605833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe LOCKS_EXCLUDED(dex_lock_, Locks::mutator_lock_); 606833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe 607833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe // Finds an OatFile that contains a DexFile for the given a DexFile location. 608833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe // 609833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe // Note 1: this will not check open oat files, which are assumed to be stale when this is run. 610833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe // Note 2: Does not register the oat file. It is the caller's job to register if the file is to 611833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe // be kept. 612be4e64303cc66bda0a12eaab835caa0bcfda3cd9Vladimir Marko const OatFile* FindOatFileContainingDexFileFromDexLocation(const char* dex_location, 613be4e64303cc66bda0a12eaab835caa0bcfda3cd9Vladimir Marko const uint32_t* dex_location_checksum, 614833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe InstructionSet isa, 615c54aea7f4acd1a32bb298d43c20e3e0217638926Calin Juravle std::vector<std::string>* error_msgs, 616c54aea7f4acd1a32bb298d43c20e3e0217638926Calin Juravle bool* obsolete_file_cleanup_failed) 617833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe LOCKS_EXCLUDED(dex_lock_, Locks::mutator_lock_); 618833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe 619ca3459398018360d9968a52eebf727df085caf83Calin Juravle // Verifies: 620ca3459398018360d9968a52eebf727df085caf83Calin Juravle // - that the oat file contains the dex file (with a matching checksum, which may be null if the 621ca3459398018360d9968a52eebf727df085caf83Calin Juravle // file was pre-opted) 622ca3459398018360d9968a52eebf727df085caf83Calin Juravle // - the checksums of the oat file (against the image space) 623ca3459398018360d9968a52eebf727df085caf83Calin Juravle // - the checksum of the dex file against dex_location_checksum 624ca3459398018360d9968a52eebf727df085caf83Calin Juravle // - that the dex file can be opened 625ca3459398018360d9968a52eebf727df085caf83Calin Juravle // Returns true iff all verification succeed. 626ca3459398018360d9968a52eebf727df085caf83Calin Juravle // 627ca3459398018360d9968a52eebf727df085caf83Calin Juravle // The dex_location is the dex location as stored in the oat file header. 628ca3459398018360d9968a52eebf727df085caf83Calin Juravle // (see DexFile::GetDexCanonicalLocation for a description of location conventions) 629a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light bool VerifyOatWithDexFile(const OatFile* oat_file, const char* dex_location, 630ca3459398018360d9968a52eebf727df085caf83Calin Juravle const uint32_t* dex_location_checksum, 631a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light std::string* error_msg); 632fad714344ca81a21e775ef45ae09d9a035723cafBrian Carlstrom 6330cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier mirror::ArtMethod* CreateProxyConstructor(Thread* self, Handle<mirror::Class> klass, 634ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom mirror::Class* proxy_class) 635b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 6360cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier mirror::ArtMethod* CreateProxyMethod(Thread* self, Handle<mirror::Class> klass, 6370cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::ArtMethod> prototype) 638b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 63995caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson 640df1532b9ba0cda2d00b78fbdef461f8a6cf8a737Andreas Gampe // Ensures that methods have the kAccPreverified bit set. We use the kAccPreverfied bit on the 641df1532b9ba0cda2d00b78fbdef461f8a6cf8a737Andreas Gampe // class access flags to determine whether this has been done before. 642df1532b9ba0cda2d00b78fbdef461f8a6cf8a737Andreas Gampe void EnsurePreverifiedMethods(Handle<mirror::Class> c) 643df1532b9ba0cda2d00b78fbdef461f8a6cf8a737Andreas Gampe SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 644df1532b9ba0cda2d00b78fbdef461f8a6cf8a737Andreas Gampe 6457dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers mirror::Class* LookupClassFromTableLocked(const char* descriptor, 6467dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers const mirror::ClassLoader* class_loader, 6477dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers size_t hash) 6487dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers SHARED_LOCKS_REQUIRED(Locks::classlinker_classes_lock_, Locks::mutator_lock_); 6497dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers 65098d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang mirror::Class* UpdateClass(const char* descriptor, mirror::Class* klass, size_t hash) 65198d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 65298d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 65398d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang 6547dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers void MoveImageClassesToClassTable() LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 655ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 6567dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 6577dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers mirror::Class* LookupClassFromImage(const char* descriptor) 6587dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 6590e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 66098d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang // EnsureResolved is called to make sure that a class in the class_table_ has been resolved 66198d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang // before returning it to the caller. Its the responsibility of the thread that placed the class 66298d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang // in the table to make it resolved. The thread doing resolution must notify on the class' lock 66398d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang // when resolution has occurred. This happens in mirror::Class::SetStatus. As resolution may 66498d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang // retire a class, the version of the class in the table is returned and this may differ from 66598d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang // the class passed in. 66698d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang mirror::Class* EnsureResolved(Thread* self, const char* descriptor, mirror::Class* klass) 6674c13a3ff475f206c4d0a86ee2595c45392fd942fMathieu Chartier WARN_UNUSED SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 66898d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang 66998d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang void FixupTemporaryDeclaringClass(mirror::Class* temp_class, mirror::Class* new_class) 67098d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 67198d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang 672ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers std::vector<const DexFile*> boot_class_path_; 673ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers 674ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers mutable ReaderWriterMutex dex_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER; 675ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers std::vector<size_t> new_dex_cache_roots_ GUARDED_BY(dex_lock_);; 676ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers std::vector<GcRoot<mirror::DexCache>> dex_caches_ GUARDED_BY(dex_lock_); 677ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers std::vector<const OatFile*> oat_files_ GUARDED_BY(dex_lock_); 678ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers 679ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers 680ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers // multimap from a string hash code of a class descriptor to 681ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers // mirror::Class* instances. Results should be compared for a matching 682ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers // Class::descriptor_ and Class::class_loader_. 683ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers typedef AllocationTrackingMultiMap<size_t, GcRoot<mirror::Class>, kAllocatorTagClassTable> Table; 684ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers // This contains strong roots. To enable concurrent root scanning of 685ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers // the class table, be careful to use a read barrier when accessing this. 686ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers Table class_table_ GUARDED_BY(Locks::classlinker_classes_lock_); 687ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers std::vector<std::pair<size_t, GcRoot<mirror::Class>>> new_class_roots_; 688ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers 689ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers // Do we need to search dex caches to find image classes? 690ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers bool dex_cache_image_class_lookup_required_; 691ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers // Number of times we've searched dex caches for a class. After a certain number of misses we move 692ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers // the classes into the class_table_ to avoid dex cache based searches. 693ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers Atomic<uint32_t> failed_dex_cache_class_lookups_; 694ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers 695a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom // indexes into class_roots_. 696a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom // needs to be kept in sync with class_roots_descriptors_. 69774eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom enum ClassRoot { 69875cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom kJavaLangClass, 69975cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom kJavaLangObject, 700418d20fc407052d4152157f61e7453359f902383Elliott Hughes kClassArrayClass, 70174eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom kObjectArrayClass, 70274eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom kJavaLangString, 70366f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier kJavaLangDexCache, 704bf61ba3dcd9d9895b86a05e88762ff034b09b263Elliott Hughes kJavaLangRefReference, 705ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom kJavaLangReflectArtField, 706ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom kJavaLangReflectArtMethod, 707466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers kJavaLangReflectProxy, 70866f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier kJavaLangStringArrayClass, 709ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom kJavaLangReflectArtFieldArrayClass, 710ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom kJavaLangReflectArtMethodArrayClass, 71174eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom kJavaLangClassLoader, 7125167c97a4f672ba821453418e3943988fabbfc43Ian Rogers kJavaLangThrowable, 7138cd6ddaeb78cc904e13bac88753654a04b2e15b8jeffhao kJavaLangClassNotFoundException, 71455df06be4369f5d8ab5eb61a5d22809255171036Shih-wei Liao kJavaLangStackTraceElement, 71575cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom kPrimitiveBoolean, 716d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes kPrimitiveByte, 71775cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom kPrimitiveChar, 71875cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom kPrimitiveDouble, 719d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes kPrimitiveFloat, 72075cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom kPrimitiveInt, 72175cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom kPrimitiveLong, 722d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes kPrimitiveShort, 72375cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom kPrimitiveVoid, 724d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes kBooleanArrayClass, 725d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes kByteArrayClass, 726d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes kCharArrayClass, 727d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes kDoubleArrayClass, 728d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes kFloatArrayClass, 729d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes kIntArrayClass, 730d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes kLongArrayClass, 731d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes kShortArrayClass, 73255df06be4369f5d8ab5eb61a5d22809255171036Shih-wei Liao kJavaLangStackTraceElementArrayClass, 73375cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom kClassRootsMax, 73475cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom }; 73594f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi GcRoot<mirror::ObjectArray<mirror::Class>> class_roots_; 736913af1bd90a6e8fd56f1f851db1f098636dae6a5Brian Carlstrom 7372dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::Class* GetClassRoot(ClassRoot class_root) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 73874eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom 7392dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers void SetClassRoot(ClassRoot class_root, mirror::Class* klass) 740b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 741a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom 742418d20fc407052d4152157f61e7453359f902383Elliott Hughes static const char* class_roots_descriptors_[]; 743a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom 744a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom const char* GetClassRootDescriptor(ClassRoot class_root) { 745a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom const char* descriptor = class_roots_descriptors_[class_root]; 746a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom CHECK(descriptor != NULL); 747a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom return descriptor; 748a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom } 749a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom 7509837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers // The interface table used by all arrays. 75194f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi GcRoot<mirror::IfTable> array_iftable_; 752565f50731db360584d0080af7f14f0b7ca10371cCarl Shapiro 7539837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers // A cache of the last FindArrayClass results. The cache serves to avoid creating array class 7549837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers // descriptors for the sake of performing FindClass. 7559837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers static constexpr size_t kFindArrayCacheSize = 16; 75694f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi GcRoot<mirror::Class> find_array_class_cache_[kFindArrayCacheSize]; 7579837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers size_t find_array_class_cache_next_victim_; 7589837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers 75975cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom bool init_done_; 760893263b7d5bc2ca43a91ecb8071867f5134fc60aMathieu Chartier bool log_new_dex_caches_roots_ GUARDED_BY(dex_lock_); 761893263b7d5bc2ca43a91ecb8071867f5134fc60aMathieu Chartier bool log_new_class_table_roots_ GUARDED_BY(Locks::classlinker_classes_lock_); 76275cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom 763cf4c6c41b0084dc4567ff709fb8ce9ebd72b26acElliott Hughes InternTable* intern_table_; 764cf4c6c41b0084dc4567ff709fb8ce9ebd72b26acElliott Hughes 76598d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang // Trampolines within the image the bounce to runtime entrypoints. Done so that there is a single 76698d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang // patch point within the image. TODO: make these proper relocations. 7670aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao const void* portable_resolution_trampoline_; 7680aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao const void* quick_resolution_trampoline_; 76988474b416eb257078e590bf9bc7957cee604a186Jeff Hao const void* portable_imt_conflict_trampoline_; 77088474b416eb257078e590bf9bc7957cee604a186Jeff Hao const void* quick_imt_conflict_trampoline_; 7712da882315a61072664f7ce3c212307342e907207Andreas Gampe const void* quick_generic_jni_trampoline_; 7728a630577ed2d9e9571c3434c505e5de223b23c07Vladimir Marko const void* quick_to_interpreter_bridge_trampoline_; 7730aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao 774ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom friend class ImageWriter; // for GetClassRoots 775a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light friend class ImageDumper; // for FindOpenedOatFileFromOatLocation 776a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light friend class ElfPatcher; // for FindOpenedOatFileForDexFile & FindOpenedOatFileFromOatLocation 7779c290012b7f505ae1943ab87236f775b97a46e2dNicolas Geoffray friend class NoDex2OatTest; // for FindOpenedOatFileForDexFile 7780a112bbbcd761c749c346bfec0ec39c1ef37a590Alex Light friend class NoPatchoatTest; // for FindOpenedOatFileForDexFile 7796d4d9fcb4f01e287ee29e81cd1c941ee5d11d379Ian Rogers FRIEND_TEST(ClassLinkerTest, ClassRootDescriptors); 7802dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers FRIEND_TEST(mirror::DexCacheTest, Open); 7811a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao FRIEND_TEST(ExceptionTest, FindExceptionHandler); 782ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom FRIEND_TEST(ObjectTest, AllocObjectArray); 7830e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro DISALLOW_COPY_AND_ASSIGN(ClassLinker); 7840e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro}; 7850e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 7860e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro} // namespace art 7870e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 788fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif // ART_RUNTIME_CLASS_LINKER_H_ 789