diff options
| author | 2016-10-04 21:45:24 +0000 | |
|---|---|---|
| committer | 2016-10-04 21:45:24 +0000 | |
| commit | 091f6754c353f5825129deff74d860caf28f78de (patch) | |
| tree | bc259b45bc292523e7a486569ac696e33204c10b /compiler/driver/compiler_driver.h | |
| parent | 26705cca4643385931f3b3568b6b82525400b52b (diff) | |
| parent | 38f250fd3cb36fac27bad7cac8eefacdf8a6e41e (diff) | |
Merge "Revert "Remove dead code from compiler driver.""
Diffstat (limited to 'compiler/driver/compiler_driver.h')
| -rw-r--r-- | compiler/driver/compiler_driver.h | 123 |
1 files changed, 112 insertions, 11 deletions
diff --git a/compiler/driver/compiler_driver.h b/compiler/driver/compiler_driver.h index 9a4dd857fc..eb1222c315 100644 --- a/compiler/driver/compiler_driver.h +++ b/compiler/driver/compiler_driver.h @@ -182,6 +182,15 @@ class CompilerDriver { uint16_t class_def_index) REQUIRES(!requires_constructor_barrier_lock_); + // Callbacks from compiler to see what runtime checks must be generated. + + bool CanAssumeTypeIsPresentInDexCache(Handle<mirror::DexCache> dex_cache, + uint32_t type_idx) + REQUIRES_SHARED(Locks::mutator_lock_); + + bool CanAssumeStringIsPresentInDexCache(const DexFile& dex_file, uint32_t string_idx) + REQUIRES(!Locks::mutator_lock_); + // Are runtime access checks necessary in the compiled code? bool CanAccessTypeWithoutChecks(uint32_t referrer_idx, Handle<mirror::DexCache> dex_cache, @@ -196,6 +205,24 @@ class CompilerDriver { bool* out_is_finalizable) REQUIRES_SHARED(Locks::mutator_lock_); + bool CanEmbedTypeInCode(const DexFile& dex_file, uint32_t type_idx, + bool* is_type_initialized, bool* use_direct_type_ptr, + uintptr_t* direct_type_ptr, bool* out_is_finalizable); + + // Query methods for the java.lang.ref.Reference class. + bool CanEmbedReferenceTypeInCode(ClassReference* ref, + bool* use_direct_type_ptr, uintptr_t* direct_type_ptr); + uint32_t GetReferenceSlowFlagOffset() const; + uint32_t GetReferenceDisableFlagOffset() const; + + // Get the DexCache for the + mirror::DexCache* GetDexCache(const DexCompilationUnit* mUnit) + REQUIRES_SHARED(Locks::mutator_lock_); + + mirror::ClassLoader* GetClassLoader(const ScopedObjectAccess& soa, + const DexCompilationUnit* mUnit) + REQUIRES_SHARED(Locks::mutator_lock_); + // Resolve compiling method's class. Returns null on failure. mirror::Class* ResolveCompilingMethodsClass( const ScopedObjectAccess& soa, Handle<mirror::DexCache> dex_cache, @@ -223,6 +250,19 @@ class CompilerDriver { uint32_t field_idx, bool is_static) REQUIRES_SHARED(Locks::mutator_lock_); + // Get declaration location of a resolved field. + void GetResolvedFieldDexFileLocation( + ArtField* resolved_field, const DexFile** declaring_dex_file, + uint16_t* declaring_class_idx, uint16_t* declaring_field_idx) + REQUIRES_SHARED(Locks::mutator_lock_); + + bool IsFieldVolatile(ArtField* field) REQUIRES_SHARED(Locks::mutator_lock_); + MemberOffset GetFieldOffset(ArtField* field) REQUIRES_SHARED(Locks::mutator_lock_); + + // Find a dex cache for a dex file. + inline mirror::DexCache* FindDexCache(const DexFile* dex_file) + REQUIRES_SHARED(Locks::mutator_lock_); + // Can we fast-path an IGET/IPUT access to an instance field? If yes, compute the field offset. std::pair<bool, bool> IsFastInstanceField( mirror::DexCache* dex_cache, mirror::Class* referrer_class, @@ -248,6 +288,15 @@ class CompilerDriver { uint32_t* storage_index) REQUIRES_SHARED(Locks::mutator_lock_); + // Is static field's in referrer's class? + bool IsStaticFieldInReferrerClass(mirror::Class* referrer_class, ArtField* resolved_field) + REQUIRES_SHARED(Locks::mutator_lock_); + + // Is static field's class initialized? + bool IsStaticFieldsClassInitialized(mirror::Class* referrer_class, + ArtField* resolved_field) + REQUIRES_SHARED(Locks::mutator_lock_); + // Resolve a method. Returns null on failure, including incompatible class change. ArtMethod* ResolveMethod( ScopedObjectAccess& soa, Handle<mirror::DexCache> dex_cache, @@ -255,8 +304,37 @@ class CompilerDriver { uint32_t method_idx, InvokeType invoke_type, bool check_incompatible_class_change = true) REQUIRES_SHARED(Locks::mutator_lock_); + // Get declaration location of a resolved field. + void GetResolvedMethodDexFileLocation( + ArtMethod* resolved_method, const DexFile** declaring_dex_file, + uint16_t* declaring_class_idx, uint16_t* declaring_method_idx) + REQUIRES_SHARED(Locks::mutator_lock_); + + // Get the index in the vtable of the method. + uint16_t GetResolvedMethodVTableIndex( + ArtMethod* resolved_method, InvokeType type) + REQUIRES_SHARED(Locks::mutator_lock_); + + // Is method's class initialized for an invoke? + // For static invokes to determine whether we need to consider potential call to <clinit>(). + // For non-static invokes, assuming a non-null reference, the class is always initialized. + bool IsMethodsClassInitialized(mirror::Class* referrer_class, ArtMethod* resolved_method) + REQUIRES_SHARED(Locks::mutator_lock_); + + // Get the layout of dex cache arrays for a dex file. Returns invalid layout if the + // dex cache arrays don't have a fixed layout. + DexCacheArraysLayout GetDexCacheArraysLayout(const DexFile* dex_file); + void ProcessedInstanceField(bool resolved); void ProcessedStaticField(bool resolved, bool local); + void ProcessedInvoke(InvokeType invoke_type, int flags); + + void ComputeFieldInfo(uint32_t field_idx, const DexCompilationUnit* mUnit, + const ScopedObjectAccess& soa, bool is_static, + ArtField** resolved_field, + mirror::Class** referrer_class, + mirror::DexCache** dex_cache) + REQUIRES_SHARED(Locks::mutator_lock_); // Can we fast path instance field access? Computes field's offset and volatility. bool ComputeInstanceFieldInfo(uint32_t field_idx, const DexCompilationUnit* mUnit, bool is_put, @@ -308,7 +386,6 @@ class CompilerDriver { void SetDedupeEnabled(bool dedupe_enabled) { compiled_method_storage_.SetDedupeEnabled(dedupe_enabled); } - bool DedupeEnabled() const { return compiled_method_storage_.DedupeEnabled(); } @@ -372,13 +449,6 @@ class CompilerDriver { return current_dex_to_dex_methods_; } - // Compute constant code and method pointers when possible. - void GetCodeAndMethodForDirectCall(const mirror::Class* referrer_class, - ArtMethod* method, - /* out */ uintptr_t* direct_code, - /* out */ uintptr_t* direct_method) - REQUIRES_SHARED(Locks::mutator_lock_); - private: // Return whether the declaring class of `resolved_member` is // available to `referrer_class` for read or write access using two @@ -407,9 +477,38 @@ class CompilerDriver { uint32_t field_idx) REQUIRES_SHARED(Locks::mutator_lock_); - mirror::ClassLoader* GetClassLoader(const ScopedObjectAccess& soa, - const DexCompilationUnit* mUnit) - REQUIRES_SHARED(Locks::mutator_lock_); + // Can we assume that the klass is initialized? + bool CanAssumeClassIsInitialized(mirror::Class* klass) + REQUIRES_SHARED(Locks::mutator_lock_); + bool CanReferrerAssumeClassIsInitialized(mirror::Class* referrer_class, mirror::Class* klass) + REQUIRES_SHARED(Locks::mutator_lock_); + + // These flags are internal to CompilerDriver for collecting INVOKE resolution statistics. + // The only external contract is that unresolved method has flags 0 and resolved non-0. + enum { + kBitMethodResolved = 0, + kBitVirtualMadeDirect, + kBitPreciseTypeDevirtualization, + kBitDirectCallToBoot, + kBitDirectMethodToBoot + }; + static constexpr int kFlagMethodResolved = 1 << kBitMethodResolved; + static constexpr int kFlagVirtualMadeDirect = 1 << kBitVirtualMadeDirect; + static constexpr int kFlagPreciseTypeDevirtualization = 1 << kBitPreciseTypeDevirtualization; + static constexpr int kFlagDirectCallToBoot = 1 << kBitDirectCallToBoot; + static constexpr int kFlagDirectMethodToBoot = 1 << kBitDirectMethodToBoot; + static constexpr int kFlagsMethodResolvedVirtualMadeDirect = + kFlagMethodResolved | kFlagVirtualMadeDirect; + static constexpr int kFlagsMethodResolvedPreciseTypeDevirtualization = + kFlagsMethodResolvedVirtualMadeDirect | kFlagPreciseTypeDevirtualization; + + public: // TODO make private or eliminate. + // Compute constant code and method pointers when possible. + void GetCodeAndMethodForDirectCall(const mirror::Class* referrer_class, + ArtMethod* method, + /* out */ uintptr_t* direct_code, + /* out */ uintptr_t* direct_method) + REQUIRES_SHARED(Locks::mutator_lock_); private: void PreCompile(jobject class_loader, @@ -467,6 +566,8 @@ class CompilerDriver { REQUIRES(!Locks::mutator_lock_, !compiled_classes_lock_); void UpdateImageClasses(TimingLogger* timings) REQUIRES(!Locks::mutator_lock_); + static void FindClinitImageClassesCallback(mirror::Object* object, void* arg) + REQUIRES_SHARED(Locks::mutator_lock_); void Compile(jobject class_loader, const std::vector<const DexFile*>& dex_files, |