diff options
author | Fangrui Song <maskray@google.com> | 2019-09-04 09:35:32 +0000 |
---|---|---|
committer | Fangrui Song <maskray@google.com> | 2019-09-04 09:35:32 +0000 |
commit | fe2da4e5ed5f0568b0b7ea423af9d4b33bf8294f (patch) | |
tree | 4da003b9533015ca3742b15ac4aaac15de6e21e1 | |
parent | 9bae2315582fe4d024fab853dd5b219d5b753255 (diff) | |
download | bcm5719-llvm-fe2da4e5ed5f0568b0b7ea423af9d4b33bf8294f.tar.gz bcm5719-llvm-fe2da4e5ed5f0568b0b7ea423af9d4b33bf8294f.zip |
[llvm-objcopy] Add objcopy::elf::Object::allocSections to simplify loops on SHF_ALLOC sections
Reviewed By: jhenderson
Differential Revision: https://reviews.llvm.org/D67142
llvm-svn: 370860
-rw-r--r-- | llvm/tools/llvm-objcopy/ELF/Object.cpp | 28 | ||||
-rw-r--r-- | llvm/tools/llvm-objcopy/ELF/Object.h | 15 |
2 files changed, 21 insertions, 22 deletions
diff --git a/llvm/tools/llvm-objcopy/ELF/Object.cpp b/llvm/tools/llvm-objcopy/ELF/Object.cpp index f2b606d28d6..44e6bf54b28 100644 --- a/llvm/tools/llvm-objcopy/ELF/Object.cpp +++ b/llvm/tools/llvm-objcopy/ELF/Object.cpp @@ -2101,23 +2101,19 @@ template <class ELFT> Error ELFWriter<ELFT>::finalize() { } Error BinaryWriter::write() { - for (const SectionBase &Sec : Obj.sections()) - if (Sec.Flags & SHF_ALLOC) - Sec.accept(*SecWriter); + for (const SectionBase &Sec : Obj.allocSections()) + Sec.accept(*SecWriter); return Buf.commit(); } Error BinaryWriter::finalize() { - // TODO: Create a filter range to construct OrderedSegments from so that this - // code can be deduped with assignOffsets above. This should also solve the - // todo below for LayoutSections. // We need a temporary list of segments that has a special order to it // so that we know that anytime ->ParentSegment is set that segment has // already had it's offset properly set. We only want to consider the segments // that will affect layout of allocated sections so we only add those. std::vector<Segment *> OrderedSegments; - for (const SectionBase &Sec : Obj.sections()) - if ((Sec.Flags & SHF_ALLOC) != 0 && Sec.ParentSegment != nullptr) + for (const SectionBase &Sec : Obj.allocSections()) + if (Sec.ParentSegment != nullptr) OrderedSegments.push_back(Sec.ParentSegment); // For binary output, we're going to use physical addresses instead of @@ -2161,24 +2157,16 @@ Error BinaryWriter::finalize() { } } - // TODO: generalize layoutSections to take a range. Pass a special range - // constructed from an iterator that skips values for which a predicate does - // not hold. Then pass such a range to layoutSections instead of constructing - // AllocatedSections here. - std::vector<SectionBase *> AllocatedSections; - for (SectionBase &Sec : Obj.sections()) - if (Sec.Flags & SHF_ALLOC) - AllocatedSections.push_back(&Sec); - layoutSections(make_pointee_range(AllocatedSections), Offset); + layoutSections(Obj.allocSections(), Offset); // Now that every section has been laid out we just need to compute the total // file size. This might not be the same as the offset returned by // layoutSections, because we want to truncate the last segment to the end of // its last section, to match GNU objcopy's behaviour. TotalSize = 0; - for (SectionBase *Sec : AllocatedSections) - if (Sec->Type != SHT_NOBITS) - TotalSize = std::max(TotalSize, Sec->Offset + Sec->Size); + for (const SectionBase &Sec : Obj.allocSections()) + if (Sec.Type != SHT_NOBITS) + TotalSize = std::max(TotalSize, Sec.Offset + Sec.Size); if (Error E = Buf.allocate(TotalSize)) return E; diff --git a/llvm/tools/llvm-objcopy/ELF/Object.h b/llvm/tools/llvm-objcopy/ELF/Object.h index 42844dae3b4..70be6bed422 100644 --- a/llvm/tools/llvm-objcopy/ELF/Object.h +++ b/llvm/tools/llvm-objcopy/ELF/Object.h @@ -57,8 +57,8 @@ public: : Sections(Secs) {} SectionTableRef(const SectionTableRef &) = default; - iterator begin() { return iterator(Sections.data()); } - iterator end() { return iterator(Sections.data() + Sections.size()); } + iterator begin() const { return iterator(Sections.data()); } + iterator end() const { return iterator(Sections.data() + Sections.size()); } size_t size() const { return Sections.size(); } SectionBase *getSection(uint32_t Index, Twine ErrMsg); @@ -994,6 +994,10 @@ private: std::vector<SegPtr> Segments; std::vector<SecPtr> RemovedSections; + static bool sectionIsAlloc(const SectionBase &Sec) { + return Sec.Flags & ELF::SHF_ALLOC; + }; + public: template <class T> using Range = iterator_range< @@ -1032,6 +1036,13 @@ public: ConstRange<SectionBase> sections() const { return make_pointee_range(Sections); } + iterator_range< + filter_iterator<pointee_iterator<std::vector<SecPtr>::const_iterator>, + decltype(§ionIsAlloc)>> + allocSections() const { + return make_filter_range(make_pointee_range(Sections), sectionIsAlloc); + } + SectionBase *findSection(StringRef Name) { auto SecIt = find_if(Sections, [&](const SecPtr &Sec) { return Sec->Name == Name; }); |