From: Colin LeMahieu Date: Thu, 28 May 2015 19:07:14 +0000 (+0000) Subject: [Objdump] Allow instruction pretty printing to be specialized by the target triple. X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=cada158dc3d9dfd11725e5e29fd01ea73ae59b2f;p=oota-llvm.git [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 --- 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 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(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";