Index: test/tools/llvm-objdump/X86/section-filter-relocs.test =================================================================== --- test/tools/llvm-objdump/X86/section-filter-relocs.test +++ test/tools/llvm-objdump/X86/section-filter-relocs.test @@ -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, @@ -12,21 +9,24 @@ ## 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 +# RUN: | FileCheck %s --check-prefixes=DISASM,RELOC --implicit-check-not=.text2 \ +# RUN: --implicit-check-not=.rodata ## 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: llvm-objdump -d %t.o --section=.text \ +# RUN: | FileCheck %s --check-prefixes=DISASM --implicit-check-not=.text2 \ # RUN: --implicit-check-not=R_X86_64 +# +# RUN: llvm-objdump -d -r %t.o --section=.text \ +# RUN: | FileCheck %s --check-prefixes=DISASM,RELOC --implicit-check-not=.text2 # 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: Index: tools/llvm-objdump/llvm-objdump.cpp =================================================================== --- tools/llvm-objdump/llvm-objdump.cpp +++ tools/llvm-objdump/llvm-objdump.cpp @@ -334,18 +334,18 @@ typedef std::vector> 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) { @@ -922,14 +922,13 @@ static std::map> getRelocsMap(object::ObjectFile const &Obj) { std::map> 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 &V = Ret[*RelSec]; - for (const RelocationRef &R : Section.relocations()) + std::vector &V = Ret[*Relocated]; + for (const RelocationRef &R : Sec.relocations()) V.push_back(R); - // Sort relocations by address. llvm::sort(V, isRelocAddressLess); } return Ret;