diff options
author | 2018-11-13 13:09:51 +0000 | |
---|---|---|
committer | 2018-11-14 10:21:55 +0000 | |
commit | 6be1dbd3bc34b2cfa0fe257acbea273f1b6f4a53 (patch) | |
tree | 1840224989e4cbd538081951d948ed6a19bc61b4 | |
parent | dbcb48fc0d0841f327d108246487a4ef3df556ed (diff) |
ART: Rewrite core image detection.
Remove unused compiler option `core_image_` and cache
the IsCompilingWithCoreImage in the CompilerOptions instead.
Test: m test-art-host-gtest
Test: testrunner.py --host --optimizing
Change-Id: Idcf3b6c96dab9a39f823a16778e7698589442cd8
-rw-r--r-- | compiler/driver/compiler_options.cc | 2 | ||||
-rw-r--r-- | compiler/driver/compiler_options.h | 16 | ||||
-rw-r--r-- | compiler/jit/jit_compiler.cc | 11 | ||||
-rw-r--r-- | compiler/optimizing/inliner.cc | 24 | ||||
-rw-r--r-- | compiler/optimizing/optimizing_compiler.cc | 21 | ||||
-rw-r--r-- | compiler/optimizing/optimizing_compiler.h | 7 | ||||
-rw-r--r-- | dex2oat/dex2oat.cc | 8 |
7 files changed, 39 insertions, 50 deletions
diff --git a/compiler/driver/compiler_options.cc b/compiler/driver/compiler_options.cc index be8e10e41e..685cde338b 100644 --- a/compiler/driver/compiler_options.cc +++ b/compiler/driver/compiler_options.cc @@ -45,8 +45,8 @@ CompilerOptions::CompilerOptions() dex_files_for_oat_file_(), image_classes_(), boot_image_(false), - core_image_(false), app_image_(false), + compiling_with_core_image_(false), baseline_(false), debuggable_(false), generate_debug_info_(kDefaultGenerateDebugInfo), diff --git a/compiler/driver/compiler_options.h b/compiler/driver/compiler_options.h index 77f84820e5..2f4e5428ea 100644 --- a/compiler/driver/compiler_options.h +++ b/compiler/driver/compiler_options.h @@ -198,13 +198,6 @@ class CompilerOptions final { return baseline_; } - // Are we compiling a core image (small boot image only used for ART testing)? - bool IsCoreImage() const { - // Ensure that `core_image_` => `boot_image_`. - DCHECK(!core_image_ || boot_image_); - return core_image_; - } - // Are we compiling an app image? bool IsAppImage() const { return app_image_; @@ -214,6 +207,13 @@ class CompilerOptions final { app_image_ = false; } + // 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_; + } + // Should the code be compiled as position independent? bool GetCompilePic() const { return compile_pic_; @@ -357,8 +357,8 @@ class CompilerOptions final { HashSet<std::string> image_classes_; bool boot_image_; - bool core_image_; bool app_image_; + bool compiling_with_core_image_; bool baseline_; bool debuggable_; bool generate_debug_info_; diff --git a/compiler/jit/jit_compiler.cc b/compiler/jit/jit_compiler.cc index f22f61fa21..bb35065921 100644 --- a/compiler/jit/jit_compiler.cc +++ b/compiler/jit/jit_compiler.cc @@ -90,10 +90,11 @@ JitCompiler::JitCompiler() { // Special case max code units for inlining, whose default is "unset" (implictly // meaning no limit). Do this before parsing the actual passed options. compiler_options_->SetInlineMaxCodeUnits(CompilerOptions::kDefaultInlineMaxCodeUnits); + Runtime* runtime = Runtime::Current(); { std::string error_msg; - if (!compiler_options_->ParseCompilerOptions(Runtime::Current()->GetCompilerOptions(), - true /* ignore_unrecognized */, + if (!compiler_options_->ParseCompilerOptions(runtime->GetCompilerOptions(), + /*ignore_unrecognized=*/ true, &error_msg)) { LOG(FATAL) << error_msg; UNREACHABLE(); @@ -103,7 +104,7 @@ JitCompiler::JitCompiler() { compiler_options_->SetNonPic(); // Set debuggability based on the runtime value. - compiler_options_->SetDebuggable(Runtime::Current()->IsJavaDebuggable()); + compiler_options_->SetDebuggable(runtime->IsJavaDebuggable()); const InstructionSet instruction_set = compiler_options_->GetInstructionSet(); if (kRuntimeISA == InstructionSet::kArm) { @@ -112,7 +113,7 @@ JitCompiler::JitCompiler() { DCHECK_EQ(instruction_set, kRuntimeISA); } std::unique_ptr<const InstructionSetFeatures> instruction_set_features; - for (const StringPiece option : Runtime::Current()->GetCompilerOptions()) { + for (const StringPiece option : runtime->GetCompilerOptions()) { VLOG(compiler) << "JIT compiler option " << option; std::string error_msg; if (option.starts_with("--instruction-set-variant=")) { @@ -144,6 +145,8 @@ JitCompiler::JitCompiler() { instruction_set_features = InstructionSetFeatures::FromCppDefines(); } compiler_options_->instruction_set_features_ = std::move(instruction_set_features); + compiler_options_->compiling_with_core_image_ = + CompilerDriver::IsCoreImageFilename(runtime->GetImageLocation()); compiler_driver_.reset(new CompilerDriver( compiler_options_.get(), diff --git a/compiler/optimizing/inliner.cc b/compiler/optimizing/inliner.cc index c1daf95727..d85bfd5564 100644 --- a/compiler/optimizing/inliner.cc +++ b/compiler/optimizing/inliner.cc @@ -39,7 +39,6 @@ #include "mirror/object_array-alloc-inl.h" #include "mirror/object_array-inl.h" #include "nodes.h" -#include "optimizing_compiler.h" #include "reference_type_propagation.h" #include "register_allocator_linear_scan.h" #include "scoped_thread_state_change-inl.h" @@ -151,13 +150,13 @@ bool HInliner::Run() { // If we're compiling with a core image (which is only used for // test purposes), honor inlining directives in method names: - // - if a method's name contains the substring "$inline$", ensure - // that this method is actually inlined; // - if a method's name contains the substring "$noinline$", do not - // inline that method. + // 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 = IsCompilingWithCoreImage(); + const bool honor_noinline_directives = codegen_->GetCompilerOptions().CompilingWithCoreImage(); const bool honor_inline_directives = honor_noinline_directives && Runtime::Current()->IsAotCompiler(); @@ -1737,6 +1736,21 @@ static inline Handle<T> NewHandleIfDifferent(T* object, return (object != hint.Get()) ? handles->NewHandle(object) : hint; } +static bool CanEncodeInlinedMethodInStackMap(const DexFile& caller_dex_file, ArtMethod* callee) + REQUIRES_SHARED(Locks::mutator_lock_) { + if (!Runtime::Current()->IsAotCompiler()) { + // JIT can always encode methods in stack maps. + return true; + } + if (IsSameDexFile(caller_dex_file, *callee->GetDexFile())) { + return true; + } + // TODO(ngeoffray): Support more AOT cases for inlining: + // - methods in multidex + // - methods in boot image for on-device non-PIC compilation. + return false; +} + bool HInliner::TryBuildAndInlineHelper(HInvoke* invoke_instruction, ArtMethod* resolved_method, ReferenceTypeInfo receiver_type, diff --git a/compiler/optimizing/optimizing_compiler.cc b/compiler/optimizing/optimizing_compiler.cc index c9c1194e5a..fe6abd4999 100644 --- a/compiler/optimizing/optimizing_compiler.cc +++ b/compiler/optimizing/optimizing_compiler.cc @@ -1136,7 +1136,7 @@ CompiledMethod* OptimizingCompiler::Compile(const DexFile::CodeItem* code_item, } if (kIsDebugBuild && - IsCompilingWithCoreImage() && + compiler_driver->GetCompilerOptions().CompilingWithCoreImage() && IsInstructionSetSupported(compiler_driver->GetCompilerOptions().GetInstructionSet())) { // For testing purposes, we put a special marker on method names // that should be compiled with this compiler (when the @@ -1234,30 +1234,11 @@ Compiler* CreateOptimizingCompiler(CompilerDriver* driver) { return new OptimizingCompiler(driver); } -bool IsCompilingWithCoreImage() { - const std::string& image = Runtime::Current()->GetImageLocation(); - return CompilerDriver::IsCoreImageFilename(image); -} - bool EncodeArtMethodInInlineInfo(ArtMethod* method ATTRIBUTE_UNUSED) { // Note: the runtime is null only for unit testing. return Runtime::Current() == nullptr || !Runtime::Current()->IsAotCompiler(); } -bool CanEncodeInlinedMethodInStackMap(const DexFile& caller_dex_file, ArtMethod* callee) { - if (!Runtime::Current()->IsAotCompiler()) { - // JIT can always encode methods in stack maps. - return true; - } - if (IsSameDexFile(caller_dex_file, *callee->GetDexFile())) { - return true; - } - // TODO(ngeoffray): Support more AOT cases for inlining: - // - methods in multidex - // - methods in boot image for on-device non-PIC compilation. - return false; -} - bool OptimizingCompiler::JitCompile(Thread* self, jit::JitCodeCache* code_cache, ArtMethod* method, diff --git a/compiler/optimizing/optimizing_compiler.h b/compiler/optimizing/optimizing_compiler.h index 6ee9c70fdb..f5279e83eb 100644 --- a/compiler/optimizing/optimizing_compiler.h +++ b/compiler/optimizing/optimizing_compiler.h @@ -29,14 +29,7 @@ class DexFile; Compiler* CreateOptimizingCompiler(CompilerDriver* driver); -// 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 IsCompilingWithCoreImage(); - bool EncodeArtMethodInInlineInfo(ArtMethod* method); -bool CanEncodeInlinedMethodInStackMap(const DexFile& caller_dex_file, ArtMethod* callee) - REQUIRES_SHARED(Locks::mutator_lock_); } // namespace art diff --git a/dex2oat/dex2oat.cc b/dex2oat/dex2oat.cc index d901c01fc8..27773cebe8 100644 --- a/dex2oat/dex2oat.cc +++ b/dex2oat/dex2oat.cc @@ -732,11 +732,6 @@ class Dex2Oat final { compiler_options_->boot_image_ = !image_filenames_.empty(); compiler_options_->app_image_ = app_image_fd_ != -1 || !app_image_file_name_.empty(); - if (IsBootImage() && image_filenames_.size() == 1) { - const std::string& boot_image_filename = image_filenames_[0]; - compiler_options_->core_image_ = CompilerDriver::IsCoreImageFilename(boot_image_filename); - } - if (IsAppImage() && IsBootImage()) { Usage("Can't have both --image and (--app-image-fd or --app-image-file)"); } @@ -951,6 +946,9 @@ class Dex2Oat final { } } compiler_options_->passes_to_run_ = passes_to_run_.get(); + compiler_options_->compiling_with_core_image_ = + !boot_image_filename_.empty() && + CompilerDriver::IsCoreImageFilename(boot_image_filename_); } static bool SupportsDeterministicCompilation() { |