From 9dee8e3009408fd08c656558397a8ac8604139ba Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Wed, 3 Feb 2010 18:18:30 +0000 Subject: [PATCH] llvm-mc: Add --show-inst option, for showing the MCInst inline with the assembly output. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@95227 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/MC/MCStreamer.h | 12 +++++++++- lib/MC/MCAsmStreamer.cpp | 46 +++++++++++++++++++++--------------- tools/llvm-mc/llvm-mc.cpp | 6 ++++- 3 files changed, 43 insertions(+), 21 deletions(-) diff --git a/include/llvm/MC/MCStreamer.h b/include/llvm/MC/MCStreamer.h index cfd457261ff..624d9a6c06b 100644 --- a/include/llvm/MC/MCStreamer.h +++ b/include/llvm/MC/MCStreamer.h @@ -269,11 +269,21 @@ namespace llvm { /// createAsmStreamer - Create a machine code streamer which will print out /// assembly for the native target, suitable for compiling with a native /// assembler. + /// + /// \param InstPrint - If given, the instruction printer to use. If not given + /// the MCInst representation will be printed. + /// + /// \param CE - If given, a code emitter to use to show the instruction + /// encoding inline with the assembly. + /// + /// \param ShowInst - Whether to show the MCInst representation inline with + /// the assembly. MCStreamer *createAsmStreamer(MCContext &Ctx, formatted_raw_ostream &OS, const MCAsmInfo &MAI, bool isLittleEndian, bool isVerboseAsm, MCInstPrinter *InstPrint = 0, - MCCodeEmitter *CE = 0); + MCCodeEmitter *CE = 0, + bool ShowInst = false); // FIXME: These two may end up getting rolled into a single // createObjectStreamer interface, which implements the assembler backend, and diff --git a/lib/MC/MCAsmStreamer.cpp b/lib/MC/MCAsmStreamer.cpp index 5c11db72e2f..417ad3095d0 100644 --- a/lib/MC/MCAsmStreamer.cpp +++ b/lib/MC/MCAsmStreamer.cpp @@ -29,20 +29,25 @@ namespace { class MCAsmStreamer : public MCStreamer { formatted_raw_ostream &OS; const MCAsmInfo &MAI; - bool IsLittleEndian, IsVerboseAsm; MCInstPrinter *InstPrinter; MCCodeEmitter *Emitter; SmallString<128> CommentToEmit; raw_svector_ostream CommentStream; + + unsigned IsLittleEndian : 1; + unsigned IsVerboseAsm : 1; + unsigned ShowInst : 1; + public: MCAsmStreamer(MCContext &Context, formatted_raw_ostream &os, const MCAsmInfo &mai, bool isLittleEndian, bool isVerboseAsm, MCInstPrinter *printer, - MCCodeEmitter *emitter) - : MCStreamer(Context), OS(os), MAI(mai), IsLittleEndian(isLittleEndian), - IsVerboseAsm(isVerboseAsm), InstPrinter(printer), Emitter(emitter), - CommentStream(CommentToEmit) {} + MCCodeEmitter *emitter, bool showInst) + : MCStreamer(Context), OS(os), MAI(mai), InstPrinter(printer), + Emitter(emitter), CommentStream(CommentToEmit), + IsLittleEndian(isLittleEndian), IsVerboseAsm(isVerboseAsm), + ShowInst(showInst) {} ~MCAsmStreamer() {} bool isLittleEndian() const { return IsLittleEndian; } @@ -527,13 +532,21 @@ void MCAsmStreamer::EmitDwarfFileDirective(unsigned FileNo, StringRef Filename){ void MCAsmStreamer::EmitInstruction(const MCInst &Inst) { assert(CurSection && "Cannot emit contents before setting section!"); + // Show the MCInst if enabled. + if (ShowInst) { + raw_ostream &OS = GetCommentOS(); + OS << "inst: "; + Inst.print(OS, &MAI); + OS << "\n"; + } + // Show the encoding in a comment if we have a code emitter. if (Emitter) { SmallString<256> Code; raw_svector_ostream VecOS(Code); Emitter->EncodeInstruction(Inst, VecOS); VecOS.flush(); - + raw_ostream &OS = GetCommentOS(); OS << "encoding: ["; for (unsigned i = 0, e = Code.size(); i != e; ++i) { @@ -543,29 +556,24 @@ void MCAsmStreamer::EmitInstruction(const MCInst &Inst) { } OS << "]\n"; } - - // If we have an AsmPrinter, use that to print. - if (InstPrinter) { - InstPrinter->printInst(&Inst); - EmitEOL(); - return; - } - // Otherwise fall back to a structural printing for now. Eventually we should - // always have access to the target specific printer. - Inst.print(OS, &MAI); + // If we have an AsmPrinter, use that to print, otherwise dump the MCInst. + if (InstPrinter) + InstPrinter->printInst(&Inst); + else + Inst.print(OS, &MAI); EmitEOL(); } void MCAsmStreamer::Finish() { OS.flush(); } - + MCStreamer *llvm::createAsmStreamer(MCContext &Context, formatted_raw_ostream &OS, const MCAsmInfo &MAI, bool isLittleEndian, bool isVerboseAsm, MCInstPrinter *IP, - MCCodeEmitter *CE) { + MCCodeEmitter *CE, bool ShowInst) { return new MCAsmStreamer(Context, OS, MAI, isLittleEndian, isVerboseAsm, - IP, CE); + IP, CE, ShowInst); } diff --git a/tools/llvm-mc/llvm-mc.cpp b/tools/llvm-mc/llvm-mc.cpp index 342ae99b537..c05bd522c52 100644 --- a/tools/llvm-mc/llvm-mc.cpp +++ b/tools/llvm-mc/llvm-mc.cpp @@ -46,6 +46,9 @@ OutputFilename("o", cl::desc("Output filename"), static cl::opt ShowEncoding("show-encoding", cl::desc("Show instruction encodings")); +static cl::opt +ShowInst("show-inst", cl::desc("Show internal instruction representation")); + static cl::opt OutputAsmVariant("output-asm-variant", cl::desc("Syntax variant to use for output printing")); @@ -266,7 +269,8 @@ static int AssembleInput(const char *ProgName) { CE.reset(TheTarget->createCodeEmitter(*TM)); Str.reset(createAsmStreamer(Ctx, *Out, *MAI, TM->getTargetData()->isLittleEndian(), - /*asmverbose*/true, IP.get(), CE.get())); + /*asmverbose*/true, IP.get(), CE.get(), + ShowInst)); } else { assert(FileType == OFT_ObjectFile && "Invalid file type!"); CE.reset(TheTarget->createCodeEmitter(*TM)); -- 2.34.1