From a37d925d405be9f589ac282869a997e73414d859 Mon Sep 17 00:00:00 2001 From: Alexandre Rames Date: Mon, 27 Oct 2014 11:28:14 +0000 Subject: Improvements to the ARM64 disassembler. This contains three changes: - Use register aliases in the disassembly. - When loading from a literal pool, show what is being loaded. - Disassemble using absolute addresses on ARM64. This ensures that addresses disassembled are coherent with instruction location addresses shown. Examples of disassembled instructions before and after the changes: Before: movz w17, #0x471f ldr d9, pc+736 (addr 0x72690d50) After: movz wip1, #0x471f ldr d9, pc+736 (addr 0x72690d50) (-745.133) Change-Id: I72fdc160fac26f74126921834f17a581c26fd5d8 --- disassembler/disassembler_arm64.h | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) (limited to 'disassembler/disassembler_arm64.h') diff --git a/disassembler/disassembler_arm64.h b/disassembler/disassembler_arm64.h index ad20c70222..96a4dd0887 100644 --- a/disassembler/disassembler_arm64.h +++ b/disassembler/disassembler_arm64.h @@ -25,9 +25,35 @@ namespace art { namespace arm64 { +class CustomDisassembler FINAL : public vixl::Disassembler { + public: + explicit CustomDisassembler(bool read_literals) : + vixl::Disassembler(), read_literals_(read_literals) {} + + // Use register aliases in the disassembly. + virtual void AppendRegisterNameToOutput(const vixl::Instruction* instr, + const vixl::CPURegister& reg) OVERRIDE; + + // Improve the disassembly of literal load instructions. + virtual void VisitLoadLiteral(const vixl::Instruction* instr) OVERRIDE; + + private: + // Indicate if the disassembler should read data loaded from literal pools. + // This should only be enabled if reading the target of literal loads is safe. + // Here are possible outputs when the option is on or off: + // read_literals_ | disassembly + // true | 0x72681558: 1c000acb ldr s11, pc+344 (addr 0x726816b0) + // false | 0x72681558: 1c000acb ldr s11, pc+344 (addr 0x726816b0) (3.40282e+38) + const bool read_literals_; +}; + class DisassemblerArm64 FINAL : public Disassembler { public: - explicit DisassemblerArm64(DisassemblerOptions* options) : Disassembler(options) { + // TODO: Update this code once VIXL provides the ability to map code addresses + // to disassemble as a different address (the way FormatInstructionPointer() + // does). + explicit DisassemblerArm64(DisassemblerOptions* options) : + Disassembler(options), disasm(options->can_read_literals_) { decoder.AppendVisitor(&disasm); } @@ -36,7 +62,7 @@ class DisassemblerArm64 FINAL : public Disassembler { private: vixl::Decoder decoder; - vixl::Disassembler disasm; + CustomDisassembler disasm; DISALLOW_COPY_AND_ASSIGN(DisassemblerArm64); }; -- cgit v1.2.3-59-g8ed1b