]> granicus.if.org Git - llvm/commitdiff
Revert r374931 "[llvm-objdump] Use a counter for llvm-objdump -h instead of the secti...
authorHans Wennborg <hans@hanshq.net>
Thu, 17 Oct 2019 08:52:29 +0000 (08:52 +0000)
committerHans Wennborg <hans@hanshq.net>
Thu, 17 Oct 2019 08:52:29 +0000 (08:52 +0000)
This broke llvm-objdump in 32-bit builds, see e.g.
http://lab.llvm.org:8011/builders/clang-cmake-armv7-quick/builds/10925

> Summary:
> When listing the index in `llvm-objdump -h`, use a zero-based counter instead of the actual section index (e.g. shdr->sh_index for ELF).
>
> While this is effectively a noop for now (except one unit test for XCOFF), the index values will change in a future patch that filters certain sections out (e.g. symbol tables). See D68669 for more context. Note: the test case in `test/tools/llvm-objdump/X86/section-index.s` already covers the case of incrementing the section index counter when sections are skipped.
>
> Reviewers: grimar, jhenderson, espindola
>
> Reviewed By: grimar
>
> Subscribers: emaste, sbc100, arichardson, aheejin, arphaman, seiya, llvm-commits, MaskRay
>
> Tags: #llvm
>
> Differential Revision: https://reviews.llvm.org/D68848

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

test/tools/llvm-objdump/xcoff-section-headers.test
tools/llvm-objdump/llvm-objdump.cpp
tools/llvm-objdump/llvm-objdump.h

index 95d6f5baa3da42e0f5c48214f759d51f71d07f7b..b5b5fe5a815c280da232544ba0fedb34ba693c0c 100644 (file)
 # CHECK: xcoff-section-headers.o:      file format aixcoff-rs6000
 # CHECK: Sections:
 # CHECK: Idx Name          Size     VMA      Type
-# CHECK:   0 .text         00000080 00000000 TEXT
-# CHECK:   1 .data         00000024 00000080 DATA
-# CHECK:   2 .bss          00000004 000000a4 BSS
-# CHECK:   3 .tdata        00000008 00000000 DATA
-# CHECK:   4 .tbss         00000004 00000008 BSS
+# CHECK:   1 .text         00000080 00000000 TEXT
+# CHECK:   2 .data         00000024 00000080 DATA
+# CHECK:   3 .bss          00000004 000000a4 BSS
+# CHECK:   4 .tdata        00000008 00000000 DATA
+# CHECK:   5 .tbss         00000004 00000008 BSS
 
 # xcoff-section-headers.o Compiled with IBM XL C/C++ for AIX, V16.1.0
 # test.c:
 
 # LONG: xcoff-long-sec-names.o:      file format aixcoff-rs6000
 # LONG: Sections:
-# LONG: Idx Name          Size     VMA      Type
-# LONG:   0 .dwarnge      00000004 00000000
-# LONG:   1 .dwpbnms      00000004 00000000
-# LONG:   2 .dwpbtyp      00000004 00000000
+# LONG: Idx Name        Size     VMA      Type
+# LONG: 1 .dwarnge      00000004 00000000
+# LONG: 2 .dwpbnms      00000004 00000000
+# LONG: 3 .dwpbtyp      00000004 00000000
 
 # xcoff-long-sec-names.o was generated by assembling the following .s file:
 #  .dwsect 0x30000 # .dwpbnms section
index 6377d3b8d854dc898890a6181441c96b2216ad78..83344e794d83dc4ec7ce5b9361582e84b5d01852 100644 (file)
@@ -342,27 +342,14 @@ static StringRef ToolName;
 
 typedef std::vector<std::tuple<uint64_t, StringRef, uint8_t>> SectionSymbolsTy;
 
