[ELF] - Cleanup of processSectionCommands().

The way we handle ONLY_IF_RO/ONLY_IF_RW constraints in
processSectionCommands is a bit tricky. If input sections
does no satisfy given constraint we remove command from
commands list. It seems too complex, what we can do instead
is to make the OutputCommand empty. So that at later steps
LLD will remove it just like it deal with other empty output commands.
That allows to simplify the loop a bit.

Differential revision: https://reviews.llvm.org/D39094

llvm-svn: 317082
This commit is contained in:
George Rimar 2017-11-01 08:40:28 +00:00
parent f2c2851efe
commit 1b45d377e3
1 changed files with 11 additions and 19 deletions

View File

@ -357,16 +357,17 @@ void LinkerScript::processSectionCommands() {
Ctx = Deleter.get();
Ctx->OutSec = Aether;
size_t I = 0;
DenseMap<SectionBase *, int> Order = buildSectionOrder();
// Add input sections to output sections.
for (size_t I = 0; I < SectionCommands.size(); ++I) {
for (BaseCommand *Base : SectionCommands) {
// Handle symbol assignments outside of any output section.
if (auto *Cmd = dyn_cast<SymbolAssignment>(SectionCommands[I])) {
if (auto *Cmd = dyn_cast<SymbolAssignment>(Base)) {
addSymbol(Cmd);
continue;
}
if (auto *Sec = dyn_cast<OutputSection>(SectionCommands[I])) {
if (auto *Sec = dyn_cast<OutputSection>(Base)) {
std::vector<InputSection *> V = createInputSectionList(*Sec, Order);
// The output section name `/DISCARD/' is special.
@ -381,13 +382,12 @@ void LinkerScript::processSectionCommands() {
// sections satisfy a given constraint. If not, a directive is handled
// as if it wasn't present from the beginning.
//
// Because we'll iterate over SectionCommands many more times, the easiest
// way to "make it as if it wasn't present" is to just remove it.
// Because we'll iterate over SectionCommands many more times, the easy
// way to "make it as if it wasn't present" is to make it empty.
if (!matchConstraints(V, Sec->Constraint)) {
for (InputSectionBase *S : V)
S->Assigned = false;
SectionCommands.erase(SectionCommands.begin() + I);
--I;
Sec->SectionCommands.clear();
continue;
}
@ -409,21 +409,13 @@ void LinkerScript::processSectionCommands() {
// Add input sections to an output section.
for (InputSection *S : V)
Sec->addSection(S);
Sec->SectionIndex = I++;
if (Sec->Noload)
Sec->Type = SHT_NOBITS;
}
}
Ctx = nullptr;
// Output sections are emitted in the exact same order as
// appeared in SECTIONS command, so we know their section indices.
for (size_t I = 0; I < SectionCommands.size(); ++I) {
auto *Sec = dyn_cast<OutputSection>(SectionCommands[I]);
if (!Sec)
continue;
assert(Sec->SectionIndex == INT_MAX);
Sec->SectionIndex = I;
if (Sec->Noload)
Sec->Type = SHT_NOBITS;
}
}
static OutputSection *findByName(ArrayRef<BaseCommand *> Vec,