xref: /aosp_15_r20/art/runtime/class_linker.h (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2011 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker #ifndef ART_RUNTIME_CLASS_LINKER_H_
18*795d594fSAndroid Build Coastguard Worker #define ART_RUNTIME_CLASS_LINKER_H_
19*795d594fSAndroid Build Coastguard Worker 
20*795d594fSAndroid Build Coastguard Worker #include <list>
21*795d594fSAndroid Build Coastguard Worker #include <map>
22*795d594fSAndroid Build Coastguard Worker #include <set>
23*795d594fSAndroid Build Coastguard Worker #include <string>
24*795d594fSAndroid Build Coastguard Worker #include <type_traits>
25*795d594fSAndroid Build Coastguard Worker #include <unordered_map>
26*795d594fSAndroid Build Coastguard Worker #include <utility>
27*795d594fSAndroid Build Coastguard Worker #include <vector>
28*795d594fSAndroid Build Coastguard Worker 
29*795d594fSAndroid Build Coastguard Worker #include "base/array_ref.h"
30*795d594fSAndroid Build Coastguard Worker #include "base/hash_map.h"
31*795d594fSAndroid Build Coastguard Worker #include "base/intrusive_forward_list.h"
32*795d594fSAndroid Build Coastguard Worker #include "base/locks.h"
33*795d594fSAndroid Build Coastguard Worker #include "base/macros.h"
34*795d594fSAndroid Build Coastguard Worker #include "base/mutex.h"
35*795d594fSAndroid Build Coastguard Worker #include "base/pointer_size.h"
36*795d594fSAndroid Build Coastguard Worker #include "dex/class_accessor.h"
37*795d594fSAndroid Build Coastguard Worker #include "dex/dex_file_types.h"
38*795d594fSAndroid Build Coastguard Worker #include "gc_root.h"
39*795d594fSAndroid Build Coastguard Worker #include "handle.h"
40*795d594fSAndroid Build Coastguard Worker #include "interpreter/mterp/nterp.h"
41*795d594fSAndroid Build Coastguard Worker #include "jni.h"
42*795d594fSAndroid Build Coastguard Worker #include "mirror/class.h"
43*795d594fSAndroid Build Coastguard Worker #include "mirror/object.h"
44*795d594fSAndroid Build Coastguard Worker #include "oat/jni_stub_hash_map.h"
45*795d594fSAndroid Build Coastguard Worker #include "oat/oat_file.h"
46*795d594fSAndroid Build Coastguard Worker #include "verifier/verifier_enums.h"
47*795d594fSAndroid Build Coastguard Worker 
48*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN {
49*795d594fSAndroid Build Coastguard Worker 
50*795d594fSAndroid Build Coastguard Worker class ArtField;
51*795d594fSAndroid Build Coastguard Worker class ArtMethod;
52*795d594fSAndroid Build Coastguard Worker class ClassHierarchyAnalysis;
53*795d594fSAndroid Build Coastguard Worker class ClassLoaderContext;
54*795d594fSAndroid Build Coastguard Worker enum class ClassRoot : uint32_t;
55*795d594fSAndroid Build Coastguard Worker class ClassTable;
56*795d594fSAndroid Build Coastguard Worker class DexFile;
57*795d594fSAndroid Build Coastguard Worker template<class T> class Handle;
58*795d594fSAndroid Build Coastguard Worker class ImtConflictTable;
59*795d594fSAndroid Build Coastguard Worker template<typename T> class LengthPrefixedArray;
60*795d594fSAndroid Build Coastguard Worker template<class T> class MutableHandle;
61*795d594fSAndroid Build Coastguard Worker class InternTable;
62*795d594fSAndroid Build Coastguard Worker class LinearAlloc;
63*795d594fSAndroid Build Coastguard Worker class OatFile;
64*795d594fSAndroid Build Coastguard Worker template<class T> class ObjectLock;
65*795d594fSAndroid Build Coastguard Worker class Runtime;
66*795d594fSAndroid Build Coastguard Worker class ScopedObjectAccessAlreadyRunnable;
67*795d594fSAndroid Build Coastguard Worker template<size_t kNumReferences> class PACKED(4) StackHandleScope;
68*795d594fSAndroid Build Coastguard Worker class Thread;
69*795d594fSAndroid Build Coastguard Worker class VariableSizedHandleScope;
70*795d594fSAndroid Build Coastguard Worker 
71*795d594fSAndroid Build Coastguard Worker enum VisitRootFlags : uint8_t;
72*795d594fSAndroid Build Coastguard Worker 
73*795d594fSAndroid Build Coastguard Worker namespace dex {
74*795d594fSAndroid Build Coastguard Worker struct ClassDef;
75*795d594fSAndroid Build Coastguard Worker struct MethodHandleItem;
76*795d594fSAndroid Build Coastguard Worker }  // namespace dex
77*795d594fSAndroid Build Coastguard Worker 
78*795d594fSAndroid Build Coastguard Worker namespace gc {
79*795d594fSAndroid Build Coastguard Worker namespace space {
80*795d594fSAndroid Build Coastguard Worker class ImageSpace;
81*795d594fSAndroid Build Coastguard Worker }  // namespace space
82*795d594fSAndroid Build Coastguard Worker }  // namespace gc
83*795d594fSAndroid Build Coastguard Worker 
84*795d594fSAndroid Build Coastguard Worker namespace linker {
85*795d594fSAndroid Build Coastguard Worker struct CompilationHelper;
86*795d594fSAndroid Build Coastguard Worker class ImageWriter;
87*795d594fSAndroid Build Coastguard Worker class OatWriter;
88*795d594fSAndroid Build Coastguard Worker }  // namespace linker
89*795d594fSAndroid Build Coastguard Worker 
90*795d594fSAndroid Build Coastguard Worker namespace mirror {
91*795d594fSAndroid Build Coastguard Worker class ClassLoader;
92*795d594fSAndroid Build Coastguard Worker class DexCache;
93*795d594fSAndroid Build Coastguard Worker class DexCachePointerArray;
94*795d594fSAndroid Build Coastguard Worker class DexCacheMethodHandlesTest_Open_Test;
95*795d594fSAndroid Build Coastguard Worker class DexCacheTest_Open_Test;
96*795d594fSAndroid Build Coastguard Worker class IfTable;
97*795d594fSAndroid Build Coastguard Worker class MethodHandle;
98*795d594fSAndroid Build Coastguard Worker class MethodHandlesLookup;
99*795d594fSAndroid Build Coastguard Worker class MethodType;
100*795d594fSAndroid Build Coastguard Worker template<class T> class ObjectArray;
101*795d594fSAndroid Build Coastguard Worker class RawMethodType;
102*795d594fSAndroid Build Coastguard Worker class StackTraceElement;
103*795d594fSAndroid Build Coastguard Worker }  // namespace mirror
104*795d594fSAndroid Build Coastguard Worker 
105*795d594fSAndroid Build Coastguard Worker namespace verifier {
106*795d594fSAndroid Build Coastguard Worker class VerifierDeps;
107*795d594fSAndroid Build Coastguard Worker }
108*795d594fSAndroid Build Coastguard Worker 
109*795d594fSAndroid Build Coastguard Worker class ClassVisitor {
110*795d594fSAndroid Build Coastguard Worker  public:
~ClassVisitor()111*795d594fSAndroid Build Coastguard Worker   virtual ~ClassVisitor() {}
112*795d594fSAndroid Build Coastguard Worker   // Return true to continue visiting.
113*795d594fSAndroid Build Coastguard Worker   virtual bool operator()(ObjPtr<mirror::Class> klass) = 0;
114*795d594fSAndroid Build Coastguard Worker };
115*795d594fSAndroid Build Coastguard Worker 
116*795d594fSAndroid Build Coastguard Worker template <typename Func>
117*795d594fSAndroid Build Coastguard Worker class ClassFuncVisitor final : public ClassVisitor {
118*795d594fSAndroid Build Coastguard Worker  public:
ClassFuncVisitor(Func func)119*795d594fSAndroid Build Coastguard Worker   explicit ClassFuncVisitor(Func func) : func_(func) {}
operator()120*795d594fSAndroid Build Coastguard Worker   bool operator()(ObjPtr<mirror::Class> klass) override REQUIRES_SHARED(Locks::mutator_lock_) {
121*795d594fSAndroid Build Coastguard Worker     return func_(klass);
122*795d594fSAndroid Build Coastguard Worker   }
123*795d594fSAndroid Build Coastguard Worker 
124*795d594fSAndroid Build Coastguard Worker  private:
125*795d594fSAndroid Build Coastguard Worker   Func func_;
126*795d594fSAndroid Build Coastguard Worker };
127*795d594fSAndroid Build Coastguard Worker 
128*795d594fSAndroid Build Coastguard Worker class ClassLoaderVisitor {
129*795d594fSAndroid Build Coastguard Worker  public:
~ClassLoaderVisitor()130*795d594fSAndroid Build Coastguard Worker   virtual ~ClassLoaderVisitor() {}
131*795d594fSAndroid Build Coastguard Worker   virtual void Visit(ObjPtr<mirror::ClassLoader> class_loader)
132*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::classlinker_classes_lock_, Locks::mutator_lock_) = 0;
133*795d594fSAndroid Build Coastguard Worker };
134*795d594fSAndroid Build Coastguard Worker 
135*795d594fSAndroid Build Coastguard Worker class DexCacheVisitor {
136*795d594fSAndroid Build Coastguard Worker  public:
~DexCacheVisitor()137*795d594fSAndroid Build Coastguard Worker   virtual ~DexCacheVisitor() {}
138*795d594fSAndroid Build Coastguard Worker   virtual void Visit(ObjPtr<mirror::DexCache> dex_cache)
139*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::dex_lock_, Locks::mutator_lock_) = 0;
140*795d594fSAndroid Build Coastguard Worker };
141*795d594fSAndroid Build Coastguard Worker 
142*795d594fSAndroid Build Coastguard Worker template <typename Func>
143*795d594fSAndroid Build Coastguard Worker class ClassLoaderFuncVisitor final : public ClassLoaderVisitor {
144*795d594fSAndroid Build Coastguard Worker  public:
ClassLoaderFuncVisitor(Func func)145*795d594fSAndroid Build Coastguard Worker   explicit ClassLoaderFuncVisitor(Func func) : func_(func) {}
Visit(ObjPtr<mirror::ClassLoader> cl)146*795d594fSAndroid Build Coastguard Worker   void Visit(ObjPtr<mirror::ClassLoader> cl) override REQUIRES_SHARED(Locks::mutator_lock_) {
147*795d594fSAndroid Build Coastguard Worker     func_(cl);
148*795d594fSAndroid Build Coastguard Worker   }
149*795d594fSAndroid Build Coastguard Worker 
150*795d594fSAndroid Build Coastguard Worker  private:
151*795d594fSAndroid Build Coastguard Worker   Func func_;
152*795d594fSAndroid Build Coastguard Worker };
153*795d594fSAndroid Build Coastguard Worker 
154*795d594fSAndroid Build Coastguard Worker class AllocatorVisitor {
155*795d594fSAndroid Build Coastguard Worker  public:
~AllocatorVisitor()156*795d594fSAndroid Build Coastguard Worker   virtual ~AllocatorVisitor() {}
157*795d594fSAndroid Build Coastguard Worker   // Return true to continue visiting.
158*795d594fSAndroid Build Coastguard Worker   virtual bool Visit(LinearAlloc* alloc)
159*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::classlinker_classes_lock_, Locks::mutator_lock_) = 0;
160*795d594fSAndroid Build Coastguard Worker };
161*795d594fSAndroid Build Coastguard Worker 
162*795d594fSAndroid Build Coastguard Worker class ClassLinker {
163*795d594fSAndroid Build Coastguard Worker  public:
164*795d594fSAndroid Build Coastguard Worker   static constexpr bool kAppImageMayContainStrings = true;
165*795d594fSAndroid Build Coastguard Worker 
166*795d594fSAndroid Build Coastguard Worker   EXPORT explicit ClassLinker(InternTable* intern_table,
167*795d594fSAndroid Build Coastguard Worker                               bool fast_class_not_found_exceptions = true);
168*795d594fSAndroid Build Coastguard Worker   EXPORT virtual ~ClassLinker();
169*795d594fSAndroid Build Coastguard Worker 
170*795d594fSAndroid Build Coastguard Worker   // Initialize class linker by bootstraping from dex files.
171*795d594fSAndroid Build Coastguard Worker   bool InitWithoutImage(std::vector<std::unique_ptr<const DexFile>> boot_class_path,
172*795d594fSAndroid Build Coastguard Worker                         std::string* error_msg)
173*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
174*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_);
175*795d594fSAndroid Build Coastguard Worker 
176*795d594fSAndroid Build Coastguard Worker   // Initialize class linker from one or more boot images.
177*795d594fSAndroid Build Coastguard Worker   bool InitFromBootImage(std::string* error_msg)
178*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
179*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_);
180*795d594fSAndroid Build Coastguard Worker 
181*795d594fSAndroid Build Coastguard Worker   // Add boot class path dex files that were not included in the boot image.
182*795d594fSAndroid Build Coastguard Worker   // ClassLinker takes ownership of these dex files.
183*795d594fSAndroid Build Coastguard Worker   // DO NOT use directly. Use `Runtime::AddExtraBootDexFiles`.
184*795d594fSAndroid Build Coastguard Worker   void AddExtraBootDexFiles(Thread* self,
185*795d594fSAndroid Build Coastguard Worker                             std::vector<std::unique_ptr<const DexFile>>&& additional_dex_files)
186*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
187*795d594fSAndroid Build Coastguard Worker 
188*795d594fSAndroid Build Coastguard Worker   // Add image spaces to the class linker, may fix up classloader fields and dex cache fields.
189*795d594fSAndroid Build Coastguard Worker   // The dex files that were newly opened for the space are placed in the out argument `dex_files`.
190*795d594fSAndroid Build Coastguard Worker   // Returns true if the operation succeeded.
191*795d594fSAndroid Build Coastguard Worker   // The space must be already added to the heap before calling AddImageSpace since we need to
192*795d594fSAndroid Build Coastguard Worker   // properly handle read barriers and object marking.
193*795d594fSAndroid Build Coastguard Worker   bool AddImageSpaces(ArrayRef<gc::space::ImageSpace*> spaces,
194*795d594fSAndroid Build Coastguard Worker                       Handle<mirror::ClassLoader> class_loader,
195*795d594fSAndroid Build Coastguard Worker                       ClassLoaderContext* context,
196*795d594fSAndroid Build Coastguard Worker                       /*out*/ std::vector<std::unique_ptr<const DexFile>>* dex_files,
197*795d594fSAndroid Build Coastguard Worker                       /*out*/ std::string* error_msg) REQUIRES(!Locks::dex_lock_)
198*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
199*795d594fSAndroid Build Coastguard Worker 
200*795d594fSAndroid Build Coastguard Worker   EXPORT bool OpenImageDexFiles(gc::space::ImageSpace* space,
201*795d594fSAndroid Build Coastguard Worker                                 std::vector<std::unique_ptr<const DexFile>>* out_dex_files,
202*795d594fSAndroid Build Coastguard Worker                                 std::string* error_msg)
203*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_)
204*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
205*795d594fSAndroid Build Coastguard Worker 
206*795d594fSAndroid Build Coastguard Worker   // Finds a class by its descriptor, loading it if necessary.
207*795d594fSAndroid Build Coastguard Worker   // If class_loader is null, searches boot_class_path_.
208*795d594fSAndroid Build Coastguard Worker   EXPORT ObjPtr<mirror::Class> FindClass(Thread* self,
209*795d594fSAndroid Build Coastguard Worker                                          const char* descriptor,
210*795d594fSAndroid Build Coastguard Worker                                          size_t descriptor_length,
211*795d594fSAndroid Build Coastguard Worker                                          Handle<mirror::ClassLoader> class_loader)
212*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
213*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_);
214*795d594fSAndroid Build Coastguard Worker 
215*795d594fSAndroid Build Coastguard Worker   // Helper overload that retrieves the descriptor and its length from the `dex_file`.
216*795d594fSAndroid Build Coastguard Worker   EXPORT ObjPtr<mirror::Class> FindClass(Thread* self,
217*795d594fSAndroid Build Coastguard Worker                                          const DexFile& dex_file,
218*795d594fSAndroid Build Coastguard Worker                                          dex::TypeIndex type_index,
219*795d594fSAndroid Build Coastguard Worker                                          Handle<mirror::ClassLoader> class_loader)
220*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
221*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_);
222*795d594fSAndroid Build Coastguard Worker 
223*795d594fSAndroid Build Coastguard Worker   // Finds a class by its descriptor using the "system" class loader, ie by searching the
224*795d594fSAndroid Build Coastguard Worker   // boot_class_path_.
FindSystemClass(Thread * self,const char * descriptor)225*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> FindSystemClass(Thread* self, const char* descriptor)
226*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
227*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_) {
228*795d594fSAndroid Build Coastguard Worker     return FindClass(self, descriptor, strlen(descriptor), ScopedNullHandle<mirror::ClassLoader>());
229*795d594fSAndroid Build Coastguard Worker   }
230*795d594fSAndroid Build Coastguard Worker 
231*795d594fSAndroid Build Coastguard Worker   // Finds the array class given for the element class.
232*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> FindArrayClass(Thread* self, ObjPtr<mirror::Class> element_class)
233*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
234*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_);
235*795d594fSAndroid Build Coastguard Worker 
236*795d594fSAndroid Build Coastguard Worker   // Returns true if the class linker is initialized.
IsInitialized()237*795d594fSAndroid Build Coastguard Worker   bool IsInitialized() const {
238*795d594fSAndroid Build Coastguard Worker     return init_done_;
239*795d594fSAndroid Build Coastguard Worker   }
240*795d594fSAndroid Build Coastguard Worker 
241*795d594fSAndroid Build Coastguard Worker   // Define a new a class based on a ClassDef from a DexFile
242*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> DefineClass(Thread* self,
243*795d594fSAndroid Build Coastguard Worker                                     const char* descriptor,
244*795d594fSAndroid Build Coastguard Worker                                     size_t descriptor_length,
245*795d594fSAndroid Build Coastguard Worker                                     size_t hash,
246*795d594fSAndroid Build Coastguard Worker                                     Handle<mirror::ClassLoader> class_loader,
247*795d594fSAndroid Build Coastguard Worker                                     const DexFile& dex_file,
248*795d594fSAndroid Build Coastguard Worker                                     const dex::ClassDef& dex_class_def)
249*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
250*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_);
251*795d594fSAndroid Build Coastguard Worker 
252*795d594fSAndroid Build Coastguard Worker   // Finds a class by its descriptor, returning null if it isn't wasn't loaded
253*795d594fSAndroid Build Coastguard Worker   // by the given 'class_loader'.
254*795d594fSAndroid Build Coastguard Worker   EXPORT ObjPtr<mirror::Class> LookupClass(Thread* self,
255*795d594fSAndroid Build Coastguard Worker                                            std::string_view descriptor,
256*795d594fSAndroid Build Coastguard Worker                                            ObjPtr<mirror::ClassLoader> class_loader)
257*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::classlinker_classes_lock_)
258*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
259*795d594fSAndroid Build Coastguard Worker 
260*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> LookupPrimitiveClass(char type) REQUIRES_SHARED(Locks::mutator_lock_);
261*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> FindPrimitiveClass(char type) REQUIRES_SHARED(Locks::mutator_lock_);
262*795d594fSAndroid Build Coastguard Worker 
263*795d594fSAndroid Build Coastguard Worker   void DumpForSigQuit(std::ostream& os) REQUIRES(!Locks::classlinker_classes_lock_);
264*795d594fSAndroid Build Coastguard Worker 
265*795d594fSAndroid Build Coastguard Worker   size_t NumLoadedClasses()
266*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::classlinker_classes_lock_)
267*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
268*795d594fSAndroid Build Coastguard Worker 
269*795d594fSAndroid Build Coastguard Worker   // Resolve a String with the given index from the DexFile associated with the given `referrer`,
270*795d594fSAndroid Build Coastguard Worker   // storing the result in the DexCache. The `referrer` is used to identify the target DexCache
271*795d594fSAndroid Build Coastguard Worker   // to use for resolution.
272*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::String> ResolveString(dex::StringIndex string_idx,
273*795d594fSAndroid Build Coastguard Worker                                        ArtField* referrer)
274*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
275*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::String> ResolveString(dex::StringIndex string_idx,
276*795d594fSAndroid Build Coastguard Worker                                        ArtMethod* referrer)
277*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
278*795d594fSAndroid Build Coastguard Worker 
279*795d594fSAndroid Build Coastguard Worker   // Resolve a String with the given index from the DexFile associated with the given DexCache,
280*795d594fSAndroid Build Coastguard Worker   // storing the result in the DexCache.
281*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::String> ResolveString(dex::StringIndex string_idx,
282*795d594fSAndroid Build Coastguard Worker                                        Handle<mirror::DexCache> dex_cache)
283*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
284*795d594fSAndroid Build Coastguard Worker 
285*795d594fSAndroid Build Coastguard Worker   // Find a String with the given index from the DexFile associated with the given DexCache,
286*795d594fSAndroid Build Coastguard Worker   // storing the result in the DexCache if found. Return null if not found.
287*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::String> LookupString(dex::StringIndex string_idx,
288*795d594fSAndroid Build Coastguard Worker                                       ObjPtr<mirror::DexCache> dex_cache)
289*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
290*795d594fSAndroid Build Coastguard Worker 
291*795d594fSAndroid Build Coastguard Worker   // Resolve a Type with the given index from the DexFile associated with the given `referrer`,
292*795d594fSAndroid Build Coastguard Worker   // storing the result in the DexCache. The `referrer` is used to identify the target DexCache
293*795d594fSAndroid Build Coastguard Worker   // and ClassLoader to use for resolution.
294*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> ResolveType(dex::TypeIndex type_idx, ObjPtr<mirror::Class> referrer)
295*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
296*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
297*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> ResolveType(dex::TypeIndex type_idx, ArtField* referrer)
298*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
299*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
300*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> ResolveType(dex::TypeIndex type_idx, ArtMethod* referrer)
301*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
302*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
303*795d594fSAndroid Build Coastguard Worker 
304*795d594fSAndroid Build Coastguard Worker   // Resolve a type with the given index from the DexFile associated with the given DexCache
305*795d594fSAndroid Build Coastguard Worker   // and ClassLoader, storing the result in DexCache. The ClassLoader is used to search for
306*795d594fSAndroid Build Coastguard Worker   // the type, since it may be referenced from but not contained within the DexFile.
307*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> ResolveType(dex::TypeIndex type_idx,
308*795d594fSAndroid Build Coastguard Worker                                     Handle<mirror::DexCache> dex_cache,
309*795d594fSAndroid Build Coastguard Worker                                     Handle<mirror::ClassLoader> class_loader)
310*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
311*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
312*795d594fSAndroid Build Coastguard Worker 
313*795d594fSAndroid Build Coastguard Worker   // Look up a resolved type with the given index from the DexFile associated with the given
314*795d594fSAndroid Build Coastguard Worker   // `referrer`, storing the result in the DexCache. The `referrer` is used to identify the
315*795d594fSAndroid Build Coastguard Worker   // target DexCache and ClassLoader to use for lookup.
316*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> LookupResolvedType(dex::TypeIndex type_idx,
317*795d594fSAndroid Build Coastguard Worker                                            ObjPtr<mirror::Class> referrer)
318*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
319*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> LookupResolvedType(dex::TypeIndex type_idx, ArtField* referrer)
320*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
321*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> LookupResolvedType(dex::TypeIndex type_idx, ArtMethod* referrer)
322*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
323*795d594fSAndroid Build Coastguard Worker 
324*795d594fSAndroid Build Coastguard Worker   // Look up a resolved type with the given index from the DexFile associated with the given
325*795d594fSAndroid Build Coastguard Worker   // DexCache and ClassLoader. The ClassLoader is used to search for the type, since it may
326*795d594fSAndroid Build Coastguard Worker   // be referenced from but not contained within the DexFile.
327*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> LookupResolvedType(dex::TypeIndex type_idx,
328*795d594fSAndroid Build Coastguard Worker                                            ObjPtr<mirror::DexCache> dex_cache,
329*795d594fSAndroid Build Coastguard Worker                                            ObjPtr<mirror::ClassLoader> class_loader)
330*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
331*795d594fSAndroid Build Coastguard Worker 
332*795d594fSAndroid Build Coastguard Worker   // Look up a resolved type with the given descriptor associated with the given ClassLoader.
333*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> LookupResolvedType(std::string_view descriptor,
334*795d594fSAndroid Build Coastguard Worker                                            ObjPtr<mirror::ClassLoader> class_loader)
335*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
336*795d594fSAndroid Build Coastguard Worker 
337*795d594fSAndroid Build Coastguard Worker   // Look up a previously resolved method with the given index.
338*795d594fSAndroid Build Coastguard Worker   ArtMethod* LookupResolvedMethod(uint32_t method_idx,
339*795d594fSAndroid Build Coastguard Worker                                   ObjPtr<mirror::DexCache> dex_cache,
340*795d594fSAndroid Build Coastguard Worker                                   ObjPtr<mirror::ClassLoader> class_loader)
341*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
342*795d594fSAndroid Build Coastguard Worker 
343*795d594fSAndroid Build Coastguard Worker   // Find a method with the given index from class `klass`, and update the dex cache.
344*795d594fSAndroid Build Coastguard Worker   EXPORT ArtMethod* FindResolvedMethod(ObjPtr<mirror::Class> klass,
345*795d594fSAndroid Build Coastguard Worker                                        ObjPtr<mirror::DexCache> dex_cache,
346*795d594fSAndroid Build Coastguard Worker                                        ObjPtr<mirror::ClassLoader> class_loader,
347*795d594fSAndroid Build Coastguard Worker                                        uint32_t method_idx)
348*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
349*795d594fSAndroid Build Coastguard Worker 
350*795d594fSAndroid Build Coastguard Worker   // Find a method using the wrong lookup mechanism. If `klass` is an interface,
351*795d594fSAndroid Build Coastguard Worker   // search for a class method. If it is a class, search for an interface method.
352*795d594fSAndroid Build Coastguard Worker   // This is useful when throwing IncompatibleClassChangeError.
353*795d594fSAndroid Build Coastguard Worker   ArtMethod* FindIncompatibleMethod(ObjPtr<mirror::Class> klass,
354*795d594fSAndroid Build Coastguard Worker                                     ObjPtr<mirror::DexCache> dex_cache,
355*795d594fSAndroid Build Coastguard Worker                                     ObjPtr<mirror::ClassLoader> class_loader,
356*795d594fSAndroid Build Coastguard Worker                                     uint32_t method_idx)
357*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
358*795d594fSAndroid Build Coastguard Worker 
359*795d594fSAndroid Build Coastguard Worker   // Check invoke type against the referenced class. Throws IncompatibleClassChangeError
360*795d594fSAndroid Build Coastguard Worker   // and returns true on mismatch (kInterface on a non-interface class,
361*795d594fSAndroid Build Coastguard Worker   // kVirtual on interface, kDefault on interface for dex files not supporting default methods),
362*795d594fSAndroid Build Coastguard Worker   // otherwise returns false.
363*795d594fSAndroid Build Coastguard Worker   static bool ThrowIfInvokeClassMismatch(ObjPtr<mirror::Class> cls,
364*795d594fSAndroid Build Coastguard Worker                                          const DexFile& dex_file,
365*795d594fSAndroid Build Coastguard Worker                                          InvokeType type)
366*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
367*795d594fSAndroid Build Coastguard Worker 
368*795d594fSAndroid Build Coastguard Worker   ArtMethod* ResolveMethodWithChecks(uint32_t method_idx, ArtMethod* referrer, InvokeType type)
369*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
370*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
371*795d594fSAndroid Build Coastguard Worker 
372*795d594fSAndroid Build Coastguard Worker   EXPORT ArtMethod* ResolveMethodId(uint32_t method_idx,
373*795d594fSAndroid Build Coastguard Worker                                     Handle<mirror::DexCache> dex_cache,
374*795d594fSAndroid Build Coastguard Worker                                     Handle<mirror::ClassLoader> class_loader)
375*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
376*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
377*795d594fSAndroid Build Coastguard Worker 
378*795d594fSAndroid Build Coastguard Worker   ArtMethod* ResolveMethodId(uint32_t method_idx, ArtMethod* referrer)
379*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
380*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
381*795d594fSAndroid Build Coastguard Worker 
382*795d594fSAndroid Build Coastguard Worker   ArtField* LookupResolvedField(uint32_t field_idx, ArtMethod* referrer, bool is_static)
383*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
384*795d594fSAndroid Build Coastguard Worker   // Find a field by its field index.
385*795d594fSAndroid Build Coastguard Worker   ArtField* LookupResolvedField(uint32_t field_idx,
386*795d594fSAndroid Build Coastguard Worker                                 ObjPtr<mirror::DexCache> dex_cache,
387*795d594fSAndroid Build Coastguard Worker                                 ObjPtr<mirror::ClassLoader> class_loader,
388*795d594fSAndroid Build Coastguard Worker                                 bool is_static)
389*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
390*795d594fSAndroid Build Coastguard Worker   ArtField* ResolveField(uint32_t field_idx, ArtMethod* referrer, bool is_static)
391*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
392*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
393*795d594fSAndroid Build Coastguard Worker 
394*795d594fSAndroid Build Coastguard Worker   // Resolve a field with a given ID from the DexFile associated with the given DexCache
395*795d594fSAndroid Build Coastguard Worker   // and ClassLoader, storing the result in DexCache. The ClassLinker and ClassLoader
396*795d594fSAndroid Build Coastguard Worker   // are used as in ResolveType. What is unique is the is_static argument which is used
397*795d594fSAndroid Build Coastguard Worker   // to determine if we are resolving a static or non-static field.
398*795d594fSAndroid Build Coastguard Worker   ArtField* ResolveField(uint32_t field_idx,
399*795d594fSAndroid Build Coastguard Worker                          Handle<mirror::DexCache> dex_cache,
400*795d594fSAndroid Build Coastguard Worker                          Handle<mirror::ClassLoader> class_loader,
401*795d594fSAndroid Build Coastguard Worker                          bool is_static)
402*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
403*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
404*795d594fSAndroid Build Coastguard Worker 
405*795d594fSAndroid Build Coastguard Worker   // Resolve a field with a given ID from the DexFile associated with the given DexCache
406*795d594fSAndroid Build Coastguard Worker   // and ClassLoader, storing the result in DexCache. The ClassLinker and ClassLoader
407*795d594fSAndroid Build Coastguard Worker   // are used as in ResolveType. No is_static argument is provided so that Java
408*795d594fSAndroid Build Coastguard Worker   // field resolution semantics are followed.
409*795d594fSAndroid Build Coastguard Worker   EXPORT ArtField* ResolveFieldJLS(uint32_t field_idx,
410*795d594fSAndroid Build Coastguard Worker                                    Handle<mirror::DexCache> dex_cache,
411*795d594fSAndroid Build Coastguard Worker                                    Handle<mirror::ClassLoader> class_loader)
412*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
413*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
414*795d594fSAndroid Build Coastguard Worker 
415*795d594fSAndroid Build Coastguard Worker   // Find a field with a given ID from the DexFile associated with the given DexCache
416*795d594fSAndroid Build Coastguard Worker   // and ClassLoader, storing the result in DexCache. The declaring class is assumed
417*795d594fSAndroid Build Coastguard Worker   // to have been already resolved into `klass`. The `is_static` argument is used to
418*795d594fSAndroid Build Coastguard Worker   // determine if we are resolving a static or non-static field.
419*795d594fSAndroid Build Coastguard Worker   EXPORT ArtField* FindResolvedField(ObjPtr<mirror::Class> klass,
420*795d594fSAndroid Build Coastguard Worker                                      ObjPtr<mirror::DexCache> dex_cache,
421*795d594fSAndroid Build Coastguard Worker                                      ObjPtr<mirror::ClassLoader> class_loader,
422*795d594fSAndroid Build Coastguard Worker                                      uint32_t field_idx,
423*795d594fSAndroid Build Coastguard Worker                                      bool is_static)
424*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
425*795d594fSAndroid Build Coastguard Worker 
426*795d594fSAndroid Build Coastguard Worker   // Find a field with a given ID from the DexFile associated with the given DexCache
427*795d594fSAndroid Build Coastguard Worker   // and ClassLoader, storing the result in DexCache. The declaring class is assumed
428*795d594fSAndroid Build Coastguard Worker   // to have been already resolved into `klass`. No is_static argument is provided
429*795d594fSAndroid Build Coastguard Worker   // so that Java field resolution semantics are followed.
430*795d594fSAndroid Build Coastguard Worker   ArtField* FindResolvedFieldJLS(ObjPtr<mirror::Class> klass,
431*795d594fSAndroid Build Coastguard Worker                                  ObjPtr<mirror::DexCache> dex_cache,
432*795d594fSAndroid Build Coastguard Worker                                  ObjPtr<mirror::ClassLoader> class_loader,
433*795d594fSAndroid Build Coastguard Worker                                  uint32_t field_idx)
434*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
435*795d594fSAndroid Build Coastguard Worker 
436*795d594fSAndroid Build Coastguard Worker   // Resolve a method type with a given ID from the DexFile associated with a given DexCache
437*795d594fSAndroid Build Coastguard Worker   // and ClassLoader, storing the result in the DexCache.
438*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::MethodType> ResolveMethodType(Thread* self,
439*795d594fSAndroid Build Coastguard Worker                                                dex::ProtoIndex proto_idx,
440*795d594fSAndroid Build Coastguard Worker                                                Handle<mirror::DexCache> dex_cache,
441*795d594fSAndroid Build Coastguard Worker                                                Handle<mirror::ClassLoader> class_loader)
442*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
443*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
444*795d594fSAndroid Build Coastguard Worker 
445*795d594fSAndroid Build Coastguard Worker   EXPORT ObjPtr<mirror::MethodType> ResolveMethodType(Thread* self,
446*795d594fSAndroid Build Coastguard Worker                                                       dex::ProtoIndex proto_idx,
447*795d594fSAndroid Build Coastguard Worker                                                       ArtMethod* referrer)
448*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
449*795d594fSAndroid Build Coastguard Worker 
450*795d594fSAndroid Build Coastguard Worker   bool ResolveMethodType(Thread* self,
451*795d594fSAndroid Build Coastguard Worker                          dex::ProtoIndex proto_idx,
452*795d594fSAndroid Build Coastguard Worker                          Handle<mirror::DexCache> dex_cache,
453*795d594fSAndroid Build Coastguard Worker                          Handle<mirror::ClassLoader> class_loader,
454*795d594fSAndroid Build Coastguard Worker                          /*out*/ mirror::RawMethodType method_type)
455*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
456*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
457*795d594fSAndroid Build Coastguard Worker 
458*795d594fSAndroid Build Coastguard Worker   // Resolve a method handle with a given ID from the DexFile. The
459*795d594fSAndroid Build Coastguard Worker   // result is not cached in the DexCache as the instance will only be
460*795d594fSAndroid Build Coastguard Worker   // used once in most circumstances.
461*795d594fSAndroid Build Coastguard Worker   EXPORT ObjPtr<mirror::MethodHandle> ResolveMethodHandle(Thread* self,
462*795d594fSAndroid Build Coastguard Worker                                                           uint32_t method_handle_idx,
463*795d594fSAndroid Build Coastguard Worker                                                           ArtMethod* referrer)
464*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
465*795d594fSAndroid Build Coastguard Worker 
466*795d594fSAndroid Build Coastguard Worker   // Returns true on success, false if there's an exception pending.
467*795d594fSAndroid Build Coastguard Worker   // can_run_clinit=false allows the compiler to attempt to init a class,
468*795d594fSAndroid Build Coastguard Worker   // given the restriction that no <clinit> execution is possible.
469*795d594fSAndroid Build Coastguard Worker   EXPORT bool EnsureInitialized(Thread* self,
470*795d594fSAndroid Build Coastguard Worker                                 Handle<mirror::Class> c,
471*795d594fSAndroid Build Coastguard Worker                                 bool can_init_fields,
472*795d594fSAndroid Build Coastguard Worker                                 bool can_init_parents)
473*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
474*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
475*795d594fSAndroid Build Coastguard Worker 
476*795d594fSAndroid Build Coastguard Worker   // Initializes a few essential classes, namely `java.lang.Class`,
477*795d594fSAndroid Build Coastguard Worker   // `java.lang.Object` and `java.lang.reflect.Field`.
478*795d594fSAndroid Build Coastguard Worker   EXPORT  void RunEarlyRootClinits(Thread* self)
479*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
480*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
481*795d594fSAndroid Build Coastguard Worker 
482*795d594fSAndroid Build Coastguard Worker   // Initializes classes that have instances in the image but that have
483*795d594fSAndroid Build Coastguard Worker   // <clinit> methods so they could not be initialized by the compiler.
484*795d594fSAndroid Build Coastguard Worker   void RunRootClinits(Thread* self)
485*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
486*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
487*795d594fSAndroid Build Coastguard Worker 
488*795d594fSAndroid Build Coastguard Worker   // Directly register an already existing dex cache. RegisterDexFile should be preferred since that
489*795d594fSAndroid Build Coastguard Worker   // reduplicates DexCaches when possible. The DexCache given to this function must already be fully
490*795d594fSAndroid Build Coastguard Worker   // initialized and not already registered.
491*795d594fSAndroid Build Coastguard Worker   EXPORT void RegisterExistingDexCache(ObjPtr<mirror::DexCache> cache,
492*795d594fSAndroid Build Coastguard Worker                                        ObjPtr<mirror::ClassLoader> class_loader)
493*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_)
494*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
495*795d594fSAndroid Build Coastguard Worker   EXPORT ObjPtr<mirror::DexCache> RegisterDexFile(const DexFile& dex_file,
496*795d594fSAndroid Build Coastguard Worker                                                   ObjPtr<mirror::ClassLoader> class_loader)
497*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_)
498*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
499*795d594fSAndroid Build Coastguard Worker 
GetBootClassPath()500*795d594fSAndroid Build Coastguard Worker   const std::vector<const DexFile*>& GetBootClassPath() {
501*795d594fSAndroid Build Coastguard Worker     return boot_class_path_;
502*795d594fSAndroid Build Coastguard Worker   }
503*795d594fSAndroid Build Coastguard Worker 
504*795d594fSAndroid Build Coastguard Worker   EXPORT void VisitClasses(ClassVisitor* visitor)
505*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::classlinker_classes_lock_)
506*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
507*795d594fSAndroid Build Coastguard Worker 
508*795d594fSAndroid Build Coastguard Worker   // Visits only the classes in the boot class path.
509*795d594fSAndroid Build Coastguard Worker   template <typename Visitor>
510*795d594fSAndroid Build Coastguard Worker   inline void VisitBootClasses(Visitor* visitor)
511*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::classlinker_classes_lock_)
512*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
513*795d594fSAndroid Build Coastguard Worker   // Less efficient variant of VisitClasses that copies the class_table_ into secondary storage
514*795d594fSAndroid Build Coastguard Worker   // so that it can visit individual classes without holding the doesn't hold the
515*795d594fSAndroid Build Coastguard Worker   // Locks::classlinker_classes_lock_. As the Locks::classlinker_classes_lock_ isn't held this code
516*795d594fSAndroid Build Coastguard Worker   // can race with insertion and deletion of classes while the visitor is being called.
517*795d594fSAndroid Build Coastguard Worker   EXPORT void VisitClassesWithoutClassesLock(ClassVisitor* visitor)
518*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
519*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_);
520*795d594fSAndroid Build Coastguard Worker 
521*795d594fSAndroid Build Coastguard Worker   void VisitClassRoots(RootVisitor* visitor, VisitRootFlags flags)
522*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::classlinker_classes_lock_, !Locks::trace_lock_)
523*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
524*795d594fSAndroid Build Coastguard Worker   void VisitRoots(RootVisitor* visitor, VisitRootFlags flags, bool visit_class_roots = true)
525*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_, !Locks::classlinker_classes_lock_, !Locks::trace_lock_)
526*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
527*795d594fSAndroid Build Coastguard Worker   // Visits all dex-files accessible by any class-loader or the BCP.
528*795d594fSAndroid Build Coastguard Worker   template<typename Visitor>
529*795d594fSAndroid Build Coastguard Worker   void VisitKnownDexFiles(Thread* self, Visitor visitor) REQUIRES(Locks::mutator_lock_);
530*795d594fSAndroid Build Coastguard Worker 
531*795d594fSAndroid Build Coastguard Worker   EXPORT bool IsDexFileRegistered(Thread* self, const DexFile& dex_file)
532*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_)
533*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
534*795d594fSAndroid Build Coastguard Worker   EXPORT ObjPtr<mirror::DexCache> FindDexCache(Thread* self, const DexFile& dex_file)
535*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_)
536*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
537*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::DexCache> FindDexCache(Thread* self, const OatDexFile& oat_dex_file)
538*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_) REQUIRES_SHARED(Locks::mutator_lock_);
539*795d594fSAndroid Build Coastguard Worker   ClassTable* FindClassTable(Thread* self, ObjPtr<mirror::DexCache> dex_cache)
540*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_)
541*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
542*795d594fSAndroid Build Coastguard Worker 
543*795d594fSAndroid Build Coastguard Worker   LengthPrefixedArray<ArtField>* AllocArtFieldArray(Thread* self,
544*795d594fSAndroid Build Coastguard Worker                                                     LinearAlloc* allocator,
545*795d594fSAndroid Build Coastguard Worker                                                     size_t length);
546*795d594fSAndroid Build Coastguard Worker 
547*795d594fSAndroid Build Coastguard Worker   LengthPrefixedArray<ArtMethod>* AllocArtMethodArray(Thread* self,
548*795d594fSAndroid Build Coastguard Worker                                                       LinearAlloc* allocator,
549*795d594fSAndroid Build Coastguard Worker                                                       size_t length);
550*795d594fSAndroid Build Coastguard Worker 
551*795d594fSAndroid Build Coastguard Worker   // Convenience AllocClass() overload that uses mirror::Class::InitializeClassVisitor
552*795d594fSAndroid Build Coastguard Worker   // for the class initialization and uses the `java_lang_Class` from class roots
553*795d594fSAndroid Build Coastguard Worker   // instead of an explicit argument.
554*795d594fSAndroid Build Coastguard Worker   EXPORT ObjPtr<mirror::Class> AllocClass(Thread* self, uint32_t class_size)
555*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
556*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Roles::uninterruptible_);
557*795d594fSAndroid Build Coastguard Worker 
558*795d594fSAndroid Build Coastguard Worker   // Setup the classloader, class def index, type idx so that we can insert this class in the class
559*795d594fSAndroid Build Coastguard Worker   // table.
560*795d594fSAndroid Build Coastguard Worker   EXPORT void SetupClass(const DexFile& dex_file,
561*795d594fSAndroid Build Coastguard Worker                          const dex::ClassDef& dex_class_def,
562*795d594fSAndroid Build Coastguard Worker                          Handle<mirror::Class> klass,
563*795d594fSAndroid Build Coastguard Worker                          ObjPtr<mirror::ClassLoader> class_loader)
564*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
565*795d594fSAndroid Build Coastguard Worker 
566*795d594fSAndroid Build Coastguard Worker   EXPORT void LoadClass(Thread* self,
567*795d594fSAndroid Build Coastguard Worker                         const DexFile& dex_file,
568*795d594fSAndroid Build Coastguard Worker                         const dex::ClassDef& dex_class_def,
569*795d594fSAndroid Build Coastguard Worker                         Handle<mirror::Class> klass)
570*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
571*795d594fSAndroid Build Coastguard Worker 
572*795d594fSAndroid Build Coastguard Worker   // Link the class and place it into the class-table using the given descriptor. NB if the
573*795d594fSAndroid Build Coastguard Worker   // descriptor is null the class will not be placed in any class-table. This is useful implementing
574*795d594fSAndroid Build Coastguard Worker   // obsolete classes and should not be used otherwise.
575*795d594fSAndroid Build Coastguard Worker   EXPORT bool LinkClass(Thread* self,
576*795d594fSAndroid Build Coastguard Worker                         const char* descriptor,
577*795d594fSAndroid Build Coastguard Worker                         Handle<mirror::Class> klass,
578*795d594fSAndroid Build Coastguard Worker                         Handle<mirror::ObjectArray<mirror::Class>> interfaces,
579*795d594fSAndroid Build Coastguard Worker                         MutableHandle<mirror::Class>* h_new_class_out)
580*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
581*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::classlinker_classes_lock_);
582*795d594fSAndroid Build Coastguard Worker 
583*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::PointerArray> AllocPointerArray(Thread* self, size_t length)
584*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
585*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Roles::uninterruptible_);
586*795d594fSAndroid Build Coastguard Worker 
587*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::ObjectArray<mirror::StackTraceElement>> AllocStackTraceElementArray(Thread* self,
588*795d594fSAndroid Build Coastguard Worker                                                                                      size_t length)
589*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
590*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Roles::uninterruptible_);
591*795d594fSAndroid Build Coastguard Worker 
592*795d594fSAndroid Build Coastguard Worker   EXPORT verifier::FailureKind VerifyClass(
593*795d594fSAndroid Build Coastguard Worker       Thread* self,
594*795d594fSAndroid Build Coastguard Worker       verifier::VerifierDeps* verifier_deps,
595*795d594fSAndroid Build Coastguard Worker       Handle<mirror::Class> klass,
596*795d594fSAndroid Build Coastguard Worker       verifier::HardFailLogMode log_level = verifier::HardFailLogMode::kLogNone)
597*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
598*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_);
599*795d594fSAndroid Build Coastguard Worker   EXPORT  // For `libarttest.so`.
600*795d594fSAndroid Build Coastguard Worker   bool VerifyClassUsingOatFile(Thread* self,
601*795d594fSAndroid Build Coastguard Worker                                const DexFile& dex_file,
602*795d594fSAndroid Build Coastguard Worker                                Handle<mirror::Class> klass,
603*795d594fSAndroid Build Coastguard Worker                                ClassStatus& oat_file_class_status)
604*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
605*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_);
606*795d594fSAndroid Build Coastguard Worker   void ResolveClassExceptionHandlerTypes(Handle<mirror::Class> klass)
607*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
608*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_);
609*795d594fSAndroid Build Coastguard Worker   void ResolveMethodExceptionHandlerTypes(ArtMethod* klass)
610*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
611*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_);
612*795d594fSAndroid Build Coastguard Worker 
613*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> CreateProxyClass(ScopedObjectAccessAlreadyRunnable& soa,
614*795d594fSAndroid Build Coastguard Worker                                          jstring name,
615*795d594fSAndroid Build Coastguard Worker                                          jobjectArray interfaces,
616*795d594fSAndroid Build Coastguard Worker                                          jobject loader,
617*795d594fSAndroid Build Coastguard Worker                                          jobjectArray methods,
618*795d594fSAndroid Build Coastguard Worker                                          jobjectArray throws)
619*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
620*795d594fSAndroid Build Coastguard Worker 
621*795d594fSAndroid Build Coastguard Worker   pid_t GetClassesLockOwner();  // For SignalCatcher.
622*795d594fSAndroid Build Coastguard Worker   pid_t GetDexLockOwner();  // For SignalCatcher.
623*795d594fSAndroid Build Coastguard Worker 
624*795d594fSAndroid Build Coastguard Worker   // Is the given entry point quick code to run the resolution stub?
625*795d594fSAndroid Build Coastguard Worker   EXPORT bool IsQuickResolutionStub(const void* entry_point) const;
626*795d594fSAndroid Build Coastguard Worker 
627*795d594fSAndroid Build Coastguard Worker   // Is the given entry point quick code to bridge into the interpreter?
628*795d594fSAndroid Build Coastguard Worker   EXPORT bool IsQuickToInterpreterBridge(const void* entry_point) const;
629*795d594fSAndroid Build Coastguard Worker 
630*795d594fSAndroid Build Coastguard Worker   // Is the given entry point quick code to run the generic JNI stub?
631*795d594fSAndroid Build Coastguard Worker   EXPORT bool IsQuickGenericJniStub(const void* entry_point) const;
632*795d594fSAndroid Build Coastguard Worker 
633*795d594fSAndroid Build Coastguard Worker   // Is the given entry point the JNI dlsym lookup stub?
634*795d594fSAndroid Build Coastguard Worker   EXPORT bool IsJniDlsymLookupStub(const void* entry_point) const;
635*795d594fSAndroid Build Coastguard Worker 
636*795d594fSAndroid Build Coastguard Worker   // Is the given entry point the JNI dlsym lookup critical stub?
637*795d594fSAndroid Build Coastguard Worker   EXPORT bool IsJniDlsymLookupCriticalStub(const void* entry_point) const;
638*795d594fSAndroid Build Coastguard Worker 
639*795d594fSAndroid Build Coastguard Worker   // Is the given entry point the nterp trampoline?
IsNterpTrampoline(const void * entry_point)640*795d594fSAndroid Build Coastguard Worker   bool IsNterpTrampoline(const void* entry_point) const {
641*795d594fSAndroid Build Coastguard Worker     return nterp_trampoline_ == entry_point;
642*795d594fSAndroid Build Coastguard Worker   }
643*795d594fSAndroid Build Coastguard Worker 
IsNterpEntryPoint(const void * entry_point)644*795d594fSAndroid Build Coastguard Worker   bool IsNterpEntryPoint(const void* entry_point) const {
645*795d594fSAndroid Build Coastguard Worker     return entry_point == interpreter::GetNterpEntryPoint() ||
646*795d594fSAndroid Build Coastguard Worker         entry_point == interpreter::GetNterpWithClinitEntryPoint();
647*795d594fSAndroid Build Coastguard Worker   }
648*795d594fSAndroid Build Coastguard Worker 
GetQuickToInterpreterBridgeTrampoline()649*795d594fSAndroid Build Coastguard Worker   const void* GetQuickToInterpreterBridgeTrampoline() const {
650*795d594fSAndroid Build Coastguard Worker     return quick_to_interpreter_bridge_trampoline_;
651*795d594fSAndroid Build Coastguard Worker   }
652*795d594fSAndroid Build Coastguard Worker 
GetInternTable()653*795d594fSAndroid Build Coastguard Worker   InternTable* GetInternTable() const {
654*795d594fSAndroid Build Coastguard Worker     return intern_table_;
655*795d594fSAndroid Build Coastguard Worker   }
656*795d594fSAndroid Build Coastguard Worker 
657*795d594fSAndroid Build Coastguard Worker   // Set the entrypoints up for an obsolete method.
658*795d594fSAndroid Build Coastguard Worker   EXPORT void SetEntryPointsForObsoleteMethod(ArtMethod* method) const
659*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
660*795d594fSAndroid Build Coastguard Worker 
661*795d594fSAndroid Build Coastguard Worker   // Attempts to insert a class into a class table.  Returns null if
662*795d594fSAndroid Build Coastguard Worker   // the class was inserted, otherwise returns an existing class with
663*795d594fSAndroid Build Coastguard Worker   // the same descriptor and ClassLoader.
664*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> InsertClass(std::string_view descriptor,
665*795d594fSAndroid Build Coastguard Worker                                     ObjPtr<mirror::Class> klass,
666*795d594fSAndroid Build Coastguard Worker                                     size_t hash)
667*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::classlinker_classes_lock_)
668*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
669*795d594fSAndroid Build Coastguard Worker 
670*795d594fSAndroid Build Coastguard Worker   // Add an oat file with .bss GC roots to be visited again at the end of GC
671*795d594fSAndroid Build Coastguard Worker   // for collector types that need it.
672*795d594fSAndroid Build Coastguard Worker   void WriteBarrierForBootOatFileBssRoots(const OatFile* oat_file)
673*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::classlinker_classes_lock_)
674*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
675*795d594fSAndroid Build Coastguard Worker 
676*795d594fSAndroid Build Coastguard Worker   template <ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
677*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::ObjectArray<mirror::Class>> GetClassRoots() REQUIRES_SHARED(Locks::mutator_lock_);
678*795d594fSAndroid Build Coastguard Worker 
679*795d594fSAndroid Build Coastguard Worker   // Move the class table to the pre-zygote table to reduce memory usage. This works by ensuring
680*795d594fSAndroid Build Coastguard Worker   // that no more classes are ever added to the pre zygote table which makes it that the pages
681*795d594fSAndroid Build Coastguard Worker   // always remain shared dirty instead of private dirty.
682*795d594fSAndroid Build Coastguard Worker   void MoveClassTableToPreZygote()
683*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::classlinker_classes_lock_)
684*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
685*795d594fSAndroid Build Coastguard Worker 
686*795d594fSAndroid Build Coastguard Worker   // Calls `CreateWellKnownClassLoader()` with `WellKnownClasses::dalvik_system_PathClassLoader`,
687*795d594fSAndroid Build Coastguard Worker   // and null parent and libraries. Wraps the result in a JNI global reference.
688*795d594fSAndroid Build Coastguard Worker   EXPORT jobject CreatePathClassLoader(Thread* self, const std::vector<const DexFile*>& dex_files)
689*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
690*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_);
691*795d594fSAndroid Build Coastguard Worker 
692*795d594fSAndroid Build Coastguard Worker   // Creates a `PathClassLoader`, `DelegateLastClassLoader` or `InMemoryDexClassLoader`
693*795d594fSAndroid Build Coastguard Worker   // (specified by loader_class) that can be used to load classes from the given dex files.
694*795d594fSAndroid Build Coastguard Worker   // The parent of the class loader will be set to `parent_loader`. If `parent_loader` is
695*795d594fSAndroid Build Coastguard Worker   // null the parent will be the boot class loader.
696*795d594fSAndroid Build Coastguard Worker   // If `loader_class` points to a different class than `PathClassLoader`,
697*795d594fSAndroid Build Coastguard Worker   // `DelegateLastClassLoader` or `InMemoryDexClassLoader` this method will abort.
698*795d594fSAndroid Build Coastguard Worker   // Note: the objects are not completely set up. Do not use this outside of tests and the compiler.
699*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::ClassLoader> CreateWellKnownClassLoader(
700*795d594fSAndroid Build Coastguard Worker       Thread* self,
701*795d594fSAndroid Build Coastguard Worker       const std::vector<const DexFile*>& dex_files,
702*795d594fSAndroid Build Coastguard Worker       Handle<mirror::Class> loader_class,
703*795d594fSAndroid Build Coastguard Worker       Handle<mirror::ClassLoader> parent_loader,
704*795d594fSAndroid Build Coastguard Worker       Handle<mirror::ObjectArray<mirror::ClassLoader>> shared_libraries,
705*795d594fSAndroid Build Coastguard Worker       Handle<mirror::ObjectArray<mirror::ClassLoader>> shared_libraries_after)
706*795d594fSAndroid Build Coastguard Worker           REQUIRES_SHARED(Locks::mutator_lock_)
707*795d594fSAndroid Build Coastguard Worker           REQUIRES(!Locks::dex_lock_);
708*795d594fSAndroid Build Coastguard Worker 
GetImagePointerSize()709*795d594fSAndroid Build Coastguard Worker   PointerSize GetImagePointerSize() const {
710*795d594fSAndroid Build Coastguard Worker     return image_pointer_size_;
711*795d594fSAndroid Build Coastguard Worker   }
712*795d594fSAndroid Build Coastguard Worker 
713*795d594fSAndroid Build Coastguard Worker   // Clear the ArrayClass cache. This is necessary when cleaning up for the image, as the cache
714*795d594fSAndroid Build Coastguard Worker   // entries are roots, but potentially not image classes.
715*795d594fSAndroid Build Coastguard Worker   EXPORT void DropFindArrayClassCache() REQUIRES_SHARED(Locks::mutator_lock_);
716*795d594fSAndroid Build Coastguard Worker 
717*795d594fSAndroid Build Coastguard Worker   // Clean up class loaders, this needs to happen after JNI weak globals are cleared.
718*795d594fSAndroid Build Coastguard Worker   void CleanupClassLoaders()
719*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::classlinker_classes_lock_)
720*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
721*795d594fSAndroid Build Coastguard Worker 
722*795d594fSAndroid Build Coastguard Worker   // Unlike GetOrCreateAllocatorForClassLoader, GetAllocatorForClassLoader asserts that the
723*795d594fSAndroid Build Coastguard Worker   // allocator for this class loader is already created.
724*795d594fSAndroid Build Coastguard Worker   EXPORT LinearAlloc* GetAllocatorForClassLoader(ObjPtr<mirror::ClassLoader> class_loader)
725*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
726*795d594fSAndroid Build Coastguard Worker 
727*795d594fSAndroid Build Coastguard Worker   // Return the linear alloc for a class loader if it is already allocated, otherwise allocate and
728*795d594fSAndroid Build Coastguard Worker   // set it. TODO: Consider using a lock other than classlinker_classes_lock_.
729*795d594fSAndroid Build Coastguard Worker   LinearAlloc* GetOrCreateAllocatorForClassLoader(ObjPtr<mirror::ClassLoader> class_loader)
730*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::classlinker_classes_lock_)
731*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
732*795d594fSAndroid Build Coastguard Worker 
733*795d594fSAndroid Build Coastguard Worker   // May be called with null class_loader due to legacy code. b/27954959
734*795d594fSAndroid Build Coastguard Worker   void InsertDexFileInToClassLoader(ObjPtr<mirror::Object> dex_file,
735*795d594fSAndroid Build Coastguard Worker                                     ObjPtr<mirror::ClassLoader> class_loader)
736*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::classlinker_classes_lock_)
737*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
738*795d594fSAndroid Build Coastguard Worker 
739*795d594fSAndroid Build Coastguard Worker   EXPORT static bool IsBootClassLoader(ObjPtr<mirror::Object> class_loader)
740*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
741*795d594fSAndroid Build Coastguard Worker 
742*795d594fSAndroid Build Coastguard Worker   ArtMethod* AddMethodToConflictTable(ObjPtr<mirror::Class> klass,
743*795d594fSAndroid Build Coastguard Worker                                       ArtMethod* conflict_method,
744*795d594fSAndroid Build Coastguard Worker                                       ArtMethod* interface_method,
745*795d594fSAndroid Build Coastguard Worker                                       ArtMethod* method)
746*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
747*795d594fSAndroid Build Coastguard Worker 
748*795d594fSAndroid Build Coastguard Worker   // Create a conflict table with a specified capacity.
749*795d594fSAndroid Build Coastguard Worker   ImtConflictTable* CreateImtConflictTable(size_t count, LinearAlloc* linear_alloc);
750*795d594fSAndroid Build Coastguard Worker 
751*795d594fSAndroid Build Coastguard Worker   // Static version for when the class linker is not yet created.
752*795d594fSAndroid Build Coastguard Worker   static ImtConflictTable* CreateImtConflictTable(size_t count,
753*795d594fSAndroid Build Coastguard Worker                                                   LinearAlloc* linear_alloc,
754*795d594fSAndroid Build Coastguard Worker                                                   PointerSize pointer_size);
755*795d594fSAndroid Build Coastguard Worker 
756*795d594fSAndroid Build Coastguard Worker 
757*795d594fSAndroid Build Coastguard Worker   // Create the IMT and conflict tables for a class.
758*795d594fSAndroid Build Coastguard Worker   EXPORT void FillIMTAndConflictTables(ObjPtr<mirror::Class> klass)
759*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
760*795d594fSAndroid Build Coastguard Worker 
761*795d594fSAndroid Build Coastguard Worker   // Visit all of the class tables. This is used by dex2oat to allow pruning dex caches.
762*795d594fSAndroid Build Coastguard Worker   template <class Visitor>
763*795d594fSAndroid Build Coastguard Worker   void VisitClassTables(const Visitor& visitor)
764*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::classlinker_classes_lock_)
765*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
766*795d594fSAndroid Build Coastguard Worker 
767*795d594fSAndroid Build Coastguard Worker   // Visit all of the allocators that belong to classloaders except boot classloader.
768*795d594fSAndroid Build Coastguard Worker   // This is used by 616-cha-unloading test to confirm memory reuse.
769*795d594fSAndroid Build Coastguard Worker   EXPORT  // For `libarttest.so`.
770*795d594fSAndroid Build Coastguard Worker   void VisitAllocators(AllocatorVisitor* visitor) const
771*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::classlinker_classes_lock_, Locks::mutator_lock_);
772*795d594fSAndroid Build Coastguard Worker 
773*795d594fSAndroid Build Coastguard Worker   // Throw the class initialization failure recorded when first trying to initialize the given
774*795d594fSAndroid Build Coastguard Worker   // class.
775*795d594fSAndroid Build Coastguard Worker   void ThrowEarlierClassFailure(ObjPtr<mirror::Class> c,
776*795d594fSAndroid Build Coastguard Worker                                 bool wrap_in_no_class_def = false,
777*795d594fSAndroid Build Coastguard Worker                                 bool log = false)
778*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
779*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_);
780*795d594fSAndroid Build Coastguard Worker 
781*795d594fSAndroid Build Coastguard Worker   // Get the actual holding class for a copied method. Pretty slow, don't call often.
782*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> GetHoldingClassOfCopiedMethod(ArtMethod* method)
783*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
784*795d594fSAndroid Build Coastguard Worker 
785*795d594fSAndroid Build Coastguard Worker   // Get the class loader holding class for a copied method.
786*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::ClassLoader> GetHoldingClassLoaderOfCopiedMethod(Thread* self, ArtMethod* method)
787*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
788*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::classlinker_classes_lock_);
789*795d594fSAndroid Build Coastguard Worker 
790*795d594fSAndroid Build Coastguard Worker   void GetClassLoaders(Thread* self, VariableSizedHandleScope* handles)
791*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
792*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::classlinker_classes_lock_);
793*795d594fSAndroid Build Coastguard Worker 
794*795d594fSAndroid Build Coastguard Worker   // Returns null if not found.
795*795d594fSAndroid Build Coastguard Worker   // This returns a pointer to the class-table, without requiring any locking - including the
796*795d594fSAndroid Build Coastguard Worker   // boot class-table. It is the caller's responsibility to access this under lock, if required.
797*795d594fSAndroid Build Coastguard Worker   EXPORT ClassTable* ClassTableForClassLoader(ObjPtr<mirror::ClassLoader> class_loader)
798*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
799*795d594fSAndroid Build Coastguard Worker       NO_THREAD_SAFETY_ANALYSIS;
800*795d594fSAndroid Build Coastguard Worker 
801*795d594fSAndroid Build Coastguard Worker   // Dirty card in the card-table corresponding to the class_loader. Also log
802*795d594fSAndroid Build Coastguard Worker   // the root if we are logging new roots and class_loader is null.
803*795d594fSAndroid Build Coastguard Worker   void WriteBarrierOnClassLoaderLocked(ObjPtr<mirror::ClassLoader> class_loader,
804*795d594fSAndroid Build Coastguard Worker                                        ObjPtr<mirror::Object> root)
805*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(Locks::classlinker_classes_lock_);
806*795d594fSAndroid Build Coastguard Worker   void WriteBarrierOnClassLoader(Thread* self,
807*795d594fSAndroid Build Coastguard Worker                                  ObjPtr<mirror::ClassLoader> class_loader,
808*795d594fSAndroid Build Coastguard Worker                                  ObjPtr<mirror::Object> root) REQUIRES_SHARED(Locks::mutator_lock_)
809*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::classlinker_classes_lock_);
810*795d594fSAndroid Build Coastguard Worker 
811*795d594fSAndroid Build Coastguard Worker   // DO NOT use directly. Use `Runtime::AppendToBootClassPath`.
812*795d594fSAndroid Build Coastguard Worker   void AppendToBootClassPath(Thread* self, const DexFile* dex_file)
813*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
814*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_);
815*795d594fSAndroid Build Coastguard Worker 
816*795d594fSAndroid Build Coastguard Worker   // DO NOT use directly. Use `Runtime::AppendToBootClassPath`.
817*795d594fSAndroid Build Coastguard Worker   void AppendToBootClassPath(const DexFile* dex_file, ObjPtr<mirror::DexCache> dex_cache)
818*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
819*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_);
820*795d594fSAndroid Build Coastguard Worker 
821*795d594fSAndroid Build Coastguard Worker   // Visit all of the class loaders in the class linker.
822*795d594fSAndroid Build Coastguard Worker   EXPORT void VisitClassLoaders(ClassLoaderVisitor* visitor) const
823*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::classlinker_classes_lock_, Locks::mutator_lock_);
824*795d594fSAndroid Build Coastguard Worker 
825*795d594fSAndroid Build Coastguard Worker   // Visit all of the dex caches in the class linker.
826*795d594fSAndroid Build Coastguard Worker   void VisitDexCaches(DexCacheVisitor* visitor) const
827*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::dex_lock_, Locks::mutator_lock_);
828*795d594fSAndroid Build Coastguard Worker 
829*795d594fSAndroid Build Coastguard Worker   // Checks that a class and its superclass from another class loader have the same virtual methods.
830*795d594fSAndroid Build Coastguard Worker   EXPORT bool ValidateSuperClassDescriptors(Handle<mirror::Class> klass)
831*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
832*795d594fSAndroid Build Coastguard Worker 
GetClassHierarchyAnalysis()833*795d594fSAndroid Build Coastguard Worker   ClassHierarchyAnalysis* GetClassHierarchyAnalysis() {
834*795d594fSAndroid Build Coastguard Worker     return cha_.get();
835*795d594fSAndroid Build Coastguard Worker   }
836*795d594fSAndroid Build Coastguard Worker 
837*795d594fSAndroid Build Coastguard Worker   EXPORT
838*795d594fSAndroid Build Coastguard Worker   void MakeInitializedClassesVisiblyInitialized(Thread* self, bool wait /* ==> no locks held */);
839*795d594fSAndroid Build Coastguard Worker 
840*795d594fSAndroid Build Coastguard Worker   // Registers the native method and returns the new entry point. NB The returned entry point
841*795d594fSAndroid Build Coastguard Worker   // might be different from the native_method argument if some MethodCallback modifies it.
842*795d594fSAndroid Build Coastguard Worker   const void* RegisterNative(Thread* self, ArtMethod* method, const void* native_method)
843*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
844*795d594fSAndroid Build Coastguard Worker 
845*795d594fSAndroid Build Coastguard Worker   // Unregister native code for a method.
846*795d594fSAndroid Build Coastguard Worker   void UnregisterNative(Thread* self, ArtMethod* method) REQUIRES_SHARED(Locks::mutator_lock_);
847*795d594fSAndroid Build Coastguard Worker 
848*795d594fSAndroid Build Coastguard Worker   // Get the registered native method entrypoint, if any, otherwise null.
849*795d594fSAndroid Build Coastguard Worker   const void* GetRegisteredNative(Thread* self, ArtMethod* method)
850*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
851*795d594fSAndroid Build Coastguard Worker       REQUIRES(!critical_native_code_with_clinit_check_lock_);
852*795d594fSAndroid Build Coastguard Worker 
853*795d594fSAndroid Build Coastguard Worker   struct DexCacheData {
854*795d594fSAndroid Build Coastguard Worker     // Construct an invalid data object.
DexCacheDataDexCacheData855*795d594fSAndroid Build Coastguard Worker     DexCacheData() : weak_root(nullptr), class_table(nullptr) {
856*795d594fSAndroid Build Coastguard Worker       static std::atomic_uint64_t s_registration_count(0);
857*795d594fSAndroid Build Coastguard Worker       registration_index = s_registration_count.fetch_add(1, std::memory_order_seq_cst);
858*795d594fSAndroid Build Coastguard Worker     }
859*795d594fSAndroid Build Coastguard Worker     DexCacheData(DexCacheData&&) = default;
860*795d594fSAndroid Build Coastguard Worker 
861*795d594fSAndroid Build Coastguard Worker     // Weak root to the DexCache. Note: Do not decode this unnecessarily or else class unloading may
862*795d594fSAndroid Build Coastguard Worker     // not work properly.
863*795d594fSAndroid Build Coastguard Worker     jweak weak_root;
864*795d594fSAndroid Build Coastguard Worker     // Identify the associated class loader's class table. This is used to make sure that
865*795d594fSAndroid Build Coastguard Worker     // the Java call to native DexCache.setResolvedType() inserts the resolved type in that
866*795d594fSAndroid Build Coastguard Worker     // class table. It is also used to make sure we don't register the same dex cache with
867*795d594fSAndroid Build Coastguard Worker     // multiple class loaders.
868*795d594fSAndroid Build Coastguard Worker     ClassTable* class_table;
869*795d594fSAndroid Build Coastguard Worker     // Monotonically increasing integer which records the order in which DexFiles were registered.
870*795d594fSAndroid Build Coastguard Worker     // Used only to preserve determinism when creating compiled image.
871*795d594fSAndroid Build Coastguard Worker     uint64_t registration_index;
872*795d594fSAndroid Build Coastguard Worker 
873*795d594fSAndroid Build Coastguard Worker    private:
874*795d594fSAndroid Build Coastguard Worker     DISALLOW_COPY_AND_ASSIGN(DexCacheData);
875*795d594fSAndroid Build Coastguard Worker   };
876*795d594fSAndroid Build Coastguard Worker 
877*795d594fSAndroid Build Coastguard Worker   // Forces a class to be marked as initialized without actually running initializers. Should only
878*795d594fSAndroid Build Coastguard Worker   // be used by plugin code when creating new classes directly.
879*795d594fSAndroid Build Coastguard Worker   EXPORT void ForceClassInitialized(Thread* self, Handle<mirror::Class> klass)
880*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
881*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
882*795d594fSAndroid Build Coastguard Worker 
883*795d594fSAndroid Build Coastguard Worker   // Verifies if the method is accessible according to the SdkChecker (if installed).
884*795d594fSAndroid Build Coastguard Worker   virtual bool DenyAccessBasedOnPublicSdk(ArtMethod* art_method) const
885*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
886*795d594fSAndroid Build Coastguard Worker   // Verifies if the field is accessible according to the SdkChecker (if installed).
887*795d594fSAndroid Build Coastguard Worker   virtual bool DenyAccessBasedOnPublicSdk(ArtField* art_field) const
888*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
889*795d594fSAndroid Build Coastguard Worker   // Verifies if the descriptor is accessible according to the SdkChecker (if installed).
890*795d594fSAndroid Build Coastguard Worker   virtual bool DenyAccessBasedOnPublicSdk(std::string_view type_descriptor) const;
891*795d594fSAndroid Build Coastguard Worker   // Enable or disable public sdk checks.
892*795d594fSAndroid Build Coastguard Worker   virtual void SetEnablePublicSdkChecks(bool enabled);
893*795d594fSAndroid Build Coastguard Worker 
894*795d594fSAndroid Build Coastguard Worker   // Transaction constraint checks for AOT compilation.
895*795d594fSAndroid Build Coastguard Worker   virtual bool TransactionWriteConstraint(Thread* self, ObjPtr<mirror::Object> obj)
896*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
897*795d594fSAndroid Build Coastguard Worker   virtual bool TransactionWriteValueConstraint(Thread* self, ObjPtr<mirror::Object> value)
898*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
899*795d594fSAndroid Build Coastguard Worker   virtual bool TransactionAllocationConstraint(Thread* self, ObjPtr<mirror::Class> klass)
900*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
901*795d594fSAndroid Build Coastguard Worker 
902*795d594fSAndroid Build Coastguard Worker   // Transaction bookkeeping for AOT compilation.
903*795d594fSAndroid Build Coastguard Worker   virtual void RecordWriteFieldBoolean(mirror::Object* obj,
904*795d594fSAndroid Build Coastguard Worker                                        MemberOffset field_offset,
905*795d594fSAndroid Build Coastguard Worker                                        uint8_t value,
906*795d594fSAndroid Build Coastguard Worker                                        bool is_volatile);
907*795d594fSAndroid Build Coastguard Worker   virtual void RecordWriteFieldByte(mirror::Object* obj,
908*795d594fSAndroid Build Coastguard Worker                                     MemberOffset field_offset,
909*795d594fSAndroid Build Coastguard Worker                                     int8_t value,
910*795d594fSAndroid Build Coastguard Worker                                     bool is_volatile);
911*795d594fSAndroid Build Coastguard Worker   virtual void RecordWriteFieldChar(mirror::Object* obj,
912*795d594fSAndroid Build Coastguard Worker                                     MemberOffset field_offset,
913*795d594fSAndroid Build Coastguard Worker                                     uint16_t value,
914*795d594fSAndroid Build Coastguard Worker                                     bool is_volatile);
915*795d594fSAndroid Build Coastguard Worker   virtual void RecordWriteFieldShort(mirror::Object* obj,
916*795d594fSAndroid Build Coastguard Worker                                      MemberOffset field_offset,
917*795d594fSAndroid Build Coastguard Worker                                      int16_t value,
918*795d594fSAndroid Build Coastguard Worker                                      bool is_volatile);
919*795d594fSAndroid Build Coastguard Worker   virtual void RecordWriteField32(mirror::Object* obj,
920*795d594fSAndroid Build Coastguard Worker                                   MemberOffset field_offset,
921*795d594fSAndroid Build Coastguard Worker                                   uint32_t value,
922*795d594fSAndroid Build Coastguard Worker                                   bool is_volatile);
923*795d594fSAndroid Build Coastguard Worker   virtual void RecordWriteField64(mirror::Object* obj,
924*795d594fSAndroid Build Coastguard Worker                                   MemberOffset field_offset,
925*795d594fSAndroid Build Coastguard Worker                                   uint64_t value,
926*795d594fSAndroid Build Coastguard Worker                                   bool is_volatile);
927*795d594fSAndroid Build Coastguard Worker   virtual void RecordWriteFieldReference(mirror::Object* obj,
928*795d594fSAndroid Build Coastguard Worker                                          MemberOffset field_offset,
929*795d594fSAndroid Build Coastguard Worker                                          ObjPtr<mirror::Object> value,
930*795d594fSAndroid Build Coastguard Worker                                          bool is_volatile)
931*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
932*795d594fSAndroid Build Coastguard Worker   virtual void RecordWriteArray(mirror::Array* array, size_t index, uint64_t value)
933*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
934*795d594fSAndroid Build Coastguard Worker   virtual void RecordStrongStringInsertion(ObjPtr<mirror::String> s)
935*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::intern_table_lock_);
936*795d594fSAndroid Build Coastguard Worker   virtual void RecordWeakStringInsertion(ObjPtr<mirror::String> s)
937*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::intern_table_lock_);
938*795d594fSAndroid Build Coastguard Worker   virtual void RecordStrongStringRemoval(ObjPtr<mirror::String> s)
939*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::intern_table_lock_);
940*795d594fSAndroid Build Coastguard Worker   virtual void RecordWeakStringRemoval(ObjPtr<mirror::String> s)
941*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::intern_table_lock_);
942*795d594fSAndroid Build Coastguard Worker   virtual void RecordResolveString(ObjPtr<mirror::DexCache> dex_cache, dex::StringIndex string_idx)
943*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
944*795d594fSAndroid Build Coastguard Worker   virtual void RecordResolveMethodType(ObjPtr<mirror::DexCache> dex_cache,
945*795d594fSAndroid Build Coastguard Worker                                        dex::ProtoIndex proto_idx)
946*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
947*795d594fSAndroid Build Coastguard Worker 
948*795d594fSAndroid Build Coastguard Worker   // Aborting transactions for AOT compilation.
949*795d594fSAndroid Build Coastguard Worker   virtual void ThrowTransactionAbortError(Thread* self)
950*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
951*795d594fSAndroid Build Coastguard Worker   virtual void AbortTransactionF(Thread* self, const char* fmt, ...)
952*795d594fSAndroid Build Coastguard Worker       __attribute__((__format__(__printf__, 3, 4)))
953*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
954*795d594fSAndroid Build Coastguard Worker   virtual void AbortTransactionV(Thread* self, const char* fmt, va_list args)
955*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
956*795d594fSAndroid Build Coastguard Worker   virtual bool IsTransactionAborted() const;
957*795d594fSAndroid Build Coastguard Worker 
958*795d594fSAndroid Build Coastguard Worker   // Visit transaction roots for AOT compilation.
959*795d594fSAndroid Build Coastguard Worker   virtual void VisitTransactionRoots(RootVisitor* visitor)
960*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
961*795d594fSAndroid Build Coastguard Worker 
962*795d594fSAndroid Build Coastguard Worker   // Get transactional switch interpreter entrypoint for AOT compilation.
963*795d594fSAndroid Build Coastguard Worker   virtual const void* GetTransactionalInterpreter();
964*795d594fSAndroid Build Coastguard Worker 
965*795d594fSAndroid Build Coastguard Worker   void RemoveDexFromCaches(const DexFile& dex_file);
GetBootClassTable()966*795d594fSAndroid Build Coastguard Worker   ClassTable* GetBootClassTable() REQUIRES_SHARED(Locks::classlinker_classes_lock_) {
967*795d594fSAndroid Build Coastguard Worker     return boot_class_table_.get();
968*795d594fSAndroid Build Coastguard Worker   }
969*795d594fSAndroid Build Coastguard Worker   // Find a matching JNI stub from boot images that we could reuse as entrypoint.
970*795d594fSAndroid Build Coastguard Worker   EXPORT const void* FindBootJniStub(ArtMethod* method)
971*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
972*795d594fSAndroid Build Coastguard Worker 
973*795d594fSAndroid Build Coastguard Worker   EXPORT const void* FindBootJniStub(uint32_t flags, std::string_view shorty);
974*795d594fSAndroid Build Coastguard Worker 
975*795d594fSAndroid Build Coastguard Worker   const void* FindBootJniStub(JniStubKey key);
976*795d594fSAndroid Build Coastguard Worker 
977*795d594fSAndroid Build Coastguard Worker  protected:
978*795d594fSAndroid Build Coastguard Worker   EXPORT virtual bool InitializeClass(Thread* self,
979*795d594fSAndroid Build Coastguard Worker                                       Handle<mirror::Class> klass,
980*795d594fSAndroid Build Coastguard Worker                                       bool can_run_clinit,
981*795d594fSAndroid Build Coastguard Worker                                       bool can_init_parents)
982*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
983*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_);
984*795d594fSAndroid Build Coastguard Worker 
985*795d594fSAndroid Build Coastguard Worker   EXPORT
986*795d594fSAndroid Build Coastguard Worker   virtual verifier::FailureKind PerformClassVerification(Thread* self,
987*795d594fSAndroid Build Coastguard Worker                                                          verifier::VerifierDeps* verifier_deps,
988*795d594fSAndroid Build Coastguard Worker                                                          Handle<mirror::Class> klass,
989*795d594fSAndroid Build Coastguard Worker                                                          verifier::HardFailLogMode log_level,
990*795d594fSAndroid Build Coastguard Worker                                                          std::string* error_msg)
991*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
992*795d594fSAndroid Build Coastguard Worker 
CanAllocClass()993*795d594fSAndroid Build Coastguard Worker   virtual bool CanAllocClass() REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!Locks::dex_lock_) {
994*795d594fSAndroid Build Coastguard Worker     return true;
995*795d594fSAndroid Build Coastguard Worker   }
996*795d594fSAndroid Build Coastguard Worker 
997*795d594fSAndroid Build Coastguard Worker  private:
998*795d594fSAndroid Build Coastguard Worker   class LinkFieldsHelper;
999*795d594fSAndroid Build Coastguard Worker   template <PointerSize kPointerSize>
1000*795d594fSAndroid Build Coastguard Worker   class LinkMethodsHelper;
1001*795d594fSAndroid Build Coastguard Worker   class MethodAnnotationsIterator;
1002*795d594fSAndroid Build Coastguard Worker   class OatClassCodeIterator;
1003*795d594fSAndroid Build Coastguard Worker   class VisiblyInitializedCallback;
1004*795d594fSAndroid Build Coastguard Worker 
1005*795d594fSAndroid Build Coastguard Worker   struct ClassLoaderData {
1006*795d594fSAndroid Build Coastguard Worker     jweak weak_root;  // Weak root to enable class unloading.
1007*795d594fSAndroid Build Coastguard Worker     ClassTable* class_table;
1008*795d594fSAndroid Build Coastguard Worker     LinearAlloc* allocator;
1009*795d594fSAndroid Build Coastguard Worker   };
1010*795d594fSAndroid Build Coastguard Worker 
1011*795d594fSAndroid Build Coastguard Worker   void VisiblyInitializedCallbackDone(Thread* self, VisiblyInitializedCallback* callback);
1012*795d594fSAndroid Build Coastguard Worker   VisiblyInitializedCallback* MarkClassInitialized(Thread* self, Handle<mirror::Class> klass)
1013*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1014*795d594fSAndroid Build Coastguard Worker 
1015*795d594fSAndroid Build Coastguard Worker   // Ensures that the supertype of 'klass' ('supertype') is verified. Returns false and throws
1016*795d594fSAndroid Build Coastguard Worker   // appropriate exceptions if verification failed hard. Returns true for successful verification or
1017*795d594fSAndroid Build Coastguard Worker   // soft-failures.
1018*795d594fSAndroid Build Coastguard Worker   bool AttemptSupertypeVerification(Thread* self,
1019*795d594fSAndroid Build Coastguard Worker                                     verifier::VerifierDeps* verifier_deps,
1020*795d594fSAndroid Build Coastguard Worker                                     Handle<mirror::Class> klass,
1021*795d594fSAndroid Build Coastguard Worker                                     Handle<mirror::Class> supertype)
1022*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_)
1023*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1024*795d594fSAndroid Build Coastguard Worker 
1025*795d594fSAndroid Build Coastguard Worker   // Prepare by removing dependencies on things allocated in data.allocator.
1026*795d594fSAndroid Build Coastguard Worker   // Please note that the allocator and class_table are not deleted in this
1027*795d594fSAndroid Build Coastguard Worker   // function. They are to be deleted after preparing all the class-loaders that
1028*795d594fSAndroid Build Coastguard Worker   // are to be deleted (see b/298575095).
1029*795d594fSAndroid Build Coastguard Worker   void PrepareToDeleteClassLoader(Thread* self, const ClassLoaderData& data, bool cleanup_cha)
1030*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1031*795d594fSAndroid Build Coastguard Worker 
1032*795d594fSAndroid Build Coastguard Worker   void VisitClassesInternal(ClassVisitor* visitor)
1033*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::classlinker_classes_lock_, Locks::mutator_lock_);
1034*795d594fSAndroid Build Coastguard Worker 
1035*795d594fSAndroid Build Coastguard Worker   // Returns the number of zygote and image classes.
1036*795d594fSAndroid Build Coastguard Worker   size_t NumZygoteClasses() const
1037*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::classlinker_classes_lock_)
1038*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1039*795d594fSAndroid Build Coastguard Worker 
1040*795d594fSAndroid Build Coastguard Worker   // Returns the number of non zygote nor image classes.
1041*795d594fSAndroid Build Coastguard Worker   size_t NumNonZygoteClasses() const
1042*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::classlinker_classes_lock_)
1043*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1044*795d594fSAndroid Build Coastguard Worker 
1045*795d594fSAndroid Build Coastguard Worker   void FinishInit(Thread* self)
1046*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
1047*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
1048*795d594fSAndroid Build Coastguard Worker 
1049*795d594fSAndroid Build Coastguard Worker   // If we do not allow moving classes (`art::kMovingClass` is false) or if
1050*795d594fSAndroid Build Coastguard Worker   // parameter `kMovable` is false (or both), the class object is allocated in
1051*795d594fSAndroid Build Coastguard Worker   // the non-moving space.
1052*795d594fSAndroid Build Coastguard Worker   template <bool kMovable = true, class PreFenceVisitor>
1053*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> AllocClass(Thread* self,
1054*795d594fSAndroid Build Coastguard Worker                                    ObjPtr<mirror::Class> java_lang_Class,
1055*795d594fSAndroid Build Coastguard Worker                                    uint32_t class_size,
1056*795d594fSAndroid Build Coastguard Worker                                    const PreFenceVisitor& pre_fence_visitor)
1057*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
1058*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Roles::uninterruptible_);
1059*795d594fSAndroid Build Coastguard Worker 
1060*795d594fSAndroid Build Coastguard Worker   // Convenience AllocClass() overload that uses mirror::Class::InitializeClassVisitor
1061*795d594fSAndroid Build Coastguard Worker   // for the class initialization.
1062*795d594fSAndroid Build Coastguard Worker   template <bool kMovable = true>
1063*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> AllocClass(Thread* self,
1064*795d594fSAndroid Build Coastguard Worker                                    ObjPtr<mirror::Class> java_lang_Class,
1065*795d594fSAndroid Build Coastguard Worker                                    uint32_t class_size)
1066*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
1067*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Roles::uninterruptible_);
1068*795d594fSAndroid Build Coastguard Worker 
1069*795d594fSAndroid Build Coastguard Worker   // Allocate a primitive array class and store it in appropriate class root.
1070*795d594fSAndroid Build Coastguard Worker   void AllocPrimitiveArrayClass(Thread* self,
1071*795d594fSAndroid Build Coastguard Worker                                 ClassRoot primitive_root,
1072*795d594fSAndroid Build Coastguard Worker                                 ClassRoot array_root)
1073*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
1074*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Roles::uninterruptible_);
1075*795d594fSAndroid Build Coastguard Worker 
1076*795d594fSAndroid Build Coastguard Worker   // Finish setup of an array class.
1077*795d594fSAndroid Build Coastguard Worker   void FinishArrayClassSetup(ObjPtr<mirror::Class> array_class)
1078*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
1079*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Roles::uninterruptible_);
1080*795d594fSAndroid Build Coastguard Worker 
1081*795d594fSAndroid Build Coastguard Worker   // Finish setup of a core array class (Object[], Class[], String[] and
1082*795d594fSAndroid Build Coastguard Worker   // primitive arrays) and insert it into the class table.
1083*795d594fSAndroid Build Coastguard Worker   void FinishCoreArrayClassSetup(ClassRoot array_root)
1084*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
1085*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Roles::uninterruptible_);
1086*795d594fSAndroid Build Coastguard Worker 
1087*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::DexCache> AllocDexCache(Thread* self, const DexFile& dex_file)
1088*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
1089*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Roles::uninterruptible_);
1090*795d594fSAndroid Build Coastguard Worker 
1091*795d594fSAndroid Build Coastguard Worker   // Used for tests and AppendToBootClassPath.
1092*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::DexCache> AllocAndInitializeDexCache(Thread* self,
1093*795d594fSAndroid Build Coastguard Worker                                                       const DexFile& dex_file,
1094*795d594fSAndroid Build Coastguard Worker                                                       ObjPtr<mirror::ClassLoader> class_loader)
1095*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
1096*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_)
1097*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Roles::uninterruptible_);
1098*795d594fSAndroid Build Coastguard Worker 
1099*795d594fSAndroid Build Coastguard Worker   // Create a primitive class and store it in the appropriate class root.
1100*795d594fSAndroid Build Coastguard Worker   void CreatePrimitiveClass(Thread* self, Primitive::Type type, ClassRoot primitive_root)
1101*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
1102*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Roles::uninterruptible_);
1103*795d594fSAndroid Build Coastguard Worker 
1104*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> CreateArrayClass(Thread* self,
1105*795d594fSAndroid Build Coastguard Worker                                          const char* descriptor,
1106*795d594fSAndroid Build Coastguard Worker                                          size_t descriptor_length,
1107*795d594fSAndroid Build Coastguard Worker                                          size_t hash,
1108*795d594fSAndroid Build Coastguard Worker                                          Handle<mirror::ClassLoader> class_loader)
1109*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
1110*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
1111*795d594fSAndroid Build Coastguard Worker 
1112*795d594fSAndroid Build Coastguard Worker   // Precomputes size needed for Class, in the case of a non-temporary class this size must be
1113*795d594fSAndroid Build Coastguard Worker   // sufficient to hold all static fields.
1114*795d594fSAndroid Build Coastguard Worker   uint32_t SizeOfClassWithoutEmbeddedTables(const DexFile& dex_file,
1115*795d594fSAndroid Build Coastguard Worker                                             const dex::ClassDef& dex_class_def);
1116*795d594fSAndroid Build Coastguard Worker 
1117*795d594fSAndroid Build Coastguard Worker   void LoadField(const ClassAccessor::Field& field, Handle<mirror::Class> klass, ArtField* dst)
1118*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1119*795d594fSAndroid Build Coastguard Worker 
1120*795d594fSAndroid Build Coastguard Worker   void LoadMethod(const DexFile& dex_file,
1121*795d594fSAndroid Build Coastguard Worker                   const ClassAccessor::Method& method,
1122*795d594fSAndroid Build Coastguard Worker                   ObjPtr<mirror::Class> klass,
1123*795d594fSAndroid Build Coastguard Worker                   /*inout*/ MethodAnnotationsIterator* mai,
1124*795d594fSAndroid Build Coastguard Worker                   /*out*/ ArtMethod* dst)
1125*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1126*795d594fSAndroid Build Coastguard Worker 
1127*795d594fSAndroid Build Coastguard Worker   void LinkCode(ArtMethod* method,
1128*795d594fSAndroid Build Coastguard Worker                 uint32_t class_def_method_index,
1129*795d594fSAndroid Build Coastguard Worker                 /*inout*/ OatClassCodeIterator* occi) REQUIRES_SHARED(Locks::mutator_lock_);
1130*795d594fSAndroid Build Coastguard Worker 
1131*795d594fSAndroid Build Coastguard Worker   void FixupStaticTrampolines(Thread* self, ObjPtr<mirror::Class> klass)
1132*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1133*795d594fSAndroid Build Coastguard Worker 
1134*795d594fSAndroid Build Coastguard Worker   // Finds a class in a Path- or DexClassLoader, loading it if necessary without using JNI. Hash
1135*795d594fSAndroid Build Coastguard Worker   // function is supposed to be ComputeModifiedUtf8Hash(descriptor). Returns true if the
1136*795d594fSAndroid Build Coastguard Worker   // class-loader chain could be handled, false otherwise, i.e., a non-supported class-loader
1137*795d594fSAndroid Build Coastguard Worker   // was encountered while walking the parent chain (currently only BootClassLoader and
1138*795d594fSAndroid Build Coastguard Worker   // PathClassLoader are supported).
1139*795d594fSAndroid Build Coastguard Worker   bool FindClassInBaseDexClassLoader(Thread* self,
1140*795d594fSAndroid Build Coastguard Worker                                      const char* descriptor,
1141*795d594fSAndroid Build Coastguard Worker                                      size_t descriptor_length,
1142*795d594fSAndroid Build Coastguard Worker                                      size_t hash,
1143*795d594fSAndroid Build Coastguard Worker                                      Handle<mirror::ClassLoader> class_loader,
1144*795d594fSAndroid Build Coastguard Worker                                      /*out*/ ObjPtr<mirror::Class>* result)
1145*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
1146*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_);
1147*795d594fSAndroid Build Coastguard Worker 
1148*795d594fSAndroid Build Coastguard Worker   bool FindClassInSharedLibraries(Thread* self,
1149*795d594fSAndroid Build Coastguard Worker                                   const char* descriptor,
1150*795d594fSAndroid Build Coastguard Worker                                   size_t descriptor_length,
1151*795d594fSAndroid Build Coastguard Worker                                   size_t hash,
1152*795d594fSAndroid Build Coastguard Worker                                   Handle<mirror::ClassLoader> class_loader,
1153*795d594fSAndroid Build Coastguard Worker                                   /*out*/ ObjPtr<mirror::Class>* result)
1154*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
1155*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_);
1156*795d594fSAndroid Build Coastguard Worker 
1157*795d594fSAndroid Build Coastguard Worker   bool FindClassInSharedLibrariesHelper(Thread* self,
1158*795d594fSAndroid Build Coastguard Worker                                         const char* descriptor,
1159*795d594fSAndroid Build Coastguard Worker                                         size_t descriptor_length,
1160*795d594fSAndroid Build Coastguard Worker                                         size_t hash,
1161*795d594fSAndroid Build Coastguard Worker                                         Handle<mirror::ClassLoader> class_loader,
1162*795d594fSAndroid Build Coastguard Worker                                         ArtField* field,
1163*795d594fSAndroid Build Coastguard Worker                                         /*out*/ ObjPtr<mirror::Class>* result)
1164*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
1165*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_);
1166*795d594fSAndroid Build Coastguard Worker 
1167*795d594fSAndroid Build Coastguard Worker   bool FindClassInSharedLibrariesAfter(Thread* self,
1168*795d594fSAndroid Build Coastguard Worker                                        const char* descriptor,
1169*795d594fSAndroid Build Coastguard Worker                                        size_t descriptor_length,
1170*795d594fSAndroid Build Coastguard Worker                                        size_t hash,
1171*795d594fSAndroid Build Coastguard Worker                                        Handle<mirror::ClassLoader> class_loader,
1172*795d594fSAndroid Build Coastguard Worker                                        /*out*/ ObjPtr<mirror::Class>* result)
1173*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
1174*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_);
1175*795d594fSAndroid Build Coastguard Worker 
1176*795d594fSAndroid Build Coastguard Worker   // Finds the class in the classpath of the given class loader. It only searches the class loader
1177*795d594fSAndroid Build Coastguard Worker   // dex files and does not recurse into its parent.
1178*795d594fSAndroid Build Coastguard Worker   // The method checks that the provided class loader is either a PathClassLoader or a
1179*795d594fSAndroid Build Coastguard Worker   // DexClassLoader.
1180*795d594fSAndroid Build Coastguard Worker   // If the class is found the method updates `result`.
1181*795d594fSAndroid Build Coastguard Worker   // The method always returns true, to notify to the caller a
1182*795d594fSAndroid Build Coastguard Worker   // BaseDexClassLoader has a known lookup.
1183*795d594fSAndroid Build Coastguard Worker   bool FindClassInBaseDexClassLoaderClassPath(
1184*795d594fSAndroid Build Coastguard Worker           Thread* self,
1185*795d594fSAndroid Build Coastguard Worker           const char* descriptor,
1186*795d594fSAndroid Build Coastguard Worker           size_t descriptor_length,
1187*795d594fSAndroid Build Coastguard Worker           size_t hash,
1188*795d594fSAndroid Build Coastguard Worker           Handle<mirror::ClassLoader> class_loader,
1189*795d594fSAndroid Build Coastguard Worker           /*out*/ ObjPtr<mirror::Class>* result)
1190*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
1191*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_);
1192*795d594fSAndroid Build Coastguard Worker 
1193*795d594fSAndroid Build Coastguard Worker   // Finds the class in the boot class loader.
1194*795d594fSAndroid Build Coastguard Worker   // If the class is found the method updates `result`.
1195*795d594fSAndroid Build Coastguard Worker   // The method always returns true, to notify to the caller the
1196*795d594fSAndroid Build Coastguard Worker   // boot class loader has a known lookup.
1197*795d594fSAndroid Build Coastguard Worker   bool FindClassInBootClassLoaderClassPath(Thread* self,
1198*795d594fSAndroid Build Coastguard Worker                                            const char* descriptor,
1199*795d594fSAndroid Build Coastguard Worker                                            size_t descriptor_length,
1200*795d594fSAndroid Build Coastguard Worker                                            size_t hash,
1201*795d594fSAndroid Build Coastguard Worker                                            /*out*/ ObjPtr<mirror::Class>* result)
1202*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
1203*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_);
1204*795d594fSAndroid Build Coastguard Worker 
1205*795d594fSAndroid Build Coastguard Worker   // Implementation of LookupResolvedType() called when the type was not found in the dex cache.
1206*795d594fSAndroid Build Coastguard Worker   EXPORT ObjPtr<mirror::Class> DoLookupResolvedType(dex::TypeIndex type_idx,
1207*795d594fSAndroid Build Coastguard Worker                                                     ObjPtr<mirror::Class> referrer)
1208*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1209*795d594fSAndroid Build Coastguard Worker   EXPORT ObjPtr<mirror::Class> DoLookupResolvedType(dex::TypeIndex type_idx,
1210*795d594fSAndroid Build Coastguard Worker                                                     ObjPtr<mirror::DexCache> dex_cache,
1211*795d594fSAndroid Build Coastguard Worker                                                     ObjPtr<mirror::ClassLoader> class_loader)
1212*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1213*795d594fSAndroid Build Coastguard Worker 
1214*795d594fSAndroid Build Coastguard Worker   // Implementation of ResolveString() called when the string was not found in the dex cache.
1215*795d594fSAndroid Build Coastguard Worker   EXPORT ObjPtr<mirror::String> DoResolveString(dex::StringIndex string_idx,
1216*795d594fSAndroid Build Coastguard Worker                                                 ObjPtr<mirror::DexCache> dex_cache)
1217*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1218*795d594fSAndroid Build Coastguard Worker   EXPORT ObjPtr<mirror::String> DoResolveString(dex::StringIndex string_idx,
1219*795d594fSAndroid Build Coastguard Worker                                                 Handle<mirror::DexCache> dex_cache)
1220*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1221*795d594fSAndroid Build Coastguard Worker 
1222*795d594fSAndroid Build Coastguard Worker   // Implementation of LookupString() called when the string was not found in the dex cache.
1223*795d594fSAndroid Build Coastguard Worker   EXPORT ObjPtr<mirror::String> DoLookupString(dex::StringIndex string_idx,
1224*795d594fSAndroid Build Coastguard Worker                                                ObjPtr<mirror::DexCache> dex_cache)
1225*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1226*795d594fSAndroid Build Coastguard Worker 
1227*795d594fSAndroid Build Coastguard Worker   // Implementation of ResolveType() called when the type was not found in the dex cache. May be
1228*795d594fSAndroid Build Coastguard Worker   // used with ArtField*, ArtMethod* or ObjPtr<Class>.
1229*795d594fSAndroid Build Coastguard Worker   template <typename RefType>
1230*795d594fSAndroid Build Coastguard Worker   EXPORT ObjPtr<mirror::Class> DoResolveType(dex::TypeIndex type_idx, RefType referrer)
1231*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
1232*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
1233*795d594fSAndroid Build Coastguard Worker   EXPORT ObjPtr<mirror::Class> DoResolveType(dex::TypeIndex type_idx,
1234*795d594fSAndroid Build Coastguard Worker                                              Handle<mirror::DexCache> dex_cache,
1235*795d594fSAndroid Build Coastguard Worker                                              Handle<mirror::ClassLoader> class_loader)
1236*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
1237*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
1238*795d594fSAndroid Build Coastguard Worker 
1239*795d594fSAndroid Build Coastguard Worker   // Finds a class by its descriptor, returning NULL if it isn't wasn't loaded
1240*795d594fSAndroid Build Coastguard Worker   // by the given 'class_loader'. Uses the provided hash for the descriptor.
1241*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> LookupClass(Thread* self,
1242*795d594fSAndroid Build Coastguard Worker                                     std::string_view descriptor,
1243*795d594fSAndroid Build Coastguard Worker                                     size_t hash,
1244*795d594fSAndroid Build Coastguard Worker                                     ObjPtr<mirror::ClassLoader> class_loader)
1245*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::classlinker_classes_lock_)
1246*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1247*795d594fSAndroid Build Coastguard Worker 
1248*795d594fSAndroid Build Coastguard Worker   void RegisterDexFileLocked(const DexFile& dex_file,
1249*795d594fSAndroid Build Coastguard Worker                              ObjPtr<mirror::DexCache> dex_cache,
1250*795d594fSAndroid Build Coastguard Worker                              ObjPtr<mirror::ClassLoader> class_loader)
1251*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::dex_lock_)
1252*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1253*795d594fSAndroid Build Coastguard Worker   const DexCacheData* FindDexCacheDataLocked(const DexFile& dex_file)
1254*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::dex_lock_);
1255*795d594fSAndroid Build Coastguard Worker   const DexCacheData* FindDexCacheDataLocked(const OatDexFile& oat_dex_file)
1256*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::dex_lock_);
1257*795d594fSAndroid Build Coastguard Worker   static ObjPtr<mirror::DexCache> DecodeDexCacheLocked(Thread* self, const DexCacheData* data)
1258*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::dex_lock_, Locks::mutator_lock_);
1259*795d594fSAndroid Build Coastguard Worker   bool IsSameClassLoader(ObjPtr<mirror::DexCache> dex_cache,
1260*795d594fSAndroid Build Coastguard Worker                          const DexCacheData* data,
1261*795d594fSAndroid Build Coastguard Worker                          ObjPtr<mirror::ClassLoader> class_loader)
1262*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::dex_lock_, Locks::mutator_lock_);
1263*795d594fSAndroid Build Coastguard Worker 
1264*795d594fSAndroid Build Coastguard Worker   bool InitializeDefaultInterfaceRecursive(Thread* self,
1265*795d594fSAndroid Build Coastguard Worker                                            Handle<mirror::Class> klass,
1266*795d594fSAndroid Build Coastguard Worker                                            bool can_run_clinit,
1267*795d594fSAndroid Build Coastguard Worker                                            bool can_init_parents)
1268*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_)
1269*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1270*795d594fSAndroid Build Coastguard Worker   bool WaitForInitializeClass(Handle<mirror::Class> klass,
1271*795d594fSAndroid Build Coastguard Worker                               Thread* self,
1272*795d594fSAndroid Build Coastguard Worker                               ObjectLock<mirror::Class>& lock);
1273*795d594fSAndroid Build Coastguard Worker 
1274*795d594fSAndroid Build Coastguard Worker   bool IsSameDescriptorInDifferentClassContexts(Thread* self,
1275*795d594fSAndroid Build Coastguard Worker                                                 const char* descriptor,
1276*795d594fSAndroid Build Coastguard Worker                                                 Handle<mirror::ClassLoader> class_loader1,
1277*795d594fSAndroid Build Coastguard Worker                                                 Handle<mirror::ClassLoader> class_loader2)
1278*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1279*795d594fSAndroid Build Coastguard Worker 
1280*795d594fSAndroid Build Coastguard Worker   bool IsSameMethodSignatureInDifferentClassContexts(Thread* self,
1281*795d594fSAndroid Build Coastguard Worker                                                      ArtMethod* method,
1282*795d594fSAndroid Build Coastguard Worker                                                      ObjPtr<mirror::Class> klass1,
1283*795d594fSAndroid Build Coastguard Worker                                                      ObjPtr<mirror::Class> klass2)
1284*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1285*795d594fSAndroid Build Coastguard Worker 
1286*795d594fSAndroid Build Coastguard Worker   bool LinkSuperClass(Handle<mirror::Class> klass)
1287*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1288*795d594fSAndroid Build Coastguard Worker 
1289*795d594fSAndroid Build Coastguard Worker   bool LoadSuperAndInterfaces(Handle<mirror::Class> klass, const DexFile& dex_file)
1290*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
1291*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_);
1292*795d594fSAndroid Build Coastguard Worker 
1293*795d594fSAndroid Build Coastguard Worker   bool LinkMethods(Thread* self,
1294*795d594fSAndroid Build Coastguard Worker                    Handle<mirror::Class> klass,
1295*795d594fSAndroid Build Coastguard Worker                    Handle<mirror::ObjectArray<mirror::Class>> interfaces,
1296*795d594fSAndroid Build Coastguard Worker                    bool* out_new_conflict,
1297*795d594fSAndroid Build Coastguard Worker                    ArtMethod** out_imt)
1298*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1299*795d594fSAndroid Build Coastguard Worker 
1300*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::MethodHandle> ResolveMethodHandleForField(
1301*795d594fSAndroid Build Coastguard Worker       Thread* self,
1302*795d594fSAndroid Build Coastguard Worker       const dex::MethodHandleItem& method_handle,
1303*795d594fSAndroid Build Coastguard Worker       ArtMethod* referrer) REQUIRES_SHARED(Locks::mutator_lock_);
1304*795d594fSAndroid Build Coastguard Worker 
1305*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::MethodHandle> ResolveMethodHandleForMethod(
1306*795d594fSAndroid Build Coastguard Worker       Thread* self,
1307*795d594fSAndroid Build Coastguard Worker       const dex::MethodHandleItem& method_handle,
1308*795d594fSAndroid Build Coastguard Worker       ArtMethod* referrer) REQUIRES_SHARED(Locks::mutator_lock_);
1309*795d594fSAndroid Build Coastguard Worker 
1310*795d594fSAndroid Build Coastguard Worker   bool LinkStaticFields(Thread* self, Handle<mirror::Class> klass, size_t* class_size)
1311*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1312*795d594fSAndroid Build Coastguard Worker   bool LinkInstanceFields(Thread* self, Handle<mirror::Class> klass)
1313*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1314*795d594fSAndroid Build Coastguard Worker   bool VerifyRecordClass(Handle<mirror::Class> klass, ObjPtr<mirror::Class> super)
1315*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1316*795d594fSAndroid Build Coastguard Worker 
1317*795d594fSAndroid Build Coastguard Worker   void CheckProxyConstructor(ArtMethod* constructor) const
1318*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1319*795d594fSAndroid Build Coastguard Worker   void CheckProxyMethod(ArtMethod* method, ArtMethod* prototype) const
1320*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1321*795d594fSAndroid Build Coastguard Worker 
GetDexCacheCount()1322*795d594fSAndroid Build Coastguard Worker   size_t GetDexCacheCount() REQUIRES_SHARED(Locks::mutator_lock_, Locks::dex_lock_) {
1323*795d594fSAndroid Build Coastguard Worker     return dex_caches_.size();
1324*795d594fSAndroid Build Coastguard Worker   }
GetDexCachesData()1325*795d594fSAndroid Build Coastguard Worker   const std::unordered_map<const DexFile*, DexCacheData>& GetDexCachesData()
1326*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_, Locks::dex_lock_) {
1327*795d594fSAndroid Build Coastguard Worker     return dex_caches_;
1328*795d594fSAndroid Build Coastguard Worker   }
1329*795d594fSAndroid Build Coastguard Worker 
1330*795d594fSAndroid Build Coastguard Worker   void CreateProxyConstructor(Handle<mirror::Class> klass, ArtMethod* out)
1331*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1332*795d594fSAndroid Build Coastguard Worker   void CreateProxyMethod(Handle<mirror::Class> klass, ArtMethod* prototype, ArtMethod* out)
1333*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1334*795d594fSAndroid Build Coastguard Worker 
1335*795d594fSAndroid Build Coastguard Worker   // Register a class loader and create its class table and allocator. Should not be called if
1336*795d594fSAndroid Build Coastguard Worker   // these are already created.
1337*795d594fSAndroid Build Coastguard Worker   void RegisterClassLoader(ObjPtr<mirror::ClassLoader> class_loader)
1338*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
1339*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::classlinker_classes_lock_);
1340*795d594fSAndroid Build Coastguard Worker 
1341*795d594fSAndroid Build Coastguard Worker   // Insert a new class table if not found.
1342*795d594fSAndroid Build Coastguard Worker   ClassTable* InsertClassTableForClassLoader(ObjPtr<mirror::ClassLoader> class_loader)
1343*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
1344*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::classlinker_classes_lock_);
1345*795d594fSAndroid Build Coastguard Worker 
1346*795d594fSAndroid Build Coastguard Worker   // EnsureResolved is called to make sure that a class in the class_table_ has been resolved
1347*795d594fSAndroid Build Coastguard Worker   // before returning it to the caller. Its the responsibility of the thread that placed the class
1348*795d594fSAndroid Build Coastguard Worker   // in the table to make it resolved. The thread doing resolution must notify on the class' lock
1349*795d594fSAndroid Build Coastguard Worker   // when resolution has occurred. This happens in mirror::Class::SetStatus. As resolution may
1350*795d594fSAndroid Build Coastguard Worker   // retire a class, the version of the class in the table is returned and this may differ from
1351*795d594fSAndroid Build Coastguard Worker   // the class passed in.
1352*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> EnsureResolved(Thread* self,
1353*795d594fSAndroid Build Coastguard Worker                                        std::string_view descriptor,
1354*795d594fSAndroid Build Coastguard Worker                                        ObjPtr<mirror::Class> klass)
1355*795d594fSAndroid Build Coastguard Worker       WARN_UNUSED
1356*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
1357*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_);
1358*795d594fSAndroid Build Coastguard Worker 
1359*795d594fSAndroid Build Coastguard Worker   void FixupTemporaryDeclaringClass(ObjPtr<mirror::Class> temp_class,
1360*795d594fSAndroid Build Coastguard Worker                                     ObjPtr<mirror::Class> new_class)
1361*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1362*795d594fSAndroid Build Coastguard Worker 
1363*795d594fSAndroid Build Coastguard Worker   void SetClassRoot(ClassRoot class_root, ObjPtr<mirror::Class> klass)
1364*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1365*795d594fSAndroid Build Coastguard Worker 
1366*795d594fSAndroid Build Coastguard Worker   // Return the quick generic JNI stub for testing.
1367*795d594fSAndroid Build Coastguard Worker   const void* GetRuntimeQuickGenericJniStub() const;
1368*795d594fSAndroid Build Coastguard Worker 
1369*795d594fSAndroid Build Coastguard Worker   bool CanWeInitializeClass(ObjPtr<mirror::Class> klass,
1370*795d594fSAndroid Build Coastguard Worker                             bool can_init_statics,
1371*795d594fSAndroid Build Coastguard Worker                             bool can_init_parents)
1372*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1373*795d594fSAndroid Build Coastguard Worker 
1374*795d594fSAndroid Build Coastguard Worker   void UpdateClassMethods(ObjPtr<mirror::Class> klass,
1375*795d594fSAndroid Build Coastguard Worker                           LengthPrefixedArray<ArtMethod>* new_methods)
1376*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
1377*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::classlinker_classes_lock_);
1378*795d594fSAndroid Build Coastguard Worker 
1379*795d594fSAndroid Build Coastguard Worker   // Check that c1 == FindSystemClass(self, descriptor). Abort with class dumps otherwise.
1380*795d594fSAndroid Build Coastguard Worker   void CheckSystemClass(Thread* self, Handle<mirror::Class> c1, const char* descriptor)
1381*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_)
1382*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1383*795d594fSAndroid Build Coastguard Worker 
1384*795d594fSAndroid Build Coastguard Worker   // Sets imt_ref appropriately for LinkInterfaceMethods.
1385*795d594fSAndroid Build Coastguard Worker   // If there is no method in the imt location of imt_ref it will store the given method there.
1386*795d594fSAndroid Build Coastguard Worker   // Otherwise it will set the conflict method which will figure out which method to use during
1387*795d594fSAndroid Build Coastguard Worker   // runtime.
1388*795d594fSAndroid Build Coastguard Worker   void SetIMTRef(ArtMethod* unimplemented_method,
1389*795d594fSAndroid Build Coastguard Worker                  ArtMethod* imt_conflict_method,
1390*795d594fSAndroid Build Coastguard Worker                  ArtMethod* current_method,
1391*795d594fSAndroid Build Coastguard Worker                  /*out*/bool* new_conflict,
1392*795d594fSAndroid Build Coastguard Worker                  /*out*/ArtMethod** imt_ref) REQUIRES_SHARED(Locks::mutator_lock_);
1393*795d594fSAndroid Build Coastguard Worker 
1394*795d594fSAndroid Build Coastguard Worker   void FillIMTFromIfTable(ObjPtr<mirror::IfTable> if_table,
1395*795d594fSAndroid Build Coastguard Worker                           ArtMethod* unimplemented_method,
1396*795d594fSAndroid Build Coastguard Worker                           ArtMethod* imt_conflict_method,
1397*795d594fSAndroid Build Coastguard Worker                           ObjPtr<mirror::Class> klass,
1398*795d594fSAndroid Build Coastguard Worker                           bool create_conflict_tables,
1399*795d594fSAndroid Build Coastguard Worker                           bool ignore_copied_methods,
1400*795d594fSAndroid Build Coastguard Worker                           /*out*/bool* new_conflict,
1401*795d594fSAndroid Build Coastguard Worker                           /*out*/ArtMethod** imt) REQUIRES_SHARED(Locks::mutator_lock_);
1402*795d594fSAndroid Build Coastguard Worker 
1403*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::IfTable> GetArrayIfTable() REQUIRES_SHARED(Locks::mutator_lock_);
1404*795d594fSAndroid Build Coastguard Worker 
1405*795d594fSAndroid Build Coastguard Worker   bool OpenAndInitImageDexFiles(const gc::space::ImageSpace* space,
1406*795d594fSAndroid Build Coastguard Worker                                 Handle<mirror::ClassLoader> class_loader,
1407*795d594fSAndroid Build Coastguard Worker                                 std::vector<std::unique_ptr<const DexFile>>* out_dex_files,
1408*795d594fSAndroid Build Coastguard Worker                                 std::string* error_msg) REQUIRES(!Locks::dex_lock_)
1409*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1410*795d594fSAndroid Build Coastguard Worker 
1411*795d594fSAndroid Build Coastguard Worker   bool AddImageSpace(gc::space::ImageSpace* space,
1412*795d594fSAndroid Build Coastguard Worker                      Handle<mirror::ClassLoader> class_loader,
1413*795d594fSAndroid Build Coastguard Worker                      ClassLoaderContext* context,
1414*795d594fSAndroid Build Coastguard Worker                      const std::vector<std::unique_ptr<const DexFile>>& dex_files,
1415*795d594fSAndroid Build Coastguard Worker                      std::string* error_msg) REQUIRES(!Locks::dex_lock_)
1416*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1417*795d594fSAndroid Build Coastguard Worker 
1418*795d594fSAndroid Build Coastguard Worker   std::vector<const DexFile*> boot_class_path_;
1419*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> boot_dex_files_;
1420*795d594fSAndroid Build Coastguard Worker 
1421*795d594fSAndroid Build Coastguard Worker   // JNI weak globals and side data to allow dex caches to get unloaded. We lazily delete weak
1422*795d594fSAndroid Build Coastguard Worker   // globals when we register new dex files.
1423*795d594fSAndroid Build Coastguard Worker   std::unordered_map<const DexFile*, DexCacheData> dex_caches_ GUARDED_BY(Locks::dex_lock_);
1424*795d594fSAndroid Build Coastguard Worker 
1425*795d594fSAndroid Build Coastguard Worker   // This contains the class loaders which have class tables. It is populated by
1426*795d594fSAndroid Build Coastguard Worker   // InsertClassTableForClassLoader.
1427*795d594fSAndroid Build Coastguard Worker   std::list<ClassLoaderData> class_loaders_
1428*795d594fSAndroid Build Coastguard Worker       GUARDED_BY(Locks::classlinker_classes_lock_);
1429*795d594fSAndroid Build Coastguard Worker 
1430*795d594fSAndroid Build Coastguard Worker   // Boot class path table. Since the class loader for this is null.
1431*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassTable> boot_class_table_ GUARDED_BY(Locks::classlinker_classes_lock_);
1432*795d594fSAndroid Build Coastguard Worker 
1433*795d594fSAndroid Build Coastguard Worker   // New gc-roots, only used by CMS/CMC since the GC needs to mark these in the pause.
1434*795d594fSAndroid Build Coastguard Worker   std::vector<GcRoot<mirror::Object>> new_roots_ GUARDED_BY(Locks::classlinker_classes_lock_);
1435*795d594fSAndroid Build Coastguard Worker 
1436*795d594fSAndroid Build Coastguard Worker   // Boot image oat files with new .bss GC roots to be visited in the pause by CMS.
1437*795d594fSAndroid Build Coastguard Worker   std::vector<const OatFile*> new_bss_roots_boot_oat_files_
1438*795d594fSAndroid Build Coastguard Worker       GUARDED_BY(Locks::classlinker_classes_lock_);
1439*795d594fSAndroid Build Coastguard Worker 
1440*795d594fSAndroid Build Coastguard Worker   // Number of times we've searched dex caches for a class. After a certain number of misses we move
1441*795d594fSAndroid Build Coastguard Worker   // the classes into the class_table_ to avoid dex cache based searches.
1442*795d594fSAndroid Build Coastguard Worker   Atomic<uint32_t> failed_dex_cache_class_lookups_;
1443*795d594fSAndroid Build Coastguard Worker 
1444*795d594fSAndroid Build Coastguard Worker   // Well known mirror::Class roots.
1445*795d594fSAndroid Build Coastguard Worker   GcRoot<mirror::ObjectArray<mirror::Class>> class_roots_;
1446*795d594fSAndroid Build Coastguard Worker 
1447*795d594fSAndroid Build Coastguard Worker   // Method hashes for virtual methods from java.lang.Object used
1448*795d594fSAndroid Build Coastguard Worker   // to avoid recalculating them for each class we link.
1449*795d594fSAndroid Build Coastguard Worker   uint32_t object_virtual_method_hashes_[mirror::Object::kVTableLength];
1450*795d594fSAndroid Build Coastguard Worker 
1451*795d594fSAndroid Build Coastguard Worker   // A cache of the last FindArrayClass results. The cache serves to avoid creating array class
1452*795d594fSAndroid Build Coastguard Worker   // descriptors for the sake of performing FindClass.
1453*795d594fSAndroid Build Coastguard Worker   static constexpr size_t kFindArrayCacheSize = 16;
1454*795d594fSAndroid Build Coastguard Worker   std::atomic<GcRoot<mirror::Class>> find_array_class_cache_[kFindArrayCacheSize];
1455*795d594fSAndroid Build Coastguard Worker   size_t find_array_class_cache_next_victim_;
1456*795d594fSAndroid Build Coastguard Worker 
1457*795d594fSAndroid Build Coastguard Worker   bool init_done_;
1458*795d594fSAndroid Build Coastguard Worker   bool log_new_roots_ GUARDED_BY(Locks::classlinker_classes_lock_);
1459*795d594fSAndroid Build Coastguard Worker 
1460*795d594fSAndroid Build Coastguard Worker   InternTable* intern_table_;
1461*795d594fSAndroid Build Coastguard Worker 
1462*795d594fSAndroid Build Coastguard Worker   const bool fast_class_not_found_exceptions_;
1463*795d594fSAndroid Build Coastguard Worker 
1464*795d594fSAndroid Build Coastguard Worker   // Trampolines within the image the bounce to runtime entrypoints. Done so that there is a single
1465*795d594fSAndroid Build Coastguard Worker   // patch point within the image. TODO: make these proper relocations.
1466*795d594fSAndroid Build Coastguard Worker   const void* jni_dlsym_lookup_trampoline_;
1467*795d594fSAndroid Build Coastguard Worker   const void* jni_dlsym_lookup_critical_trampoline_;
1468*795d594fSAndroid Build Coastguard Worker   const void* quick_resolution_trampoline_;
1469*795d594fSAndroid Build Coastguard Worker   const void* quick_imt_conflict_trampoline_;
1470*795d594fSAndroid Build Coastguard Worker   const void* quick_generic_jni_trampoline_;
1471*795d594fSAndroid Build Coastguard Worker   const void* quick_to_interpreter_bridge_trampoline_;
1472*795d594fSAndroid Build Coastguard Worker   const void* nterp_trampoline_;
1473*795d594fSAndroid Build Coastguard Worker 
1474*795d594fSAndroid Build Coastguard Worker   // Image pointer size.
1475*795d594fSAndroid Build Coastguard Worker   PointerSize image_pointer_size_;
1476*795d594fSAndroid Build Coastguard Worker 
1477*795d594fSAndroid Build Coastguard Worker   // Classes to transition from ClassStatus::kInitialized to ClassStatus::kVisiblyInitialized.
1478*795d594fSAndroid Build Coastguard Worker   Mutex visibly_initialized_callback_lock_;
1479*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<VisiblyInitializedCallback> visibly_initialized_callback_
1480*795d594fSAndroid Build Coastguard Worker       GUARDED_BY(visibly_initialized_callback_lock_);
1481*795d594fSAndroid Build Coastguard Worker   IntrusiveForwardList<VisiblyInitializedCallback> running_visibly_initialized_callbacks_
1482*795d594fSAndroid Build Coastguard Worker       GUARDED_BY(visibly_initialized_callback_lock_);
1483*795d594fSAndroid Build Coastguard Worker 
1484*795d594fSAndroid Build Coastguard Worker   // Whether to use `membarrier()` to make classes visibly initialized.
1485*795d594fSAndroid Build Coastguard Worker   bool visibly_initialize_classes_with_membarier_;
1486*795d594fSAndroid Build Coastguard Worker 
1487*795d594fSAndroid Build Coastguard Worker   // Registered native code for @CriticalNative methods of classes that are not visibly
1488*795d594fSAndroid Build Coastguard Worker   // initialized. These code pointers cannot be stored in ArtMethod as that would risk
1489*795d594fSAndroid Build Coastguard Worker   // skipping the class initialization check for direct calls from compiled code.
1490*795d594fSAndroid Build Coastguard Worker   Mutex critical_native_code_with_clinit_check_lock_;
1491*795d594fSAndroid Build Coastguard Worker   std::map<ArtMethod*, void*> critical_native_code_with_clinit_check_
1492*795d594fSAndroid Build Coastguard Worker       GUARDED_BY(critical_native_code_with_clinit_check_lock_);
1493*795d594fSAndroid Build Coastguard Worker 
1494*795d594fSAndroid Build Coastguard Worker   // Load unique JNI stubs from boot images. If the subsequently loaded native methods could find a
1495*795d594fSAndroid Build Coastguard Worker   // matching stub, then reuse it without JIT/AOT compilation.
1496*795d594fSAndroid Build Coastguard Worker   JniStubHashMap<const void*> boot_image_jni_stubs_;
1497*795d594fSAndroid Build Coastguard Worker 
1498*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassHierarchyAnalysis> cha_;
1499*795d594fSAndroid Build Coastguard Worker 
1500*795d594fSAndroid Build Coastguard Worker   class FindVirtualMethodHolderVisitor;
1501*795d594fSAndroid Build Coastguard Worker 
1502*795d594fSAndroid Build Coastguard Worker   friend class AppImageLoadingHelper;
1503*795d594fSAndroid Build Coastguard Worker   friend class ImageDumper;  // for DexLock
1504*795d594fSAndroid Build Coastguard Worker   friend struct linker::CompilationHelper;  // For Compile in ImageTest.
1505*795d594fSAndroid Build Coastguard Worker   friend class linker::ImageWriter;  // for GetClassRoots
1506*795d594fSAndroid Build Coastguard Worker   friend class JniCompilerTest;  // for GetRuntimeQuickGenericJniStub
1507*795d594fSAndroid Build Coastguard Worker   friend class JniInternalTest;  // for GetRuntimeQuickGenericJniStub
1508*795d594fSAndroid Build Coastguard Worker   friend class VerifyClassesFuzzerHelper;  // for FindDexCacheDataLocked.
1509*795d594fSAndroid Build Coastguard Worker   friend class VerifyClassesFuzzerCorpusTestHelper;  // for FindDexCacheDataLocked.
1510*795d594fSAndroid Build Coastguard Worker   friend class VMClassLoader;  // for LookupClass and FindClassInBaseDexClassLoader.
1511*795d594fSAndroid Build Coastguard Worker   ART_FRIEND_TEST(ClassLinkerTest, RegisterDexFileName);  // for DexLock, and RegisterDexFileLocked
1512*795d594fSAndroid Build Coastguard Worker   ART_FRIEND_TEST(mirror::DexCacheMethodHandlesTest, Open);  // for AllocDexCache
1513*795d594fSAndroid Build Coastguard Worker   ART_FRIEND_TEST(mirror::DexCacheTest, Open);  // for AllocDexCache
1514*795d594fSAndroid Build Coastguard Worker   DISALLOW_COPY_AND_ASSIGN(ClassLinker);
1515*795d594fSAndroid Build Coastguard Worker };
1516*795d594fSAndroid Build Coastguard Worker 
1517*795d594fSAndroid Build Coastguard Worker class ClassLoadCallback {
1518*795d594fSAndroid Build Coastguard Worker  public:
~ClassLoadCallback()1519*795d594fSAndroid Build Coastguard Worker   virtual ~ClassLoadCallback() {}
1520*795d594fSAndroid Build Coastguard Worker 
1521*795d594fSAndroid Build Coastguard Worker   // Called immediately before beginning class-definition and immediately before returning from it.
BeginDefineClass()1522*795d594fSAndroid Build Coastguard Worker   virtual void BeginDefineClass() REQUIRES_SHARED(Locks::mutator_lock_) {}
EndDefineClass()1523*795d594fSAndroid Build Coastguard Worker   virtual void EndDefineClass() REQUIRES_SHARED(Locks::mutator_lock_) {}
1524*795d594fSAndroid Build Coastguard Worker 
1525*795d594fSAndroid Build Coastguard Worker   // If set we will replace initial_class_def & initial_dex_file with the final versions. The
1526*795d594fSAndroid Build Coastguard Worker   // callback author is responsible for ensuring these are allocated in such a way they can be
1527*795d594fSAndroid Build Coastguard Worker   // cleaned up if another transformation occurs. Note that both must be set or null/unchanged on
1528*795d594fSAndroid Build Coastguard Worker   // return.
1529*795d594fSAndroid Build Coastguard Worker   // Note: the class may be temporary, in which case a following ClassPrepare event will be a
1530*795d594fSAndroid Build Coastguard Worker   //       different object. It is the listener's responsibility to handle this.
1531*795d594fSAndroid Build Coastguard Worker   // Note: This callback is rarely useful so a default implementation has been given that does
1532*795d594fSAndroid Build Coastguard Worker   //       nothing.
ClassPreDefine(const char * descriptor,Handle<mirror::Class> klass,Handle<mirror::ClassLoader> class_loader,const DexFile & initial_dex_file,const dex::ClassDef & initial_class_def,DexFile const ** final_dex_file,dex::ClassDef const ** final_class_def)1533*795d594fSAndroid Build Coastguard Worker   virtual void ClassPreDefine([[maybe_unused]] const char* descriptor,
1534*795d594fSAndroid Build Coastguard Worker                               [[maybe_unused]] Handle<mirror::Class> klass,
1535*795d594fSAndroid Build Coastguard Worker                               [[maybe_unused]] Handle<mirror::ClassLoader> class_loader,
1536*795d594fSAndroid Build Coastguard Worker                               [[maybe_unused]] const DexFile& initial_dex_file,
1537*795d594fSAndroid Build Coastguard Worker                               [[maybe_unused]] const dex::ClassDef& initial_class_def,
1538*795d594fSAndroid Build Coastguard Worker                               [[maybe_unused]] /*out*/ DexFile const** final_dex_file,
1539*795d594fSAndroid Build Coastguard Worker                               [[maybe_unused]] /*out*/ dex::ClassDef const** final_class_def)
1540*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_) {}
1541*795d594fSAndroid Build Coastguard Worker 
1542*795d594fSAndroid Build Coastguard Worker   // A class has been loaded.
1543*795d594fSAndroid Build Coastguard Worker   // Note: the class may be temporary, in which case a following ClassPrepare event will be a
1544*795d594fSAndroid Build Coastguard Worker   //       different object. It is the listener's responsibility to handle this.
1545*795d594fSAndroid Build Coastguard Worker   virtual void ClassLoad(Handle<mirror::Class> klass) REQUIRES_SHARED(Locks::mutator_lock_) = 0;
1546*795d594fSAndroid Build Coastguard Worker 
1547*795d594fSAndroid Build Coastguard Worker   // A class has been prepared, i.e., resolved. As the ClassLoad event might have been for a
1548*795d594fSAndroid Build Coastguard Worker   // temporary class, provide both the former and the current class.
1549*795d594fSAndroid Build Coastguard Worker   virtual void ClassPrepare(Handle<mirror::Class> temp_klass,
1550*795d594fSAndroid Build Coastguard Worker                             Handle<mirror::Class> klass) REQUIRES_SHARED(Locks::mutator_lock_) = 0;
1551*795d594fSAndroid Build Coastguard Worker };
1552*795d594fSAndroid Build Coastguard Worker 
1553*795d594fSAndroid Build Coastguard Worker }  // namespace art
1554*795d594fSAndroid Build Coastguard Worker 
1555*795d594fSAndroid Build Coastguard Worker #endif  // ART_RUNTIME_CLASS_LINKER_H_
1556