diff options
author | Fangrui Song <maskray@google.com> | 2020-04-23 20:47:52 -0700 |
---|---|---|
committer | Fangrui Song <maskray@google.com> | 2020-04-27 11:20:41 -0700 |
commit | fd624e623d34dd0e812b7fdce73bdff15f456826 (patch) | |
tree | 4e1237ca871c1a1561a4e65bc87cfdcf6617f8fd /llvm/tools/llvm-objcopy/ELF/Object.cpp | |
parent | dab1326a5ae32ffd2dc277027e1ae68d8b5124d5 (diff) | |
download | llvm-fd624e623d34dd0e812b7fdce73bdff15f456826.zip llvm-fd624e623d34dd0e812b7fdce73bdff15f456826.tar.gz llvm-fd624e623d34dd0e812b7fdce73bdff15f456826.tar.bz2 |
[llvm-objcopy] Don't specialize the all zero p_paddr case
Spotted by https://reviews.llvm.org/D74755#1998673
> it looks like OrderedSegments in the function is only used to set the physical address to the virtual address when there are no physical addresses set amongst these sections.
I believe this behavior was copied from https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=6ffd79000b45e77b3625143932ffbf781b6aecab (2008-05)
The commit was made for some corner cases of very old linkers.
This special rule does not seem useful and remove it can allow us to
delete a large chunk of code.
Reviewed By: jhenderson, jakehehrlich
Differential Revision: https://reviews.llvm.org/D78786
Diffstat (limited to 'llvm/tools/llvm-objcopy/ELF/Object.cpp')
-rw-r--r-- | llvm/tools/llvm-objcopy/ELF/Object.cpp | 36 |
1 files changed, 0 insertions, 36 deletions
diff --git a/llvm/tools/llvm-objcopy/ELF/Object.cpp b/llvm/tools/llvm-objcopy/ELF/Object.cpp index bc590fa..3808e92 100644 --- a/llvm/tools/llvm-objcopy/ELF/Object.cpp +++ b/llvm/tools/llvm-objcopy/ELF/Object.cpp @@ -1101,14 +1101,6 @@ static bool compareSegmentsByOffset(const Segment *A, const Segment *B) { return A->Index < B->Index; } -static bool compareSegmentsByPAddr(const Segment *A, const Segment *B) { - if (A->PAddr < B->PAddr) - return true; - if (A->PAddr > B->PAddr) - return false; - return A->Index < B->Index; -} - void BasicELFBuilder::initFileHeader() { Obj->Flags = 0x0; Obj->Type = ET_REL; @@ -2224,34 +2216,6 @@ Error BinaryWriter::write() { } Error BinaryWriter::finalize() { - // 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.allocSections()) - if (Sec.ParentSegment != nullptr) - OrderedSegments.push_back(Sec.ParentSegment); - - // For binary output, we're going to use physical addresses instead of - // virtual addresses, since a binary output is used for cases like ROM - // loading and physical addresses are intended for ROM loading. - // However, if no segment has a physical address, we'll fallback to using - // virtual addresses for all. - if (all_of(OrderedSegments, - [](const Segment *Seg) { return Seg->PAddr == 0; })) - for (Segment *Seg : OrderedSegments) - Seg->PAddr = Seg->VAddr; - - llvm::stable_sort(OrderedSegments, compareSegmentsByPAddr); - - // Because we add a ParentSegment for each section we might have duplicate - // segments in OrderedSegments. If there were duplicates then layoutSegments - // would do very strange things. - auto End = - std::unique(std::begin(OrderedSegments), std::end(OrderedSegments)); - OrderedSegments.erase(End, std::end(OrderedSegments)); - // Compute the section LMA based on its sh_offset and the containing segment's // p_offset and p_paddr. Also compute the minimum LMA of all sections as // MinAddr. In the output, the contents between address 0 and MinAddr will be |