From 17380c7afa9db7dc5209d0eeb2dfd5e1a8cd0c06 Mon Sep 17 00:00:00 2001 From: Kevin Enderby Date: Tue, 28 Oct 2014 23:39:46 +0000 Subject: [PATCH] =?utf8?q?Update=20llvm-objdump=E2=80=99s=20Mach-O=20symbo?= =?utf8?q?lizer=20code=20to=20demangle=20C++=20names.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@220833 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../X86/Inputs/hello_cpp.exe.macho-x86_64 | Bin 0 -> 15100 bytes .../X86/macho-symbolized-disassembly.test | 3 ++ tools/llvm-objdump/MachODump.cpp | 47 +++++++++++++++--- 3 files changed, 44 insertions(+), 6 deletions(-) create mode 100755 test/tools/llvm-objdump/X86/Inputs/hello_cpp.exe.macho-x86_64 diff --git a/test/tools/llvm-objdump/X86/Inputs/hello_cpp.exe.macho-x86_64 b/test/tools/llvm-objdump/X86/Inputs/hello_cpp.exe.macho-x86_64 new file mode 100755 index 0000000000000000000000000000000000000000..6b54b15c0c5d15df2abcfb5c0a33694f2886dfb6 GIT binary patch literal 15100 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 Iyp<~Tzx!vhzW@LL literal 0 HcmV?d00001 diff --git a/test/tools/llvm-objdump/X86/macho-symbolized-disassembly.test b/test/tools/llvm-objdump/X86/macho-symbolized-disassembly.test index c8322bc7df6..e33d3b56073 100644 --- a/test/tools/llvm-objdump/X86/macho-symbolized-disassembly.test +++ b/test/tools/llvm-objdump/X86/macho-symbolized-disassembly.test @@ -2,6 +2,7 @@ // RUN: llvm-objdump -d -m -no-show-raw-insn -full-leading-addr -print-imm-hex %p/Inputs/hello.exe.macho-x86_64 | FileCheck %s -check-prefix=EXE // RUN: llvm-objdump -d -m -no-show-raw-insn -full-leading-addr -print-imm-hex %p/Inputs/ObjC.obj.macho-x86_64 | FileCheck %s -check-prefix=ObjC-OBJ // RUN: llvm-objdump -d -m -no-show-raw-insn -full-leading-addr -print-imm-hex %p/Inputs/ObjC.exe.macho-x86_64 | FileCheck %s -check-prefix=ObjC-EXE +// RUN: llvm-objdump -d -m -no-show-raw-insn -full-leading-addr -print-imm-hex %p/Inputs/hello_cpp.exe.macho-x86_64 | FileCheck %s -check-prefix=CXX-EXE OBJ: 0000000000000008 leaq L_.str(%rip), %rax ## literal pool for: "Hello world\n" OBJ: 0000000000000026 callq _printf @@ -23,3 +24,5 @@ ObjC-EXE: 0000000100000f14 movq 0x125(%rip), %rax ## Objc class ref: _OBJC ObjC-EXE: 0000000100000f1b movq 0x10e(%rip), %rsi ## Objc selector ref: date ObjC-EXE: 0000000100000f25 callq 0x100000f4a ## Objc message: +[NSDate date] ObjC-EXE: 0000000100000f33 callq 0x100000f44 ## symbol stub for: _NSLog + +CXX-EXE: 00000001000014cb callq __ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4_ ## std::__1::ostreambuf_iterator > std::__1::__pad_and_output >(std::__1::ostreambuf_iterator >, char const*, char const*, char const*, std::__1::ios_base&, char) diff --git a/tools/llvm-objdump/MachODump.cpp b/tools/llvm-objdump/MachODump.cpp index 9c3dfec92e4..7d7eb80569c 100644 --- a/tools/llvm-objdump/MachODump.cpp +++ b/tools/llvm-objdump/MachODump.cpp @@ -16,6 +16,7 @@ #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/Triple.h" +#include "llvm/Config/config.h" #include "llvm/DebugInfo/DIContext.h" #include "llvm/MC/MCAsmInfo.h" #include "llvm/MC/MCContext.h" @@ -43,6 +44,11 @@ #include #include #include + +#if HAVE_CXXABI_H +#include +#endif + using namespace llvm; using namespace object; @@ -249,6 +255,7 @@ struct DisassembleInfo { const char *class_name; const char *selector_name; char *method; + char *demangled_name; BindTable *bindtable; }; @@ -1045,9 +1052,11 @@ const char *GuessLiteralPointer(uint64_t ReferenceValue, uint64_t ReferencePC, // Out type and the ReferenceName will also be set which is added as a comment // to the disassembled instruction. // -// TODO: If the symbol name is a C++ mangled name then the demangled name is +#if HAVE_CXXABI_H +// If the symbol name is a C++ mangled name then the demangled name is // returned through ReferenceName and ReferenceType is set to // LLVMDisassembler_ReferenceType_DeMangled_Name . +#endif // // When this is called to get a symbol name for a branch target then the // ReferenceType will be LLVMDisassembler_ReferenceType_In_Branch and then @@ -1083,13 +1092,25 @@ const char *SymbolizerSymbolLookUp(void *DisInfo, uint64_t ReferenceValue, if (*ReferenceType == LLVMDisassembler_ReferenceType_In_Branch) { *ReferenceName = GuessIndirectSymbol(ReferenceValue, info); - if (*ReferenceName) { + if (*ReferenceName != nullptr) { method_reference(info, ReferenceType, ReferenceName); if (*ReferenceType != LLVMDisassembler_ReferenceType_Out_Objc_Message) *ReferenceType = LLVMDisassembler_ReferenceType_Out_SymbolStub; } else - // TODO: if SymbolName is not nullptr see if it is a C++ name - // and demangle it. +#if HAVE_CXXABI_H + if (SymbolName != nullptr && strncmp(SymbolName, "__Z", 3) == 0) { + if (info->demangled_name != nullptr) + free(info->demangled_name); + int status; + info->demangled_name = abi::__cxa_demangle(SymbolName + 1, nullptr, + nullptr, &status); + if (info->demangled_name != nullptr) { + *ReferenceName = info->demangled_name; + *ReferenceType = LLVMDisassembler_ReferenceType_DeMangled_Name; + } else + *ReferenceType = LLVMDisassembler_ReferenceType_InOut_None; + } else +#endif *ReferenceType = LLVMDisassembler_ReferenceType_InOut_None; } else if (*ReferenceType == LLVMDisassembler_ReferenceType_In_PCrel_Load) { *ReferenceName = @@ -1099,8 +1120,19 @@ const char *SymbolizerSymbolLookUp(void *DisInfo, uint64_t ReferenceValue, else *ReferenceType = LLVMDisassembler_ReferenceType_InOut_None; } - // TODO: if SymbolName is not nullptr see if it is a C++ name - // and demangle it. +#if HAVE_CXXABI_H + else if (SymbolName != nullptr && strncmp(SymbolName, "__Z", 3) == 0) { + if (info->demangled_name != nullptr) + free(info->demangled_name); + int status; + info->demangled_name = abi::__cxa_demangle(SymbolName + 1, nullptr, nullptr, + &status); + if (info->demangled_name != nullptr) { + *ReferenceName = info->demangled_name; + *ReferenceType = LLVMDisassembler_ReferenceType_DeMangled_Name; + } + } +#endif else { *ReferenceName = nullptr; *ReferenceType = LLVMDisassembler_ReferenceType_InOut_None; @@ -1392,6 +1424,7 @@ static void DisassembleInputMachO2(StringRef Filename, SymbolizerInfo.class_name = nullptr; SymbolizerInfo.selector_name = nullptr; SymbolizerInfo.method = nullptr; + SymbolizerInfo.demangled_name = nullptr; SymbolizerInfo.bindtable = nullptr; // Disassemble symbol by symbol. @@ -1569,6 +1602,8 @@ static void DisassembleInputMachO2(StringRef Filename, } if (SymbolizerInfo.method != nullptr) free(SymbolizerInfo.method); + if (SymbolizerInfo.demangled_name != nullptr) + free(SymbolizerInfo.demangled_name); if (SymbolizerInfo.bindtable != nullptr) delete SymbolizerInfo.bindtable; } -- 2.34.1