diff options
author | Hans Wennborg <hans@hanshq.net> | 2019-10-17 08:52:29 +0000 |
---|---|---|
committer | Hans Wennborg <hans@hanshq.net> | 2019-10-17 08:52:29 +0000 |
commit | 312c4a6e248988a6aca72b47667c25636a319602 (patch) | |
tree | c0483c644daed8337e0d8dfc6bf2c81868edf3f5 /llvm/tools/llvm-objdump/llvm-objdump.cpp | |
parent | 3ff961cabd8593f183e56e99bf161842b645a0d6 (diff) | |
download | llvm-312c4a6e248988a6aca72b47667c25636a319602.zip llvm-312c4a6e248988a6aca72b47667c25636a319602.tar.gz llvm-312c4a6e248988a6aca72b47667c25636a319602.tar.bz2 |
Revert r374931 "[llvm-objdump] Use a counter for llvm-objdump -h instead of the section index."
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
llvm-svn: 375088
Diffstat (limited to 'llvm/tools/llvm-objdump/llvm-objdump.cpp')
-rw-r--r-- | llvm/tools/llvm-objdump/llvm-objdump.cpp | 53 |
1 files changed, 12 insertions, 41 deletions
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index 6377d3b..83344e7 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -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"; |