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);  };  |