class_linker.h revision 507e6180ad271eb719c67ce7394852c731d975a5
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 24761600567d73b23324ae0251e871c15d6849ffd8Elliott Hughes#include "base/macros.h" 2576b6167407c2b6f5d40ad895b2793a6b037f54b2Elliott Hughes#include "base/mutex.h" 267e93b50433cde2a44d99212e8040299bde498546Brian Carlstrom#include "dex_file.h" 2794f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi#include "gc_root.h" 28e5448b5a12003b405b22cde3b94f962ab4888a87Elliott Hughes#include "gtest/gtest.h" 29590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier#include "jni.h" 3058ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom#include "oat_file.h" 3183c8ee000d525017ead8753fce6bc1020249b96aMathieu Chartier#include "object_callbacks.h" 320e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 330e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapironamespace art { 3498d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang 351d54e73444e017d3a65234e0f193846f3e27472bIan Rogersnamespace gc { 361d54e73444e017d3a65234e0f193846f3e27472bIan Rogersnamespace space { 371d54e73444e017d3a65234e0f193846f3e27472bIan Rogers class ImageSpace; 381d54e73444e017d3a65234e0f193846f3e27472bIan Rogers} // namespace space 391d54e73444e017d3a65234e0f193846f3e27472bIan Rogers} // namespace gc 402dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersnamespace mirror { 4133e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers class ClassLoader; 4233e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers class DexCache; 4333e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers class DexCacheTest_Open_Test; 4433e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers class IfTable; 4533e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers template<class T> class ObjectArray; 4633e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers class StackTraceElement; 4733e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers} // namespace mirror 481d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 49cf4c6c41b0084dc4567ff709fb8ce9ebd72b26acElliott Hughesclass InternTable; 50c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartiertemplate<class T> class ObjectLock; 512b7c4d196c8abe32f4ca633534917da9de53c359Mathieu Chartierclass ScopedObjectAccessAlreadyRunnable; 52eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartiertemplate<class T> class Handle; 53cf4c6c41b0084dc4567ff709fb8ce9ebd72b26acElliott Hughes 542dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogerstypedef bool (ClassVisitor)(mirror::Class* c, void* arg); 55a215526d5c789cbef0f81a1f9aba22541a841ccaElliott Hughes 56893263b7d5bc2ca43a91ecb8071867f5134fc60aMathieu Chartierenum VisitRootFlags : uint8_t; 57893263b7d5bc2ca43a91ecb8071867f5134fc60aMathieu Chartier 580e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiroclass ClassLinker { 590e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro public: 60590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier explicit ClassLinker(InternTable* intern_table); 61590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier ~ClassLinker(); 6258ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom 63507e6180ad271eb719c67ce7394852c731d975a5Alex Light // Initialize class linker by bootstraping from dex files. 64507e6180ad271eb719c67ce7394852c731d975a5Alex Light void InitWithoutImage(const std::vector<const DexFile*>& boot_class_path) 65b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 669ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom 67590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier // Initialize class linker from one or more images. 68590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier void InitFromImage() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 69565f50731db360584d0080af7f14f0b7ca10371cCarl Shapiro 70be7149fc2e7cc607937209f2819e3c1d672e2668Ian Rogers bool IsInBootClassPath(const char* descriptor); 71be7149fc2e7cc607937209f2819e3c1d672e2668Ian Rogers 7264bf5a33d55aa779ef452552a466943002d39e4fElliott Hughes // Finds a class by its descriptor, loading it if necessary. 7374eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom // If class_loader is null, searches boot_class_path_. 749837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers mirror::Class* FindClass(Thread* self, const char* descriptor, 750cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::ClassLoader> class_loader) 76b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 77aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom 789837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers // Finds a class by its descriptor using the "system" class loader, ie by searching the 799837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers // boot_class_path_. 809837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers mirror::Class* FindSystemClass(Thread* self, const char* descriptor) 819837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 829837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers 839837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers // Finds the array class given for the element class. 84b74cd29802f364b4cec88f4913fa38ade26b8fabMathieu Chartier mirror::Class* FindArrayClass(Thread* self, mirror::Class** element_class) 85b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 86aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom 87590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier // Reutrns true if the class linker is initialized. 88590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier bool IsInitialized() const; 89590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 90aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom // Define a new a class based on a ClassDef from a DexFile 91c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier mirror::Class* DefineClass(const char* descriptor, 920cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::ClassLoader> class_loader, 932dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers const DexFile& dex_file, const DexFile::ClassDef& dex_class_def) 94b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 9564bf5a33d55aa779ef452552a466943002d39e4fElliott Hughes 9664bf5a33d55aa779ef452552a466943002d39e4fElliott Hughes // Finds a class by its descriptor, returning NULL if it isn't wasn't loaded 9764bf5a33d55aa779ef452552a466943002d39e4fElliott Hughes // by the given 'class_loader'. 982dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::Class* LookupClass(const char* descriptor, const mirror::ClassLoader* class_loader) 99b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 100b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 1010e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 1026fa602d614d418f38afebb4d44f42e7dc0b4bd94Elliott Hughes // Finds all the classes with the given descriptor, regardless of ClassLoader. 1032dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers void LookupClasses(const char* descriptor, std::vector<mirror::Class*>& classes) 104b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 105b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 1066fa602d614d418f38afebb4d44f42e7dc0b4bd94Elliott Hughes 1072dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::Class* FindPrimitiveClass(char type) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 108d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes 109ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom // General class unloading is not supported, this is used to prune 110ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom // unwanted classes during image writing. 1112dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool RemoveClass(const char* descriptor, const mirror::ClassLoader* class_loader) 112b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 113b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 114ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom 1157dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers void DumpAllClasses(int flags) 116b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 117b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 1189d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes 1197dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers void DumpForSigQuit(std::ostream& os) 1207dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 1217dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 122cac6cc72c3331257fa6437b36a131e5d551e2f3cElliott Hughes 1237dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers size_t NumLoadedClasses() 1247dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 1257dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 126e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes 127b63ec393a5c4ba2be1d34dd871cda811eaa803c7Brian Carlstrom // Resolve a String with the given index from the DexFile, storing the 128aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom // result in the DexCache. The referrer is used to identify the 129aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom // target DexCache and ClassLoader to use for resolution. 130ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers mirror::String* ResolveString(uint32_t string_idx, mirror::ArtMethod* referrer) 1312dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 132aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom 133aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom // Resolve a String with the given index from the DexFile, storing the 1349ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // result in the DexCache. 1352dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::String* ResolveString(const DexFile& dex_file, uint32_t string_idx, 1360cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::DexCache> dex_cache) 137b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 1389ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom 139b63ec393a5c4ba2be1d34dd871cda811eaa803c7Brian Carlstrom // Resolve a Type with the given index from the DexFile, storing the 1409ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // result in the DexCache. The referrer is used to identity the 1419ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // target DexCache and ClassLoader to use for resolution. 142ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers mirror::Class* ResolveType(const DexFile& dex_file, uint16_t type_idx, mirror::Class* referrer) 143590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 1449ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom 145b63ec393a5c4ba2be1d34dd871cda811eaa803c7Brian Carlstrom // Resolve a Type with the given index from the DexFile, storing the 1460cfe1fb7060576d047f7f894fc0d8b87de84fcabIan Rogers // result in the DexCache. The referrer is used to identify the 147b63ec393a5c4ba2be1d34dd871cda811eaa803c7Brian Carlstrom // target DexCache and ClassLoader to use for resolution. 148ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers mirror::Class* ResolveType(uint16_t type_idx, mirror::ArtMethod* referrer) 1492dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 1500cfe1fb7060576d047f7f894fc0d8b87de84fcabIan Rogers 151ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers mirror::Class* ResolveType(uint16_t type_idx, mirror::ArtField* referrer) 1522dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 153b63ec393a5c4ba2be1d34dd871cda811eaa803c7Brian Carlstrom 1549ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // Resolve a type with the given ID from the DexFile, storing the 1559ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // result in DexCache. The ClassLoader is used to search for the 1569ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // type, since it may be referenced from but not contained within 1579ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // the given DexFile. 158590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier mirror::Class* ResolveType(const DexFile& dex_file, uint16_t type_idx, 1590cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::DexCache> dex_cache, 1600cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::ClassLoader> class_loader) 161b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 1629ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom 1639ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // Resolve a method with a given ID from the DexFile, storing the 1649ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // result in DexCache. The ClassLinker and ClassLoader are used as 1659ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // in ResolveType. What is unique is the method type argument which 1669ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // is used to determine if this method is a direct, static, or 1679ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // virtual method. 168ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom mirror::ArtMethod* ResolveMethod(const DexFile& dex_file, 169ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom uint32_t method_idx, 1700cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::DexCache> dex_cache, 1710cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::ClassLoader> class_loader, 1720cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::ArtMethod> referrer, 173ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom InvokeType type) 174b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 1759ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom 1760cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier mirror::ArtMethod* GetResolvedMethod(uint32_t method_idx, mirror::ArtMethod* referrer, 1770cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier InvokeType type) 1780cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 1790cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier mirror::ArtMethod* ResolveMethod(Thread* self, uint32_t method_idx, mirror::ArtMethod** referrer, 180ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom InvokeType type) 1812dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 182161928613d3f097108319de60494fab1aab8d48aBrian Carlstrom 1830cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier mirror::ArtField* GetResolvedField(uint32_t field_idx, mirror::Class* field_declaring_class) 1840cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 185ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers mirror::ArtField* ResolveField(uint32_t field_idx, mirror::ArtMethod* referrer, 186ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom bool is_static) 1872dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 188b9edb841423dfe60e193fcffd25994398c91baa2Brian Carlstrom 189161928613d3f097108319de60494fab1aab8d48aBrian Carlstrom // Resolve a field with a given ID from the DexFile, storing the 1909ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // result in DexCache. The ClassLinker and ClassLoader are used as 1919ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // in ResolveType. What is unique is the is_static argument which is 1929ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // used to determine if we are resolving a static or non-static 1939ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom // field. 194ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom mirror::ArtField* ResolveField(const DexFile& dex_file, 195ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom uint32_t field_idx, 1960cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::DexCache> dex_cache, 1970cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::ClassLoader> class_loader, 198ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom bool is_static) 199b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 2009ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom 201b067ac2fe225c76fc9eb9434ef62cbb797bfa425Ian Rogers // Resolve a field with a given ID from the DexFile, storing the 202b067ac2fe225c76fc9eb9434ef62cbb797bfa425Ian Rogers // result in DexCache. The ClassLinker and ClassLoader are used as 203b067ac2fe225c76fc9eb9434ef62cbb797bfa425Ian Rogers // in ResolveType. No is_static argument is provided so that Java 204b067ac2fe225c76fc9eb9434ef62cbb797bfa425Ian Rogers // field resolution semantics are followed. 2050cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier mirror::ArtField* ResolveFieldJLS(const DexFile& dex_file, uint32_t field_idx, 2060cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::DexCache> dex_cache, 2070cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::ClassLoader> class_loader) 208b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 209b067ac2fe225c76fc9eb9434ef62cbb797bfa425Ian Rogers 210ad25ac568407ceb14334e8551dd1c4dd0fd6993cIan Rogers // Get shorty from method index without resolution. Used to do handlerization. 211ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom const char* MethodShorty(uint32_t method_idx, mirror::ArtMethod* referrer, uint32_t* length) 212b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 213ad25ac568407ceb14334e8551dd1c4dd0fd6993cIan Rogers 214f4c21c9f6440c3980c47a297519f758796dbc039Elliott Hughes // Returns true on success, false if there's an exception pending. 21525c3325bf95036bf325fc7cb21b4fd6d40282857Brian Carlstrom // can_run_clinit=false allows the compiler to attempt to init a class, 21625c3325bf95036bf325fc7cb21b4fd6d40282857Brian Carlstrom // given the restriction that no <clinit> execution is possible. 2170cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier bool EnsureInitialized(Handle<mirror::Class> c, bool can_init_fields, bool can_init_parents) 218b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 2190e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 2202a20cfd0b7fc81099f5de0da782ebcc1cb262792Elliott Hughes // Initializes classes that have instances in the image but that have 2212a20cfd0b7fc81099f5de0da782ebcc1cb262792Elliott Hughes // <clinit> methods so they could not be initialized by the compiler. 222b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers void RunRootClinits() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 2232a20cfd0b7fc81099f5de0da782ebcc1cb262792Elliott Hughes 22400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers void RegisterDexFile(const DexFile& dex_file) 22500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers LOCKS_EXCLUDED(dex_lock_) 226b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 2270cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier void RegisterDexFile(const DexFile& dex_file, Handle<mirror::DexCache> dex_cache) 22800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers LOCKS_EXCLUDED(dex_lock_) 229b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 2300e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 2318d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers const OatFile* RegisterOatFile(const OatFile* oat_file) 23200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers LOCKS_EXCLUDED(dex_lock_); 233866c8627626b7c47fb69b498b341772d7dfa7f60Brian Carlstrom 2348a48741b96ca9cc5835cac72ac133c4ca480930fBrian Carlstrom const std::vector<const DexFile*>& GetBootClassPath() { 2358a48741b96ca9cc5835cac72ac133c4ca480930fBrian Carlstrom return boot_class_path_; 2368a48741b96ca9cc5835cac72ac133c4ca480930fBrian Carlstrom } 2378a48741b96ca9cc5835cac72ac133c4ca480930fBrian Carlstrom 2387dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers void VisitClasses(ClassVisitor* visitor, void* arg) 2397dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers LOCKS_EXCLUDED(dex_lock_) 2407dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 24100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers // Less efficient variant of VisitClasses that doesn't hold the classlinker_classes_lock_ 24200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers // when calling the visitor. 2437dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers void VisitClassesWithoutClassesLock(ClassVisitor* visitor, void* arg) 2447dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers LOCKS_EXCLUDED(dex_lock_) 2457dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 24600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers 24752e4b43d62896b56f8c2bd041e528472bb4a0d8dMathieu Chartier void VisitClassRoots(RootCallback* callback, void* arg, VisitRootFlags flags) 24894f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 24994f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 250893263b7d5bc2ca43a91ecb8071867f5134fc60aMathieu Chartier void VisitRoots(RootCallback* callback, void* arg, VisitRootFlags flags) 25194f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi LOCKS_EXCLUDED(dex_lock_) 25294f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 25300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers 254e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi mirror::DexCache* FindDexCache(const DexFile& dex_file) 25500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers LOCKS_EXCLUDED(dex_lock_) 256b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 257e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi bool IsDexFileRegistered(const DexFile& dex_file) 258b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers LOCKS_EXCLUDED(dex_lock_) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 259e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi void FixupDexCaches(mirror::ArtMethod* resolution_method) 26000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers LOCKS_EXCLUDED(dex_lock_) 261b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 2621d9f52b7ca91c6d30b7acfac1c9ab24d93fff470Brian Carlstrom 263262bf46ddc91e5b4fbd367127ff21a1877d939f2jeffhao // Generate an oat file from a dex file 2648d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers bool GenerateOatFile(const char* dex_filename, 265d601af8d9549ca95a911afb2fc67c4e562da661fBrian Carlstrom int oat_fd, 26660836d5a9bcf8b30984aae4279a4f6233b0bf622Vladimir Marko const char* oat_cache_filename, 267719d1a33f6569864f529e5a3fff59e7bca97aad0Ian Rogers std::string* error_msg) 2688d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers LOCKS_EXCLUDED(Locks::mutator_lock_); 269262bf46ddc91e5b4fbd367127ff21a1877d939f2jeffhao 270833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe // Find or create the oat file holding dex_location. Then load all corresponding dex files 271833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe // (if multidex) into the given vector. 272833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe bool OpenDexFilesFromOat(const char* dex_location, const char* oat_location, 273833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe std::vector<std::string>* error_msgs, 274833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe std::vector<const DexFile*>* dex_files) 2758d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers LOCKS_EXCLUDED(dex_lock_, Locks::mutator_lock_); 276f6174e8a1566bb357e82506f7ec97dc359c90eb2jeffhao 277345c4b19758703793ed31024cfb79940e2c63b75Alex Light // Returns true if the given oat file has the same image checksum as the image it is paired with. 278345c4b19758703793ed31024cfb79940e2c63b75Alex Light static bool VerifyOatImageChecksum(const OatFile* oat_file, const InstructionSet instruction_set); 279345c4b19758703793ed31024cfb79940e2c63b75Alex Light // Returns true if the oat file checksums match with the image and the offsets are such that it 280345c4b19758703793ed31024cfb79940e2c63b75Alex Light // could be loaded with it. 281345c4b19758703793ed31024cfb79940e2c63b75Alex Light static bool VerifyOatChecksums(const OatFile* oat_file, const InstructionSet instruction_set, 282345c4b19758703793ed31024cfb79940e2c63b75Alex Light std::string* error_msg); 28328db0129e5d7ef642cf8845c86c0e11832817085Brian Carlstrom // Returns true if oat file contains the dex file with the given location and checksum. 284345c4b19758703793ed31024cfb79940e2c63b75Alex Light static bool VerifyOatAndDexFileChecksums(const OatFile* oat_file, 285345c4b19758703793ed31024cfb79940e2c63b75Alex Light const char* dex_location, 286345c4b19758703793ed31024cfb79940e2c63b75Alex Light uint32_t dex_location_checksum, 287345c4b19758703793ed31024cfb79940e2c63b75Alex Light InstructionSet instruction_set, 288345c4b19758703793ed31024cfb79940e2c63b75Alex Light std::string* error_msg); 289afe25515c358617321d69ab4f25003e3d905d613Brian Carlstrom 290418d20fc407052d4152157f61e7453359f902383Elliott Hughes // TODO: replace this with multiple methods that allocate the correct managed type. 2914417536522fd2a9d8215d8672331984769c9520bShih-wei Liao template <class T> 2922dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::ObjectArray<T>* AllocObjectArray(Thread* self, size_t length) 2932dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 2944417536522fd2a9d8215d8672331984769c9520bShih-wei Liao 2952dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::ObjectArray<mirror::Class>* AllocClassArray(Thread* self, size_t length) 2962dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 297418d20fc407052d4152157f61e7453359f902383Elliott Hughes 2982dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::ObjectArray<mirror::String>* AllocStringArray(Thread* self, size_t length) 2992dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 30066f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier 301ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom mirror::ObjectArray<mirror::ArtMethod>* AllocArtMethodArray(Thread* self, size_t length) 3022dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 3034445a7e3398a6143939168097a3aa275b734504dIan Rogers 3042dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::IfTable* AllocIfTable(Thread* self, size_t ifcount) 3052dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 30623435d0df17e19fe312a08ff151464d4b9f83e81Ian Rogers 307ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom mirror::ObjectArray<mirror::ArtField>* AllocArtFieldArray(Thread* self, size_t length) 3082dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 30966f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier 3102dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::ObjectArray<mirror::StackTraceElement>* AllocStackTraceElementArray(Thread* self, 3112dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers size_t length) 312b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 31355df06be4369f5d8ab5eb61a5d22809255171036Shih-wei Liao 3140cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier void VerifyClass(Handle<mirror::Class> klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 3152dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool VerifyClassUsingOatFile(const DexFile& dex_file, mirror::Class* klass, 3162dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::Class::Status& oat_file_class_status) 317b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 318c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier void ResolveClassExceptionHandlerTypes(const DexFile& dex_file, 3190cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::Class> klass) 320b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 321ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom void ResolveMethodExceptionHandlerTypes(const DexFile& dex_file, mirror::ArtMethod* klass) 322b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 32398eacac683b78e60799323e8c7d59e7214808639jeffhao 3242b7c4d196c8abe32f4ca633534917da9de53c359Mathieu Chartier mirror::Class* CreateProxyClass(ScopedObjectAccessAlreadyRunnable& soa, jstring name, 3252b7c4d196c8abe32f4ca633534917da9de53c359Mathieu Chartier jobjectArray interfaces, jobject loader, jobjectArray methods, 3262b7c4d196c8abe32f4ca633534917da9de53c359Mathieu Chartier jobjectArray throws) 327b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 328ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers std::string GetDescriptorForProxy(mirror::Class* proxy_class) 329b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 330ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers mirror::ArtMethod* FindMethodForProxy(mirror::Class* proxy_class, 331ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers mirror::ArtMethod* proxy_method) 33200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers LOCKS_EXCLUDED(dex_lock_) 333b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 33495caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson 3351984651929744dd603fd082e23eacd877b9bc177Ian Rogers // Get the oat code for a method when its class isn't yet initialized 336ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers const void* GetQuickOatCodeFor(mirror::ArtMethod* method) 337ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 338ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers const void* GetPortableOatCodeFor(mirror::ArtMethod* method, bool* have_portable_code) 339b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 3401984651929744dd603fd082e23eacd877b9bc177Ian Rogers 341e35517ad40e0713df8420aeb5d3540f146a59f62Mathieu Chartier // Get the oat code for a method from a method index. 342ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers const void* GetQuickOatCodeFor(const DexFile& dex_file, uint16_t class_def_idx, uint32_t method_idx) 343ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 344ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers const void* GetPortableOatCodeFor(const DexFile& dex_file, uint16_t class_def_idx, uint32_t method_idx) 34533e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 346e35517ad40e0713df8420aeb5d3540f146a59f62Mathieu Chartier 3477934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom pid_t GetClassesLockOwner(); // For SignalCatcher. 3487934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom pid_t GetDexLockOwner(); // For SignalCatcher. 34924a3c2e9924e8765c4a9b4d383cb8f3b922f9c9fBrian Carlstrom 3500aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao const void* GetPortableResolutionTrampoline() const { 3510aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao return portable_resolution_trampoline_; 3520aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao } 3530aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao 3542da882315a61072664f7ce3c212307342e907207Andreas Gampe const void* GetQuickGenericJniTrampoline() const { 355f0972a410a0665dbe32bd96df09a572d69f9f3a3Dmitry Petrochenko return quick_generic_jni_trampoline_; 356f0972a410a0665dbe32bd96df09a572d69f9f3a3Dmitry Petrochenko } 3572da882315a61072664f7ce3c212307342e907207Andreas Gampe 3580aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao const void* GetQuickResolutionTrampoline() const { 3590aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao return quick_resolution_trampoline_; 3600aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao } 3610aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao 36288474b416eb257078e590bf9bc7957cee604a186Jeff Hao const void* GetPortableImtConflictTrampoline() const { 36388474b416eb257078e590bf9bc7957cee604a186Jeff Hao return portable_imt_conflict_trampoline_; 36488474b416eb257078e590bf9bc7957cee604a186Jeff Hao } 36588474b416eb257078e590bf9bc7957cee604a186Jeff Hao 36688474b416eb257078e590bf9bc7957cee604a186Jeff Hao const void* GetQuickImtConflictTrampoline() const { 36788474b416eb257078e590bf9bc7957cee604a186Jeff Hao return quick_imt_conflict_trampoline_; 36888474b416eb257078e590bf9bc7957cee604a186Jeff Hao } 36988474b416eb257078e590bf9bc7957cee604a186Jeff Hao 3708a630577ed2d9e9571c3434c505e5de223b23c07Vladimir Marko const void* GetQuickToInterpreterBridgeTrampoline() const { 3718a630577ed2d9e9571c3434c505e5de223b23c07Vladimir Marko return quick_to_interpreter_bridge_trampoline_; 3728a630577ed2d9e9571c3434c505e5de223b23c07Vladimir Marko } 3738a630577ed2d9e9571c3434c505e5de223b23c07Vladimir Marko 37488474b416eb257078e590bf9bc7957cee604a186Jeff Hao InternTable* GetInternTable() const { 37588474b416eb257078e590bf9bc7957cee604a186Jeff Hao return intern_table_; 37688474b416eb257078e590bf9bc7957cee604a186Jeff Hao } 37788474b416eb257078e590bf9bc7957cee604a186Jeff Hao 378848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers // Attempts to insert a class into a class table. Returns NULL if 379848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers // the class was inserted, otherwise returns an existing class with 380848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers // the same descriptor and ClassLoader. 3817dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers mirror::Class* InsertClass(const char* descriptor, mirror::Class* klass, size_t hash) 382848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 383848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 384848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers 385590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier // Special code to allocate an art method, use this instead of class->AllocObject. 386590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier mirror::ArtMethod* AllocArtMethod(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 38761e019d291583029c01b61b93bea750f2b663c37Carl Shapiro 38898d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang mirror::ObjectArray<mirror::Class>* GetClassRoots() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 38994f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi mirror::ObjectArray<mirror::Class>* class_roots = class_roots_.Read(); 39098d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang DCHECK(class_roots != NULL); 39198d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang return class_roots; 39298d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang } 39398d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang 394590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier private: 3959c290012b7f505ae1943ab87236f775b97a46e2dNicolas Geoffray bool FindOatMethodFor(mirror::ArtMethod* method, OatFile::OatMethod* oat_method) 396b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 3978532191c4fc8e005f7d432fec40fd9f2936275c6TDYa 39856d947fbc9bc2992e2f93112fafb73e50d2aaa7aBrian Carlstrom OatFile& GetImageOatFile(gc::space::ImageSpace* space) 39900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers LOCKS_EXCLUDED(dex_lock_) 400b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 401a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom 4029837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers void FinishInit(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 403a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom 40475cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom // For early bootstrapping by Init 4056fac447555dc94a935b78198479cce645c837b89Ian Rogers mirror::Class* AllocClass(Thread* self, mirror::Class* java_lang_Class, uint32_t class_size) 406b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 40775cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom 4082dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Alloc* convenience functions to avoid needing to pass in mirror::Class* 40975cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom // values that are known to the ClassLinker such as 41075cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom // kObjectArrayClass and kJavaLangString etc. 4116fac447555dc94a935b78198479cce645c837b89Ian Rogers mirror::Class* AllocClass(Thread* self, uint32_t class_size) 412c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 4132dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::DexCache* AllocDexCache(Thread* self, const DexFile& dex_file) 414b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 415ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom mirror::ArtField* AllocArtField(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 416bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers 4172dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::Class* CreatePrimitiveClass(Thread* self, Primitive::Type type) 4182dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 4192dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::Class* InitializePrimitiveClass(mirror::Class* primitive_class, Primitive::Type type) 420b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 4215b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom 422a331b3cc392132c7333d36649a8310f38f4822ccBrian Carlstrom 4239837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers mirror::Class* CreateArrayClass(Thread* self, const char* descriptor, 4240cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::ClassLoader> class_loader) 425b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 426578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom 42700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers void AppendToBootClassPath(const DexFile& dex_file) 428b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 4290cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier void AppendToBootClassPath(const DexFile& dex_file, Handle<mirror::DexCache> dex_cache) 430b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 431578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom 4325fe594f576225dd7d333835e39c448a71ea9b433Elliott Hughes void ConstructFieldMap(const DexFile& dex_file, const DexFile::ClassDef& dex_class_def, 433ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom mirror::Class* c, SafeMap<uint32_t, mirror::ArtField*>& field_map) 434b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 4355fe594f576225dd7d333835e39c448a71ea9b433Elliott Hughes 43698d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang // Precomputes size needed for Class, in the case of a non-temporary class this size must be 43798d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang // sufficient to hold all static fields. 43898d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang uint32_t SizeOfClassWithoutEmbeddedTables(const DexFile& dex_file, 43998d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang const DexFile::ClassDef& dex_class_def); 4404873d465a1eb6dfbdeddb085c81239d39db60c42Brian Carlstrom 441f615a61aef972cfc1dc23931ac2ed0da14c3fedbBrian Carlstrom void LoadClass(const DexFile& dex_file, 442f615a61aef972cfc1dc23931ac2ed0da14c3fedbBrian Carlstrom const DexFile::ClassDef& dex_class_def, 4430cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::Class> klass, 4442dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::ClassLoader* class_loader) 445b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 446d3c5bebcb52a67cb06e7ab303eaf45f230c08b60Vladimir Marko void LoadClassMembers(const DexFile& dex_file, 447d3c5bebcb52a67cb06e7ab303eaf45f230c08b60Vladimir Marko const byte* class_data, 4480cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::Class> klass, 449d3c5bebcb52a67cb06e7ab303eaf45f230c08b60Vladimir Marko mirror::ClassLoader* class_loader, 450d3c5bebcb52a67cb06e7ab303eaf45f230c08b60Vladimir Marko const OatFile::OatClass* oat_class) 451d3c5bebcb52a67cb06e7ab303eaf45f230c08b60Vladimir Marko SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 452565f50731db360584d0080af7f14f0b7ca10371cCarl Shapiro 4532dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers void LoadField(const DexFile& dex_file, const ClassDataItemIterator& it, 4540cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::Class> klass, Handle<mirror::ArtField> dst) 4552dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 456934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom 457ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom mirror::ArtMethod* LoadMethod(Thread* self, const DexFile& dex_file, 458ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom const ClassDataItemIterator& dex_method, 4590cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::Class> klass) 4602dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 461934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom 4622dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers void FixupStaticTrampolines(mirror::Class* klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 4631984651929744dd603fd082e23eacd877b9bc177Ian Rogers 4649c290012b7f505ae1943ab87236f775b97a46e2dNicolas Geoffray // Finds the associated oat class for a dex_file and descriptor. Returns whether the class 4659c290012b7f505ae1943ab87236f775b97a46e2dNicolas Geoffray // was found, and sets the data in oat_class. 4669c290012b7f505ae1943ab87236f775b97a46e2dNicolas Geoffray bool FindOatClass(const DexFile& dex_file, uint16_t class_def_idx, OatFile::OatClass* oat_class) 46733e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 468aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom 4690cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier void RegisterDexFileLocked(const DexFile& dex_file, Handle<mirror::DexCache> dex_cache) 47000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers EXCLUSIVE_LOCKS_REQUIRED(dex_lock_) 471b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 472e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi bool IsDexFileRegisteredLocked(const DexFile& dex_file) 473b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers SHARED_LOCKS_REQUIRED(dex_lock_, Locks::mutator_lock_); 474aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom 4750cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier bool InitializeClass(Handle<mirror::Class> klass, bool can_run_clinit, 476c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier bool can_init_parents) 477b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 4780cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier bool WaitForInitializeClass(Handle<mirror::Class> klass, Thread* self, 479c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier ObjectLock<mirror::Class>& lock); 4800cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier bool ValidateSuperClassDescriptors(Handle<mirror::Class> klass) 481b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 4820e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 4839837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers bool IsSameDescriptorInDifferentClassContexts(Thread* self, const char* descriptor, 4840cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::ClassLoader> class_loader1, 4850cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::ClassLoader> class_loader2) 486b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 4870e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 4889837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers bool IsSameMethodSignatureInDifferentClassContexts(Thread* self, mirror::ArtMethod* method, 489ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers mirror::Class* klass1, 490ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers mirror::Class* klass2) 491b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 4920e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 49398d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang bool LinkClass(Thread* self, const char* descriptor, Handle<mirror::Class> klass, 49498d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang Handle<mirror::ObjectArray<mirror::Class>> interfaces, 49598d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang mirror::Class** new_class) 496b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 4970e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 4980cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier bool LinkSuperClass(Handle<mirror::Class> klass) 499b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5000e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 5010cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier bool LoadSuperAndInterfaces(Handle<mirror::Class> klass, const DexFile& dex_file) 502b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5030e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 504bfd9a4378eacaf2dc2bbe05ad48c5164fc93c9feMathieu Chartier bool LinkMethods(Thread* self, Handle<mirror::Class> klass, 5050cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::ObjectArray<mirror::Class>> interfaces) 506b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5070e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 508bfd9a4378eacaf2dc2bbe05ad48c5164fc93c9feMathieu Chartier bool LinkVirtualMethods(Thread* self, Handle<mirror::Class> klass) 509b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5100e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 5110cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier bool LinkInterfaceMethods(Handle<mirror::Class> klass, 5120cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::ObjectArray<mirror::Class>> interfaces) 513b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5140e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 51598d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang bool LinkStaticFields(Handle<mirror::Class> klass, size_t* class_size) 516b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5170cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier bool LinkInstanceFields(Handle<mirror::Class> klass) 518b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 51998d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang bool LinkFields(Handle<mirror::Class> klass, bool is_static, size_t* class_size) 520b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5210cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier void LinkCode(Handle<mirror::ArtMethod> method, const OatFile::OatClass* oat_class, 522f0972a410a0665dbe32bd96df09a572d69f9f3a3Dmitry Petrochenko const DexFile& dex_file, uint32_t dex_method_index, uint32_t method_index) 523f0972a410a0665dbe32bd96df09a572d69f9f3a3Dmitry Petrochenko SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5240cfe1fb7060576d047f7f894fc0d8b87de84fcabIan Rogers 5250cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier void CreateReferenceInstanceOffsets(Handle<mirror::Class> klass) 526b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5270cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier void CreateReferenceStaticOffsets(Handle<mirror::Class> klass) 528b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5290cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier void CreateReferenceOffsets(Handle<mirror::Class> klass, bool is_static, 53000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers uint32_t reference_offsets) 531b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5320e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 53358ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom // For use by ImageWriter to find DexCaches for its roots 534e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi ReaderWriterMutex* DexLock() 535e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) LOCK_RETURNED(dex_lock_) { 536e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi return &dex_lock_; 53758ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom } 538e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi size_t GetDexCacheCount() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_, dex_lock_) { 539e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi return dex_caches_.size(); 540e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi } 541e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi mirror::DexCache* GetDexCache(size_t idx) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_, dex_lock_); 54258ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom 54300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers const OatFile* FindOpenedOatFileForDexFile(const DexFile& dex_file) 54433e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers LOCKS_EXCLUDED(dex_lock_) 54533e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 546833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe 547833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe // Find an opened oat file that contains dex_location. If oat_location is not nullptr, the file 548833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe // must have that location, else any oat location is accepted. 549833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe const OatFile* FindOpenedOatFile(const char* oat_location, const char* dex_location, 550833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe const uint32_t* const dex_location_checksum) 551719d1a33f6569864f529e5a3fff59e7bca97aad0Ian Rogers LOCKS_EXCLUDED(dex_lock_); 552a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light 553a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light // Will open the oat file directly without relocating, even if we could/should do relocation. 554a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light const OatFile* FindOatFileFromOatLocation(const std::string& oat_location, 555a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light std::string* error_msg) 556a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light LOCKS_EXCLUDED(dex_lock_); 557a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light 55800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers const OatFile* FindOpenedOatFileFromOatLocation(const std::string& oat_location) 5598d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers LOCKS_EXCLUDED(dex_lock_); 560833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe 561a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light const OatFile* OpenOatFileFromDexLocation(const std::string& dex_location, 562a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light InstructionSet isa, 563a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light bool* already_opened, 564a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light bool* obsolete_file_cleanup_failed, 565a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light std::vector<std::string>* error_msg) 566a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light LOCKS_EXCLUDED(dex_lock_, Locks::mutator_lock_); 567a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light 5680a112bbbcd761c749c346bfec0ec39c1ef37a590Alex Light const OatFile* GetInterpretedOnlyOat(const std::string& oat_path, 5690a112bbbcd761c749c346bfec0ec39c1ef37a590Alex Light InstructionSet isa, 5700a112bbbcd761c749c346bfec0ec39c1ef37a590Alex Light std::string* error_msg); 5710a112bbbcd761c749c346bfec0ec39c1ef37a590Alex Light 572a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light const OatFile* PatchAndRetrieveOat(const std::string& input, const std::string& output, 573a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light const std::string& image_location, InstructionSet isa, 574a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light std::string* error_msg) 575a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light LOCKS_EXCLUDED(Locks::mutator_lock_); 576a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light 577a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light bool CheckOatFile(const OatFile* oat_file, InstructionSet isa, 578a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light bool* checksum_verified, std::string* error_msg); 579a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light int32_t GetRequiredDelta(const OatFile* oat_file, InstructionSet isa); 580a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light 581833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe // Note: will not register the oat file. 582833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe const OatFile* FindOatFileInOatLocationForDexFile(const char* dex_location, 583833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe uint32_t dex_location_checksum, 584833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe const char* oat_location, 585833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe std::string* error_msg) 5868d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers LOCKS_EXCLUDED(dex_lock_); 587e3359f7ad7671c5816f17145ca3a01516512e8d6Ian Rogers 588833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe // Creates the oat file from the dex_location to the oat_location. Needs a file descriptor for 589833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe // the file to be written, which is assumed to be under a lock. 590833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe const OatFile* CreateOatFileForDexLocation(const char* dex_location, 591833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe int fd, const char* oat_location, 592833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe std::vector<std::string>* error_msgs) 593833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe LOCKS_EXCLUDED(dex_lock_, Locks::mutator_lock_); 594833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe 595833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe // Finds an OatFile that contains a DexFile for the given a DexFile location. 596833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe // 597833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe // Note 1: this will not check open oat files, which are assumed to be stale when this is run. 598833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe // Note 2: Does not register the oat file. It is the caller's job to register if the file is to 599833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe // be kept. 600833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe const OatFile* FindOatFileContainingDexFileFromDexLocation(const char* location, 601833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe const uint32_t* const location_checksum, 602833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe InstructionSet isa, 603c54aea7f4acd1a32bb298d43c20e3e0217638926Calin Juravle std::vector<std::string>* error_msgs, 604c54aea7f4acd1a32bb298d43c20e3e0217638926Calin Juravle bool* obsolete_file_cleanup_failed) 605833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe LOCKS_EXCLUDED(dex_lock_, Locks::mutator_lock_); 606833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe 607a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light // verify an oat file with the given dex file. Will return false when the dex file could not be 608a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light // verified. Will return true otherwise. 609a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light bool VerifyOatWithDexFile(const OatFile* oat_file, const char* dex_location, 610a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light std::string* error_msg); 611fad714344ca81a21e775ef45ae09d9a035723cafBrian Carlstrom 6120cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier mirror::ArtMethod* CreateProxyConstructor(Thread* self, Handle<mirror::Class> klass, 613ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom mirror::Class* proxy_class) 614b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 6150cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier mirror::ArtMethod* CreateProxyMethod(Thread* self, Handle<mirror::Class> klass, 6160cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::ArtMethod> prototype) 617b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 61895caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson 6194a96b60e45fba4a9d4a2e9c8fc849660eacef684Brian Carlstrom std::vector<const DexFile*> boot_class_path_; 620578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom 6211bf8d4dbe5cb9891e8a1125ff1928b544efc243aIan Rogers mutable ReaderWriterMutex dex_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER; 622893263b7d5bc2ca43a91ecb8071867f5134fc60aMathieu Chartier std::vector<size_t> new_dex_cache_roots_ GUARDED_BY(dex_lock_);; 62394f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi std::vector<GcRoot<mirror::DexCache>> dex_caches_ GUARDED_BY(dex_lock_); 624f8349361a16a4e2796efe9f3586b994e8d4834e4Elliott Hughes std::vector<const OatFile*> oat_files_ GUARDED_BY(dex_lock_); 62547d237a4b1a41772005c60083e72fe75c0aa0743Brian Carlstrom 6260e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 627aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom // multimap from a string hash code of a class descriptor to 6282dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // mirror::Class* instances. Results should be compared for a matching 6299cff8e13d41825c4f3f0127af061e94b06114fc8Brian Carlstrom // Class::descriptor_ and Class::class_loader_. 63094f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi typedef std::multimap<size_t, GcRoot<mirror::Class>> Table; 631a91a4bc1f8960f64c5f7e4616d46e21b8e1bfba2Hiroshi Yamauchi // This contains strong roots. To enable concurrent root scanning of 632a91a4bc1f8960f64c5f7e4616d46e21b8e1bfba2Hiroshi Yamauchi // the class table, be careful to use a read barrier when accessing this. 6337dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers Table class_table_ GUARDED_BY(Locks::classlinker_classes_lock_); 63494f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi std::vector<std::pair<size_t, GcRoot<mirror::Class>>> new_class_roots_; 6357dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers 6367dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers // Do we need to search dex caches to find image classes? 6377dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers bool dex_cache_image_class_lookup_required_; 6387dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers // Number of times we've searched dex caches for a class. After a certain number of misses we move 6397dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers // the classes into the class_table_ to avoid dex cache based searches. 6407dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers AtomicInteger failed_dex_cache_class_lookups_; 641f8349361a16a4e2796efe9f3586b994e8d4834e4Elliott Hughes 6427dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers mirror::Class* LookupClassFromTableLocked(const char* descriptor, 6437dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers const mirror::ClassLoader* class_loader, 6447dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers size_t hash) 6457dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers SHARED_LOCKS_REQUIRED(Locks::classlinker_classes_lock_, Locks::mutator_lock_); 6467dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers 64798d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang mirror::Class* UpdateClass(const char* descriptor, mirror::Class* klass, size_t hash) 64898d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 64998d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 65098d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang 6517dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers void MoveImageClassesToClassTable() LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 6527dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 6537dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers mirror::Class* LookupClassFromImage(const char* descriptor) 6547dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 6550e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 65698d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang // EnsureResolved is called to make sure that a class in the class_table_ has been resolved 65798d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang // before returning it to the caller. Its the responsibility of the thread that placed the class 65898d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang // in the table to make it resolved. The thread doing resolution must notify on the class' lock 65998d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang // when resolution has occurred. This happens in mirror::Class::SetStatus. As resolution may 66098d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang // retire a class, the version of the class in the table is returned and this may differ from 66198d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang // the class passed in. 66298d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang mirror::Class* EnsureResolved(Thread* self, const char* descriptor, mirror::Class* klass) 6634c13a3ff475f206c4d0a86ee2595c45392fd942fMathieu Chartier WARN_UNUSED SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 66498d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang 66598d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang void FixupTemporaryDeclaringClass(mirror::Class* temp_class, mirror::Class* new_class) 66698d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 66798d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang 668a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom // indexes into class_roots_. 669a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom // needs to be kept in sync with class_roots_descriptors_. 67074eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom enum ClassRoot { 67175cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom kJavaLangClass, 67275cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom kJavaLangObject, 673418d20fc407052d4152157f61e7453359f902383Elliott Hughes kClassArrayClass, 67474eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom kObjectArrayClass, 67574eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom kJavaLangString, 67666f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier kJavaLangDexCache, 677bf61ba3dcd9d9895b86a05e88762ff034b09b263Elliott Hughes kJavaLangRefReference, 678ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom kJavaLangReflectArtField, 679ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom kJavaLangReflectArtMethod, 680466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers kJavaLangReflectProxy, 68166f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier kJavaLangStringArrayClass, 682ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom kJavaLangReflectArtFieldArrayClass, 683ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom kJavaLangReflectArtMethodArrayClass, 68474eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom kJavaLangClassLoader, 6855167c97a4f672ba821453418e3943988fabbfc43Ian Rogers kJavaLangThrowable, 6868cd6ddaeb78cc904e13bac88753654a04b2e15b8jeffhao kJavaLangClassNotFoundException, 68755df06be4369f5d8ab5eb61a5d22809255171036Shih-wei Liao kJavaLangStackTraceElement, 68875cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom kPrimitiveBoolean, 689d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes kPrimitiveByte, 69075cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom kPrimitiveChar, 69175cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom kPrimitiveDouble, 692d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes kPrimitiveFloat, 69375cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom kPrimitiveInt, 69475cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom kPrimitiveLong, 695d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes kPrimitiveShort, 69675cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom kPrimitiveVoid, 697d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes kBooleanArrayClass, 698d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes kByteArrayClass, 699d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes kCharArrayClass, 700d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes kDoubleArrayClass, 701d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes kFloatArrayClass, 702d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes kIntArrayClass, 703d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes kLongArrayClass, 704d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes kShortArrayClass, 70555df06be4369f5d8ab5eb61a5d22809255171036Shih-wei Liao kJavaLangStackTraceElementArrayClass, 70675cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom kClassRootsMax, 70775cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom }; 70894f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi GcRoot<mirror::ObjectArray<mirror::Class>> class_roots_; 709913af1bd90a6e8fd56f1f851db1f098636dae6a5Brian Carlstrom 7102dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::Class* GetClassRoot(ClassRoot class_root) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 71174eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom 7122dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers void SetClassRoot(ClassRoot class_root, mirror::Class* klass) 713b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 714a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom 715418d20fc407052d4152157f61e7453359f902383Elliott Hughes static const char* class_roots_descriptors_[]; 716a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom 717a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom const char* GetClassRootDescriptor(ClassRoot class_root) { 718a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom const char* descriptor = class_roots_descriptors_[class_root]; 719a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom CHECK(descriptor != NULL); 720a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom return descriptor; 721a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom } 722a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom 7239837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers // The interface table used by all arrays. 72494f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi GcRoot<mirror::IfTable> array_iftable_; 725565f50731db360584d0080af7f14f0b7ca10371cCarl Shapiro 7269837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers // A cache of the last FindArrayClass results. The cache serves to avoid creating array class 7279837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers // descriptors for the sake of performing FindClass. 7289837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers static constexpr size_t kFindArrayCacheSize = 16; 72994f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi GcRoot<mirror::Class> find_array_class_cache_[kFindArrayCacheSize]; 7309837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers size_t find_array_class_cache_next_victim_; 7319837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers 73275cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom bool init_done_; 733893263b7d5bc2ca43a91ecb8071867f5134fc60aMathieu Chartier bool log_new_dex_caches_roots_ GUARDED_BY(dex_lock_); 734893263b7d5bc2ca43a91ecb8071867f5134fc60aMathieu Chartier bool log_new_class_table_roots_ GUARDED_BY(Locks::classlinker_classes_lock_); 73575cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom 736cf4c6c41b0084dc4567ff709fb8ce9ebd72b26acElliott Hughes InternTable* intern_table_; 737cf4c6c41b0084dc4567ff709fb8ce9ebd72b26acElliott Hughes 73898d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang // Trampolines within the image the bounce to runtime entrypoints. Done so that there is a single 73998d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang // patch point within the image. TODO: make these proper relocations. 7400aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao const void* portable_resolution_trampoline_; 7410aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao const void* quick_resolution_trampoline_; 74288474b416eb257078e590bf9bc7957cee604a186Jeff Hao const void* portable_imt_conflict_trampoline_; 74388474b416eb257078e590bf9bc7957cee604a186Jeff Hao const void* quick_imt_conflict_trampoline_; 7442da882315a61072664f7ce3c212307342e907207Andreas Gampe const void* quick_generic_jni_trampoline_; 7458a630577ed2d9e9571c3434c505e5de223b23c07Vladimir Marko const void* quick_to_interpreter_bridge_trampoline_; 7460aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao 747ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom friend class ImageWriter; // for GetClassRoots 748a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light friend class ImageDumper; // for FindOpenedOatFileFromOatLocation 749a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light friend class ElfPatcher; // for FindOpenedOatFileForDexFile & FindOpenedOatFileFromOatLocation 7509c290012b7f505ae1943ab87236f775b97a46e2dNicolas Geoffray friend class NoDex2OatTest; // for FindOpenedOatFileForDexFile 7510a112bbbcd761c749c346bfec0ec39c1ef37a590Alex Light friend class NoPatchoatTest; // for FindOpenedOatFileForDexFile 7526d4d9fcb4f01e287ee29e81cd1c941ee5d11d379Ian Rogers FRIEND_TEST(ClassLinkerTest, ClassRootDescriptors); 7532dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers FRIEND_TEST(mirror::DexCacheTest, Open); 7541a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao FRIEND_TEST(ExceptionTest, FindExceptionHandler); 755ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom FRIEND_TEST(ObjectTest, AllocObjectArray); 7560e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro DISALLOW_COPY_AND_ASSIGN(ClassLinker); 7570e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro}; 7580e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 7590e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro} // namespace art 7600e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro 761fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif // ART_RUNTIME_CLASS_LINKER_H_ 762