diff options
author | 2015-04-16 15:41:02 +0000 | |
---|---|---|
committer | 2015-04-16 15:41:03 +0000 | |
commit | 8aec061f5e58876bcc892d8c0309bc13b5349f5c (patch) | |
tree | 468528f9081cc33299317a3fa62cfc6d84c224e8 /compiler/driver/compiler_driver.cc | |
parent | f90b8548e91392dfc24e8b0f7d3000f4f121c19d (diff) | |
parent | f1c6d9e87cbfd27702103ccc7c7f08ce784dc872 (diff) |
Merge "Fallback to quick in case of soft verification errors"
Diffstat (limited to 'compiler/driver/compiler_driver.cc')
-rw-r--r-- | compiler/driver/compiler_driver.cc | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/compiler/driver/compiler_driver.cc b/compiler/driver/compiler_driver.cc index ef47377bcc..641d174935 100644 --- a/compiler/driver/compiler_driver.cc +++ b/compiler/driver/compiler_driver.cc @@ -2344,6 +2344,31 @@ CompiledMethod* CompilerDriver::GetCompiledMethod(MethodReference ref) const { return it->second; } +bool CompilerDriver::IsMethodVerifiedWithoutFailures(uint32_t method_idx, + uint16_t class_def_idx, + const DexFile& dex_file) const { + const VerifiedMethod* verified_method = GetVerifiedMethod(&dex_file, method_idx); + if (verified_method != nullptr) { + return !verified_method->HasVerificationFailures(); + } + + // If we can't find verification metadata, check if this is a system class (we trust that system + // classes have their methods verified). If it's not, be conservative and assume the method + // has not been verified successfully. + + // TODO: When compiling the boot image it should be safe to assume that everything is verified, + // even if methods are not found in the verification cache. + const char* descriptor = dex_file.GetClassDescriptor(dex_file.GetClassDef(class_def_idx)); + ClassLinker* class_linker = Runtime::Current()->GetClassLinker(); + Thread* self = Thread::Current(); + ScopedObjectAccess soa(self); + bool is_system_class = class_linker->FindSystemClass(self, descriptor) != nullptr; + if (!is_system_class) { + self->ClearException(); + } + return is_system_class; +} + size_t CompilerDriver::GetNonRelativeLinkerPatchCount() const { MutexLock mu(Thread::Current(), compiled_methods_lock_); return non_relative_linker_patch_count_; |