class_linker.h revision 5369c40f75fdcb1be7a7c06db212ce965c83a164
1418d20fc407052d4152157f61e7453359f902383Elliott Hughes/*
2418d20fc407052d4152157f61e7453359f902383Elliott Hughes * Copyright (C) 2011 The Android Open Source Project
3418d20fc407052d4152157f61e7453359f902383Elliott Hughes *
4418d20fc407052d4152157f61e7453359f902383Elliott Hughes * Licensed under the Apache License, Version 2.0 (the "License");
5418d20fc407052d4152157f61e7453359f902383Elliott Hughes * you may not use this file except in compliance with the License.
6418d20fc407052d4152157f61e7453359f902383Elliott Hughes * You may obtain a copy of the License at
7418d20fc407052d4152157f61e7453359f902383Elliott Hughes *
8418d20fc407052d4152157f61e7453359f902383Elliott Hughes *      http://www.apache.org/licenses/LICENSE-2.0
9418d20fc407052d4152157f61e7453359f902383Elliott Hughes *
10418d20fc407052d4152157f61e7453359f902383Elliott Hughes * Unless required by applicable law or agreed to in writing, software
11418d20fc407052d4152157f61e7453359f902383Elliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
12418d20fc407052d4152157f61e7453359f902383Elliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13418d20fc407052d4152157f61e7453359f902383Elliott Hughes * See the License for the specific language governing permissions and
14418d20fc407052d4152157f61e7453359f902383Elliott Hughes * limitations under the License.
15418d20fc407052d4152157f61e7453359f902383Elliott Hughes */
160e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
17fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#ifndef ART_RUNTIME_CLASS_LINKER_H_
18fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#define ART_RUNTIME_CLASS_LINKER_H_
190e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
206d4d9fcb4f01e287ee29e81cd1c941ee5d11d379Ian Rogers#include <string>
210e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro#include <utility>
220e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro#include <vector>
230e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
245369c40f75fdcb1be7a7c06db212ce965c83a164Mathieu Chartier#include "base/allocator.h"
25761600567d73b23324ae0251e871c15d6849ffd8Elliott Hughes#include "base/macros.h"
2676b6167407c2b6f5d40ad895b2793a6b037f54b2Elliott Hughes#include "base/mutex.h"
277e93b50433cde2a44d99212e8040299bde498546Brian Carlstrom#include "dex_file.h"
2894f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi#include "gc_root.h"
29e5448b5a12003b405b22cde3b94f962ab4888a87Elliott Hughes#include "gtest/gtest.h"
30590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier#include "jni.h"
3158ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom#include "oat_file.h"
3283c8ee000d525017ead8753fce6bc1020249b96aMathieu Chartier#include "object_callbacks.h"
330e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
340e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapironamespace art {
3598d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang
361d54e73444e017d3a65234e0f193846f3e27472bIan Rogersnamespace gc {
371d54e73444e017d3a65234e0f193846f3e27472bIan Rogersnamespace space {
381d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  class ImageSpace;
391d54e73444e017d3a65234e0f193846f3e27472bIan Rogers}  // namespace space
401d54e73444e017d3a65234e0f193846f3e27472bIan Rogers}  // namespace gc
412dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersnamespace mirror {
4233e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers  class ClassLoader;
4333e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers  class DexCache;
4433e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers  class DexCacheTest_Open_Test;
4533e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers  class IfTable;
4633e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers  template<class T> class ObjectArray;
4733e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers  class StackTraceElement;
4833e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers}  // namespace mirror
491d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
50cf4c6c41b0084dc4567ff709fb8ce9ebd72b26acElliott Hughesclass InternTable;
51c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartiertemplate<class T> class ObjectLock;
522b7c4d196c8abe32f4ca633534917da9de53c359Mathieu Chartierclass ScopedObjectAccessAlreadyRunnable;
53eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartiertemplate<class T> class Handle;
54cf4c6c41b0084dc4567ff709fb8ce9ebd72b26acElliott Hughes
552dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogerstypedef bool (ClassVisitor)(mirror::Class* c, void* arg);
56a215526d5c789cbef0f81a1f9aba22541a841ccaElliott Hughes
57893263b7d5bc2ca43a91ecb8071867f5134fc60aMathieu Chartierenum VisitRootFlags : uint8_t;
58893263b7d5bc2ca43a91ecb8071867f5134fc60aMathieu Chartier
590e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiroclass ClassLinker {
600e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro public:
61590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier  explicit ClassLinker(InternTable* intern_table);
62590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier  ~ClassLinker();
6358ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom
64507e6180ad271eb719c67ce7394852c731d975a5Alex Light  // Initialize class linker by bootstraping from dex files.
65507e6180ad271eb719c67ce7394852c731d975a5Alex Light  void InitWithoutImage(const std::vector<const DexFile*>& boot_class_path)
66b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
679ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom
68590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier  // Initialize class linker from one or more images.
69590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier  void InitFromImage() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
70565f50731db360584d0080af7f14f0b7ca10371cCarl Shapiro
71be7149fc2e7cc607937209f2819e3c1d672e2668Ian Rogers  bool IsInBootClassPath(const char* descriptor);
72be7149fc2e7cc607937209f2819e3c1d672e2668Ian Rogers
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
799837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers  // Finds a class by its descriptor using the "system" class loader, ie by searching the
809837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers  // boot_class_path_.
819837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers  mirror::Class* FindSystemClass(Thread* self, const char* descriptor)
829837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
839837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers
849837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers  // Finds the array class given for the element class.
85b74cd29802f364b4cec88f4913fa38ade26b8fabMathieu Chartier  mirror::Class* FindArrayClass(Thread* self, mirror::Class** element_class)
86b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
87aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom
88590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier  // Reutrns true if the class linker is initialized.
89590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier  bool IsInitialized() const;
90590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier
91aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom  // Define a new a class based on a ClassDef from a DexFile
92c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier  mirror::Class* DefineClass(const char* descriptor,
930cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                             Handle<mirror::ClassLoader> class_loader,
942dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                             const DexFile& dex_file, const DexFile::ClassDef& dex_class_def)
95b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
9664bf5a33d55aa779ef452552a466943002d39e4fElliott Hughes
9764bf5a33d55aa779ef452552a466943002d39e4fElliott Hughes  // Finds a class by its descriptor, returning NULL if it isn't wasn't loaded
9864bf5a33d55aa779ef452552a466943002d39e4fElliott Hughes  // by the given 'class_loader'.
992dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::Class* LookupClass(const char* descriptor, const mirror::ClassLoader* class_loader)
100b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
101b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
1020e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
1036fa602d614d418f38afebb4d44f42e7dc0b4bd94Elliott Hughes  // Finds all the classes with the given descriptor, regardless of ClassLoader.
1042dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  void LookupClasses(const char* descriptor, std::vector<mirror::Class*>& classes)
105b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
106b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
1076fa602d614d418f38afebb4d44f42e7dc0b4bd94Elliott Hughes
1082dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::Class* FindPrimitiveClass(char type) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
109d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes
110ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom  // General class unloading is not supported, this is used to prune
111ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom  // unwanted classes during image writing.
1122dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  bool RemoveClass(const char* descriptor, const mirror::ClassLoader* class_loader)
113b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
114b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
115ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom
1167dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers  void DumpAllClasses(int flags)
117b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
118b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
1199d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes
1207dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers  void DumpForSigQuit(std::ostream& os)
1217dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
1227dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
123cac6cc72c3331257fa6437b36a131e5d551e2f3cElliott Hughes
1247dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers  size_t NumLoadedClasses()
1257dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
1267dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
127e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes
128b63ec393a5c4ba2be1d34dd871cda811eaa803c7Brian Carlstrom  // Resolve a String with the given index from the DexFile, storing the
129aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom  // result in the DexCache. The referrer is used to identify the
130aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom  // target DexCache and ClassLoader to use for resolution.
131ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers  mirror::String* ResolveString(uint32_t string_idx, mirror::ArtMethod* referrer)
1322dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
133aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom
134aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom  // Resolve a String with the given index from the DexFile, storing the
1359ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // result in the DexCache.
1362dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::String* ResolveString(const DexFile& dex_file, uint32_t string_idx,
1370cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                                Handle<mirror::DexCache> dex_cache)
138b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
1399ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom
140b63ec393a5c4ba2be1d34dd871cda811eaa803c7Brian Carlstrom  // Resolve a Type with the given index from the DexFile, storing the
1419ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // result in the DexCache. The referrer is used to identity the
1429ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // target DexCache and ClassLoader to use for resolution.
143ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers  mirror::Class* ResolveType(const DexFile& dex_file, uint16_t type_idx, mirror::Class* referrer)
144590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
1459ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom
146b63ec393a5c4ba2be1d34dd871cda811eaa803c7Brian Carlstrom  // Resolve a Type with the given index from the DexFile, storing the
1470cfe1fb7060576d047f7f894fc0d8b87de84fcabIan Rogers  // result in the DexCache. The referrer is used to identify the
148b63ec393a5c4ba2be1d34dd871cda811eaa803c7Brian Carlstrom  // target DexCache and ClassLoader to use for resolution.
149ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers  mirror::Class* ResolveType(uint16_t type_idx, mirror::ArtMethod* referrer)
1502dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
1510cfe1fb7060576d047f7f894fc0d8b87de84fcabIan Rogers
152ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers  mirror::Class* ResolveType(uint16_t type_idx, mirror::ArtField* referrer)
1532dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
154b63ec393a5c4ba2be1d34dd871cda811eaa803c7Brian Carlstrom
1559ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // Resolve a type with the given ID from the DexFile, storing the
1569ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // result in DexCache. The ClassLoader is used to search for the
1579ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // type, since it may be referenced from but not contained within
1589ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // the given DexFile.
159590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier  mirror::Class* ResolveType(const DexFile& dex_file, uint16_t type_idx,
1600cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                             Handle<mirror::DexCache> dex_cache,
1610cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                             Handle<mirror::ClassLoader> class_loader)
162b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
1639ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom
1649ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // Resolve a method with a given ID from the DexFile, storing the
1659ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // result in DexCache. The ClassLinker and ClassLoader are used as
1669ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // in ResolveType. What is unique is the method type argument which
1679ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // is used to determine if this method is a direct, static, or
1689ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // virtual method.
169ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  mirror::ArtMethod* ResolveMethod(const DexFile& dex_file,
170ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                   uint32_t method_idx,
1710cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                                   Handle<mirror::DexCache> dex_cache,
1720cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                                   Handle<mirror::ClassLoader> class_loader,
1730cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                                   Handle<mirror::ArtMethod> referrer,
174ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                   InvokeType type)
175b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
1769ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom
1770cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  mirror::ArtMethod* GetResolvedMethod(uint32_t method_idx, mirror::ArtMethod* referrer,
1780cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                                       InvokeType type)
1790cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
1800cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  mirror::ArtMethod* ResolveMethod(Thread* self, uint32_t method_idx, mirror::ArtMethod** referrer,
181ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                   InvokeType type)
1822dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
183161928613d3f097108319de60494fab1aab8d48aBrian Carlstrom
1840cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  mirror::ArtField* GetResolvedField(uint32_t field_idx, mirror::Class* field_declaring_class)
1850cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
186ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers  mirror::ArtField* ResolveField(uint32_t field_idx, mirror::ArtMethod* referrer,
187ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                 bool is_static)
1882dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
189b9edb841423dfe60e193fcffd25994398c91baa2Brian Carlstrom
190161928613d3f097108319de60494fab1aab8d48aBrian Carlstrom  // Resolve a field with a given ID from the DexFile, storing the
1919ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // result in DexCache. The ClassLinker and ClassLoader are used as
1929ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // in ResolveType. What is unique is the is_static argument which is
1939ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // used to determine if we are resolving a static or non-static
1949ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // field.
195ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  mirror::ArtField* ResolveField(const DexFile& dex_file,
196ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                 uint32_t field_idx,
1970cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                                 Handle<mirror::DexCache> dex_cache,
1980cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                                 Handle<mirror::ClassLoader> class_loader,
199ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                 bool is_static)
200b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
2019ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom
202b067ac2fe225c76fc9eb9434ef62cbb797bfa425Ian Rogers  // Resolve a field with a given ID from the DexFile, storing the
203b067ac2fe225c76fc9eb9434ef62cbb797bfa425Ian Rogers  // result in DexCache. The ClassLinker and ClassLoader are used as
204b067ac2fe225c76fc9eb9434ef62cbb797bfa425Ian Rogers  // in ResolveType. No is_static argument is provided so that Java
205b067ac2fe225c76fc9eb9434ef62cbb797bfa425Ian Rogers  // field resolution semantics are followed.
2060cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  mirror::ArtField* ResolveFieldJLS(const DexFile& dex_file, uint32_t field_idx,
2070cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                                    Handle<mirror::DexCache> dex_cache,
2080cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                                    Handle<mirror::ClassLoader> class_loader)
209b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
210b067ac2fe225c76fc9eb9434ef62cbb797bfa425Ian Rogers
211ad25ac568407ceb14334e8551dd1c4dd0fd6993cIan Rogers  // Get shorty from method index without resolution. Used to do handlerization.
212ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  const char* MethodShorty(uint32_t method_idx, mirror::ArtMethod* referrer, uint32_t* length)
213b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
214ad25ac568407ceb14334e8551dd1c4dd0fd6993cIan Rogers
215f4c21c9f6440c3980c47a297519f758796dbc039Elliott Hughes  // Returns true on success, false if there's an exception pending.
21625c3325bf95036bf325fc7cb21b4fd6d40282857Brian Carlstrom  // can_run_clinit=false allows the compiler to attempt to init a class,
21725c3325bf95036bf325fc7cb21b4fd6d40282857Brian Carlstrom  // given the restriction that no <clinit> execution is possible.
2180cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  bool EnsureInitialized(Handle<mirror::Class> c, bool can_init_fields, bool can_init_parents)
219b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
2200e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
2212a20cfd0b7fc81099f5de0da782ebcc1cb262792Elliott Hughes  // Initializes classes that have instances in the image but that have
2222a20cfd0b7fc81099f5de0da782ebcc1cb262792Elliott Hughes  // <clinit> methods so they could not be initialized by the compiler.
223b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers  void RunRootClinits() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
2242a20cfd0b7fc81099f5de0da782ebcc1cb262792Elliott Hughes
22500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  void RegisterDexFile(const DexFile& dex_file)
22600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      LOCKS_EXCLUDED(dex_lock_)
227b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
2280cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  void RegisterDexFile(const DexFile& dex_file, Handle<mirror::DexCache> dex_cache)
22900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      LOCKS_EXCLUDED(dex_lock_)
230b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
2310e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
2328d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers  const OatFile* RegisterOatFile(const OatFile* oat_file)
23300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      LOCKS_EXCLUDED(dex_lock_);
234866c8627626b7c47fb69b498b341772d7dfa7f60Brian Carlstrom
2358a48741b96ca9cc5835cac72ac133c4ca480930fBrian Carlstrom  const std::vector<const DexFile*>& GetBootClassPath() {
2368a48741b96ca9cc5835cac72ac133c4ca480930fBrian Carlstrom    return boot_class_path_;
2378a48741b96ca9cc5835cac72ac133c4ca480930fBrian Carlstrom  }
2388a48741b96ca9cc5835cac72ac133c4ca480930fBrian Carlstrom
2397dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers  void VisitClasses(ClassVisitor* visitor, void* arg)
2407dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers      LOCKS_EXCLUDED(dex_lock_)
2417dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
24200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  // Less efficient variant of VisitClasses that doesn't hold the classlinker_classes_lock_
24300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  // when calling the visitor.
2447dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers  void VisitClassesWithoutClassesLock(ClassVisitor* visitor, void* arg)
2457dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers      LOCKS_EXCLUDED(dex_lock_)
2467dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
24700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers
24852e4b43d62896b56f8c2bd041e528472bb4a0d8dMathieu Chartier  void VisitClassRoots(RootCallback* callback, void* arg, VisitRootFlags flags)
24994f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
25094f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
251893263b7d5bc2ca43a91ecb8071867f5134fc60aMathieu Chartier  void VisitRoots(RootCallback* callback, void* arg, VisitRootFlags flags)
25294f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi      LOCKS_EXCLUDED(dex_lock_)
25394f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
25400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers
255e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi  mirror::DexCache* FindDexCache(const DexFile& dex_file)
25600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      LOCKS_EXCLUDED(dex_lock_)
257b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
258e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi  bool IsDexFileRegistered(const DexFile& dex_file)
259b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers      LOCKS_EXCLUDED(dex_lock_) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
260e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi  void FixupDexCaches(mirror::ArtMethod* resolution_method)
26100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      LOCKS_EXCLUDED(dex_lock_)
262b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
2631d9f52b7ca91c6d30b7acfac1c9ab24d93fff470Brian Carlstrom
264262bf46ddc91e5b4fbd367127ff21a1877d939f2jeffhao  // Generate an oat file from a dex file
2658d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers  bool GenerateOatFile(const char* dex_filename,
266d601af8d9549ca95a911afb2fc67c4e562da661fBrian Carlstrom                       int oat_fd,
26760836d5a9bcf8b30984aae4279a4f6233b0bf622Vladimir Marko                       const char* oat_cache_filename,
268719d1a33f6569864f529e5a3fff59e7bca97aad0Ian Rogers                       std::string* error_msg)
2698d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers      LOCKS_EXCLUDED(Locks::mutator_lock_);
270262bf46ddc91e5b4fbd367127ff21a1877d939f2jeffhao
271833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  // Find or create the oat file holding dex_location. Then load all corresponding dex files
272833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  // (if multidex) into the given vector.
273833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  bool OpenDexFilesFromOat(const char* dex_location, const char* oat_location,
274833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe                           std::vector<std::string>* error_msgs,
275833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe                           std::vector<const DexFile*>* dex_files)
2768d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers      LOCKS_EXCLUDED(dex_lock_, Locks::mutator_lock_);
277f6174e8a1566bb357e82506f7ec97dc359c90eb2jeffhao
278345c4b19758703793ed31024cfb79940e2c63b75Alex Light  // Returns true if the given oat file has the same image checksum as the image it is paired with.
279345c4b19758703793ed31024cfb79940e2c63b75Alex Light  static bool VerifyOatImageChecksum(const OatFile* oat_file, const InstructionSet instruction_set);
280345c4b19758703793ed31024cfb79940e2c63b75Alex Light  // Returns true if the oat file checksums match with the image and the offsets are such that it
281345c4b19758703793ed31024cfb79940e2c63b75Alex Light  // could be loaded with it.
282345c4b19758703793ed31024cfb79940e2c63b75Alex Light  static bool VerifyOatChecksums(const OatFile* oat_file, const InstructionSet instruction_set,
283345c4b19758703793ed31024cfb79940e2c63b75Alex Light                                 std::string* error_msg);
28428db0129e5d7ef642cf8845c86c0e11832817085Brian Carlstrom  // Returns true if oat file contains the dex file with the given location and checksum.
285345c4b19758703793ed31024cfb79940e2c63b75Alex Light  static bool VerifyOatAndDexFileChecksums(const OatFile* oat_file,
286345c4b19758703793ed31024cfb79940e2c63b75Alex Light                                           const char* dex_location,
287345c4b19758703793ed31024cfb79940e2c63b75Alex Light                                           uint32_t dex_location_checksum,
288345c4b19758703793ed31024cfb79940e2c63b75Alex Light                                           InstructionSet instruction_set,
289345c4b19758703793ed31024cfb79940e2c63b75Alex Light                                           std::string* error_msg);
290afe25515c358617321d69ab4f25003e3d905d613Brian Carlstrom
291418d20fc407052d4152157f61e7453359f902383Elliott Hughes  // TODO: replace this with multiple methods that allocate the correct managed type.
2924417536522fd2a9d8215d8672331984769c9520bShih-wei Liao  template <class T>
2932dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::ObjectArray<T>* AllocObjectArray(Thread* self, size_t length)
2942dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
2954417536522fd2a9d8215d8672331984769c9520bShih-wei Liao
2962dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::ObjectArray<mirror::Class>* AllocClassArray(Thread* self, size_t length)
2972dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
298418d20fc407052d4152157f61e7453359f902383Elliott Hughes
2992dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::ObjectArray<mirror::String>* AllocStringArray(Thread* self, size_t length)
3002dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
30166f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier
302ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  mirror::ObjectArray<mirror::ArtMethod>* AllocArtMethodArray(Thread* self, size_t length)
3032dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
3044445a7e3398a6143939168097a3aa275b734504dIan Rogers
3052dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::IfTable* AllocIfTable(Thread* self, size_t ifcount)
3062dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
30723435d0df17e19fe312a08ff151464d4b9f83e81Ian Rogers
308ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  mirror::ObjectArray<mirror::ArtField>* AllocArtFieldArray(Thread* self, size_t length)
3092dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
31066f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier
3112dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::ObjectArray<mirror::StackTraceElement>* AllocStackTraceElementArray(Thread* self,
3122dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                                                                              size_t length)
313b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
31455df06be4369f5d8ab5eb61a5d22809255171036Shih-wei Liao
3150cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  void VerifyClass(Handle<mirror::Class> klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
3162dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  bool VerifyClassUsingOatFile(const DexFile& dex_file, mirror::Class* klass,
3172dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                               mirror::Class::Status& oat_file_class_status)
318b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
319c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier  void ResolveClassExceptionHandlerTypes(const DexFile& dex_file,
3200cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                                         Handle<mirror::Class> klass)
321b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
322ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  void ResolveMethodExceptionHandlerTypes(const DexFile& dex_file, mirror::ArtMethod* klass)
323b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
32498eacac683b78e60799323e8c7d59e7214808639jeffhao
3252b7c4d196c8abe32f4ca633534917da9de53c359Mathieu Chartier  mirror::Class* CreateProxyClass(ScopedObjectAccessAlreadyRunnable& soa, jstring name,
3262b7c4d196c8abe32f4ca633534917da9de53c359Mathieu Chartier                                  jobjectArray interfaces, jobject loader, jobjectArray methods,
3272b7c4d196c8abe32f4ca633534917da9de53c359Mathieu Chartier                                  jobjectArray throws)
328b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
329ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers  std::string GetDescriptorForProxy(mirror::Class* proxy_class)
330b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
331ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers  mirror::ArtMethod* FindMethodForProxy(mirror::Class* proxy_class,
332ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers                                        mirror::ArtMethod* proxy_method)
33300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      LOCKS_EXCLUDED(dex_lock_)
334b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
33595caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson
3361984651929744dd603fd082e23eacd877b9bc177Ian Rogers  // Get the oat code for a method when its class isn't yet initialized
337ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers  const void* GetQuickOatCodeFor(mirror::ArtMethod* method)
338ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
339ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers  const void* GetPortableOatCodeFor(mirror::ArtMethod* method, bool* have_portable_code)
340b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
3411984651929744dd603fd082e23eacd877b9bc177Ian Rogers
342e35517ad40e0713df8420aeb5d3540f146a59f62Mathieu Chartier  // Get the oat code for a method from a method index.
343ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers  const void* GetQuickOatCodeFor(const DexFile& dex_file, uint16_t class_def_idx, uint32_t method_idx)
344ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
345ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers  const void* GetPortableOatCodeFor(const DexFile& dex_file, uint16_t class_def_idx, uint32_t method_idx)
34633e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
347e35517ad40e0713df8420aeb5d3540f146a59f62Mathieu Chartier
3487934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom  pid_t GetClassesLockOwner();  // For SignalCatcher.
3497934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom  pid_t GetDexLockOwner();  // For SignalCatcher.
35024a3c2e9924e8765c4a9b4d383cb8f3b922f9c9fBrian Carlstrom
3510aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao  const void* GetPortableResolutionTrampoline() const {
3520aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao    return portable_resolution_trampoline_;
3530aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao  }
3540aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao
3552da882315a61072664f7ce3c212307342e907207Andreas Gampe  const void* GetQuickGenericJniTrampoline() const {
356f0972a410a0665dbe32bd96df09a572d69f9f3a3Dmitry Petrochenko    return quick_generic_jni_trampoline_;
357f0972a410a0665dbe32bd96df09a572d69f9f3a3Dmitry Petrochenko  }
3582da882315a61072664f7ce3c212307342e907207Andreas Gampe
3590aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao  const void* GetQuickResolutionTrampoline() const {
3600aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao    return quick_resolution_trampoline_;
3610aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao  }
3620aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao
36388474b416eb257078e590bf9bc7957cee604a186Jeff Hao  const void* GetPortableImtConflictTrampoline() const {
36488474b416eb257078e590bf9bc7957cee604a186Jeff Hao    return portable_imt_conflict_trampoline_;
36588474b416eb257078e590bf9bc7957cee604a186Jeff Hao  }
36688474b416eb257078e590bf9bc7957cee604a186Jeff Hao
36788474b416eb257078e590bf9bc7957cee604a186Jeff Hao  const void* GetQuickImtConflictTrampoline() const {
36888474b416eb257078e590bf9bc7957cee604a186Jeff Hao    return quick_imt_conflict_trampoline_;
36988474b416eb257078e590bf9bc7957cee604a186Jeff Hao  }
37088474b416eb257078e590bf9bc7957cee604a186Jeff Hao
3718a630577ed2d9e9571c3434c505e5de223b23c07Vladimir Marko  const void* GetQuickToInterpreterBridgeTrampoline() const {
3728a630577ed2d9e9571c3434c505e5de223b23c07Vladimir Marko    return quick_to_interpreter_bridge_trampoline_;
3738a630577ed2d9e9571c3434c505e5de223b23c07Vladimir Marko  }
3748a630577ed2d9e9571c3434c505e5de223b23c07Vladimir Marko
37588474b416eb257078e590bf9bc7957cee604a186Jeff Hao  InternTable* GetInternTable() const {
37688474b416eb257078e590bf9bc7957cee604a186Jeff Hao    return intern_table_;
37788474b416eb257078e590bf9bc7957cee604a186Jeff Hao  }
37888474b416eb257078e590bf9bc7957cee604a186Jeff Hao
379848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  // Attempts to insert a class into a class table.  Returns NULL if
380848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  // the class was inserted, otherwise returns an existing class with
381848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  // the same descriptor and ClassLoader.
3827dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers  mirror::Class* InsertClass(const char* descriptor, mirror::Class* klass, size_t hash)
383848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
384848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
385848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers
386590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier  // Special code to allocate an art method, use this instead of class->AllocObject.
387590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier  mirror::ArtMethod* AllocArtMethod(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
38861e019d291583029c01b61b93bea750f2b663c37Carl Shapiro
38998d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang  mirror::ObjectArray<mirror::Class>* GetClassRoots() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
39094f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi    mirror::ObjectArray<mirror::Class>* class_roots = class_roots_.Read();
39198d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang    DCHECK(class_roots != NULL);
39298d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang    return class_roots;
39398d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang  }
39498d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang
395590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier private:
3969c290012b7f505ae1943ab87236f775b97a46e2dNicolas Geoffray  bool FindOatMethodFor(mirror::ArtMethod* method, OatFile::OatMethod* oat_method)
397b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
3988532191c4fc8e005f7d432fec40fd9f2936275c6TDYa
39956d947fbc9bc2992e2f93112fafb73e50d2aaa7aBrian Carlstrom  OatFile& GetImageOatFile(gc::space::ImageSpace* space)
40000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      LOCKS_EXCLUDED(dex_lock_)
401b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
402a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom
4039837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers  void FinishInit(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
404a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom
40575cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom  // For early bootstrapping by Init
4066fac447555dc94a935b78198479cce645c837b89Ian Rogers  mirror::Class* AllocClass(Thread* self, mirror::Class* java_lang_Class, uint32_t class_size)
407b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
40875cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom
4092dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  // Alloc* convenience functions to avoid needing to pass in mirror::Class*
41075cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom  // values that are known to the ClassLinker such as
41175cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom  // kObjectArrayClass and kJavaLangString etc.
4126fac447555dc94a935b78198479cce645c837b89Ian Rogers  mirror::Class* AllocClass(Thread* self, uint32_t class_size)
413c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
4142dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::DexCache* AllocDexCache(Thread* self, const DexFile& dex_file)
415b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
416ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  mirror::ArtField* AllocArtField(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
417bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers
4182dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::Class* CreatePrimitiveClass(Thread* self, Primitive::Type type)
4192dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
4202dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::Class* InitializePrimitiveClass(mirror::Class* primitive_class, Primitive::Type type)
421b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
4225b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom
423a331b3cc392132c7333d36649a8310f38f4822ccBrian Carlstrom
4249837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers  mirror::Class* CreateArrayClass(Thread* self, const char* descriptor,
4250cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                                  Handle<mirror::ClassLoader> class_loader)
426b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
427578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom
42800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  void AppendToBootClassPath(const DexFile& dex_file)
429b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
4300cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  void AppendToBootClassPath(const DexFile& dex_file, Handle<mirror::DexCache> dex_cache)
431b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
432578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom
4335fe594f576225dd7d333835e39c448a71ea9b433Elliott Hughes  void ConstructFieldMap(const DexFile& dex_file, const DexFile::ClassDef& dex_class_def,
434ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                         mirror::Class* c, SafeMap<uint32_t, mirror::ArtField*>& field_map)
435b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
4365fe594f576225dd7d333835e39c448a71ea9b433Elliott Hughes
43798d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang  // Precomputes size needed for Class, in the case of a non-temporary class this size must be
43898d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang  // sufficient to hold all static fields.
43998d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang  uint32_t SizeOfClassWithoutEmbeddedTables(const DexFile& dex_file,
44098d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang                                            const DexFile::ClassDef& dex_class_def);
4414873d465a1eb6dfbdeddb085c81239d39db60c42Brian Carlstrom
442f615a61aef972cfc1dc23931ac2ed0da14c3fedbBrian Carlstrom  void LoadClass(const DexFile& dex_file,
443f615a61aef972cfc1dc23931ac2ed0da14c3fedbBrian Carlstrom                 const DexFile::ClassDef& dex_class_def,
4440cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                 Handle<mirror::Class> klass,
4452dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                 mirror::ClassLoader* class_loader)
446b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
447d3c5bebcb52a67cb06e7ab303eaf45f230c08b60Vladimir Marko  void LoadClassMembers(const DexFile& dex_file,
448d3c5bebcb52a67cb06e7ab303eaf45f230c08b60Vladimir Marko                        const byte* class_data,
4490cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                        Handle<mirror::Class> klass,
450d3c5bebcb52a67cb06e7ab303eaf45f230c08b60Vladimir Marko                        mirror::ClassLoader* class_loader,
451d3c5bebcb52a67cb06e7ab303eaf45f230c08b60Vladimir Marko                        const OatFile::OatClass* oat_class)
452d3c5bebcb52a67cb06e7ab303eaf45f230c08b60Vladimir Marko      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
453565f50731db360584d0080af7f14f0b7ca10371cCarl Shapiro
4542dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  void LoadField(const DexFile& dex_file, const ClassDataItemIterator& it,
4550cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                 Handle<mirror::Class> klass, Handle<mirror::ArtField> dst)
4562dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
457934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom
458ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  mirror::ArtMethod* LoadMethod(Thread* self, const DexFile& dex_file,
459ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                const ClassDataItemIterator& dex_method,
4600cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                                Handle<mirror::Class> klass)
4612dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
462934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom
4632dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  void FixupStaticTrampolines(mirror::Class* klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
4641984651929744dd603fd082e23eacd877b9bc177Ian Rogers
4659c290012b7f505ae1943ab87236f775b97a46e2dNicolas Geoffray  // Finds the associated oat class for a dex_file and descriptor. Returns whether the class
4669c290012b7f505ae1943ab87236f775b97a46e2dNicolas Geoffray  // was found, and sets the data in oat_class.
4679c290012b7f505ae1943ab87236f775b97a46e2dNicolas Geoffray  bool FindOatClass(const DexFile& dex_file, uint16_t class_def_idx, OatFile::OatClass* oat_class)
46833e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
469aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom
4700cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  void RegisterDexFileLocked(const DexFile& dex_file, Handle<mirror::DexCache> dex_cache)
47100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      EXCLUSIVE_LOCKS_REQUIRED(dex_lock_)
472b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
473e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi  bool IsDexFileRegisteredLocked(const DexFile& dex_file)
474b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers      SHARED_LOCKS_REQUIRED(dex_lock_, Locks::mutator_lock_);
475aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom
4760cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  bool InitializeClass(Handle<mirror::Class> klass, bool can_run_clinit,
477c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier                       bool can_init_parents)
478b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
4790cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  bool WaitForInitializeClass(Handle<mirror::Class> klass, Thread* self,
480c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier                              ObjectLock<mirror::Class>& lock);
4810cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  bool ValidateSuperClassDescriptors(Handle<mirror::Class> klass)
482b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
4830e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
4849837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers  bool IsSameDescriptorInDifferentClassContexts(Thread* self, const char* descriptor,
4850cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                                                Handle<mirror::ClassLoader> class_loader1,
4860cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                                                Handle<mirror::ClassLoader> class_loader2)
487b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
4880e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
4899837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers  bool IsSameMethodSignatureInDifferentClassContexts(Thread* self, mirror::ArtMethod* method,
490ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers                                                     mirror::Class* klass1,
491ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers                                                     mirror::Class* klass2)
492b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
4930e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
49498d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang  bool LinkClass(Thread* self, const char* descriptor, Handle<mirror::Class> klass,
49598d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang                 Handle<mirror::ObjectArray<mirror::Class>> interfaces,
49698d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang                 mirror::Class** new_class)
497b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
4980e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
4990cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  bool LinkSuperClass(Handle<mirror::Class> klass)
500b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
5010e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
5020cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  bool LoadSuperAndInterfaces(Handle<mirror::Class> klass, const DexFile& dex_file)
503b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
5040e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
505bfd9a4378eacaf2dc2bbe05ad48c5164fc93c9feMathieu Chartier  bool LinkMethods(Thread* self, Handle<mirror::Class> klass,
5060cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                   Handle<mirror::ObjectArray<mirror::Class>> interfaces)
507b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
5080e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
509bfd9a4378eacaf2dc2bbe05ad48c5164fc93c9feMathieu Chartier  bool LinkVirtualMethods(Thread* self, Handle<mirror::Class> klass)
510b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
5110e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
5120cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  bool LinkInterfaceMethods(Handle<mirror::Class> klass,
5130cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                            Handle<mirror::ObjectArray<mirror::Class>> interfaces)
514b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
5150e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
51698d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang  bool LinkStaticFields(Handle<mirror::Class> klass, size_t* class_size)
517b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
5180cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  bool LinkInstanceFields(Handle<mirror::Class> klass)
519b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
52098d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang  bool LinkFields(Handle<mirror::Class> klass, bool is_static, size_t* class_size)
521b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
5220cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  void LinkCode(Handle<mirror::ArtMethod> method, const OatFile::OatClass* oat_class,
523f0972a410a0665dbe32bd96df09a572d69f9f3a3Dmitry Petrochenko                const DexFile& dex_file, uint32_t dex_method_index, uint32_t method_index)
524f0972a410a0665dbe32bd96df09a572d69f9f3a3Dmitry Petrochenko      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
5250cfe1fb7060576d047f7f894fc0d8b87de84fcabIan Rogers
5260cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  void CreateReferenceInstanceOffsets(Handle<mirror::Class> klass)
527b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
5280cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  void CreateReferenceStaticOffsets(Handle<mirror::Class> klass)
529b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
5300cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  void CreateReferenceOffsets(Handle<mirror::Class> klass, bool is_static,
53100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers                              uint32_t reference_offsets)
532b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
5330e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
53458ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom  // For use by ImageWriter to find DexCaches for its roots
535e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi  ReaderWriterMutex* DexLock()
536e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) LOCK_RETURNED(dex_lock_) {
537e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi    return &dex_lock_;
53858ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom  }
539e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi  size_t GetDexCacheCount() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_, dex_lock_) {
540e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi    return dex_caches_.size();
541e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi  }
542e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi  mirror::DexCache* GetDexCache(size_t idx) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_, dex_lock_);
54358ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom
54400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  const OatFile* FindOpenedOatFileForDexFile(const DexFile& dex_file)
54533e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers      LOCKS_EXCLUDED(dex_lock_)
54633e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
547833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe
548833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  // Find an opened oat file that contains dex_location. If oat_location is not nullptr, the file
549833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  // must have that location, else any oat location is accepted.
550833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  const OatFile* FindOpenedOatFile(const char* oat_location, const char* dex_location,
551833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe                                   const uint32_t* const dex_location_checksum)
552719d1a33f6569864f529e5a3fff59e7bca97aad0Ian Rogers      LOCKS_EXCLUDED(dex_lock_);
553a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light
554a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light  // Will open the oat file directly without relocating, even if we could/should do relocation.
555a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light  const OatFile* FindOatFileFromOatLocation(const std::string& oat_location,
556a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light                                            std::string* error_msg)
557a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light      LOCKS_EXCLUDED(dex_lock_);
558a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light
55900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  const OatFile* FindOpenedOatFileFromOatLocation(const std::string& oat_location)
5608d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers      LOCKS_EXCLUDED(dex_lock_);
561833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe
562a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light  const OatFile* OpenOatFileFromDexLocation(const std::string& dex_location,
563a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light                                            InstructionSet isa,
564a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light                                            bool* already_opened,
565a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light                                            bool* obsolete_file_cleanup_failed,
566a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light                                            std::vector<std::string>* error_msg)
567a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light      LOCKS_EXCLUDED(dex_lock_, Locks::mutator_lock_);
568a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light
5690a112bbbcd761c749c346bfec0ec39c1ef37a590Alex Light  const OatFile* GetInterpretedOnlyOat(const std::string& oat_path,
5700a112bbbcd761c749c346bfec0ec39c1ef37a590Alex Light                                       InstructionSet isa,
5710a112bbbcd761c749c346bfec0ec39c1ef37a590Alex Light                                       std::string* error_msg);
5720a112bbbcd761c749c346bfec0ec39c1ef37a590Alex Light
573a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light  const OatFile* PatchAndRetrieveOat(const std::string& input, const std::string& output,
574a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light                                     const std::string& image_location, InstructionSet isa,
575a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light                                     std::string* error_msg)
576a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light      LOCKS_EXCLUDED(Locks::mutator_lock_);
577a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light
578a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light  bool CheckOatFile(const OatFile* oat_file, InstructionSet isa,
579a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light                    bool* checksum_verified, std::string* error_msg);
580a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light  int32_t GetRequiredDelta(const OatFile* oat_file, InstructionSet isa);
581a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light
582833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  // Note: will not register the oat file.
583833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  const OatFile* FindOatFileInOatLocationForDexFile(const char* dex_location,
584833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe                                                    uint32_t dex_location_checksum,
585833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe                                                    const char* oat_location,
586833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe                                                    std::string* error_msg)
5878d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers      LOCKS_EXCLUDED(dex_lock_);
588e3359f7ad7671c5816f17145ca3a01516512e8d6Ian Rogers
589833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  // Creates the oat file from the dex_location to the oat_location. Needs a file descriptor for
590833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  // the file to be written, which is assumed to be under a lock.
591833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  const OatFile* CreateOatFileForDexLocation(const char* dex_location,
592833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe                                             int fd, const char* oat_location,
593833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe                                             std::vector<std::string>* error_msgs)
594833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe      LOCKS_EXCLUDED(dex_lock_, Locks::mutator_lock_);
595833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe
596833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  // Finds an OatFile that contains a DexFile for the given a DexFile location.
597833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  //
598833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  // Note 1: this will not check open oat files, which are assumed to be stale when this is run.
599833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  // Note 2: Does not register the oat file. It is the caller's job to register if the file is to
600833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  //         be kept.
601833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  const OatFile* FindOatFileContainingDexFileFromDexLocation(const char* location,
602833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe                                                             const uint32_t* const location_checksum,
603833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe                                                             InstructionSet isa,
604c54aea7f4acd1a32bb298d43c20e3e0217638926Calin Juravle                                                             std::vector<std::string>* error_msgs,
605c54aea7f4acd1a32bb298d43c20e3e0217638926Calin Juravle                                                             bool* obsolete_file_cleanup_failed)
606833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe      LOCKS_EXCLUDED(dex_lock_, Locks::mutator_lock_);
607833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe
608a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light  // verify an oat file with the given dex file. Will return false when the dex file could not be
609a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light  // verified. Will return true otherwise.
610a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light  bool VerifyOatWithDexFile(const OatFile* oat_file, const char* dex_location,
611a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light                            std::string* error_msg);
612fad714344ca81a21e775ef45ae09d9a035723cafBrian Carlstrom
6130cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  mirror::ArtMethod* CreateProxyConstructor(Thread* self, Handle<mirror::Class> klass,
614ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                            mirror::Class* proxy_class)
615b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
6160cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  mirror::ArtMethod* CreateProxyMethod(Thread* self, Handle<mirror::Class> klass,
6170cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                                       Handle<mirror::ArtMethod> prototype)
618b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
61995caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson
6204a96b60e45fba4a9d4a2e9c8fc849660eacef684Brian Carlstrom  std::vector<const DexFile*> boot_class_path_;
621578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom
6221bf8d4dbe5cb9891e8a1125ff1928b544efc243aIan Rogers  mutable ReaderWriterMutex dex_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER;
623893263b7d5bc2ca43a91ecb8071867f5134fc60aMathieu Chartier  std::vector<size_t> new_dex_cache_roots_ GUARDED_BY(dex_lock_);;
62494f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi  std::vector<GcRoot<mirror::DexCache>> dex_caches_ GUARDED_BY(dex_lock_);
625f8349361a16a4e2796efe9f3586b994e8d4834e4Elliott Hughes  std::vector<const OatFile*> oat_files_ GUARDED_BY(dex_lock_);
62647d237a4b1a41772005c60083e72fe75c0aa0743Brian Carlstrom
6270e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
628aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom  // multimap from a string hash code of a class descriptor to
6292dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  // mirror::Class* instances. Results should be compared for a matching
6309cff8e13d41825c4f3f0127af061e94b06114fc8Brian Carlstrom  // Class::descriptor_ and Class::class_loader_.
6315369c40f75fdcb1be7a7c06db212ce965c83a164Mathieu Chartier  typedef AllocationTrackingMultiMap<size_t, GcRoot<mirror::Class>, kAllocatorTagClassTable> Table;
632a91a4bc1f8960f64c5f7e4616d46e21b8e1bfba2Hiroshi Yamauchi  // This contains strong roots. To enable concurrent root scanning of
633a91a4bc1f8960f64c5f7e4616d46e21b8e1bfba2Hiroshi Yamauchi  // the class table, be careful to use a read barrier when accessing this.
6347dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers  Table class_table_ GUARDED_BY(Locks::classlinker_classes_lock_);
63594f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi  std::vector<std::pair<size_t, GcRoot<mirror::Class>>> new_class_roots_;
6367dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers
6377dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers  // Do we need to search dex caches to find image classes?
6387dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers  bool dex_cache_image_class_lookup_required_;
6397dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers  // Number of times we've searched dex caches for a class. After a certain number of misses we move
6407dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers  // the classes into the class_table_ to avoid dex cache based searches.
6417dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers  AtomicInteger failed_dex_cache_class_lookups_;
642f8349361a16a4e2796efe9f3586b994e8d4834e4Elliott Hughes
6437dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers  mirror::Class* LookupClassFromTableLocked(const char* descriptor,
6447dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers                                            const mirror::ClassLoader* class_loader,
6457dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers                                            size_t hash)
6467dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::classlinker_classes_lock_, Locks::mutator_lock_);
6477dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers
64898d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang  mirror::Class* UpdateClass(const char* descriptor, mirror::Class* klass, size_t hash)
64998d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
65098d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
65198d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang
6527dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers  void MoveImageClassesToClassTable() LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
6537dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
6547dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers  mirror::Class* LookupClassFromImage(const char* descriptor)
6557dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
6560e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
65798d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang  // EnsureResolved is called to make sure that a class in the class_table_ has been resolved
65898d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang  // before returning it to the caller. Its the responsibility of the thread that placed the class
65998d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang  // in the table to make it resolved. The thread doing resolution must notify on the class' lock
66098d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang  // when resolution has occurred. This happens in mirror::Class::SetStatus. As resolution may
66198d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang  // retire a class, the version of the class in the table is returned and this may differ from
66298d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang  // the class passed in.
66398d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang  mirror::Class* EnsureResolved(Thread* self, const char* descriptor, mirror::Class* klass)
6644c13a3ff475f206c4d0a86ee2595c45392fd942fMathieu Chartier      WARN_UNUSED SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
66598d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang
66698d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang  void FixupTemporaryDeclaringClass(mirror::Class* temp_class, mirror::Class* new_class)
66798d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
66898d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang
669a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom  // indexes into class_roots_.
670a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom  // needs to be kept in sync with class_roots_descriptors_.
67174eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom  enum ClassRoot {
67275cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom    kJavaLangClass,
67375cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom    kJavaLangObject,
674418d20fc407052d4152157f61e7453359f902383Elliott Hughes    kClassArrayClass,
67574eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom    kObjectArrayClass,
67674eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom    kJavaLangString,
67766f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier    kJavaLangDexCache,
678bf61ba3dcd9d9895b86a05e88762ff034b09b263Elliott Hughes    kJavaLangRefReference,
679ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom    kJavaLangReflectArtField,
680ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom    kJavaLangReflectArtMethod,
681466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    kJavaLangReflectProxy,
68266f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier    kJavaLangStringArrayClass,
683ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom    kJavaLangReflectArtFieldArrayClass,
684ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom    kJavaLangReflectArtMethodArrayClass,
68574eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom    kJavaLangClassLoader,
6865167c97a4f672ba821453418e3943988fabbfc43Ian Rogers    kJavaLangThrowable,
6878cd6ddaeb78cc904e13bac88753654a04b2e15b8jeffhao    kJavaLangClassNotFoundException,
68855df06be4369f5d8ab5eb61a5d22809255171036Shih-wei Liao    kJavaLangStackTraceElement,
68975cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom    kPrimitiveBoolean,
690d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes    kPrimitiveByte,
69175cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom    kPrimitiveChar,
69275cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom    kPrimitiveDouble,
693d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes    kPrimitiveFloat,
69475cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom    kPrimitiveInt,
69575cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom    kPrimitiveLong,
696d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes    kPrimitiveShort,
69775cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom    kPrimitiveVoid,
698d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes    kBooleanArrayClass,
699d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes    kByteArrayClass,
700d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes    kCharArrayClass,
701d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes    kDoubleArrayClass,
702d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes    kFloatArrayClass,
703d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes    kIntArrayClass,
704d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes    kLongArrayClass,
705d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes    kShortArrayClass,
70655df06be4369f5d8ab5eb61a5d22809255171036Shih-wei Liao    kJavaLangStackTraceElementArrayClass,
70775cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom    kClassRootsMax,
70875cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom  };
70994f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi  GcRoot<mirror::ObjectArray<mirror::Class>> class_roots_;
710913af1bd90a6e8fd56f1f851db1f098636dae6a5Brian Carlstrom
7112dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::Class* GetClassRoot(ClassRoot class_root) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
71274eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom
7132dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  void SetClassRoot(ClassRoot class_root, mirror::Class* klass)
714b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
715a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom
716418d20fc407052d4152157f61e7453359f902383Elliott Hughes  static const char* class_roots_descriptors_[];
717a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom
718a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom  const char* GetClassRootDescriptor(ClassRoot class_root) {
719a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom    const char* descriptor = class_roots_descriptors_[class_root];
720a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom    CHECK(descriptor != NULL);
721a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom    return descriptor;
722a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom  }
723a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom
7249837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers  // The interface table used by all arrays.
72594f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi  GcRoot<mirror::IfTable> array_iftable_;
726565f50731db360584d0080af7f14f0b7ca10371cCarl Shapiro
7279837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers  // A cache of the last FindArrayClass results. The cache serves to avoid creating array class
7289837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers  // descriptors for the sake of performing FindClass.
7299837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers  static constexpr size_t kFindArrayCacheSize = 16;
73094f7b49578b6aaa80de8ffed230648d601393905Hiroshi Yamauchi  GcRoot<mirror::Class> find_array_class_cache_[kFindArrayCacheSize];
7319837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers  size_t find_array_class_cache_next_victim_;
7329837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers
73375cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom  bool init_done_;
734893263b7d5bc2ca43a91ecb8071867f5134fc60aMathieu Chartier  bool log_new_dex_caches_roots_ GUARDED_BY(dex_lock_);
735893263b7d5bc2ca43a91ecb8071867f5134fc60aMathieu Chartier  bool log_new_class_table_roots_ GUARDED_BY(Locks::classlinker_classes_lock_);
73675cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom
737cf4c6c41b0084dc4567ff709fb8ce9ebd72b26acElliott Hughes  InternTable* intern_table_;
738cf4c6c41b0084dc4567ff709fb8ce9ebd72b26acElliott Hughes
73998d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang  // Trampolines within the image the bounce to runtime entrypoints. Done so that there is a single
74098d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang  // patch point within the image. TODO: make these proper relocations.
7410aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao  const void* portable_resolution_trampoline_;
7420aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao  const void* quick_resolution_trampoline_;
74388474b416eb257078e590bf9bc7957cee604a186Jeff Hao  const void* portable_imt_conflict_trampoline_;
74488474b416eb257078e590bf9bc7957cee604a186Jeff Hao  const void* quick_imt_conflict_trampoline_;
7452da882315a61072664f7ce3c212307342e907207Andreas Gampe  const void* quick_generic_jni_trampoline_;
7468a630577ed2d9e9571c3434c505e5de223b23c07Vladimir Marko  const void* quick_to_interpreter_bridge_trampoline_;
7470aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao
748ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom  friend class ImageWriter;  // for GetClassRoots
749a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light  friend class ImageDumper;  // for FindOpenedOatFileFromOatLocation
750a59dd80f9f48cb750d329d4d4af2d99d72b484d1Alex Light  friend class ElfPatcher;  // for FindOpenedOatFileForDexFile & FindOpenedOatFileFromOatLocation
7519c290012b7f505ae1943ab87236f775b97a46e2dNicolas Geoffray  friend class NoDex2OatTest;  // for FindOpenedOatFileForDexFile
7520a112bbbcd761c749c346bfec0ec39c1ef37a590Alex Light  friend class NoPatchoatTest;  // for FindOpenedOatFileForDexFile
7536d4d9fcb4f01e287ee29e81cd1c941ee5d11d379Ian Rogers  FRIEND_TEST(ClassLinkerTest, ClassRootDescriptors);
7542dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  FRIEND_TEST(mirror::DexCacheTest, Open);
7551a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao  FRIEND_TEST(ExceptionTest, FindExceptionHandler);
756ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom  FRIEND_TEST(ObjectTest, AllocObjectArray);
7570e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  DISALLOW_COPY_AND_ASSIGN(ClassLinker);
7580e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro};
7590e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
7600e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro}  // namespace art
7610e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
762fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif  // ART_RUNTIME_CLASS_LINKER_H_
763