From 6622d41e2c469a326aa1f15314b35c87531a8617 Mon Sep 17 00:00:00 2001 From: George Rimar Date: Wed, 19 Dec 2018 10:21:45 +0000 Subject: [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 llvm-svn: 349613 --- llvm/tools/llvm-objdump/llvm-objdump.cpp | 55 ++++++++++++++++---------------- 1 file changed, 28 insertions(+), 27 deletions(-) (limited to 'llvm/tools/llvm-objdump/llvm-objdump.cpp') diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index 9a405c6b466..cca0dbcd4ff 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/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'; } } -- cgit v1.2.3