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