diff options
| author | 2020-02-11 16:49:47 -0800 | |
|---|---|---|
| committer | 2020-02-12 19:22:17 +0000 | |
| commit | 2d3de3a40015af07f7645a298f77b398af0c6c2c (patch) | |
| tree | 360b130e574af9a5e837ebd9d2585de29db34f65 | |
| parent | c55032774cfec4b5222b362a81a3b8b69e133710 (diff) | |
Make class loader context fail for unknown class loaders
Update OatFileAssistant to fail the class loader check when getting an
unknown (null) class loader. The code is only use in GetDexoptNeeded paths
and does not affect the runtime behaviour.
This will enable dexoptanalyzer to provide the right answer for dex files
whose class loader changes often.
Test: test-art-host
Bug: 147208643
Change-Id: I869109e669e68afe094e7703ed574575b98d7cc6
| -rw-r--r-- | dexoptanalyzer/dexoptanalyzer.cc | 6 | ||||
| -rw-r--r-- | dexoptanalyzer/dexoptanalyzer_test.cc | 21 | ||||
| -rw-r--r-- | runtime/native/dalvik_system_DexFile.cc | 6 | ||||
| -rw-r--r-- | runtime/oat_file_assistant.cc | 25 | ||||
| -rw-r--r-- | runtime/oat_file_assistant.h | 12 | ||||
| -rw-r--r-- | runtime/oat_file_assistant_test.cc | 178 |
6 files changed, 142 insertions, 106 deletions
diff --git a/dexoptanalyzer/dexoptanalyzer.cc b/dexoptanalyzer/dexoptanalyzer.cc index b4111186c5..7454993eca 100644 --- a/dexoptanalyzer/dexoptanalyzer.cc +++ b/dexoptanalyzer/dexoptanalyzer.cc @@ -319,10 +319,10 @@ class DexoptAnalyzer final { } int dexoptNeeded = oat_file_assistant->GetDexOptNeeded(compiler_filter_, - assume_profile_changed_, - downgrade_, class_loader_context.get(), - context_fds_); + context_fds_, + assume_profile_changed_, + downgrade_); // Convert OatFileAssitant codes to dexoptanalyzer codes. switch (dexoptNeeded) { diff --git a/dexoptanalyzer/dexoptanalyzer_test.cc b/dexoptanalyzer/dexoptanalyzer_test.cc index 65b50358d8..651fa4ae7b 100644 --- a/dexoptanalyzer/dexoptanalyzer_test.cc +++ b/dexoptanalyzer/dexoptanalyzer_test.cc @@ -36,7 +36,7 @@ class DexoptAnalyzerTest : public DexoptTest { int Analyze(const std::string& dex_file, CompilerFilter::Filter compiler_filter, bool assume_profile_changed, - const std::string& class_loader_context) { + const char* class_loader_context) { std::string dexoptanalyzer_cmd = GetDexoptAnalyzerCmd(); std::vector<std::string> argv_str; argv_str.push_back(dexoptanalyzer_cmd); @@ -52,8 +52,8 @@ class DexoptAnalyzerTest : public DexoptTest { argv_str.push_back(GetClassPathOption("-Xbootclasspath-locations:", GetLibCoreDexLocations())); argv_str.push_back("--image=" + GetImageLocation()); argv_str.push_back("--android-data=" + android_data_); - if (!class_loader_context.empty()) { - argv_str.push_back("--class-loader-context=" + class_loader_context); + if (class_loader_context != nullptr) { + argv_str.push_back("--class-loader-context=" + std::string(class_loader_context)); } std::string error; @@ -78,13 +78,19 @@ class DexoptAnalyzerTest : public DexoptTest { CompilerFilter::Filter compiler_filter, bool assume_profile_changed = false, bool downgrade = false, - const std::string& class_loader_context = "") { + const char* class_loader_context = "PCL[]") { int dexoptanalyzerResult = Analyze( dex_file, compiler_filter, assume_profile_changed, class_loader_context); dexoptanalyzerResult = DexoptanalyzerToOatFileAssistant(dexoptanalyzerResult); OatFileAssistant oat_file_assistant(dex_file.c_str(), kRuntimeISA, /*load_executable=*/ false); + std::vector<int> context_fds; + + std::unique_ptr<ClassLoaderContext> context = class_loader_context == nullptr + ? nullptr + : ClassLoaderContext::Create(class_loader_context); + int assistantResult = oat_file_assistant.GetDexOptNeeded( - compiler_filter, assume_profile_changed, downgrade); + compiler_filter, context.get(), context_fds, assume_profile_changed, downgrade); EXPECT_EQ(assistantResult, dexoptanalyzerResult); } }; @@ -100,6 +106,7 @@ TEST_F(DexoptAnalyzerTest, DexNoOat) { Verify(dex_location, CompilerFilter::kExtract); Verify(dex_location, CompilerFilter::kQuicken); Verify(dex_location, CompilerFilter::kSpeedProfile); + Verify(dex_location, CompilerFilter::kSpeed, false, false, nullptr); } // Case: We have a DEX file and up-to-date OAT file for it. @@ -112,6 +119,7 @@ TEST_F(DexoptAnalyzerTest, OatUpToDate) { Verify(dex_location, CompilerFilter::kQuicken); Verify(dex_location, CompilerFilter::kExtract); Verify(dex_location, CompilerFilter::kEverything); + Verify(dex_location, CompilerFilter::kSpeed, false, false, nullptr); } // Case: We have a DEX file and speed-profile OAT file for it. @@ -325,7 +333,6 @@ TEST_F(DexoptAnalyzerTest, ClassLoaderContext) { // Generate the odex to get the class loader context also open the dex files. GenerateOdexForTest(dex_location1, odex_location1, CompilerFilter::kSpeed, /* compilation_reason= */ nullptr, /* extra_args= */ { class_loader_context_option }); - Verify(dex_location1, CompilerFilter::kSpeed, false, false, class_loader_context); + Verify(dex_location1, CompilerFilter::kSpeed, false, false, class_loader_context.c_str()); } - } // namespace art diff --git a/runtime/native/dalvik_system_DexFile.cc b/runtime/native/dalvik_system_DexFile.cc index 37a524b66d..d2b5edf333 100644 --- a/runtime/native/dalvik_system_DexFile.cc +++ b/runtime/native/dalvik_system_DexFile.cc @@ -576,10 +576,12 @@ static jint GetDexOptNeeded(JNIEnv* env, return OatFileAssistant::kNoDexOptNeeded; } + std::vector<int> context_fds; return oat_file_assistant.GetDexOptNeeded(filter, + context.get(), + context_fds, profile_changed, - downgrade, - context.get()); + downgrade); } static jstring DexFile_getDexFileStatus(JNIEnv* env, diff --git a/runtime/oat_file_assistant.cc b/runtime/oat_file_assistant.cc index 96df61ef3c..f374883615 100644 --- a/runtime/oat_file_assistant.cc +++ b/runtime/oat_file_assistant.cc @@ -185,16 +185,16 @@ bool OatFileAssistant::IsInBootClassPath() { } int OatFileAssistant::GetDexOptNeeded(CompilerFilter::Filter target, - bool profile_changed, - bool downgrade, ClassLoaderContext* class_loader_context, - const std::vector<int>& context_fds) { + const std::vector<int>& context_fds, + bool profile_changed, + bool downgrade) { OatFileInfo& info = GetBestInfo(); DexOptNeeded dexopt_needed = info.GetDexOptNeeded(target, - profile_changed, - downgrade, class_loader_context, - context_fds); + context_fds, + profile_changed, + downgrade); if (info.IsOatLocation() || dexopt_needed == kDex2OatFromScratch) { return dexopt_needed; } @@ -797,10 +797,10 @@ OatFileAssistant::OatStatus OatFileAssistant::OatFileInfo::Status() { OatFileAssistant::DexOptNeeded OatFileAssistant::OatFileInfo::GetDexOptNeeded( CompilerFilter::Filter target, - bool profile_changed, - bool downgrade, ClassLoaderContext* context, - const std::vector<int>& context_fds) { + const std::vector<int>& context_fds, + bool profile_changed, + bool downgrade) { bool filter_okay = CompilerFilterIsOkay(target, profile_changed, downgrade); bool class_loader_context_okay = ClassLoaderContextIsOkay(context, context_fds); @@ -905,9 +905,12 @@ bool OatFileAssistant::OatFileInfo::ClassLoaderContextIsOkay(ClassLoaderContext* return true; } + if (context == nullptr) { - VLOG(oat) << "ClassLoaderContext check ignored: null context"; - return true; + // TODO(calin): stop using null for the unkown contexts. + // b/148494302 introduces runtime encoding for unknown context which will make this possible. + VLOG(oat) << "ClassLoaderContext check failed: uknown(null) context"; + return false; } size_t dir_index = oat_file_assistant_->dex_location_.rfind('/'); diff --git a/runtime/oat_file_assistant.h b/runtime/oat_file_assistant.h index b5812f9e25..aa4d83b383 100644 --- a/runtime/oat_file_assistant.h +++ b/runtime/oat_file_assistant.h @@ -144,10 +144,10 @@ class OatFileAssistant { // the oat location. Returns a negative status code if the status refers to // the oat file in the odex location. int GetDexOptNeeded(CompilerFilter::Filter target_compiler_filter, + ClassLoaderContext* context, + const std::vector<int>& context_fds, bool profile_changed = false, - bool downgrade = false, - ClassLoaderContext* context = nullptr, - const std::vector<int>& context_fds = std::vector<int>()); + bool downgrade = false); // Returns true if there is up-to-date code for this dex location, // irrespective of the compiler filter of the up-to-date code. @@ -292,10 +292,10 @@ class OatFileAssistant { // downgrade should be true if the purpose of dexopt is to downgrade the // compiler filter. DexOptNeeded GetDexOptNeeded(CompilerFilter::Filter target_compiler_filter, - bool profile_changed, - bool downgrade, ClassLoaderContext* context, - const std::vector<int>& context_fds); + const std::vector<int>& context_fds, + bool profile_changed, + bool downgrade); // Returns the loaded file. // Loads the file if needed. Returns null if the file failed to load. diff --git a/runtime/oat_file_assistant_test.cc b/runtime/oat_file_assistant_test.cc index 32ae42eef5..ed47ca3a6b 100644 --- a/runtime/oat_file_assistant_test.cc +++ b/runtime/oat_file_assistant_test.cc @@ -62,6 +62,7 @@ class OatFileAssistantTest : public DexoptTest { VerifyOptimizationStatus( file, CompilerFilter::NameOfFilter(expected_filter), expected_reason); } + void InsertNewBootClasspathEntry() { std::string extra_dex_filename = GetMultiDexSrc1(); Runtime* runtime = Runtime::Current(); @@ -70,6 +71,33 @@ class OatFileAssistantTest : public DexoptTest { runtime->boot_class_path_locations_.push_back(extra_dex_filename); } } + + int GetDexOptNeeded(OatFileAssistant* assistant, + CompilerFilter::Filter compiler_filter, + bool profile_changed) { + std::vector<int> context_fds; + return GetDexOptNeeded(assistant, + compiler_filter, + ClassLoaderContext::Default(), + context_fds, + profile_changed, + /*downgrade=*/ false); + } + + int GetDexOptNeeded( + OatFileAssistant* assistant, + CompilerFilter::Filter compiler_filter, + const std::unique_ptr<ClassLoaderContext>& context = ClassLoaderContext::Default(), + const std::vector<int>& context_fds = std::vector<int>(), + bool profile_changed = false, + bool downgrade = false) { + return assistant->GetDexOptNeeded( + compiler_filter, + context.get(), + context_fds, + profile_changed, + downgrade); + } }; class ScopedNonWritable { @@ -189,11 +217,9 @@ TEST_F(OatFileAssistantTest, GetDexOptNeededWithUpToDateContextRelative) { std::unique_ptr<ClassLoaderContext> relative_context = ClassLoaderContext::Create("PCL[ContextDex.jar]"); EXPECT_EQ(-OatFileAssistant::kNoDexOptNeeded, - oat_file_assistant.GetDexOptNeeded( + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kDefaultCompilerFilter, - /* profile_changed= */ false, - /* downgrade= */ false, - relative_context.get())); + relative_context)); } // Case: We have a DEX file, but no OAT file for it. @@ -205,13 +231,13 @@ TEST_F(OatFileAssistantTest, DexNoOat) { OatFileAssistant oat_file_assistant(dex_location.c_str(), kRuntimeISA, false); EXPECT_EQ(OatFileAssistant::kDex2OatFromScratch, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kExtract)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kExtract)); EXPECT_EQ(OatFileAssistant::kDex2OatFromScratch, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kQuicken)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kQuicken)); EXPECT_EQ(OatFileAssistant::kDex2OatFromScratch, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kSpeedProfile)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kSpeedProfile)); EXPECT_EQ(OatFileAssistant::kDex2OatFromScratch, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kSpeed)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kSpeed)); EXPECT_FALSE(oat_file_assistant.IsInBootClassPath()); EXPECT_EQ(OatFileAssistant::kOatCannotOpen, oat_file_assistant.OdexFileStatus()); @@ -229,7 +255,7 @@ TEST_F(OatFileAssistantTest, NoDexNoOat) { OatFileAssistant oat_file_assistant(dex_location.c_str(), kRuntimeISA, true); EXPECT_EQ(OatFileAssistant::kNoDexOptNeeded, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kSpeed)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kSpeed)); EXPECT_FALSE(oat_file_assistant.HasOriginalDexFiles()); // Trying to get the best oat file should fail, but not crash. @@ -250,13 +276,13 @@ TEST_F(OatFileAssistantTest, OdexUpToDate) { dex_location.c_str(), kRuntimeISA, /*load_executable=*/ false); EXPECT_EQ(-OatFileAssistant::kNoDexOptNeeded, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kSpeed)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kSpeed)); EXPECT_EQ(-OatFileAssistant::kNoDexOptNeeded, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kQuicken)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kQuicken)); EXPECT_EQ(-OatFileAssistant::kNoDexOptNeeded, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kExtract)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kExtract)); EXPECT_EQ(-OatFileAssistant::kDex2OatForFilter, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kEverything)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kEverything)); EXPECT_FALSE(oat_file_assistant.IsInBootClassPath()); EXPECT_EQ(OatFileAssistant::kOatUpToDate, oat_file_assistant.OdexFileStatus()); @@ -282,13 +308,13 @@ TEST_F(OatFileAssistantTest, OdexUpToDatePartialBootImage) { dex_location.c_str(), kRuntimeISA, /*load_executable=*/ false); EXPECT_EQ(-OatFileAssistant::kNoDexOptNeeded, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kSpeed)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kSpeed)); EXPECT_EQ(-OatFileAssistant::kNoDexOptNeeded, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kQuicken)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kQuicken)); EXPECT_EQ(-OatFileAssistant::kNoDexOptNeeded, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kExtract)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kExtract)); EXPECT_EQ(-OatFileAssistant::kDex2OatForFilter, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kEverything)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kEverything)); EXPECT_FALSE(oat_file_assistant.IsInBootClassPath()); EXPECT_EQ(OatFileAssistant::kOatUpToDate, oat_file_assistant.OdexFileStatus()); @@ -317,13 +343,13 @@ TEST_F(OatFileAssistantTest, OdexUpToDateSymLink) { OatFileAssistant oat_file_assistant(dex_location.c_str(), kRuntimeISA, false); EXPECT_EQ(-OatFileAssistant::kNoDexOptNeeded, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kSpeed)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kSpeed)); EXPECT_EQ(-OatFileAssistant::kNoDexOptNeeded, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kQuicken)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kQuicken)); EXPECT_EQ(-OatFileAssistant::kNoDexOptNeeded, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kExtract)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kExtract)); EXPECT_EQ(-OatFileAssistant::kDex2OatForFilter, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kEverything)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kEverything)); EXPECT_FALSE(oat_file_assistant.IsInBootClassPath()); EXPECT_EQ(OatFileAssistant::kOatUpToDate, oat_file_assistant.OdexFileStatus()); @@ -351,13 +377,13 @@ TEST_F(OatFileAssistantTest, OatUpToDate) { OatFileAssistant oat_file_assistant(dex_location.c_str(), kRuntimeISA, false); EXPECT_EQ(OatFileAssistant::kNoDexOptNeeded, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kSpeed)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kSpeed)); EXPECT_EQ(OatFileAssistant::kNoDexOptNeeded, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kQuicken)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kQuicken)); EXPECT_EQ(OatFileAssistant::kNoDexOptNeeded, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kExtract)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kExtract)); EXPECT_EQ(OatFileAssistant::kDex2OatForFilter, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kEverything)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kEverything)); EXPECT_FALSE(oat_file_assistant.IsInBootClassPath()); EXPECT_EQ(OatFileAssistant::kOatCannotOpen, oat_file_assistant.OdexFileStatus()); @@ -392,13 +418,13 @@ TEST_F(OatFileAssistantTest, GetDexOptNeededWithFd) { odex_fd.get(), zip_fd.get()); EXPECT_EQ(OatFileAssistant::kNoDexOptNeeded, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kSpeed)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kSpeed)); EXPECT_EQ(OatFileAssistant::kNoDexOptNeeded, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kQuicken)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kQuicken)); EXPECT_EQ(OatFileAssistant::kNoDexOptNeeded, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kExtract)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kExtract)); EXPECT_EQ(-OatFileAssistant::kDex2OatForFilter, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kEverything)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kEverything)); EXPECT_FALSE(oat_file_assistant.IsInBootClassPath()); EXPECT_EQ(OatFileAssistant::kOatUpToDate, oat_file_assistant.OdexFileStatus()); @@ -430,9 +456,9 @@ TEST_F(OatFileAssistantTest, GetDexOptNeededWithInvalidOdexFd) { /* oat_fd= */ -1, zip_fd.get()); EXPECT_EQ(-OatFileAssistant::kDex2OatForBootImage, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kSpeed)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kSpeed)); EXPECT_EQ(-OatFileAssistant::kDex2OatForBootImage, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kEverything)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kEverything)); EXPECT_FALSE(oat_file_assistant.IsInBootClassPath()); EXPECT_EQ(OatFileAssistant::kOatBootImageOutOfDate, oat_file_assistant.OdexFileStatus()); @@ -464,7 +490,7 @@ TEST_F(OatFileAssistantTest, GetDexOptNeededWithInvalidVdexFd) { zip_fd.get()); EXPECT_EQ(OatFileAssistant::kDex2OatFromScratch, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kSpeed)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kSpeed)); EXPECT_FALSE(oat_file_assistant.IsInBootClassPath()); EXPECT_EQ(OatFileAssistant::kOatCannotOpen, oat_file_assistant.OdexFileStatus()); EXPECT_EQ(OatFileAssistant::kOatCannotOpen, oat_file_assistant.OatFileStatus()); @@ -487,7 +513,7 @@ TEST_F(OatFileAssistantTest, GetDexOptNeededWithInvalidOdexVdexFd) { /* oat_fd= */ -1, zip_fd); EXPECT_EQ(OatFileAssistant::kDex2OatFromScratch, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kSpeed)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kSpeed)); EXPECT_EQ(OatFileAssistant::kOatCannotOpen, oat_file_assistant.OdexFileStatus()); EXPECT_EQ(OatFileAssistant::kOatCannotOpen, oat_file_assistant.OatFileStatus()); } @@ -513,7 +539,7 @@ TEST_F(OatFileAssistantTest, VdexUpToDateNoOdex) { // depends on the boot image and is out of date with respect to the boot // image. EXPECT_EQ(-OatFileAssistant::kDex2OatForBootImage, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kSpeed)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kSpeed)); // Make sure we don't crash in this case when we dump the status. We don't // care what the actual dumped value is. @@ -534,7 +560,7 @@ TEST_F(OatFileAssistantTest, EmptyVdexOdex) { OatFileAssistant oat_file_assistant(dex_location.c_str(), kRuntimeISA, false); EXPECT_EQ(OatFileAssistant::kDex2OatFromScratch, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kSpeed)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kSpeed)); } // Case: We have a DEX file and up-to-date (OAT) VDEX file for it, but no OAT @@ -566,7 +592,7 @@ TEST_F(OatFileAssistantTest, VdexUpToDateNoOat) { // depends on the boot image and is out of date with respect to the boot // image. EXPECT_EQ(OatFileAssistant::kDex2OatForBootImage, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kSpeed)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kSpeed)); } // Case: We have a DEX file and speed-profile OAT file for it. @@ -589,13 +615,13 @@ TEST_F(OatFileAssistantTest, ProfileOatUpToDate) { OatFileAssistant oat_file_assistant(dex_location.c_str(), kRuntimeISA, false); EXPECT_EQ(OatFileAssistant::kNoDexOptNeeded, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kSpeedProfile, false)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kSpeedProfile, false)); EXPECT_EQ(OatFileAssistant::kNoDexOptNeeded, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kQuicken, false)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kQuicken, false)); EXPECT_EQ(OatFileAssistant::kDex2OatForFilter, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kSpeedProfile, true)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kSpeedProfile, true)); EXPECT_EQ(OatFileAssistant::kDex2OatForFilter, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kQuicken, true)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kQuicken, true)); EXPECT_FALSE(oat_file_assistant.IsInBootClassPath()); EXPECT_EQ(OatFileAssistant::kOatCannotOpen, oat_file_assistant.OdexFileStatus()); @@ -621,7 +647,7 @@ TEST_F(OatFileAssistantTest, MultiDexOatUpToDate) { OatFileAssistant oat_file_assistant(dex_location.c_str(), kRuntimeISA, true); EXPECT_EQ(OatFileAssistant::kNoDexOptNeeded, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kSpeed, false)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kSpeed)); EXPECT_TRUE(oat_file_assistant.HasOriginalDexFiles()); // Verify we can load both dex files. @@ -657,7 +683,7 @@ TEST_F(OatFileAssistantTest, MultiDexNonMainOutOfDate) { OatFileAssistant oat_file_assistant(dex_location.c_str(), kRuntimeISA, true); EXPECT_EQ(OatFileAssistant::kDex2OatFromScratch, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kSpeed, false)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kSpeed)); EXPECT_TRUE(oat_file_assistant.HasOriginalDexFiles()); } @@ -714,9 +740,9 @@ TEST_F(OatFileAssistantTest, OatDexOutOfDate) { OatFileAssistant oat_file_assistant(dex_location.c_str(), kRuntimeISA, false); EXPECT_EQ(OatFileAssistant::kDex2OatFromScratch, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kExtract)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kExtract)); EXPECT_EQ(OatFileAssistant::kDex2OatFromScratch, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kSpeed)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kSpeed)); EXPECT_FALSE(oat_file_assistant.IsInBootClassPath()); EXPECT_EQ(OatFileAssistant::kOatCannotOpen, oat_file_assistant.OdexFileStatus()); @@ -738,7 +764,7 @@ TEST_F(OatFileAssistantTest, VdexDexOutOfDate) { OatFileAssistant oat_file_assistant(dex_location.c_str(), kRuntimeISA, false); EXPECT_EQ(OatFileAssistant::kDex2OatFromScratch, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kSpeed)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kSpeed)); } // Case: We have a MultiDEX (ODEX) VDEX file where the non-main multidex entry @@ -755,7 +781,7 @@ TEST_F(OatFileAssistantTest, VdexMultiDexNonMainOutOfDate) { OatFileAssistant oat_file_assistant(dex_location.c_str(), kRuntimeISA, false); EXPECT_EQ(OatFileAssistant::kDex2OatFromScratch, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kSpeed)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kSpeed)); } // Case: We have a DEX file and an OAT file out of date with respect to the @@ -779,11 +805,11 @@ TEST_F(OatFileAssistantTest, OatImageOutOfDate) { OatFileAssistant oat_file_assistant(dex_location.c_str(), kRuntimeISA, false); EXPECT_EQ(OatFileAssistant::kDex2OatForBootImage, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kExtract)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kExtract)); EXPECT_EQ(OatFileAssistant::kDex2OatForBootImage, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kQuicken)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kQuicken)); EXPECT_EQ(OatFileAssistant::kDex2OatForBootImage, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kSpeed)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kSpeed)); EXPECT_FALSE(oat_file_assistant.IsInBootClassPath()); EXPECT_EQ(OatFileAssistant::kOatCannotOpen, oat_file_assistant.OdexFileStatus()); @@ -814,9 +840,9 @@ TEST_F(OatFileAssistantTest, OatVerifyAtRuntimeImageOutOfDate) { OatFileAssistant oat_file_assistant(dex_location.c_str(), kRuntimeISA, false); EXPECT_EQ(OatFileAssistant::kNoDexOptNeeded, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kExtract)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kExtract)); EXPECT_EQ(OatFileAssistant::kDex2OatForFilter, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kQuicken)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kQuicken)); EXPECT_FALSE(oat_file_assistant.IsInBootClassPath()); EXPECT_EQ(OatFileAssistant::kOatCannotOpen, oat_file_assistant.OdexFileStatus()); @@ -837,9 +863,9 @@ TEST_F(OatFileAssistantTest, DexOdexNoOat) { OatFileAssistant oat_file_assistant(dex_location.c_str(), kRuntimeISA, false); EXPECT_EQ(OatFileAssistant::kNoDexOptNeeded, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kExtract)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kExtract)); EXPECT_EQ(OatFileAssistant::kNoDexOptNeeded, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kSpeed)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kSpeed)); EXPECT_FALSE(oat_file_assistant.IsInBootClassPath()); EXPECT_EQ(OatFileAssistant::kOatUpToDate, oat_file_assistant.OdexFileStatus()); @@ -867,7 +893,7 @@ TEST_F(OatFileAssistantTest, StrippedDexOdexNoOat) { OatFileAssistant oat_file_assistant(dex_location.c_str(), kRuntimeISA, true); EXPECT_EQ(-OatFileAssistant::kNoDexOptNeeded, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kSpeed)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kSpeed)); EXPECT_FALSE(oat_file_assistant.IsInBootClassPath()); EXPECT_EQ(OatFileAssistant::kOatUpToDate, oat_file_assistant.OdexFileStatus()); @@ -903,11 +929,11 @@ TEST_F(OatFileAssistantTest, StrippedDexOdexOat) { OatFileAssistant oat_file_assistant(dex_location.c_str(), kRuntimeISA, true); EXPECT_EQ(OatFileAssistant::kNoDexOptNeeded, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kExtract)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kExtract)); EXPECT_EQ(OatFileAssistant::kNoDexOptNeeded, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kSpeed)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kSpeed)); EXPECT_EQ(-OatFileAssistant::kDex2OatForFilter, // Compiling from the .vdex file - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kEverything)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kEverything)); EXPECT_FALSE(oat_file_assistant.IsInBootClassPath()); EXPECT_EQ(OatFileAssistant::kOatUpToDate, oat_file_assistant.OdexFileStatus()); @@ -934,11 +960,11 @@ TEST_F(OatFileAssistantTest, ResourceOnlyDex) { OatFileAssistant oat_file_assistant(dex_location.c_str(), kRuntimeISA, true); EXPECT_EQ(OatFileAssistant::kNoDexOptNeeded, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kSpeed)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kSpeed)); EXPECT_EQ(OatFileAssistant::kNoDexOptNeeded, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kExtract)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kExtract)); EXPECT_EQ(OatFileAssistant::kNoDexOptNeeded, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kQuicken)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kQuicken)); EXPECT_FALSE(oat_file_assistant.IsInBootClassPath()); EXPECT_EQ(OatFileAssistant::kOatCannotOpen, oat_file_assistant.OdexFileStatus()); @@ -946,7 +972,7 @@ TEST_F(OatFileAssistantTest, ResourceOnlyDex) { EXPECT_FALSE(oat_file_assistant.HasOriginalDexFiles()); EXPECT_EQ(OatFileAssistant::kNoDexOptNeeded, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kSpeed)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kSpeed)); EXPECT_FALSE(oat_file_assistant.IsInBootClassPath()); EXPECT_EQ(OatFileAssistant::kOatCannotOpen, oat_file_assistant.OdexFileStatus()); @@ -969,7 +995,7 @@ TEST_F(OatFileAssistantTest, OdexOatOverlap) { OatFileAssistant oat_file_assistant(dex_location.c_str(), kRuntimeISA, true); EXPECT_EQ(OatFileAssistant::kNoDexOptNeeded, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kSpeed)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kSpeed)); EXPECT_FALSE(oat_file_assistant.IsInBootClassPath()); EXPECT_EQ(OatFileAssistant::kOatUpToDate, oat_file_assistant.OdexFileStatus()); @@ -999,9 +1025,9 @@ TEST_F(OatFileAssistantTest, DexVerifyAtRuntimeOdexNoOat) { OatFileAssistant oat_file_assistant(dex_location.c_str(), kRuntimeISA, false); EXPECT_EQ(OatFileAssistant::kNoDexOptNeeded, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kExtract)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kExtract)); EXPECT_EQ(-OatFileAssistant::kDex2OatForFilter, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kSpeed)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kSpeed)); EXPECT_FALSE(oat_file_assistant.IsInBootClassPath()); EXPECT_EQ(OatFileAssistant::kOatUpToDate, oat_file_assistant.OdexFileStatus()); @@ -1141,7 +1167,7 @@ TEST_F(OatFileAssistantTest, NonAbsoluteDexLocation) { EXPECT_FALSE(oat_file_assistant.IsInBootClassPath()); EXPECT_EQ(OatFileAssistant::kDex2OatFromScratch, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kSpeed)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kSpeed)); EXPECT_EQ(OatFileAssistant::kOatCannotOpen, oat_file_assistant.OdexFileStatus()); EXPECT_EQ(OatFileAssistant::kOatCannotOpen, oat_file_assistant.OatFileStatus()); } @@ -1155,7 +1181,7 @@ TEST_F(OatFileAssistantTest, ShortDexLocation) { EXPECT_FALSE(oat_file_assistant.IsInBootClassPath()); EXPECT_EQ(OatFileAssistant::kNoDexOptNeeded, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kSpeed)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kSpeed)); EXPECT_EQ(OatFileAssistant::kOatCannotOpen, oat_file_assistant.OdexFileStatus()); EXPECT_EQ(OatFileAssistant::kOatCannotOpen, oat_file_assistant.OatFileStatus()); EXPECT_FALSE(oat_file_assistant.HasOriginalDexFiles()); @@ -1170,7 +1196,7 @@ TEST_F(OatFileAssistantTest, LongDexExtension) { OatFileAssistant oat_file_assistant(dex_location.c_str(), kRuntimeISA, false); EXPECT_EQ(OatFileAssistant::kDex2OatFromScratch, - oat_file_assistant.GetDexOptNeeded(CompilerFilter::kSpeed)); + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kSpeed)); EXPECT_FALSE(oat_file_assistant.IsInBootClassPath()); EXPECT_EQ(OatFileAssistant::kOatCannotOpen, oat_file_assistant.OdexFileStatus()); @@ -1381,30 +1407,28 @@ TEST_F(OatFileAssistantTest, GetDexOptNeededWithOutOfDateContext) { // Update the context by overriding the jar file. Copy(GetMultiDexSrc2(), context_location); - std::unique_ptr<ClassLoaderContext> updated_context = ClassLoaderContext::Create(context_str); - ASSERT_TRUE(updated_context != nullptr); { + std::unique_ptr<ClassLoaderContext> updated_context = ClassLoaderContext::Create(context_str); + ASSERT_TRUE(updated_context != nullptr); OatFileAssistant oat_file_assistant(dex_location.c_str(), kRuntimeISA, false); // DexOptNeeded should advise compilation from scratch when the context changes. EXPECT_EQ(OatFileAssistant::kDex2OatFromScratch, - oat_file_assistant.GetDexOptNeeded( + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kDefaultCompilerFilter, - /* profile_changed= */ false, - /* downgrade= */ false, - updated_context.get())); + updated_context)); } { + std::unique_ptr<ClassLoaderContext> updated_context = ClassLoaderContext::Create(context_str); + ASSERT_TRUE(updated_context != nullptr); OatFileAssistant oat_file_assistant(dex_location.c_str(), kRuntimeISA, false); // Now check that DexOptNeeded does not advise compilation if we only extracted the file. args.push_back("--compiler-filter=extract"); ASSERT_TRUE(Dex2Oat(args, &error_msg)) << error_msg; EXPECT_EQ(OatFileAssistant::kNoDexOptNeeded, - oat_file_assistant.GetDexOptNeeded( + GetDexOptNeeded(&oat_file_assistant, CompilerFilter::kExtract, - /* profile_changed= */ false, - /* downgrade= */ false, - updated_context.get())); + updated_context)); } } |