mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-01 07:30:33 +00:00
[llvm-objdump] Support disassembling by symbol name
Summary: Add a new option -df to llvm-objdump that takes function names as arguments and instructs the disassembler to only dump those function contents. Based on code originally written by Bill Nell. Reviewers: espindola, JDevlieghere Differential Revision: https://reviews.llvm.org/D44224 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@327164 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
68d73644cd
commit
67fe7958c8
20
test/tools/llvm-objdump/X86/disasm-specific-funcs.test
Normal file
20
test/tools/llvm-objdump/X86/disasm-specific-funcs.test
Normal file
@ -0,0 +1,20 @@
|
||||
// RUN: yaml2obj -o %t.out %p/Inputs/simple-executable-x86_64.yaml
|
||||
// RUN: llvm-objdump -d %t.out -df=main | FileCheck %s
|
||||
|
||||
// CHECK: Disassembly of section .anothertext:
|
||||
// CHECK-NEXT: main:
|
||||
// CHECK-NEXT: 10: 55 pushq %rbp
|
||||
// CHECK-NEXT: 11: 48 89 e5 movq %rsp, %rbp
|
||||
// CHECK-NEXT: 14: 48 83 ec 20 subq $32, %rsp
|
||||
// CHECK-NEXT: 18: 48 8d 04 25 a8 00 00 00 leaq 168, %rax
|
||||
// CHECK-NEXT: 20: c7 45 fc 00 00 00 00 movl $0, -4(%rbp)
|
||||
// CHECK-NEXT: 27: 48 89 45 f0 movq %rax, -16(%rbp)
|
||||
// CHECK-NEXT: 2b: 48 8b 45 f0 movq -16(%rbp), %rax
|
||||
// CHECK-NEXT: 2f: 8b 08 movl (%rax), %ecx
|
||||
// CHECK-NEXT: 31: 89 4d ec movl %ecx, -20(%rbp)
|
||||
// CHECK-NEXT: 34: e8 c7 ff ff ff callq -57
|
||||
// CHECK-NEXT: 39: 8b 4d ec movl -20(%rbp), %ecx
|
||||
// CHECK-NEXT: 3c: 01 c1 addl %eax, %ecx
|
||||
// CHECK-NEXT: 3e: 89 c8 movl %ecx, %eax
|
||||
// CHECK-NEXT: 40: 48 83 c4 20 addq $32, %rsp
|
||||
// CHECK-NEXT: 44: 5d popq %rbp
|
@ -20,6 +20,7 @@
|
||||
#include "llvm/ADT/Optional.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/ADT/StringExtras.h"
|
||||
#include "llvm/ADT/StringSet.h"
|
||||
#include "llvm/ADT/Triple.h"
|
||||
#include "llvm/CodeGen/FaultMaps.h"
|
||||
#include "llvm/DebugInfo/DWARF/DWARFContext.h"
|
||||
@ -85,6 +86,12 @@ static cl::alias
|
||||
DisassembleAlld("D", cl::desc("Alias for --disassemble-all"),
|
||||
cl::aliasopt(DisassembleAll));
|
||||
|
||||
static cl::list<std::string>
|
||||
DisassembleFunctions("df",
|
||||
cl::CommaSeparated,
|
||||
cl::desc("List of functions to disassemble"));
|
||||
static StringSet<> DisasmFuncsSet;
|
||||
|
||||
cl::opt<bool>
|
||||
llvm::Relocations("r", cl::desc("Display the relocation entries in the file"));
|
||||
|
||||
@ -1388,23 +1395,15 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) {
|
||||
DataRefImpl DR = Section.getRawDataRefImpl();
|
||||
SegmentName = MachO->getSectionFinalSegmentName(DR);
|
||||
}
|
||||
StringRef name;
|
||||
error(Section.getName(name));
|
||||
|
||||
if ((SectionAddr <= StopAddress) &&
|
||||
(SectionAddr + SectSize) >= StartAddress) {
|
||||
outs() << "Disassembly of section ";
|
||||
if (!SegmentName.empty())
|
||||
outs() << SegmentName << ",";
|
||||
outs() << name << ':';
|
||||
}
|
||||
StringRef SectionName;
|
||||
error(Section.getName(SectionName));
|
||||
|
||||
// If the section has no symbol at the start, just insert a dummy one.
|
||||
if (Symbols.empty() || std::get<0>(Symbols[0]) != 0) {
|
||||
Symbols.insert(Symbols.begin(),
|
||||
std::make_tuple(SectionAddr, name, Section.isText()
|
||||
? ELF::STT_FUNC
|
||||
: ELF::STT_OBJECT));
|
||||
Symbols.insert(
|
||||
Symbols.begin(),
|
||||
std::make_tuple(SectionAddr, SectionName,
|
||||
Section.isText() ? ELF::STT_FUNC : ELF::STT_OBJECT));
|
||||
}
|
||||
|
||||
SmallString<40> Comments;
|
||||
@ -1417,6 +1416,7 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) {
|
||||
|
||||
uint64_t Size;
|
||||
uint64_t Index;
|
||||
bool PrintedSection = false;
|
||||
|
||||
std::vector<RelocationRef>::const_iterator rel_cur = Rels.begin();
|
||||
std::vector<RelocationRef>::const_iterator rel_end = Rels.end();
|
||||
@ -1441,6 +1441,19 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/// Skip if user requested specific symbols and this is not in the list
|
||||
if (!DisasmFuncsSet.empty() &&
|
||||
!DisasmFuncsSet.count(std::get<1>(Symbols[si])))
|
||||
continue;
|
||||
|
||||
if (!PrintedSection) {
|
||||
PrintedSection = true;
|
||||
outs() << "Disassembly of section ";
|
||||
if (!SegmentName.empty())
|
||||
outs() << SegmentName << ",";
|
||||
outs() << SectionName << ':';
|
||||
}
|
||||
|
||||
// Stop disassembly at the stop address specified
|
||||
if (End + SectionAddr > StopAddress)
|
||||
End = StopAddress - SectionAddr;
|
||||
@ -2203,6 +2216,9 @@ int main(int argc, char **argv) {
|
||||
return 2;
|
||||
}
|
||||
|
||||
DisasmFuncsSet.insert(DisassembleFunctions.begin(),
|
||||
DisassembleFunctions.end());
|
||||
|
||||
llvm::for_each(InputFilenames, DumpInput);
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
|
Loading…
Reference in New Issue
Block a user