diff options
author | Vladimir Marko <vmarko@google.com> | 2014-01-27 11:15:17 +0000 |
---|---|---|
committer | Vladimir Marko <vmarko@google.com> | 2014-01-28 11:22:42 +0000 |
commit | 2730db03beee4d6687ddfb5000c33c0370fbc6eb (patch) | |
tree | a85706c800c67deda5c7b612c8010059aa7b365c /compiler/driver | |
parent | c7f832061fea59fd6abd125f26c8ca1faec695a5 (diff) | |
download | art-2730db03beee4d6687ddfb5000c33c0370fbc6eb.tar.gz art-2730db03beee4d6687ddfb5000c33c0370fbc6eb.tar.bz2 art-2730db03beee4d6687ddfb5000c33c0370fbc6eb.zip |
Add VerfiedMethod to DexCompilationUnit.
Avoid some mutex locking and map lookups.
Change-Id: I8e0486af77e38dcd065569572a6b985eb57f4f63
Diffstat (limited to 'compiler/driver')
-rw-r--r-- | compiler/driver/compiler_driver.cc | 16 | ||||
-rw-r--r-- | compiler/driver/compiler_driver.h | 4 | ||||
-rw-r--r-- | compiler/driver/dex_compilation_unit.cc | 9 | ||||
-rw-r--r-- | compiler/driver/dex_compilation_unit.h | 9 |
4 files changed, 29 insertions, 9 deletions
diff --git a/compiler/driver/compiler_driver.cc b/compiler/driver/compiler_driver.cc index f84e01fd06..d504a4e704 100644 --- a/compiler/driver/compiler_driver.cc +++ b/compiler/driver/compiler_driver.cc @@ -28,6 +28,7 @@ #include "dex_compilation_unit.h" #include "dex_file-inl.h" #include "dex/verification_results.h" +#include "dex/verified_method.h" #include "jni_internal.h" #include "object_utils.h" #include "runtime.h" @@ -1272,9 +1273,9 @@ bool CompilerDriver::ComputeInvokeInfo(const DexCompilationUnit* mUnit, const ui if (enableVerifierBasedSharpening && (*invoke_type == kVirtual || *invoke_type == kInterface)) { // Did the verifier record a more precise invoke target based on its type information? - const MethodReference caller_method(mUnit->GetDexFile(), mUnit->GetDexMethodIndex()); + DCHECK(mUnit->GetVerifiedMethod() != nullptr); const MethodReference* devirt_map_target = - verification_results_->GetDevirtMap(caller_method, dex_pc); + mUnit->GetVerifiedMethod()->GetDevirtTarget(dex_pc); if (devirt_map_target != NULL) { SirtRef<mirror::DexCache> target_dex_cache(soa.Self(), mUnit->GetClassLinker()->FindDexCache(*devirt_map_target->dex_file)); SirtRef<mirror::ClassLoader> class_loader(soa.Self(), soa.Decode<mirror::ClassLoader*>(mUnit->GetClassLoader())); @@ -1321,8 +1322,15 @@ bool CompilerDriver::ComputeInvokeInfo(const DexCompilationUnit* mUnit, const ui return false; // Incomplete knowledge needs slow path. } -bool CompilerDriver::IsSafeCast(const MethodReference& mr, uint32_t dex_pc) { - bool result = verification_results_->IsSafeCast(mr, dex_pc); +const VerifiedMethod* CompilerDriver::GetVerifiedMethod(const DexFile* dex_file, + uint32_t method_idx) const { + MethodReference ref(dex_file, method_idx); + return verification_results_->GetVerifiedMethod(ref); +} + +bool CompilerDriver::IsSafeCast(const DexCompilationUnit* mUnit, uint32_t dex_pc) { + DCHECK(mUnit->GetVerifiedMethod() != nullptr); + bool result = mUnit->GetVerifiedMethod()->IsSafeCast(dex_pc); if (result) { stats_->SafeCast(); } else { diff --git a/compiler/driver/compiler_driver.h b/compiler/driver/compiler_driver.h index f8aa868017..a8110e71d7 100644 --- a/compiler/driver/compiler_driver.h +++ b/compiler/driver/compiler_driver.h @@ -45,6 +45,7 @@ class DexFileToMethodInlinerMap; class OatWriter; class TimingLogger; class VerificationResults; +class VerifiedMethod; enum CompilerBackend { kQuick, @@ -213,7 +214,8 @@ class CompilerDriver { uintptr_t* direct_code, uintptr_t* direct_method) LOCKS_EXCLUDED(Locks::mutator_lock_); - bool IsSafeCast(const MethodReference& mr, uint32_t dex_pc); + const VerifiedMethod* GetVerifiedMethod(const DexFile* dex_file, uint32_t method_idx) const; + bool IsSafeCast(const DexCompilationUnit* mUnit, uint32_t dex_pc); // Record patch information for later fix up. void AddCodePatch(const DexFile* dex_file, diff --git a/compiler/driver/dex_compilation_unit.cc b/compiler/driver/dex_compilation_unit.cc index c441d09ab2..840b0adf49 100644 --- a/compiler/driver/dex_compilation_unit.cc +++ b/compiler/driver/dex_compilation_unit.cc @@ -31,7 +31,8 @@ DexCompilationUnit::DexCompilationUnit(CompilationUnit* cu) code_item_(cu->code_item), class_def_idx_(cu->class_def_idx), dex_method_idx_(cu->method_idx), - access_flags_(cu->access_flags) { + access_flags_(cu->access_flags), + verified_method_(cu_->compiler_driver->GetVerifiedMethod(cu->dex_file, cu->method_idx)) { } DexCompilationUnit::DexCompilationUnit(CompilationUnit* cu, @@ -41,7 +42,8 @@ DexCompilationUnit::DexCompilationUnit(CompilationUnit* cu, const DexFile::CodeItem* code_item, uint16_t class_def_idx, uint32_t method_idx, - uint32_t access_flags) + uint32_t access_flags, + const VerifiedMethod* verified_method) : cu_(cu), class_loader_(class_loader), class_linker_(class_linker), @@ -49,7 +51,8 @@ DexCompilationUnit::DexCompilationUnit(CompilationUnit* cu, code_item_(code_item), class_def_idx_(class_def_idx), dex_method_idx_(method_idx), - access_flags_(access_flags) { + access_flags_(access_flags), + verified_method_(verified_method) { } const std::string& DexCompilationUnit::GetSymbol() { diff --git a/compiler/driver/dex_compilation_unit.h b/compiler/driver/dex_compilation_unit.h index 3df50ffec6..84f57991c3 100644 --- a/compiler/driver/dex_compilation_unit.h +++ b/compiler/driver/dex_compilation_unit.h @@ -29,6 +29,7 @@ class DexCache; } // namespace mirror class ClassLinker; struct CompilationUnit; +class VerifiedMethod; class DexCompilationUnit { public: @@ -36,7 +37,8 @@ class DexCompilationUnit { DexCompilationUnit(CompilationUnit* cu, jobject class_loader, ClassLinker* class_linker, const DexFile& dex_file, const DexFile::CodeItem* code_item, - uint16_t class_def_idx, uint32_t method_idx, uint32_t access_flags); + uint16_t class_def_idx, uint32_t method_idx, uint32_t access_flags, + const VerifiedMethod* verified_method); CompilationUnit* GetCompilationUnit() const { return cu_; @@ -96,6 +98,10 @@ class DexCompilationUnit { return ((access_flags_ & kAccSynchronized) != 0); } + const VerifiedMethod* GetVerifiedMethod() const { + return verified_method_; + } + const std::string& GetSymbol(); private: @@ -111,6 +117,7 @@ class DexCompilationUnit { const uint16_t class_def_idx_; const uint32_t dex_method_idx_; const uint32_t access_flags_; + const VerifiedMethod* const verified_method_; std::string symbol_; }; |