summaryrefslogtreecommitdiffstats
path: root/lld/lib/ReaderWriter/ELF/DefaultLayout.h
diff options
context:
space:
mode:
authorShankar Easwaran <shankare@codeaurora.org>2015-02-06 04:15:04 +0000
committerShankar Easwaran <shankare@codeaurora.org>2015-02-06 04:15:04 +0000
commit8825dbdd85e18068ec352e9f7d5e035fcf2fee9b (patch)
treed8e008509532c4766b1ad27e17eaaa4898e6efb8 /lld/lib/ReaderWriter/ELF/DefaultLayout.h
parent8f1b2d09309e7fdb0e4e53262c2af24f7fb3b733 (diff)
downloadbcm5719-llvm-8825dbdd85e18068ec352e9f7d5e035fcf2fee9b.tar.gz
bcm5719-llvm-8825dbdd85e18068ec352e9f7d5e035fcf2fee9b.zip
[ELF] Speedup creating program headers.
After the total number of program headers are determined, virtual addresses and file offsets need not be reassigned for sections whose virtual addresses and fileoffsets remained the same. This doesnot change any functionality. llvm-svn: 228377
Diffstat (limited to 'lld/lib/ReaderWriter/ELF/DefaultLayout.h')
-rw-r--r--lld/lib/ReaderWriter/ELF/DefaultLayout.h18
1 files changed, 14 insertions, 4 deletions
diff --git a/lld/lib/ReaderWriter/ELF/DefaultLayout.h b/lld/lib/ReaderWriter/ELF/DefaultLayout.h
index efd173c0dbf..67102113aee 100644
--- a/lld/lib/ReaderWriter/ELF/DefaultLayout.h
+++ b/lld/lib/ReaderWriter/ELF/DefaultLayout.h
@@ -755,7 +755,7 @@ DefaultLayout<ELFT>::assignVirtualAddress() {
std::sort(_segments.begin(), _segments.end(), Segment<ELFT>::compareSegments);
- uint64_t virtualAddress = _context.getBaseAddress();
+ uint64_t baseAddress = _context.getBaseAddress();
// HACK: This is a super dirty hack. The elf header and program header are
// not part of a section, but we need them to be loaded at the base address
@@ -774,6 +774,7 @@ DefaultLayout<ELFT>::assignVirtualAddress() {
firstLoadSegment->prepend(_elfHeader);
bool newSegmentHeaderAdded = true;
bool virtualAddressAssigned = false;
+ bool fileOffsetAssigned = false;
while (true) {
for (auto si : _segments) {
si->finalize();
@@ -783,8 +784,8 @@ DefaultLayout<ELFT>::assignVirtualAddress() {
}
if (!newSegmentHeaderAdded && virtualAddressAssigned)
break;
- virtualAddressAssigned = true;
- uint64_t address = virtualAddress;
+ uint64_t address = baseAddress;
+ ;
// start assigning virtual addresses
for (auto &si : _segments) {
if ((si->segmentType() != llvm::ELF::PT_LOAD) &&
@@ -794,18 +795,27 @@ DefaultLayout<ELFT>::assignVirtualAddress() {
if (si->segmentType() == llvm::ELF::PT_NULL) {
si->assignVirtualAddress(0 /*non loadable*/);
} else {
+ if (virtualAddressAssigned && (address != baseAddress) &&
+ (address == si->virtualAddr()))
+ break;
si->assignVirtualAddress(address);
}
address = si->virtualAddr() + si->memSize();
}
- uint64_t fileoffset = 0;
+ uint64_t baseFileOffset = 0;
+ uint64_t fileoffset = baseFileOffset;
for (auto &si : _segments) {
if ((si->segmentType() != llvm::ELF::PT_LOAD) &&
(si->segmentType() != llvm::ELF::PT_NULL))
continue;
+ if (fileOffsetAssigned && (fileoffset != baseFileOffset) &&
+ (fileoffset == si->fileOffset()))
+ break;
si->assignFileOffsets(fileoffset);
fileoffset = si->fileOffset() + si->fileSize();
}
+ virtualAddressAssigned = true;
+ fileOffsetAssigned = true;
_programHeader->resetProgramHeaders();
}
Section<ELFT> *section;
OpenPOWER on IntegriCloud