From: George Rimar Date: Wed, 19 Dec 2018 10:21:45 +0000 (+0000) Subject: [llvm-objdump] - Demangle the symbols when printing symbol table and relocations. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=92b052b484476ac74964c5d90bd18c8644df827b;p=llvm [llvm-objdump] - Demangle the symbols when printing symbol table and relocations. This is https://bugs.llvm.org/show_bug.cgi?id=40009, llvm-objdump does not demangle the symbols when prints symbol table and/or relocations. Patch teaches it to do that. Differential revision: https://reviews.llvm.org/D55821 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@349613 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/test/tools/llvm-objdump/X86/demangle.s b/test/tools/llvm-objdump/X86/demangle.s new file mode 100644 index 00000000000..d7c7bfb4596 --- /dev/null +++ b/test/tools/llvm-objdump/X86/demangle.s @@ -0,0 +1,23 @@ +# RUN: llvm-mc %s -filetype=obj -triple=x86_64-pc-linux -o %t +# RUN: llvm-objdump -syms -reloc -demangle %t | FileCheck %s + +## Check we demangle symbols when printing relocations. +# CHECK: 000000000000001 R_X86_64_PLT32 foo()-4 + +## Check we demangle symbols when printing symbol table. +# CHECK: SYMBOL TABLE: +# CHECK-NEXT: 0000000000000000 *UND* 00000000 +# CHECK-NEXT: 0000000000000000 g F .text 00000000 foo() + +## Check the case when relocations are inlined into disassembly. +# RUN: llvm-objdump -d -r -demangle %t | FileCheck %s --check-prefix=INLINE +# INLINE: Disassembly of section .text: +# INLINE-NEXT: foo(): +# INLINE-NEXT: 0: {{.*}} callq 0 <_Z3foov+0x5> +# INLINE-NEXT: 0000000000000001: R_X86_64_PLT32 foo()-4 + +.text +.globl _Z3foov +.type _Z3foov,@function +_Z3foov: + callq _Z3foov@PLT diff --git a/tools/llvm-objdump/llvm-objdump.cpp b/tools/llvm-objdump/llvm-objdump.cpp index 9a405c6b466..cca0dbcd4ff 100644 --- a/tools/llvm-objdump/llvm-objdump.cpp +++ b/tools/llvm-objdump/llvm-objdump.cpp @@ -504,7 +504,7 @@ static std::error_code getRelocationValueString(const ELFObjectFile *Obj, break; } } - StringRef Target; + std::string Target; if (!undef) { symbol_iterator SI = RelRef.getSymbol(); const Elf_Sym *symb = Obj->getSymbol(SI->getRawDataRefImpl()); @@ -521,7 +521,7 @@ static std::error_code getRelocationValueString(const ELFObjectFile *Obj, Expected SymName = symb->getName(StrTab); if (!SymName) return errorToErrorCode(SymName.takeError()); - Target = *SymName; + Target = Demangle ? demangle(*SymName) : *SymName; } } else Target = "*ABS*"; @@ -1280,6 +1280,22 @@ static void addPltEntries(const ObjectFile *Obj, } } +static std::string demangle(StringRef Name) { + char *Demangled = nullptr; + size_t Size = 0; + if (Name.startswith("_Z")) + Demangled = itaniumDemangle(Name.data(), Demangled, &Size, nullptr); + else if (Name.startswith("?")) + Demangled = microsoftDemangle(Name.data(), Demangled, &Size, nullptr); + + if (!Demangled) + return Name; + + std::string Ret = Demangled; + free(Demangled); + return Ret; +} + static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) { if (StartAddress > StopAddress) error("Start address should be less than stop address"); @@ -1573,30 +1589,12 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) { } } - auto PrintSymbol = [](StringRef Name) { - outs() << '\n' << Name << ":\n"; - }; + outs() << '\n'; StringRef SymbolName = std::get<1>(Symbols[si]); - if (Demangle) { - char *DemangledSymbol = nullptr; - size_t Size = 0; - int Status = -1; - if (SymbolName.startswith("_Z")) - DemangledSymbol = itaniumDemangle(SymbolName.data(), DemangledSymbol, - &Size, &Status); - else if (SymbolName.startswith("?")) - DemangledSymbol = microsoftDemangle(SymbolName.data(), - DemangledSymbol, &Size, &Status); - - if (Status == 0 && DemangledSymbol) - PrintSymbol(StringRef(DemangledSymbol)); - else - PrintSymbol(SymbolName); - - if (DemangledSymbol) - free(DemangledSymbol); - } else - PrintSymbol(SymbolName); + if (Demangle) + outs() << demangle(SymbolName) << ":\n"; + else + outs() << SymbolName << ":\n"; // Don't print raw contents of a virtual section. A virtual section // doesn't have any contents in the file. @@ -2061,8 +2059,11 @@ void llvm::PrintSymbolTable(const ObjectFile *o, StringRef ArchiveName, if (Hidden) { outs() << ".hidden "; } - outs() << Name - << '\n'; + + if (Demangle) + outs() << demangle(Name) << '\n'; + else + outs() << Name << '\n'; } }