Only process commands in a ONLY_IF_RO if it matches.

This matches bfd behavior. It also makes future changes simpler as we
don't have to worry about ignoring these commands in multiple places

llvm-svn: 281775
This commit is contained in:
Rafael Espindola 2016-09-16 21:05:36 +00:00
parent 14e9e8af35
commit 7c3ff2eb58
2 changed files with 29 additions and 15 deletions

View File

@ -208,24 +208,14 @@ LinkerScript<ELFT>::createInputSectionList(OutputSectionCommand &OutCmd) {
std::vector<InputSectionBase<ELFT> *> Ret;
for (const std::unique_ptr<BaseCommand> &Base : OutCmd.Commands) {
if (auto *OutCmd = dyn_cast<SymbolAssignment>(Base.get())) {
if (shouldDefine<ELFT>(OutCmd))
addSymbol<ELFT>(OutCmd);
auto *Cmd = dyn_cast<InputSectionDescription>(Base.get());
if (!Cmd)
continue;
}
auto *Cmd = cast<InputSectionDescription>(Base.get());
computeInputSections(Cmd);
for (InputSectionData *S : Cmd->Sections)
Ret.push_back(static_cast<InputSectionBase<ELFT> *>(S));
}
if (!matchConstraints<ELFT>(Ret, OutCmd.Constraint)) {
for (InputSectionBase<ELFT> *S : Ret)
S->OutSec = nullptr;
Ret.clear();
}
return Ret;
}
@ -275,7 +265,9 @@ void LinkerScript<ELFT>::addSection(OutputSectionFactory<ELFT> &Factory,
template <class ELFT>
void LinkerScript<ELFT>::processCommands(OutputSectionFactory<ELFT> &Factory) {
for (const std::unique_ptr<BaseCommand> &Base1 : Opt.Commands) {
for (unsigned I = 0; I < Opt.Commands.size(); ++I) {
auto Iter = Opt.Commands.begin() + I;
const std::unique_ptr<BaseCommand> &Base1 = *Iter;
if (auto *Cmd = dyn_cast<SymbolAssignment>(Base1.get())) {
if (shouldDefine<ELFT>(Cmd))
addRegular<ELFT>(Cmd);
@ -298,6 +290,18 @@ void LinkerScript<ELFT>::processCommands(OutputSectionFactory<ELFT> &Factory) {
continue;
}
if (!matchConstraints<ELFT>(V, Cmd->Constraint)) {
for (InputSectionBase<ELFT> *S : V)
S->OutSec = nullptr;
Opt.Commands.erase(Iter);
continue;
}
for (const std::unique_ptr<BaseCommand> &Base : Cmd->Commands)
if (auto *OutCmd = dyn_cast<SymbolAssignment>(Base.get()))
if (shouldDefine<ELFT>(OutCmd))
addSymbol<ELFT>(OutCmd);
if (V.empty())
continue;
@ -410,8 +414,7 @@ findSections(OutputSectionCommand &Cmd,
const std::vector<OutputSectionBase<ELFT> *> &Sections) {
std::vector<OutputSectionBase<ELFT> *> Ret;
for (OutputSectionBase<ELFT> *Sec : Sections)
if (Sec->getName() == Cmd.Name &&
checkConstraint(Sec->getFlags(), Cmd.Constraint))
if (Sec->getName() == Cmd.Name)
Ret.push_back(Sec);
return Ret;
}

View File

@ -0,0 +1,11 @@
# REQUIRES: x86
# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
# RUN: echo "SECTIONS { zed : ONLY_IF_RO { abc = 1; *(foo) } }" > %t.script
# RUN: ld.lld -T %t.script %t.o -o %t.so -shared
# RUN: llvm-readobj -t %t.so | FileCheck %s
# CHECK: Symbols [
# CHECK-NOT: abc
.section foo,"aw"
.quad 1