diff options
-rw-r--r-- | compiler/dex/quick_compiler_callbacks.cc | 8 | ||||
-rw-r--r-- | compiler/dex/quick_compiler_callbacks.h | 4 | ||||
-rw-r--r-- | compiler/driver/compiler_driver.cc | 13 | ||||
-rw-r--r-- | compiler/oat_writer.cc | 3 | ||||
-rw-r--r-- | dex2oat/dex2oat.cc | 11 |
5 files changed, 25 insertions, 14 deletions
diff --git a/compiler/dex/quick_compiler_callbacks.cc b/compiler/dex/quick_compiler_callbacks.cc index 932eb51aee..b1006b2f0b 100644 --- a/compiler/dex/quick_compiler_callbacks.cc +++ b/compiler/dex/quick_compiler_callbacks.cc @@ -22,11 +22,15 @@ namespace art { void QuickCompilerCallbacks::MethodVerified(verifier::MethodVerifier* verifier) { - verification_results_->ProcessVerifiedMethod(verifier); + if (verification_results_ != nullptr) { + verification_results_->ProcessVerifiedMethod(verifier); + } } void QuickCompilerCallbacks::ClassRejected(ClassReference ref) { - verification_results_->AddRejectedClass(ref); + if (verification_results_ != nullptr) { + verification_results_->AddRejectedClass(ref); + } } } // namespace art diff --git a/compiler/dex/quick_compiler_callbacks.h b/compiler/dex/quick_compiler_callbacks.h index db0fdaa72f..2100522f10 100644 --- a/compiler/dex/quick_compiler_callbacks.h +++ b/compiler/dex/quick_compiler_callbacks.h @@ -30,9 +30,7 @@ class QuickCompilerCallbacks FINAL : public CompilerCallbacks { CompilerCallbacks::CallbackMode mode) : CompilerCallbacks(mode), verification_results_(verification_results), - verifier_deps_(nullptr) { - CHECK(verification_results != nullptr); - } + verifier_deps_(nullptr) {} ~QuickCompilerCallbacks() { } diff --git a/compiler/driver/compiler_driver.cc b/compiler/driver/compiler_driver.cc index c04e45d334..00a852fddf 100644 --- a/compiler/driver/compiler_driver.cc +++ b/compiler/driver/compiler_driver.cc @@ -514,8 +514,9 @@ static void CompileMethod(Thread* self, // TODO: Refactor the compilation to avoid having to distinguish the two passes // here. That should be done on a higher level. http://b/29089975 if (driver->GetCurrentDexToDexMethods()->IsBitSet(method_idx)) { - const VerifiedMethod* verified_method = - driver->GetVerificationResults()->GetVerifiedMethod(method_ref); + VerificationResults* results = driver->GetVerificationResults(); + DCHECK(results != nullptr); + const VerifiedMethod* verified_method = results->GetVerifiedMethod(method_ref); // Do not optimize if a VerifiedMethod is missing. SafeCast elision, // for example, relies on it. compiled_method = optimizer::ArtCompileDEX( @@ -576,12 +577,12 @@ static void CompileMethod(Thread* self, } else if ((access_flags & kAccAbstract) != 0) { // Abstract methods don't have code. } else { - const VerifiedMethod* verified_method = - driver->GetVerificationResults()->GetVerifiedMethod(method_ref); + VerificationResults* results = driver->GetVerificationResults(); + DCHECK(results != nullptr); + const VerifiedMethod* verified_method = results->GetVerifiedMethod(method_ref); bool compile = compilation_enabled && // Basic checks, e.g., not <clinit>. - driver->GetVerificationResults() - ->IsCandidateForCompilation(method_ref, access_flags) && + results->IsCandidateForCompilation(method_ref, access_flags) && // Did not fail to create VerifiedMethod metadata. verified_method != nullptr && // Do not have failures that should punt to the interpreter. diff --git a/compiler/oat_writer.cc b/compiler/oat_writer.cc index 7aef785f80..54b35202bd 100644 --- a/compiler/oat_writer.cc +++ b/compiler/oat_writer.cc @@ -800,7 +800,8 @@ class OatWriter::InitOatClassesMethodVisitor : public DexMethodVisitor { mirror::Class::Status status; bool found = writer_->compiler_driver_->GetCompiledClass(class_ref, &status); if (!found) { - if (writer_->compiler_driver_->GetVerificationResults()->IsClassRejected(class_ref)) { + VerificationResults* results = writer_->compiler_driver_->GetVerificationResults(); + if (results != nullptr && results->IsClassRejected(class_ref)) { // The oat class status is used only for verification of resolved classes, // so use kStatusErrorResolved whether the class was resolved or unresolved // during compile-time verification. diff --git a/dex2oat/dex2oat.cc b/dex2oat/dex2oat.cc index 746a9407ca..113bdb58d0 100644 --- a/dex2oat/dex2oat.cc +++ b/dex2oat/dex2oat.cc @@ -1516,7 +1516,10 @@ class Dex2Oat FINAL { return dex2oat::ReturnCode::kOther; } - verification_results_.reset(new VerificationResults(compiler_options_.get())); + if (CompilerFilter::IsAnyCompilationEnabled(compiler_options_->GetCompilerFilter())) { + // Only modes with compilation require verification results. + verification_results_.reset(new VerificationResults(compiler_options_.get())); + } callbacks_.reset(new QuickCompilerCallbacks( verification_results_.get(), IsBootImage() ? @@ -1732,7 +1735,11 @@ class Dex2Oat FINAL { } // Pre-register dex files so that we can access verification results without locks during // compilation and verification. - verification_results_->AddDexFile(dex_file); + if (verification_results_ != nullptr) { + // Verification results are only required for modes that have any compilation. Avoid + // adding the dex files if possible to prevent allocating large arrays. + verification_results_->AddDexFile(dex_file); + } } return dex2oat::ReturnCode::kNoFailure; |