diff options
Diffstat (limited to 'compiler/optimizing/graph_visualizer.cc')
-rw-r--r-- | compiler/optimizing/graph_visualizer.cc | 40 |
1 files changed, 33 insertions, 7 deletions
diff --git a/compiler/optimizing/graph_visualizer.cc b/compiler/optimizing/graph_visualizer.cc index d94c1fa2fb..f9c63c4486 100644 --- a/compiler/optimizing/graph_visualizer.cc +++ b/compiler/optimizing/graph_visualizer.cc @@ -21,7 +21,9 @@ #include <cctype> #include <sstream> +#include "android-base/stringprintf.h" #include "art_method.h" +#include "art_method-inl.h" #include "base/intrusive_forward_list.h" #include "bounds_check_elimination.h" #include "builder.h" @@ -42,6 +44,8 @@ namespace art { +using android::base::StringPrintf; + static bool HasWhitespace(const char* str) { DCHECK(str != nullptr); while (str[0] != 0) { @@ -106,13 +110,17 @@ std::ostream& operator<<(std::ostream& os, const StringList& list) { } } +#ifndef ART_STATIC_LIBART_COMPILER using create_disasm_prototype = Disassembler*(InstructionSet, DisassemblerOptions*); +#endif + class HGraphVisualizerDisassembler { public: HGraphVisualizerDisassembler(InstructionSet instruction_set, const uint8_t* base_address, const uint8_t* end_address) : instruction_set_(instruction_set), disassembler_(nullptr) { +#ifndef ART_STATIC_LIBART_COMPILER constexpr const char* libart_disassembler_so_name = kIsDebugBuild ? "libartd-disassembler.so" : "libart-disassembler.so"; libart_disassembler_handle_ = dlopen(libart_disassembler_so_name, RTLD_NOW); @@ -128,10 +136,11 @@ class HGraphVisualizerDisassembler { << libart_disassembler_so_name << ": " << dlerror(); return; } +#endif // Reading the disassembly from 0x0 is easier, so we print relative // addresses. We will only disassemble the code once everything has // been generated, so we can read data in literal pools. - disassembler_ = std::unique_ptr<Disassembler>((*create_disassembler)( + disassembler_ = std::unique_ptr<Disassembler>(create_disassembler( instruction_set, new DisassemblerOptions(/* absolute_addresses= */ false, base_address, @@ -145,9 +154,11 @@ class HGraphVisualizerDisassembler { ~HGraphVisualizerDisassembler() { // We need to call ~Disassembler() before we close the library. disassembler_.reset(); +#ifndef ART_STATIC_LIBART_COMPILER if (libart_disassembler_handle_ != nullptr) { dlclose(libart_disassembler_handle_); } +#endif } void Disassemble(std::ostream& output, size_t start, size_t end) const { @@ -168,7 +179,9 @@ class HGraphVisualizerDisassembler { InstructionSet instruction_set_; std::unique_ptr<Disassembler> disassembler_; +#ifndef ART_STATIC_LIBART_COMPILER void* libart_disassembler_handle_; +#endif }; @@ -449,14 +462,11 @@ class HGraphVisualizerPrinter : public HGraphDelegateVisitor { } void VisitCompare(HCompare* compare) override { - ComparisonBias bias = compare->GetBias(); - StartAttributeStream("bias") << (bias == ComparisonBias::kGtBias - ? "gt" - : (bias == ComparisonBias::kLtBias ? "lt" : "none")); + StartAttributeStream("bias") << compare->GetBias(); } void VisitInvoke(HInvoke* invoke) override { - StartAttributeStream("dex_file_index") << invoke->GetDexMethodIndex(); + StartAttributeStream("dex_file_index") << invoke->GetMethodReference().index; ArtMethod* method = invoke->GetResolvedMethod(); // We don't print signatures, which conflict with c1visualizer format. static constexpr bool kWithSignature = false; @@ -464,12 +474,15 @@ class HGraphVisualizerPrinter : public HGraphDelegateVisitor { // other invokes might be coming from inlined methods. ScopedObjectAccess soa(Thread::Current()); std::string method_name = (method == nullptr) - ? GetGraph()->GetDexFile().PrettyMethod(invoke->GetDexMethodIndex(), kWithSignature) + ? invoke->GetMethodReference().PrettyMethod(kWithSignature) : method->PrettyMethod(kWithSignature); StartAttributeStream("method_name") << method_name; StartAttributeStream("always_throws") << std::boolalpha << invoke->AlwaysThrows() << std::noboolalpha; + if (method != nullptr) { + StartAttributeStream("method_index") << method->GetMethodIndex(); + } } void VisitInvokeUnresolved(HInvokeUnresolved* invoke) override { @@ -906,6 +919,19 @@ void HGraphVisualizer::PrintHeader(const char* method_name) const { printer.Flush(); } +std::string HGraphVisualizer::InsertMetaDataAsCompilationBlock(const std::string& meta_data) { + std::string time_str = std::to_string(time(nullptr)); + std::string quoted_meta_data = "\"" + meta_data + "\""; + return StringPrintf("begin_compilation\n" + " name %s\n" + " method %s\n" + " date %s\n" + "end_compilation\n", + quoted_meta_data.c_str(), + quoted_meta_data.c_str(), + time_str.c_str()); +} + void HGraphVisualizer::DumpGraph(const char* pass_name, bool is_after_pass, bool graph_in_bad_state) const { |