diff options
Diffstat (limited to 'runtime/class_linker.h')
-rw-r--r-- | runtime/class_linker.h | 148 |
1 files changed, 72 insertions, 76 deletions
diff --git a/runtime/class_linker.h b/runtime/class_linker.h index 373fa893ea..18479268ed 100644 --- a/runtime/class_linker.h +++ b/runtime/class_linker.h @@ -27,7 +27,6 @@ #include "base/mutex.h" #include "dex_file.h" #include "gc_root.h" -#include "gtest/gtest.h" #include "jni.h" #include "oat_file.h" #include "object_callbacks.h" @@ -60,6 +59,46 @@ enum VisitRootFlags : uint8_t; class ClassLinker { public: + // Well known mirror::Class roots accessed via GetClassRoot. + enum ClassRoot { + kJavaLangClass, + kJavaLangObject, + kClassArrayClass, + kObjectArrayClass, + kJavaLangString, + kJavaLangDexCache, + kJavaLangRefReference, + kJavaLangReflectArtField, + kJavaLangReflectArtMethod, + kJavaLangReflectProxy, + kJavaLangStringArrayClass, + kJavaLangReflectArtFieldArrayClass, + kJavaLangReflectArtMethodArrayClass, + kJavaLangClassLoader, + kJavaLangThrowable, + kJavaLangClassNotFoundException, + kJavaLangStackTraceElement, + kPrimitiveBoolean, + kPrimitiveByte, + kPrimitiveChar, + kPrimitiveDouble, + kPrimitiveFloat, + kPrimitiveInt, + kPrimitiveLong, + kPrimitiveShort, + kPrimitiveVoid, + kBooleanArrayClass, + kByteArrayClass, + kCharArrayClass, + kDoubleArrayClass, + kFloatArrayClass, + kIntArrayClass, + kLongArrayClass, + kShortArrayClass, + kJavaLangStackTraceElementArrayClass, + kClassRootsMax, + }; + explicit ClassLinker(InternTable* intern_table); ~ClassLinker(); @@ -371,34 +410,38 @@ class ClassLinker { pid_t GetClassesLockOwner(); // For SignalCatcher. pid_t GetDexLockOwner(); // For SignalCatcher. - const void* GetPortableResolutionTrampoline() const { - return portable_resolution_trampoline_; - } + mirror::Class* GetClassRoot(ClassRoot class_root) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - const void* GetQuickGenericJniTrampoline() const { - return quick_generic_jni_trampoline_; - } + static const char* GetClassRootDescriptor(ClassRoot class_root); - const void* GetQuickResolutionTrampoline() const { - return quick_resolution_trampoline_; - } + // Is the given entry point portable code to run the resolution stub? + bool IsPortableResolutionStub(const void* entry_point) const; - const void* GetPortableImtConflictTrampoline() const { - return portable_imt_conflict_trampoline_; - } + // Is the given entry point quick code to run the resolution stub? + bool IsQuickResolutionStub(const void* entry_point) const; - const void* GetQuickImtConflictTrampoline() const { - return quick_imt_conflict_trampoline_; - } + // Is the given entry point portable code to bridge into the interpreter? + bool IsPortableToInterpreterBridge(const void* entry_point) const; - const void* GetQuickToInterpreterBridgeTrampoline() const { - return quick_to_interpreter_bridge_trampoline_; - } + // Is the given entry point quick code to bridge into the interpreter? + bool IsQuickToInterpreterBridge(const void* entry_point) const; + + // Is the given entry point quick code to run the generic JNI stub? + bool IsQuickGenericJniStub(const void* entry_point) const; InternTable* GetInternTable() const { return intern_table_; } + // Set the entrypoints up for method to the given code. + void SetEntryPointsToCompiledCode(mirror::ArtMethod* method, const void* method_code, + bool is_portable) const + SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); + + // Set the entrypoints up for method to the enter the interpreter. + void SetEntryPointsToInterpreter(mirror::ArtMethod* method) const + SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); + // Attempts to insert a class into a class table. Returns NULL if // the class was inserted, otherwise returns an existing class with // the same descriptor and ClassLoader. @@ -668,6 +711,12 @@ class ClassLinker { void FixupTemporaryDeclaringClass(mirror::Class* temp_class, mirror::Class* new_class) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); + void SetClassRoot(ClassRoot class_root, mirror::Class* klass) + SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); + + // Return the quick generic JNI stub for testing. + const void* GetRuntimeQuickGenericJniStub() const; + std::vector<const DexFile*> boot_class_path_; mutable ReaderWriterMutex dex_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER; @@ -691,61 +740,9 @@ class ClassLinker { // the classes into the class_table_ to avoid dex cache based searches. Atomic<uint32_t> failed_dex_cache_class_lookups_; - // indexes into class_roots_. - // needs to be kept in sync with class_roots_descriptors_. - enum ClassRoot { - kJavaLangClass, - kJavaLangObject, - kClassArrayClass, - kObjectArrayClass, - kJavaLangString, - kJavaLangDexCache, - kJavaLangRefReference, - kJavaLangReflectArtField, - kJavaLangReflectArtMethod, - kJavaLangReflectProxy, - kJavaLangStringArrayClass, - kJavaLangReflectArtFieldArrayClass, - kJavaLangReflectArtMethodArrayClass, - kJavaLangClassLoader, - kJavaLangThrowable, - kJavaLangClassNotFoundException, - kJavaLangStackTraceElement, - kPrimitiveBoolean, - kPrimitiveByte, - kPrimitiveChar, - kPrimitiveDouble, - kPrimitiveFloat, - kPrimitiveInt, - kPrimitiveLong, - kPrimitiveShort, - kPrimitiveVoid, - kBooleanArrayClass, - kByteArrayClass, - kCharArrayClass, - kDoubleArrayClass, - kFloatArrayClass, - kIntArrayClass, - kLongArrayClass, - kShortArrayClass, - kJavaLangStackTraceElementArrayClass, - kClassRootsMax, - }; + // Well known mirror::Class roots. GcRoot<mirror::ObjectArray<mirror::Class>> class_roots_; - mirror::Class* GetClassRoot(ClassRoot class_root) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - - void SetClassRoot(ClassRoot class_root, mirror::Class* klass) - SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - - static const char* class_roots_descriptors_[]; - - const char* GetClassRootDescriptor(ClassRoot class_root) { - const char* descriptor = class_roots_descriptors_[class_root]; - CHECK(descriptor != NULL); - return descriptor; - } - // The interface table used by all arrays. GcRoot<mirror::IfTable> array_iftable_; @@ -773,12 +770,11 @@ class ClassLinker { friend class ImageWriter; // for GetClassRoots friend class ImageDumper; // for FindOpenedOatFileFromOatLocation friend class ElfPatcher; // for FindOpenedOatFileForDexFile & FindOpenedOatFileFromOatLocation + friend class JniCompilerTest; // for GetRuntimeQuickGenericJniStub friend class NoDex2OatTest; // for FindOpenedOatFileForDexFile friend class NoPatchoatTest; // for FindOpenedOatFileForDexFile - FRIEND_TEST(ClassLinkerTest, ClassRootDescriptors); - FRIEND_TEST(mirror::DexCacheTest, Open); - FRIEND_TEST(ExceptionTest, FindExceptionHandler); - FRIEND_TEST(ObjectTest, AllocObjectArray); + ART_FRIEND_TEST(mirror::DexCacheTest, Open); // for AllocDexCache + DISALLOW_COPY_AND_ASSIGN(ClassLinker); }; |