summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYuanfang Chen <yuanfang.chen@sony.com>2019-06-22 01:13:04 +0000
committerYuanfang Chen <yuanfang.chen@sony.com>2019-06-22 01:13:04 +0000
commit4a2a152490673f5e4513e63e4c1166daa463889a (patch)
treef1b6cd3b49924fbcd9598307c3210c03079a21c6
parentc900c46d77f8526243b04511082ca564b1d18781 (diff)
downloadbcm5719-llvm-4a2a152490673f5e4513e63e4c1166daa463889a.tar.gz
bcm5719-llvm-4a2a152490673f5e4513e63e4c1166daa463889a.zip
[llvm-objdump] Allow --disassemble-functions to take demangled names
The --disassemble-functions switch takes demangled names when --demangle is specified, otherwise the switch takes mangled names. https://bugs.llvm.org/show_bug.cgi?id=41908 Reviewers: jhenderson, grimar, MaskRay, rupprecht Differential Revision: https://reviews.llvm.org/D63524 llvm-svn: 364121
-rw-r--r--llvm/test/tools/llvm-objdump/X86/disassemble-functions-mangled-name.test27
-rw-r--r--llvm/test/tools/llvm-objdump/X86/disassemble-functions-mangling.test61
-rw-r--r--llvm/tools/llvm-objdump/llvm-objdump.cpp19
3 files changed, 71 insertions, 36 deletions
diff --git a/llvm/test/tools/llvm-objdump/X86/disassemble-functions-mangled-name.test b/llvm/test/tools/llvm-objdump/X86/disassemble-functions-mangled-name.test
deleted file mode 100644
index c3f243c6d3d..00000000000
--- a/llvm/test/tools/llvm-objdump/X86/disassemble-functions-mangled-name.test
+++ /dev/null
@@ -1,27 +0,0 @@
-## Show that the --disassemble-functions switch takes mangled names, not
-## demangled names.
-
-# RUN: yaml2obj %s -o %t.o
-# RUN: llvm-objdump -d --disassemble-functions=_Z3foov %t.o | FileCheck %s
-# RUN: llvm-objdump -d --disassemble-functions='foo()' %t.o | FileCheck %s --check-prefix=NOFOO
-# RUN: llvm-objdump -d -C --disassemble-functions='foo()' %t.o | FileCheck %s --check-prefix=NOFOO
-# RUN: llvm-objdump -d --disassemble-functions=foo %t.o | FileCheck %s --check-prefix=NOFOO
-
-# CHECK: _Z3foov:
-
-# NOFOO-NOT: foo
-
---- !ELF
-FileHeader:
- Class: ELFCLASS64
- Data: ELFDATA2LSB
- Type: ET_EXEC
- Machine: EM_X86_64
-Sections:
- - Name: .text
- Type: SHT_PROGBITS
- Flags: [SHF_ALLOC, SHF_EXECINSTR]
- Content: '90'
-Symbols:
- - Name: _Z3foov
- Section: .text
diff --git a/llvm/test/tools/llvm-objdump/X86/disassemble-functions-mangling.test b/llvm/test/tools/llvm-objdump/X86/disassemble-functions-mangling.test
new file mode 100644
index 00000000000..b4cdd0e6d01
--- /dev/null
+++ b/llvm/test/tools/llvm-objdump/X86/disassemble-functions-mangling.test
@@ -0,0 +1,61 @@
+## Show that the --disassemble-functions switch takes demangled names when
+## --demangle is specified, otherwise the switch takes mangled names.
+
+# RUN: yaml2obj %s -o %t.o
+
+## --disassemble-functions without --demangle.
+# RUN: llvm-objdump --disassemble-functions=_Z3foov %t.o | FileCheck %s --check-prefix=MANGLED
+# RUN: llvm-objdump --disassemble-functions='foo()' %t.o 2>&1 \
+# RUN: | FileCheck %s --check-prefix=MANGLED-MISS
+# RUN: llvm-objdump --disassemble-functions=foo %t.o 2>&1 \
+# RUN: | FileCheck %s --check-prefix=MANGLED-MISS
+# RUN: llvm-objdump --disassemble-functions='i,f' %t.o | FileCheck %s --check-prefix=NOMANGLE
+
+## --disassemble-functions with --demangle.
+# RUN: llvm-objdump -C --disassemble-functions='foo()' %t.o | FileCheck %s --check-prefix=DEMANGLED
+# RUN: llvm-objdump -C --disassemble-functions='_Z3foov' %t.o 2>&1 \
+# RUN: | FileCheck %s --check-prefix=DEMANGLED-MISS
+# RUN: llvm-objdump -C --disassemble-functions='i,f' %t.o | FileCheck %s --check-prefix=NOMANGLE
+# RUN: llvm-objdump -C --disassemble-functions='std::allocator<wchar_t>::allocator()' %t.o 2>&1 \
+# RUN: | FileCheck %s --check-prefix=DEMANGLED-MULTI
+
+# MANGLED: _Z3foov:
+# MANGLED-MISS: warning: failed to disassemble missing function foo
+
+# DEMANGLED: foo():
+# DEMANGLED-MISS: warning: failed to disassemble missing function _Z3foov
+
+# NOMANGLE: i:
+# NOMANGLE: f:
+
+# DEMANGLED-MULTI: std::allocator<wchar_t>::allocator():
+# DEMANGLED-MULTI: std::allocator<wchar_t>::allocator():
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [SHF_ALLOC, SHF_EXECINSTR]
+ Address: 0x1000
+ Content: 9090909090
+Symbols:
+ - Name: _Z3foov
+ Value: 0x1000
+ Section: .text
+ - Name: i
+ Value: 0x1001
+ Section: .text
+ - Name: f
+ Value: 0x1002
+ Section: .text
+ - Name: _ZNSaIwEC1Ev
+ Value: 0x1003
+ Section: .text
+ - Name: _ZNSaIwEC2Ev
+ Value: 0x1004
+ Section: .text
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp
index 23c25d59d5d..907e6ed696a 100644
--- a/llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -143,7 +143,9 @@ static cl::alias DisassembleAllShort("D",
static cl::list<std::string>
DisassembleFunctions("disassemble-functions", cl::CommaSeparated,
- cl::desc("List of functions to disassemble"),
+ cl::desc("List of functions to disassemble. "
+ "Accept demangled names when --demangle is "
+ "specified, otherwise accept mangled names"),
cl::cat(ObjdumpCat));
static cl::opt<bool> DisassembleZeroes(
@@ -1207,17 +1209,20 @@ static void disassembleObject(const Target *TheTarget, const ObjectFile *Obj,
std::vector<RelocationRef>::const_iterator RelEnd = Rels.end();
// Disassemble symbol by symbol.
for (unsigned SI = 0, SE = Symbols.size(); SI != SE; ++SI) {
+ std::string SymbolName = std::get<1>(Symbols[SI]).str();
+ if (Demangle)
+ SymbolName = demangle(SymbolName);
+
// Skip if --disassemble-functions is not empty and the symbol is not in
// the list.
- if (!DisasmFuncsSet.empty() &&
- !DisasmFuncsSet.count(std::get<1>(Symbols[SI])))
+ if (!DisasmFuncsSet.empty() && !DisasmFuncsSet.count(SymbolName))
continue;
uint64_t Start = std::get<0>(Symbols[SI]);
if (Start < SectionAddr || StopAddress <= Start)
continue;
else
- FoundDisasmFuncsSet.insert(std::get<1>(Symbols[SI]));
+ FoundDisasmFuncsSet.insert(SymbolName);
// The end is the section end, the beginning of the next symbol, or
// --stop-address.
@@ -1259,11 +1264,7 @@ static void disassembleObject(const Target *TheTarget, const ObjectFile *Obj,
outs() << format(Is64Bits ? "%016" PRIx64 " " : "%08" PRIx64 " ",
SectionAddr + Start + VMAAdjustment);
- StringRef SymbolName = std::get<1>(Symbols[SI]);
- if (Demangle)
- outs() << demangle(SymbolName) << ":\n";
- else
- outs() << SymbolName << ":\n";
+ outs() << SymbolName << ":\n";
// Don't print raw contents of a virtual section. A virtual section
// doesn't have any contents in the file.
OpenPOWER on IntegriCloud