From eb7b7399dbdb5e471b8ae00a567bf4f19edd3907 Mon Sep 17 00:00:00 2001 From: Alexandre Rames Date: Fri, 19 Jun 2015 14:47:01 +0100 Subject: Opt compiler: Add disassembly to the '.cfg' output. This is automatically added to the '.cfg' output when using the usual `--dump-cfg` option. Change-Id: I864bfc3a8299c042e72e451cc7730ad8271e4deb --- compiler/optimizing/optimizing_compiler.cc | 37 ++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 9 deletions(-) (limited to 'compiler/optimizing/optimizing_compiler.cc') diff --git a/compiler/optimizing/optimizing_compiler.cc b/compiler/optimizing/optimizing_compiler.cc index ad67813332..0c7b6f7093 100644 --- a/compiler/optimizing/optimizing_compiler.cc +++ b/compiler/optimizing/optimizing_compiler.cc @@ -92,19 +92,21 @@ class PassInfoPrinter : public ValueObject { public: PassInfoPrinter(HGraph* graph, const char* method_name, - const CodeGenerator& codegen, + CodeGenerator* codegen, std::ostream* visualizer_output, CompilerDriver* compiler_driver) : method_name_(method_name), timing_logger_enabled_(compiler_driver->GetDumpPasses()), timing_logger_(method_name, true, true), + disasm_info_(graph->GetArena()), visualizer_enabled_(!compiler_driver->GetDumpCfgFileName().empty()), - visualizer_(visualizer_output, graph, codegen) { + visualizer_(visualizer_output, graph, *codegen) { if (strstr(method_name, kStringFilter) == nullptr) { timing_logger_enabled_ = visualizer_enabled_ = false; } if (visualizer_enabled_) { visualizer_.PrintHeader(method_name_); + codegen->SetDisassemblyInformation(&disasm_info_); } } @@ -115,6 +117,12 @@ class PassInfoPrinter : public ValueObject { } } + void DumpDisassembly() const { + if (visualizer_enabled_) { + visualizer_.DumpGraphWithDisassembly(); + } + } + private: void StartPass(const char* pass_name) { // Dump graph first, then start timer. @@ -141,6 +149,8 @@ class PassInfoPrinter : public ValueObject { bool timing_logger_enabled_; TimingLogger timing_logger_; + DisassemblyInformation disasm_info_; + bool visualizer_enabled_; HGraphVisualizer visualizer_; @@ -224,12 +234,13 @@ class OptimizingCompiler FINAL : public Compiler { CodeGenerator* codegen, CompilerDriver* driver, const DexCompilationUnit& dex_compilation_unit, - PassInfoPrinter* pass_info) const; + PassInfoPrinter* pass_info_printer) const; // Just compile without doing optimizations. CompiledMethod* CompileBaseline(CodeGenerator* codegen, CompilerDriver* driver, - const DexCompilationUnit& dex_compilation_unit) const; + const DexCompilationUnit& dex_compilation_unit, + PassInfoPrinter* pass_info_printer) const; std::unique_ptr compilation_stats_; @@ -429,7 +440,7 @@ CompiledMethod* OptimizingCompiler::CompileOptimized(HGraph* graph, MaybeRecordStat(MethodCompilationStat::kCompiledOptimized); - return CompiledMethod::SwapAllocCompiledMethod( + CompiledMethod* compiled_method = CompiledMethod::SwapAllocCompiledMethod( compiler_driver, codegen->GetInstructionSet(), ArrayRef(allocator.GetMemory()), @@ -445,12 +456,15 @@ CompiledMethod* OptimizingCompiler::CompileOptimized(HGraph* graph, ArrayRef(), // native_gc_map. ArrayRef(*codegen->GetAssembler()->cfi().data()), ArrayRef()); + pass_info_printer->DumpDisassembly(); + return compiled_method; } CompiledMethod* OptimizingCompiler::CompileBaseline( CodeGenerator* codegen, CompilerDriver* compiler_driver, - const DexCompilationUnit& dex_compilation_unit) const { + const DexCompilationUnit& dex_compilation_unit, + PassInfoPrinter* pass_info_printer) const { CodeVectorAllocator allocator; codegen->CompileBaseline(&allocator); @@ -466,7 +480,7 @@ CompiledMethod* OptimizingCompiler::CompileBaseline( codegen->BuildNativeGCMap(&gc_map, dex_compilation_unit); MaybeRecordStat(MethodCompilationStat::kCompiledBaseline); - return CompiledMethod::SwapAllocCompiledMethod( + CompiledMethod* compiled_method = CompiledMethod::SwapAllocCompiledMethod( compiler_driver, codegen->GetInstructionSet(), ArrayRef(allocator.GetMemory()), @@ -482,6 +496,8 @@ CompiledMethod* OptimizingCompiler::CompileBaseline( AlignVectorSize(gc_map), ArrayRef(*codegen->GetAssembler()->cfi().data()), ArrayRef()); + pass_info_printer->DumpDisassembly(); + return compiled_method; } CompiledMethod* OptimizingCompiler::TryCompile(const DexFile::CodeItem* code_item, @@ -557,7 +573,7 @@ CompiledMethod* OptimizingCompiler::TryCompile(const DexFile::CodeItem* code_ite PassInfoPrinter pass_info_printer(graph, method_name.c_str(), - *codegen.get(), + codegen.get(), visualizer_output_.get(), compiler_driver); @@ -617,7 +633,10 @@ CompiledMethod* OptimizingCompiler::TryCompile(const DexFile::CodeItem* code_ite MaybeRecordStat(MethodCompilationStat::kNotOptimizedRegisterAllocator); } - return CompileBaseline(codegen.get(), compiler_driver, dex_compilation_unit); + return CompileBaseline(codegen.get(), + compiler_driver, + dex_compilation_unit, + &pass_info_printer); } else { return nullptr; } -- cgit v1.2.3-59-g8ed1b