diff options
| author | Shankar Easwaran <shankare@codeaurora.org> | 2015-02-06 04:15:04 +0000 |
|---|---|---|
| committer | Shankar Easwaran <shankare@codeaurora.org> | 2015-02-06 04:15:04 +0000 |
| commit | 8825dbdd85e18068ec352e9f7d5e035fcf2fee9b (patch) | |
| tree | d8e008509532c4766b1ad27e17eaaa4898e6efb8 /lld/lib/ReaderWriter/ELF/DefaultLayout.h | |
| parent | 8f1b2d09309e7fdb0e4e53262c2af24f7fb3b733 (diff) | |
| download | bcm5719-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.h | 18 |
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; |

