summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeorge Rimar <grimar@accesssoftek.com>2018-12-19 10:21:45 +0000
committerGeorge Rimar <grimar@accesssoftek.com>2018-12-19 10:21:45 +0000
commit6622d41e2c469a326aa1f15314b35c87531a8617 (patch)
tree269de175824790939df0d209365f2c6978848822
parent751e6e1cf54bf8fcc07982b100dd774f43a6c5b5 (diff)
downloadbcm5719-llvm-6622d41e2c469a326aa1f15314b35c87531a8617.tar.gz
bcm5719-llvm-6622d41e2c469a326aa1f15314b35c87531a8617.zip
[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
-rw-r--r--llvm/test/tools/llvm-objdump/X86/demangle.s23
-rw-r--r--llvm/tools/llvm-objdump/llvm-objdump.cpp55
2 files changed, 51 insertions, 27 deletions
diff --git a/llvm/test/tools/llvm-objdump/X86/demangle.s b/llvm/test/tools/llvm-objdump/X86/demangle.s
new file mode 100644
index 00000000000..d7c7bfb4596
--- /dev/null
+++ b/llvm/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/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<ELFT> *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<ELFT> *Obj,
Expected<StringRef> 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';
}
}
OpenPOWER on IntegriCloud