From: Yuanfang Chen Date: Sat, 22 Jun 2019 01:13:04 +0000 (+0000) Subject: [llvm-objdump] Allow --disassemble-functions to take demangled names X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=71bf034cf85b7bc66498d2a437b99d220a1ce5dd;p=llvm [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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@364121 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/test/tools/llvm-objdump/X86/disassemble-functions-mangled-name.test b/test/tools/llvm-objdump/X86/disassemble-functions-mangled-name.test deleted file mode 100644 index c3f243c6d3d..00000000000 --- a/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/test/tools/llvm-objdump/X86/disassemble-functions-mangling.test b/test/tools/llvm-objdump/X86/disassemble-functions-mangling.test new file mode 100644 index 00000000000..b4cdd0e6d01 --- /dev/null +++ b/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::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::allocator(): +# DEMANGLED-MULTI: std::allocator::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/tools/llvm-objdump/llvm-objdump.cpp b/tools/llvm-objdump/llvm-objdump.cpp index 23c25d59d5d..907e6ed696a 100644 --- a/tools/llvm-objdump/llvm-objdump.cpp +++ b/tools/llvm-objdump/llvm-objdump.cpp @@ -143,7 +143,9 @@ static cl::alias DisassembleAllShort("D", static cl::list 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 DisassembleZeroes( @@ -1207,17 +1209,20 @@ static void disassembleObject(const Target *TheTarget, const ObjectFile *Obj, std::vector::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.