From: Owen Anderson Date: Thu, 15 Sep 2011 18:37:20 +0000 (+0000) Subject: The the MC disassembler C API to print in verbose mode. Perhaps there should be... X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=8f29e6969eb99410b9914bcb5ee2d9a125f07f88;p=oota-llvm.git The the MC disassembler C API to print in verbose mode. Perhaps there should be a parameter to request verbose mode? git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@139821 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/MC/MCDisassembler/Disassembler.cpp b/lib/MC/MCDisassembler/Disassembler.cpp index fd462f84c48..858a58cf35e 100644 --- a/lib/MC/MCDisassembler/Disassembler.cpp +++ b/lib/MC/MCDisassembler/Disassembler.cpp @@ -81,6 +81,9 @@ LLVMDisasmContextRef LLVMCreateDisasm(const char *TripleName, void *DisInfo, TheTarget, MAI, MRI, Ctx, DisAsm, IP); assert(DC && "Allocation failure!"); + + IP->setCommentStream(DC->CommentStream); + return DC; } @@ -154,6 +157,25 @@ size_t LLVMDisasmInstruction(LLVMDisasmContextRef DCR, uint8_t *Bytes, IP->printInst(&Inst, OS); OS.flush(); + DC->CommentStream.flush(); + assert(DC->CommentsToEmit.back() == '\n'); + + DC->CommentsToEmit.push_back('\n'); + StringRef Comments = DC->CommentsToEmit.str(); + + do { + // Emit a line of comments. + size_t Position = Comments.find('\n'); + OS << ' ' << DC->getAsmInfo()->getCommentString() + << ' ' << Comments.substr(0, Position) << '\n'; + + Comments = Comments.substr(Position+1); + } while (!Comments.empty()); + + DC->CommentsToEmit.clear(); + // Tell the comment stream that the vector changed underneath it. + DC->CommentStream.resync(); + assert(OutStringSize != 0 && "Output buffer cannot be zero size"); size_t OutputSize = std::min(OutStringSize-1, InsnStr.size()); std::memcpy(OutString, InsnStr.data(), OutputSize); diff --git a/lib/MC/MCDisassembler/Disassembler.h b/lib/MC/MCDisassembler/Disassembler.h index 5a5abd28f0f..238ff7d5002 100644 --- a/lib/MC/MCDisassembler/Disassembler.h +++ b/lib/MC/MCDisassembler/Disassembler.h @@ -20,6 +20,8 @@ #include "llvm-c/Disassembler.h" #include #include "llvm/ADT/OwningPtr.h" +#include "llvm/ADT/SmallString.h" +#include "llvm/Support/raw_ostream.h" namespace llvm { class MCContext; @@ -67,6 +69,10 @@ private: llvm::OwningPtr IP; public: + // Comment stream and backing vector. + SmallString<128> CommentsToEmit; + raw_svector_ostream CommentStream; + LLVMDisasmContext(std::string tripleName, void *disInfo, int tagType, LLVMOpInfoCallback getOpInfo, LLVMSymbolLookupCallback symbolLookUp, @@ -75,7 +81,8 @@ public: llvm::MCContext *ctx, const MCDisassembler *disAsm, MCInstPrinter *iP) : TripleName(tripleName), DisInfo(disInfo), TagType(tagType), GetOpInfo(getOpInfo), - SymbolLookUp(symbolLookUp), TheTarget(theTarget) { + SymbolLookUp(symbolLookUp), TheTarget(theTarget), + CommentStream(CommentsToEmit) { MAI.reset(mAI); MRI.reset(mRI); Ctx.reset(ctx); @@ -83,6 +90,7 @@ public: IP.reset(iP); } const MCDisassembler *getDisAsm() const { return DisAsm.get(); } + const MCAsmInfo *getAsmInfo() const { return MAI.get(); } MCInstPrinter *getIP() { return IP.get(); } };