class_linker.h revision e9e3e697f0c426132bee10aaa6aee9107d2d7dc6
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"
27e5448b5a12003b405b22cde3b94f962ab4888a87Elliott Hughes#include "gtest/gtest.h"
28590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier#include "jni.h"
2958ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom#include "oat_file.h"
3083c8ee000d525017ead8753fce6bc1020249b96aMathieu Chartier#include "object_callbacks.h"
31e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi#include "read_barrier.h"
320e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
330e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapironamespace art {
341d54e73444e017d3a65234e0f193846f3e27472bIan Rogersnamespace gc {
351d54e73444e017d3a65234e0f193846f3e27472bIan Rogersnamespace space {
361d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  class ImageSpace;
371d54e73444e017d3a65234e0f193846f3e27472bIan Rogers}  // namespace space
381d54e73444e017d3a65234e0f193846f3e27472bIan Rogers}  // namespace gc
392dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersnamespace mirror {
4033e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers  class ClassLoader;
4133e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers  class DexCache;
4233e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers  class DexCacheTest_Open_Test;
4333e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers  class IfTable;
4433e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers  template<class T> class ObjectArray;
4533e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers  class StackTraceElement;
4633e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers}  // namespace mirror
471d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
48cf4c6c41b0084dc4567ff709fb8ce9ebd72b26acElliott Hughesclass InternTable;
49c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartiertemplate<class T> class ObjectLock;
502b7c4d196c8abe32f4ca633534917da9de53c359Mathieu Chartierclass ScopedObjectAccessAlreadyRunnable;
51eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartiertemplate<class T> class Handle;
52cf4c6c41b0084dc4567ff709fb8ce9ebd72b26acElliott Hughes
532dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogerstypedef bool (ClassVisitor)(mirror::Class* c, void* arg);
54a215526d5c789cbef0f81a1f9aba22541a841ccaElliott Hughes
55893263b7d5bc2ca43a91ecb8071867f5134fc60aMathieu Chartierenum VisitRootFlags : uint8_t;
56893263b7d5bc2ca43a91ecb8071867f5134fc60aMathieu Chartier
570e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiroclass ClassLinker {
580e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro public:
5988474b416eb257078e590bf9bc7957cee604a186Jeff Hao  // Interface method table size. Increasing this value reduces the chance of two interface methods
6088474b416eb257078e590bf9bc7957cee604a186Jeff Hao  // colliding in the interface method table but increases the size of classes that implement
6188474b416eb257078e590bf9bc7957cee604a186Jeff Hao  // (non-marker) interfaces.
6288474b416eb257078e590bf9bc7957cee604a186Jeff Hao  static constexpr size_t kImtSize = 64;
6388474b416eb257078e590bf9bc7957cee604a186Jeff Hao
64590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier  explicit ClassLinker(InternTable* intern_table);
65590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier  ~ClassLinker();
6658ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom
67590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier  // Initialize class linker by bootstraping from dex files
68590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier  void InitFromCompiler(const std::vector<const DexFile*>& boot_class_path)
69b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
709ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom
71590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier  // Initialize class linker from one or more images.
72590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier  void InitFromImage() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
73565f50731db360584d0080af7f14f0b7ca10371cCarl Shapiro
74be7149fc2e7cc607937209f2819e3c1d672e2668Ian Rogers  bool IsInBootClassPath(const char* descriptor);
75be7149fc2e7cc607937209f2819e3c1d672e2668Ian Rogers
7664bf5a33d55aa779ef452552a466943002d39e4fElliott Hughes  // Finds a class by its descriptor, loading it if necessary.
7774eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom  // If class_loader is null, searches boot_class_path_.
789837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers  mirror::Class* FindClass(Thread* self, const char* descriptor,
790cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                           Handle<mirror::ClassLoader> class_loader)
80b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
81aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom
829837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers  // Finds a class by its descriptor using the "system" class loader, ie by searching the
839837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers  // boot_class_path_.
849837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers  mirror::Class* FindSystemClass(Thread* self, const char* descriptor)
859837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
869837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers
879837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers  // Finds the array class given for the element class.
88b74cd29802f364b4cec88f4913fa38ade26b8fabMathieu Chartier  mirror::Class* FindArrayClass(Thread* self, mirror::Class** element_class)
89b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
90aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom
91590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier  // Reutrns true if the class linker is initialized.
92590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier  bool IsInitialized() const;
93590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier
94aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom  // Define a new a class based on a ClassDef from a DexFile
95c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier  mirror::Class* DefineClass(const char* descriptor,
960cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                             Handle<mirror::ClassLoader> class_loader,
972dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                             const DexFile& dex_file, const DexFile::ClassDef& dex_class_def)
98b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
9964bf5a33d55aa779ef452552a466943002d39e4fElliott Hughes
10064bf5a33d55aa779ef452552a466943002d39e4fElliott Hughes  // Finds a class by its descriptor, returning NULL if it isn't wasn't loaded
10164bf5a33d55aa779ef452552a466943002d39e4fElliott Hughes  // by the given 'class_loader'.
1022dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::Class* LookupClass(const char* descriptor, const mirror::ClassLoader* class_loader)
103b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
104b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
1050e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
1066fa602d614d418f38afebb4d44f42e7dc0b4bd94Elliott Hughes  // Finds all the classes with the given descriptor, regardless of ClassLoader.
1072dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  void LookupClasses(const char* descriptor, std::vector<mirror::Class*>& classes)
108b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
109b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
1106fa602d614d418f38afebb4d44f42e7dc0b4bd94Elliott Hughes
1112dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::Class* FindPrimitiveClass(char type) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
112d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes
113ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom  // General class unloading is not supported, this is used to prune
114ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom  // unwanted classes during image writing.
1152dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  bool RemoveClass(const char* descriptor, const mirror::ClassLoader* class_loader)
116b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
117b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
118ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom
1197dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers  void DumpAllClasses(int flags)
120b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
121b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
1229d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes
1237dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers  void DumpForSigQuit(std::ostream& os)
1247dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
1257dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
126cac6cc72c3331257fa6437b36a131e5d551e2f3cElliott Hughes
1277dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers  size_t NumLoadedClasses()
1287dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
1297dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
130e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes
131b63ec393a5c4ba2be1d34dd871cda811eaa803c7Brian Carlstrom  // Resolve a String with the given index from the DexFile, storing the
132aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom  // result in the DexCache. The referrer is used to identify the
133aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom  // target DexCache and ClassLoader to use for resolution.
134ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers  mirror::String* ResolveString(uint32_t string_idx, mirror::ArtMethod* referrer)
1352dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
136aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom
137aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom  // Resolve a String with the given index from the DexFile, storing the
1389ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // result in the DexCache.
1392dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::String* ResolveString(const DexFile& dex_file, uint32_t string_idx,
1400cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                                Handle<mirror::DexCache> dex_cache)
141b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
1429ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom
143b63ec393a5c4ba2be1d34dd871cda811eaa803c7Brian Carlstrom  // Resolve a Type with the given index from the DexFile, storing the
1449ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // result in the DexCache. The referrer is used to identity the
1459ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // target DexCache and ClassLoader to use for resolution.
146ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers  mirror::Class* ResolveType(const DexFile& dex_file, uint16_t type_idx, mirror::Class* referrer)
147590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
1489ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom
149b63ec393a5c4ba2be1d34dd871cda811eaa803c7Brian Carlstrom  // Resolve a Type with the given index from the DexFile, storing the
1500cfe1fb7060576d047f7f894fc0d8b87de84fcabIan Rogers  // result in the DexCache. The referrer is used to identify the
151b63ec393a5c4ba2be1d34dd871cda811eaa803c7Brian Carlstrom  // target DexCache and ClassLoader to use for resolution.
152ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers  mirror::Class* ResolveType(uint16_t type_idx, mirror::ArtMethod* referrer)
1532dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
1540cfe1fb7060576d047f7f894fc0d8b87de84fcabIan Rogers
155ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers  mirror::Class* ResolveType(uint16_t type_idx, mirror::ArtField* referrer)
1562dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
157b63ec393a5c4ba2be1d34dd871cda811eaa803c7Brian Carlstrom
1589ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // Resolve a type with the given ID from the DexFile, storing the
1599ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // result in DexCache. The ClassLoader is used to search for the
1609ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // type, since it may be referenced from but not contained within
1619ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // the given DexFile.
162590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier  mirror::Class* ResolveType(const DexFile& dex_file, uint16_t type_idx,
1630cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                             Handle<mirror::DexCache> dex_cache,
1640cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                             Handle<mirror::ClassLoader> class_loader)
165b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
1669ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom
1679ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // Resolve a method with a given ID from the DexFile, storing the
1689ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // result in DexCache. The ClassLinker and ClassLoader are used as
1699ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // in ResolveType. What is unique is the method type argument which
1709ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // is used to determine if this method is a direct, static, or
1719ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // virtual method.
172ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  mirror::ArtMethod* ResolveMethod(const DexFile& dex_file,
173ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                   uint32_t method_idx,
1740cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                                   Handle<mirror::DexCache> dex_cache,
1750cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                                   Handle<mirror::ClassLoader> class_loader,
1760cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                                   Handle<mirror::ArtMethod> referrer,
177ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                   InvokeType type)
178b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
1799ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom
1800cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  mirror::ArtMethod* GetResolvedMethod(uint32_t method_idx, mirror::ArtMethod* referrer,
1810cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                                       InvokeType type)
1820cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
1830cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  mirror::ArtMethod* ResolveMethod(Thread* self, uint32_t method_idx, mirror::ArtMethod** referrer,
184ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                   InvokeType type)
1852dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
186161928613d3f097108319de60494fab1aab8d48aBrian Carlstrom
1870cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  mirror::ArtField* GetResolvedField(uint32_t field_idx, mirror::Class* field_declaring_class)
1880cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
189ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers  mirror::ArtField* ResolveField(uint32_t field_idx, mirror::ArtMethod* referrer,
190ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                 bool is_static)
1912dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
192b9edb841423dfe60e193fcffd25994398c91baa2Brian Carlstrom
193161928613d3f097108319de60494fab1aab8d48aBrian Carlstrom  // Resolve a field with a given ID from the DexFile, storing the
1949ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // result in DexCache. The ClassLinker and ClassLoader are used as
1959ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // in ResolveType. What is unique is the is_static argument which is
1969ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // used to determine if we are resolving a static or non-static
1979ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // field.
198ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  mirror::ArtField* ResolveField(const DexFile& dex_file,
199ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                 uint32_t field_idx,
2000cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                                 Handle<mirror::DexCache> dex_cache,
2010cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                                 Handle<mirror::ClassLoader> class_loader,
202ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                 bool is_static)
203b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
2049ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom
205b067ac2fe225c76fc9eb9434ef62cbb797bfa425Ian Rogers  // Resolve a field with a given ID from the DexFile, storing the
206b067ac2fe225c76fc9eb9434ef62cbb797bfa425Ian Rogers  // result in DexCache. The ClassLinker and ClassLoader are used as
207b067ac2fe225c76fc9eb9434ef62cbb797bfa425Ian Rogers  // in ResolveType. No is_static argument is provided so that Java
208b067ac2fe225c76fc9eb9434ef62cbb797bfa425Ian Rogers  // field resolution semantics are followed.
2090cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  mirror::ArtField* ResolveFieldJLS(const DexFile& dex_file, uint32_t field_idx,
2100cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                                    Handle<mirror::DexCache> dex_cache,
2110cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                                    Handle<mirror::ClassLoader> class_loader)
212b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
213b067ac2fe225c76fc9eb9434ef62cbb797bfa425Ian Rogers
214ad25ac568407ceb14334e8551dd1c4dd0fd6993cIan Rogers  // Get shorty from method index without resolution. Used to do handlerization.
215ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  const char* MethodShorty(uint32_t method_idx, mirror::ArtMethod* referrer, uint32_t* length)
216b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
217ad25ac568407ceb14334e8551dd1c4dd0fd6993cIan Rogers
218f4c21c9f6440c3980c47a297519f758796dbc039Elliott Hughes  // Returns true on success, false if there's an exception pending.
21925c3325bf95036bf325fc7cb21b4fd6d40282857Brian Carlstrom  // can_run_clinit=false allows the compiler to attempt to init a class,
22025c3325bf95036bf325fc7cb21b4fd6d40282857Brian Carlstrom  // given the restriction that no <clinit> execution is possible.
2210cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  bool EnsureInitialized(Handle<mirror::Class> c, bool can_init_fields, bool can_init_parents)
222b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
2230e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
2242a20cfd0b7fc81099f5de0da782ebcc1cb262792Elliott Hughes  // Initializes classes that have instances in the image but that have
2252a20cfd0b7fc81099f5de0da782ebcc1cb262792Elliott Hughes  // <clinit> methods so they could not be initialized by the compiler.
226b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers  void RunRootClinits() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
2272a20cfd0b7fc81099f5de0da782ebcc1cb262792Elliott Hughes
22800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  void RegisterDexFile(const DexFile& dex_file)
22900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      LOCKS_EXCLUDED(dex_lock_)
230b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
2310cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  void RegisterDexFile(const DexFile& dex_file, Handle<mirror::DexCache> dex_cache)
23200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      LOCKS_EXCLUDED(dex_lock_)
233b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
2340e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
2358d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers  const OatFile* RegisterOatFile(const OatFile* oat_file)
23600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      LOCKS_EXCLUDED(dex_lock_);
237866c8627626b7c47fb69b498b341772d7dfa7f60Brian Carlstrom
2388a48741b96ca9cc5835cac72ac133c4ca480930fBrian Carlstrom  const std::vector<const DexFile*>& GetBootClassPath() {
2398a48741b96ca9cc5835cac72ac133c4ca480930fBrian Carlstrom    return boot_class_path_;
2408a48741b96ca9cc5835cac72ac133c4ca480930fBrian Carlstrom  }
2418a48741b96ca9cc5835cac72ac133c4ca480930fBrian Carlstrom
2427dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers  void VisitClasses(ClassVisitor* visitor, void* arg)
2437dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers      LOCKS_EXCLUDED(dex_lock_)
2447dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
24500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  // Less efficient variant of VisitClasses that doesn't hold the classlinker_classes_lock_
24600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  // when calling the visitor.
2477dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers  void VisitClassesWithoutClassesLock(ClassVisitor* visitor, void* arg)
2487dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers      LOCKS_EXCLUDED(dex_lock_)
2497dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
25000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers
25152e4b43d62896b56f8c2bd041e528472bb4a0d8dMathieu Chartier  void VisitClassRoots(RootCallback* callback, void* arg, VisitRootFlags flags)
25252e4b43d62896b56f8c2bd041e528472bb4a0d8dMathieu Chartier      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_);
253893263b7d5bc2ca43a91ecb8071867f5134fc60aMathieu Chartier  void VisitRoots(RootCallback* callback, void* arg, VisitRootFlags flags)
25452e4b43d62896b56f8c2bd041e528472bb4a0d8dMathieu Chartier      LOCKS_EXCLUDED(dex_lock_);
25500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers
256e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi  mirror::DexCache* FindDexCache(const DexFile& dex_file)
25700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      LOCKS_EXCLUDED(dex_lock_)
258b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
259e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi  bool IsDexFileRegistered(const DexFile& dex_file)
260b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers      LOCKS_EXCLUDED(dex_lock_) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
261e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi  void FixupDexCaches(mirror::ArtMethod* resolution_method)
26200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      LOCKS_EXCLUDED(dex_lock_)
263b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
2641d9f52b7ca91c6d30b7acfac1c9ab24d93fff470Brian Carlstrom
265262bf46ddc91e5b4fbd367127ff21a1877d939f2jeffhao  // Generate an oat file from a dex file
2668d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers  bool GenerateOatFile(const char* dex_filename,
267d601af8d9549ca95a911afb2fc67c4e562da661fBrian Carlstrom                       int oat_fd,
26860836d5a9bcf8b30984aae4279a4f6233b0bf622Vladimir Marko                       const char* oat_cache_filename,
269719d1a33f6569864f529e5a3fff59e7bca97aad0Ian Rogers                       std::string* error_msg)
2708d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers      LOCKS_EXCLUDED(Locks::mutator_lock_);
271262bf46ddc91e5b4fbd367127ff21a1877d939f2jeffhao
2728d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers  const OatFile* FindOatFileFromOatLocation(const std::string& location,
2738d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers                                            std::string* error_msg)
27400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      LOCKS_EXCLUDED(dex_lock_);
27500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers
2765b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom  // Finds the oat file for a dex location, generating the oat file if
2775b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom  // it is missing or out of date. Returns the DexFile from within the
2785b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom  // created oat file.
2798d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers  const DexFile* FindOrCreateOatFileForDexLocation(const char* dex_location,
280756ee4e090bc1e1812b41fb7b4661df601a32ef9Brian Carlstrom                                                   uint32_t dex_location_checksum,
2818d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers                                                   const char* oat_location,
282329d18806792771dfee064203fe27875d79cd53aAndreas Gampe                                                   std::vector<std::string>* error_msgs)
2838d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers      LOCKS_EXCLUDED(dex_lock_, Locks::mutator_lock_);
2845b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom  // Find a DexFile within an OatFile given a DexFile location. Note
2855b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom  // that this returns null if the location checksum of the DexFile
2865b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom  // does not match the OatFile.
2878d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers  const DexFile* FindDexFileInOatFileFromDexLocation(const char* location,
28808cbf66dc4632913f80f8ac18082c39b7d52c7ddBrian Carlstrom                                                     const uint32_t* const location_checksum,
2890e12bdc49744eb6d5c29b9611a8dbe10bac4cd53Brian Carlstrom                                                     InstructionSet isa,
290329d18806792771dfee064203fe27875d79cd53aAndreas Gampe                                                     std::vector<std::string>* error_msgs)
2918d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers      LOCKS_EXCLUDED(dex_lock_, Locks::mutator_lock_);
2925b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom
293f6174e8a1566bb357e82506f7ec97dc359c90eb2jeffhao
29428db0129e5d7ef642cf8845c86c0e11832817085Brian Carlstrom  // Returns true if oat file contains the dex file with the given location and checksum.
295afe25515c358617321d69ab4f25003e3d905d613Brian Carlstrom  static bool VerifyOatFileChecksums(const OatFile* oat_file,
2968d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers                                     const char* dex_location,
2978d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers                                     uint32_t dex_location_checksum,
2982afe49450f2e018f18b5de45428b9174bfd6f196Brian Carlstrom                                     InstructionSet instruction_set,
2998d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers                                     std::string* error_msg);
300afe25515c358617321d69ab4f25003e3d905d613Brian Carlstrom
301418d20fc407052d4152157f61e7453359f902383Elliott Hughes  // TODO: replace this with multiple methods that allocate the correct managed type.
3024417536522fd2a9d8215d8672331984769c9520bShih-wei Liao  template <class T>
3032dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::ObjectArray<T>* AllocObjectArray(Thread* self, size_t length)
3042dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
3054417536522fd2a9d8215d8672331984769c9520bShih-wei Liao
3062dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::ObjectArray<mirror::Class>* AllocClassArray(Thread* self, size_t length)
3072dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
308418d20fc407052d4152157f61e7453359f902383Elliott Hughes
3092dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::ObjectArray<mirror::String>* AllocStringArray(Thread* self, size_t length)
3102dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
31166f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier
312ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  mirror::ObjectArray<mirror::ArtMethod>* AllocArtMethodArray(Thread* self, size_t length)
3132dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
3144445a7e3398a6143939168097a3aa275b734504dIan Rogers
3152dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::IfTable* AllocIfTable(Thread* self, size_t ifcount)
3162dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
31723435d0df17e19fe312a08ff151464d4b9f83e81Ian Rogers
318ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  mirror::ObjectArray<mirror::ArtField>* AllocArtFieldArray(Thread* self, size_t length)
3192dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
32066f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier
3212dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::ObjectArray<mirror::StackTraceElement>* AllocStackTraceElementArray(Thread* self,
3222dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                                                                              size_t length)
323b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
32455df06be4369f5d8ab5eb61a5d22809255171036Shih-wei Liao
3250cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  void VerifyClass(Handle<mirror::Class> klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
3262dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  bool VerifyClassUsingOatFile(const DexFile& dex_file, mirror::Class* klass,
3272dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                               mirror::Class::Status& oat_file_class_status)
328b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
329c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier  void ResolveClassExceptionHandlerTypes(const DexFile& dex_file,
3300cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                                         Handle<mirror::Class> klass)
331b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
332ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  void ResolveMethodExceptionHandlerTypes(const DexFile& dex_file, mirror::ArtMethod* klass)
333b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
33498eacac683b78e60799323e8c7d59e7214808639jeffhao
3352b7c4d196c8abe32f4ca633534917da9de53c359Mathieu Chartier  mirror::Class* CreateProxyClass(ScopedObjectAccessAlreadyRunnable& soa, jstring name,
3362b7c4d196c8abe32f4ca633534917da9de53c359Mathieu Chartier                                  jobjectArray interfaces, jobject loader, jobjectArray methods,
3372b7c4d196c8abe32f4ca633534917da9de53c359Mathieu Chartier                                  jobjectArray throws)
338b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
339ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers  std::string GetDescriptorForProxy(mirror::Class* proxy_class)
340b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
341ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers  mirror::ArtMethod* FindMethodForProxy(mirror::Class* proxy_class,
342ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers                                        mirror::ArtMethod* proxy_method)
34300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      LOCKS_EXCLUDED(dex_lock_)
344b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
34595caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson
3461984651929744dd603fd082e23eacd877b9bc177Ian Rogers  // Get the oat code for a method when its class isn't yet initialized
347ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers  const void* GetQuickOatCodeFor(mirror::ArtMethod* method)
348ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
349ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers  const void* GetPortableOatCodeFor(mirror::ArtMethod* method, bool* have_portable_code)
350b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
3511984651929744dd603fd082e23eacd877b9bc177Ian Rogers
352e35517ad40e0713df8420aeb5d3540f146a59f62Mathieu Chartier  // Get the oat code for a method from a method index.
353ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers  const void* GetQuickOatCodeFor(const DexFile& dex_file, uint16_t class_def_idx, uint32_t method_idx)
354ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
355ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers  const void* GetPortableOatCodeFor(const DexFile& dex_file, uint16_t class_def_idx, uint32_t method_idx)
35633e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
357e35517ad40e0713df8420aeb5d3540f146a59f62Mathieu Chartier
3587934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom  pid_t GetClassesLockOwner();  // For SignalCatcher.
3597934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom  pid_t GetDexLockOwner();  // For SignalCatcher.
36024a3c2e9924e8765c4a9b4d383cb8f3b922f9c9fBrian Carlstrom
3610aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao  const void* GetPortableResolutionTrampoline() const {
3620aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao    return portable_resolution_trampoline_;
3630aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao  }
3640aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao
3652da882315a61072664f7ce3c212307342e907207Andreas Gampe  const void* GetQuickGenericJniTrampoline() const {
366f0972a410a0665dbe32bd96df09a572d69f9f3a3Dmitry Petrochenko    return quick_generic_jni_trampoline_;
367f0972a410a0665dbe32bd96df09a572d69f9f3a3Dmitry Petrochenko  }
3682da882315a61072664f7ce3c212307342e907207Andreas Gampe
3690aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao  const void* GetQuickResolutionTrampoline() const {
3700aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao    return quick_resolution_trampoline_;
3710aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao  }
3720aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao
37388474b416eb257078e590bf9bc7957cee604a186Jeff Hao  const void* GetPortableImtConflictTrampoline() const {
37488474b416eb257078e590bf9bc7957cee604a186Jeff Hao    return portable_imt_conflict_trampoline_;
37588474b416eb257078e590bf9bc7957cee604a186Jeff Hao  }
37688474b416eb257078e590bf9bc7957cee604a186Jeff Hao
37788474b416eb257078e590bf9bc7957cee604a186Jeff Hao  const void* GetQuickImtConflictTrampoline() const {
37888474b416eb257078e590bf9bc7957cee604a186Jeff Hao    return quick_imt_conflict_trampoline_;
37988474b416eb257078e590bf9bc7957cee604a186Jeff Hao  }
38088474b416eb257078e590bf9bc7957cee604a186Jeff Hao
3818a630577ed2d9e9571c3434c505e5de223b23c07Vladimir Marko  const void* GetQuickToInterpreterBridgeTrampoline() const {
3828a630577ed2d9e9571c3434c505e5de223b23c07Vladimir Marko    return quick_to_interpreter_bridge_trampoline_;
3838a630577ed2d9e9571c3434c505e5de223b23c07Vladimir Marko  }
3848a630577ed2d9e9571c3434c505e5de223b23c07Vladimir Marko
38588474b416eb257078e590bf9bc7957cee604a186Jeff Hao  InternTable* GetInternTable() const {
38688474b416eb257078e590bf9bc7957cee604a186Jeff Hao    return intern_table_;
38788474b416eb257078e590bf9bc7957cee604a186Jeff Hao  }
38888474b416eb257078e590bf9bc7957cee604a186Jeff Hao
389848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  // Attempts to insert a class into a class table.  Returns NULL if
390848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  // the class was inserted, otherwise returns an existing class with
391848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  // the same descriptor and ClassLoader.
3927dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers  mirror::Class* InsertClass(const char* descriptor, mirror::Class* klass, size_t hash)
393848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
394848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
395848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers
396590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier  // Special code to allocate an art method, use this instead of class->AllocObject.
397590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier  mirror::ArtMethod* AllocArtMethod(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
39861e019d291583029c01b61b93bea750f2b663c37Carl Shapiro
399590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier private:
400ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers  const OatFile::OatMethod GetOatMethodFor(mirror::ArtMethod* method)
401b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
4028532191c4fc8e005f7d432fec40fd9f2936275c6TDYa
40356d947fbc9bc2992e2f93112fafb73e50d2aaa7aBrian Carlstrom  OatFile& GetImageOatFile(gc::space::ImageSpace* space)
40400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      LOCKS_EXCLUDED(dex_lock_)
405b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
406a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom
4079837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers  void FinishInit(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
408a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom
40975cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom  // For early bootstrapping by Init
4106fac447555dc94a935b78198479cce645c837b89Ian Rogers  mirror::Class* AllocClass(Thread* self, mirror::Class* java_lang_Class, uint32_t class_size)
411b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
41275cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom
4132dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  // Alloc* convenience functions to avoid needing to pass in mirror::Class*
41475cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom  // values that are known to the ClassLinker such as
41575cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom  // kObjectArrayClass and kJavaLangString etc.
4166fac447555dc94a935b78198479cce645c837b89Ian Rogers  mirror::Class* AllocClass(Thread* self, uint32_t class_size)
417c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
4182dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::DexCache* AllocDexCache(Thread* self, const DexFile& dex_file)
419b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
420ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  mirror::ArtField* AllocArtField(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
421bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers
4222dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::Class* CreatePrimitiveClass(Thread* self, Primitive::Type type)
4232dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
4242dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::Class* InitializePrimitiveClass(mirror::Class* primitive_class, Primitive::Type type)
425b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
4265b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom
427a331b3cc392132c7333d36649a8310f38f4822ccBrian Carlstrom
4289837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers  mirror::Class* CreateArrayClass(Thread* self, const char* descriptor,
4290cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                                  Handle<mirror::ClassLoader> class_loader)
430b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
431578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom
43200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  void AppendToBootClassPath(const DexFile& dex_file)
433b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
4340cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  void AppendToBootClassPath(const DexFile& dex_file, Handle<mirror::DexCache> dex_cache)
435b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
436578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom
4375fe594f576225dd7d333835e39c448a71ea9b433Elliott Hughes  void ConstructFieldMap(const DexFile& dex_file, const DexFile::ClassDef& dex_class_def,
438ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                         mirror::Class* c, SafeMap<uint32_t, mirror::ArtField*>& field_map)
439b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
4405fe594f576225dd7d333835e39c448a71ea9b433Elliott Hughes
4416fac447555dc94a935b78198479cce645c837b89Ian Rogers  uint32_t SizeOfClass(const DexFile& dex_file,
4424873d465a1eb6dfbdeddb085c81239d39db60c42Brian Carlstrom                     const DexFile::ClassDef& dex_class_def);
4434873d465a1eb6dfbdeddb085c81239d39db60c42Brian Carlstrom
444f615a61aef972cfc1dc23931ac2ed0da14c3fedbBrian Carlstrom  void LoadClass(const DexFile& dex_file,
445f615a61aef972cfc1dc23931ac2ed0da14c3fedbBrian Carlstrom                 const DexFile::ClassDef& dex_class_def,
4460cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                 Handle<mirror::Class> klass,
4472dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                 mirror::ClassLoader* class_loader)
448b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
449d3c5bebcb52a67cb06e7ab303eaf45f230c08b60Vladimir Marko  void LoadClassMembers(const DexFile& dex_file,
450d3c5bebcb52a67cb06e7ab303eaf45f230c08b60Vladimir Marko                        const byte* class_data,
4510cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                        Handle<mirror::Class> klass,
452d3c5bebcb52a67cb06e7ab303eaf45f230c08b60Vladimir Marko                        mirror::ClassLoader* class_loader,
453d3c5bebcb52a67cb06e7ab303eaf45f230c08b60Vladimir Marko                        const OatFile::OatClass* oat_class)
454d3c5bebcb52a67cb06e7ab303eaf45f230c08b60Vladimir Marko      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
455565f50731db360584d0080af7f14f0b7ca10371cCarl Shapiro
4562dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  void LoadField(const DexFile& dex_file, const ClassDataItemIterator& it,
4570cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                 Handle<mirror::Class> klass, Handle<mirror::ArtField> dst)
4582dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
459934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom
460ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  mirror::ArtMethod* LoadMethod(Thread* self, const DexFile& dex_file,
461ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                const ClassDataItemIterator& dex_method,
4620cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                                Handle<mirror::Class> klass)
4632dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
464934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom
4652dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  void FixupStaticTrampolines(mirror::Class* klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
4661984651929744dd603fd082e23eacd877b9bc177Ian Rogers
4671984651929744dd603fd082e23eacd877b9bc177Ian Rogers  // Finds the associated oat class for a dex_file and descriptor
468d3c5bebcb52a67cb06e7ab303eaf45f230c08b60Vladimir Marko  OatFile::OatClass GetOatClass(const DexFile& dex_file, uint16_t class_def_idx)
46933e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
470aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom
4710cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  void RegisterDexFileLocked(const DexFile& dex_file, Handle<mirror::DexCache> dex_cache)
47200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      EXCLUSIVE_LOCKS_REQUIRED(dex_lock_)
473b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
474e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi  bool IsDexFileRegisteredLocked(const DexFile& dex_file)
475b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers      SHARED_LOCKS_REQUIRED(dex_lock_, Locks::mutator_lock_);
476aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom
4770cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  bool InitializeClass(Handle<mirror::Class> klass, bool can_run_clinit,
478c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier                       bool can_init_parents)
479b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
4800cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  bool WaitForInitializeClass(Handle<mirror::Class> klass, Thread* self,
481c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier                              ObjectLock<mirror::Class>& lock);
4820cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  bool ValidateSuperClassDescriptors(Handle<mirror::Class> klass)
483b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
4840e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
4859837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers  bool IsSameDescriptorInDifferentClassContexts(Thread* self, const char* descriptor,
4860cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                                                Handle<mirror::ClassLoader> class_loader1,
4870cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                                                Handle<mirror::ClassLoader> class_loader2)
488b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
4890e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
4909837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers  bool IsSameMethodSignatureInDifferentClassContexts(Thread* self, mirror::ArtMethod* method,
491ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers                                                     mirror::Class* klass1,
492ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers                                                     mirror::Class* klass2)
493b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
4940e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
4950cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  bool LinkClass(Thread* self, Handle<mirror::Class> klass,
4960cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                 Handle<mirror::ObjectArray<mirror::Class>> interfaces)
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
5160cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  bool LinkStaticFields(Handle<mirror::Class> klass)
517b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
5180cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  bool LinkInstanceFields(Handle<mirror::Class> klass)
519b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
5200cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  bool LinkFields(Handle<mirror::Class> klass, bool is_static)
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
5264873d465a1eb6dfbdeddb085c81239d39db60c42Brian Carlstrom
5270cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  void CreateReferenceInstanceOffsets(Handle<mirror::Class> klass)
528b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
5290cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  void CreateReferenceStaticOffsets(Handle<mirror::Class> klass)
530b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
5310cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  void CreateReferenceOffsets(Handle<mirror::Class> klass, bool is_static,
53200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers                              uint32_t reference_offsets)
533b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
5340e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
53558ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom  // For use by ImageWriter to find DexCaches for its roots
536e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi  ReaderWriterMutex* DexLock()
537e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) LOCK_RETURNED(dex_lock_) {
538e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi    return &dex_lock_;
53958ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom  }
540e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi  size_t GetDexCacheCount() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_, dex_lock_) {
541e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi    return dex_caches_.size();
542e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi  }
543e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi  mirror::DexCache* GetDexCache(size_t idx) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_, dex_lock_);
54458ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom
54500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  const OatFile* FindOpenedOatFileForDexFile(const DexFile& dex_file)
54633e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers      LOCKS_EXCLUDED(dex_lock_)
54733e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
5488d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers  const OatFile* FindOpenedOatFileFromDexLocation(const char* dex_location,
54908cbf66dc4632913f80f8ac18082c39b7d52c7ddBrian Carlstrom                                                  const uint32_t* const dex_location_checksum)
550719d1a33f6569864f529e5a3fff59e7bca97aad0Ian Rogers      LOCKS_EXCLUDED(dex_lock_);
55100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  const OatFile* FindOpenedOatFileFromOatLocation(const std::string& oat_location)
5528d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers      LOCKS_EXCLUDED(dex_lock_);
5538d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers  const DexFile* FindDexFileInOatLocation(const char* dex_location,
554e3359f7ad7671c5816f17145ca3a01516512e8d6Ian Rogers                                          uint32_t dex_location_checksum,
5558d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers                                          const char* oat_location,
5568d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers                                          std::string* error_msg)
5578d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers      LOCKS_EXCLUDED(dex_lock_);
558e3359f7ad7671c5816f17145ca3a01516512e8d6Ian Rogers
5598d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers  const DexFile* VerifyAndOpenDexFileFromOatFile(const std::string& oat_file_location,
5608d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers                                                 const char* dex_location,
5618d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers                                                 std::string* error_msg,
5628d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers                                                 bool* open_failed)
5638d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers      LOCKS_EXCLUDED(dex_lock_);
564fad714344ca81a21e775ef45ae09d9a035723cafBrian Carlstrom
5650cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  mirror::ArtMethod* CreateProxyConstructor(Thread* self, Handle<mirror::Class> klass,
566ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                            mirror::Class* proxy_class)
567b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
5680cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier  mirror::ArtMethod* CreateProxyMethod(Thread* self, Handle<mirror::Class> klass,
5690cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier                                       Handle<mirror::ArtMethod> prototype)
570b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
57195caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson
5724a96b60e45fba4a9d4a2e9c8fc849660eacef684Brian Carlstrom  std::vector<const DexFile*> boot_class_path_;
573578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom
5741bf8d4dbe5cb9891e8a1125ff1928b544efc243aIan Rogers  mutable ReaderWriterMutex dex_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER;
575893263b7d5bc2ca43a91ecb8071867f5134fc60aMathieu Chartier  std::vector<size_t> new_dex_cache_roots_ GUARDED_BY(dex_lock_);;
5762dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  std::vector<mirror::DexCache*> dex_caches_ GUARDED_BY(dex_lock_);
577f8349361a16a4e2796efe9f3586b994e8d4834e4Elliott Hughes  std::vector<const OatFile*> oat_files_ GUARDED_BY(dex_lock_);
57847d237a4b1a41772005c60083e72fe75c0aa0743Brian Carlstrom
5790e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
580aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom  // multimap from a string hash code of a class descriptor to
5812dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  // mirror::Class* instances. Results should be compared for a matching
5829cff8e13d41825c4f3f0127af061e94b06114fc8Brian Carlstrom  // Class::descriptor_ and Class::class_loader_.
5832dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  typedef std::multimap<size_t, mirror::Class*> Table;
584a91a4bc1f8960f64c5f7e4616d46e21b8e1bfba2Hiroshi Yamauchi  // This contains strong roots. To enable concurrent root scanning of
585a91a4bc1f8960f64c5f7e4616d46e21b8e1bfba2Hiroshi Yamauchi  // the class table, be careful to use a read barrier when accessing this.
5867dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers  Table class_table_ GUARDED_BY(Locks::classlinker_classes_lock_);
587700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers  std::vector<std::pair<size_t, mirror::Class*>> new_class_roots_;
5887dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers
5897dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers  // Do we need to search dex caches to find image classes?
5907dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers  bool dex_cache_image_class_lookup_required_;
5917dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers  // Number of times we've searched dex caches for a class. After a certain number of misses we move
5927dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers  // the classes into the class_table_ to avoid dex cache based searches.
5937dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers  AtomicInteger failed_dex_cache_class_lookups_;
594f8349361a16a4e2796efe9f3586b994e8d4834e4Elliott Hughes
5957dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers  mirror::Class* LookupClassFromTableLocked(const char* descriptor,
5967dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers                                            const mirror::ClassLoader* class_loader,
5977dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers                                            size_t hash)
5987dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::classlinker_classes_lock_, Locks::mutator_lock_);
5997dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers
6007dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers  void MoveImageClassesToClassTable() LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
6017dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
6027dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers  mirror::Class* LookupClassFromImage(const char* descriptor)
6037dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
6040e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
605a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom  // indexes into class_roots_.
606a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom  // needs to be kept in sync with class_roots_descriptors_.
60774eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom  enum ClassRoot {
60875cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom    kJavaLangClass,
60975cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom    kJavaLangObject,
610418d20fc407052d4152157f61e7453359f902383Elliott Hughes    kClassArrayClass,
61174eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom    kObjectArrayClass,
61274eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom    kJavaLangString,
61366f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier    kJavaLangDexCache,
614bf61ba3dcd9d9895b86a05e88762ff034b09b263Elliott Hughes    kJavaLangRefReference,
615ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom    kJavaLangReflectArtField,
616ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom    kJavaLangReflectArtMethod,
617466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    kJavaLangReflectProxy,
61866f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier    kJavaLangStringArrayClass,
619ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom    kJavaLangReflectArtFieldArrayClass,
620ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom    kJavaLangReflectArtMethodArrayClass,
62174eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom    kJavaLangClassLoader,
6225167c97a4f672ba821453418e3943988fabbfc43Ian Rogers    kJavaLangThrowable,
6238cd6ddaeb78cc904e13bac88753654a04b2e15b8jeffhao    kJavaLangClassNotFoundException,
62455df06be4369f5d8ab5eb61a5d22809255171036Shih-wei Liao    kJavaLangStackTraceElement,
62575cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom    kPrimitiveBoolean,
626d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes    kPrimitiveByte,
62775cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom    kPrimitiveChar,
62875cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom    kPrimitiveDouble,
629d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes    kPrimitiveFloat,
63075cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom    kPrimitiveInt,
63175cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom    kPrimitiveLong,
632d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes    kPrimitiveShort,
63375cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom    kPrimitiveVoid,
634d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes    kBooleanArrayClass,
635d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes    kByteArrayClass,
636d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes    kCharArrayClass,
637d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes    kDoubleArrayClass,
638d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes    kFloatArrayClass,
639d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes    kIntArrayClass,
640d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes    kLongArrayClass,
641d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes    kShortArrayClass,
64255df06be4369f5d8ab5eb61a5d22809255171036Shih-wei Liao    kJavaLangStackTraceElementArrayClass,
64375cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom    kClassRootsMax,
64475cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom  };
6452dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::ObjectArray<mirror::Class>* class_roots_;
646913af1bd90a6e8fd56f1f851db1f098636dae6a5Brian Carlstrom
6472dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::Class* GetClassRoot(ClassRoot class_root) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
64874eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom
6492dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  void SetClassRoot(ClassRoot class_root, mirror::Class* klass)
650b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
651a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom
652e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi  mirror::ObjectArray<mirror::Class>* GetClassRoots() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
653e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi    mirror::ObjectArray<mirror::Class>* class_roots =
654e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi        ReadBarrier::BarrierForRoot<mirror::ObjectArray<mirror::Class>, kWithReadBarrier>(
655e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi            &class_roots_);
656e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi    DCHECK(class_roots != NULL);
657e9e3e697f0c426132bee10aaa6aee9107d2d7dc6Hiroshi Yamauchi    return class_roots;
65834f426c49ac2de8cea70acef6b9ecdd8e62209d2Brian Carlstrom  }
65934f426c49ac2de8cea70acef6b9ecdd8e62209d2Brian Carlstrom
660418d20fc407052d4152157f61e7453359f902383Elliott Hughes  static const char* class_roots_descriptors_[];
661a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom
662a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom  const char* GetClassRootDescriptor(ClassRoot class_root) {
663a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom    const char* descriptor = class_roots_descriptors_[class_root];
664a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom    CHECK(descriptor != NULL);
665a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom    return descriptor;
666a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom  }
667a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom
6689837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers  // The interface table used by all arrays.
6692dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::IfTable* array_iftable_;
670565f50731db360584d0080af7f14f0b7ca10371cCarl Shapiro
6719837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers  // A cache of the last FindArrayClass results. The cache serves to avoid creating array class
6729837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers  // descriptors for the sake of performing FindClass.
6739837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers  static constexpr size_t kFindArrayCacheSize = 16;
6749837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers  mirror::Class* find_array_class_cache_[kFindArrayCacheSize];
6759837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers  size_t find_array_class_cache_next_victim_;
6769837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers
67775cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom  bool init_done_;
678893263b7d5bc2ca43a91ecb8071867f5134fc60aMathieu Chartier  bool log_new_dex_caches_roots_ GUARDED_BY(dex_lock_);
679893263b7d5bc2ca43a91ecb8071867f5134fc60aMathieu Chartier  bool log_new_class_table_roots_ GUARDED_BY(Locks::classlinker_classes_lock_);
68075cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom
681cf4c6c41b0084dc4567ff709fb8ce9ebd72b26acElliott Hughes  InternTable* intern_table_;
682cf4c6c41b0084dc4567ff709fb8ce9ebd72b26acElliott Hughes
6830aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao  const void* portable_resolution_trampoline_;
6840aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao  const void* quick_resolution_trampoline_;
68588474b416eb257078e590bf9bc7957cee604a186Jeff Hao  const void* portable_imt_conflict_trampoline_;
68688474b416eb257078e590bf9bc7957cee604a186Jeff Hao  const void* quick_imt_conflict_trampoline_;
6872da882315a61072664f7ce3c212307342e907207Andreas Gampe  const void* quick_generic_jni_trampoline_;
6888a630577ed2d9e9571c3434c505e5de223b23c07Vladimir Marko  const void* quick_to_interpreter_bridge_trampoline_;
6890aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao
690ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom  friend class ImageWriter;  // for GetClassRoots
6916d4d9fcb4f01e287ee29e81cd1c941ee5d11d379Ian Rogers  FRIEND_TEST(ClassLinkerTest, ClassRootDescriptors);
6922dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  FRIEND_TEST(mirror::DexCacheTest, Open);
6931a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao  FRIEND_TEST(ExceptionTest, FindExceptionHandler);
694ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom  FRIEND_TEST(ObjectTest, AllocObjectArray);
6950e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  DISALLOW_COPY_AND_ASSIGN(ClassLinker);
6960e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro};
6970e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
6980e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro}  // namespace art
6990e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
700fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif  // ART_RUNTIME_CLASS_LINKER_H_
701