From 477bacddadd1b8600b55830e307aebd433d77db9 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 12 Apr 2020 13:59:46 +0200 Subject: [PATCH] ProfileViewer: Symbolicate the disassembled instructions Instead of "call 0x0811d6ac", we now say "call 0x0811d6ac " :^) --- DevTools/ProfileViewer/DisassemblyModel.cpp | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/DevTools/ProfileViewer/DisassemblyModel.cpp b/DevTools/ProfileViewer/DisassemblyModel.cpp index e2ca4028c5..c0a0a3ddb6 100644 --- a/DevTools/ProfileViewer/DisassemblyModel.cpp +++ b/DevTools/ProfileViewer/DisassemblyModel.cpp @@ -50,6 +50,22 @@ static Color color_for_percent(int percent) return heat_gradient().get_pixel(percent, 0); } +class ELFSymbolProvider final : public X86::SymbolProvider { +public: + ELFSymbolProvider(ELF::Loader& loader) + : m_loader(loader) + { + } + + virtual String symbolicate(FlatPtr address, u32* offset = nullptr) const + { + return m_loader.symbolicate(address, offset); + } + +private: + ELF::Loader& m_loader; +}; + DisassemblyModel::DisassemblyModel(Profile& profile, ProfileNode& node) : m_profile(profile) , m_node(node) @@ -72,6 +88,8 @@ DisassemblyModel::DisassemblyModel(Profile& profile, ProfileNode& node) ASSERT(symbol.has_value()); auto view = symbol.value().raw_data(); + + ELFSymbolProvider symbol_provider(*elf_loader); X86::SimpleInstructionStream stream((const u8*)view.characters_without_null_termination(), view.length()); X86::Disassembler disassembler(stream); @@ -82,7 +100,7 @@ DisassemblyModel::DisassemblyModel(Profile& profile, ProfileNode& node) break; FlatPtr address_in_profiled_program = symbol.value().value() + offset_into_symbol; - auto disassembly = insn.value().to_string(address_in_profiled_program); + auto disassembly = insn.value().to_string(address_in_profiled_program, &symbol_provider); StringView instruction_bytes = view.substring_view(offset_into_symbol, insn.value().length()); size_t samples_at_this_instruction = m_node.events_per_address().get(address_in_profiled_program).value_or(0);