diff --git a/llvm/test/tools/llvm-objdump/xcoff-section-headers.test b/llvm/test/tools/llvm-objdump/xcoff-section-headers.test --- a/llvm/test/tools/llvm-objdump/xcoff-section-headers.test +++ b/llvm/test/tools/llvm-objdump/xcoff-section-headers.test @@ -13,11 +13,11 @@ # CHECK: xcoff-section-headers.o: file format aixcoff-rs6000 # CHECK: Sections: # CHECK: Idx Name Size VMA Type -# 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 +# 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 # xcoff-section-headers.o Compiled with IBM XL C/C++ for AIX, V16.1.0 # test.c: @@ -32,10 +32,10 @@ # LONG: xcoff-long-sec-names.o: file format aixcoff-rs6000 # LONG: Sections: -# LONG: Idx Name Size VMA Type -# LONG: 1 .dwarnge 00000004 00000000 -# LONG: 2 .dwpbnms 00000004 00000000 -# LONG: 3 .dwpbtyp 00000004 00000000 +# LONG: Idx Name Size VMA Type +# LONG: 0 .dwarnge 00000004 00000000 +# LONG: 1 .dwpbnms 00000004 00000000 +# LONG: 2 .dwpbtyp 00000004 00000000 # xcoff-long-sec-names.o was generated by assembling the following .s file: # .dwsect 0x30000 # .dwpbnms section diff --git a/llvm/tools/llvm-objdump/llvm-objdump.h b/llvm/tools/llvm-objdump/llvm-objdump.h --- a/llvm/tools/llvm-objdump/llvm-objdump.h +++ b/llvm/tools/llvm-objdump/llvm-objdump.h @@ -79,7 +79,12 @@ }; // Various helper functions. -SectionFilter ToolSectionFilter(llvm::object::ObjectFile const &O); + +// The optional index parameter is to keep 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); Error getELFRelocationValueString(const object::ELFObjectFileBase *Obj, const object::RelocationRef &Rel, diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -342,14 +342,19 @@ typedef std::vector> SectionSymbolsTy; -static bool shouldKeep(object::SectionRef S) { +struct FilterResult { + bool Keep; + bool IncrementIndex; +}; + +static FilterResult checkSectionFilter(object::SectionRef S) { if (FilterSections.empty()) - return true; + return {/*Keep=*/true, /*Increment=*/true}; Expected SecNameOrErr = S.getName(); if (!SecNameOrErr) { consumeError(SecNameOrErr.takeError()); - return false; + return {/*Keep=*/false, /*Increment=*/false}; } StringRef SecName = *SecNameOrErr; @@ -357,11 +362,25 @@ // no name (such as the section with index 0) here. if (!SecName.empty()) FoundSectionSet.insert(SecName); - return is_contained(FilterSections, 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), /*Increment=*/true}; } -SectionFilter ToolSectionFilter(object::ObjectFile const &O) { - return SectionFilter([](object::SectionRef S) { return shouldKeep(S); }, O); +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 != nullptr) + *Idx = UINT64_MAX; + return SectionFilter( + [Idx](object::SectionRef S) { + auto Result = checkSectionFilter(S); + if (Idx != nullptr && Result.IncrementIndex) + *Idx += 1; + return Result.Keep; + }, + O); } std::string getFileNameForError(const object::Archive::Child &C, @@ -967,7 +986,7 @@ std::map> Ret; for (SectionRef Sec : Obj.sections()) { section_iterator Relocated = Sec.getRelocatedSection(); - if (Relocated == Obj.section_end() || !shouldKeep(*Relocated)) + if (Relocated == Obj.section_end() || !checkSectionFilter(*Relocated).Keep) continue; std::vector &V = Ret[*Relocated]; for (const RelocationRef &R : Sec.relocations()) @@ -1676,7 +1695,8 @@ << left_justify("Name", NameWidth) << " Size " << left_justify("VMA", AddressWidth) << " Type\n"; - for (const SectionRef &Section : ToolSectionFilter(*Obj)) { + uint64_t Idx; + for (const SectionRef &Section : ToolSectionFilter(*Obj, &Idx)) { StringRef Name = unwrapOrError(Section.getName(), Obj->getFileName()); uint64_t VMA = Section.getAddress(); if (shouldAdjustVA(Section)) @@ -1694,14 +1714,14 @@ std::string Type = llvm::join(SectionTypes, " "); if (HasLMAColumn) - outs() << format("%3d %-*s %08" PRIx64 " ", (unsigned)Section.getIndex(), - NameWidth, Name.str().c_str(), Size) + outs() << format("%3d %-*s %08" PRIx64 " ", Idx, 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 " ", (unsigned)Section.getIndex(), - NameWidth, Name.str().c_str(), Size) + outs() << format("%3d %-*s %08" PRIx64 " ", Idx, NameWidth, + Name.str().c_str(), Size) << format_hex_no_prefix(VMA, AddressWidth) << " " << Type << "\n"; } outs() << "\n";