The the MC disassembler C API to print in verbose mode. Perhaps there should be...
authorOwen Anderson <resistor@mac.com>
Thu, 15 Sep 2011 18:37:20 +0000 (18:37 +0000)
committerOwen Anderson <resistor@mac.com>
Thu, 15 Sep 2011 18:37:20 +0000 (18:37 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@139821 91177308-0d34-0410-b5e6-96231b3b80d8

lib/MC/MCDisassembler/Disassembler.cpp
lib/MC/MCDisassembler/Disassembler.h

index fd462f84c48ceba12460b17a8a9b99c952df41c1..858a58cf35e988da5ee358f403d2147330e10803 100644 (file)
@@ -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);
index 5a5abd28f0fee97356cbfccac5fcddcbfcacb1d9..238ff7d500252b4e8322de0138e96dc2bdf4c1b3 100644 (file)
@@ -20,6 +20,8 @@
 #include "llvm-c/Disassembler.h"
 #include <string>
 #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<llvm::MCInstPrinter> 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(); }
 };