diff options
author | Andrew Ng <andrew.ng@sony.com> | 2020-09-07 17:36:14 +0100 |
---|---|---|
committer | Andrew Ng <andrew.ng@sony.com> | 2020-09-08 19:32:34 +0100 |
commit | 863aa0a37bd1a57b0720eda6d646f9abd51bf6c2 (patch) | |
tree | c25abb7ddeb8488a2e7419cdec0b7202a6086182 | |
parent | ce49b7d9ca01f4abbba1e5a00339d539b0ea563e (diff) | |
download | llvm-863aa0a37bd1a57b0720eda6d646f9abd51bf6c2.zip llvm-863aa0a37bd1a57b0720eda6d646f9abd51bf6c2.tar.gz llvm-863aa0a37bd1a57b0720eda6d646f9abd51bf6c2.tar.bz2 |
[LLD][ELF] Fix performance of MarkLive::scanEhFrameSection
MarkLive::scanEhFrameSection is used to retain personality/LSDA
functions when --gc-sections is enabled.
Improve its performance by only iterating over the .eh_frame relocations
that need to be resolved for an EhSectionPiece. This optimization makes
the same assumption as elsewhere in LLD that the .eh_frame relocations
are sorted by r_offset.
This appears to be a performance regression introduced in commit
e6c24299d237 (https://reviews.llvm.org/D59800).
This change has been seen to reduce link time by up to ~50%.
Differential Revision: https://reviews.llvm.org/D87245
-rw-r--r-- | lld/ELF/MarkLive.cpp | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/lld/ELF/MarkLive.cpp b/lld/ELF/MarkLive.cpp index 28e13e8..af6c08c 100644 --- a/lld/ELF/MarkLive.cpp +++ b/lld/ELF/MarkLive.cpp @@ -152,9 +152,9 @@ void MarkLive<ELFT>::scanEhFrameSection(EhInputSection &eh, // a LSDA. We only need to keep the LSDA alive, so ignore anything that // points to executable sections. uint64_t pieceEnd = piece.inputOff + piece.size; - for (size_t j = firstRelI, end2 = rels.size(); j < end2; ++j) - if (rels[j].r_offset < pieceEnd) - resolveReloc(eh, rels[j], true); + for (size_t j = firstRelI, end2 = rels.size(); + j < end2 && rels[j].r_offset < pieceEnd; ++j) + resolveReloc(eh, rels[j], true); } } |