-namespace {
-struct FilterResult {
-  // True if the section should not be skipped.
-  bool Keep;
-
-  // True if the index counter should be incremented, even if the section should
-  // be skipped. For example, sections may be skipped if they are not included
-  // in the --section flag, but we still want those to count toward the section
-  // count.
-  bool IncrementIndex;
-};
-} // namespace
-
-static FilterResult checkSectionFilter(object::SectionRef S) {
+static bool shouldKeep(object::SectionRef S) {
   if (FilterSections.empty())
-    return {/*Keep=*/true, /*IncrementIndex=*/true};
+    return true;
 
   Expected<StringRef> SecNameOrErr = S.getName();
   if (!SecNameOrErr) {
     consumeError(SecNameOrErr.takeError());
-    return {/*Keep=*/false, /*IncrementIndex=*/false};
+    return false;
   }
   StringRef SecName = *SecNameOrErr;
 
@@ -370,26 +357,11 @@ static FilterResult checkSectionFilter(object::SectionRef S) {
   // no name (such as the section with index 0) here.
   if (!SecName.empty())
     FoundSectionSet.insert(SecName);
-
-  // Only show the section if it's in the FilterSections list, but always
-  // increment so the indexing is stable.
-  return {/*Keep=*/is_contained(FilterSections, SecName),
-          /*IncrementIndex=*/true};
+  return is_contained(FilterSections, SecName);
 }
 
-SectionFilter ToolSectionFilter(object::ObjectFile const &O, uint64_t *Idx) {
-  // Start at UINT64_MAX so that the first index returned after an increment is
-  // zero (after the unsigned wrap).
-  if (Idx)
-    *Idx = UINT64_MAX;
-  return SectionFilter(
-      [Idx](object::SectionRef S) {
-        FilterResult Result = checkSectionFilter(S);
-        if (Idx != nullptr && Result.IncrementIndex)
-          *Idx += 1;
-        return Result.Keep;
-      },
-      O);
+SectionFilter ToolSectionFilter(object::ObjectFile const &O) {
+  return SectionFilter([](object::SectionRef S) { return shouldKeep(S); }, O);
 }
 
 std::string getFileNameForError(const object::Archive::Child &C,
@@ -995,7 +967,7 @@ getRelocsMap(object::ObjectFile const &Obj) {
   std::map<SectionRef, std::vector<RelocationRef>> Ret;
   for (SectionRef Sec : Obj.sections()) {
     section_iterator Relocated = Sec.getRelocatedSection();
-    if (Relocated == Obj.section_end() || !checkSectionFilter(*Relocated).Keep)
+    if (Relocated == Obj.section_end() || !shouldKeep(*Relocated))
       continue;
     std::vector<RelocationRef> &V = Ret[*Relocated];
     for (const RelocationRef &R : Sec.relocations())
@@ -1704,8 +1676,7 @@ void printSectionHeaders(const ObjectFile *Obj) {
            << left_justify("Name", NameWidth) << " Size     "
            << left_justify("VMA", AddressWidth) << " Type\n";
 
-  uint64_t Idx;
-  for (const SectionRef &Section : ToolSectionFilter(*Obj, &Idx)) {
+  for (const SectionRef &Section : ToolSectionFilter(*Obj)) {
     StringRef Name = unwrapOrError(Section.getName(), Obj->getFileName());
     uint64_t VMA = Section.getAddress();
     if (shouldAdjustVA(Section))
@@ -1720,14 +1691,14 @@ void printSectionHeaders(const ObjectFile *Obj) {
       Type += Type.empty() ? "BSS" : " BSS";
 
     if (HasLMAColumn)
-      outs() << format("%3d %-*s %08" PRIx64 " ", Idx, NameWidth,
-                       Name.str().c_str(), Size)
+      outs() << format("%3d %-*s %08" PRIx64 " ", (unsigned)Section.getIndex(),
+                       NameWidth, Name.str().c_str(), Size)
              << format_hex_no_prefix(VMA, AddressWidth) << " "
              << format_hex_no_prefix(getELFSectionLMA(Section), AddressWidth)
              << " " << Type << "\n";
     else
-      outs() << format("%3d %-*s %08" PRIx64 " ", Idx, NameWidth,
-                       Name.str().c_str(), Size)
+      outs() << format("%3d %-*s %08" PRIx64 " ", (unsigned)Section.getIndex(),
+                       NameWidth, Name.str().c_str(), Size)
              << format_hex_no_prefix(VMA, AddressWidth) << " " << Type << "\n";
   }
   outs() << "\n";
index 43ce02ae0bc27e48b09445667356a73a74eda275..d36c4fdc00e28f3a7da772ed4316e2c84e728d3d 100644 (file)
@@ -31,8 +31,6 @@ extern cl::opt<bool> Demangle;
 
 typedef std::function<bool(llvm::object::SectionRef const &)> FilterPredicate;
 
-/// A filtered iterator for SectionRefs that skips sections based on some given
-/// predicate.
 class SectionFilterIterator {
 public:
   SectionFilterIterator(FilterPredicate P,
@@ -62,8 +60,6 @@ private:
   llvm::object::section_iterator End;
 };
 
-/// Creates an iterator range of SectionFilterIterators for a given Object and
-/// predicate.
 class SectionFilter {
 public:
   SectionFilter(FilterPredicate P, llvm::object::ObjectFile const &O)
@@ -83,15 +79,7 @@ private:
 };
 
 // Various helper functions.
-
-/// Creates a SectionFilter with a standard predicate that conditionally skips
-/// sections when the --section objdump flag is provided.
-///
-/// Idx is an optional output parameter that keeps track of which section index
-/// this is. This may be different than the actual section number, as some
-/// sections may be filtered (e.g. symbol tables).
-SectionFilter ToolSectionFilter(llvm::object::ObjectFile const &O,
-                                uint64_t *Idx = nullptr);
+SectionFilter ToolSectionFilter(llvm::object::ObjectFile const &O);
 
 Error getELFRelocationValueString(const object::ELFObjectFileBase *Obj,
                                   const object::RelocationRef &Rel,