[ELF] - Remove excessive loop in LinkerScript<ELFT>::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
This commit is contained in:
George Rimar 2016-08-12 19:32:45 +00:00
parent 1512f9a0f9
commit b6c52e8dfa
1 changed files with 28 additions and 28 deletions

View File

@ -362,39 +362,39 @@ template <class ELFT> void LinkerScript<ELFT>::assignAddresses() {
continue; 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<OutputSectionCommand>(Base.get()); auto *Cmd = cast<OutputSectionCommand>(Base.get());
for (OutputSectionBase<ELFT> *Sec : *OutputSections) { auto I = llvm::find_if(*OutputSections, [&](OutputSectionBase<ELFT> *S) {
if (Sec->getName() != Cmd->Name) return S->getName() == Cmd->Name;
continue; });
if (I == OutputSections->end())
continue;
OutputSectionBase<ELFT> *Sec = *I;
if (Cmd->AddrExpr) if (Cmd->AddrExpr)
Dot = Cmd->AddrExpr(Dot); Dot = Cmd->AddrExpr(Dot);
if (Cmd->AlignExpr) if (Cmd->AlignExpr)
Sec->updateAlignment(Cmd->AlignExpr(Dot)); Sec->updateAlignment(Cmd->AlignExpr(Dot));
if ((Sec->getFlags() & SHF_TLS) && Sec->getType() == SHT_NOBITS) { if ((Sec->getFlags() & SHF_TLS) && Sec->getType() == SHT_NOBITS) {
uintX_t TVA = Dot + ThreadBssOffset; uintX_t TVA = Dot + ThreadBssOffset;
TVA = alignTo(TVA, Sec->getAlignment()); TVA = alignTo(TVA, Sec->getAlignment());
Sec->setVA(TVA); Sec->setVA(TVA);
assignOffsets(Sec); assignOffsets(Sec);
ThreadBssOffset = TVA - Dot + Sec->getSize(); ThreadBssOffset = TVA - Dot + Sec->getSize();
continue; 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_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 // ELF and Program headers need to be right before the first section in