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" 25e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier#include "base/hash_set.h" 26761600567d73b23324ae0251e871c15d6849ffd8Elliott Hughes#include "base/macros.h" 2776b6167407c2b6f5d40ad895b2793a6b037f54b2Elliott Hughes#include "base/mutex.h" 287e93b50433cde2a44d99212e8040299bde498546Brian Carlstrom#include "dex_file.h" 2994f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi#include "gc_root.h" 30e5448b5a12003b405b22cde3b94f962ab4888a87Elliott Hughes#include "gtest/gtest.h" 31590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier#include "jni.h" 3258ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom#include "oat_file.h" 3383c8ee000d525017ead8753fce6bc1020249b96aMathieu Chartier#include "object_callbacks.h" 340e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 350e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapironamespace art { 3698d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang 371d54e73444e017d3a65234e0f193846f3e27472bIan Rogersnamespace gc { 381d54e73444e017d3a65234e0f193846f3e27472bIan Rogersnamespace space { 391d54e73444e017d3a65234e0f193846f3e27472bIan Rogers class ImageSpace; 401d54e73444e017d3a65234e0f193846f3e27472bIan Rogers} // namespace space 411d54e73444e017d3a65234e0f193846f3e27472bIan Rogers} // namespace gc 422dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersnamespace mirror { 4333e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers class ClassLoader; 4433e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers class DexCache; 4533e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers class DexCacheTest_Open_Test; 4633e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers class IfTable; 4733e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers template<class T> class ObjectArray; 4833e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers class StackTraceElement; 4933e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers} // namespace mirror 501d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 51cf4c6c41b0084dc4567ff709fb8ce9ebd72b26acElliott Hughesclass InternTable; 52c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartiertemplate<class T> class ObjectLock; 53d7392faea80acb5d73a027bb384e3222bc2c2e43Andreas Gampeclass Runtime; 542b7c4d196c8abe32f4ca633534917da9de53c359Mathieu Chartierclass ScopedObjectAccessAlreadyRunnable; 551fb463e42cf1d67595cff66d19c0f99e3046f4c4Mathieu Chartiertemplate<size_t kNumReferences> class PACKED(4) StackHandleScope; 56cf4c6c41b0084dc4567ff709fb8ce9ebd72b26acElliott Hughes 572dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogerstypedef bool (ClassVisitor)(mirror::Class* c, void* arg); 58a215526d5c789cbef0f81a1f9aba22541a841ccaElliott Hughes 59893263b7d5bc2ca43a91ecb8071867f5134fc60aMathieu Chartierenum VisitRootFlags : uint8_t; 60893263b7d5bc2ca43a91ecb8071867f5134fc60aMathieu Chartier 610e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiroclass ClassLinker { 620e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro public: 63590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier explicit ClassLinker(InternTable* intern_table); 64590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier ~ClassLinker(); 6558ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom 66507e6180ad271eb719c67ce7394852c731d975a5Alex Light // Initialize class linker by bootstraping from dex files. 67507e6180ad271eb719c67ce7394852c731d975a5Alex Light void InitWithoutImage(const std::vector<const DexFile*>& boot_class_path) 68b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 699ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom 70590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier // Initialize class linker from one or more images. 71590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier void InitFromImage() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 72565f50731db360584d0080af7f14f0b7ca10371cCarl Shapiro 7364bf5a33d55aa779ef452552a466943002d39e4fElliott Hughes // Finds a class by its descriptor, loading it if necessary. 7474eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom // If class_loader is null, searches boot_class_path_. 759837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers mirror::Class* FindClass(Thread* self, const char* descriptor, 760cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::ClassLoader> class_loader) 77b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 78aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom 79564ff985184737977aa26c485d0c1a413e530705Mathieu Chartier // Find a class in the path class loader, loading it if necessary. Hash function is supposed to 80564ff985184737977aa26c485d0c1a413e530705Mathieu Chartier // be ComputeModifiedUtf8Hash(descriptor). 81194116c836080de14245a3a7c4617d07b8abf8cfMathieu Chartier mirror::Class* FindClassInPathClassLoader(ScopedObjectAccessAlreadyRunnable& soa, 82564ff985184737977aa26c485d0c1a413e530705Mathieu Chartier Thread* self, const char* descriptor, size_t hash, 83194116c836080de14245a3a7c4617d07b8abf8cfMathieu Chartier Handle<mirror::ClassLoader> class_loader) 84194116c836080de14245a3a7c4617d07b8abf8cfMathieu Chartier SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 85194116c836080de14245a3a7c4617d07b8abf8cfMathieu Chartier 869837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers // Finds a class by its descriptor using the "system" class loader, ie by searching the 879837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers // boot_class_path_. 889837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers mirror::Class* FindSystemClass(Thread* self, const char* descriptor) 899837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 909837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers 919837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers // Finds the array class given for the element class. 92b74cd29802f364b4cec88f4913fa38ade26b8fabMathieu Chartier mirror::Class* FindArrayClass(Thread* self, mirror::Class** element_class) 93b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 94aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom 9579cfc0e93e210e548b45459478a154168d2d8cc2Ian Rogers // Returns true if the class linker is initialized. 96590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier bool IsInitialized() const; 97590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 98aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom // Define a new a class based on a ClassDef from a DexFile 99564ff985184737977aa26c485d0c1a413e530705Mathieu Chartier mirror::Class* DefineClass(Thread* self, const char* descriptor, size_t hash, 1000cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::ClassLoader> class_loader, 1012dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers const DexFile& dex_file, const DexFile::ClassDef& dex_class_def) 102b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 10364bf5a33d55aa779ef452552a466943002d39e4fElliott Hughes 10464bf5a33d55aa779ef452552a466943002d39e4fElliott Hughes // Finds a class by its descriptor, returning NULL if it isn't wasn't loaded 10564bf5a33d55aa779ef452552a466943002d39e4fElliott Hughes // by the given 'class_loader'. 106564ff985184737977aa26c485d0c1a413e530705Mathieu Chartier mirror::Class* LookupClass(const char* descriptor, size_t hash, 107564ff985184737977aa26c485d0c1a413e530705Mathieu Chartier mirror::ClassLoader* class_loader) 108b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 109b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 1100e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 1116fa602d614d418f38afebb4d44f42e7dc0b4bd94Elliott Hughes // Finds all the classes with the given descriptor, regardless of ClassLoader. 1122dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers void LookupClasses(const char* descriptor, std::vector<mirror::Class*>& classes) 113b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 114b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 1156fa602d614d418f38afebb4d44f42e7dc0b4bd94Elliott Hughes 1162dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::Class* FindPrimitiveClass(char type) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 117d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes 118ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom // General class unloading is not supported, this is used to prune 119ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom // unwanted classes during image writing. 120e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier bool RemoveClass(const char* descriptor, mirror::ClassLoader* class_loader) 121b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 122b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 123ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom 1247dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers void DumpAllClasses(int flags) 125b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 126b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 1279d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes 1287dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers void DumpForSigQuit(std::ostream& os) 1297dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 1307dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 131cac6cc72c3331257fa6437b36a131e5d551e2f3cElliott Hughes 1327dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers size_t NumLoadedClasses() 1337dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 1347dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 135e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes 136b63ec393a5c4ba2be1d34dd871cda811eaa803c7Brian Carlstrom // Resolve a String with the given index from the DexFile, storing the 137aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom // result in the DexCache. The referrer is used to identify the 138aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom // target DexCache and ClassLoader to use for resolution. 139ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers mirror::String* ResolveString(uint32_t string_idx, mirror::ArtMethod* referrer) 1402dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 141aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom 142aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom // Resolve a String with the given index from the DexFile, storing the 1439ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // result in the DexCache. 1442dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::String* ResolveString(const DexFile& dex_file, uint32_t string_idx, 1450cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::DexCache> dex_cache) 146b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 1479ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom 148b63ec393a5c4ba2be1d34dd871cda811eaa803c7Brian Carlstrom // Resolve a Type with the given index from the DexFile, storing the 1499ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // result in the DexCache. The referrer is used to identity the 1509ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // target DexCache and ClassLoader to use for resolution. 151ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers mirror::Class* ResolveType(const DexFile& dex_file, uint16_t type_idx, mirror::Class* referrer) 152590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 1539ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom 154b63ec393a5c4ba2be1d34dd871cda811eaa803c7Brian Carlstrom // Resolve a Type with the given index from the DexFile, storing the 1550cfe1fb7060576d047f7f894fc0d8b87de84fcabIan Rogers // result in the DexCache. The referrer is used to identify the 156b63ec393a5c4ba2be1d34dd871cda811eaa803c7Brian Carlstrom // target DexCache and ClassLoader to use for resolution. 157ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers mirror::Class* ResolveType(uint16_t type_idx, mirror::ArtMethod* referrer) 1582dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 1590cfe1fb7060576d047f7f894fc0d8b87de84fcabIan Rogers 160ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers mirror::Class* ResolveType(uint16_t type_idx, mirror::ArtField* referrer) 1612dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 162b63ec393a5c4ba2be1d34dd871cda811eaa803c7Brian Carlstrom 1639ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // Resolve a type with the given ID from the DexFile, storing the 1649ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // result in DexCache. The ClassLoader is used to search for the 1659ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // type, since it may be referenced from but not contained within 1669ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // the given DexFile. 167590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier mirror::Class* ResolveType(const DexFile& dex_file, uint16_t type_idx, 1680cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::DexCache> dex_cache, 1690cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::ClassLoader> class_loader) 170b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 1719ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom 1729ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // Resolve a method with a given ID from the DexFile, storing the 1739ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // result in DexCache. The ClassLinker and ClassLoader are used as 1749ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // in ResolveType. What is unique is the method type argument which 1759ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // is used to determine if this method is a direct, static, or 1769ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // virtual method. 177ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom mirror::ArtMethod* ResolveMethod(const DexFile& dex_file, 178ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom uint32_t method_idx, 1790cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::DexCache> dex_cache, 1800cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::ClassLoader> class_loader, 1810cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::ArtMethod> referrer, 182ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom InvokeType type) 183b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 1849ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom 1850cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier mirror::ArtMethod* GetResolvedMethod(uint32_t method_idx, mirror::ArtMethod* referrer, 1860cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier InvokeType type) 1870cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 1880cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier mirror::ArtMethod* ResolveMethod(Thread* self, uint32_t method_idx, mirror::ArtMethod** referrer, 189ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom InvokeType type) 1902dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 191161928613d3f097108319de60494fab1aab8d48aBrian Carlstrom 1920cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier mirror::ArtField* GetResolvedField(uint32_t field_idx, mirror::Class* field_declaring_class) 1930cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 194ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers mirror::ArtField* ResolveField(uint32_t field_idx, mirror::ArtMethod* referrer, 195ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom bool is_static) 1962dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 197b9edb841423dfe60e193fcffd25994398c91baa2Brian Carlstrom 198161928613d3f097108319de60494fab1aab8d48aBrian Carlstrom // Resolve a field with a given ID from the DexFile, storing the 1999ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // result in DexCache. The ClassLinker and ClassLoader are used as 2009ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // in ResolveType. What is unique is the is_static argument which is 2019ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // used to determine if we are resolving a static or non-static 2029ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // field. 203ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom mirror::ArtField* ResolveField(const DexFile& dex_file, 204ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom uint32_t field_idx, 2050cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::DexCache> dex_cache, 2060cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::ClassLoader> class_loader, 207ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom bool is_static) 208b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 2099ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom 210b067ac2fe225c76fc9eb9434ef62cbb797bfa425Ian Rogers // Resolve a field with a given ID from the DexFile, storing the 211b067ac2fe225c76fc9eb9434ef62cbb797bfa425Ian Rogers // result in DexCache. The ClassLinker and ClassLoader are used as 212b067ac2fe225c76fc9eb9434ef62cbb797bfa425Ian Rogers // in ResolveType. No is_static argument is provided so that Java 213b067ac2fe225c76fc9eb9434ef62cbb797bfa425Ian Rogers // field resolution semantics are followed. 2140cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier mirror::ArtField* ResolveFieldJLS(const DexFile& dex_file, uint32_t field_idx, 2150cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::DexCache> dex_cache, 2160cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::ClassLoader> class_loader) 217b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 218b067ac2fe225c76fc9eb9434ef62cbb797bfa425Ian Rogers 219ad25ac568407ceb14334e8551dd1c4dd0fd6993cIan Rogers // Get shorty from method index without resolution. Used to do handlerization. 220ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom const char* MethodShorty(uint32_t method_idx, mirror::ArtMethod* referrer, uint32_t* length) 221b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 222ad25ac568407ceb14334e8551dd1c4dd0fd6993cIan Rogers 223f4c21c9f6440c3980c47a297519f758796dbc039Elliott Hughes // Returns true on success, false if there's an exception pending. 22425c3325bf95036bf325fc7cb21b4fd6d40282857Brian Carlstrom // can_run_clinit=false allows the compiler to attempt to init a class, 22525c3325bf95036bf325fc7cb21b4fd6d40282857Brian Carlstrom // given the restriction that no <clinit> execution is possible. 2260cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier bool EnsureInitialized(Handle<mirror::Class> c, bool can_init_fields, bool can_init_parents) 227b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 2280e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 2292a20cfd0b7fc81099f5de0da782ebcc1cb262792Elliott Hughes // Initializes classes that have instances in the image but that have 2302a20cfd0b7fc81099f5de0da782ebcc1cb262792Elliott Hughes // <clinit> methods so they could not be initialized by the compiler. 231b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers void RunRootClinits() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 2322a20cfd0b7fc81099f5de0da782ebcc1cb262792Elliott Hughes 23300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers void RegisterDexFile(const DexFile& dex_file) 23400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers LOCKS_EXCLUDED(dex_lock_) 235b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 2360cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier void RegisterDexFile(const DexFile& dex_file, Handle<mirror::DexCache> dex_cache) 23700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers LOCKS_EXCLUDED(dex_lock_) 238b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 2390e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 2408d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers const OatFile* RegisterOatFile(const OatFile* oat_file) 24100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers LOCKS_EXCLUDED(dex_lock_); 242866c8627626b7c47fb69b498b341772d7dfa7f60Brian Carlstrom 2438a48741b96ca9cc5835cac72ac133c4ca480930fBrian Carlstrom const std::vector<const DexFile*>& GetBootClassPath() { 2448a48741b96ca9cc5835cac72ac133c4ca480930fBrian Carlstrom return boot_class_path_; 2458a48741b96ca9cc5835cac72ac133c4ca480930fBrian Carlstrom } 2468a48741b96ca9cc5835cac72ac133c4ca480930fBrian Carlstrom 2477dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers void VisitClasses(ClassVisitor* visitor, void* arg) 248ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 2497dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 250ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers 251ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers // Less efficient variant of VisitClasses that copies the class_table_ into secondary storage 252ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers // so that it can visit individual classes without holding the doesn't hold the 253ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers // Locks::classlinker_classes_lock_. As the Locks::classlinker_classes_lock_ isn't held this code 254ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers // can race with insertion and deletion of classes while the visitor is being called. 2557dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers void VisitClassesWithoutClassesLock(ClassVisitor* visitor, void* arg) 2567dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 25700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers 25852e4b43d62896b56f8c2bd041e528472bb4a0d8dMathieu Chartier void VisitClassRoots(RootCallback* callback, void* arg, VisitRootFlags flags) 25994f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 26094f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 261893263b7d5bc2ca43a91ecb8071867f5134fc60aMathieu Chartier void VisitRoots(RootCallback* callback, void* arg, VisitRootFlags flags) 26294f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi LOCKS_EXCLUDED(dex_lock_) 26394f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 26400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers 265e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi mirror::DexCache* FindDexCache(const DexFile& dex_file) 26600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers LOCKS_EXCLUDED(dex_lock_) 267b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 268e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi bool IsDexFileRegistered(const DexFile& dex_file) 269b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers LOCKS_EXCLUDED(dex_lock_) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 270e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi void FixupDexCaches(mirror::ArtMethod* resolution_method) 27100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers LOCKS_EXCLUDED(dex_lock_) 272b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 2731d9f52b7ca91c6d30b7acfac1c9ab24d93fff470Brian Carlstrom 274262bf46ddc91e5b4fbd367127ff21a1877d939f2jeffhao // Generate an oat file from a dex file 2758d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers bool GenerateOatFile(const char* dex_filename, 276d601af8d9549ca95a911afb2fc67c4e562da661fBrian Carlstrom int oat_fd, 27760836d5a9bcf8b30984aae4279a4f6233b0bf622Vladimir Marko const char* oat_cache_filename, 278719d1a33f6569864f529e5a3fff59e7bca97aad0Ian Rogers std::string* error_msg) 2798d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers LOCKS_EXCLUDED(Locks::mutator_lock_); 280262bf46ddc91e5b4fbd367127ff21a1877d939f2jeffhao 281833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe // Find or create the oat file holding dex_location. Then load all corresponding dex files 282833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe // (if multidex) into the given vector. 283833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe bool OpenDexFilesFromOat(const char* dex_location, const char* oat_location, 284833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe std::vector<std::string>* error_msgs, 285833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe std::vector<const DexFile*>* dex_files) 2868d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers LOCKS_EXCLUDED(dex_lock_, Locks::mutator_lock_); 287f6174e8a1566bb357e82506f7ec97dc359c90eb2jeffhao 288345c4b19758703793ed31024cfb79940e2c63b75Alex Light // Returns true if the given oat file has the same image checksum as the image it is paired with. 289345c4b19758703793ed31024cfb79940e2c63b75Alex Light static bool VerifyOatImageChecksum(const OatFile* oat_file, const InstructionSet instruction_set); 290345c4b19758703793ed31024cfb79940e2c63b75Alex Light // Returns true if the oat file checksums match with the image and the offsets are such that it 291345c4b19758703793ed31024cfb79940e2c63b75Alex Light // could be loaded with it. 292345c4b19758703793ed31024cfb79940e2c63b75Alex Light static bool VerifyOatChecksums(const OatFile* oat_file, const InstructionSet instruction_set, 293345c4b19758703793ed31024cfb79940e2c63b75Alex Light std::string* error_msg); 29428db0129e5d7ef642cf8845c86c0e11832817085Brian Carlstrom // Returns true if oat file contains the dex file with the given location and checksum. 295345c4b19758703793ed31024cfb79940e2c63b75Alex Light static bool VerifyOatAndDexFileChecksums(const OatFile* oat_file, 296345c4b19758703793ed31024cfb79940e2c63b75Alex Light const char* dex_location, 297345c4b19758703793ed31024cfb79940e2c63b75Alex Light uint32_t dex_location_checksum, 298345c4b19758703793ed31024cfb79940e2c63b75Alex Light InstructionSet instruction_set, 299345c4b19758703793ed31024cfb79940e2c63b75Alex Light std::string* error_msg); 300afe25515c358617321d69ab4f25003e3d905d613Brian Carlstrom 301418d20fc407052d4152157f61e7453359f902383Elliott Hughes // TODO: replace this with multiple methods that allocate the correct managed type. 3024417536522fd2a9d8215d8672331984769c9520bShih-wei Liao template <class T> 3032dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::ObjectArray<T>* AllocObjectArray(Thread* self, size_t length) 3042dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 3054417536522fd2a9d8215d8672331984769c9520bShih-wei Liao 3062dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::ObjectArray<mirror::Class>* AllocClassArray(Thread* self, size_t length) 3072dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 308418d20fc407052d4152157f61e7453359f902383Elliott Hughes 3092dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::ObjectArray<mirror::String>* AllocStringArray(Thread* self, size_t length) 3102dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 31166f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier 312ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom mirror::ObjectArray<mirror::ArtMethod>* AllocArtMethodArray(Thread* self, size_t length) 3132dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 3144445a7e3398a6143939168097a3aa275b734504dIan Rogers 3152dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::IfTable* AllocIfTable(Thread* self, size_t ifcount) 3162dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 31723435d0df17e19fe312a08ff151464d4b9f83e81Ian Rogers 318ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom mirror::ObjectArray<mirror::ArtField>* AllocArtFieldArray(Thread* self, size_t length) 3192dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 32066f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier 3212dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::ObjectArray<mirror::StackTraceElement>* AllocStackTraceElementArray(Thread* self, 3222dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers size_t length) 323b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 32455df06be4369f5d8ab5eb61a5d22809255171036Shih-wei Liao 3250cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier void VerifyClass(Handle<mirror::Class> klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 3262dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool VerifyClassUsingOatFile(const DexFile& dex_file, mirror::Class* klass, 3272dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::Class::Status& oat_file_class_status) 328b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 329c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier void ResolveClassExceptionHandlerTypes(const DexFile& dex_file, 3300cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::Class> klass) 331b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 332ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom void ResolveMethodExceptionHandlerTypes(const DexFile& dex_file, mirror::ArtMethod* klass) 333b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 33498eacac683b78e60799323e8c7d59e7214808639jeffhao 3352b7c4d196c8abe32f4ca633534917da9de53c359Mathieu Chartier mirror::Class* CreateProxyClass(ScopedObjectAccessAlreadyRunnable& soa, jstring name, 3362b7c4d196c8abe32f4ca633534917da9de53c359Mathieu Chartier jobjectArray interfaces, jobject loader, jobjectArray methods, 3372b7c4d196c8abe32f4ca633534917da9de53c359Mathieu Chartier jobjectArray throws) 338b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 339ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers std::string GetDescriptorForProxy(mirror::Class* proxy_class) 340b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 341ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers mirror::ArtMethod* FindMethodForProxy(mirror::Class* proxy_class, 342ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers mirror::ArtMethod* proxy_method) 34300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers LOCKS_EXCLUDED(dex_lock_) 344b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 34595caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson 3461984651929744dd603fd082e23eacd877b9bc177Ian Rogers // Get the oat code for a method when its class isn't yet initialized 347ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers const void* GetQuickOatCodeFor(mirror::ArtMethod* method) 348ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 34963bc11efaac0c041e849ab401f9fc368631a00f5Ian Rogers#if defined(ART_USE_PORTABLE_COMPILER) 350ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers const void* GetPortableOatCodeFor(mirror::ArtMethod* method, bool* have_portable_code) 351b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 35263bc11efaac0c041e849ab401f9fc368631a00f5Ian Rogers#endif 3531984651929744dd603fd082e23eacd877b9bc177Ian Rogers 354e35517ad40e0713df8420aeb5d3540f146a59f62Mathieu Chartier // Get the oat code for a method from a method index. 355ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers const void* GetQuickOatCodeFor(const DexFile& dex_file, uint16_t class_def_idx, uint32_t method_idx) 356ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 35763bc11efaac0c041e849ab401f9fc368631a00f5Ian Rogers#if defined(ART_USE_PORTABLE_COMPILER) 358ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers const void* GetPortableOatCodeFor(const DexFile& dex_file, uint16_t class_def_idx, uint32_t method_idx) 35933e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 36063bc11efaac0c041e849ab401f9fc368631a00f5Ian Rogers#endif 361e35517ad40e0713df8420aeb5d3540f146a59f62Mathieu Chartier 362f2134f684923454e00c8ca7675b431a8538131bcSebastien Hertz // Get compiled code for a method, return null if no code 363f2134f684923454e00c8ca7675b431a8538131bcSebastien Hertz // exists. This is unlike Get..OatCodeFor which will return a bridge 364f2134f684923454e00c8ca7675b431a8538131bcSebastien Hertz // or interpreter entrypoint. 365f2134f684923454e00c8ca7675b431a8538131bcSebastien Hertz const void* GetOatMethodQuickCodeFor(mirror::ArtMethod* method) 366f2134f684923454e00c8ca7675b431a8538131bcSebastien Hertz SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 367f2134f684923454e00c8ca7675b431a8538131bcSebastien Hertz 3687934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom pid_t GetClassesLockOwner(); // For SignalCatcher. 3697934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom pid_t GetDexLockOwner(); // For SignalCatcher. 37024a3c2e9924e8765c4a9b4d383cb8f3b922f9c9fBrian Carlstrom 3710aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao const void* GetPortableResolutionTrampoline() const { 3720aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao return portable_resolution_trampoline_; 3730aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao } 3740aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao 3752da882315a61072664f7ce3c212307342e907207Andreas Gampe const void* GetQuickGenericJniTrampoline() const { 376f0972a410a0665dbe32bd96df09a572d69f9f3a3Dmitry Petrochenko return quick_generic_jni_trampoline_; 377f0972a410a0665dbe32bd96df09a572d69f9f3a3Dmitry Petrochenko } 3782da882315a61072664f7ce3c212307342e907207Andreas Gampe 3790aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao const void* GetQuickResolutionTrampoline() const { 3800aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao return quick_resolution_trampoline_; 3810aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao } 3820aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao 38388474b416eb257078e590bf9bc7957cee604a186Jeff Hao const void* GetPortableImtConflictTrampoline() const { 38488474b416eb257078e590bf9bc7957cee604a186Jeff Hao return portable_imt_conflict_trampoline_; 38588474b416eb257078e590bf9bc7957cee604a186Jeff Hao } 38688474b416eb257078e590bf9bc7957cee604a186Jeff Hao 38788474b416eb257078e590bf9bc7957cee604a186Jeff Hao const void* GetQuickImtConflictTrampoline() const { 38888474b416eb257078e590bf9bc7957cee604a186Jeff Hao return quick_imt_conflict_trampoline_; 38988474b416eb257078e590bf9bc7957cee604a186Jeff Hao } 39088474b416eb257078e590bf9bc7957cee604a186Jeff Hao 3918a630577ed2d9e9571c3434c505e5de223b23c07Vladimir Marko const void* GetQuickToInterpreterBridgeTrampoline() const { 3928a630577ed2d9e9571c3434c505e5de223b23c07Vladimir Marko return quick_to_interpreter_bridge_trampoline_; 3938a630577ed2d9e9571c3434c505e5de223b23c07Vladimir Marko } 3948a630577ed2d9e9571c3434c505e5de223b23c07Vladimir Marko 39588474b416eb257078e590bf9bc7957cee604a186Jeff Hao InternTable* GetInternTable() const { 39688474b416eb257078e590bf9bc7957cee604a186Jeff Hao return intern_table_; 39788474b416eb257078e590bf9bc7957cee604a186Jeff Hao } 39888474b416eb257078e590bf9bc7957cee604a186Jeff Hao 399848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers // Attempts to insert a class into a class table. Returns NULL if 400848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers // the class was inserted, otherwise returns an existing class with 401848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers // the same descriptor and ClassLoader. 4027dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers mirror::Class* InsertClass(const char* descriptor, mirror::Class* klass, size_t hash) 403848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 404848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 405848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers 406590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier // Special code to allocate an art method, use this instead of class->AllocObject. 407590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier mirror::ArtMethod* AllocArtMethod(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 40861e019d291583029c01b61b93bea750f2b663c37Carl Shapiro 40998d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang mirror::ObjectArray<mirror::Class>* GetClassRoots() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 41094f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi mirror::ObjectArray<mirror::Class>* class_roots = class_roots_.Read(); 41198d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang DCHECK(class_roots != NULL); 41298d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang return class_roots; 41398d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang } 41498d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang 415e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier // Move all of the image classes into the class table for faster lookups. 416e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier void MoveImageClassesToClassTable() 417e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 418e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 419e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier // Move the class table to the pre-zygote table to reduce memory usage. This works by ensuring 420e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier // that no more classes are ever added to the pre zygote table which makes it that the pages 421e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier // always remain shared dirty instead of private dirty. 422e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier void MoveClassTableToPreZygote() 423e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 424e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 425e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier 4267f418db815f0eaef5b2f43e1f06fb8773a415494Sebastien Hertz // Returns true if the method can be called with its direct code pointer, false otherwise. 4277f418db815f0eaef5b2f43e1f06fb8773a415494Sebastien Hertz bool MayBeCalledWithDirectCodePointer(mirror::ArtMethod* m) 4287f418db815f0eaef5b2f43e1f06fb8773a415494Sebastien Hertz SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 4297f418db815f0eaef5b2f43e1f06fb8773a415494Sebastien Hertz 430590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier private: 4319c290012b7f505ae1943ab87236f775b97a46e2dNicolas Geoffray bool FindOatMethodFor(mirror::ArtMethod* method, OatFile::OatMethod* oat_method) 432b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 4338532191c4fc8e005f7d432fec40fd9f2936275c6TDYa 43456d947fbc9bc2992e2f93112fafb73e50d2aaa7aBrian Carlstrom OatFile& GetImageOatFile(gc::space::ImageSpace* space) 43500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers LOCKS_EXCLUDED(dex_lock_) 436b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 437a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom 4389837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers void FinishInit(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 439a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom 44075cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom // For early bootstrapping by Init 4416fac447555dc94a935b78198479cce645c837b89Ian Rogers mirror::Class* AllocClass(Thread* self, mirror::Class* java_lang_Class, uint32_t class_size) 442b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 44375cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom 4442dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Alloc* convenience functions to avoid needing to pass in mirror::Class* 44575cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom // values that are known to the ClassLinker such as 44675cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom // kObjectArrayClass and kJavaLangString etc. 4476fac447555dc94a935b78198479cce645c837b89Ian Rogers mirror::Class* AllocClass(Thread* self, uint32_t class_size) 448c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 4492dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::DexCache* AllocDexCache(Thread* self, const DexFile& dex_file) 450b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 451ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom mirror::ArtField* AllocArtField(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 452bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers 4532dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::Class* CreatePrimitiveClass(Thread* self, Primitive::Type type) 4542dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 4552dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::Class* InitializePrimitiveClass(mirror::Class* primitive_class, Primitive::Type type) 456b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 4575b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom 458a331b3cc392132c7333d36649a8310f38f4822ccBrian Carlstrom 459564ff985184737977aa26c485d0c1a413e530705Mathieu Chartier mirror::Class* CreateArrayClass(Thread* self, const char* descriptor, size_t hash, 4600cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::ClassLoader> class_loader) 461b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 462578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom 46300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers void AppendToBootClassPath(const DexFile& dex_file) 464b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 4650cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier void AppendToBootClassPath(const DexFile& dex_file, Handle<mirror::DexCache> dex_cache) 466b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 467578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom 4685fe594f576225dd7d333835e39c448a71ea9b433Elliott Hughes void ConstructFieldMap(const DexFile& dex_file, const DexFile::ClassDef& dex_class_def, 469ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom mirror::Class* c, SafeMap<uint32_t, mirror::ArtField*>& field_map) 470b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 4715fe594f576225dd7d333835e39c448a71ea9b433Elliott Hughes 47298d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang // Precomputes size needed for Class, in the case of a non-temporary class this size must be 47398d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang // sufficient to hold all static fields. 47498d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang uint32_t SizeOfClassWithoutEmbeddedTables(const DexFile& dex_file, 47598d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang const DexFile::ClassDef& dex_class_def); 4764873d465a1eb6dfbdeddb085c81239d39db60c42Brian Carlstrom 477f615a61aef972cfc1dc23931ac2ed0da14c3fedbBrian Carlstrom void LoadClass(const DexFile& dex_file, 478f615a61aef972cfc1dc23931ac2ed0da14c3fedbBrian Carlstrom const DexFile::ClassDef& dex_class_def, 4790cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::Class> klass, 4802dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::ClassLoader* class_loader) 481b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 482d3c5bebcb52a67cb06e7ab303eaf45f230c08b60Vladimir Marko void LoadClassMembers(const DexFile& dex_file, 483d3c5bebcb52a67cb06e7ab303eaf45f230c08b60Vladimir Marko const byte* class_data, 4840cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::Class> klass, 485d3c5bebcb52a67cb06e7ab303eaf45f230c08b60Vladimir Marko mirror::ClassLoader* class_loader, 486d3c5bebcb52a67cb06e7ab303eaf45f230c08b60Vladimir Marko const OatFile::OatClass* oat_class) 487d3c5bebcb52a67cb06e7ab303eaf45f230c08b60Vladimir Marko SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 488565f50731db360584d0080af7f14f0b7ca10371cCarl Shapiro 4892dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers void LoadField(const DexFile& dex_file, const ClassDataItemIterator& it, 4900cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::Class> klass, Handle<mirror::ArtField> dst) 4912dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 492934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom 493ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom mirror::ArtMethod* LoadMethod(Thread* self, const DexFile& dex_file, 494ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom const ClassDataItemIterator& dex_method, 4950cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::Class> klass) 4962dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 497934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom 4982dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers void FixupStaticTrampolines(mirror::Class* klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 4991984651929744dd603fd082e23eacd877b9bc177Ian Rogers 5009c290012b7f505ae1943ab87236f775b97a46e2dNicolas Geoffray // Finds the associated oat class for a dex_file and descriptor. Returns whether the class 5019c290012b7f505ae1943ab87236f775b97a46e2dNicolas Geoffray // was found, and sets the data in oat_class. 5029c290012b7f505ae1943ab87236f775b97a46e2dNicolas Geoffray bool FindOatClass(const DexFile& dex_file, uint16_t class_def_idx, OatFile::OatClass* oat_class) 50333e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 504aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom 5050cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier void RegisterDexFileLocked(const DexFile& dex_file, Handle<mirror::DexCache> dex_cache) 50600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers EXCLUSIVE_LOCKS_REQUIRED(dex_lock_) 507b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 508e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi bool IsDexFileRegisteredLocked(const DexFile& dex_file) 509b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers SHARED_LOCKS_REQUIRED(dex_lock_, Locks::mutator_lock_); 510aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom 5110cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier bool InitializeClass(Handle<mirror::Class> klass, bool can_run_clinit, 512c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier bool can_init_parents) 513b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5140cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier bool WaitForInitializeClass(Handle<mirror::Class> klass, Thread* self, 515c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier ObjectLock<mirror::Class>& lock); 5160cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier bool ValidateSuperClassDescriptors(Handle<mirror::Class> klass) 517b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5180e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 5199837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers bool IsSameDescriptorInDifferentClassContexts(Thread* self, const char* descriptor, 5200cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::ClassLoader> class_loader1, 5210cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::ClassLoader> class_loader2) 522b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5230e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 5249837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers bool IsSameMethodSignatureInDifferentClassContexts(Thread* self, mirror::ArtMethod* method, 525ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers mirror::Class* klass1, 526ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers mirror::Class* klass2) 527b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5280e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 52998d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang bool LinkClass(Thread* self, const char* descriptor, Handle<mirror::Class> klass, 53098d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang Handle<mirror::ObjectArray<mirror::Class>> interfaces, 53198d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang mirror::Class** new_class) 532b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5330e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 5340cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier bool LinkSuperClass(Handle<mirror::Class> klass) 535b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5360e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 5370cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier bool LoadSuperAndInterfaces(Handle<mirror::Class> klass, const DexFile& dex_file) 538b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5390e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 540bfd9a4378eacaf2dc2bbe05ad48c5164fc93c9feMathieu Chartier bool LinkMethods(Thread* self, Handle<mirror::Class> klass, 5411fb463e42cf1d67595cff66d19c0f99e3046f4c4Mathieu Chartier Handle<mirror::ObjectArray<mirror::Class>> interfaces, 5421fb463e42cf1d67595cff66d19c0f99e3046f4c4Mathieu Chartier StackHandleScope<mirror::Class::kImtSize>* out_imt) 543b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5440e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 545bfd9a4378eacaf2dc2bbe05ad48c5164fc93c9feMathieu Chartier bool LinkVirtualMethods(Thread* self, Handle<mirror::Class> klass) 546b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5470e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 5481fb463e42cf1d67595cff66d19c0f99e3046f4c4Mathieu Chartier bool LinkInterfaceMethods(Thread* const self, Handle<mirror::Class> klass, 5491fb463e42cf1d67595cff66d19c0f99e3046f4c4Mathieu Chartier Handle<mirror::ObjectArray<mirror::Class>> interfaces, 5501fb463e42cf1d67595cff66d19c0f99e3046f4c4Mathieu Chartier StackHandleScope<mirror::Class::kImtSize>* out_imt) 551b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5520e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 55398d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang bool LinkStaticFields(Handle<mirror::Class> klass, size_t* class_size) 554b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5550cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier bool LinkInstanceFields(Handle<mirror::Class> klass) 556b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 55798d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang bool LinkFields(Handle<mirror::Class> klass, bool is_static, size_t* class_size) 558b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5590cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier void LinkCode(Handle<mirror::ArtMethod> method, const OatFile::OatClass* oat_class, 560f0972a410a0665dbe32bd96df09a572d69f9f3a3Dmitry Petrochenko const DexFile& dex_file, uint32_t dex_method_index, uint32_t method_index) 561f0972a410a0665dbe32bd96df09a572d69f9f3a3Dmitry Petrochenko SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5620cfe1fb7060576d047f7f894fc0d8b87de84fcabIan Rogers 5630cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier void CreateReferenceInstanceOffsets(Handle<mirror::Class> klass) 564b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5650cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier void CreateReferenceStaticOffsets(Handle<mirror::Class> klass) 566b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5670cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier void CreateReferenceOffsets(Handle<mirror::Class> klass, bool is_static, 56800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers uint32_t reference_offsets) 569b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5700e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 57158ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom // For use by ImageWriter to find DexCaches for its roots 572e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi ReaderWriterMutex* DexLock() 573e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) LOCK_RETURNED(dex_lock_) { 574e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi return &dex_lock_; 57558ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom } 576e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi size_t GetDexCacheCount() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_, dex_lock_) { 577e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi return dex_caches_.size(); 578e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi } 579e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi mirror::DexCache* GetDexCache(size_t idx) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_, dex_lock_); 58058ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom 581be4e64303cc66bda0a12eaab835caa0bcfda3cd9Vladimir Marko const OatFile::OatDexFile* FindOpenedOatDexFileForDexFile(const DexFile& dex_file) 58233e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers LOCKS_EXCLUDED(dex_lock_) 58333e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 584833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe 585be4e64303cc66bda0a12eaab835caa0bcfda3cd9Vladimir Marko // Find an opened oat dex file that contains dex_location. If oat_location is not nullptr, 586be4e64303cc66bda0a12eaab835caa0bcfda3cd9Vladimir Marko // the file must have that location, else any oat location is accepted. 587be4e64303cc66bda0a12eaab835caa0bcfda3cd9Vladimir Marko const OatFile::OatDexFile* FindOpenedOatDexFile(const char* oat_location, 588be4e64303cc66bda0a12eaab835caa0bcfda3cd9Vladimir Marko const char* dex_location, 589be4e64303cc66bda0a12eaab835caa0bcfda3cd9Vladimir Marko const uint32_t* dex_location_checksum) 590719d1a33f6569864f529e5a3fff59e7bca97aad0Ian Rogers LOCKS_EXCLUDED(dex_lock_); 591a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light 592a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light // Will open the oat file directly without relocating, even if we could/should do relocation. 593a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light const OatFile* FindOatFileFromOatLocation(const std::string& oat_location, 594a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light std::string* error_msg) 595a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light LOCKS_EXCLUDED(dex_lock_); 596a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light 59700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers const OatFile* FindOpenedOatFileFromOatLocation(const std::string& oat_location) 5988d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers LOCKS_EXCLUDED(dex_lock_); 599833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe 600a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light const OatFile* OpenOatFileFromDexLocation(const std::string& dex_location, 601a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light InstructionSet isa, 602a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light bool* already_opened, 603a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light bool* obsolete_file_cleanup_failed, 604a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light std::vector<std::string>* error_msg) 605a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light LOCKS_EXCLUDED(dex_lock_, Locks::mutator_lock_); 606a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light 6070a112bbbcd761c749c346bfec0ec39c1ef37a590Alex Light const OatFile* GetInterpretedOnlyOat(const std::string& oat_path, 6080a112bbbcd761c749c346bfec0ec39c1ef37a590Alex Light InstructionSet isa, 6090a112bbbcd761c749c346bfec0ec39c1ef37a590Alex Light std::string* error_msg); 6100a112bbbcd761c749c346bfec0ec39c1ef37a590Alex Light 611a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light const OatFile* PatchAndRetrieveOat(const std::string& input, const std::string& output, 612a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light const std::string& image_location, InstructionSet isa, 613a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light std::string* error_msg) 614a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light LOCKS_EXCLUDED(Locks::mutator_lock_); 615a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light 616d7392faea80acb5d73a027bb384e3222bc2c2e43Andreas Gampe bool CheckOatFile(const Runtime* runtime, const OatFile* oat_file, InstructionSet isa, 617a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light bool* checksum_verified, std::string* error_msg); 618a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light 619833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe // Note: will not register the oat file. 620833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe const OatFile* FindOatFileInOatLocationForDexFile(const char* dex_location, 621833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe uint32_t dex_location_checksum, 622833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe const char* oat_location, 623833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe std::string* error_msg) 6248d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers LOCKS_EXCLUDED(dex_lock_); 625e3359f7ad7671c5816f17145ca3a01516512e8d6Ian Rogers 626833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe // Creates the oat file from the dex_location to the oat_location. Needs a file descriptor for 627833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe // the file to be written, which is assumed to be under a lock. 628833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe const OatFile* CreateOatFileForDexLocation(const char* dex_location, 629833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe int fd, const char* oat_location, 630833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe std::vector<std::string>* error_msgs) 631833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe LOCKS_EXCLUDED(dex_lock_, Locks::mutator_lock_); 632833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe 633833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe // Finds an OatFile that contains a DexFile for the given a DexFile location. 634833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe // 635833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe // Note 1: this will not check open oat files, which are assumed to be stale when this is run. 636833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe // Note 2: Does not register the oat file. It is the caller's job to register if the file is to 637833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe // be kept. 638be4e64303cc66bda0a12eaab835caa0bcfda3cd9Vladimir Marko const OatFile* FindOatFileContainingDexFileFromDexLocation(const char* dex_location, 639be4e64303cc66bda0a12eaab835caa0bcfda3cd9Vladimir Marko const uint32_t* dex_location_checksum, 640833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe InstructionSet isa, 641c54aea7f4acd1a32bb298d43c20e3e0217638926Calin Juravle std::vector<std::string>* error_msgs, 642c54aea7f4acd1a32bb298d43c20e3e0217638926Calin Juravle bool* obsolete_file_cleanup_failed) 643833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe LOCKS_EXCLUDED(dex_lock_, Locks::mutator_lock_); 644833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe 645ca3459398018360d9968a52eebf727df085caf83Calin Juravle // Verifies: 646ca3459398018360d9968a52eebf727df085caf83Calin Juravle // - that the oat file contains the dex file (with a matching checksum, which may be null if the 647ca3459398018360d9968a52eebf727df085caf83Calin Juravle // file was pre-opted) 648ca3459398018360d9968a52eebf727df085caf83Calin Juravle // - the checksums of the oat file (against the image space) 649ca3459398018360d9968a52eebf727df085caf83Calin Juravle // - the checksum of the dex file against dex_location_checksum 650ca3459398018360d9968a52eebf727df085caf83Calin Juravle // - that the dex file can be opened 651ca3459398018360d9968a52eebf727df085caf83Calin Juravle // Returns true iff all verification succeed. 652ca3459398018360d9968a52eebf727df085caf83Calin Juravle // 653ca3459398018360d9968a52eebf727df085caf83Calin Juravle // The dex_location is the dex location as stored in the oat file header. 654ca3459398018360d9968a52eebf727df085caf83Calin Juravle // (see DexFile::GetDexCanonicalLocation for a description of location conventions) 655a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light bool VerifyOatWithDexFile(const OatFile* oat_file, const char* dex_location, 656ca3459398018360d9968a52eebf727df085caf83Calin Juravle const uint32_t* dex_location_checksum, 657a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light std::string* error_msg); 658fad714344ca81a21e775ef45ae09d9a035723cafBrian Carlstrom 6590cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier mirror::ArtMethod* CreateProxyConstructor(Thread* self, Handle<mirror::Class> klass, 660ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom mirror::Class* proxy_class) 661b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 6620cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier mirror::ArtMethod* CreateProxyMethod(Thread* self, Handle<mirror::Class> klass, 6630cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::ArtMethod> prototype) 664b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 66595caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson 666df1532b9ba0cda2d00b78fbdef461f8a6cf8a737Andreas Gampe // Ensures that methods have the kAccPreverified bit set. We use the kAccPreverfied bit on the 667df1532b9ba0cda2d00b78fbdef461f8a6cf8a737Andreas Gampe // class access flags to determine whether this has been done before. 668df1532b9ba0cda2d00b78fbdef461f8a6cf8a737Andreas Gampe void EnsurePreverifiedMethods(Handle<mirror::Class> c) 669df1532b9ba0cda2d00b78fbdef461f8a6cf8a737Andreas Gampe SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 670df1532b9ba0cda2d00b78fbdef461f8a6cf8a737Andreas Gampe 6717dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers mirror::Class* LookupClassFromTableLocked(const char* descriptor, 672e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier mirror::ClassLoader* class_loader, 6737dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers size_t hash) 6747dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers SHARED_LOCKS_REQUIRED(Locks::classlinker_classes_lock_, Locks::mutator_lock_); 6757dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers 67698d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang mirror::Class* UpdateClass(const char* descriptor, mirror::Class* klass, size_t hash) 67798d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 67898d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 67998d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang 6807dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers mirror::Class* LookupClassFromImage(const char* descriptor) 6817dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 6820e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 68398d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang // EnsureResolved is called to make sure that a class in the class_table_ has been resolved 68498d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang // before returning it to the caller. Its the responsibility of the thread that placed the class 68598d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang // in the table to make it resolved. The thread doing resolution must notify on the class' lock 68698d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang // when resolution has occurred. This happens in mirror::Class::SetStatus. As resolution may 68798d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang // retire a class, the version of the class in the table is returned and this may differ from 68898d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang // the class passed in. 68998d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang mirror::Class* EnsureResolved(Thread* self, const char* descriptor, mirror::Class* klass) 6904c13a3ff475f206c4d0a86ee2595c45392fd942fMathieu Chartier WARN_UNUSED SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 69198d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang 69298d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang void FixupTemporaryDeclaringClass(mirror::Class* temp_class, mirror::Class* new_class) 69398d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 69498d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang 695ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers std::vector<const DexFile*> boot_class_path_; 696ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers 697ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers mutable ReaderWriterMutex dex_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER; 698ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers std::vector<size_t> new_dex_cache_roots_ GUARDED_BY(dex_lock_);; 699ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers std::vector<GcRoot<mirror::DexCache>> dex_caches_ GUARDED_BY(dex_lock_); 700ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers std::vector<const OatFile*> oat_files_ GUARDED_BY(dex_lock_); 701ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers 702e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier class ClassDescriptorHashEquals { 703e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier public: 704e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier // Same class loader and descriptor. 705e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier std::size_t operator()(const GcRoot<mirror::Class>& root) const NO_THREAD_SAFETY_ANALYSIS; 706e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier bool operator()(const GcRoot<mirror::Class>& a, const GcRoot<mirror::Class>& b) 707e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier NO_THREAD_SAFETY_ANALYSIS; 708e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier // Same class loader and descriptor. 709e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier std::size_t operator()(const std::pair<const char*, mirror::ClassLoader*>& element) const 710e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier NO_THREAD_SAFETY_ANALYSIS; 711e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier bool operator()(const GcRoot<mirror::Class>& a, 712e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier const std::pair<const char*, mirror::ClassLoader*>& b) 713e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier NO_THREAD_SAFETY_ANALYSIS; 714e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier // Same descriptor. 715e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier bool operator()(const GcRoot<mirror::Class>& a, const char* descriptor) 716e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier NO_THREAD_SAFETY_ANALYSIS; 717e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier std::size_t operator()(const char* descriptor) const NO_THREAD_SAFETY_ANALYSIS; 718e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier }; 719e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier class GcRootEmptyFn { 720e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier public: 721e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier void MakeEmpty(GcRoot<mirror::Class>& item) const { 722e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier item = GcRoot<mirror::Class>(); 723e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier } 724e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier bool IsEmpty(const GcRoot<mirror::Class>& item) const { 725e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier return item.IsNull(); 726e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier } 727e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier }; 728e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier 729e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier // hash set which hashes class descriptor, and compares descriptors nad class loaders. Results 730e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier // should be compared for a matching Class descriptor and class loader. 731e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier typedef HashSet<GcRoot<mirror::Class>, GcRootEmptyFn, ClassDescriptorHashEquals, 732e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier ClassDescriptorHashEquals, TrackingAllocator<GcRoot<mirror::Class>, kAllocatorTagClassTable>> 733e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier Table; 734ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers // This contains strong roots. To enable concurrent root scanning of 735ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers // the class table, be careful to use a read barrier when accessing this. 736ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers Table class_table_ GUARDED_BY(Locks::classlinker_classes_lock_); 737e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier Table pre_zygote_class_table_ GUARDED_BY(Locks::classlinker_classes_lock_); 738e05d1d5fd86867afc7513b1c546375dba11eee50Mathieu Chartier std::vector<GcRoot<mirror::Class>> new_class_roots_; 739ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers 740ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers // Do we need to search dex caches to find image classes? 741ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers bool dex_cache_image_class_lookup_required_; 742ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers // Number of times we've searched dex caches for a class. After a certain number of misses we move 743ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers // the classes into the class_table_ to avoid dex cache based searches. 744ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers Atomic<uint32_t> failed_dex_cache_class_lookups_; 745ca0c8d3f81cdee58bd9a70c0fd26f79917dff3b5Ian Rogers 746a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom // indexes into class_roots_. 747a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom // needs to be kept in sync with class_roots_descriptors_. 74874eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom enum ClassRoot { 74975cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom kJavaLangClass, 75075cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom kJavaLangObject, 751418d20fc407052d4152157f61e7453359f902383Elliott Hughes kClassArrayClass, 75274eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom kObjectArrayClass, 75374eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom kJavaLangString, 75466f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier kJavaLangDexCache, 755bf61ba3dcd9d9895b86a05e88762ff034b09b263Elliott Hughes kJavaLangRefReference, 756ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom kJavaLangReflectArtField, 757ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom kJavaLangReflectArtMethod, 758466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers kJavaLangReflectProxy, 75966f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier kJavaLangStringArrayClass, 760ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom kJavaLangReflectArtFieldArrayClass, 761ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom kJavaLangReflectArtMethodArrayClass, 76274eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom kJavaLangClassLoader, 7635167c97a4f672ba821453418e3943988fabbfc43Ian Rogers kJavaLangThrowable, 7648cd6ddaeb78cc904e13bac88753654a04b2e15b8jeffhao kJavaLangClassNotFoundException, 76555df06be4369f5d8ab5eb61a5d22809255171036Shih-wei Liao kJavaLangStackTraceElement, 76675cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom kPrimitiveBoolean, 767d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes kPrimitiveByte, 76875cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom kPrimitiveChar, 76975cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom kPrimitiveDouble, 770d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes kPrimitiveFloat, 77175cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom kPrimitiveInt, 77275cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom kPrimitiveLong, 773d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes kPrimitiveShort, 77475cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom kPrimitiveVoid, 775d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes kBooleanArrayClass, 776d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes kByteArrayClass, 777d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes kCharArrayClass, 778d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes kDoubleArrayClass, 779d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes kFloatArrayClass, 780d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes kIntArrayClass, 781d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes kLongArrayClass, 782d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes kShortArrayClass, 78355df06be4369f5d8ab5eb61a5d22809255171036Shih-wei Liao kJavaLangStackTraceElementArrayClass, 78475cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom kClassRootsMax, 78575cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom }; 78694f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi GcRoot<mirror::ObjectArray<mirror::Class>> class_roots_; 787913af1bd90a6e8fd56f1f851db1f098636dae6a5Brian Carlstrom 7881fb463e42cf1d67595cff66d19c0f99e3046f4c4Mathieu Chartier ALWAYS_INLINE mirror::Class* GetClassRoot(ClassRoot class_root) 7891fb463e42cf1d67595cff66d19c0f99e3046f4c4Mathieu Chartier SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 79074eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom 7912dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers void SetClassRoot(ClassRoot class_root, mirror::Class* klass) 792b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 793a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom 794418d20fc407052d4152157f61e7453359f902383Elliott Hughes static const char* class_roots_descriptors_[]; 795a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom 796a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom const char* GetClassRootDescriptor(ClassRoot class_root) { 797a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom const char* descriptor = class_roots_descriptors_[class_root]; 798a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom CHECK(descriptor != NULL); 799a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom return descriptor; 800a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom } 801a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom 8029837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers // The interface table used by all arrays. 80394f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi GcRoot<mirror::IfTable> array_iftable_; 804565f50731db360584d0080af7f14f0b7ca10371cCarl Shapiro 8059837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers // A cache of the last FindArrayClass results. The cache serves to avoid creating array class 8069837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers // descriptors for the sake of performing FindClass. 8079837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers static constexpr size_t kFindArrayCacheSize = 16; 80894f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi GcRoot<mirror::Class> find_array_class_cache_[kFindArrayCacheSize]; 8099837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers size_t find_array_class_cache_next_victim_; 8109837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers 81175cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom bool init_done_; 812893263b7d5bc2ca43a91ecb8071867f5134fc60aMathieu Chartier bool log_new_dex_caches_roots_ GUARDED_BY(dex_lock_); 813893263b7d5bc2ca43a91ecb8071867f5134fc60aMathieu Chartier bool log_new_class_table_roots_ GUARDED_BY(Locks::classlinker_classes_lock_); 81475cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom 815cf4c6c41b0084dc4567ff709fb8ce9ebd72b26acElliott Hughes InternTable* intern_table_; 816cf4c6c41b0084dc4567ff709fb8ce9ebd72b26acElliott Hughes 81798d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang // Trampolines within the image the bounce to runtime entrypoints. Done so that there is a single 81898d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang // patch point within the image. TODO: make these proper relocations. 8190aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao const void* portable_resolution_trampoline_; 8200aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao const void* quick_resolution_trampoline_; 82188474b416eb257078e590bf9bc7957cee604a186Jeff Hao const void* portable_imt_conflict_trampoline_; 82288474b416eb257078e590bf9bc7957cee604a186Jeff Hao const void* quick_imt_conflict_trampoline_; 8232da882315a61072664f7ce3c212307342e907207Andreas Gampe const void* quick_generic_jni_trampoline_; 8248a630577ed2d9e9571c3434c505e5de223b23c07Vladimir Marko const void* quick_to_interpreter_bridge_trampoline_; 8250aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao 826e832e64a7e82d7f72aedbd7d798fb929d458ee8fMathieu Chartier // Image pointer size. 827e832e64a7e82d7f72aedbd7d798fb929d458ee8fMathieu Chartier size_t image_pointer_size_; 828e832e64a7e82d7f72aedbd7d798fb929d458ee8fMathieu Chartier 829ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom friend class ImageWriter; // for GetClassRoots 830a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light friend class ImageDumper; // for FindOpenedOatFileFromOatLocation 831a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light friend class ElfPatcher; // for FindOpenedOatFileForDexFile & FindOpenedOatFileFromOatLocation 8329c290012b7f505ae1943ab87236f775b97a46e2dNicolas Geoffray friend class NoDex2OatTest; // for FindOpenedOatFileForDexFile 8330a112bbbcd761c749c346bfec0ec39c1ef37a590Alex Light friend class NoPatchoatTest; // for FindOpenedOatFileForDexFile 8346d4d9fcb4f01e287ee29e81cd1c941ee5d11d379Ian Rogers FRIEND_TEST(ClassLinkerTest, ClassRootDescriptors); 8352dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers FRIEND_TEST(mirror::DexCacheTest, Open); 8361a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao FRIEND_TEST(ExceptionTest, FindExceptionHandler); 837ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom FRIEND_TEST(ObjectTest, AllocObjectArray); 8380e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro DISALLOW_COPY_AND_ASSIGN(ClassLinker); 8390e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro}; 8400e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 8410e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro} // namespace art 8420e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 843fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif // ART_RUNTIME_CLASS_LINKER_H_ 844