[llvm] r198637 - For the 'C' disassembler API, add a new ReferenceType for the

Kevin Enderby enderby at apple.com
Mon Jan 6 14:08:08 PST 2014


Author: enderby
Date: Mon Jan  6 16:08:08 2014
New Revision: 198637

URL: http://llvm.org/viewvc/llvm-project?rev=198637&view=rev
Log:
For the 'C' disassembler API, add a new ReferenceType for the
SymbolLookUp() call back to return a demangled C++ name to
be used as a comment.

For example darwin's otool(1) program the uses the llvm
disassembler now can produce disassembly like:

callq   __ZNK4llvm6Target20createMCDisassemblerERKNS_15MCSubtargetInfoE ## llvm::Target::createMCDisassembler(llvm::MCSubtargetInfo const&) const

Also fix a bug in LLVMDisasmInstruction() that was not flushing
the raw_svector_ostream for the disassembled instruction string
before copying it to the output buffer that was causing truncation
of the output.

rdar://10173828

Modified:
    llvm/trunk/include/llvm-c/Disassembler.h
    llvm/trunk/lib/MC/MCDisassembler/Disassembler.cpp
    llvm/trunk/lib/MC/MCExternalSymbolizer.cpp

Modified: llvm/trunk/include/llvm-c/Disassembler.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm-c/Disassembler.h?rev=198637&r1=198636&r2=198637&view=diff
==============================================================================
--- llvm/trunk/include/llvm-c/Disassembler.h (original)
+++ llvm/trunk/include/llvm-c/Disassembler.h Mon Jan  6 16:08:08 2014
@@ -141,6 +141,9 @@ typedef const char *(*LLVMSymbolLookupCa
 /* The output reference is to a Objective-C class ref. */
 #define LLVMDisassembler_ReferenceType_Out_Objc_Class_Ref 8
 
+/* The output reference is to a C++ symbol name. */
+#define LLVMDisassembler_ReferenceType_DeMangled_Name 9
+
 #ifdef __cplusplus
 extern "C" {
 #endif /* !defined(__cplusplus) */

Modified: llvm/trunk/lib/MC/MCDisassembler/Disassembler.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCDisassembler/Disassembler.cpp?rev=198637&r1=198636&r2=198637&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCDisassembler/Disassembler.cpp (original)
+++ llvm/trunk/lib/MC/MCDisassembler/Disassembler.cpp Mon Jan  6 16:08:08 2014
@@ -298,6 +298,7 @@ size_t LLVMDisasmInstruction(LLVMDisasmC
       emitLatency(DC, Inst);
 
     emitComments(DC, FormattedOS);
+    OS.flush();
 
     assert(OutStringSize != 0 && "Output buffer cannot be zero size");
     size_t OutputSize = std::min(OutStringSize-1, InsnStr.size());

Modified: llvm/trunk/lib/MC/MCExternalSymbolizer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCExternalSymbolizer.cpp?rev=198637&r1=198636&r2=198637&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCExternalSymbolizer.cpp (original)
+++ llvm/trunk/lib/MC/MCExternalSymbolizer.cpp Mon Jan  6 16:08:08 2014
@@ -56,6 +56,9 @@ bool MCExternalSymbolizer::tryAddingSymb
     if (Name) {
       SymbolicOp.AddSymbol.Name = Name;
       SymbolicOp.AddSymbol.Present = true;
+      // If Name is a C++ symbol name put the human readable name in a comment.
+      if(ReferenceType == LLVMDisassembler_ReferenceType_DeMangled_Name)
+        cStream << ReferenceName;
     }
     // For branches always create an MCExpr so it gets printed as hex address.
     else if (IsBranch) {





More information about the llvm-commits mailing list