For disassembly when adding a symbolic operand that is a C++
authorKevin Enderby <enderby@apple.com>
Fri, 3 Jan 2014 19:33:09 +0000 (19:33 +0000)
committerKevin Enderby <enderby@apple.com>
Fri, 3 Jan 2014 19:33:09 +0000 (19:33 +0000)
symbol name, also put the human readable name in a comment.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@198441 91177308-0d34-0410-b5e6-96231b3b80d8

lib/MC/MCDisassembler/Disassembler.cpp
lib/MC/MCExternalSymbolizer.cpp

index a0066c8885c55b677df66d265d0a8e0de72f3d18..b0b8138e7119428baad4b3cdebebc08314e71492 100644 (file)
@@ -298,6 +298,7 @@ size_t LLVMDisasmInstruction(LLVMDisasmContextRef DCR, uint8_t *Bytes,
       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());
index ca368b27e1958426f5f7db23f632d1fda1bcfaf7..dae3f522a4fbac8ed57caf3323477dd8c9cbf2b4 100644 (file)
@@ -13,6 +13,7 @@
 #include "llvm/MC/MCInst.h"
 #include "llvm/Support/raw_ostream.h"
 #include <cstring>
+#include <cxxabi.h>
 
 using namespace llvm;
 
@@ -56,6 +57,14 @@ bool MCExternalSymbolizer::tryAddingSymbolicOperand(MCInst &MI,
     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 (strncmp(Name, "__Z", 3) == 0) {
+        char *demangled = abi::__cxa_demangle(Name + 1, 0, 0, 0);
+       if (demangled) {
+          cStream << demangled;
+          free(demangled);
+        }
+      }
     }
     // For branches always create an MCExpr so it gets printed as hex address.
     else if (IsBranch) {