forked from OSchip/llvm-project
[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:
parent
1512f9a0f9
commit
b6c52e8dfa
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue