Move IsVeryLarge check before we create verification results
Otherwise we can end up creating verification results when they are
not actually needed (if the compiler filter was >= quicken).
Bug: 63467744
Test: test-art-host
Change-Id: Ied2a12e0e4c2010f3f660e278c3a5111545ba251
diff --git a/compiler/common_compiler_test.cc b/compiler/common_compiler_test.cc
index 3683695..1203898 100644
--- a/compiler/common_compiler_test.cc
+++ b/compiler/common_compiler_test.cc
@@ -207,8 +207,10 @@
compiler_options_.reset(new CompilerOptions);
verification_results_.reset(new VerificationResults(compiler_options_.get()));
- callbacks_.reset(new QuickCompilerCallbacks(verification_results_.get(),
- CompilerCallbacks::CallbackMode::kCompileApp));
+ QuickCompilerCallbacks* callbacks =
+ new QuickCompilerCallbacks(CompilerCallbacks::CallbackMode::kCompileApp);
+ callbacks->SetVerificationResults(verification_results_.get());
+ callbacks_.reset(callbacks);
}
Compiler::Kind CommonCompilerTest::GetCompilerKind() const {
diff --git a/compiler/dex/quick_compiler_callbacks.h b/compiler/dex/quick_compiler_callbacks.h
index 2100522..a3a6c09 100644
--- a/compiler/dex/quick_compiler_callbacks.h
+++ b/compiler/dex/quick_compiler_callbacks.h
@@ -26,11 +26,8 @@
class QuickCompilerCallbacks FINAL : public CompilerCallbacks {
public:
- QuickCompilerCallbacks(VerificationResults* verification_results,
- CompilerCallbacks::CallbackMode mode)
- : CompilerCallbacks(mode),
- verification_results_(verification_results),
- verifier_deps_(nullptr) {}
+ explicit QuickCompilerCallbacks(CompilerCallbacks::CallbackMode mode)
+ : CompilerCallbacks(mode) {}
~QuickCompilerCallbacks() { }
@@ -52,8 +49,12 @@
verifier_deps_.reset(deps);
}
+ void SetVerificationResults(VerificationResults* verification_results) {
+ verification_results_ = verification_results;
+ }
+
private:
- VerificationResults* const verification_results_;
+ VerificationResults* verification_results_ = nullptr;
std::unique_ptr<verifier::VerifierDeps> verifier_deps_;
};
diff --git a/compiler/image_test.h b/compiler/image_test.h
index fa714ad..6c3a89b 100644
--- a/compiler/image_test.h
+++ b/compiler/image_test.h
@@ -84,9 +84,10 @@
void SetUpRuntimeOptions(RuntimeOptions* options) OVERRIDE {
CommonCompilerTest::SetUpRuntimeOptions(options);
- callbacks_.reset(new QuickCompilerCallbacks(
- verification_results_.get(),
- CompilerCallbacks::CallbackMode::kCompileBootImage));
+ QuickCompilerCallbacks* new_callbacks =
+ new QuickCompilerCallbacks(CompilerCallbacks::CallbackMode::kCompileBootImage);
+ new_callbacks->SetVerificationResults(verification_results_.get());
+ callbacks_.reset(new_callbacks);
options->push_back(std::make_pair("compilercallbacks", callbacks_.get()));
}
diff --git a/compiler/oat_test.cc b/compiler/oat_test.cc
index 910d7a7..6f89049 100644
--- a/compiler/oat_test.cc
+++ b/compiler/oat_test.cc
@@ -104,8 +104,8 @@
compiler_options_->ParseCompilerOption(option, Usage);
}
verification_results_.reset(new VerificationResults(compiler_options_.get()));
- callbacks_.reset(new QuickCompilerCallbacks(verification_results_.get(),
- CompilerCallbacks::CallbackMode::kCompileApp));
+ callbacks_.reset(new QuickCompilerCallbacks(CompilerCallbacks::CallbackMode::kCompileApp));
+ callbacks_->SetVerificationResults(verification_results_.get());
Runtime::Current()->SetCompilerCallbacks(callbacks_.get());
timer_.reset(new CumulativeLogger("Compilation times"));
compiler_driver_.reset(new CompilerDriver(compiler_options_.get(),
diff --git a/dex2oat/dex2oat.cc b/dex2oat/dex2oat.cc
index 0ef496f..ea74f29 100644
--- a/dex2oat/dex2oat.cc
+++ b/dex2oat/dex2oat.cc
@@ -1520,12 +1520,11 @@
return dex2oat::ReturnCode::kOther;
}
- if (CompilerFilter::IsAnyCompilationEnabled(compiler_options_->GetCompilerFilter())) {
- // Only modes with compilation require verification results.
- verification_results_.reset(new VerificationResults(compiler_options_.get()));
- }
+ // Verification results are null since we don't know if we will need them yet as the compler
+ // filter may change.
+ // This needs to be done before PrepareRuntimeOptions since the callbacks are passed to the
+ // runtime.
callbacks_.reset(new QuickCompilerCallbacks(
- verification_results_.get(),
IsBootImage() ?
CompilerCallbacks::CallbackMode::kCompileBootImage :
CompilerCallbacks::CallbackMode::kCompileApp));
@@ -1662,6 +1661,28 @@
dex_files_ = MakeNonOwningPointerVector(opened_dex_files_);
+ // If we need to downgrade the compiler-filter for size reasons.
+ if (!IsBootImage() && IsVeryLarge(dex_files_)) {
+ if (!CompilerFilter::IsAsGoodAs(kLargeAppFilter, compiler_options_->GetCompilerFilter())) {
+ LOG(INFO) << "Very large app, downgrading to verify.";
+ // Note: this change won't be reflected in the key-value store, as that had to be
+ // finalized before loading the dex files. This setup is currently required
+ // to get the size from the DexFile objects.
+ // TODO: refactor. b/29790079
+ compiler_options_->SetCompilerFilter(kLargeAppFilter);
+ }
+ }
+
+ if (CompilerFilter::IsAnyCompilationEnabled(compiler_options_->GetCompilerFilter())) {
+ // Only modes with compilation require verification results, do this here instead of when we
+ // create the compilation callbacks since the compilation mode may have been changed by the
+ // very large app logic.
+ // Avoiding setting the verification results saves RAM by not adding the dex files later in
+ // the function.
+ verification_results_.reset(new VerificationResults(compiler_options_.get()));
+ callbacks_->SetVerificationResults(verification_results_.get());
+ }
+
// We had to postpone the swap decision till now, as this is the point when we actually
// know about the dex files we're going to use.
@@ -1678,19 +1699,6 @@
}
}
// Note that dex2oat won't close the swap_fd_. The compiler driver's swap space will do that.
-
- // If we need to downgrade the compiler-filter for size reasons, do that check now.
- if (!IsBootImage() && IsVeryLarge(dex_files_)) {
- if (!CompilerFilter::IsAsGoodAs(kLargeAppFilter, compiler_options_->GetCompilerFilter())) {
- LOG(INFO) << "Very large app, downgrading to verify.";
- // Note: this change won't be reflected in the key-value store, as that had to be
- // finalized before loading the dex files. This setup is currently required
- // to get the size from the DexFile objects.
- // TODO: refactor. b/29790079
- compiler_options_->SetCompilerFilter(kLargeAppFilter);
- }
- }
-
if (IsBootImage()) {
// For boot image, pass opened dex files to the Runtime::Create().
// Note: Runtime acquires ownership of these dex files.