diff options
| author | Petr Hosek <phosek@chromium.org> | 2016-08-31 15:31:17 +0000 |
|---|---|---|
| committer | Petr Hosek <phosek@chromium.org> | 2016-08-31 15:31:17 +0000 |
| commit | e5d3ca50318f2449a5dc9820a1012903ffb03824 (patch) | |
| tree | 67bd13febfa7bbeca1c222e5829b81b26ad03867 /lld/ELF/LinkerScript.cpp | |
| parent | b2e620a23b950ca8e21ab6da0e14321cd566425f (diff) | |
| download | bcm5719-llvm-e5d3ca50318f2449a5dc9820a1012903ffb03824.tar.gz bcm5719-llvm-e5d3ca50318f2449a5dc9820a1012903ffb03824.zip | |
[ELF] Linkerscript: define symbols outside SECTIONS
Symbol assignments outside of SECTIONS command need to be created
even when SECTIONS command is not used.
Differential Revision: https://reviews.llvm.org/D23751
llvm-svn: 280252
Diffstat (limited to 'lld/ELF/LinkerScript.cpp')
| -rw-r--r-- | lld/ELF/LinkerScript.cpp | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp index e1a99b10a95..94032330185 100644 --- a/lld/ELF/LinkerScript.cpp +++ b/lld/ELF/LinkerScript.cpp @@ -259,6 +259,16 @@ LinkerScript<ELFT>::createInputSectionList(OutputSectionCommand &OutCmd) { } template <class ELFT> +void LinkerScript<ELFT>::createAssignments() { + for (const std::unique_ptr<SymbolAssignment> &Cmd : Opt.Assignments) { + if (shouldDefine<ELFT>(Cmd.get())) + addRegular<ELFT>(Cmd.get()); + if (Cmd->Sym) + cast<DefinedRegular<ELFT>>(Cmd->Sym)->Value = Cmd->Expression(0); + } +} + +template <class ELFT> void LinkerScript<ELFT>::createSections(OutputSectionFactory<ELFT> &Factory) { for (const std::unique_ptr<BaseCommand> &Base1 : Opt.Commands) { if (auto *Cmd = dyn_cast<SymbolAssignment>(Base1.get())) { @@ -714,12 +724,16 @@ void ScriptParser::readVersionScript() { void ScriptParser::readLinkerScript() { while (!atEOF()) { StringRef Tok = next(); - if (Handler Fn = Cmd.lookup(Tok)) + if (Handler Fn = Cmd.lookup(Tok)) { (this->*Fn)(); - else if (SymbolAssignment *Cmd = readProvideOrAssignment(Tok)) - Opt.Commands.emplace_back(Cmd); - else + } else if (SymbolAssignment *Cmd = readProvideOrAssignment(Tok)) { + if (Opt.HasContents) + Opt.Commands.emplace_back(Cmd); + else + Opt.Assignments.emplace_back(Cmd); + } else { setError("unknown directive: " + Tok); + } } } |

