ART: Allow quickening in the boot image
Update the class linker to accept class status from the boot image
in compiler mode. Update compiler driver to allow quickening for
boot image classes. Update method verifier to accept quickened
instructions in compiler mode when we just want to dump. Update
oatdump to the new verifier API.
Bug: 17316928
(cherry picked from commit 35439baf287b291b67ee406308e17fc6194facbf)
Change-Id: I9ef1bfd78b0d93625b89b3d662131d7d6e5f2903
diff --git a/runtime/verifier/method_verifier.cc b/runtime/verifier/method_verifier.cc
index 0de1e76..1502978 100644
--- a/runtime/verifier/method_verifier.cc
+++ b/runtime/verifier/method_verifier.cc
@@ -297,7 +297,7 @@
return result;
}
-void MethodVerifier::VerifyMethodAndDump(Thread* self, std::ostream& os, uint32_t dex_method_idx,
+MethodVerifier* MethodVerifier::VerifyMethodAndDump(Thread* self, std::ostream& os, uint32_t dex_method_idx,
const DexFile* dex_file,
ConstHandle<mirror::DexCache> dex_cache,
ConstHandle<mirror::ClassLoader> class_loader,
@@ -305,12 +305,15 @@
const DexFile::CodeItem* code_item,
ConstHandle<mirror::ArtMethod> method,
uint32_t method_access_flags) {
- MethodVerifier verifier(self, dex_file, dex_cache, class_loader, class_def, code_item,
- dex_method_idx, method, method_access_flags, true, true, true);
- verifier.Verify();
- verifier.DumpFailures(os);
- os << verifier.info_messages_.str();
- verifier.Dump(os);
+ MethodVerifier* verifier = new MethodVerifier(self, dex_file, dex_cache, class_loader,
+ class_def, code_item, dex_method_idx, method,
+ method_access_flags, true, true, true, true);
+ verifier->Verify();
+ verifier->DumpFailures(os);
+ os << verifier->info_messages_.str();
+ verifier->Dump(os);
+
+ return verifier;
}
MethodVerifier::MethodVerifier(Thread* self,
@@ -320,7 +323,7 @@
const DexFile::CodeItem* code_item, uint32_t dex_method_idx,
ConstHandle<mirror::ArtMethod> method, uint32_t method_access_flags,
bool can_load_classes, bool allow_soft_failures,
- bool need_precise_constants)
+ bool need_precise_constants, bool verify_to_dump)
: self_(self),
reg_types_(can_load_classes),
work_insn_idx_(-1),
@@ -344,7 +347,8 @@
allow_soft_failures_(allow_soft_failures),
need_precise_constants_(need_precise_constants),
has_check_casts_(false),
- has_virtual_or_interface_invokes_(false) {
+ has_virtual_or_interface_invokes_(false),
+ verify_to_dump_(verify_to_dump) {
Runtime::Current()->AddMethodVerifier(this);
DCHECK(class_def != nullptr);
}
@@ -774,7 +778,7 @@
result = false;
break;
}
- if (inst->GetVerifyIsRuntimeOnly() && Runtime::Current()->IsCompiler()) {
+ if (inst->GetVerifyIsRuntimeOnly() && Runtime::Current()->IsCompiler() && !verify_to_dump_) {
Fail(VERIFY_ERROR_BAD_CLASS_HARD) << "opcode only expected at runtime " << inst->Name();
result = false;
}