Add explicit compiler option to enable test-specific features.
We can no longer rely on checking the "core.art" image name,
since we plan to remove it and use the shipped boot image.
This option enables test-specific features, such as $noinline$.
Test: ./art/test.py -r --optimizing --64
Bug: 147817558
Change-Id: Iadac6e1b0f46e83efd0551fb8462a6b268ad33d8
diff --git a/compiler/driver/compiler_options.cc b/compiler/driver/compiler_options.cc
index 5681134..0550075 100644
--- a/compiler/driver/compiler_options.cc
+++ b/compiler/driver/compiler_options.cc
@@ -51,7 +51,7 @@
image_classes_(),
verification_results_(nullptr),
image_type_(ImageType::kNone),
- compiling_with_core_image_(false),
+ compile_art_test_(false),
baseline_(false),
debuggable_(false),
generate_debug_info_(kDefaultGenerateDebugInfo),
@@ -186,24 +186,4 @@
return is_system_class;
}
-bool CompilerOptions::IsCoreImageFilename(const std::string& boot_image_filename) {
- std::string_view filename(boot_image_filename);
- size_t colon_pos = filename.find(':');
- if (colon_pos != std::string_view::npos) {
- filename = filename.substr(0u, colon_pos);
- }
- // Look for "core.art" or "core-*.art".
- if (EndsWith(filename, "core.art")) {
- return true;
- }
- if (!EndsWith(filename, ".art")) {
- return false;
- }
- size_t slash_pos = filename.rfind('/');
- if (slash_pos == std::string::npos) {
- return StartsWith(filename, "core-");
- }
- return filename.compare(slash_pos + 1, 5u, "core-") == 0;
-}
-
} // namespace art
diff --git a/compiler/driver/compiler_options.h b/compiler/driver/compiler_options.h
index 639c547..6cdb821 100644
--- a/compiler/driver/compiler_options.h
+++ b/compiler/driver/compiler_options.h
@@ -218,11 +218,10 @@
return image_type_ == ImageType::kAppImage;
}
- // Returns whether we are compiling against a "core" image, which
- // is an indicative we are running tests. The compiler will use that
- // information for checking invariants.
- bool CompilingWithCoreImage() const {
- return compiling_with_core_image_;
+ // Returns whether we are running ART tests.
+ // The compiler will use that information for checking invariants.
+ bool CompileArtTest() const {
+ return compile_art_test_;
}
// Should the code be compiled as position independent?
@@ -367,10 +366,6 @@
return initialize_app_image_classes_;
}
- // Is `boot_image_filename` the name of a core image (small boot
- // image used for ART testing only)?
- static bool IsCoreImageFilename(const std::string& boot_image_filename);
-
private:
bool ParseDumpInitFailures(const std::string& option, std::string* error_msg);
bool ParseRegisterAllocationStrategy(const std::string& option, std::string* error_msg);
@@ -400,7 +395,7 @@
const VerificationResults* verification_results_;
ImageType image_type_;
- bool compiling_with_core_image_;
+ bool compile_art_test_;
bool baseline_;
bool debuggable_;
bool generate_debug_info_;
diff --git a/compiler/driver/compiler_options_map-inl.h b/compiler/driver/compiler_options_map-inl.h
index e8a425d..e80fb46 100644
--- a/compiler/driver/compiler_options_map-inl.h
+++ b/compiler/driver/compiler_options_map-inl.h
@@ -43,6 +43,7 @@
}
options->SetCompilerFilter(compiler_filter);
}
+ map.AssignIfExists(Base::CompileArtTest, &options->compile_art_test_);
map.AssignIfExists(Base::HugeMethodMaxThreshold, &options->huge_method_threshold_);
map.AssignIfExists(Base::LargeMethodMaxThreshold, &options->large_method_threshold_);
map.AssignIfExists(Base::NumDexMethodsThreshold, &options->num_dex_methods_threshold_);
@@ -110,6 +111,9 @@
.template WithType<std::string>()
.IntoKey(Map::CompilerFilter)
+ .Define({"--compile-art-test", "--no-compile-art-test"})
+ .WithValues({true, false})
+ .IntoKey(Map::CompileArtTest)
.Define("--huge-method-max=_")
.template WithType<unsigned int>()
.IntoKey(Map::HugeMethodMaxThreshold)
diff --git a/compiler/driver/compiler_options_map.def b/compiler/driver/compiler_options_map.def
index df06bd8..40a6284 100644
--- a/compiler/driver/compiler_options_map.def
+++ b/compiler/driver/compiler_options_map.def
@@ -37,6 +37,7 @@
// TODO: Add type parser.
COMPILER_OPTIONS_KEY (std::string, CompilerFilter)
+COMPILER_OPTIONS_KEY (bool, CompileArtTest)
COMPILER_OPTIONS_KEY (Unit, PIC)
COMPILER_OPTIONS_KEY (unsigned int, HugeMethodMaxThreshold)
COMPILER_OPTIONS_KEY (unsigned int, LargeMethodMaxThreshold)
diff --git a/compiler/jit/jit_compiler.cc b/compiler/jit/jit_compiler.cc
index 0f12457..31dbec4 100644
--- a/compiler/jit/jit_compiler.cc
+++ b/compiler/jit/jit_compiler.cc
@@ -106,8 +106,6 @@
instruction_set_features = InstructionSetFeatures::FromCppDefines();
}
compiler_options_->instruction_set_features_ = std::move(instruction_set_features);
- compiler_options_->compiling_with_core_image_ =
- CompilerOptions::IsCoreImageFilename(runtime->GetImageLocation());
if (compiler_options_->GetGenerateDebugInfo()) {
jit_logger_.reset(new JitLogger());
diff --git a/compiler/optimizing/inliner.cc b/compiler/optimizing/inliner.cc
index 24d6e65..05a0afa 100644
--- a/compiler/optimizing/inliner.cc
+++ b/compiler/optimizing/inliner.cc
@@ -148,15 +148,14 @@
DCHECK_NE(total_number_of_instructions_, 0u);
DCHECK_NE(inlining_budget_, 0u);
- // If we're compiling with a core image (which is only used for
- // test purposes), honor inlining directives in method names:
+ // If we're compiling tests, honor inlining directives in method names:
// - if a method's name contains the substring "$noinline$", do not
// inline that method;
// - if a method's name contains the substring "$inline$", ensure
// that this method is actually inlined.
// We limit the latter to AOT compilation, as the JIT may or may not inline
// depending on the state of classes at runtime.
- const bool honor_noinline_directives = codegen_->GetCompilerOptions().CompilingWithCoreImage();
+ const bool honor_noinline_directives = codegen_->GetCompilerOptions().CompileArtTest();
const bool honor_inline_directives =
honor_noinline_directives && Runtime::Current()->IsAotCompiler();
diff --git a/compiler/optimizing/optimizing_compiler.cc b/compiler/optimizing/optimizing_compiler.cc
index 346f60d..3945b17 100644
--- a/compiler/optimizing/optimizing_compiler.cc
+++ b/compiler/optimizing/optimizing_compiler.cc
@@ -1106,7 +1106,7 @@
}
if (kIsDebugBuild &&
- compiler_options.CompilingWithCoreImage() &&
+ compiler_options.CompileArtTest() &&
IsInstructionSetSupported(compiler_options.GetInstructionSet())) {
// For testing purposes, we put a special marker on method names
// that should be compiled with this compiler (when the
diff --git a/dex2oat/dex2oat.cc b/dex2oat/dex2oat.cc
index 32200bc..cb49bfe 100644
--- a/dex2oat/dex2oat.cc
+++ b/dex2oat/dex2oat.cc
@@ -1142,9 +1142,6 @@
}
compiler_options_->passes_to_run_ = passes_to_run_.get();
- compiler_options_->compiling_with_core_image_ =
- !boot_image_filename_.empty() &&
- CompilerOptions::IsCoreImageFilename(boot_image_filename_);
}
void ExpandOatAndImageFilenames() {
diff --git a/test/etc/run-test-jar b/test/etc/run-test-jar
index 32f7cb9..fc74f05 100755
--- a/test/etc/run-test-jar
+++ b/test/etc/run-test-jar
@@ -111,6 +111,10 @@
ANDROID_FLAGS="${ANDROID_FLAGS} -Xcompiler-option --runtime-arg -Xcompiler-option -XX:SlowDebug=true"
COMPILER_FLAGS="${COMPILER_FLAGS} --runtime-arg -XX:SlowDebug=true"
+# Let the compiler and runtime know that we are running tests.
+COMPILE_FLAGS="${COMPILE_FLAGS} --compile-art-test"
+FLAGS="${FLAGS} -Xcompiler-option --compile-art-test"
+
while true; do
if [ "x$1" = "x--quiet" ]; then
QUIET="y"