Skip to content

Commit

Permalink
[llvm-objdump] Dump inline relocations if the relocated section is sp…
Browse files Browse the repository at this point in the history
…ecified with --section

This fixes PR41886: llvm-objdump -d -r -j .text doesn't show inline relocations of .text

While here, switch to stable_sort() because we don't want to change the order of relocations applied to the same location. gABI says consecutive relocation records are composed together and their order matters. In practise it is difficult to see relocations applied to the same location not consecutive, we just have to keep the relative order of relocations with the same offset.

Reviewed By: grimar

Differential Revision: https://reviews.llvm.org/D62253

llvm-svn: 361395
  • Loading branch information
MaskRay authored and MrSidims committed May 24, 2019
1 parent 6f01fc5 commit f4cdd66
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 28 deletions.
13 changes: 2 additions & 11 deletions llvm/test/tools/llvm-objdump/X86/section-filter-relocs.test
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
## Test that --section works correctly for -d with -r.
## FIXME: Inline relocations are only printed if the relocation section itself is
## specified with --section. This test just characterizes the existing behavior.
## See https://bugs.llvm.org/show_bug.cgi?id=41886
# RUN: yaml2obj %s -o %t.o

## Show non-executable sections are not disassembled even if specified,
Expand All @@ -12,21 +9,15 @@
## executable sections if requested explicitly.
## See https://bugs.llvm.org/show_bug.cgi?id=41897.
# RUN: llvm-objdump -d -r %t.o --section=.text --section=.rodata \
# RUN: | FileCheck %s --check-prefix=DISASM --implicit-check-not=.text2 \
# RUN: --implicit-check-not=.rodata --implicit-check-not=R_X86_64

## Show that only the specified relocation sections that patch the
## disassembled sections are dumped.
# RUN: llvm-objdump -d -r %t.o --section=.text \
# RUN: --section=.rela.text --section=.rela.text2 \
# RUN: | FileCheck %s --check-prefixes=DISASM,RELOC --implicit-check-not=.text2 \
# RUN: --implicit-check-not=R_X86_64
# RUN: --implicit-check-not=.rodata

# DISASM: Disassembly of section .text:
# DISASM-EMPTY:
# DISASM-NEXT: 0000000000000400 .text:
# DISASM-NEXT: 400: e8 00 00 00 00 callq 0 <.text+0x5>
# RELOC-NEXT: 00000401: R_X86_64_PC32 foo+1
# RELOC-NEXT: 00000401: R_X86_64_GOT32 foo

--- !ELF
FileHeader:
Expand Down
34 changes: 17 additions & 17 deletions llvm/tools/llvm-objdump/llvm-objdump.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -334,18 +334,18 @@ static StringRef ToolName;

typedef std::vector<std::tuple<uint64_t, StringRef, uint8_t>> SectionSymbolsTy;

static bool shouldKeep(object::SectionRef S) {
if (FilterSections.empty())
return true;
StringRef String;
std::error_code error = S.getName(String);
if (error)
return false;
return is_contained(FilterSections, String);
}

SectionFilter ToolSectionFilter(object::ObjectFile const &O) {
return SectionFilter(
[](object::SectionRef const &S) {
if (FilterSections.empty())
return true;
StringRef String;
std::error_code error = S.getName(String);
if (error)
return false;
return is_contained(FilterSections, String);
},
O);
return SectionFilter([](object::SectionRef S) { return shouldKeep(S); }, O);
}

void error(std::error_code EC) {
Expand Down Expand Up @@ -922,15 +922,15 @@ static size_t countSkippableZeroBytes(ArrayRef<uint8_t> Buf) {
static std::map<SectionRef, std::vector<RelocationRef>>
getRelocsMap(object::ObjectFile const &Obj) {
std::map<SectionRef, std::vector<RelocationRef>> Ret;
for (const SectionRef &Section : ToolSectionFilter(Obj)) {
section_iterator RelSec = Section.getRelocatedSection();
if (RelSec == Obj.section_end())
for (SectionRef Sec : Obj.sections()) {
section_iterator Relocated = Sec.getRelocatedSection();
if (Relocated == Obj.section_end() || !shouldKeep(*Relocated))
continue;
std::vector<RelocationRef> &V = Ret[*RelSec];
for (const RelocationRef &R : Section.relocations())
std::vector<RelocationRef> &V = Ret[*Relocated];
for (const RelocationRef &R : Sec.relocations())
V.push_back(R);
// Sort relocations by address.
llvm::sort(V, isRelocAddressLess);
llvm::stable_sort(V, isRelocAddressLess);
}
return Ret;
}
Expand Down

0 comments on commit f4cdd66

Please sign in to comment.