From 0b9203e7996ee1856f620f95d95d8a273c43a3df Mon Sep 17 00:00:00 2001 From: Andreas Gampe Date: Thu, 22 Jan 2015 20:39:27 -0800 Subject: ART: Some Quick cleanup Make several fields const in CompilationUnit. May benefit some Mir2Lir code that repeats tests, and in general immutability is good. Remove compiler_internals.h and refactor some other headers to reduce overly broad imports (and thus forced recompiles on changes). Change-Id: I898405907c68923581373b5981d8a85d2e5d185a --- compiler/dex/bb_optimizations.h | 4 +- compiler/dex/compiler_internals.h | 31 ------------- compiler/dex/compiler_ir.cc | 17 +++---- compiler/dex/compiler_ir.h | 54 ++++++++------------- compiler/dex/dataflow_iterator.h | 2 +- compiler/dex/dex_flags.h | 67 +++++++++++++++++++++++++++ compiler/dex/dex_types.h | 27 +++++++++++ compiler/dex/frontend.cc | 26 +++++------ compiler/dex/frontend.h | 50 -------------------- compiler/dex/global_value_numbering.cc | 2 + compiler/dex/global_value_numbering.h | 7 ++- compiler/dex/global_value_numbering_test.cc | 4 +- compiler/dex/local_value_numbering.h | 2 +- compiler/dex/local_value_numbering_test.cc | 3 +- compiler/dex/mir_analysis.cc | 7 ++- compiler/dex/mir_dataflow.cc | 1 - compiler/dex/mir_graph.cc | 15 ++++-- compiler/dex/mir_graph.h | 13 +++--- compiler/dex/mir_graph_test.cc | 3 +- compiler/dex/mir_optimization.cc | 5 +- compiler/dex/mir_optimization_test.cc | 5 +- compiler/dex/pass.h | 17 ------- compiler/dex/pass_driver.h | 6 +-- compiler/dex/pass_driver_me.h | 1 + compiler/dex/pass_driver_me_opts.cc | 5 +- compiler/dex/pass_driver_me_post_opt.cc | 1 - compiler/dex/pass_me.h | 15 ++---- compiler/dex/post_opt_passes.cc | 2 +- compiler/dex/post_opt_passes.h | 7 ++- compiler/dex/quick/arm/arm_lir.h | 4 +- compiler/dex/quick/arm/assemble_arm.cc | 7 ++- compiler/dex/quick/arm/call_arm.cc | 6 ++- compiler/dex/quick/arm/codegen_arm.h | 4 +- compiler/dex/quick/arm/fp_arm.cc | 5 +- compiler/dex/quick/arm/int_arm.cc | 9 +++- compiler/dex/quick/arm/target_arm.cc | 3 +- compiler/dex/quick/arm/utility_arm.cc | 2 + compiler/dex/quick/arm64/arm64_lir.h | 4 +- compiler/dex/quick/arm64/assemble_arm64.cc | 7 ++- compiler/dex/quick/arm64/call_arm64.cc | 6 ++- compiler/dex/quick/arm64/codegen_arm64.h | 2 +- compiler/dex/quick/arm64/fp_arm64.cc | 5 +- compiler/dex/quick/arm64/int_arm64.cc | 9 +++- compiler/dex/quick/arm64/target_arm64.cc | 3 +- compiler/dex/quick/arm64/utility_arm64.cc | 4 +- compiler/dex/quick/codegen_util.cc | 7 ++- compiler/dex/quick/dex_file_method_inliner.cc | 7 +-- compiler/dex/quick/gen_common.cc | 35 ++++++++++---- compiler/dex/quick/gen_invoke.cc | 7 ++- compiler/dex/quick/gen_loadstore.cc | 5 +- compiler/dex/quick/local_optimizations.cc | 3 +- compiler/dex/quick/mips/assemble_mips.cc | 4 +- compiler/dex/quick/mips/call_mips.cc | 2 + compiler/dex/quick/mips/codegen_mips.h | 3 +- compiler/dex/quick/mips/fp_mips.cc | 1 + compiler/dex/quick/mips/int_mips.cc | 2 + compiler/dex/quick/mips/mips_lir.h | 3 +- compiler/dex/quick/mips/target_mips.cc | 15 ++++-- compiler/dex/quick/mips/utility_mips.cc | 6 ++- compiler/dex/quick/mir_to_lir-inl.h | 3 +- compiler/dex/quick/mir_to_lir.cc | 5 +- compiler/dex/quick/mir_to_lir.h | 24 ++++------ compiler/dex/quick/quick_compiler.cc | 3 +- compiler/dex/quick/ralloc_util.cc | 7 ++- compiler/dex/quick/resource_mask.cc | 1 + compiler/dex/quick/x86/assemble_x86.cc | 5 +- compiler/dex/quick/x86/call_x86.cc | 3 ++ compiler/dex/quick/x86/codegen_x86.h | 4 +- compiler/dex/quick/x86/fp_x86.cc | 2 + compiler/dex/quick/x86/int_x86.cc | 2 + compiler/dex/quick/x86/target_x86.cc | 9 ++-- compiler/dex/quick/x86/utility_x86.cc | 7 ++- compiler/dex/quick/x86/x86_lir.h | 3 +- compiler/dex/reg_location.h | 1 + compiler/dex/ssa_transformation.cc | 3 +- compiler/dex/verification_results.cc | 3 +- compiler/dex/verified_method.cc | 9 +--- compiler/dex/vreg_analysis.cc | 5 +- compiler/driver/compiler_driver-inl.h | 1 - compiler/driver/compiler_driver.h | 2 +- 80 files changed, 385 insertions(+), 296 deletions(-) delete mode 100644 compiler/dex/compiler_internals.h create mode 100644 compiler/dex/dex_flags.h create mode 100644 compiler/dex/dex_types.h diff --git a/compiler/dex/bb_optimizations.h b/compiler/dex/bb_optimizations.h index aac2644..7685200 100644 --- a/compiler/dex/bb_optimizations.h +++ b/compiler/dex/bb_optimizations.h @@ -18,8 +18,10 @@ #define ART_COMPILER_DEX_BB_OPTIMIZATIONS_H_ #include "base/casts.h" -#include "compiler_internals.h" +#include "compiler_ir.h" +#include "dex_flags.h" #include "pass_me.h" +#include "mir_graph.h" namespace art { diff --git a/compiler/dex/compiler_internals.h b/compiler/dex/compiler_internals.h deleted file mode 100644 index 2019f0b..0000000 --- a/compiler/dex/compiler_internals.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef ART_COMPILER_DEX_COMPILER_INTERNALS_H_ -#define ART_COMPILER_DEX_COMPILER_INTERNALS_H_ - -#include -#include -#include -#include - -#include "base/logging.h" -#include "mir_graph.h" -#include "compiler_ir.h" -#include "frontend.h" // Debug flags. -#include "utils.h" - -#endif // ART_COMPILER_DEX_COMPILER_INTERNALS_H_ diff --git a/compiler/dex/compiler_ir.cc b/compiler/dex/compiler_ir.cc index a2b3fe4..0cfa966 100644 --- a/compiler/dex/compiler_ir.cc +++ b/compiler/dex/compiler_ir.cc @@ -16,16 +16,19 @@ #include "compiler_ir.h" +#include "arch/instruction_set_features.h" #include "base/dumpable.h" #include "backend.h" -#include "frontend.h" +#include "dex_flags.h" +#include "driver/compiler_driver.h" #include "mir_graph.h" namespace art { -CompilationUnit::CompilationUnit(ArenaPool* pool) - : compiler_driver(nullptr), - class_linker(nullptr), +CompilationUnit::CompilationUnit(ArenaPool* pool, InstructionSet isa, CompilerDriver* driver, + ClassLinker* linker) + : compiler_driver(driver), + class_linker(linker), dex_file(nullptr), class_loader(nullptr), class_def_idx(0), @@ -36,10 +39,8 @@ CompilationUnit::CompilationUnit(ArenaPool* pool) disable_opt(0), enable_debug(0), verbose(false), - compiler(nullptr), - instruction_set(kNone), - target64(false), - compiler_flip_match(false), + instruction_set(isa), + target64(Is64BitInstructionSet(isa)), arena(pool), arena_stack(pool), mir_graph(nullptr), diff --git a/compiler/dex/compiler_ir.h b/compiler/dex/compiler_ir.h index 34585c1..e7182a9 100644 --- a/compiler/dex/compiler_ir.h +++ b/compiler/dex/compiler_ir.h @@ -17,31 +17,25 @@ #ifndef ART_COMPILER_DEX_COMPILER_IR_H_ #define ART_COMPILER_DEX_COMPILER_IR_H_ +#include "jni.h" #include #include -#include "compiler_enums.h" -#include "driver/compiler_driver.h" -#include "utils/scoped_arena_allocator.h" #include "base/timing_logger.h" +#include "invoke_type.h" +#include "safe_map.h" #include "utils/arena_allocator.h" +#include "utils/scoped_arena_allocator.h" namespace art { class Backend; class ClassLinker; +class CompilerDriver; class MIRGraph; -/* - * TODO: refactoring pass to move these (and other) typedefs towards usage style of runtime to - * add type safety (see runtime/offsets.h). - */ -typedef uint32_t DexOffset; // Dex offset in code units. -typedef uint16_t NarrowDexOffset; // For use in structs, Dex offsets range from 0 .. 0xffff. -typedef uint32_t CodeOffset; // Native code offset in bytes. - struct CompilationUnit { - explicit CompilationUnit(ArenaPool* pool); + CompilationUnit(ArenaPool* pool, InstructionSet isa, CompilerDriver* driver, ClassLinker* linker); ~CompilationUnit(); void StartTimingSplit(const char* label); @@ -52,30 +46,20 @@ struct CompilationUnit { * Fields needed/generated by common frontend and generally used throughout * the compiler. */ - CompilerDriver* compiler_driver; - ClassLinker* class_linker; // Linker to resolve fields and methods. - const DexFile* dex_file; // DexFile containing the method being compiled. - jobject class_loader; // compiling method's class loader. - uint16_t class_def_idx; // compiling method's defining class definition index. - uint32_t method_idx; // compiling method's index into method_ids of DexFile. - uint32_t access_flags; // compiling method's access flags. - InvokeType invoke_type; // compiling method's invocation type. - const char* shorty; // compiling method's shorty. - uint32_t disable_opt; // opt_control_vector flags. - uint32_t enable_debug; // debugControlVector flags. + CompilerDriver* const compiler_driver; + ClassLinker* const class_linker; // Linker to resolve fields and methods. + const DexFile* dex_file; // DexFile containing the method being compiled. + jobject class_loader; // compiling method's class loader. + uint16_t class_def_idx; // compiling method's defining class definition index. + uint32_t method_idx; // compiling method's index into method_ids of DexFile. + uint32_t access_flags; // compiling method's access flags. + InvokeType invoke_type; // compiling method's invocation type. + const char* shorty; // compiling method's shorty. + uint32_t disable_opt; // opt_control_vector flags. + uint32_t enable_debug; // debugControlVector flags. bool verbose; - const Compiler* compiler; - InstructionSet instruction_set; - bool target64; - - const InstructionSetFeatures* GetInstructionSetFeatures() { - return compiler_driver->GetInstructionSetFeatures(); - } - - // If non-empty, apply optimizer/debug flags only to matching methods. - std::string compiler_method_match; - // Flips sense of compiler_method_match - apply flags if doesn't match. - bool compiler_flip_match; + const InstructionSet instruction_set; + const bool target64; // TODO: move memory management to mir_graph, or just switch to using standard containers. ArenaAllocator arena; diff --git a/compiler/dex/dataflow_iterator.h b/compiler/dex/dataflow_iterator.h index 9f17a3e..2a06cec 100644 --- a/compiler/dex/dataflow_iterator.h +++ b/compiler/dex/dataflow_iterator.h @@ -17,7 +17,7 @@ #ifndef ART_COMPILER_DEX_DATAFLOW_ITERATOR_H_ #define ART_COMPILER_DEX_DATAFLOW_ITERATOR_H_ -#include "compiler_ir.h" +#include "base/logging.h" #include "mir_graph.h" namespace art { diff --git a/compiler/dex/dex_flags.h b/compiler/dex/dex_flags.h new file mode 100644 index 0000000..eaf272b --- /dev/null +++ b/compiler/dex/dex_flags.h @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ART_COMPILER_DEX_DEX_FLAGS_H_ +#define ART_COMPILER_DEX_DEX_FLAGS_H_ + +namespace art { + +// Suppress optimization if corresponding bit set. +enum OptControlVector { + kLoadStoreElimination = 0, + kLoadHoisting, + kSuppressLoads, + kNullCheckElimination, + kClassInitCheckElimination, + kGlobalValueNumbering, + kLocalValueNumbering, + kPromoteRegs, + kTrackLiveTemps, + kSafeOptimizations, + kBBOpt, + kSuspendCheckElimination, + kMatch, + kPromoteCompilerTemps, + kBranchFusing, + kSuppressExceptionEdges, + kSuppressMethodInlining, +}; + +// Force code generation paths for testing. +enum DebugControlVector { + kDebugVerbose, + kDebugDumpCFG, + kDebugSlowFieldPath, + kDebugSlowInvokePath, + kDebugSlowStringPath, + kDebugSlowTypePath, + kDebugSlowestFieldPath, + kDebugSlowestStringPath, + kDebugExerciseResolveMethod, + kDebugVerifyDataflow, + kDebugShowMemoryUsage, + kDebugShowNops, + kDebugCountOpcodes, + kDebugDumpCheckStats, + kDebugShowSummaryMemoryUsage, + kDebugShowFilterStats, + kDebugTimings, + kDebugCodegenDump +}; + +} // namespace art + +#endif // ART_COMPILER_DEX_DEX_FLAGS_H_ diff --git a/compiler/dex/dex_types.h b/compiler/dex/dex_types.h new file mode 100644 index 0000000..f485c1c --- /dev/null +++ b/compiler/dex/dex_types.h @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ART_COMPILER_DEX_DEX_TYPES_H_ +#define ART_COMPILER_DEX_DEX_TYPES_H_ + +namespace art { + +typedef uint32_t DexOffset; // Dex offset in code units. +typedef uint16_t NarrowDexOffset; // For use in structs, Dex offsets range from 0 .. 0xffff. + +} // namespace art + +#endif // ART_COMPILER_DEX_DEX_TYPES_H_ diff --git a/compiler/dex/frontend.cc b/compiler/dex/frontend.cc index dd8b4c8..0aaee4e 100644 --- a/compiler/dex/frontend.cc +++ b/compiler/dex/frontend.cc @@ -21,7 +21,7 @@ #include "backend.h" #include "base/dumpable.h" #include "compiler.h" -#include "compiler_internals.h" +#include "dex_flags.h" #include "driver/compiler_driver.h" #include "driver/compiler_options.h" #include "mirror/object.h" @@ -90,16 +90,12 @@ static CompiledMethod* CompileMethod(CompilerDriver& driver, DCHECK(driver.GetCompilerOptions().IsCompilationEnabled()); ClassLinker* class_linker = Runtime::Current()->GetClassLinker(); - CompilationUnit cu(driver.GetArenaPool()); - - cu.compiler_driver = &driver; - cu.class_linker = class_linker; - cu.instruction_set = driver.GetInstructionSet(); - if (cu.instruction_set == kArm) { - cu.instruction_set = kThumb2; + InstructionSet instruction_set = driver.GetInstructionSet(); + if (instruction_set == kArm) { + instruction_set = kThumb2; } - cu.target64 = Is64BitInstructionSet(cu.instruction_set); - cu.compiler = compiler; + CompilationUnit cu(driver.GetArenaPool(), instruction_set, &driver, class_linker); + // TODO: Mips64 is not yet implemented. CHECK((cu.instruction_set == kThumb2) || (cu.instruction_set == kArm64) || @@ -108,10 +104,12 @@ static CompiledMethod* CompileMethod(CompilerDriver& driver, (cu.instruction_set == kMips)); // TODO: set this from command line - cu.compiler_flip_match = false; - bool use_match = !cu.compiler_method_match.empty(); - bool match = use_match && (cu.compiler_flip_match ^ - (PrettyMethod(method_idx, dex_file).find(cu.compiler_method_match) != std::string::npos)); + constexpr bool compiler_flip_match = false; + const std::string compiler_method_match = ""; + + bool use_match = !compiler_method_match.empty(); + bool match = use_match && (compiler_flip_match ^ + (PrettyMethod(method_idx, dex_file).find(compiler_method_match) != std::string::npos)); if (!use_match || match) { cu.disable_opt = kCompilerOptimizerDisableFlags; cu.enable_debug = kCompilerDebugFlags; diff --git a/compiler/dex/frontend.h b/compiler/dex/frontend.h index 4266535..2c9e1f8 100644 --- a/compiler/dex/frontend.h +++ b/compiler/dex/frontend.h @@ -26,56 +26,6 @@ class CompiledMethod; class Compiler; class CompilerDriver; -/* - * Assembly is an iterative process, and usually terminates within - * two or three passes. This should be high enough to handle bizarre - * cases, but detect an infinite loop bug. - */ -#define MAX_ASSEMBLER_RETRIES 50 - -// Suppress optimization if corresponding bit set. -enum opt_control_vector { - kLoadStoreElimination = 0, - kLoadHoisting, - kSuppressLoads, - kNullCheckElimination, - kClassInitCheckElimination, - kGlobalValueNumbering, - kLocalValueNumbering, - kPromoteRegs, - kTrackLiveTemps, - kSafeOptimizations, - kBBOpt, - kSuspendCheckElimination, - kMatch, - kPromoteCompilerTemps, - kBranchFusing, - kSuppressExceptionEdges, - kSuppressMethodInlining, -}; - -// Force code generation paths for testing. -enum debugControlVector { - kDebugVerbose, - kDebugDumpCFG, - kDebugSlowFieldPath, - kDebugSlowInvokePath, - kDebugSlowStringPath, - kDebugSlowTypePath, - kDebugSlowestFieldPath, - kDebugSlowestStringPath, - kDebugExerciseResolveMethod, - kDebugVerifyDataflow, - kDebugShowMemoryUsage, - kDebugShowNops, - kDebugCountOpcodes, - kDebugDumpCheckStats, - kDebugShowSummaryMemoryUsage, - kDebugShowFilterStats, - kDebugTimings, - kDebugCodegenDump -}; - CompiledMethod* CompileOneMethod(CompilerDriver* driver, const Compiler* compiler, const DexFile::CodeItem* code_item, diff --git a/compiler/dex/global_value_numbering.cc b/compiler/dex/global_value_numbering.cc index 578952b..a8fd812 100644 --- a/compiler/dex/global_value_numbering.cc +++ b/compiler/dex/global_value_numbering.cc @@ -15,6 +15,8 @@ */ #include "global_value_numbering.h" + +#include "base/stl_util.h" #include "local_value_numbering.h" namespace art { diff --git a/compiler/dex/global_value_numbering.h b/compiler/dex/global_value_numbering.h index d72144a..cdafc68 100644 --- a/compiler/dex/global_value_numbering.h +++ b/compiler/dex/global_value_numbering.h @@ -17,8 +17,11 @@ #ifndef ART_COMPILER_DEX_GLOBAL_VALUE_NUMBERING_H_ #define ART_COMPILER_DEX_GLOBAL_VALUE_NUMBERING_H_ +#include "base/logging.h" #include "base/macros.h" -#include "compiler_internals.h" +#include "mir_graph.h" +#include "compiler_ir.h" +#include "dex_flags.h" #include "utils/arena_object.h" namespace art { @@ -252,7 +255,7 @@ class GlobalValueNumbering : public DeletableArenaObject { }; std::ostream& operator<<(std::ostream& os, const GlobalValueNumbering::Mode& rhs); -inline void GlobalValueNumbering::StartPostProcessing() { +inline void GlobalValueNumbering::StartPostProcessing() { DCHECK(Good()); DCHECK_EQ(mode_, kModeGvn); mode_ = kModeGvnPostProcessing; diff --git a/compiler/dex/global_value_numbering_test.cc b/compiler/dex/global_value_numbering_test.cc index 18e3469..f71b7ae 100644 --- a/compiler/dex/global_value_numbering_test.cc +++ b/compiler/dex/global_value_numbering_test.cc @@ -14,7 +14,7 @@ * limitations under the License. */ -#include "compiler_internals.h" +#include "base/logging.h" #include "dataflow_iterator.h" #include "dataflow_iterator-inl.h" #include "dex/mir_field_info.h" @@ -337,7 +337,7 @@ class GlobalValueNumberingTest : public testing::Test { GlobalValueNumberingTest() : pool_(), - cu_(&pool_), + cu_(&pool_, kRuntimeISA, nullptr, nullptr), mir_count_(0u), mirs_(nullptr), ssa_reps_(), diff --git a/compiler/dex/local_value_numbering.h b/compiler/dex/local_value_numbering.h index 9b89c95..aef8c6d 100644 --- a/compiler/dex/local_value_numbering.h +++ b/compiler/dex/local_value_numbering.h @@ -19,7 +19,7 @@ #include -#include "compiler_internals.h" +#include "base/logging.h" #include "global_value_numbering.h" #include "utils/arena_object.h" #include "utils/dex_instruction_utils.h" diff --git a/compiler/dex/local_value_numbering_test.cc b/compiler/dex/local_value_numbering_test.cc index 0fcb584..c894892 100644 --- a/compiler/dex/local_value_numbering_test.cc +++ b/compiler/dex/local_value_numbering_test.cc @@ -14,7 +14,6 @@ * limitations under the License. */ -#include "compiler_internals.h" #include "dex/mir_field_info.h" #include "global_value_numbering.h" #include "local_value_numbering.h" @@ -202,7 +201,7 @@ class LocalValueNumberingTest : public testing::Test { LocalValueNumberingTest() : pool_(), - cu_(&pool_), + cu_(&pool_, kRuntimeISA, nullptr, nullptr), mir_count_(0u), mirs_(nullptr), ssa_reps_(), diff --git a/compiler/dex/mir_analysis.cc b/compiler/dex/mir_analysis.cc index 0f0846c..473196b 100644 --- a/compiler/dex/mir_analysis.cc +++ b/compiler/dex/mir_analysis.cc @@ -17,15 +17,18 @@ #include #include -#include "compiler_internals.h" +#include "base/logging.h" #include "dataflow_iterator-inl.h" -#include "dex_instruction.h" +#include "compiler_ir.h" +#include "dex_flags.h" #include "dex_instruction-inl.h" #include "dex/mir_field_info.h" #include "dex/verified_method.h" #include "dex/quick/dex_file_method_inliner.h" #include "dex/quick/dex_file_to_method_inliner_map.h" +#include "driver/compiler_driver.h" #include "driver/compiler_options.h" +#include "driver/dex_compilation_unit.h" #include "utils/scoped_arena_containers.h" namespace art { diff --git a/compiler/dex/mir_dataflow.cc b/compiler/dex/mir_dataflow.cc index 6704112..f09d1ae 100644 --- a/compiler/dex/mir_dataflow.cc +++ b/compiler/dex/mir_dataflow.cc @@ -14,7 +14,6 @@ * limitations under the License. */ -#include "compiler_internals.h" #include "local_value_numbering.h" #include "dataflow_iterator-inl.h" diff --git a/compiler/dex/mir_graph.cc b/compiler/dex/mir_graph.cc index abd3482..db4141c 100644 --- a/compiler/dex/mir_graph.cc +++ b/compiler/dex/mir_graph.cc @@ -21,13 +21,15 @@ #include #include "base/bit_vector-inl.h" +#include "base/logging.h" #include "base/stl_util.h" -#include "compiler_internals.h" +#include "base/stringprintf.h" +#include "compiler_ir.h" #include "dex_file-inl.h" +#include "dex_flags.h" #include "dex_instruction-inl.h" -#include "dex/global_value_numbering.h" -#include "dex/quick/dex_file_to_method_inliner_map.h" -#include "dex/quick/dex_file_method_inliner.h" +#include "driver/compiler_driver.h" +#include "driver/dex_compilation_unit.h" #include "leb128.h" #include "pass_driver_me_post_opt.h" #include "stack.h" @@ -2521,4 +2523,9 @@ int MIR::DecodedInstruction::FlagsOf() const { return 0; } } + +const uint16_t* MIRGraph::GetInsns(int m_unit_index) const { + return m_units_[m_unit_index]->GetCodeItem()->insns_; +} + } // namespace art diff --git a/compiler/dex/mir_graph.h b/compiler/dex/mir_graph.h index af97f51..5def191 100644 --- a/compiler/dex/mir_graph.h +++ b/compiler/dex/mir_graph.h @@ -19,10 +19,9 @@ #include -#include "compiler_ir.h" #include "dex_file.h" #include "dex_instruction.h" -#include "driver/dex_compilation_unit.h" +#include "dex_types.h" #include "invoke_type.h" #include "mir_field_info.h" #include "mir_method_info.h" @@ -34,9 +33,14 @@ namespace art { +struct CompilationUnit; +class DexCompilationUnit; class DexFileMethodInliner; class GlobalValueNumbering; +// Forward declaration. +class MIRGraph; + enum DataFlowAttributePos { kUA = 0, kUB, @@ -139,7 +143,6 @@ enum OatMethodAttributes { // Minimum field size to contain Dalvik v_reg number. #define VREG_NUM_WIDTH 16 -#define INVALID_SREG (-1) #define INVALID_VREG (0xFFFFU) #define INVALID_OFFSET (0xDEADF00FU) @@ -553,9 +556,7 @@ class MIRGraph { * This is guaranteed to contain index 0 which is the base method being compiled. * @return Returns the raw instruction pointer. */ - const uint16_t* GetInsns(int m_unit_index) const { - return m_units_[m_unit_index]->GetCodeItem()->insns_; - } + const uint16_t* GetInsns(int m_unit_index) const; /** * @brief Used to obtain the raw data table. diff --git a/compiler/dex/mir_graph_test.cc b/compiler/dex/mir_graph_test.cc index 8a7e71f..b3ad040 100644 --- a/compiler/dex/mir_graph_test.cc +++ b/compiler/dex/mir_graph_test.cc @@ -14,6 +14,7 @@ * limitations under the License. */ +#include "compiler_ir.h" #include "mir_graph.h" #include "gtest/gtest.h" @@ -148,7 +149,7 @@ class TopologicalSortOrderTest : public testing::Test { TopologicalSortOrderTest() : pool_(), - cu_(&pool_) { + cu_(&pool_, kRuntimeISA, nullptr, nullptr) { cu_.mir_graph.reset(new MIRGraph(&cu_, &cu_.arena)); } diff --git a/compiler/dex/mir_optimization.cc b/compiler/dex/mir_optimization.cc index ebbd28f..05414b3 100644 --- a/compiler/dex/mir_optimization.cc +++ b/compiler/dex/mir_optimization.cc @@ -15,8 +15,11 @@ */ #include "base/bit_vector-inl.h" -#include "compiler_internals.h" +#include "base/logging.h" #include "dataflow_iterator-inl.h" +#include "dex_flags.h" +#include "driver/compiler_driver.h" +#include "driver/dex_compilation_unit.h" #include "global_value_numbering.h" #include "local_value_numbering.h" #include "mir_field_info.h" diff --git a/compiler/dex/mir_optimization_test.cc b/compiler/dex/mir_optimization_test.cc index 362c7fd..199bc27 100644 --- a/compiler/dex/mir_optimization_test.cc +++ b/compiler/dex/mir_optimization_test.cc @@ -16,9 +16,10 @@ #include -#include "compiler_internals.h" +#include "base/logging.h" #include "dataflow_iterator.h" #include "dataflow_iterator-inl.h" +#include "dex/compiler_ir.h" #include "dex/mir_field_info.h" #include "gtest/gtest.h" @@ -326,7 +327,7 @@ class MirOptimizationTest : public testing::Test { MirOptimizationTest() : pool_(), - cu_(&pool_), + cu_(&pool_, kRuntimeISA, nullptr, nullptr), mir_count_(0u), mirs_(nullptr), code_item_(nullptr) { diff --git a/compiler/dex/pass.h b/compiler/dex/pass.h index d3e54a0..0def056 100644 --- a/compiler/dex/pass.h +++ b/compiler/dex/pass.h @@ -19,14 +19,12 @@ #include -#include "compiler_ir.h" #include "base/logging.h" namespace art { // Forward declarations. class BasicBlock; -struct CompilationUnit; class Pass; // Empty Pass Data Class, can be extended by any pass extending the base Pass class. @@ -89,21 +87,6 @@ class Pass { UNREACHABLE(); } - static void BasePrintMessage(CompilationUnit* c_unit, const char* pass_name, const char* message, ...) { - // Check if we want to log something or not. - if (c_unit->print_pass) { - // Stringify the message. - va_list args; - va_start(args, message); - std::string stringified_message; - StringAppendV(&stringified_message, message, args); - va_end(args); - - // Log the message and ensure to include pass name. - LOG(INFO) << pass_name << ": " << stringified_message; - } - } - protected: /** @brief The pass name: used for searching for a pass when running a particular pass or debugging. */ const char* const pass_name_; diff --git a/compiler/dex/pass_driver.h b/compiler/dex/pass_driver.h index 8a3eae1..632df38 100644 --- a/compiler/dex/pass_driver.h +++ b/compiler/dex/pass_driver.h @@ -18,13 +18,13 @@ #define ART_COMPILER_DEX_PASS_DRIVER_H_ #include + +#include "base/logging.h" #include "pass.h" #include "safe_map.h" -// Forward Declarations. -class Pass; -class PassDriver; namespace art { + /** * @brief Helper function to create a single instance of a given Pass and can be shared across * the threads. diff --git a/compiler/dex/pass_driver_me.h b/compiler/dex/pass_driver_me.h index 7bfaf82..ff7c4a4 100644 --- a/compiler/dex/pass_driver_me.h +++ b/compiler/dex/pass_driver_me.h @@ -22,6 +22,7 @@ #include "bb_optimizations.h" #include "dataflow_iterator.h" #include "dataflow_iterator-inl.h" +#include "dex_flags.h" #include "pass_driver.h" #include "pass_me.h" diff --git a/compiler/dex/pass_driver_me_opts.cc b/compiler/dex/pass_driver_me_opts.cc index 6bb94c3..c2b6b91 100644 --- a/compiler/dex/pass_driver_me_opts.cc +++ b/compiler/dex/pass_driver_me_opts.cc @@ -14,12 +14,13 @@ * limitations under the License. */ +#include "pass_driver_me_opts.h" + +#include "base/logging.h" #include "base/macros.h" #include "bb_optimizations.h" -#include "compiler_internals.h" #include "dataflow_iterator.h" #include "dataflow_iterator-inl.h" -#include "pass_driver_me_opts.h" #include "post_opt_passes.h" namespace art { diff --git a/compiler/dex/pass_driver_me_post_opt.cc b/compiler/dex/pass_driver_me_post_opt.cc index 5e2140d..5f0c65c 100644 --- a/compiler/dex/pass_driver_me_post_opt.cc +++ b/compiler/dex/pass_driver_me_post_opt.cc @@ -16,7 +16,6 @@ #include "base/macros.h" #include "post_opt_passes.h" -#include "compiler_internals.h" #include "pass_driver_me_post_opt.h" namespace art { diff --git a/compiler/dex/pass_me.h b/compiler/dex/pass_me.h index d0b450a..73e49ec 100644 --- a/compiler/dex/pass_me.h +++ b/compiler/dex/pass_me.h @@ -18,14 +18,16 @@ #define ART_COMPILER_DEX_PASS_ME_H_ #include + +#include "base/logging.h" #include "pass.h" +#include "safe_map.h" namespace art { // Forward declarations. class BasicBlock; struct CompilationUnit; -class Pass; /** * @brief OptimizationFlag is an enumeration to perform certain tasks for a given pass. @@ -118,17 +120,6 @@ class PassME : public Pass { } } - /** - * @brief Used to obtain the option for a pass. - * @details Will return the overridden option if it exists or default one. - * @param option_name The name of option whose setting to look for. - * @param c_unit The compilation unit currently being handled. - * @return Returns the setting for the pass option. - */ - int GetPassOption(const char* option_name, CompilationUnit* c_unit) const { - return GetPassOption(option_name, c_unit->overridden_pass_options); - } - const char* GetDumpCFGFolder() const { return dump_cfg_folder_; } diff --git a/compiler/dex/post_opt_passes.cc b/compiler/dex/post_opt_passes.cc index 92078b4..9262440 100644 --- a/compiler/dex/post_opt_passes.cc +++ b/compiler/dex/post_opt_passes.cc @@ -15,7 +15,7 @@ */ #include "post_opt_passes.h" -#include "dataflow_iterator.h" + #include "dataflow_iterator-inl.h" namespace art { diff --git a/compiler/dex/post_opt_passes.h b/compiler/dex/post_opt_passes.h index 55ae874..a3dbc5a 100644 --- a/compiler/dex/post_opt_passes.h +++ b/compiler/dex/post_opt_passes.h @@ -17,8 +17,11 @@ #ifndef ART_COMPILER_DEX_POST_OPT_PASSES_H_ #define ART_COMPILER_DEX_POST_OPT_PASSES_H_ -#include "dex/quick/mir_to_lir.h" -#include "compiler_internals.h" +#include "base/casts.h" +#include "base/logging.h" +#include "compiler_ir.h" +#include "dex_flags.h" +#include "mir_graph.h" #include "pass_me.h" namespace art { diff --git a/compiler/dex/quick/arm/arm_lir.h b/compiler/dex/quick/arm/arm_lir.h index 5d09ae1..9717459 100644 --- a/compiler/dex/quick/arm/arm_lir.h +++ b/compiler/dex/quick/arm/arm_lir.h @@ -17,7 +17,9 @@ #ifndef ART_COMPILER_DEX_QUICK_ARM_ARM_LIR_H_ #define ART_COMPILER_DEX_QUICK_ARM_ARM_LIR_H_ -#include "dex/compiler_internals.h" +#include "dex/compiler_enums.h" +#include "dex/reg_location.h" +#include "dex/reg_storage.h" namespace art { diff --git a/compiler/dex/quick/arm/assemble_arm.cc b/compiler/dex/quick/arm/assemble_arm.cc index 65fb3cd..05e2abe 100644 --- a/compiler/dex/quick/arm/assemble_arm.cc +++ b/compiler/dex/quick/arm/assemble_arm.cc @@ -14,9 +14,12 @@ * limitations under the License. */ -#include "arm_lir.h" #include "codegen_arm.h" -#include "dex/quick/mir_to_lir-inl.h" + +#include "arm_lir.h" +#include "base/logging.h" +#include "dex/compiler_ir.h" +#include "dex/quick/mir_to_lir.h" namespace art { diff --git a/compiler/dex/quick/arm/call_arm.cc b/compiler/dex/quick/arm/call_arm.cc index 0713b7a..f15b727 100644 --- a/compiler/dex/quick/arm/call_arm.cc +++ b/compiler/dex/quick/arm/call_arm.cc @@ -16,9 +16,13 @@ /* This file contains codegen for the Thumb2 ISA. */ -#include "arm_lir.h" #include "codegen_arm.h" + +#include "arm_lir.h" +#include "base/logging.h" +#include "dex/mir_graph.h" #include "dex/quick/mir_to_lir-inl.h" +#include "driver/compiler_driver.h" #include "gc/accounting/card_table.h" #include "mirror/art_method.h" #include "mirror/object_array-inl.h" diff --git a/compiler/dex/quick/arm/codegen_arm.h b/compiler/dex/quick/arm/codegen_arm.h index 6ac1849..025e69f 100644 --- a/compiler/dex/quick/arm/codegen_arm.h +++ b/compiler/dex/quick/arm/codegen_arm.h @@ -18,12 +18,14 @@ #define ART_COMPILER_DEX_QUICK_ARM_CODEGEN_ARM_H_ #include "arm_lir.h" -#include "dex/compiler_internals.h" +#include "base/logging.h" #include "dex/quick/mir_to_lir.h" #include "utils/arena_containers.h" namespace art { +struct CompilationUnit; + class ArmMir2Lir FINAL : public Mir2Lir { protected: // Inherited class for ARM backend. diff --git a/compiler/dex/quick/arm/fp_arm.cc b/compiler/dex/quick/arm/fp_arm.cc index 2b2592d..eb1383f 100644 --- a/compiler/dex/quick/arm/fp_arm.cc +++ b/compiler/dex/quick/arm/fp_arm.cc @@ -14,8 +14,11 @@ * limitations under the License. */ -#include "arm_lir.h" #include "codegen_arm.h" + +#include "arm_lir.h" +#include "base/logging.h" +#include "dex/mir_graph.h" #include "dex/quick/mir_to_lir-inl.h" namespace art { diff --git a/compiler/dex/quick/arm/int_arm.cc b/compiler/dex/quick/arm/int_arm.cc index 7970bd8..3159886 100644 --- a/compiler/dex/quick/arm/int_arm.cc +++ b/compiler/dex/quick/arm/int_arm.cc @@ -16,11 +16,16 @@ /* This file contains codegen for the Thumb2 ISA. */ +#include "codegen_arm.h" + #include "arch/instruction_set_features.h" #include "arm_lir.h" -#include "codegen_arm.h" +#include "base/logging.h" +#include "dex/compiler_ir.h" +#include "dex/mir_graph.h" #include "dex/quick/mir_to_lir-inl.h" #include "dex/reg_storage_eq.h" +#include "driver/compiler_driver.h" #include "entrypoints/quick/quick_entrypoints.h" #include "mirror/array-inl.h" #include "utils.h" @@ -1140,7 +1145,7 @@ LIR* ArmMir2Lir::OpDecAndBranch(ConditionCode c_code, RegStorage reg, LIR* targe } bool ArmMir2Lir::GenMemBarrier(MemBarrierKind barrier_kind) { - if (!cu_->GetInstructionSetFeatures()->IsSmp()) { + if (!cu_->compiler_driver->GetInstructionSetFeatures()->IsSmp()) { return false; } // Start off with using the last LIR as the barrier. If it is not enough, then we will generate one. diff --git a/compiler/dex/quick/arm/target_arm.cc b/compiler/dex/quick/arm/target_arm.cc index 52a516c..5538d79 100644 --- a/compiler/dex/quick/arm/target_arm.cc +++ b/compiler/dex/quick/arm/target_arm.cc @@ -21,7 +21,8 @@ #include #include "backend_arm.h" -#include "dex/compiler_internals.h" +#include "base/logging.h" +#include "dex/mir_graph.h" #include "dex/quick/mir_to_lir-inl.h" namespace art { diff --git a/compiler/dex/quick/arm/utility_arm.cc b/compiler/dex/quick/arm/utility_arm.cc index 73b68a5..e4bd2a3 100644 --- a/compiler/dex/quick/arm/utility_arm.cc +++ b/compiler/dex/quick/arm/utility_arm.cc @@ -18,8 +18,10 @@ #include "arch/arm/instruction_set_features_arm.h" #include "arm_lir.h" +#include "base/logging.h" #include "dex/quick/mir_to_lir-inl.h" #include "dex/reg_storage_eq.h" +#include "driver/compiler_driver.h" namespace art { diff --git a/compiler/dex/quick/arm64/arm64_lir.h b/compiler/dex/quick/arm64/arm64_lir.h index 943c5c1..d15412a 100644 --- a/compiler/dex/quick/arm64/arm64_lir.h +++ b/compiler/dex/quick/arm64/arm64_lir.h @@ -17,7 +17,9 @@ #ifndef ART_COMPILER_DEX_QUICK_ARM64_ARM64_LIR_H_ #define ART_COMPILER_DEX_QUICK_ARM64_ARM64_LIR_H_ -#include "dex/compiler_internals.h" +#include "dex/compiler_enums.h" +#include "dex/reg_location.h" +#include "dex/reg_storage.h" namespace art { diff --git a/compiler/dex/quick/arm64/assemble_arm64.cc b/compiler/dex/quick/arm64/assemble_arm64.cc index d45ec49..54956d9 100644 --- a/compiler/dex/quick/arm64/assemble_arm64.cc +++ b/compiler/dex/quick/arm64/assemble_arm64.cc @@ -18,7 +18,10 @@ #include "arch/arm64/instruction_set_features_arm64.h" #include "arm64_lir.h" -#include "dex/quick/mir_to_lir-inl.h" +#include "base/logging.h" +#include "dex/compiler_ir.h" +#include "dex/quick/mir_to_lir.h" +#include "driver/compiler_driver.h" namespace art { @@ -1016,7 +1019,7 @@ void Arm64Mir2Lir::AssembleLIR() { // Avoid emitting code that could trigger Cortex A53's erratum 835769. // This fixup should be carried out for all multiply-accumulate instructions: madd, msub, // smaddl, smsubl, umaddl and umsubl. - if (cu_->GetInstructionSetFeatures()->AsArm64InstructionSetFeatures() + if (cu_->compiler_driver->GetInstructionSetFeatures()->AsArm64InstructionSetFeatures() ->NeedFixCortexA53_835769()) { // Check that this is a 64-bit multiply-accumulate. if (IS_WIDE(lir->opcode)) { diff --git a/compiler/dex/quick/arm64/call_arm64.cc b/compiler/dex/quick/arm64/call_arm64.cc index 089e4b6..6492442 100644 --- a/compiler/dex/quick/arm64/call_arm64.cc +++ b/compiler/dex/quick/arm64/call_arm64.cc @@ -16,9 +16,13 @@ /* This file contains codegen for the Thumb2 ISA. */ -#include "arm64_lir.h" #include "codegen_arm64.h" + +#include "arm64_lir.h" +#include "base/logging.h" +#include "dex/mir_graph.h" #include "dex/quick/mir_to_lir-inl.h" +#include "driver/compiler_driver.h" #include "gc/accounting/card_table.h" #include "entrypoints/quick/quick_entrypoints.h" #include "mirror/art_method.h" diff --git a/compiler/dex/quick/arm64/codegen_arm64.h b/compiler/dex/quick/arm64/codegen_arm64.h index c68b1d0..49ca625 100644 --- a/compiler/dex/quick/arm64/codegen_arm64.h +++ b/compiler/dex/quick/arm64/codegen_arm64.h @@ -18,7 +18,7 @@ #define ART_COMPILER_DEX_QUICK_ARM64_CODEGEN_ARM64_H_ #include "arm64_lir.h" -#include "dex/compiler_internals.h" +#include "base/logging.h" #include "dex/quick/mir_to_lir.h" #include diff --git a/compiler/dex/quick/arm64/fp_arm64.cc b/compiler/dex/quick/arm64/fp_arm64.cc index ff692b7..a8ec6c0 100644 --- a/compiler/dex/quick/arm64/fp_arm64.cc +++ b/compiler/dex/quick/arm64/fp_arm64.cc @@ -14,8 +14,11 @@ * limitations under the License. */ -#include "arm64_lir.h" #include "codegen_arm64.h" + +#include "arm64_lir.h" +#include "base/logging.h" +#include "dex/mir_graph.h" #include "dex/quick/mir_to_lir-inl.h" #include "utils.h" diff --git a/compiler/dex/quick/arm64/int_arm64.cc b/compiler/dex/quick/arm64/int_arm64.cc index 88ab6f8..92675f3 100644 --- a/compiler/dex/quick/arm64/int_arm64.cc +++ b/compiler/dex/quick/arm64/int_arm64.cc @@ -16,11 +16,16 @@ /* This file contains codegen for the Thumb2 ISA. */ +#include "codegen_arm64.h" + #include "arch/instruction_set_features.h" #include "arm64_lir.h" -#include "codegen_arm64.h" +#include "base/logging.h" +#include "dex/compiler_ir.h" +#include "dex/mir_graph.h" #include "dex/quick/mir_to_lir-inl.h" #include "dex/reg_storage_eq.h" +#include "driver/compiler_driver.h" #include "entrypoints/quick/quick_entrypoints.h" #include "mirror/array-inl.h" #include "utils.h" @@ -1003,7 +1008,7 @@ LIR* Arm64Mir2Lir::OpDecAndBranch(ConditionCode c_code, RegStorage reg, LIR* tar } bool Arm64Mir2Lir::GenMemBarrier(MemBarrierKind barrier_kind) { - if (!cu_->GetInstructionSetFeatures()->IsSmp()) { + if (!cu_->compiler_driver->GetInstructionSetFeatures()->IsSmp()) { return false; } // Start off with using the last LIR as the barrier. If it is not enough, then we will generate one. diff --git a/compiler/dex/quick/arm64/target_arm64.cc b/compiler/dex/quick/arm64/target_arm64.cc index ee7e818..34662f2 100644 --- a/compiler/dex/quick/arm64/target_arm64.cc +++ b/compiler/dex/quick/arm64/target_arm64.cc @@ -21,7 +21,8 @@ #include #include "backend_arm64.h" -#include "dex/compiler_internals.h" +#include "base/logging.h" +#include "dex/mir_graph.h" #include "dex/quick/mir_to_lir-inl.h" #include "dex/reg_storage_eq.h" diff --git a/compiler/dex/quick/arm64/utility_arm64.cc b/compiler/dex/quick/arm64/utility_arm64.cc index a331f41..f48290d 100644 --- a/compiler/dex/quick/arm64/utility_arm64.cc +++ b/compiler/dex/quick/arm64/utility_arm64.cc @@ -14,8 +14,10 @@ * limitations under the License. */ -#include "arm64_lir.h" #include "codegen_arm64.h" + +#include "arm64_lir.h" +#include "base/logging.h" #include "dex/quick/mir_to_lir-inl.h" #include "dex/reg_storage_eq.h" diff --git a/compiler/dex/quick/codegen_util.cc b/compiler/dex/quick/codegen_util.cc index ae9b0f4..52b2e15 100644 --- a/compiler/dex/quick/codegen_util.cc +++ b/compiler/dex/quick/codegen_util.cc @@ -14,13 +14,16 @@ * limitations under the License. */ -#include "dex/compiler_internals.h" +#include "mir_to_lir-inl.h" + +#include "dex/mir_graph.h" +#include "driver/compiler_driver.h" #include "driver/compiler_options.h" +#include "driver/dex_compilation_unit.h" #include "dex_file-inl.h" #include "gc_map.h" #include "gc_map_builder.h" #include "mapping_table.h" -#include "mir_to_lir-inl.h" #include "dex/quick/dex_file_method_inliner.h" #include "dex/quick/dex_file_to_method_inliner_map.h" #include "dex/verification_results.h" diff --git a/compiler/dex/quick/dex_file_method_inliner.cc b/compiler/dex/quick/dex_file_method_inliner.cc index 84c0d93..7245853 100644 --- a/compiler/dex/quick/dex_file_method_inliner.cc +++ b/compiler/dex/quick/dex_file_method_inliner.cc @@ -18,18 +18,15 @@ #include +#include "base/logging.h" #include "base/macros.h" -#include "base/mutex.h" #include "base/mutex-inl.h" -#include "dex/frontend.h" -#include "thread.h" +#include "dex/compiler_ir.h" #include "thread-inl.h" #include "dex/mir_graph.h" #include "dex/quick/mir_to_lir.h" -#include "dex_instruction.h" #include "dex_instruction-inl.h" #include "driver/dex_compilation_unit.h" -#include "verifier/method_verifier.h" #include "verifier/method_verifier-inl.h" namespace art { diff --git a/compiler/dex/quick/gen_common.cc b/compiler/dex/quick/gen_common.cc index aa47cee..9f53b89 100644 --- a/compiler/dex/quick/gen_common.cc +++ b/compiler/dex/quick/gen_common.cc @@ -14,13 +14,16 @@ * limitations under the License. */ +#include "mir_to_lir-inl.h" + #include #include "arch/arm/instruction_set_features_arm.h" +#include "base/macros.h" #include "dex/compiler_ir.h" -#include "dex/compiler_internals.h" +#include "dex/mir_graph.h" #include "dex/quick/arm/arm_lir.h" -#include "dex/quick/mir_to_lir-inl.h" +#include "driver/compiler_driver.h" #include "entrypoints/quick/quick_entrypoints.h" #include "mirror/array.h" #include "mirror/object_array-inl.h" @@ -41,6 +44,18 @@ typedef mirror::ObjectArray ClassArray; * and "op" calls may be used here. */ +ALWAYS_INLINE static inline bool ForceSlowFieldPath(CompilationUnit* cu) { + return (cu->enable_debug & (1 << kDebugSlowFieldPath)) != 0; +} + +ALWAYS_INLINE static inline bool ForceSlowStringPath(CompilationUnit* cu) { + return (cu->enable_debug & (1 << kDebugSlowStringPath)) != 0; +} + +ALWAYS_INLINE static inline bool ForceSlowTypePath(CompilationUnit* cu) { + return (cu->enable_debug & (1 << kDebugSlowTypePath)) != 0; +} + /* * Generate a kPseudoBarrier marker to indicate the boundary of special * blocks. @@ -594,7 +609,7 @@ void Mir2Lir::GenSput(MIR* mir, RegLocation rl_src, OpSize size) { const MirSFieldLoweringInfo& field_info = mir_graph_->GetSFieldLoweringInfo(mir); DCHECK_EQ(SPutMemAccessType(mir->dalvikInsn.opcode), field_info.MemAccessType()); cu_->compiler_driver->ProcessedStaticField(field_info.FastPut(), field_info.IsReferrersClass()); - if (!SLOW_FIELD_PATH && field_info.FastPut()) { + if (!ForceSlowFieldPath(cu_) && field_info.FastPut()) { DCHECK_GE(field_info.FieldOffset().Int32Value(), 0); RegStorage r_base; if (field_info.IsReferrersClass()) { @@ -714,7 +729,7 @@ void Mir2Lir::GenSget(MIR* mir, RegLocation rl_dest, OpSize size, Primitive::Typ DCHECK_EQ(SGetMemAccessType(mir->dalvikInsn.opcode), field_info.MemAccessType()); cu_->compiler_driver->ProcessedStaticField(field_info.FastGet(), field_info.IsReferrersClass()); - if (!SLOW_FIELD_PATH && field_info.FastGet()) { + if (!ForceSlowFieldPath(cu_) && field_info.FastGet()) { DCHECK_GE(field_info.FieldOffset().Int32Value(), 0); RegStorage r_base; if (field_info.IsReferrersClass()) { @@ -852,7 +867,7 @@ void Mir2Lir::GenIGet(MIR* mir, int opt_flags, OpSize size, Primitive::Type type const MirIFieldLoweringInfo& field_info = mir_graph_->GetIFieldLoweringInfo(mir); DCHECK_EQ(IGetMemAccessType(mir->dalvikInsn.opcode), field_info.MemAccessType()); cu_->compiler_driver->ProcessedInstanceField(field_info.FastGet()); - if (!SLOW_FIELD_PATH && field_info.FastGet()) { + if (!ForceSlowFieldPath(cu_) && field_info.FastGet()) { RegisterClass reg_class = RegClassForFieldLoadStore(size, field_info.IsVolatile()); // A load of the class will lead to an iget with offset 0. DCHECK_GE(field_info.FieldOffset().Int32Value(), 0); @@ -926,7 +941,7 @@ void Mir2Lir::GenIPut(MIR* mir, int opt_flags, OpSize size, const MirIFieldLoweringInfo& field_info = mir_graph_->GetIFieldLoweringInfo(mir); DCHECK_EQ(IPutMemAccessType(mir->dalvikInsn.opcode), field_info.MemAccessType()); cu_->compiler_driver->ProcessedInstanceField(field_info.FastPut()); - if (!SLOW_FIELD_PATH && field_info.FastPut()) { + if (!ForceSlowFieldPath(cu_) && field_info.FastPut()) { RegisterClass reg_class = RegClassForFieldLoadStore(size, field_info.IsVolatile()); // Dex code never writes to the class field. DCHECK_GE(static_cast(field_info.FieldOffset().Int32Value()), @@ -1016,7 +1031,7 @@ void Mir2Lir::GenConstClass(uint32_t type_idx, RegLocation rl_dest) { int32_t offset_of_type = ClassArray::OffsetOfElement(type_idx).Int32Value(); LoadRefDisp(res_reg, offset_of_type, rl_result.reg, kNotVolatile); if (!cu_->compiler_driver->CanAssumeTypeIsPresentInDexCache(*cu_->dex_file, - type_idx) || SLOW_TYPE_PATH) { + type_idx) || ForceSlowTypePath(cu_)) { // Slow path, at runtime test if type is null and if so initialize FlushAllRegs(); LIR* branch = OpCmpImmBranch(kCondEq, rl_result.reg, 0, NULL); @@ -1061,7 +1076,7 @@ void Mir2Lir::GenConstString(uint32_t string_idx, RegLocation rl_dest) { int32_t offset_of_string = mirror::ObjectArray::OffsetOfElement(string_idx). Int32Value(); if (!cu_->compiler_driver->CanAssumeStringIsPresentInDexCache( - *cu_->dex_file, string_idx) || SLOW_STRING_PATH) { + *cu_->dex_file, string_idx) || ForceSlowStringPath(cu_)) { // slow path, resolve string if not in dex cache FlushAllRegs(); LockCallTemps(); // Using explicit registers @@ -1679,7 +1694,7 @@ void Mir2Lir::GenArithOpInt(Instruction::Code opcode, RegLocation rl_dest, rl_result = GenDivRem(rl_dest, rl_src1.reg, rl_src2.reg, op == kOpDiv); done = true; } else if (cu_->instruction_set == kThumb2) { - if (cu_->GetInstructionSetFeatures()->AsArmInstructionSetFeatures()-> + if (cu_->compiler_driver->GetInstructionSetFeatures()->AsArmInstructionSetFeatures()-> HasDivideInstruction()) { // Use ARM SDIV instruction for division. For remainder we also need to // calculate using a MUL and subtract. @@ -1973,7 +1988,7 @@ void Mir2Lir::GenArithOpIntLit(Instruction::Code opcode, RegLocation rl_dest, Re rl_result = GenDivRemLit(rl_dest, rl_src, lit, is_div); done = true; } else if (cu_->instruction_set == kThumb2) { - if (cu_->GetInstructionSetFeatures()->AsArmInstructionSetFeatures()-> + if (cu_->compiler_driver->GetInstructionSetFeatures()->AsArmInstructionSetFeatures()-> HasDivideInstruction()) { // Use ARM SDIV instruction for division. For remainder we also need to // calculate using a MUL and subtract. diff --git a/compiler/dex/quick/gen_invoke.cc b/compiler/dex/quick/gen_invoke.cc index d5889f5..bb5b0cd 100755 --- a/compiler/dex/quick/gen_invoke.cc +++ b/compiler/dex/quick/gen_invoke.cc @@ -14,12 +14,16 @@ * limitations under the License. */ +#include "mir_to_lir-inl.h" + #include "arm/codegen_arm.h" #include "dex/compiler_ir.h" -#include "dex/frontend.h" +#include "dex/dex_flags.h" +#include "dex/mir_graph.h" #include "dex/quick/dex_file_method_inliner.h" #include "dex/quick/dex_file_to_method_inliner_map.h" #include "dex_file-inl.h" +#include "driver/compiler_driver.h" #include "entrypoints/quick/quick_entrypoints.h" #include "invoke_type.h" #include "mirror/array.h" @@ -27,7 +31,6 @@ #include "mirror/dex_cache.h" #include "mirror/object_array-inl.h" #include "mirror/string.h" -#include "mir_to_lir-inl.h" #include "scoped_thread_state_change.h" namespace art { diff --git a/compiler/dex/quick/gen_loadstore.cc b/compiler/dex/quick/gen_loadstore.cc index d314601..9f36e35 100644 --- a/compiler/dex/quick/gen_loadstore.cc +++ b/compiler/dex/quick/gen_loadstore.cc @@ -14,9 +14,10 @@ * limitations under the License. */ +#include "mir_to_lir-inl.h" + #include "dex/compiler_ir.h" -#include "dex/compiler_internals.h" -#include "dex/quick/mir_to_lir-inl.h" +#include "dex/mir_graph.h" #include "invoke_type.h" namespace art { diff --git a/compiler/dex/quick/local_optimizations.cc b/compiler/dex/quick/local_optimizations.cc index e0f4691..e573899 100644 --- a/compiler/dex/quick/local_optimizations.cc +++ b/compiler/dex/quick/local_optimizations.cc @@ -14,9 +14,10 @@ * limitations under the License. */ -#include "dex/compiler_internals.h" #include "dex/quick/mir_to_lir-inl.h" +#include "base/logging.h" + namespace art { #define DEBUG_OPT(X) diff --git a/compiler/dex/quick/mips/assemble_mips.cc b/compiler/dex/quick/mips/assemble_mips.cc index 4265ae1..a531317 100644 --- a/compiler/dex/quick/mips/assemble_mips.cc +++ b/compiler/dex/quick/mips/assemble_mips.cc @@ -16,7 +16,9 @@ #include "codegen_mips.h" -#include "dex/quick/mir_to_lir-inl.h" +#include "base/logging.h" +#include "dex/compiler_ir.h" +#include "dex/quick/mir_to_lir.h" #include "mips_lir.h" namespace art { diff --git a/compiler/dex/quick/mips/call_mips.cc b/compiler/dex/quick/mips/call_mips.cc index ed92e82..ccfdaf6 100644 --- a/compiler/dex/quick/mips/call_mips.cc +++ b/compiler/dex/quick/mips/call_mips.cc @@ -18,6 +18,8 @@ #include "codegen_mips.h" +#include "base/logging.h" +#include "dex/mir_graph.h" #include "dex/quick/mir_to_lir-inl.h" #include "entrypoints/quick/quick_entrypoints.h" #include "gc/accounting/card_table.h" diff --git a/compiler/dex/quick/mips/codegen_mips.h b/compiler/dex/quick/mips/codegen_mips.h index ac14704..a37fe40 100644 --- a/compiler/dex/quick/mips/codegen_mips.h +++ b/compiler/dex/quick/mips/codegen_mips.h @@ -17,12 +17,13 @@ #ifndef ART_COMPILER_DEX_QUICK_MIPS_CODEGEN_MIPS_H_ #define ART_COMPILER_DEX_QUICK_MIPS_CODEGEN_MIPS_H_ -#include "dex/compiler_internals.h" #include "dex/quick/mir_to_lir.h" #include "mips_lir.h" namespace art { +struct CompilationUnit; + class MipsMir2Lir FINAL : public Mir2Lir { protected: class InToRegStorageMipsMapper : public InToRegStorageMapper { diff --git a/compiler/dex/quick/mips/fp_mips.cc b/compiler/dex/quick/mips/fp_mips.cc index 495d85e..d7ed7ac 100644 --- a/compiler/dex/quick/mips/fp_mips.cc +++ b/compiler/dex/quick/mips/fp_mips.cc @@ -16,6 +16,7 @@ #include "codegen_mips.h" +#include "base/logging.h" #include "dex/quick/mir_to_lir-inl.h" #include "entrypoints/quick/quick_entrypoints.h" #include "mips_lir.h" diff --git a/compiler/dex/quick/mips/int_mips.cc b/compiler/dex/quick/mips/int_mips.cc index aabef60..17ac629 100644 --- a/compiler/dex/quick/mips/int_mips.cc +++ b/compiler/dex/quick/mips/int_mips.cc @@ -18,6 +18,8 @@ #include "codegen_mips.h" +#include "base/logging.h" +#include "dex/mir_graph.h" #include "dex/quick/mir_to_lir-inl.h" #include "dex/reg_storage_eq.h" #include "entrypoints/quick/quick_entrypoints.h" diff --git a/compiler/dex/quick/mips/mips_lir.h b/compiler/dex/quick/mips/mips_lir.h index 3df8f2e..66e3894 100644 --- a/compiler/dex/quick/mips/mips_lir.h +++ b/compiler/dex/quick/mips/mips_lir.h @@ -17,7 +17,8 @@ #ifndef ART_COMPILER_DEX_QUICK_MIPS_MIPS_LIR_H_ #define ART_COMPILER_DEX_QUICK_MIPS_MIPS_LIR_H_ -#include "dex/compiler_internals.h" +#include "dex/reg_location.h" +#include "dex/reg_storage.h" namespace art { diff --git a/compiler/dex/quick/mips/target_mips.cc b/compiler/dex/quick/mips/target_mips.cc index c819903..8574ffd 100644 --- a/compiler/dex/quick/mips/target_mips.cc +++ b/compiler/dex/quick/mips/target_mips.cc @@ -22,8 +22,10 @@ #include "arch/mips/instruction_set_features_mips.h" #include "backend_mips.h" -#include "dex/compiler_internals.h" +#include "base/logging.h" +#include "dex/compiler_ir.h" #include "dex/quick/mir_to_lir-inl.h" +#include "driver/compiler_driver.h" #include "mips_lir.h" namespace art { @@ -143,7 +145,8 @@ RegStorage MipsMir2Lir::InToRegStorageMipsMapper::GetNextReg(ShortyArg arg) { */ ResourceMask MipsMir2Lir::GetRegMaskCommon(const RegStorage& reg) const { if (reg.IsDouble()) { - if (cu_->GetInstructionSetFeatures()->AsMipsInstructionSetFeatures()->Is32BitFloatingPoint()) { + if (cu_->compiler_driver->GetInstructionSetFeatures()->AsMipsInstructionSetFeatures() + ->Is32BitFloatingPoint()) { return ResourceMask::TwoBits((reg.GetRegNum() & ~1) + kMipsFPReg0); } else { return ResourceMask::TwoBits(reg.GetRegNum() * 2 + kMipsFPReg0); @@ -398,7 +401,8 @@ void MipsMir2Lir::ClobberCallerSave() { Clobber(rs_rF13); Clobber(rs_rF14); Clobber(rs_rF15); - if (cu_->GetInstructionSetFeatures()->AsMipsInstructionSetFeatures()->Is32BitFloatingPoint()) { + if (cu_->compiler_driver->GetInstructionSetFeatures()->AsMipsInstructionSetFeatures() + ->Is32BitFloatingPoint()) { Clobber(rs_rD0_fr0); Clobber(rs_rD1_fr0); Clobber(rs_rD2_fr0); @@ -449,7 +453,7 @@ void MipsMir2Lir::FreeCallTemps() { } bool MipsMir2Lir::GenMemBarrier(MemBarrierKind barrier_kind ATTRIBUTE_UNUSED) { - if (cu_->GetInstructionSetFeatures()->IsSmp()) { + if (cu_->compiler_driver->GetInstructionSetFeatures()->IsSmp()) { NewLIR1(kMipsSync, 0 /* Only stype currently supported */); return true; } else { @@ -459,7 +463,8 @@ bool MipsMir2Lir::GenMemBarrier(MemBarrierKind barrier_kind ATTRIBUTE_UNUSED) { void MipsMir2Lir::CompilerInitializeRegAlloc() { const bool fpu_is_32bit = - cu_->GetInstructionSetFeatures()->AsMipsInstructionSetFeatures()->Is32BitFloatingPoint(); + cu_->compiler_driver->GetInstructionSetFeatures()->AsMipsInstructionSetFeatures() + ->Is32BitFloatingPoint(); reg_pool_.reset(new (arena_) RegisterPool(this, arena_, core_regs, empty_pool /* core64 */, sp_regs, fpu_is_32bit ? dp_fr0_regs : dp_fr1_regs, diff --git a/compiler/dex/quick/mips/utility_mips.cc b/compiler/dex/quick/mips/utility_mips.cc index 15fc69d..6f6bf68 100644 --- a/compiler/dex/quick/mips/utility_mips.cc +++ b/compiler/dex/quick/mips/utility_mips.cc @@ -17,8 +17,10 @@ #include "codegen_mips.h" #include "arch/mips/instruction_set_features_mips.h" +#include "base/logging.h" #include "dex/quick/mir_to_lir-inl.h" #include "dex/reg_storage_eq.h" +#include "driver/compiler_driver.h" #include "mips_lir.h" namespace art { @@ -306,7 +308,7 @@ LIR* MipsMir2Lir::OpRegReg(OpKind op, RegStorage r_dest_src1, RegStorage r_src2) case kOpXor: return OpRegRegReg(op, r_dest_src1, r_dest_src1, r_src2); case kOp2Byte: - if (cu_->GetInstructionSetFeatures()->AsMipsInstructionSetFeatures() + if (cu_->compiler_driver->GetInstructionSetFeatures()->AsMipsInstructionSetFeatures() ->IsMipsIsaRevGreaterThanEqual2()) { res = NewLIR2(kMipsSeb, r_dest_src1.GetReg(), r_src2.GetReg()); } else { @@ -315,7 +317,7 @@ LIR* MipsMir2Lir::OpRegReg(OpKind op, RegStorage r_dest_src1, RegStorage r_src2) } return res; case kOp2Short: - if (cu_->GetInstructionSetFeatures()->AsMipsInstructionSetFeatures() + if (cu_->compiler_driver->GetInstructionSetFeatures()->AsMipsInstructionSetFeatures() ->IsMipsIsaRevGreaterThanEqual2()) { res = NewLIR2(kMipsSeh, r_dest_src1.GetReg(), r_src2.GetReg()); } else { diff --git a/compiler/dex/quick/mir_to_lir-inl.h b/compiler/dex/quick/mir_to_lir-inl.h index 144790e..280dbbe 100644 --- a/compiler/dex/quick/mir_to_lir-inl.h +++ b/compiler/dex/quick/mir_to_lir-inl.h @@ -19,7 +19,8 @@ #include "mir_to_lir.h" -#include "dex/compiler_internals.h" +#include "base/logging.h" +#include "dex/compiler_ir.h" namespace art { diff --git a/compiler/dex/quick/mir_to_lir.cc b/compiler/dex/quick/mir_to_lir.cc index 1ff64c9..274e078 100644 --- a/compiler/dex/quick/mir_to_lir.cc +++ b/compiler/dex/quick/mir_to_lir.cc @@ -14,10 +14,11 @@ * limitations under the License. */ -#include "dex/compiler_internals.h" +#include "mir_to_lir-inl.h" + #include "dex/dataflow_iterator-inl.h" #include "dex/quick/dex_file_method_inliner.h" -#include "mir_to_lir-inl.h" +#include "driver/compiler_driver.h" #include "primitive.h" #include "thread-inl.h" diff --git a/compiler/dex/quick/mir_to_lir.h b/compiler/dex/quick/mir_to_lir.h index fabf941..64ecf94 100644 --- a/compiler/dex/quick/mir_to_lir.h +++ b/compiler/dex/quick/mir_to_lir.h @@ -17,15 +17,14 @@ #ifndef ART_COMPILER_DEX_QUICK_MIR_TO_LIR_H_ #define ART_COMPILER_DEX_QUICK_MIR_TO_LIR_H_ -#include "arch/instruction_set.h" #include "compiled_method.h" #include "dex/compiler_enums.h" -#include "dex/compiler_ir.h" +#include "dex/dex_flags.h" +#include "dex/dex_types.h" #include "dex/reg_location.h" #include "dex/reg_storage.h" #include "dex/backend.h" #include "dex/quick/resource_mask.h" -#include "driver/compiler_driver.h" #include "entrypoints/quick/quick_entrypoints_enum.h" #include "invoke_type.h" #include "leb128.h" @@ -125,10 +124,12 @@ namespace art { #define REG_USE23 (REG_USE2 | REG_USE3) #define REG_USE123 (REG_USE1 | REG_USE2 | REG_USE3) -// TODO: #includes need a cleanup -#ifndef INVALID_SREG -#define INVALID_SREG (-1) -#endif +/* + * Assembly is an iterative process, and usually terminates within + * two or three passes. This should be high enough to handle bizarre + * cases, but detect an infinite loop bug. + */ +#define MAX_ASSEMBLER_RETRIES 50 class BasicBlock; struct CallInfo; @@ -140,7 +141,6 @@ struct RegisterInfo; class DexFileMethodInliner; class MIRGraph; class MirMethodLoweringInfo; -class Mir2Lir; typedef int (*NextCallInsn)(CompilationUnit*, CallInfo*, int, const MethodReference& target_method, @@ -148,6 +148,7 @@ typedef int (*NextCallInsn)(CompilationUnit*, CallInfo*, int, uintptr_t direct_method, InvokeType type); typedef std::vector CodeBuffer; +typedef uint32_t CodeOffset; // Native code offset in bytes. struct UseDefMasks { const ResourceMask* use_mask; // Resource mask for use. @@ -200,13 +201,6 @@ struct LIR { // Mask to denote sreg as the start of a 64-bit item. Must not interfere with low 16 bits. #define STARTING_WIDE_SREG 0x10000 -// TODO: replace these macros -#define SLOW_FIELD_PATH (cu_->enable_debug & (1 << kDebugSlowFieldPath)) -#define SLOW_INVOKE_PATH (cu_->enable_debug & (1 << kDebugSlowInvokePath)) -#define SLOW_STRING_PATH (cu_->enable_debug & (1 << kDebugSlowStringPath)) -#define SLOW_TYPE_PATH (cu_->enable_debug & (1 << kDebugSlowTypePath)) -#define EXERCISE_SLOWEST_STRING_PATH (cu_->enable_debug & (1 << kDebugSlowestStringPath)) - class Mir2Lir : public Backend { public: static constexpr bool kFailOnSizeError = true && kIsDebugBuild; diff --git a/compiler/dex/quick/quick_compiler.cc b/compiler/dex/quick/quick_compiler.cc index 102ce17..699f990 100644 --- a/compiler/dex/quick/quick_compiler.cc +++ b/compiler/dex/quick/quick_compiler.cc @@ -18,8 +18,10 @@ #include +#include "base/logging.h" #include "compiler.h" #include "dex_file-inl.h" +#include "dex/compiler_ir.h" #include "dex/frontend.h" #include "dex/mir_graph.h" #include "dex/quick/mir_to_lir.h" @@ -27,7 +29,6 @@ #include "elf_writer_quick.h" #include "jni/quick/jni_compiler.h" #include "mirror/art_method-inl.h" -#include "base/logging.h" // Specific compiler backends. #include "dex/quick/arm/backend_arm.h" diff --git a/compiler/dex/quick/ralloc_util.cc b/compiler/dex/quick/ralloc_util.cc index 0a98c80..8efafb2 100644 --- a/compiler/dex/quick/ralloc_util.cc +++ b/compiler/dex/quick/ralloc_util.cc @@ -16,10 +16,13 @@ /* This file contains register alloction support. */ -#include "dex/compiler_ir.h" -#include "dex/compiler_internals.h" #include "mir_to_lir-inl.h" +#include "dex/compiler_ir.h" +#include "dex/mir_graph.h" +#include "driver/compiler_driver.h" +#include "driver/dex_compilation_unit.h" + namespace art { /* diff --git a/compiler/dex/quick/resource_mask.cc b/compiler/dex/quick/resource_mask.cc index ca68f95..8a27ecb 100644 --- a/compiler/dex/quick/resource_mask.cc +++ b/compiler/dex/quick/resource_mask.cc @@ -18,6 +18,7 @@ #include "resource_mask.h" +#include "base/logging.h" #include "utils/arena_allocator.h" #include "utils.h" diff --git a/compiler/dex/quick/x86/assemble_x86.cc b/compiler/dex/quick/x86/assemble_x86.cc index ad2ed01..6f26b78 100644 --- a/compiler/dex/quick/x86/assemble_x86.cc +++ b/compiler/dex/quick/x86/assemble_x86.cc @@ -15,7 +15,10 @@ */ #include "codegen_x86.h" -#include "dex/quick/mir_to_lir-inl.h" + +#include "base/logging.h" +#include "dex/compiler_ir.h" +#include "dex/quick/mir_to_lir.h" #include "oat.h" #include "x86_lir.h" diff --git a/compiler/dex/quick/x86/call_x86.cc b/compiler/dex/quick/x86/call_x86.cc index 544ac3b..aa0972f 100644 --- a/compiler/dex/quick/x86/call_x86.cc +++ b/compiler/dex/quick/x86/call_x86.cc @@ -17,7 +17,10 @@ /* This file contains codegen for the X86 ISA */ #include "codegen_x86.h" + +#include "base/logging.h" #include "dex/quick/mir_to_lir-inl.h" +#include "driver/compiler_driver.h" #include "gc/accounting/card_table.h" #include "mirror/art_method.h" #include "mirror/object_array-inl.h" diff --git a/compiler/dex/quick/x86/codegen_x86.h b/compiler/dex/quick/x86/codegen_x86.h index c7d83dd..3815722 100644 --- a/compiler/dex/quick/x86/codegen_x86.h +++ b/compiler/dex/quick/x86/codegen_x86.h @@ -17,7 +17,9 @@ #ifndef ART_COMPILER_DEX_QUICK_X86_CODEGEN_X86_H_ #define ART_COMPILER_DEX_QUICK_X86_CODEGEN_X86_H_ -#include "dex/compiler_internals.h" +#include "base/logging.h" +#include "dex/compiler_ir.h" +#include "dex/mir_graph.h" #include "dex/quick/mir_to_lir.h" #include "x86_lir.h" diff --git a/compiler/dex/quick/x86/fp_x86.cc b/compiler/dex/quick/x86/fp_x86.cc index 89c5648..d8616a7 100755 --- a/compiler/dex/quick/x86/fp_x86.cc +++ b/compiler/dex/quick/x86/fp_x86.cc @@ -15,6 +15,8 @@ */ #include "codegen_x86.h" + +#include "base/logging.h" #include "dex/quick/mir_to_lir-inl.h" #include "dex/reg_storage_eq.h" #include "x86_lir.h" diff --git a/compiler/dex/quick/x86/int_x86.cc b/compiler/dex/quick/x86/int_x86.cc index 03156dc..4fe7a43 100755 --- a/compiler/dex/quick/x86/int_x86.cc +++ b/compiler/dex/quick/x86/int_x86.cc @@ -17,6 +17,8 @@ /* This file contains codegen for the X86 ISA */ #include "codegen_x86.h" + +#include "base/logging.h" #include "dex/quick/mir_to_lir-inl.h" #include "dex/reg_storage_eq.h" #include "mirror/art_method.h" diff --git a/compiler/dex/quick/x86/target_x86.cc b/compiler/dex/quick/x86/target_x86.cc index 142acbc..5a0d612 100755 --- a/compiler/dex/quick/x86/target_x86.cc +++ b/compiler/dex/quick/x86/target_x86.cc @@ -14,16 +14,19 @@ * limitations under the License. */ +#include "codegen_x86.h" + #include #include #include #include "arch/instruction_set_features.h" #include "backend_x86.h" -#include "codegen_x86.h" -#include "dex/compiler_internals.h" +#include "base/logging.h" +#include "dex/compiler_ir.h" #include "dex/quick/mir_to_lir-inl.h" #include "dex/reg_storage_eq.h" +#include "driver/compiler_driver.h" #include "mirror/array-inl.h" #include "mirror/art_method.h" #include "mirror/string.h" @@ -596,7 +599,7 @@ bool X86Mir2Lir::ProvidesFullMemoryBarrier(X86OpCode opcode) { } bool X86Mir2Lir::GenMemBarrier(MemBarrierKind barrier_kind) { - if (!cu_->GetInstructionSetFeatures()->IsSmp()) { + if (!cu_->compiler_driver->GetInstructionSetFeatures()->IsSmp()) { return false; } // Start off with using the last LIR as the barrier. If it is not enough, then we will update it. diff --git a/compiler/dex/quick/x86/utility_x86.cc b/compiler/dex/quick/x86/utility_x86.cc index 3b58698..893b98a 100644 --- a/compiler/dex/quick/x86/utility_x86.cc +++ b/compiler/dex/quick/x86/utility_x86.cc @@ -15,12 +15,15 @@ */ #include "codegen_x86.h" + +#include "base/logging.h" #include "dex/quick/mir_to_lir-inl.h" #include "dex/dataflow_iterator-inl.h" -#include "x86_lir.h" #include "dex/quick/dex_file_method_inliner.h" #include "dex/quick/dex_file_to_method_inliner_map.h" #include "dex/reg_storage_eq.h" +#include "driver/compiler_driver.h" +#include "x86_lir.h" namespace art { @@ -509,7 +512,7 @@ LIR* X86Mir2Lir::OpRegRegImm(OpKind op, RegStorage r_dest, RegStorage r_src, int } } if (r_dest != r_src) { - if (false && op == kOpLsl && value >= 0 && value <= 3) { // lea shift special case + if ((false) && op == kOpLsl && value >= 0 && value <= 3) { // lea shift special case // TODO: fix bug in LEA encoding when disp == 0 return NewLIR5(kX86Lea32RA, r_dest.GetReg(), r5sib_no_base /* base */, r_src.GetReg() /* index */, value /* scale */, 0 /* disp */); diff --git a/compiler/dex/quick/x86/x86_lir.h b/compiler/dex/quick/x86/x86_lir.h index 3e0a852..bc4cb5a 100644 --- a/compiler/dex/quick/x86/x86_lir.h +++ b/compiler/dex/quick/x86/x86_lir.h @@ -17,7 +17,8 @@ #ifndef ART_COMPILER_DEX_QUICK_X86_X86_LIR_H_ #define ART_COMPILER_DEX_QUICK_X86_X86_LIR_H_ -#include "dex/compiler_internals.h" +#include "dex/reg_location.h" +#include "dex/reg_storage.h" namespace art { diff --git a/compiler/dex/reg_location.h b/compiler/dex/reg_location.h index 38f59da..aa8ed46 100644 --- a/compiler/dex/reg_location.h +++ b/compiler/dex/reg_location.h @@ -21,6 +21,7 @@ namespace art { +static constexpr int16_t INVALID_SREG = -1; /* * Whereas a SSA name describes a definition of a Dalvik vreg, the RegLocation describes diff --git a/compiler/dex/ssa_transformation.cc b/compiler/dex/ssa_transformation.cc index 3905649..6bd49de 100644 --- a/compiler/dex/ssa_transformation.cc +++ b/compiler/dex/ssa_transformation.cc @@ -15,7 +15,8 @@ */ #include "base/bit_vector-inl.h" -#include "compiler_internals.h" +#include "base/logging.h" +#include "compiler_ir.h" #include "dataflow_iterator-inl.h" #include "utils/scoped_arena_containers.h" diff --git a/compiler/dex/verification_results.cc b/compiler/dex/verification_results.cc index 4daed67..4ff173d 100644 --- a/compiler/dex/verification_results.cc +++ b/compiler/dex/verification_results.cc @@ -16,15 +16,14 @@ #include "verification_results.h" +#include "base/logging.h" #include "base/stl_util.h" -#include "base/mutex.h" #include "base/mutex-inl.h" #include "driver/compiler_driver.h" #include "driver/compiler_options.h" #include "thread.h" #include "thread-inl.h" #include "verified_method.h" -#include "verifier/method_verifier.h" #include "verifier/method_verifier-inl.h" namespace art { diff --git a/compiler/dex/verified_method.cc b/compiler/dex/verified_method.cc index 93e9a51..21e965d 100644 --- a/compiler/dex/verified_method.cc +++ b/compiler/dex/verified_method.cc @@ -23,20 +23,13 @@ #include "base/logging.h" #include "base/stl_util.h" #include "dex_file.h" -#include "dex_instruction.h" #include "dex_instruction-inl.h" -#include "base/mutex.h" -#include "base/mutex-inl.h" -#include "mirror/art_method.h" #include "mirror/art_method-inl.h" -#include "mirror/class.h" #include "mirror/class-inl.h" -#include "mirror/dex_cache.h" #include "mirror/dex_cache-inl.h" -#include "mirror/object.h" #include "mirror/object-inl.h" +#include "utils.h" #include "verifier/dex_gc_map.h" -#include "verifier/method_verifier.h" #include "verifier/method_verifier-inl.h" #include "verifier/reg_type-inl.h" #include "verifier/register_line-inl.h" diff --git a/compiler/dex/vreg_analysis.cc b/compiler/dex/vreg_analysis.cc index 62c4089..f70850a 100644 --- a/compiler/dex/vreg_analysis.cc +++ b/compiler/dex/vreg_analysis.cc @@ -14,8 +14,11 @@ * limitations under the License. */ -#include "compiler_internals.h" +#include "base/logging.h" +#include "base/stringprintf.h" +#include "compiler_ir.h" #include "dex/dataflow_iterator-inl.h" +#include "dex_flags.h" namespace art { diff --git a/compiler/driver/compiler_driver-inl.h b/compiler/driver/compiler_driver-inl.h index 3a91b08..9948c82 100644 --- a/compiler/driver/compiler_driver-inl.h +++ b/compiler/driver/compiler_driver-inl.h @@ -19,7 +19,6 @@ #include "compiler_driver.h" -#include "dex/compiler_ir.h" #include "dex_compilation_unit.h" #include "mirror/art_field-inl.h" #include "mirror/art_method-inl.h" diff --git a/compiler/driver/compiler_driver.h b/compiler/driver/compiler_driver.h index a86043c..2fca2e5 100644 --- a/compiler/driver/compiler_driver.h +++ b/compiler/driver/compiler_driver.h @@ -28,6 +28,7 @@ #include "compiled_method.h" #include "compiler.h" #include "dex_file.h" +#include "dex/verified_method.h" #include "driver/compiler_options.h" #include "invoke_type.h" #include "method_reference.h" @@ -41,7 +42,6 @@ #include "utils/dedupe_set.h" #include "utils/swap_space.h" #include "utils.h" -#include "dex/verified_method.h" namespace art { -- cgit v1.1