From b6c52e8dfac5717f89c7a16a102331937c2dbe26 Mon Sep 17 00:00:00 2001 From: George Rimar Date: Fri, 12 Aug 2016 19:32:45 +0000 Subject: [PATCH] [ELF] - Remove excessive loop in LinkerScript::assignAddresses() After 278461 "Create only one section for a name in LinkerScript." this loop is excessive. Patch also reorders code slightly to use early return. Differential revision: https://reviews.llvm.org/D23442 llvm-svn: 278554 --- lld/ELF/LinkerScript.cpp | 56 ++++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp index 1c24614ce880..95b28e2af5d8 100644 --- a/lld/ELF/LinkerScript.cpp +++ b/lld/ELF/LinkerScript.cpp @@ -362,39 +362,39 @@ template void LinkerScript::assignAddresses() { continue; } - // Find all the sections with required name. There can be more than - // one section with such name, if the alignment, flags or type - // attribute differs. auto *Cmd = cast(Base.get()); - for (OutputSectionBase *Sec : *OutputSections) { - if (Sec->getName() != Cmd->Name) - continue; + auto I = llvm::find_if(*OutputSections, [&](OutputSectionBase *S) { + return S->getName() == Cmd->Name; + }); + if (I == OutputSections->end()) + continue; + OutputSectionBase *Sec = *I; - if (Cmd->AddrExpr) - Dot = Cmd->AddrExpr(Dot); + if (Cmd->AddrExpr) + Dot = Cmd->AddrExpr(Dot); - if (Cmd->AlignExpr) - Sec->updateAlignment(Cmd->AlignExpr(Dot)); + if (Cmd->AlignExpr) + Sec->updateAlignment(Cmd->AlignExpr(Dot)); - if ((Sec->getFlags() & SHF_TLS) && Sec->getType() == SHT_NOBITS) { - uintX_t TVA = Dot + ThreadBssOffset; - TVA = alignTo(TVA, Sec->getAlignment()); - Sec->setVA(TVA); - assignOffsets(Sec); - ThreadBssOffset = TVA - Dot + Sec->getSize(); - continue; - } - - if (Sec->getFlags() & SHF_ALLOC) { - Dot = alignTo(Dot, Sec->getAlignment()); - Sec->setVA(Dot); - assignOffsets(Sec); - MinVA = std::min(MinVA, Dot); - Dot += Sec->getSize(); - continue; - } - Sec->assignOffsets(); + if ((Sec->getFlags() & SHF_TLS) && Sec->getType() == SHT_NOBITS) { + uintX_t TVA = Dot + ThreadBssOffset; + TVA = alignTo(TVA, Sec->getAlignment()); + Sec->setVA(TVA); + assignOffsets(Sec); + ThreadBssOffset = TVA - Dot + Sec->getSize(); + continue; } + + if (!(Sec->getFlags() & SHF_ALLOC)) { + Sec->assignOffsets(); + continue; + } + + Dot = alignTo(Dot, Sec->getAlignment()); + Sec->setVA(Dot); + assignOffsets(Sec); + MinVA = std::min(MinVA, Dot); + Dot += Sec->getSize(); } // ELF and Program headers need to be right before the first section in