forked from OSchip/llvm-project
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:
parent
14e9e8af35
commit
7c3ff2eb58
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue