diff options
author | Colin LeMahieu <colinl@codeaurora.org> | 2015-05-28 19:07:14 +0000 |
---|---|---|
committer | Colin LeMahieu <colinl@codeaurora.org> | 2015-05-28 19:07:14 +0000 |
commit | cada158dc3d9dfd11725e5e29fd01ea73ae59b2f (patch) | |
tree | a75e4e221659837a5ab71187c54874295398a3ed | |
parent | bfecc6bdee5fa68fe5d1503fcef72397003e5bbe (diff) |
[Objdump] Allow instruction pretty printing to be specialized by the target triple.
Differential Revision: http://reviews.llvm.org/D8427
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@238457 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | tools/llvm-objdump/llvm-objdump.cpp | 34 |
1 files changed, 28 insertions, 6 deletions
diff --git a/tools/llvm-objdump/llvm-objdump.cpp b/tools/llvm-objdump/llvm-objdump.cpp index 66de213fc2a..a78d1d267dd 100644 --- a/tools/llvm-objdump/llvm-objdump.cpp +++ b/tools/llvm-objdump/llvm-objdump.cpp @@ -201,6 +201,30 @@ bool llvm::RelocAddressLess(RelocationRef a, RelocationRef b) { return a_addr < b_addr; } +namespace { +class PrettyPrinter { +public: + virtual void printInst(MCInstPrinter &IP, const MCInst *MI, bool ShowRawInsn, + ArrayRef<uint8_t> Bytes, uint64_t Address, + raw_ostream &OS, StringRef Annot, + MCSubtargetInfo const &STI) { + outs() << format("%8" PRIx64 ":", Address); + if (!NoShowRawInsn) { + outs() << "\t"; + dumpBytes(Bytes, outs()); + } + IP.printInst(MI, outs(), "", STI); + } +}; +PrettyPrinter PrettyPrinterInst; +PrettyPrinter &selectPrettyPrinter(Triple const &Triple, MCInstPrinter &IP) { + switch(Triple.getArch()) { + default: + return PrettyPrinterInst; + } +} +} + static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) { const Target *TheTarget = getTarget(Obj); // getTarget() will have already issued a diagnostic if necessary, so @@ -267,6 +291,7 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) { << '\n'; return; } + PrettyPrinter &PIP = selectPrettyPrinter(Triple(TripleName), *IP); StringRef Fmt = Obj->getBytesInAddress() > 4 ? "\t\t%016" PRIx64 ": " : "\t\t\t%08" PRIx64 ": "; @@ -383,12 +408,9 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) { if (DisAsm->getInstruction(Inst, Size, Bytes.slice(Index), SectionAddr + Index, DebugOut, CommentStream)) { - outs() << format("%8" PRIx64 ":", SectionAddr + Index); - if (!NoShowRawInsn) { - outs() << "\t"; - dumpBytes(ArrayRef<uint8_t>(Bytes.data() + Index, Size), outs()); - } - IP->printInst(&Inst, outs(), "", *STI); + PIP.printInst(*IP, &Inst, !NoShowRawInsn, + Bytes.slice(Index, Size), + SectionAddr + Index, outs(), "", *STI); outs() << CommentStream.str(); Comments.clear(); outs() << "\n"; |