]> granicus.if.org Git - llvm/commitdiff
[llvm-objdump] Dump inline relocations if the relocated section is specified with...
authorFangrui Song <maskray@google.com>
Wed, 22 May 2019 15:12:51 +0000 (15:12 +0000)
committerFangrui Song <maskray@google.com>
Wed, 22 May 2019 15:12:51 +0000 (15:12 +0000)
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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@361395 91177308-0d34-0410-b5e6-96231b3b80d8

test/tools/llvm-objdump/X86/section-filter-relocs.test
tools/llvm-objdump/llvm-objdump.cpp

index f36627e4c9a323ccc2d505a0968f214def92fc0d..5411288019d9d9c5ddf431c8d69a8324780d1044 100644 (file)
@@ -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,
 ##        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:
index c16b0c167005dbc81ec643aa6f23515cbd32c6b9..318e0ade9425c42894d0579093351b128e5c83ea 100644 (file)
@@ -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) {
@@ -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;
 }