[lld] r228377 - [ELF] Speedup creating program headers.
Shankar Easwaran
shankare at codeaurora.org
Thu Feb 5 20:15:04 PST 2015
Author: shankare
Date: Thu Feb 5 22:15:04 2015
New Revision: 228377
URL: http://llvm.org/viewvc/llvm-project?rev=228377&view=rev
Log:
[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.
Modified:
lld/trunk/lib/ReaderWriter/ELF/DefaultLayout.h
Modified: lld/trunk/lib/ReaderWriter/ELF/DefaultLayout.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/DefaultLayout.h?rev=228377&r1=228376&r2=228377&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/DefaultLayout.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/DefaultLayout.h Thu Feb 5 22:15:04 2015
@@ -755,7 +755,7 @@ DefaultLayout<ELFT>::assignVirtualAddres
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>::assignVirtualAddres
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>::assignVirtualAddres
}
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>::assignVirtualAddres
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;
More information about the llvm-commits
mailing list