1f7c5fbb1SRui Ueyama //===- LinkerScript.cpp ---------------------------------------------------===//
2f7c5fbb1SRui Ueyama //
3f7c5fbb1SRui Ueyama //                             The LLVM Linker
4f7c5fbb1SRui Ueyama //
5f7c5fbb1SRui Ueyama // This file is distributed under the University of Illinois Open Source
6f7c5fbb1SRui Ueyama // License. See LICENSE.TXT for details.
7f7c5fbb1SRui Ueyama //
8f7c5fbb1SRui Ueyama //===----------------------------------------------------------------------===//
9f7c5fbb1SRui Ueyama //
10f7c5fbb1SRui Ueyama // This file contains the parser/evaluator of the linker script.
11629e0aa5SRui Ueyama // It parses a linker script and write the result to Config or ScriptConfig
12629e0aa5SRui Ueyama // objects.
13629e0aa5SRui Ueyama //
14629e0aa5SRui Ueyama // If SECTIONS command is used, a ScriptConfig contains an AST
15629e0aa5SRui Ueyama // of the command which will later be consumed by createSections() and
16629e0aa5SRui Ueyama // assignAddresses().
17f7c5fbb1SRui Ueyama //
18f7c5fbb1SRui Ueyama //===----------------------------------------------------------------------===//
19f7c5fbb1SRui Ueyama 
20717677afSRui Ueyama #include "LinkerScript.h"
21f7c5fbb1SRui Ueyama #include "Config.h"
22f7c5fbb1SRui Ueyama #include "Driver.h"
231ebc8ed7SRui Ueyama #include "InputSection.h"
24652852c5SGeorge Rimar #include "OutputSections.h"
25e77b5bf6SAdhemerval Zanella #include "ScriptParser.h"
2693c9af42SRui Ueyama #include "Strings.h"
27eda81a1bSEugene Leviant #include "Symbols.h"
28f7c5fbb1SRui Ueyama #include "SymbolTable.h"
29467c4d55SEugene Leviant #include "Target.h"
30bbe38602SEugene Leviant #include "Writer.h"
31960504b9SRui Ueyama #include "llvm/ADT/StringSwitch.h"
32652852c5SGeorge Rimar #include "llvm/Support/ELF.h"
33f7c5fbb1SRui Ueyama #include "llvm/Support/FileSystem.h"
34f7c5fbb1SRui Ueyama #include "llvm/Support/MemoryBuffer.h"
35f03f3cc1SRui Ueyama #include "llvm/Support/Path.h"
36a47ee68dSRui Ueyama #include "llvm/Support/StringSaver.h"
37f7c5fbb1SRui Ueyama 
38f7c5fbb1SRui Ueyama using namespace llvm;
39652852c5SGeorge Rimar using namespace llvm::ELF;
401ebc8ed7SRui Ueyama using namespace llvm::object;
41e38cbab5SGeorge Rimar using namespace llvm::support::endian;
42f7c5fbb1SRui Ueyama using namespace lld;
43e0df00b9SRafael Espindola using namespace lld::elf;
44f7c5fbb1SRui Ueyama 
45884e786dSGeorge Rimar LinkerScriptBase *elf::ScriptBase;
4607320e40SRui Ueyama ScriptConfiguration *elf::ScriptConfig;
47717677afSRui Ueyama 
486c55f0e3SGeorge Rimar template <class ELFT> static void addRegular(SymbolAssignment *Cmd) {
491602421cSRui Ueyama   Symbol *Sym = Symtab<ELFT>::X->addRegular(Cmd->Name, STB_GLOBAL, STV_DEFAULT);
501602421cSRui Ueyama   Sym->Visibility = Cmd->Hidden ? STV_HIDDEN : STV_DEFAULT;
511602421cSRui Ueyama   Cmd->Sym = Sym->body();
5220d03194SEugene Leviant 
5320d03194SEugene Leviant   // If we have no SECTIONS then we don't have '.' and don't call
5420d03194SEugene Leviant   // assignAddresses(). We calculate symbol value immediately in this case.
5520d03194SEugene Leviant   if (!ScriptConfig->HasSections)
5620d03194SEugene Leviant     cast<DefinedRegular<ELFT>>(Cmd->Sym)->Value = Cmd->Expression(0);
57ceabe80eSEugene Leviant }
58ceabe80eSEugene Leviant 
590c70d3ccSRui Ueyama template <class ELFT> static void addSynthetic(SymbolAssignment *Cmd) {
60e1937bb5SGeorge Rimar   Symbol *Sym = Symtab<ELFT>::X->addSynthetic(
61e1937bb5SGeorge Rimar       Cmd->Name, nullptr, 0, Cmd->Hidden ? STV_HIDDEN : STV_DEFAULT);
621602421cSRui Ueyama   Cmd->Sym = Sym->body();
63ceabe80eSEugene Leviant }
64ceabe80eSEugene Leviant 
65db741e72SEugene Leviant template <class ELFT> static void addSymbol(SymbolAssignment *Cmd) {
66db741e72SEugene Leviant   if (Cmd->IsAbsolute)
67db741e72SEugene Leviant     addRegular<ELFT>(Cmd);
68db741e72SEugene Leviant   else
69db741e72SEugene Leviant     addSynthetic<ELFT>(Cmd);
70db741e72SEugene Leviant }
711602421cSRui Ueyama // If a symbol was in PROVIDE(), we need to define it only when
721602421cSRui Ueyama // it is an undefined symbol.
731602421cSRui Ueyama template <class ELFT> static bool shouldDefine(SymbolAssignment *Cmd) {
741602421cSRui Ueyama   if (Cmd->Name == ".")
75ceabe80eSEugene Leviant     return false;
761602421cSRui Ueyama   if (!Cmd->Provide)
77ceabe80eSEugene Leviant     return true;
781602421cSRui Ueyama   SymbolBody *B = Symtab<ELFT>::X->find(Cmd->Name);
791602421cSRui Ueyama   return B && B->isUndefined();
80ceabe80eSEugene Leviant }
81ceabe80eSEugene Leviant 
82076fe157SGeorge Rimar bool SymbolAssignment::classof(const BaseCommand *C) {
83076fe157SGeorge Rimar   return C->Kind == AssignmentKind;
84076fe157SGeorge Rimar }
85076fe157SGeorge Rimar 
86076fe157SGeorge Rimar bool OutputSectionCommand::classof(const BaseCommand *C) {
87076fe157SGeorge Rimar   return C->Kind == OutputSectionKind;
88076fe157SGeorge Rimar }
89076fe157SGeorge Rimar 
90eea3114fSGeorge Rimar bool InputSectionDescription::classof(const BaseCommand *C) {
91eea3114fSGeorge Rimar   return C->Kind == InputSectionKind;
92eea3114fSGeorge Rimar }
93eea3114fSGeorge Rimar 
94eefa758eSGeorge Rimar bool AssertCommand::classof(const BaseCommand *C) {
95eefa758eSGeorge Rimar   return C->Kind == AssertKind;
96eefa758eSGeorge Rimar }
97eefa758eSGeorge Rimar 
98e38cbab5SGeorge Rimar bool BytesDataCommand::classof(const BaseCommand *C) {
99e38cbab5SGeorge Rimar   return C->Kind == BytesDataKind;
100e38cbab5SGeorge Rimar }
101e38cbab5SGeorge Rimar 
10236a153cdSRui Ueyama template <class ELFT> static bool isDiscarded(InputSectionBase<ELFT> *S) {
103eea3114fSGeorge Rimar   return !S || !S->Live;
104717677afSRui Ueyama }
105717677afSRui Ueyama 
106f34d0e08SRui Ueyama template <class ELFT> LinkerScript<ELFT>::LinkerScript() {}
107f34d0e08SRui Ueyama template <class ELFT> LinkerScript<ELFT>::~LinkerScript() {}
108f34d0e08SRui Ueyama 
10907320e40SRui Ueyama template <class ELFT>
11007320e40SRui Ueyama bool LinkerScript<ELFT>::shouldKeep(InputSectionBase<ELFT> *S) {
111cf43f179SEugene Leviant   for (InputSectionDescription *ID : Opt.KeptSections) {
112cf43f179SEugene Leviant     StringRef Filename = S->getFile()->getName();
113cf43f179SEugene Leviant     if (!ID->FileRe.match(sys::path::filename(Filename)))
114cf43f179SEugene Leviant       continue;
115cf43f179SEugene Leviant 
116cf43f179SEugene Leviant     for (SectionPattern &P : ID->SectionPatterns)
117cf43f179SEugene Leviant       if (P.SectionRe.match(S->Name))
118eea3114fSGeorge Rimar         return true;
119cf43f179SEugene Leviant   }
120eea3114fSGeorge Rimar   return false;
121eea3114fSGeorge Rimar }
122eea3114fSGeorge Rimar 
123575208caSGeorge Rimar static bool comparePriority(InputSectionData *A, InputSectionData *B) {
124575208caSGeorge Rimar   return getPriority(A->Name) < getPriority(B->Name);
125575208caSGeorge Rimar }
126575208caSGeorge Rimar 
127c0028d3dSRafael Espindola static bool compareName(InputSectionData *A, InputSectionData *B) {
128042a3f20SRafael Espindola   return A->Name < B->Name;
1290702c4e8SGeorge Rimar }
130742c3836SRui Ueyama 
131c0028d3dSRafael Espindola static bool compareAlignment(InputSectionData *A, InputSectionData *B) {
132742c3836SRui Ueyama   // ">" is not a mistake. Larger alignments are placed before smaller
133742c3836SRui Ueyama   // alignments in order to reduce the amount of padding necessary.
134742c3836SRui Ueyama   // This is compatible with GNU.
135742c3836SRui Ueyama   return A->Alignment > B->Alignment;
136742c3836SRui Ueyama }
137742c3836SRui Ueyama 
138c0028d3dSRafael Espindola static std::function<bool(InputSectionData *, InputSectionData *)>
139be394db3SGeorge Rimar getComparator(SortSectionPolicy K) {
140be394db3SGeorge Rimar   switch (K) {
141be394db3SGeorge Rimar   case SortSectionPolicy::Alignment:
142c0028d3dSRafael Espindola     return compareAlignment;
143be394db3SGeorge Rimar   case SortSectionPolicy::Name:
144be394db3SGeorge Rimar     return compareName;
145be394db3SGeorge Rimar   case SortSectionPolicy::Priority:
146be394db3SGeorge Rimar     return comparePriority;
147be394db3SGeorge Rimar   default:
148be394db3SGeorge Rimar     llvm_unreachable("unknown sort policy");
149be394db3SGeorge Rimar   }
150742c3836SRui Ueyama }
1510702c4e8SGeorge Rimar 
15248c3f1ceSRui Ueyama template <class ELFT>
153e71a3f8aSRafael Espindola static bool matchConstraints(ArrayRef<InputSectionBase<ELFT> *> Sections,
15406ae6836SGeorge Rimar                              ConstraintKind Kind) {
1558f66df92SGeorge Rimar   if (Kind == ConstraintKind::NoConstraint)
1568f66df92SGeorge Rimar     return true;
157e746e52cSRafael Espindola   bool IsRW = llvm::any_of(Sections, [=](InputSectionData *Sec2) {
158d3190795SRafael Espindola     auto *Sec = static_cast<InputSectionBase<ELFT> *>(Sec2);
159e746e52cSRafael Espindola     return Sec->getSectionHdr()->sh_flags & SHF_WRITE;
16006ae6836SGeorge Rimar   });
161e746e52cSRafael Espindola   return (IsRW && Kind == ConstraintKind::ReadWrite) ||
162e746e52cSRafael Espindola          (!IsRW && Kind == ConstraintKind::ReadOnly);
16306ae6836SGeorge Rimar }
16406ae6836SGeorge Rimar 
16507171f21SGeorge Rimar static void sortSections(InputSectionData **Begin, InputSectionData **End,
166ee924709SRui Ueyama                          SortSectionPolicy K) {
167ee924709SRui Ueyama   if (K != SortSectionPolicy::Default && K != SortSectionPolicy::None)
16807171f21SGeorge Rimar     std::stable_sort(Begin, End, getComparator(K));
169ee924709SRui Ueyama }
170ee924709SRui Ueyama 
171d3190795SRafael Espindola // Compute and remember which sections the InputSectionDescription matches.
172be94e1b6SRafael Espindola template <class ELFT>
173e71a3f8aSRafael Espindola void LinkerScript<ELFT>::computeInputSections(InputSectionDescription *I) {
1744dc07becSRui Ueyama   // Collects all sections that satisfy constraints of I
1754dc07becSRui Ueyama   // and attach them to I.
1764dc07becSRui Ueyama   for (SectionPattern &Pat : I->SectionPatterns) {
17707171f21SGeorge Rimar     size_t SizeBefore = I->Sections.size();
178395281cfSGeorge Rimar     for (ObjectFile<ELFT> *F : Symtab<ELFT>::X->getObjectFiles()) {
1793ff27f49SRui Ueyama       StringRef Filename = sys::path::filename(F->getName());
180f135f0ecSRafael Espindola       if (!I->FileRe.match(Filename) || Pat.ExcludedFileRe.match(Filename))
1813ff27f49SRui Ueyama         continue;
1824dc07becSRui Ueyama 
183be94e1b6SRafael Espindola       for (InputSectionBase<ELFT> *S : F->getSections())
184f135f0ecSRafael Espindola         if (!isDiscarded(S) && !S->OutSec && Pat.SectionRe.match(S->Name))
185d3190795SRafael Espindola           I->Sections.push_back(S);
186f135f0ecSRafael Espindola       if (Pat.SectionRe.match("COMMON"))
187d3190795SRafael Espindola         I->Sections.push_back(CommonInputSection<ELFT>::X);
188395281cfSGeorge Rimar     }
189d3190795SRafael Espindola 
190ee924709SRui Ueyama     // Sort sections as instructed by SORT-family commands and --sort-section
191ee924709SRui Ueyama     // option. Because SORT-family commands can be nested at most two depth
192ee924709SRui Ueyama     // (e.g. SORT_BY_NAME(SORT_BY_ALIGNMENT(.text.*))) and because the command
193ee924709SRui Ueyama     // line option is respected even if a SORT command is given, the exact
194ee924709SRui Ueyama     // behavior we have here is a bit complicated. Here are the rules.
195ee924709SRui Ueyama     //
196ee924709SRui Ueyama     // 1. If two SORT commands are given, --sort-section is ignored.
197ee924709SRui Ueyama     // 2. If one SORT command is given, and if it is not SORT_NONE,
198ee924709SRui Ueyama     //    --sort-section is handled as an inner SORT command.
199ee924709SRui Ueyama     // 3. If one SORT command is given, and if it is SORT_NONE, don't sort.
200ee924709SRui Ueyama     // 4. If no SORT command is given, sort according to --sort-section.
20107171f21SGeorge Rimar     InputSectionData **Begin = I->Sections.data() + SizeBefore;
20207171f21SGeorge Rimar     InputSectionData **End = I->Sections.data() + I->Sections.size();
20307171f21SGeorge Rimar     if (Pat.SortOuter != SortSectionPolicy::None) {
20407171f21SGeorge Rimar       if (Pat.SortInner == SortSectionPolicy::Default)
20507171f21SGeorge Rimar         sortSections(Begin, End, Config->SortSection);
206ee924709SRui Ueyama       else
20707171f21SGeorge Rimar         sortSections(Begin, End, Pat.SortInner);
20807171f21SGeorge Rimar       sortSections(Begin, End, Pat.SortOuter);
20907171f21SGeorge Rimar     }
210ee924709SRui Ueyama   }
211d3190795SRafael Espindola 
212d3190795SRafael Espindola   // We do not add duplicate input sections, so mark them with a dummy output
213d3190795SRafael Espindola   // section for now.
214d3190795SRafael Espindola   for (InputSectionData *S : I->Sections) {
215d3190795SRafael Espindola     auto *S2 = static_cast<InputSectionBase<ELFT> *>(S);
216d3190795SRafael Espindola     S2->OutSec = (OutputSectionBase<ELFT> *)-1;
217d3190795SRafael Espindola   }
218be94e1b6SRafael Espindola }
219be94e1b6SRafael Espindola 
220be94e1b6SRafael Espindola template <class ELFT>
221be94e1b6SRafael Espindola void LinkerScript<ELFT>::discard(ArrayRef<InputSectionBase<ELFT> *> V) {
222be94e1b6SRafael Espindola   for (InputSectionBase<ELFT> *S : V) {
223be94e1b6SRafael Espindola     S->Live = false;
224be94e1b6SRafael Espindola     reportDiscarded(S);
225be94e1b6SRafael Espindola   }
226be94e1b6SRafael Espindola }
227be94e1b6SRafael Espindola 
22806ae6836SGeorge Rimar template <class ELFT>
2290b9ce6a4SRui Ueyama std::vector<InputSectionBase<ELFT> *>
23006ae6836SGeorge Rimar LinkerScript<ELFT>::createInputSectionList(OutputSectionCommand &OutCmd) {
2310b9ce6a4SRui Ueyama   std::vector<InputSectionBase<ELFT> *> Ret;
232e7f912cdSRui Ueyama 
23306ae6836SGeorge Rimar   for (const std::unique_ptr<BaseCommand> &Base : OutCmd.Commands) {
2347c3ff2ebSRafael Espindola     auto *Cmd = dyn_cast<InputSectionDescription>(Base.get());
2357c3ff2ebSRafael Espindola     if (!Cmd)
2360b9ce6a4SRui Ueyama       continue;
237e71a3f8aSRafael Espindola     computeInputSections(Cmd);
238d3190795SRafael Espindola     for (InputSectionData *S : Cmd->Sections)
239d3190795SRafael Espindola       Ret.push_back(static_cast<InputSectionBase<ELFT> *>(S));
2400b9ce6a4SRui Ueyama   }
241e71a3f8aSRafael Espindola 
242cc1ba8c7SEugene Leviant   // After we created final list we should now set OutSec pointer to null,
243cc1ba8c7SEugene Leviant   // instead of -1. Otherwise we may get a crash when writing relocs, in
244cc1ba8c7SEugene Leviant   // case section is discarded by linker script
245cc1ba8c7SEugene Leviant   for (InputSectionBase<ELFT> *S : Ret)
246cc1ba8c7SEugene Leviant     S->OutSec = nullptr;
247cc1ba8c7SEugene Leviant 
2480b9ce6a4SRui Ueyama   return Ret;
2490b9ce6a4SRui Ueyama }
2500b9ce6a4SRui Ueyama 
251e5d3ca50SPetr Hosek template <class ELFT>
25210897f18SRafael Espindola static SectionKey<ELFT::Is64Bits> createKey(InputSectionBase<ELFT> *C,
25310897f18SRafael Espindola                                             StringRef OutsecName) {
25410897f18SRafael Espindola   // When using linker script the merge rules are different.
25510897f18SRafael Espindola   // Unfortunately, linker scripts are name based. This means that expressions
25610897f18SRafael Espindola   // like *(.foo*) can refer to multiple input sections that would normally be
25710897f18SRafael Espindola   // placed in different output sections. We cannot put them in different
25810897f18SRafael Espindola   // output sections or we would produce wrong results for
25910897f18SRafael Espindola   // start = .; *(.foo.*) end = .; *(.bar)
26010897f18SRafael Espindola   // and a mapping of .foo1 and .bar1 to one section and .foo2 and .bar2 to
26110897f18SRafael Espindola   // another. The problem is that there is no way to layout those output
26210897f18SRafael Espindola   // sections such that the .foo sections are the only thing between the
26310897f18SRafael Espindola   // start and end symbols.
26410897f18SRafael Espindola 
26510897f18SRafael Espindola   // An extra annoyance is that we cannot simply disable merging of the contents
26610897f18SRafael Espindola   // of SHF_MERGE sections, but our implementation requires one output section
26710897f18SRafael Espindola   // per "kind" (string or not, which size/aligment).
26810897f18SRafael Espindola   // Fortunately, creating symbols in the middle of a merge section is not
26910897f18SRafael Espindola   // supported by bfd or gold, so we can just create multiple section in that
27010897f18SRafael Espindola   // case.
27110897f18SRafael Espindola   const typename ELFT::Shdr *H = C->getSectionHdr();
27210897f18SRafael Espindola   typedef typename ELFT::uint uintX_t;
27310897f18SRafael Espindola   uintX_t Flags = H->sh_flags & (SHF_MERGE | SHF_STRINGS);
27410897f18SRafael Espindola 
27510897f18SRafael Espindola   uintX_t Alignment = 0;
27610897f18SRafael Espindola   if (isa<MergeInputSection<ELFT>>(C))
27710897f18SRafael Espindola     Alignment = std::max(H->sh_addralign, H->sh_entsize);
27810897f18SRafael Espindola 
27910897f18SRafael Espindola   return SectionKey<ELFT::Is64Bits>{OutsecName, /*Type*/ 0, Flags, Alignment};
28010897f18SRafael Espindola }
28110897f18SRafael Espindola 
28210897f18SRafael Espindola template <class ELFT>
28320d03194SEugene Leviant void LinkerScript<ELFT>::addSection(OutputSectionFactory<ELFT> &Factory,
28420d03194SEugene Leviant                                     InputSectionBase<ELFT> *Sec,
28520d03194SEugene Leviant                                     StringRef Name) {
28628c1597aSRafael Espindola   OutputSectionBase<ELFT> *OutSec;
28728c1597aSRafael Espindola   bool IsNew;
28810897f18SRafael Espindola   std::tie(OutSec, IsNew) = Factory.create(createKey(Sec, Name), Sec);
28928c1597aSRafael Espindola   if (IsNew)
29028c1597aSRafael Espindola     OutputSections->push_back(OutSec);
29120d03194SEugene Leviant   OutSec->addSection(Sec);
29220d03194SEugene Leviant }
29320d03194SEugene Leviant 
29420d03194SEugene Leviant template <class ELFT>
29520d03194SEugene Leviant void LinkerScript<ELFT>::processCommands(OutputSectionFactory<ELFT> &Factory) {
29628c1597aSRafael Espindola 
2977c3ff2ebSRafael Espindola   for (unsigned I = 0; I < Opt.Commands.size(); ++I) {
2987c3ff2ebSRafael Espindola     auto Iter = Opt.Commands.begin() + I;
2997c3ff2ebSRafael Espindola     const std::unique_ptr<BaseCommand> &Base1 = *Iter;
3002ab5f73dSRui Ueyama     if (auto *Cmd = dyn_cast<SymbolAssignment>(Base1.get())) {
3012ab5f73dSRui Ueyama       if (shouldDefine<ELFT>(Cmd))
3022ab5f73dSRui Ueyama         addRegular<ELFT>(Cmd);
3032ab5f73dSRui Ueyama       continue;
3042ab5f73dSRui Ueyama     }
30520d03194SEugene Leviant     if (auto *Cmd = dyn_cast<AssertCommand>(Base1.get())) {
30620d03194SEugene Leviant       // If we don't have SECTIONS then output sections have already been
307194470cdSGeorge Rimar       // created by Writer<ELFT>. The LinkerScript<ELFT>::assignAddresses
30820d03194SEugene Leviant       // will not be called, so ASSERT should be evaluated now.
30920d03194SEugene Leviant       if (!Opt.HasSections)
31020d03194SEugene Leviant         Cmd->Expression(0);
31120d03194SEugene Leviant       continue;
31220d03194SEugene Leviant     }
3132ab5f73dSRui Ueyama 
314ceabe80eSEugene Leviant     if (auto *Cmd = dyn_cast<OutputSectionCommand>(Base1.get())) {
3157bd37870SRafael Espindola       std::vector<InputSectionBase<ELFT> *> V = createInputSectionList(*Cmd);
3167bd37870SRafael Espindola 
31748c3f1ceSRui Ueyama       if (Cmd->Name == "/DISCARD/") {
3187bd37870SRafael Espindola         discard(V);
31948c3f1ceSRui Ueyama         continue;
32048c3f1ceSRui Ueyama       }
3210b9ce6a4SRui Ueyama 
3227c3ff2ebSRafael Espindola       if (!matchConstraints<ELFT>(V, Cmd->Constraint)) {
3237c3ff2ebSRafael Espindola         for (InputSectionBase<ELFT> *S : V)
3247c3ff2ebSRafael Espindola           S->OutSec = nullptr;
3257c3ff2ebSRafael Espindola         Opt.Commands.erase(Iter);
326dfbbbc86SGeorge Rimar         --I;
3277c3ff2ebSRafael Espindola         continue;
3287c3ff2ebSRafael Espindola       }
3297c3ff2ebSRafael Espindola 
3307c3ff2ebSRafael Espindola       for (const std::unique_ptr<BaseCommand> &Base : Cmd->Commands)
3317c3ff2ebSRafael Espindola         if (auto *OutCmd = dyn_cast<SymbolAssignment>(Base.get()))
3327c3ff2ebSRafael Espindola           if (shouldDefine<ELFT>(OutCmd))
3337c3ff2ebSRafael Espindola             addSymbol<ELFT>(OutCmd);
3347c3ff2ebSRafael Espindola 
33597403d15SEugene Leviant       if (V.empty())
3360b9ce6a4SRui Ueyama         continue;
3370b9ce6a4SRui Ueyama 
338a14b13d8SGeorge Rimar       for (InputSectionBase<ELFT> *Sec : V) {
33920d03194SEugene Leviant         addSection(Factory, Sec, Cmd->Name);
34020d03194SEugene Leviant         if (uint32_t Subalign = Cmd->SubalignExpr ? Cmd->SubalignExpr(0) : 0)
341db24d9c3SGeorge Rimar           Sec->Alignment = Subalign;
34220d03194SEugene Leviant       }
343eea3114fSGeorge Rimar     }
34448c3f1ceSRui Ueyama   }
345db24d9c3SGeorge Rimar }
346e63d81bdSEugene Leviant 
34720d03194SEugene Leviant template <class ELFT>
34820d03194SEugene Leviant void LinkerScript<ELFT>::createSections(OutputSectionFactory<ELFT> &Factory) {
34920d03194SEugene Leviant   processCommands(Factory);
3500b9ce6a4SRui Ueyama   // Add orphan sections.
35120d03194SEugene Leviant   for (ObjectFile<ELFT> *F : Symtab<ELFT>::X->getObjectFiles())
35220d03194SEugene Leviant     for (InputSectionBase<ELFT> *S : F->getSections())
35320d03194SEugene Leviant       if (!isDiscarded(S) && !S->OutSec)
35405384080SRui Ueyama         addSection(Factory, S, getOutputSectionName(S->Name, Opt.Alloc));
355e63d81bdSEugene Leviant }
356e63d81bdSEugene Leviant 
357db741e72SEugene Leviant // Sets value of a section-defined symbol. Two kinds of
358db741e72SEugene Leviant // symbols are processed: synthetic symbols, whose value
359db741e72SEugene Leviant // is an offset from beginning of section and regular
360db741e72SEugene Leviant // symbols whose value is absolute.
361db741e72SEugene Leviant template <class ELFT>
362db741e72SEugene Leviant static void assignSectionSymbol(SymbolAssignment *Cmd,
363db741e72SEugene Leviant                                 OutputSectionBase<ELFT> *Sec,
364db741e72SEugene Leviant                                 typename ELFT::uint Off) {
365db741e72SEugene Leviant   if (!Cmd->Sym)
366db741e72SEugene Leviant     return;
367db741e72SEugene Leviant 
368db741e72SEugene Leviant   if (auto *Body = dyn_cast<DefinedSynthetic<ELFT>>(Cmd->Sym)) {
369db741e72SEugene Leviant     Body->Section = Sec;
370db741e72SEugene Leviant     Body->Value = Cmd->Expression(Sec->getVA() + Off) - Sec->getVA();
371db741e72SEugene Leviant     return;
372db741e72SEugene Leviant   }
373db741e72SEugene Leviant   auto *Body = cast<DefinedRegular<ELFT>>(Cmd->Sym);
374db741e72SEugene Leviant   Body->Value = Cmd->Expression(Sec->getVA() + Off);
375db741e72SEugene Leviant }
376db741e72SEugene Leviant 
377a940e539SRafael Espindola template <class ELFT> static bool isTbss(OutputSectionBase<ELFT> *Sec) {
378a940e539SRafael Espindola   return (Sec->getFlags() & SHF_TLS) && Sec->getType() == SHT_NOBITS;
379a940e539SRafael Espindola }
380a940e539SRafael Espindola 
381d3190795SRafael Espindola template <class ELFT> void LinkerScript<ELFT>::output(InputSection<ELFT> *S) {
382d3190795SRafael Espindola   if (!AlreadyOutputIS.insert(S).second)
383ceabe80eSEugene Leviant     return;
384a940e539SRafael Espindola   bool IsTbss = isTbss(CurOutSec);
385d3190795SRafael Espindola 
386d3190795SRafael Espindola   uintX_t Pos = IsTbss ? Dot + ThreadBssOffset : Dot;
387d3190795SRafael Espindola   Pos = alignTo(Pos, S->Alignment);
388d3190795SRafael Espindola   S->OutSecOff = Pos - CurOutSec->getVA();
389d3190795SRafael Espindola   Pos += S->getSize();
390d3190795SRafael Espindola 
391d3190795SRafael Espindola   // Update output section size after adding each section. This is so that
392d3190795SRafael Espindola   // SIZEOF works correctly in the case below:
393d3190795SRafael Espindola   // .foo { *(.aaa) a = SIZEOF(.foo); *(.bbb) }
394d3190795SRafael Espindola   CurOutSec->setSize(Pos - CurOutSec->getVA());
395d3190795SRafael Espindola 
3967252ae52SRafael Espindola   if (IsTbss)
3977252ae52SRafael Espindola     ThreadBssOffset = Pos - Dot;
3987252ae52SRafael Espindola   else
399d3190795SRafael Espindola     Dot = Pos;
4002de509c3SRui Ueyama }
401ceabe80eSEugene Leviant 
402d3190795SRafael Espindola template <class ELFT> void LinkerScript<ELFT>::flush() {
40365499b90SRafael Espindola   if (!CurOutSec || !AlreadyOutputOS.insert(CurOutSec).second)
40465499b90SRafael Espindola     return;
40565499b90SRafael Espindola   if (auto *OutSec = dyn_cast<OutputSection<ELFT>>(CurOutSec)) {
406d3190795SRafael Espindola     for (InputSection<ELFT> *I : OutSec->Sections)
407d3190795SRafael Espindola       output(I);
40865499b90SRafael Espindola   } else {
40965499b90SRafael Espindola     Dot += CurOutSec->getSize();
410d3190795SRafael Espindola   }
411d3190795SRafael Espindola }
41297403d15SEugene Leviant 
413d3190795SRafael Espindola template <class ELFT>
414d3190795SRafael Espindola void LinkerScript<ELFT>::switchTo(OutputSectionBase<ELFT> *Sec) {
415d3190795SRafael Espindola   if (CurOutSec == Sec)
416d3190795SRafael Espindola     return;
417d3190795SRafael Espindola   if (AlreadyOutputOS.count(Sec))
418d3190795SRafael Espindola     return;
419d3190795SRafael Espindola 
420d3190795SRafael Espindola   flush();
421d3190795SRafael Espindola   CurOutSec = Sec;
422d3190795SRafael Espindola 
423d3190795SRafael Espindola   Dot = alignTo(Dot, CurOutSec->getAlignment());
424a940e539SRafael Espindola   CurOutSec->setVA(isTbss(CurOutSec) ? Dot + ThreadBssOffset : Dot);
425b71d6f7aSEugene Leviant 
426b71d6f7aSEugene Leviant   // If neither AT nor AT> is specified for an allocatable section, the linker
427b71d6f7aSEugene Leviant   // will set the LMA such that the difference between VMA and LMA for the
428b71d6f7aSEugene Leviant   // section is the same as the preceding output section in the same region
429b71d6f7aSEugene Leviant   // https://sourceware.org/binutils/docs-2.20/ld/Output-Section-LMA.html
430b71d6f7aSEugene Leviant   CurOutSec->setLMAOffset(LMAOffset);
431d3190795SRafael Espindola }
432d3190795SRafael Espindola 
433d3190795SRafael Espindola template <class ELFT> void LinkerScript<ELFT>::process(BaseCommand &Base) {
434e38cbab5SGeorge Rimar   // This handles the assignments to symbol or to a location counter (.)
435d3190795SRafael Espindola   if (auto *AssignCmd = dyn_cast<SymbolAssignment>(&Base)) {
43697403d15SEugene Leviant     if (AssignCmd->Name == ".") {
43797403d15SEugene Leviant       // Update to location counter means update to section size.
438d3190795SRafael Espindola       Dot = AssignCmd->Expression(Dot);
439d3190795SRafael Espindola       CurOutSec->setSize(Dot - CurOutSec->getVA());
440d3190795SRafael Espindola       return;
44197403d15SEugene Leviant     }
442d3190795SRafael Espindola     assignSectionSymbol<ELFT>(AssignCmd, CurOutSec, Dot - CurOutSec->getVA());
443d3190795SRafael Espindola     return;
44497403d15SEugene Leviant   }
445e38cbab5SGeorge Rimar 
446e38cbab5SGeorge Rimar   // Handle BYTE(), SHORT(), LONG(), or QUAD().
447e38cbab5SGeorge Rimar   if (auto *DataCmd = dyn_cast<BytesDataCommand>(&Base)) {
448e38cbab5SGeorge Rimar     DataCmd->Offset = Dot - CurOutSec->getVA();
449e38cbab5SGeorge Rimar     Dot += DataCmd->Size;
450e38cbab5SGeorge Rimar     CurOutSec->setSize(Dot - CurOutSec->getVA());
451e38cbab5SGeorge Rimar     return;
452e38cbab5SGeorge Rimar   }
453e38cbab5SGeorge Rimar 
454e38cbab5SGeorge Rimar   // It handles single input section description command,
455e38cbab5SGeorge Rimar   // calculates and assigns the offsets for each section and also
456e38cbab5SGeorge Rimar   // updates the output section size.
457d3190795SRafael Espindola   auto &ICmd = cast<InputSectionDescription>(Base);
458d3190795SRafael Espindola   for (InputSectionData *ID : ICmd.Sections) {
459d3190795SRafael Espindola     auto *IB = static_cast<InputSectionBase<ELFT> *>(ID);
460d3190795SRafael Espindola     switchTo(IB->OutSec);
461d3190795SRafael Espindola     if (auto *I = dyn_cast<InputSection<ELFT>>(IB))
462d3190795SRafael Espindola       output(I);
46365499b90SRafael Espindola     else
46465499b90SRafael Espindola       flush();
465ceabe80eSEugene Leviant   }
466ceabe80eSEugene Leviant }
467ceabe80eSEugene Leviant 
4688f66df92SGeorge Rimar template <class ELFT>
469a14b13d8SGeorge Rimar static std::vector<OutputSectionBase<ELFT> *>
4709257764dSEugene Leviant findSections(StringRef Name,
471d3190795SRafael Espindola              const std::vector<OutputSectionBase<ELFT> *> &Sections) {
472a14b13d8SGeorge Rimar   std::vector<OutputSectionBase<ELFT> *> Ret;
473a14b13d8SGeorge Rimar   for (OutputSectionBase<ELFT> *Sec : Sections)
4749257764dSEugene Leviant     if (Sec->getName() == Name)
475a14b13d8SGeorge Rimar       Ret.push_back(Sec);
476a14b13d8SGeorge Rimar   return Ret;
4778f66df92SGeorge Rimar }
4788f66df92SGeorge Rimar 
479d3190795SRafael Espindola template <class ELFT>
480d3190795SRafael Espindola void LinkerScript<ELFT>::assignOffsets(OutputSectionCommand *Cmd) {
481b71d6f7aSEugene Leviant   if (Cmd->LMAExpr)
482b71d6f7aSEugene Leviant     LMAOffset = Cmd->LMAExpr(Dot) - Dot;
483d3190795SRafael Espindola   std::vector<OutputSectionBase<ELFT> *> Sections =
4849257764dSEugene Leviant       findSections(Cmd->Name, *OutputSections);
485d3190795SRafael Espindola   if (Sections.empty())
486d3190795SRafael Espindola     return;
487d3190795SRafael Espindola   switchTo(Sections[0]);
488d3190795SRafael Espindola   // Find the last section output location. We will output orphan sections
489d3190795SRafael Espindola   // there so that end symbols point to the correct location.
490d3190795SRafael Espindola   auto E = std::find_if(Cmd->Commands.rbegin(), Cmd->Commands.rend(),
491d3190795SRafael Espindola                         [](const std::unique_ptr<BaseCommand> &Cmd) {
492d3190795SRafael Espindola                           return !isa<SymbolAssignment>(*Cmd);
493d3190795SRafael Espindola                         })
494d3190795SRafael Espindola                .base();
495d3190795SRafael Espindola   for (auto I = Cmd->Commands.begin(); I != E; ++I)
496d3190795SRafael Espindola     process(**I);
49765499b90SRafael Espindola   for (OutputSectionBase<ELFT> *Base : Sections)
498d3190795SRafael Espindola     switchTo(Base);
4992506cb4dSEugene Leviant   flush();
500b31dd370SGeorge Rimar   std::for_each(E, Cmd->Commands.end(),
501b31dd370SGeorge Rimar                 [this](std::unique_ptr<BaseCommand> &B) { process(*B.get()); });
502d3190795SRafael Espindola }
503d3190795SRafael Espindola 
5049546fffbSRafael Espindola template <class ELFT> void LinkerScript<ELFT>::adjustSectionsBeforeSorting() {
5056d38e4dbSRafael Espindola   // It is common practice to use very generic linker scripts. So for any
5066d38e4dbSRafael Espindola   // given run some of the output sections in the script will be empty.
5076d38e4dbSRafael Espindola   // We could create corresponding empty output sections, but that would
5086d38e4dbSRafael Espindola   // clutter the output.
5096d38e4dbSRafael Espindola   // We instead remove trivially empty sections. The bfd linker seems even
5106d38e4dbSRafael Espindola   // more aggressive at removing them.
5116d38e4dbSRafael Espindola   auto Pos = std::remove_if(
5126d38e4dbSRafael Espindola       Opt.Commands.begin(), Opt.Commands.end(),
5136d38e4dbSRafael Espindola       [&](const std::unique_ptr<BaseCommand> &Base) {
5146d38e4dbSRafael Espindola         auto *Cmd = dyn_cast<OutputSectionCommand>(Base.get());
5156d38e4dbSRafael Espindola         if (!Cmd)
5166d38e4dbSRafael Espindola           return false;
5176d38e4dbSRafael Espindola         std::vector<OutputSectionBase<ELFT> *> Secs =
5189257764dSEugene Leviant             findSections(Cmd->Name, *OutputSections);
5196d38e4dbSRafael Espindola         if (!Secs.empty())
5206d38e4dbSRafael Espindola           return false;
5216d38e4dbSRafael Espindola         for (const std::unique_ptr<BaseCommand> &I : Cmd->Commands)
5226d38e4dbSRafael Espindola           if (!isa<InputSectionDescription>(I.get()))
5236d38e4dbSRafael Espindola             return false;
5246d38e4dbSRafael Espindola         return true;
5256d38e4dbSRafael Espindola       });
5266d38e4dbSRafael Espindola   Opt.Commands.erase(Pos, Opt.Commands.end());
5276d38e4dbSRafael Espindola 
5289546fffbSRafael Espindola   // If the output section contains only symbol assignments, create a
5299546fffbSRafael Espindola   // corresponding output section. The bfd linker seems to only create them if
5309546fffbSRafael Espindola   // '.' is assigned to, but creating these section should not have any bad
5319546fffbSRafael Espindola   // consequeces and gives us a section to put the symbol in.
5329546fffbSRafael Espindola   uintX_t Flags = SHF_ALLOC;
5339546fffbSRafael Espindola   uint32_t Type = 0;
5349546fffbSRafael Espindola   for (const std::unique_ptr<BaseCommand> &Base : Opt.Commands) {
5359546fffbSRafael Espindola     auto *Cmd = dyn_cast<OutputSectionCommand>(Base.get());
5369546fffbSRafael Espindola     if (!Cmd)
5379546fffbSRafael Espindola       continue;
5389546fffbSRafael Espindola     std::vector<OutputSectionBase<ELFT> *> Secs =
5399257764dSEugene Leviant         findSections(Cmd->Name, *OutputSections);
5409546fffbSRafael Espindola     if (!Secs.empty()) {
5419546fffbSRafael Espindola       Flags = Secs[0]->getFlags();
5429546fffbSRafael Espindola       Type = Secs[0]->getType();
5439546fffbSRafael Espindola       continue;
5449546fffbSRafael Espindola     }
5459546fffbSRafael Espindola 
5469546fffbSRafael Espindola     auto *OutSec = new OutputSection<ELFT>(Cmd->Name, Type, Flags);
5479546fffbSRafael Espindola     Out<ELFT>::Pool.emplace_back(OutSec);
5489546fffbSRafael Espindola     OutputSections->push_back(OutSec);
5499546fffbSRafael Espindola   }
5509546fffbSRafael Espindola }
5519546fffbSRafael Espindola 
55215c57951SRafael Espindola // When placing orphan sections, we want to place them after symbol assignments
55315c57951SRafael Espindola // so that an orphan after
55415c57951SRafael Espindola //   begin_foo = .;
55515c57951SRafael Espindola //   foo : { *(foo) }
55615c57951SRafael Espindola //   end_foo = .;
55715c57951SRafael Espindola // doesn't break the intended meaning of the begin/end symbols.
55815c57951SRafael Espindola // We don't want to go over sections since Writer<ELFT>::sortSections is the
55915c57951SRafael Espindola // one in charge of deciding the order of the sections.
56015c57951SRafael Espindola // We don't want to go over alignments, since doing so in
56115c57951SRafael Espindola //  rx_sec : { *(rx_sec) }
56215c57951SRafael Espindola //  . = ALIGN(0x1000);
56315c57951SRafael Espindola //  /* The RW PT_LOAD starts here*/
56415c57951SRafael Espindola //  rw_sec : { *(rw_sec) }
56515c57951SRafael Espindola // would mean that the RW PT_LOAD would become unaligned.
56615c57951SRafael Espindola static bool shouldSkip(const BaseCommand &Cmd) {
56715c57951SRafael Espindola   if (isa<OutputSectionCommand>(Cmd))
56815c57951SRafael Espindola     return false;
56915c57951SRafael Espindola   const auto *Assign = dyn_cast<SymbolAssignment>(&Cmd);
57015c57951SRafael Espindola   if (!Assign)
57115c57951SRafael Espindola     return true;
57215c57951SRafael Espindola   return Assign->Name != ".";
57315c57951SRafael Espindola }
57415c57951SRafael Espindola 
5756d91fce5SRafael Espindola template <class ELFT>
5766d91fce5SRafael Espindola void LinkerScript<ELFT>::assignAddresses(std::vector<PhdrEntry<ELFT>> &Phdrs) {
577652852c5SGeorge Rimar   // Orphan sections are sections present in the input files which
5787c18c28cSRui Ueyama   // are not explicitly placed into the output file by the linker script.
5797c18c28cSRui Ueyama   // We place orphan sections at end of file.
5807c18c28cSRui Ueyama   // Other linkers places them using some heuristics as described in
581652852c5SGeorge Rimar   // https://sourceware.org/binutils/docs/ld/Orphan-Sections.html#Orphan-Sections.
582aab6d5c5SRafael Espindola 
583aab6d5c5SRafael Espindola   // The OutputSections are already in the correct order.
584aab6d5c5SRafael Espindola   // This loops creates or moves commands as needed so that they are in the
585aab6d5c5SRafael Espindola   // correct order.
586aab6d5c5SRafael Espindola   int CmdIndex = 0;
587e5cc668eSRui Ueyama   for (OutputSectionBase<ELFT> *Sec : *OutputSections) {
588652852c5SGeorge Rimar     StringRef Name = Sec->getName();
589aab6d5c5SRafael Espindola 
590aab6d5c5SRafael Espindola     // Find the last spot where we can insert a command and still get the
59115c57951SRafael Espindola     // correct result.
592aab6d5c5SRafael Espindola     auto CmdIter = Opt.Commands.begin() + CmdIndex;
593aab6d5c5SRafael Espindola     auto E = Opt.Commands.end();
59415c57951SRafael Espindola     while (CmdIter != E && shouldSkip(**CmdIter)) {
595aab6d5c5SRafael Espindola       ++CmdIter;
596aab6d5c5SRafael Espindola       ++CmdIndex;
597aab6d5c5SRafael Espindola     }
598aab6d5c5SRafael Espindola 
599aab6d5c5SRafael Espindola     auto Pos =
600aab6d5c5SRafael Espindola         std::find_if(CmdIter, E, [&](const std::unique_ptr<BaseCommand> &Base) {
601aab6d5c5SRafael Espindola           auto *Cmd = dyn_cast<OutputSectionCommand>(Base.get());
602aab6d5c5SRafael Espindola           return Cmd && Cmd->Name == Name;
603aab6d5c5SRafael Espindola         });
604aab6d5c5SRafael Espindola     if (Pos == E) {
605aab6d5c5SRafael Espindola       Opt.Commands.insert(CmdIter,
606aab6d5c5SRafael Espindola                           llvm::make_unique<OutputSectionCommand>(Name));
607aab6d5c5SRafael Espindola       ++CmdIndex;
60815c57951SRafael Espindola       continue;
60915c57951SRafael Espindola     }
61015c57951SRafael Espindola 
61115c57951SRafael Espindola     // Continue from where we found it.
61215c57951SRafael Espindola     CmdIndex = (Pos - Opt.Commands.begin()) + 1;
61315c57951SRafael Espindola     continue;
614652852c5SGeorge Rimar   }
615652852c5SGeorge Rimar 
6167c18c28cSRui Ueyama   // Assign addresses as instructed by linker script SECTIONS sub-commands.
617be607334SRafael Espindola   Dot = 0;
618652852c5SGeorge Rimar 
619076fe157SGeorge Rimar   for (const std::unique_ptr<BaseCommand> &Base : Opt.Commands) {
620076fe157SGeorge Rimar     if (auto *Cmd = dyn_cast<SymbolAssignment>(Base.get())) {
6218d083e6aSRui Ueyama       if (Cmd->Name == ".") {
6228d083e6aSRui Ueyama         Dot = Cmd->Expression(Dot);
6238d083e6aSRui Ueyama       } else if (Cmd->Sym) {
6248d083e6aSRui Ueyama         cast<DefinedRegular<ELFT>>(Cmd->Sym)->Value = Cmd->Expression(Dot);
6258d083e6aSRui Ueyama       }
62605ef4cffSRui Ueyama       continue;
627652852c5SGeorge Rimar     }
628652852c5SGeorge Rimar 
629eefa758eSGeorge Rimar     if (auto *Cmd = dyn_cast<AssertCommand>(Base.get())) {
630eefa758eSGeorge Rimar       Cmd->Expression(Dot);
631eefa758eSGeorge Rimar       continue;
632eefa758eSGeorge Rimar     }
633eefa758eSGeorge Rimar 
634076fe157SGeorge Rimar     auto *Cmd = cast<OutputSectionCommand>(Base.get());
635652852c5SGeorge Rimar 
63658e5c4dcSGeorge Rimar     if (Cmd->AddrExpr)
63758e5c4dcSGeorge Rimar       Dot = Cmd->AddrExpr(Dot);
63858e5c4dcSGeorge Rimar 
639d3190795SRafael Espindola     assignOffsets(Cmd);
640a14b13d8SGeorge Rimar   }
641467c4d55SEugene Leviant 
642aab6d5c5SRafael Espindola   uintX_t MinVA = std::numeric_limits<uintX_t>::max();
643aab6d5c5SRafael Espindola   for (OutputSectionBase<ELFT> *Sec : *OutputSections) {
644aab6d5c5SRafael Espindola     if (Sec->getFlags() & SHF_ALLOC)
645aab6d5c5SRafael Espindola       MinVA = std::min(MinVA, Sec->getVA());
646aab6d5c5SRafael Espindola     else
647d3190795SRafael Espindola       Sec->setVA(0);
648aab6d5c5SRafael Espindola   }
649aab6d5c5SRafael Espindola 
6500d4b6d5cSRafael Espindola   uintX_t HeaderSize = getHeaderSize();
6516d91fce5SRafael Espindola   auto FirstPTLoad =
6526d91fce5SRafael Espindola       std::find_if(Phdrs.begin(), Phdrs.end(), [](const PhdrEntry<ELFT> &E) {
6536d91fce5SRafael Espindola         return E.H.p_type == PT_LOAD;
6546d91fce5SRafael Espindola       });
6556d91fce5SRafael Espindola   if (HeaderSize <= MinVA && FirstPTLoad != Phdrs.end()) {
65664c32d6fSRafael Espindola     // ELF and Program headers need to be right before the first section in
657b91e7118SGeorge Rimar     // memory. Set their addresses accordingly.
6584ec013acSRafael Espindola     MinVA = alignDown(MinVA - HeaderSize, Target->PageSize);
659467c4d55SEugene Leviant     Out<ELFT>::ElfHeader->setVA(MinVA);
660467c4d55SEugene Leviant     Out<ELFT>::ProgramHeaders->setVA(Out<ELFT>::ElfHeader->getSize() + MinVA);
6616d91fce5SRafael Espindola     FirstPTLoad->First = Out<ELFT>::ElfHeader;
6626d91fce5SRafael Espindola     if (!FirstPTLoad->Last)
6636d91fce5SRafael Espindola       FirstPTLoad->Last = Out<ELFT>::ProgramHeaders;
664cd8eaf89SEugene Leviant   } else if (!FirstPTLoad->First) {
665cd8eaf89SEugene Leviant     // Sometimes the very first PT_LOAD segment can be empty.
666cd8eaf89SEugene Leviant     // This happens if (all conditions met):
667cd8eaf89SEugene Leviant     //  - Linker script is used
668cd8eaf89SEugene Leviant     //  - First section in ELF image is not RO
669cd8eaf89SEugene Leviant     //  - Not enough space for program headers.
670cd8eaf89SEugene Leviant     // The code below removes empty PT_LOAD segment and updates
671cd8eaf89SEugene Leviant     // program headers size.
672cd8eaf89SEugene Leviant     Phdrs.erase(FirstPTLoad);
673cd8eaf89SEugene Leviant     Out<ELFT>::ProgramHeaders->setSize(sizeof(typename ELFT::Phdr) *
674cd8eaf89SEugene Leviant                                        Phdrs.size());
6756d91fce5SRafael Espindola   }
676fb8978fcSDima Stepanov }
677652852c5SGeorge Rimar 
678464daadcSRui Ueyama // Creates program headers as instructed by PHDRS linker script command.
67907320e40SRui Ueyama template <class ELFT>
680a4b41dcaSRafael Espindola std::vector<PhdrEntry<ELFT>> LinkerScript<ELFT>::createPhdrs() {
681edebbdf1SRui Ueyama   std::vector<PhdrEntry<ELFT>> Ret;
682bbe38602SEugene Leviant 
683464daadcSRui Ueyama   // Process PHDRS and FILEHDR keywords because they are not
684464daadcSRui Ueyama   // real output sections and cannot be added in the following loop.
685*ce30b1c7SEugene Leviant   std::vector<size_t> DefPhdrIds;
686bbe38602SEugene Leviant   for (const PhdrsCommand &Cmd : Opt.PhdrsCommands) {
687edebbdf1SRui Ueyama     Ret.emplace_back(Cmd.Type, Cmd.Flags == UINT_MAX ? PF_R : Cmd.Flags);
688edebbdf1SRui Ueyama     PhdrEntry<ELFT> &Phdr = Ret.back();
689bbe38602SEugene Leviant 
690bbe38602SEugene Leviant     if (Cmd.HasFilehdr)
691adca245fSRui Ueyama       Phdr.add(Out<ELFT>::ElfHeader);
692bbe38602SEugene Leviant     if (Cmd.HasPhdrs)
693adca245fSRui Ueyama       Phdr.add(Out<ELFT>::ProgramHeaders);
69456b21c86SEugene Leviant 
69556b21c86SEugene Leviant     if (Cmd.LMAExpr) {
69656b21c86SEugene Leviant       Phdr.H.p_paddr = Cmd.LMAExpr(0);
69756b21c86SEugene Leviant       Phdr.HasLMA = true;
69856b21c86SEugene Leviant     }
699*ce30b1c7SEugene Leviant 
700*ce30b1c7SEugene Leviant     // If output section command doesn't specify any segments,
701*ce30b1c7SEugene Leviant     // and we haven't previously assigned any section to segment,
702*ce30b1c7SEugene Leviant     // then we simply assign section to the very first load segment.
703*ce30b1c7SEugene Leviant     // Below is an example of such linker script:
704*ce30b1c7SEugene Leviant     // PHDRS { seg PT_LOAD; }
705*ce30b1c7SEugene Leviant     // SECTIONS { .aaa : { *(.aaa) } }
706*ce30b1c7SEugene Leviant     if (DefPhdrIds.empty() && Phdr.H.p_type == PT_LOAD)
707*ce30b1c7SEugene Leviant       DefPhdrIds.push_back(Ret.size() - 1);
708bbe38602SEugene Leviant   }
709bbe38602SEugene Leviant 
710464daadcSRui Ueyama   // Add output sections to program headers.
711464daadcSRui Ueyama   for (OutputSectionBase<ELFT> *Sec : *OutputSections) {
712bbe38602SEugene Leviant     if (!(Sec->getFlags() & SHF_ALLOC))
713bbe38602SEugene Leviant       break;
714bbe38602SEugene Leviant 
715edebbdf1SRui Ueyama     std::vector<size_t> PhdrIds = getPhdrIndices(Sec->getName());
716*ce30b1c7SEugene Leviant     if (PhdrIds.empty())
717*ce30b1c7SEugene Leviant       PhdrIds = std::move(DefPhdrIds);
718*ce30b1c7SEugene Leviant 
719bbe38602SEugene Leviant     // Assign headers specified by linker script
720bbe38602SEugene Leviant     for (size_t Id : PhdrIds) {
721edebbdf1SRui Ueyama       Ret[Id].add(Sec);
722865bf863SEugene Leviant       if (Opt.PhdrsCommands[Id].Flags == UINT_MAX)
7230b113671SRafael Espindola         Ret[Id].H.p_flags |= Sec->getPhdrFlags();
724bbe38602SEugene Leviant     }
725*ce30b1c7SEugene Leviant     DefPhdrIds = std::move(PhdrIds);
726bbe38602SEugene Leviant   }
727edebbdf1SRui Ueyama   return Ret;
728bbe38602SEugene Leviant }
729bbe38602SEugene Leviant 
730f9bc3bd2SEugene Leviant template <class ELFT> bool LinkerScript<ELFT>::ignoreInterpSection() {
731f9bc3bd2SEugene Leviant   // Ignore .interp section in case we have PHDRS specification
732f9bc3bd2SEugene Leviant   // and PT_INTERP isn't listed.
733f9bc3bd2SEugene Leviant   return !Opt.PhdrsCommands.empty() &&
734f9bc3bd2SEugene Leviant          llvm::find_if(Opt.PhdrsCommands, [](const PhdrsCommand &Cmd) {
735f9bc3bd2SEugene Leviant            return Cmd.Type == PT_INTERP;
736f9bc3bd2SEugene Leviant          }) == Opt.PhdrsCommands.end();
737f9bc3bd2SEugene Leviant }
738f9bc3bd2SEugene Leviant 
739bbe38602SEugene Leviant template <class ELFT>
74007320e40SRui Ueyama ArrayRef<uint8_t> LinkerScript<ELFT>::getFiller(StringRef Name) {
741f6c3ccefSGeorge Rimar   for (const std::unique_ptr<BaseCommand> &Base : Opt.Commands)
742f6c3ccefSGeorge Rimar     if (auto *Cmd = dyn_cast<OutputSectionCommand>(Base.get()))
743f6c3ccefSGeorge Rimar       if (Cmd->Name == Name)
744f6c3ccefSGeorge Rimar         return Cmd->Filler;
745e2ee72b5SGeorge Rimar   return {};
746e2ee72b5SGeorge Rimar }
747e2ee72b5SGeorge Rimar 
748e38cbab5SGeorge Rimar template <class ELFT>
749e38cbab5SGeorge Rimar static void writeInt(uint8_t *Buf, uint64_t Data, uint64_t Size) {
750e38cbab5SGeorge Rimar   const endianness E = ELFT::TargetEndianness;
751e38cbab5SGeorge Rimar 
752e38cbab5SGeorge Rimar   switch (Size) {
753e38cbab5SGeorge Rimar   case 1:
754e38cbab5SGeorge Rimar     *Buf = (uint8_t)Data;
755e38cbab5SGeorge Rimar     break;
756e38cbab5SGeorge Rimar   case 2:
757e38cbab5SGeorge Rimar     write16<E>(Buf, Data);
758e38cbab5SGeorge Rimar     break;
759e38cbab5SGeorge Rimar   case 4:
760e38cbab5SGeorge Rimar     write32<E>(Buf, Data);
761e38cbab5SGeorge Rimar     break;
762e38cbab5SGeorge Rimar   case 8:
763e38cbab5SGeorge Rimar     write64<E>(Buf, Data);
764e38cbab5SGeorge Rimar     break;
765e38cbab5SGeorge Rimar   default:
766e38cbab5SGeorge Rimar     llvm_unreachable("unsupported Size argument");
767e38cbab5SGeorge Rimar   }
768e38cbab5SGeorge Rimar }
769e38cbab5SGeorge Rimar 
770e38cbab5SGeorge Rimar template <class ELFT>
771e38cbab5SGeorge Rimar void LinkerScript<ELFT>::writeDataBytes(StringRef Name, uint8_t *Buf) {
772e38cbab5SGeorge Rimar   int I = getSectionIndex(Name);
773e38cbab5SGeorge Rimar   if (I == INT_MAX)
774e38cbab5SGeorge Rimar     return;
775e38cbab5SGeorge Rimar 
776e38cbab5SGeorge Rimar   OutputSectionCommand *Cmd =
777e38cbab5SGeorge Rimar       dyn_cast<OutputSectionCommand>(Opt.Commands[I].get());
778e38cbab5SGeorge Rimar   for (const std::unique_ptr<BaseCommand> &Base2 : Cmd->Commands)
779e38cbab5SGeorge Rimar     if (auto *DataCmd = dyn_cast<BytesDataCommand>(Base2.get()))
780e38cbab5SGeorge Rimar       writeInt<ELFT>(&Buf[DataCmd->Offset], DataCmd->Data, DataCmd->Size);
781e38cbab5SGeorge Rimar }
782e38cbab5SGeorge Rimar 
783b71d6f7aSEugene Leviant template <class ELFT> bool LinkerScript<ELFT>::hasLMA(StringRef Name) {
7848ceadb38SGeorge Rimar   for (const std::unique_ptr<BaseCommand> &Base : Opt.Commands)
7858ceadb38SGeorge Rimar     if (auto *Cmd = dyn_cast<OutputSectionCommand>(Base.get()))
786b71d6f7aSEugene Leviant       if (Cmd->LMAExpr && Cmd->Name == Name)
787b71d6f7aSEugene Leviant         return true;
788b71d6f7aSEugene Leviant   return false;
7898ceadb38SGeorge Rimar }
7908ceadb38SGeorge Rimar 
791c3e2a4b0SRui Ueyama // Returns the index of the given section name in linker script
792c3e2a4b0SRui Ueyama // SECTIONS commands. Sections are laid out as the same order as they
793c3e2a4b0SRui Ueyama // were in the script. If a given name did not appear in the script,
794c3e2a4b0SRui Ueyama // it returns INT_MAX, so that it will be laid out at end of file.
795076fe157SGeorge Rimar template <class ELFT> int LinkerScript<ELFT>::getSectionIndex(StringRef Name) {
796f510fa6bSRui Ueyama   int I = 0;
797f510fa6bSRui Ueyama   for (std::unique_ptr<BaseCommand> &Base : Opt.Commands) {
798076fe157SGeorge Rimar     if (auto *Cmd = dyn_cast<OutputSectionCommand>(Base.get()))
799076fe157SGeorge Rimar       if (Cmd->Name == Name)
800f510fa6bSRui Ueyama         return I;
801f510fa6bSRui Ueyama     ++I;
802f510fa6bSRui Ueyama   }
803f510fa6bSRui Ueyama   return INT_MAX;
80471b26e94SGeorge Rimar }
80571b26e94SGeorge Rimar 
806bbe38602SEugene Leviant template <class ELFT> bool LinkerScript<ELFT>::hasPhdrsCommands() {
807bbe38602SEugene Leviant   return !Opt.PhdrsCommands.empty();
808bbe38602SEugene Leviant }
809bbe38602SEugene Leviant 
8109e69450eSGeorge Rimar template <class ELFT>
811884e786dSGeorge Rimar uint64_t LinkerScript<ELFT>::getOutputSectionAddress(StringRef Name) {
81296659df0SGeorge Rimar   for (OutputSectionBase<ELFT> *Sec : *OutputSections)
81396659df0SGeorge Rimar     if (Sec->getName() == Name)
81496659df0SGeorge Rimar       return Sec->getVA();
81596659df0SGeorge Rimar   error("undefined section " + Name);
81696659df0SGeorge Rimar   return 0;
81796659df0SGeorge Rimar }
81896659df0SGeorge Rimar 
81996659df0SGeorge Rimar template <class ELFT>
820b71d6f7aSEugene Leviant uint64_t LinkerScript<ELFT>::getOutputSectionLMA(StringRef Name) {
821b71d6f7aSEugene Leviant   for (OutputSectionBase<ELFT> *Sec : *OutputSections)
822b71d6f7aSEugene Leviant     if (Sec->getName() == Name)
823b71d6f7aSEugene Leviant       return Sec->getLMA();
824b71d6f7aSEugene Leviant   error("undefined section " + Name);
825b71d6f7aSEugene Leviant   return 0;
826b71d6f7aSEugene Leviant }
827b71d6f7aSEugene Leviant 
828b71d6f7aSEugene Leviant template <class ELFT>
829884e786dSGeorge Rimar uint64_t LinkerScript<ELFT>::getOutputSectionSize(StringRef Name) {
8309e69450eSGeorge Rimar   for (OutputSectionBase<ELFT> *Sec : *OutputSections)
8319e69450eSGeorge Rimar     if (Sec->getName() == Name)
8329e69450eSGeorge Rimar       return Sec->getSize();
8339e69450eSGeorge Rimar   error("undefined section " + Name);
8349e69450eSGeorge Rimar   return 0;
8359e69450eSGeorge Rimar }
8369e69450eSGeorge Rimar 
83736fac7f0SEugene Leviant template <class ELFT>
83836fac7f0SEugene Leviant uint64_t LinkerScript<ELFT>::getOutputSectionAlign(StringRef Name) {
83936fac7f0SEugene Leviant   for (OutputSectionBase<ELFT> *Sec : *OutputSections)
84036fac7f0SEugene Leviant     if (Sec->getName() == Name)
84136fac7f0SEugene Leviant       return Sec->getAlignment();
84236fac7f0SEugene Leviant   error("undefined section " + Name);
84336fac7f0SEugene Leviant   return 0;
84436fac7f0SEugene Leviant }
84536fac7f0SEugene Leviant 
846884e786dSGeorge Rimar template <class ELFT> uint64_t LinkerScript<ELFT>::getHeaderSize() {
8470d4b6d5cSRafael Espindola   return elf::getHeaderSize<ELFT>();
848e32a3598SGeorge Rimar }
849e32a3598SGeorge Rimar 
850884e786dSGeorge Rimar template <class ELFT> uint64_t LinkerScript<ELFT>::getSymbolValue(StringRef S) {
851884e786dSGeorge Rimar   if (SymbolBody *B = Symtab<ELFT>::X->find(S))
852884e786dSGeorge Rimar     return B->getVA<ELFT>();
853884e786dSGeorge Rimar   error("symbol not found: " + S);
854884e786dSGeorge Rimar   return 0;
855884e786dSGeorge Rimar }
856884e786dSGeorge Rimar 
857f34f45fdSGeorge Rimar template <class ELFT> bool LinkerScript<ELFT>::isDefined(StringRef S) {
858f34f45fdSGeorge Rimar   return Symtab<ELFT>::X->find(S) != nullptr;
859f34f45fdSGeorge Rimar }
860f34f45fdSGeorge Rimar 
861bbe38602SEugene Leviant // Returns indices of ELF headers containing specific section, identified
862bbe38602SEugene Leviant // by Name. Each index is a zero based number of ELF header listed within
863bbe38602SEugene Leviant // PHDRS {} script block.
864bbe38602SEugene Leviant template <class ELFT>
865edebbdf1SRui Ueyama std::vector<size_t> LinkerScript<ELFT>::getPhdrIndices(StringRef SectionName) {
866076fe157SGeorge Rimar   for (const std::unique_ptr<BaseCommand> &Base : Opt.Commands) {
867076fe157SGeorge Rimar     auto *Cmd = dyn_cast<OutputSectionCommand>(Base.get());
868edebbdf1SRui Ueyama     if (!Cmd || Cmd->Name != SectionName)
86931d842f5SGeorge Rimar       continue;
87031d842f5SGeorge Rimar 
87129c5a2a9SRui Ueyama     std::vector<size_t> Ret;
87229c5a2a9SRui Ueyama     for (StringRef PhdrName : Cmd->Phdrs)
87329c5a2a9SRui Ueyama       Ret.push_back(getPhdrIndex(PhdrName));
87429c5a2a9SRui Ueyama     return Ret;
875bbe38602SEugene Leviant   }
87631d842f5SGeorge Rimar   return {};
87731d842f5SGeorge Rimar }
878bbe38602SEugene Leviant 
87929c5a2a9SRui Ueyama template <class ELFT>
88029c5a2a9SRui Ueyama size_t LinkerScript<ELFT>::getPhdrIndex(StringRef PhdrName) {
88129c5a2a9SRui Ueyama   size_t I = 0;
88229c5a2a9SRui Ueyama   for (PhdrsCommand &Cmd : Opt.PhdrsCommands) {
88329c5a2a9SRui Ueyama     if (Cmd.Name == PhdrName)
88429c5a2a9SRui Ueyama       return I;
88529c5a2a9SRui Ueyama     ++I;
88629c5a2a9SRui Ueyama   }
88729c5a2a9SRui Ueyama   error("section header '" + PhdrName + "' is not listed in PHDRS");
88829c5a2a9SRui Ueyama   return 0;
88929c5a2a9SRui Ueyama }
89029c5a2a9SRui Ueyama 
89107320e40SRui Ueyama class elf::ScriptParser : public ScriptParserBase {
892c3794e58SGeorge Rimar   typedef void (ScriptParser::*Handler)();
893c3794e58SGeorge Rimar 
894f7c5fbb1SRui Ueyama public:
89507320e40SRui Ueyama   ScriptParser(StringRef S, bool B) : ScriptParserBase(S), IsUnderSysroot(B) {}
896f23b2320SGeorge Rimar 
89720b6598cSGeorge Rimar   void readLinkerScript();
89820b6598cSGeorge Rimar   void readVersionScript();
899f7c5fbb1SRui Ueyama 
900f7c5fbb1SRui Ueyama private:
90152a1509eSRui Ueyama   void addFile(StringRef Path);
90252a1509eSRui Ueyama 
903f7c5fbb1SRui Ueyama   void readAsNeeded();
90490c5099eSDenis Protivensky   void readEntry();
90583f406cfSGeorge Rimar   void readExtern();
906f7c5fbb1SRui Ueyama   void readGroup();
90731aa1f83SRui Ueyama   void readInclude();
908ee59282bSRui Ueyama   void readOutput();
9099159ce93SDavide Italiano   void readOutputArch();
910f7c5fbb1SRui Ueyama   void readOutputFormat();
911bbe38602SEugene Leviant   void readPhdrs();
91268a39a65SDavide Italiano   void readSearchDir();
9138e3b38abSDenis Protivensky   void readSections();
91495769b4aSRui Ueyama   void readVersion();
91595769b4aSRui Ueyama   void readVersionScriptCommand();
9168e3b38abSDenis Protivensky 
917113cdec9SRui Ueyama   SymbolAssignment *readAssignment(StringRef Name);
918e38cbab5SGeorge Rimar   BytesDataCommand *readBytesDataCommand(StringRef Tok);
919ff1f29e0SGeorge Rimar   std::vector<uint8_t> readFill();
92010416564SRui Ueyama   OutputSectionCommand *readOutputSectionDescription(StringRef OutSec);
921ff1f29e0SGeorge Rimar   std::vector<uint8_t> readOutputSectionFiller(StringRef Tok);
922bbe38602SEugene Leviant   std::vector<StringRef> readOutputSectionPhdrs();
923a2496cbeSGeorge Rimar   InputSectionDescription *readInputSectionDescription(StringRef Tok);
924c91930a1SGeorge Rimar   Regex readFilePatterns();
92507171f21SGeorge Rimar   std::vector<SectionPattern> readInputSectionsList();
926a2496cbeSGeorge Rimar   InputSectionDescription *readInputSectionRules(StringRef FilePattern);
927bbe38602SEugene Leviant   unsigned readPhdrType();
928be394db3SGeorge Rimar   SortSectionPolicy readSortKind();
929a35e39caSPetr Hosek   SymbolAssignment *readProvideHidden(bool Provide, bool Hidden);
930db741e72SEugene Leviant   SymbolAssignment *readProvideOrAssignment(StringRef Tok, bool MakeAbsolute);
93103fc010eSGeorge Rimar   void readSort();
932eefa758eSGeorge Rimar   Expr readAssert();
933708019c4SRui Ueyama 
934708019c4SRui Ueyama   Expr readExpr();
935708019c4SRui Ueyama   Expr readExpr1(Expr Lhs, int MinPrec);
936b71d6f7aSEugene Leviant   StringRef readParenLiteral();
937708019c4SRui Ueyama   Expr readPrimary();
938708019c4SRui Ueyama   Expr readTernary(Expr Cond);
9396ad7dfccSRui Ueyama   Expr readParenExpr();
940f7c5fbb1SRui Ueyama 
94120b6598cSGeorge Rimar   // For parsing version script.
94220b6598cSGeorge Rimar   void readExtern(std::vector<SymbolVersion> *Globals);
94395769b4aSRui Ueyama   void readVersionDeclaration(StringRef VerStr);
94420b6598cSGeorge Rimar   void readGlobal(StringRef VerStr);
94520b6598cSGeorge Rimar   void readLocal();
94620b6598cSGeorge Rimar 
94707320e40SRui Ueyama   ScriptConfiguration &Opt = *ScriptConfig;
94807320e40SRui Ueyama   StringSaver Saver = {ScriptConfig->Alloc};
94916b0cc9eSSimon Atanasyan   bool IsUnderSysroot;
950f7c5fbb1SRui Ueyama };
951f7c5fbb1SRui Ueyama 
95220b6598cSGeorge Rimar void ScriptParser::readVersionScript() {
95395769b4aSRui Ueyama   readVersionScriptCommand();
95420b6598cSGeorge Rimar   if (!atEOF())
95595769b4aSRui Ueyama     setError("EOF expected, but got " + next());
95695769b4aSRui Ueyama }
95795769b4aSRui Ueyama 
95895769b4aSRui Ueyama void ScriptParser::readVersionScriptCommand() {
95983043f23SRui Ueyama   if (consume("{")) {
96095769b4aSRui Ueyama     readVersionDeclaration("");
96120b6598cSGeorge Rimar     return;
96220b6598cSGeorge Rimar   }
96320b6598cSGeorge Rimar 
96495769b4aSRui Ueyama   while (!atEOF() && !Error && peek() != "}") {
96520b6598cSGeorge Rimar     StringRef VerStr = next();
96620b6598cSGeorge Rimar     if (VerStr == "{") {
96795769b4aSRui Ueyama       setError("anonymous version definition is used in "
96895769b4aSRui Ueyama                "combination with other version definitions");
96920b6598cSGeorge Rimar       return;
97020b6598cSGeorge Rimar     }
97120b6598cSGeorge Rimar     expect("{");
97295769b4aSRui Ueyama     readVersionDeclaration(VerStr);
97320b6598cSGeorge Rimar   }
97420b6598cSGeorge Rimar }
97520b6598cSGeorge Rimar 
97695769b4aSRui Ueyama void ScriptParser::readVersion() {
97795769b4aSRui Ueyama   expect("{");
97895769b4aSRui Ueyama   readVersionScriptCommand();
97995769b4aSRui Ueyama   expect("}");
98095769b4aSRui Ueyama }
98195769b4aSRui Ueyama 
98220b6598cSGeorge Rimar void ScriptParser::readLinkerScript() {
983f7c5fbb1SRui Ueyama   while (!atEOF()) {
984f7c5fbb1SRui Ueyama     StringRef Tok = next();
985a27eeccaSRui Ueyama     if (Tok == ";")
986a27eeccaSRui Ueyama       continue;
987a27eeccaSRui Ueyama 
98820d03194SEugene Leviant     if (Tok == "ASSERT") {
98920d03194SEugene Leviant       Opt.Commands.emplace_back(new AssertCommand(readAssert()));
99020d03194SEugene Leviant     } else if (Tok == "ENTRY") {
991a27eeccaSRui Ueyama       readEntry();
992a27eeccaSRui Ueyama     } else if (Tok == "EXTERN") {
993a27eeccaSRui Ueyama       readExtern();
994a27eeccaSRui Ueyama     } else if (Tok == "GROUP" || Tok == "INPUT") {
995a27eeccaSRui Ueyama       readGroup();
996a27eeccaSRui Ueyama     } else if (Tok == "INCLUDE") {
997a27eeccaSRui Ueyama       readInclude();
998a27eeccaSRui Ueyama     } else if (Tok == "OUTPUT") {
999a27eeccaSRui Ueyama       readOutput();
1000a27eeccaSRui Ueyama     } else if (Tok == "OUTPUT_ARCH") {
1001a27eeccaSRui Ueyama       readOutputArch();
1002a27eeccaSRui Ueyama     } else if (Tok == "OUTPUT_FORMAT") {
1003a27eeccaSRui Ueyama       readOutputFormat();
1004a27eeccaSRui Ueyama     } else if (Tok == "PHDRS") {
1005a27eeccaSRui Ueyama       readPhdrs();
1006a27eeccaSRui Ueyama     } else if (Tok == "SEARCH_DIR") {
1007a27eeccaSRui Ueyama       readSearchDir();
1008a27eeccaSRui Ueyama     } else if (Tok == "SECTIONS") {
1009a27eeccaSRui Ueyama       readSections();
1010a27eeccaSRui Ueyama     } else if (Tok == "VERSION") {
1011a27eeccaSRui Ueyama       readVersion();
1012db741e72SEugene Leviant     } else if (SymbolAssignment *Cmd = readProvideOrAssignment(Tok, true)) {
10130df80befSPetr Hosek       Opt.Commands.emplace_back(Cmd);
1014e5d3ca50SPetr Hosek     } else {
10155761042dSGeorge Rimar       setError("unknown directive: " + Tok);
1016f7c5fbb1SRui Ueyama     }
1017f7c5fbb1SRui Ueyama   }
1018e5d3ca50SPetr Hosek }
1019f7c5fbb1SRui Ueyama 
1020717677afSRui Ueyama void ScriptParser::addFile(StringRef S) {
102116b0cc9eSSimon Atanasyan   if (IsUnderSysroot && S.startswith("/")) {
10225af1687fSJustin Bogner     SmallString<128> PathData;
10235af1687fSJustin Bogner     StringRef Path = (Config->Sysroot + S).toStringRef(PathData);
102416b0cc9eSSimon Atanasyan     if (sys::fs::exists(Path)) {
10255af1687fSJustin Bogner       Driver->addFile(Saver.save(Path));
102616b0cc9eSSimon Atanasyan       return;
102716b0cc9eSSimon Atanasyan     }
102816b0cc9eSSimon Atanasyan   }
102916b0cc9eSSimon Atanasyan 
1030f03f3cc1SRui Ueyama   if (sys::path::is_absolute(S)) {
103152a1509eSRui Ueyama     Driver->addFile(S);
103252a1509eSRui Ueyama   } else if (S.startswith("=")) {
103352a1509eSRui Ueyama     if (Config->Sysroot.empty())
103452a1509eSRui Ueyama       Driver->addFile(S.substr(1));
103552a1509eSRui Ueyama     else
103652a1509eSRui Ueyama       Driver->addFile(Saver.save(Config->Sysroot + "/" + S.substr(1)));
103752a1509eSRui Ueyama   } else if (S.startswith("-l")) {
103821eecb4fSRui Ueyama     Driver->addLibrary(S.substr(2));
1039a1b8fc3bSSimon Atanasyan   } else if (sys::fs::exists(S)) {
1040a1b8fc3bSSimon Atanasyan     Driver->addFile(S);
104152a1509eSRui Ueyama   } else {
104252a1509eSRui Ueyama     std::string Path = findFromSearchPaths(S);
104352a1509eSRui Ueyama     if (Path.empty())
1044777f9630SGeorge Rimar       setError("unable to find " + S);
1045025d59b1SRui Ueyama     else
104652a1509eSRui Ueyama       Driver->addFile(Saver.save(Path));
104752a1509eSRui Ueyama   }
104852a1509eSRui Ueyama }
104952a1509eSRui Ueyama 
1050717677afSRui Ueyama void ScriptParser::readAsNeeded() {
1051f7c5fbb1SRui Ueyama   expect("(");
105235da9b6eSRui Ueyama   bool Orig = Config->AsNeeded;
105335da9b6eSRui Ueyama   Config->AsNeeded = true;
105483043f23SRui Ueyama   while (!Error && !consume(")"))
1055cd574a5eSGeorge Rimar     addFile(unquote(next()));
105635da9b6eSRui Ueyama   Config->AsNeeded = Orig;
1057f7c5fbb1SRui Ueyama }
1058f7c5fbb1SRui Ueyama 
1059717677afSRui Ueyama void ScriptParser::readEntry() {
106090c5099eSDenis Protivensky   // -e <symbol> takes predecence over ENTRY(<symbol>).
106190c5099eSDenis Protivensky   expect("(");
106290c5099eSDenis Protivensky   StringRef Tok = next();
106390c5099eSDenis Protivensky   if (Config->Entry.empty())
106490c5099eSDenis Protivensky     Config->Entry = Tok;
106590c5099eSDenis Protivensky   expect(")");
106690c5099eSDenis Protivensky }
106790c5099eSDenis Protivensky 
1068717677afSRui Ueyama void ScriptParser::readExtern() {
106983f406cfSGeorge Rimar   expect("(");
107083043f23SRui Ueyama   while (!Error && !consume(")"))
1071a2acc931SRui Ueyama     Config->Undefined.push_back(next());
107283f406cfSGeorge Rimar }
107383f406cfSGeorge Rimar 
1074717677afSRui Ueyama void ScriptParser::readGroup() {
1075f7c5fbb1SRui Ueyama   expect("(");
107683043f23SRui Ueyama   while (!Error && !consume(")")) {
1077f7c5fbb1SRui Ueyama     StringRef Tok = next();
1078a2acc931SRui Ueyama     if (Tok == "AS_NEEDED")
1079f7c5fbb1SRui Ueyama       readAsNeeded();
1080a2acc931SRui Ueyama     else
1081cd574a5eSGeorge Rimar       addFile(unquote(Tok));
1082f7c5fbb1SRui Ueyama   }
1083f7c5fbb1SRui Ueyama }
1084f7c5fbb1SRui Ueyama 
1085717677afSRui Ueyama void ScriptParser::readInclude() {
108631aa1f83SRui Ueyama   StringRef Tok = next();
1087cd574a5eSGeorge Rimar   auto MBOrErr = MemoryBuffer::getFile(unquote(Tok));
1088025d59b1SRui Ueyama   if (!MBOrErr) {
10895761042dSGeorge Rimar     setError("cannot open " + Tok);
1090025d59b1SRui Ueyama     return;
1091025d59b1SRui Ueyama   }
109231aa1f83SRui Ueyama   std::unique_ptr<MemoryBuffer> &MB = *MBOrErr;
1093a47ee68dSRui Ueyama   StringRef S = Saver.save(MB->getMemBufferRef().getBuffer());
1094a47ee68dSRui Ueyama   std::vector<StringRef> V = tokenize(S);
109531aa1f83SRui Ueyama   Tokens.insert(Tokens.begin() + Pos, V.begin(), V.end());
109631aa1f83SRui Ueyama }
109731aa1f83SRui Ueyama 
1098717677afSRui Ueyama void ScriptParser::readOutput() {
1099ee59282bSRui Ueyama   // -o <file> takes predecence over OUTPUT(<file>).
1100ee59282bSRui Ueyama   expect("(");
1101ee59282bSRui Ueyama   StringRef Tok = next();
1102ee59282bSRui Ueyama   if (Config->OutputFile.empty())
1103cd574a5eSGeorge Rimar     Config->OutputFile = unquote(Tok);
1104ee59282bSRui Ueyama   expect(")");
1105ee59282bSRui Ueyama }
1106ee59282bSRui Ueyama 
1107717677afSRui Ueyama void ScriptParser::readOutputArch() {
11089159ce93SDavide Italiano   // Error checking only for now.
11099159ce93SDavide Italiano   expect("(");
11105424e7c7SJustin Bogner   skip();
11119159ce93SDavide Italiano   expect(")");
11129159ce93SDavide Italiano }
11139159ce93SDavide Italiano 
1114717677afSRui Ueyama void ScriptParser::readOutputFormat() {
1115f7c5fbb1SRui Ueyama   // Error checking only for now.
1116f7c5fbb1SRui Ueyama   expect("(");
11175424e7c7SJustin Bogner   skip();
11186836c618SDavide Italiano   StringRef Tok = next();
11196836c618SDavide Italiano   if (Tok == ")")
11206836c618SDavide Italiano     return;
1121025d59b1SRui Ueyama   if (Tok != ",") {
11225761042dSGeorge Rimar     setError("unexpected token: " + Tok);
1123025d59b1SRui Ueyama     return;
1124025d59b1SRui Ueyama   }
11255424e7c7SJustin Bogner   skip();
11266836c618SDavide Italiano   expect(",");
11275424e7c7SJustin Bogner   skip();
1128f7c5fbb1SRui Ueyama   expect(")");
1129f7c5fbb1SRui Ueyama }
1130f7c5fbb1SRui Ueyama 
1131bbe38602SEugene Leviant void ScriptParser::readPhdrs() {
1132bbe38602SEugene Leviant   expect("{");
113383043f23SRui Ueyama   while (!Error && !consume("}")) {
1134bbe38602SEugene Leviant     StringRef Tok = next();
113556b21c86SEugene Leviant     Opt.PhdrsCommands.push_back(
113656b21c86SEugene Leviant         {Tok, PT_NULL, false, false, UINT_MAX, nullptr});
1137bbe38602SEugene Leviant     PhdrsCommand &PhdrCmd = Opt.PhdrsCommands.back();
1138bbe38602SEugene Leviant 
1139bbe38602SEugene Leviant     PhdrCmd.Type = readPhdrType();
1140bbe38602SEugene Leviant     do {
1141bbe38602SEugene Leviant       Tok = next();
1142bbe38602SEugene Leviant       if (Tok == ";")
1143bbe38602SEugene Leviant         break;
1144bbe38602SEugene Leviant       if (Tok == "FILEHDR")
1145bbe38602SEugene Leviant         PhdrCmd.HasFilehdr = true;
1146bbe38602SEugene Leviant       else if (Tok == "PHDRS")
1147bbe38602SEugene Leviant         PhdrCmd.HasPhdrs = true;
114856b21c86SEugene Leviant       else if (Tok == "AT")
114956b21c86SEugene Leviant         PhdrCmd.LMAExpr = readParenExpr();
1150865bf863SEugene Leviant       else if (Tok == "FLAGS") {
1151865bf863SEugene Leviant         expect("(");
1152eb685cd7SRafael Espindola         // Passing 0 for the value of dot is a bit of a hack. It means that
1153eb685cd7SRafael Espindola         // we accept expressions like ".|1".
1154eb685cd7SRafael Espindola         PhdrCmd.Flags = readExpr()(0);
1155865bf863SEugene Leviant         expect(")");
1156865bf863SEugene Leviant       } else
1157bbe38602SEugene Leviant         setError("unexpected header attribute: " + Tok);
1158bbe38602SEugene Leviant     } while (!Error);
1159bbe38602SEugene Leviant   }
1160bbe38602SEugene Leviant }
1161bbe38602SEugene Leviant 
1162717677afSRui Ueyama void ScriptParser::readSearchDir() {
116368a39a65SDavide Italiano   expect("(");
116486c5fb82SRui Ueyama   StringRef Tok = next();
11656c7ad13fSRui Ueyama   if (!Config->Nostdlib)
1166cd574a5eSGeorge Rimar     Config->SearchPaths.push_back(unquote(Tok));
116768a39a65SDavide Italiano   expect(")");
116868a39a65SDavide Italiano }
116968a39a65SDavide Italiano 
1170717677afSRui Ueyama void ScriptParser::readSections() {
1171e05336ffSEugene Leviant   Opt.HasSections = true;
11728e3b38abSDenis Protivensky   expect("{");
117383043f23SRui Ueyama   while (!Error && !consume("}")) {
1174113cdec9SRui Ueyama     StringRef Tok = next();
1175db741e72SEugene Leviant     BaseCommand *Cmd = readProvideOrAssignment(Tok, true);
1176ceabe80eSEugene Leviant     if (!Cmd) {
1177ceabe80eSEugene Leviant       if (Tok == "ASSERT")
1178eefa758eSGeorge Rimar         Cmd = new AssertCommand(readAssert());
1179ceabe80eSEugene Leviant       else
118010416564SRui Ueyama         Cmd = readOutputSectionDescription(Tok);
11818e3b38abSDenis Protivensky     }
118210416564SRui Ueyama     Opt.Commands.emplace_back(Cmd);
1183652852c5SGeorge Rimar   }
1184708019c4SRui Ueyama }
11858e3b38abSDenis Protivensky 
1186708019c4SRui Ueyama static int precedence(StringRef Op) {
1187708019c4SRui Ueyama   return StringSwitch<int>(Op)
11880120e3f2SRui Ueyama       .Cases("*", "/", 5)
11890120e3f2SRui Ueyama       .Cases("+", "-", 4)
11900120e3f2SRui Ueyama       .Cases("<<", ">>", 3)
11919c4ac5f2SRui Ueyama       .Cases("<", "<=", ">", ">=", "==", "!=", 2)
11920120e3f2SRui Ueyama       .Cases("&", "|", 1)
1193708019c4SRui Ueyama       .Default(-1);
1194708019c4SRui Ueyama }
1195708019c4SRui Ueyama 
1196c91930a1SGeorge Rimar Regex ScriptParser::readFilePatterns() {
119710416564SRui Ueyama   std::vector<StringRef> V;
119883043f23SRui Ueyama   while (!Error && !consume(")"))
119910416564SRui Ueyama     V.push_back(next());
1200c91930a1SGeorge Rimar   return compileGlobPatterns(V);
12010702c4e8SGeorge Rimar }
12020702c4e8SGeorge Rimar 
1203be394db3SGeorge Rimar SortSectionPolicy ScriptParser::readSortKind() {
120483043f23SRui Ueyama   if (consume("SORT") || consume("SORT_BY_NAME"))
1205be394db3SGeorge Rimar     return SortSectionPolicy::Name;
120683043f23SRui Ueyama   if (consume("SORT_BY_ALIGNMENT"))
1207be394db3SGeorge Rimar     return SortSectionPolicy::Alignment;
120883043f23SRui Ueyama   if (consume("SORT_BY_INIT_PRIORITY"))
1209be394db3SGeorge Rimar     return SortSectionPolicy::Priority;
121083043f23SRui Ueyama   if (consume("SORT_NONE"))
1211be394db3SGeorge Rimar     return SortSectionPolicy::None;
1212b2a0abdfSRui Ueyama   return SortSectionPolicy::Default;
1213be394db3SGeorge Rimar }
1214be394db3SGeorge Rimar 
1215395281cfSGeorge Rimar // Method reads a list of sequence of excluded files and section globs given in
1216395281cfSGeorge Rimar // a following form: ((EXCLUDE_FILE(file_pattern+))? section_pattern+)+
1217395281cfSGeorge Rimar // Example: *(.foo.1 EXCLUDE_FILE (*a.o) .foo.2 EXCLUDE_FILE (*b.o) .foo.3)
1218af03be19SGeorge Rimar // The semantics of that is next:
1219af03be19SGeorge Rimar // * Include .foo.1 from every file.
1220af03be19SGeorge Rimar // * Include .foo.2 from every file but a.o
1221af03be19SGeorge Rimar // * Include .foo.3 from every file but b.o
122207171f21SGeorge Rimar std::vector<SectionPattern> ScriptParser::readInputSectionsList() {
122307171f21SGeorge Rimar   std::vector<SectionPattern> Ret;
1224601e9898SGeorge Rimar   while (!Error && peek() != ")") {
1225027a9e87SRui Ueyama     Regex ExcludeFileRe;
122683043f23SRui Ueyama     if (consume("EXCLUDE_FILE")) {
1227395281cfSGeorge Rimar       expect("(");
1228395281cfSGeorge Rimar       ExcludeFileRe = readFilePatterns();
1229395281cfSGeorge Rimar     }
1230395281cfSGeorge Rimar 
1231601e9898SGeorge Rimar     std::vector<StringRef> V;
1232601e9898SGeorge Rimar     while (!Error && peek() != ")" && peek() != "EXCLUDE_FILE")
1233395281cfSGeorge Rimar       V.push_back(next());
1234601e9898SGeorge Rimar 
1235601e9898SGeorge Rimar     if (!V.empty())
123607171f21SGeorge Rimar       Ret.push_back({std::move(ExcludeFileRe), compileGlobPatterns(V)});
1237601e9898SGeorge Rimar     else
1238601e9898SGeorge Rimar       setError("section pattern is expected");
1239395281cfSGeorge Rimar   }
124007171f21SGeorge Rimar   return Ret;
1241395281cfSGeorge Rimar }
1242395281cfSGeorge Rimar 
124307171f21SGeorge Rimar // Section pattern grammar can have complex expressions, for example:
124407171f21SGeorge Rimar // *(SORT(.foo.* EXCLUDE_FILE (*file1.o) .bar.*) .bar.* SORT(.zed.*))
124507171f21SGeorge Rimar // Generally is a sequence of globs and excludes that may be wrapped in a SORT()
124607171f21SGeorge Rimar // commands, like: SORT(glob0) glob1 glob2 SORT(glob4)
124707171f21SGeorge Rimar // This methods handles wrapping sequences of excluded files and section globs
124807171f21SGeorge Rimar // into SORT() if that needed and reads them all.
1249a2496cbeSGeorge Rimar InputSectionDescription *
1250a2496cbeSGeorge Rimar ScriptParser::readInputSectionRules(StringRef FilePattern) {
1251c91930a1SGeorge Rimar   auto *Cmd = new InputSectionDescription(FilePattern);
12520ed42b0cSDavide Italiano   expect("(");
125383043f23SRui Ueyama   while (!HasError && !consume(")")) {
125407171f21SGeorge Rimar     SortSectionPolicy Outer = readSortKind();
125507171f21SGeorge Rimar     SortSectionPolicy Inner = SortSectionPolicy::Default;
125607171f21SGeorge Rimar     std::vector<SectionPattern> V;
125707171f21SGeorge Rimar     if (Outer != SortSectionPolicy::Default) {
12580702c4e8SGeorge Rimar       expect("(");
125907171f21SGeorge Rimar       Inner = readSortKind();
126007171f21SGeorge Rimar       if (Inner != SortSectionPolicy::Default) {
1261350ece4eSGeorge Rimar         expect("(");
126207171f21SGeorge Rimar         V = readInputSectionsList();
12630702c4e8SGeorge Rimar         expect(")");
1264350ece4eSGeorge Rimar       } else {
126507171f21SGeorge Rimar         V = readInputSectionsList();
1266350ece4eSGeorge Rimar       }
1267350ece4eSGeorge Rimar       expect(")");
126807171f21SGeorge Rimar     } else {
126907171f21SGeorge Rimar       V = readInputSectionsList();
12700659800eSGeorge Rimar     }
12710702c4e8SGeorge Rimar 
127207171f21SGeorge Rimar     for (SectionPattern &Pat : V) {
127307171f21SGeorge Rimar       Pat.SortInner = Inner;
127407171f21SGeorge Rimar       Pat.SortOuter = Outer;
127507171f21SGeorge Rimar     }
127607171f21SGeorge Rimar 
127707171f21SGeorge Rimar     std::move(V.begin(), V.end(), std::back_inserter(Cmd->SectionPatterns));
127807171f21SGeorge Rimar   }
127910416564SRui Ueyama   return Cmd;
12800659800eSGeorge Rimar }
12810659800eSGeorge Rimar 
1282a2496cbeSGeorge Rimar InputSectionDescription *
1283a2496cbeSGeorge Rimar ScriptParser::readInputSectionDescription(StringRef Tok) {
12840659800eSGeorge Rimar   // Input section wildcard can be surrounded by KEEP.
12850659800eSGeorge Rimar   // https://sourceware.org/binutils/docs/ld/Input-Section-Keep.html#Input-Section-Keep
1286a2496cbeSGeorge Rimar   if (Tok == "KEEP") {
1287e7282797SDavide Italiano     expect("(");
1288a2496cbeSGeorge Rimar     StringRef FilePattern = next();
1289a2496cbeSGeorge Rimar     InputSectionDescription *Cmd = readInputSectionRules(FilePattern);
12900ed42b0cSDavide Italiano     expect(")");
1291cf43f179SEugene Leviant     Opt.KeptSections.push_back(Cmd);
129210416564SRui Ueyama     return Cmd;
129310416564SRui Ueyama   }
1294a2496cbeSGeorge Rimar   return readInputSectionRules(Tok);
12950659800eSGeorge Rimar }
12960659800eSGeorge Rimar 
129703fc010eSGeorge Rimar void ScriptParser::readSort() {
129803fc010eSGeorge Rimar   expect("(");
129903fc010eSGeorge Rimar   expect("CONSTRUCTORS");
130003fc010eSGeorge Rimar   expect(")");
130103fc010eSGeorge Rimar }
130203fc010eSGeorge Rimar 
1303eefa758eSGeorge Rimar Expr ScriptParser::readAssert() {
1304eefa758eSGeorge Rimar   expect("(");
1305eefa758eSGeorge Rimar   Expr E = readExpr();
1306eefa758eSGeorge Rimar   expect(",");
1307cd574a5eSGeorge Rimar   StringRef Msg = unquote(next());
1308eefa758eSGeorge Rimar   expect(")");
1309eefa758eSGeorge Rimar   return [=](uint64_t Dot) {
1310eefa758eSGeorge Rimar     uint64_t V = E(Dot);
1311eefa758eSGeorge Rimar     if (!V)
1312eefa758eSGeorge Rimar       error(Msg);
1313eefa758eSGeorge Rimar     return V;
1314eefa758eSGeorge Rimar   };
1315eefa758eSGeorge Rimar }
1316eefa758eSGeorge Rimar 
131725150e8bSRui Ueyama // Reads a FILL(expr) command. We handle the FILL command as an
131825150e8bSRui Ueyama // alias for =fillexp section attribute, which is different from
131925150e8bSRui Ueyama // what GNU linkers do.
132025150e8bSRui Ueyama // https://sourceware.org/binutils/docs/ld/Output-Section-Data.html
1321ff1f29e0SGeorge Rimar std::vector<uint8_t> ScriptParser::readFill() {
1322ff1f29e0SGeorge Rimar   expect("(");
1323ff1f29e0SGeorge Rimar   std::vector<uint8_t> V = readOutputSectionFiller(next());
1324ff1f29e0SGeorge Rimar   expect(")");
1325ff1f29e0SGeorge Rimar   expect(";");
1326ff1f29e0SGeorge Rimar   return V;
1327ff1f29e0SGeorge Rimar }
1328ff1f29e0SGeorge Rimar 
132910416564SRui Ueyama OutputSectionCommand *
133010416564SRui Ueyama ScriptParser::readOutputSectionDescription(StringRef OutSec) {
1331076fe157SGeorge Rimar   OutputSectionCommand *Cmd = new OutputSectionCommand(OutSec);
133258e5c4dcSGeorge Rimar 
133358e5c4dcSGeorge Rimar   // Read an address expression.
133458e5c4dcSGeorge Rimar   // https://sourceware.org/binutils/docs/ld/Output-Section-Address.html#Output-Section-Address
133558e5c4dcSGeorge Rimar   if (peek() != ":")
133658e5c4dcSGeorge Rimar     Cmd->AddrExpr = readExpr();
133758e5c4dcSGeorge Rimar 
13388e3b38abSDenis Protivensky   expect(":");
1339246f681eSDavide Italiano 
134083043f23SRui Ueyama   if (consume("AT"))
1341b71d6f7aSEugene Leviant     Cmd->LMAExpr = readParenExpr();
134283043f23SRui Ueyama   if (consume("ALIGN"))
13436ad7dfccSRui Ueyama     Cmd->AlignExpr = readParenExpr();
134483043f23SRui Ueyama   if (consume("SUBALIGN"))
1345db24d9c3SGeorge Rimar     Cmd->SubalignExpr = readParenExpr();
1346630c6179SGeorge Rimar 
1347246f681eSDavide Italiano   // Parse constraints.
134883043f23SRui Ueyama   if (consume("ONLY_IF_RO"))
1349efc4066bSRui Ueyama     Cmd->Constraint = ConstraintKind::ReadOnly;
135083043f23SRui Ueyama   if (consume("ONLY_IF_RW"))
1351efc4066bSRui Ueyama     Cmd->Constraint = ConstraintKind::ReadWrite;
13528e3b38abSDenis Protivensky   expect("{");
13538ec77e64SRui Ueyama 
135483043f23SRui Ueyama   while (!Error && !consume("}")) {
1355ceabe80eSEugene Leviant     StringRef Tok = next();
1356db741e72SEugene Leviant     if (SymbolAssignment *Assignment = readProvideOrAssignment(Tok, false))
1357ceabe80eSEugene Leviant       Cmd->Commands.emplace_back(Assignment);
1358e38cbab5SGeorge Rimar     else if (BytesDataCommand *Data = readBytesDataCommand(Tok))
1359e38cbab5SGeorge Rimar       Cmd->Commands.emplace_back(Data);
1360ff1f29e0SGeorge Rimar     else if (Tok == "FILL")
1361ff1f29e0SGeorge Rimar       Cmd->Filler = readFill();
1362ceabe80eSEugene Leviant     else if (Tok == "SORT")
136303fc010eSGeorge Rimar       readSort();
1364a2496cbeSGeorge Rimar     else if (peek() == "(")
1365a2496cbeSGeorge Rimar       Cmd->Commands.emplace_back(readInputSectionDescription(Tok));
1366ceabe80eSEugene Leviant     else
1367ceabe80eSEugene Leviant       setError("unknown command " + Tok);
13688e3b38abSDenis Protivensky   }
1369076fe157SGeorge Rimar   Cmd->Phdrs = readOutputSectionPhdrs();
13704ebc5620SGeorge Rimar 
137183043f23SRui Ueyama   if (consume("="))
13724ebc5620SGeorge Rimar     Cmd->Filler = readOutputSectionFiller(next());
13734ebc5620SGeorge Rimar   else if (peek().startswith("="))
1374ff1f29e0SGeorge Rimar     Cmd->Filler = readOutputSectionFiller(next().drop_front());
13754ebc5620SGeorge Rimar 
137610416564SRui Ueyama   return Cmd;
1377f71caa2bSRui Ueyama }
13788ec77e64SRui Ueyama 
13792c8f1f04SRui Ueyama // Read "=<number>" where <number> is an octal/decimal/hexadecimal number.
13802c8f1f04SRui Ueyama // https://sourceware.org/binutils/docs/ld/Output-Section-Fill.html
13812c8f1f04SRui Ueyama //
13822c8f1f04SRui Ueyama // ld.gold is not fully compatible with ld.bfd. ld.bfd handles
13832c8f1f04SRui Ueyama // hexstrings as blobs of arbitrary sizes, while ld.gold handles them
13842c8f1f04SRui Ueyama // as 32-bit big-endian values. We will do the same as ld.gold does
13852c8f1f04SRui Ueyama // because it's simpler than what ld.bfd does.
1386ff1f29e0SGeorge Rimar std::vector<uint8_t> ScriptParser::readOutputSectionFiller(StringRef Tok) {
1387965827d6SRui Ueyama   uint32_t V;
1388ff1f29e0SGeorge Rimar   if (Tok.getAsInteger(0, V)) {
1389965827d6SRui Ueyama     setError("invalid filler expression: " + Tok);
1390f71caa2bSRui Ueyama     return {};
1391e2ee72b5SGeorge Rimar   }
1392965827d6SRui Ueyama   return {uint8_t(V >> 24), uint8_t(V >> 16), uint8_t(V >> 8), uint8_t(V)};
13938e3b38abSDenis Protivensky }
13948e3b38abSDenis Protivensky 
1395a35e39caSPetr Hosek SymbolAssignment *ScriptParser::readProvideHidden(bool Provide, bool Hidden) {
1396a31c91b1SEugene Leviant   expect("(");
1397174e0a16SRui Ueyama   SymbolAssignment *Cmd = readAssignment(next());
1398a35e39caSPetr Hosek   Cmd->Provide = Provide;
1399174e0a16SRui Ueyama   Cmd->Hidden = Hidden;
1400a31c91b1SEugene Leviant   expect(")");
1401a31c91b1SEugene Leviant   expect(";");
140210416564SRui Ueyama   return Cmd;
1403eda81a1bSEugene Leviant }
1404eda81a1bSEugene Leviant 
1405db741e72SEugene Leviant SymbolAssignment *ScriptParser::readProvideOrAssignment(StringRef Tok,
1406db741e72SEugene Leviant                                                         bool MakeAbsolute) {
1407ceabe80eSEugene Leviant   SymbolAssignment *Cmd = nullptr;
1408ceabe80eSEugene Leviant   if (peek() == "=" || peek() == "+=") {
1409ceabe80eSEugene Leviant     Cmd = readAssignment(Tok);
1410ceabe80eSEugene Leviant     expect(";");
1411ceabe80eSEugene Leviant   } else if (Tok == "PROVIDE") {
1412a35e39caSPetr Hosek     Cmd = readProvideHidden(true, false);
1413a35e39caSPetr Hosek   } else if (Tok == "HIDDEN") {
1414a35e39caSPetr Hosek     Cmd = readProvideHidden(false, true);
1415ceabe80eSEugene Leviant   } else if (Tok == "PROVIDE_HIDDEN") {
1416a35e39caSPetr Hosek     Cmd = readProvideHidden(true, true);
1417ceabe80eSEugene Leviant   }
1418db741e72SEugene Leviant   if (Cmd && MakeAbsolute)
1419db741e72SEugene Leviant     Cmd->IsAbsolute = true;
1420ceabe80eSEugene Leviant   return Cmd;
1421ceabe80eSEugene Leviant }
1422ceabe80eSEugene Leviant 
142330835ea4SGeorge Rimar static uint64_t getSymbolValue(StringRef S, uint64_t Dot) {
142430835ea4SGeorge Rimar   if (S == ".")
142530835ea4SGeorge Rimar     return Dot;
1426884e786dSGeorge Rimar   return ScriptBase->getSymbolValue(S);
1427e32a3598SGeorge Rimar }
1428e32a3598SGeorge Rimar 
142930835ea4SGeorge Rimar SymbolAssignment *ScriptParser::readAssignment(StringRef Name) {
143030835ea4SGeorge Rimar   StringRef Op = next();
1431db741e72SEugene Leviant   bool IsAbsolute = false;
1432db741e72SEugene Leviant   Expr E;
143330835ea4SGeorge Rimar   assert(Op == "=" || Op == "+=");
143483043f23SRui Ueyama   if (consume("ABSOLUTE")) {
1435db741e72SEugene Leviant     E = readParenExpr();
1436db741e72SEugene Leviant     IsAbsolute = true;
1437db741e72SEugene Leviant   } else {
1438db741e72SEugene Leviant     E = readExpr();
1439db741e72SEugene Leviant   }
144030835ea4SGeorge Rimar   if (Op == "+=")
144130835ea4SGeorge Rimar     E = [=](uint64_t Dot) { return getSymbolValue(Name, Dot) + E(Dot); };
1442db741e72SEugene Leviant   return new SymbolAssignment(Name, E, IsAbsolute);
144330835ea4SGeorge Rimar }
144430835ea4SGeorge Rimar 
144530835ea4SGeorge Rimar // This is an operator-precedence parser to parse a linker
144630835ea4SGeorge Rimar // script expression.
144730835ea4SGeorge Rimar Expr ScriptParser::readExpr() { return readExpr1(readPrimary(), 0); }
144830835ea4SGeorge Rimar 
144936c1cd23SRui Ueyama static Expr combine(StringRef Op, Expr L, Expr R) {
145036c1cd23SRui Ueyama   if (Op == "*")
145136c1cd23SRui Ueyama     return [=](uint64_t Dot) { return L(Dot) * R(Dot); };
145236c1cd23SRui Ueyama   if (Op == "/") {
145336c1cd23SRui Ueyama     return [=](uint64_t Dot) -> uint64_t {
145436c1cd23SRui Ueyama       uint64_t RHS = R(Dot);
145536c1cd23SRui Ueyama       if (RHS == 0) {
145636c1cd23SRui Ueyama         error("division by zero");
145736c1cd23SRui Ueyama         return 0;
145836c1cd23SRui Ueyama       }
145936c1cd23SRui Ueyama       return L(Dot) / RHS;
146036c1cd23SRui Ueyama     };
146136c1cd23SRui Ueyama   }
146236c1cd23SRui Ueyama   if (Op == "+")
146336c1cd23SRui Ueyama     return [=](uint64_t Dot) { return L(Dot) + R(Dot); };
146436c1cd23SRui Ueyama   if (Op == "-")
146536c1cd23SRui Ueyama     return [=](uint64_t Dot) { return L(Dot) - R(Dot); };
1466c8ccd1f1SGeorge Rimar   if (Op == "<<")
1467c8ccd1f1SGeorge Rimar     return [=](uint64_t Dot) { return L(Dot) << R(Dot); };
1468c8ccd1f1SGeorge Rimar   if (Op == ">>")
1469c8ccd1f1SGeorge Rimar     return [=](uint64_t Dot) { return L(Dot) >> R(Dot); };
147036c1cd23SRui Ueyama   if (Op == "<")
147136c1cd23SRui Ueyama     return [=](uint64_t Dot) { return L(Dot) < R(Dot); };
147236c1cd23SRui Ueyama   if (Op == ">")
147336c1cd23SRui Ueyama     return [=](uint64_t Dot) { return L(Dot) > R(Dot); };
147436c1cd23SRui Ueyama   if (Op == ">=")
147536c1cd23SRui Ueyama     return [=](uint64_t Dot) { return L(Dot) >= R(Dot); };
147636c1cd23SRui Ueyama   if (Op == "<=")
147736c1cd23SRui Ueyama     return [=](uint64_t Dot) { return L(Dot) <= R(Dot); };
147836c1cd23SRui Ueyama   if (Op == "==")
147936c1cd23SRui Ueyama     return [=](uint64_t Dot) { return L(Dot) == R(Dot); };
148036c1cd23SRui Ueyama   if (Op == "!=")
148136c1cd23SRui Ueyama     return [=](uint64_t Dot) { return L(Dot) != R(Dot); };
148236c1cd23SRui Ueyama   if (Op == "&")
148336c1cd23SRui Ueyama     return [=](uint64_t Dot) { return L(Dot) & R(Dot); };
1484cc3dd629SRafael Espindola   if (Op == "|")
1485cc3dd629SRafael Espindola     return [=](uint64_t Dot) { return L(Dot) | R(Dot); };
148636c1cd23SRui Ueyama   llvm_unreachable("invalid operator");
148736c1cd23SRui Ueyama }
148836c1cd23SRui Ueyama 
1489708019c4SRui Ueyama // This is a part of the operator-precedence parser. This function
1490708019c4SRui Ueyama // assumes that the remaining token stream starts with an operator.
1491708019c4SRui Ueyama Expr ScriptParser::readExpr1(Expr Lhs, int MinPrec) {
1492708019c4SRui Ueyama   while (!atEOF() && !Error) {
1493708019c4SRui Ueyama     // Read an operator and an expression.
1494708019c4SRui Ueyama     StringRef Op1 = peek();
1495708019c4SRui Ueyama     if (Op1 == "?")
1496708019c4SRui Ueyama       return readTernary(Lhs);
1497708019c4SRui Ueyama     if (precedence(Op1) < MinPrec)
1498a31c91b1SEugene Leviant       break;
14995424e7c7SJustin Bogner     skip();
1500708019c4SRui Ueyama     Expr Rhs = readPrimary();
1501708019c4SRui Ueyama 
1502708019c4SRui Ueyama     // Evaluate the remaining part of the expression first if the
1503708019c4SRui Ueyama     // next operator has greater precedence than the previous one.
1504708019c4SRui Ueyama     // For example, if we have read "+" and "3", and if the next
1505708019c4SRui Ueyama     // operator is "*", then we'll evaluate 3 * ... part first.
1506708019c4SRui Ueyama     while (!atEOF()) {
1507708019c4SRui Ueyama       StringRef Op2 = peek();
1508708019c4SRui Ueyama       if (precedence(Op2) <= precedence(Op1))
1509eda81a1bSEugene Leviant         break;
1510708019c4SRui Ueyama       Rhs = readExpr1(Rhs, precedence(Op2));
1511eda81a1bSEugene Leviant     }
1512708019c4SRui Ueyama 
1513708019c4SRui Ueyama     Lhs = combine(Op1, Lhs, Rhs);
1514708019c4SRui Ueyama   }
1515708019c4SRui Ueyama   return Lhs;
1516708019c4SRui Ueyama }
1517708019c4SRui Ueyama 
1518708019c4SRui Ueyama uint64_t static getConstant(StringRef S) {
1519e2cc07bcSMichael J. Spencer   if (S == "COMMONPAGESIZE")
1520708019c4SRui Ueyama     return Target->PageSize;
1521e2cc07bcSMichael J. Spencer   if (S == "MAXPAGESIZE")
1522997f8838SPetr Hosek     return Config->MaxPageSize;
1523708019c4SRui Ueyama   error("unknown constant: " + S);
1524708019c4SRui Ueyama   return 0;
1525708019c4SRui Ueyama }
1526708019c4SRui Ueyama 
1527626e0b08SRui Ueyama // Parses Tok as an integer. Returns true if successful.
1528626e0b08SRui Ueyama // It recognizes hexadecimal (prefixed with "0x" or suffixed with "H")
1529626e0b08SRui Ueyama // and decimal numbers. Decimal numbers may have "K" (kilo) or
1530626e0b08SRui Ueyama // "M" (mega) prefixes.
15319f2f7ad9SGeorge Rimar static bool readInteger(StringRef Tok, uint64_t &Result) {
1532eaeafb2bSSimon Atanasyan   if (Tok.startswith("-")) {
1533eaeafb2bSSimon Atanasyan     if (!readInteger(Tok.substr(1), Result))
1534eaeafb2bSSimon Atanasyan       return false;
1535eaeafb2bSSimon Atanasyan     Result = -Result;
1536eaeafb2bSSimon Atanasyan     return true;
1537eaeafb2bSSimon Atanasyan   }
15389f2f7ad9SGeorge Rimar   if (Tok.startswith_lower("0x"))
15399f2f7ad9SGeorge Rimar     return !Tok.substr(2).getAsInteger(16, Result);
15409f2f7ad9SGeorge Rimar   if (Tok.endswith_lower("H"))
15419f2f7ad9SGeorge Rimar     return !Tok.drop_back().getAsInteger(16, Result);
15429f2f7ad9SGeorge Rimar 
15439f2f7ad9SGeorge Rimar   int Suffix = 1;
15449f2f7ad9SGeorge Rimar   if (Tok.endswith_lower("K")) {
15459f2f7ad9SGeorge Rimar     Suffix = 1024;
15469f2f7ad9SGeorge Rimar     Tok = Tok.drop_back();
15479f2f7ad9SGeorge Rimar   } else if (Tok.endswith_lower("M")) {
15489f2f7ad9SGeorge Rimar     Suffix = 1024 * 1024;
15499f2f7ad9SGeorge Rimar     Tok = Tok.drop_back();
15509f2f7ad9SGeorge Rimar   }
15519f2f7ad9SGeorge Rimar   if (Tok.getAsInteger(10, Result))
15529f2f7ad9SGeorge Rimar     return false;
15539f2f7ad9SGeorge Rimar   Result *= Suffix;
15549f2f7ad9SGeorge Rimar   return true;
15559f2f7ad9SGeorge Rimar }
15569f2f7ad9SGeorge Rimar 
1557e38cbab5SGeorge Rimar BytesDataCommand *ScriptParser::readBytesDataCommand(StringRef Tok) {
1558e38cbab5SGeorge Rimar   int Size = StringSwitch<unsigned>(Tok)
1559e38cbab5SGeorge Rimar                  .Case("BYTE", 1)
1560e38cbab5SGeorge Rimar                  .Case("SHORT", 2)
1561e38cbab5SGeorge Rimar                  .Case("LONG", 4)
1562e38cbab5SGeorge Rimar                  .Case("QUAD", 8)
1563e38cbab5SGeorge Rimar                  .Default(-1);
1564e38cbab5SGeorge Rimar   if (Size == -1)
1565e38cbab5SGeorge Rimar     return nullptr;
1566e38cbab5SGeorge Rimar 
1567e38cbab5SGeorge Rimar   expect("(");
1568e38cbab5SGeorge Rimar   uint64_t Val = 0;
1569e38cbab5SGeorge Rimar   StringRef S = next();
1570e38cbab5SGeorge Rimar   if (!readInteger(S, Val))
1571e38cbab5SGeorge Rimar     setError("unexpected value: " + S);
1572e38cbab5SGeorge Rimar   expect(")");
1573e38cbab5SGeorge Rimar   return new BytesDataCommand(Val, Size);
1574e38cbab5SGeorge Rimar }
1575e38cbab5SGeorge Rimar 
1576b71d6f7aSEugene Leviant StringRef ScriptParser::readParenLiteral() {
1577b71d6f7aSEugene Leviant   expect("(");
1578b71d6f7aSEugene Leviant   StringRef Tok = next();
1579b71d6f7aSEugene Leviant   expect(")");
1580b71d6f7aSEugene Leviant   return Tok;
1581b71d6f7aSEugene Leviant }
1582b71d6f7aSEugene Leviant 
1583708019c4SRui Ueyama Expr ScriptParser::readPrimary() {
15846ad7dfccSRui Ueyama   if (peek() == "(")
15856ad7dfccSRui Ueyama     return readParenExpr();
1586708019c4SRui Ueyama 
15876ad7dfccSRui Ueyama   StringRef Tok = next();
1588708019c4SRui Ueyama 
1589eaeafb2bSSimon Atanasyan   if (Tok == "~") {
1590eaeafb2bSSimon Atanasyan     Expr E = readPrimary();
1591eaeafb2bSSimon Atanasyan     return [=](uint64_t Dot) { return ~E(Dot); };
1592eaeafb2bSSimon Atanasyan   }
1593eaeafb2bSSimon Atanasyan   if (Tok == "-") {
1594eaeafb2bSSimon Atanasyan     Expr E = readPrimary();
1595eaeafb2bSSimon Atanasyan     return [=](uint64_t Dot) { return -E(Dot); };
1596eaeafb2bSSimon Atanasyan   }
1597eaeafb2bSSimon Atanasyan 
1598708019c4SRui Ueyama   // Built-in functions are parsed here.
1599708019c4SRui Ueyama   // https://sourceware.org/binutils/docs/ld/Builtin-Functions.html.
160096659df0SGeorge Rimar   if (Tok == "ADDR") {
1601b71d6f7aSEugene Leviant     StringRef Name = readParenLiteral();
1602884e786dSGeorge Rimar     return
1603884e786dSGeorge Rimar         [=](uint64_t Dot) { return ScriptBase->getOutputSectionAddress(Name); };
160496659df0SGeorge Rimar   }
1605b71d6f7aSEugene Leviant   if (Tok == "LOADADDR") {
1606b71d6f7aSEugene Leviant     StringRef Name = readParenLiteral();
1607b71d6f7aSEugene Leviant     return [=](uint64_t Dot) { return ScriptBase->getOutputSectionLMA(Name); };
1608b71d6f7aSEugene Leviant   }
1609eefa758eSGeorge Rimar   if (Tok == "ASSERT")
1610eefa758eSGeorge Rimar     return readAssert();
1611708019c4SRui Ueyama   if (Tok == "ALIGN") {
16126ad7dfccSRui Ueyama     Expr E = readParenExpr();
1613708019c4SRui Ueyama     return [=](uint64_t Dot) { return alignTo(Dot, E(Dot)); };
1614708019c4SRui Ueyama   }
1615708019c4SRui Ueyama   if (Tok == "CONSTANT") {
1616b71d6f7aSEugene Leviant     StringRef Name = readParenLiteral();
1617b71d6f7aSEugene Leviant     return [=](uint64_t Dot) { return getConstant(Name); };
1618708019c4SRui Ueyama   }
1619f34f45fdSGeorge Rimar   if (Tok == "DEFINED") {
1620f34f45fdSGeorge Rimar     expect("(");
1621f34f45fdSGeorge Rimar     StringRef Tok = next();
1622f34f45fdSGeorge Rimar     expect(")");
1623f2821028SGeorge Rimar     return [=](uint64_t Dot) { return ScriptBase->isDefined(Tok) ? 1 : 0; };
1624f34f45fdSGeorge Rimar   }
162554c145ceSRafael Espindola   if (Tok == "SEGMENT_START") {
162654c145ceSRafael Espindola     expect("(");
16275424e7c7SJustin Bogner     skip();
162854c145ceSRafael Espindola     expect(",");
16298c658bf8SGeorge Rimar     Expr E = readExpr();
163054c145ceSRafael Espindola     expect(")");
16318c658bf8SGeorge Rimar     return [=](uint64_t Dot) { return E(Dot); };
163254c145ceSRafael Espindola   }
1633708019c4SRui Ueyama   if (Tok == "DATA_SEGMENT_ALIGN") {
1634708019c4SRui Ueyama     expect("(");
1635708019c4SRui Ueyama     Expr E = readExpr();
1636708019c4SRui Ueyama     expect(",");
1637708019c4SRui Ueyama     readExpr();
1638708019c4SRui Ueyama     expect(")");
1639f7791bb9SRui Ueyama     return [=](uint64_t Dot) { return alignTo(Dot, E(Dot)); };
1640708019c4SRui Ueyama   }
1641708019c4SRui Ueyama   if (Tok == "DATA_SEGMENT_END") {
1642708019c4SRui Ueyama     expect("(");
1643708019c4SRui Ueyama     expect(".");
1644708019c4SRui Ueyama     expect(")");
1645708019c4SRui Ueyama     return [](uint64_t Dot) { return Dot; };
1646708019c4SRui Ueyama   }
1647276b4e64SGeorge Rimar   // GNU linkers implements more complicated logic to handle
1648276b4e64SGeorge Rimar   // DATA_SEGMENT_RELRO_END. We instead ignore the arguments and just align to
1649276b4e64SGeorge Rimar   // the next page boundary for simplicity.
1650276b4e64SGeorge Rimar   if (Tok == "DATA_SEGMENT_RELRO_END") {
1651276b4e64SGeorge Rimar     expect("(");
165297bdc722SRafael Espindola     readExpr();
1653276b4e64SGeorge Rimar     expect(",");
1654276b4e64SGeorge Rimar     readExpr();
1655276b4e64SGeorge Rimar     expect(")");
1656276b4e64SGeorge Rimar     return [](uint64_t Dot) { return alignTo(Dot, Target->PageSize); };
1657276b4e64SGeorge Rimar   }
16589e69450eSGeorge Rimar   if (Tok == "SIZEOF") {
1659b71d6f7aSEugene Leviant     StringRef Name = readParenLiteral();
1660884e786dSGeorge Rimar     return [=](uint64_t Dot) { return ScriptBase->getOutputSectionSize(Name); };
16619e69450eSGeorge Rimar   }
166236fac7f0SEugene Leviant   if (Tok == "ALIGNOF") {
1663b71d6f7aSEugene Leviant     StringRef Name = readParenLiteral();
166436fac7f0SEugene Leviant     return
166536fac7f0SEugene Leviant         [=](uint64_t Dot) { return ScriptBase->getOutputSectionAlign(Name); };
166636fac7f0SEugene Leviant   }
1667e32a3598SGeorge Rimar   if (Tok == "SIZEOF_HEADERS")
1668884e786dSGeorge Rimar     return [=](uint64_t Dot) { return ScriptBase->getHeaderSize(); };
1669708019c4SRui Ueyama 
16709f2f7ad9SGeorge Rimar   // Tok is a literal number.
16719f2f7ad9SGeorge Rimar   uint64_t V;
16729f2f7ad9SGeorge Rimar   if (readInteger(Tok, V))
16739f2f7ad9SGeorge Rimar     return [=](uint64_t Dot) { return V; };
16749f2f7ad9SGeorge Rimar 
16759f2f7ad9SGeorge Rimar   // Tok is a symbol name.
167630835ea4SGeorge Rimar   if (Tok != "." && !isValidCIdentifier(Tok))
1677708019c4SRui Ueyama     setError("malformed number: " + Tok);
167830835ea4SGeorge Rimar   return [=](uint64_t Dot) { return getSymbolValue(Tok, Dot); };
1679a9c5a528SGeorge Rimar }
1680708019c4SRui Ueyama 
1681708019c4SRui Ueyama Expr ScriptParser::readTernary(Expr Cond) {
16825424e7c7SJustin Bogner   skip();
1683708019c4SRui Ueyama   Expr L = readExpr();
1684708019c4SRui Ueyama   expect(":");
1685708019c4SRui Ueyama   Expr R = readExpr();
1686708019c4SRui Ueyama   return [=](uint64_t Dot) { return Cond(Dot) ? L(Dot) : R(Dot); };
1687708019c4SRui Ueyama }
1688708019c4SRui Ueyama 
16896ad7dfccSRui Ueyama Expr ScriptParser::readParenExpr() {
16906ad7dfccSRui Ueyama   expect("(");
16916ad7dfccSRui Ueyama   Expr E = readExpr();
16926ad7dfccSRui Ueyama   expect(")");
16936ad7dfccSRui Ueyama   return E;
16946ad7dfccSRui Ueyama }
16956ad7dfccSRui Ueyama 
1696bbe38602SEugene Leviant std::vector<StringRef> ScriptParser::readOutputSectionPhdrs() {
1697bbe38602SEugene Leviant   std::vector<StringRef> Phdrs;
1698bbe38602SEugene Leviant   while (!Error && peek().startswith(":")) {
1699bbe38602SEugene Leviant     StringRef Tok = next();
1700bbe38602SEugene Leviant     Tok = (Tok.size() == 1) ? next() : Tok.substr(1);
1701bbe38602SEugene Leviant     if (Tok.empty()) {
1702bbe38602SEugene Leviant       setError("section header name is empty");
1703bbe38602SEugene Leviant       break;
1704bbe38602SEugene Leviant     }
1705bbe38602SEugene Leviant     Phdrs.push_back(Tok);
1706bbe38602SEugene Leviant   }
1707bbe38602SEugene Leviant   return Phdrs;
1708bbe38602SEugene Leviant }
1709bbe38602SEugene Leviant 
171095dd718cSGeorge Rimar // Read a program header type name. The next token must be a
171195dd718cSGeorge Rimar // name of a program header type or a constant (e.g. "0x3").
1712bbe38602SEugene Leviant unsigned ScriptParser::readPhdrType() {
1713bbe38602SEugene Leviant   StringRef Tok = next();
171495dd718cSGeorge Rimar   uint64_t Val;
171595dd718cSGeorge Rimar   if (readInteger(Tok, Val))
171695dd718cSGeorge Rimar     return Val;
171795dd718cSGeorge Rimar 
1718b0f6c590SRui Ueyama   unsigned Ret = StringSwitch<unsigned>(Tok)
1719b0f6c590SRui Ueyama                      .Case("PT_NULL", PT_NULL)
1720b0f6c590SRui Ueyama                      .Case("PT_LOAD", PT_LOAD)
1721b0f6c590SRui Ueyama                      .Case("PT_DYNAMIC", PT_DYNAMIC)
1722b0f6c590SRui Ueyama                      .Case("PT_INTERP", PT_INTERP)
1723b0f6c590SRui Ueyama                      .Case("PT_NOTE", PT_NOTE)
1724b0f6c590SRui Ueyama                      .Case("PT_SHLIB", PT_SHLIB)
1725b0f6c590SRui Ueyama                      .Case("PT_PHDR", PT_PHDR)
1726b0f6c590SRui Ueyama                      .Case("PT_TLS", PT_TLS)
1727b0f6c590SRui Ueyama                      .Case("PT_GNU_EH_FRAME", PT_GNU_EH_FRAME)
1728b0f6c590SRui Ueyama                      .Case("PT_GNU_STACK", PT_GNU_STACK)
1729b0f6c590SRui Ueyama                      .Case("PT_GNU_RELRO", PT_GNU_RELRO)
1730270173f2SGeorge Rimar                      .Case("PT_OPENBSD_RANDOMIZE", PT_OPENBSD_RANDOMIZE)
1731cc6e567cSGeorge Rimar                      .Case("PT_OPENBSD_WXNEEDED", PT_OPENBSD_WXNEEDED)
1732b0f6c590SRui Ueyama                      .Default(-1);
1733bbe38602SEugene Leviant 
1734b0f6c590SRui Ueyama   if (Ret == (unsigned)-1) {
1735b0f6c590SRui Ueyama     setError("invalid program header type: " + Tok);
1736b0f6c590SRui Ueyama     return PT_NULL;
1737b0f6c590SRui Ueyama   }
1738b0f6c590SRui Ueyama   return Ret;
1739bbe38602SEugene Leviant }
1740bbe38602SEugene Leviant 
174195769b4aSRui Ueyama void ScriptParser::readVersionDeclaration(StringRef VerStr) {
174220b6598cSGeorge Rimar   // Identifiers start at 2 because 0 and 1 are reserved
174320b6598cSGeorge Rimar   // for VER_NDX_LOCAL and VER_NDX_GLOBAL constants.
174420b6598cSGeorge Rimar   size_t VersionId = Config->VersionDefinitions.size() + 2;
174520b6598cSGeorge Rimar   Config->VersionDefinitions.push_back({VerStr, VersionId});
174620b6598cSGeorge Rimar 
174783043f23SRui Ueyama   if (consume("global:") || peek() != "local:")
174820b6598cSGeorge Rimar     readGlobal(VerStr);
174983043f23SRui Ueyama   if (consume("local:"))
175020b6598cSGeorge Rimar     readLocal();
175120b6598cSGeorge Rimar   expect("}");
175220b6598cSGeorge Rimar 
175320b6598cSGeorge Rimar   // Each version may have a parent version. For example, "Ver2" defined as
175420b6598cSGeorge Rimar   // "Ver2 { global: foo; local: *; } Ver1;" has "Ver1" as a parent. This
175520b6598cSGeorge Rimar   // version hierarchy is, probably against your instinct, purely for human; the
175620b6598cSGeorge Rimar   // runtime doesn't care about them at all. In LLD, we simply skip the token.
175720b6598cSGeorge Rimar   if (!VerStr.empty() && peek() != ";")
17585424e7c7SJustin Bogner     skip();
175920b6598cSGeorge Rimar   expect(";");
176020b6598cSGeorge Rimar }
176120b6598cSGeorge Rimar 
176220b6598cSGeorge Rimar void ScriptParser::readLocal() {
176320b6598cSGeorge Rimar   Config->DefaultSymbolVersion = VER_NDX_LOCAL;
176420b6598cSGeorge Rimar   expect("*");
176520b6598cSGeorge Rimar   expect(";");
176620b6598cSGeorge Rimar }
176720b6598cSGeorge Rimar 
176820b6598cSGeorge Rimar void ScriptParser::readExtern(std::vector<SymbolVersion> *Globals) {
1769cd574a5eSGeorge Rimar   expect("\"C++\"");
177020b6598cSGeorge Rimar   expect("{");
177120b6598cSGeorge Rimar 
177220b6598cSGeorge Rimar   for (;;) {
177320b6598cSGeorge Rimar     if (peek() == "}" || Error)
177420b6598cSGeorge Rimar       break;
1775cd574a5eSGeorge Rimar     bool HasWildcard = !peek().startswith("\"") && hasWildcard(peek());
1776cd574a5eSGeorge Rimar     Globals->push_back({unquote(next()), true, HasWildcard});
177720b6598cSGeorge Rimar     expect(";");
177820b6598cSGeorge Rimar   }
177920b6598cSGeorge Rimar 
178020b6598cSGeorge Rimar   expect("}");
178120b6598cSGeorge Rimar   expect(";");
178220b6598cSGeorge Rimar }
178320b6598cSGeorge Rimar 
178420b6598cSGeorge Rimar void ScriptParser::readGlobal(StringRef VerStr) {
178520b6598cSGeorge Rimar   std::vector<SymbolVersion> *Globals;
178620b6598cSGeorge Rimar   if (VerStr.empty())
178720b6598cSGeorge Rimar     Globals = &Config->VersionScriptGlobals;
178820b6598cSGeorge Rimar   else
178920b6598cSGeorge Rimar     Globals = &Config->VersionDefinitions.back().Globals;
179020b6598cSGeorge Rimar 
179120b6598cSGeorge Rimar   for (;;) {
179283043f23SRui Ueyama     if (consume("extern"))
179320b6598cSGeorge Rimar       readExtern(Globals);
179420b6598cSGeorge Rimar 
179520b6598cSGeorge Rimar     StringRef Cur = peek();
179620b6598cSGeorge Rimar     if (Cur == "}" || Cur == "local:" || Error)
179720b6598cSGeorge Rimar       return;
17985424e7c7SJustin Bogner     skip();
1799cd574a5eSGeorge Rimar     Globals->push_back({unquote(Cur), false, hasWildcard(Cur)});
180020b6598cSGeorge Rimar     expect(";");
180120b6598cSGeorge Rimar   }
180220b6598cSGeorge Rimar }
180320b6598cSGeorge Rimar 
180416b0cc9eSSimon Atanasyan static bool isUnderSysroot(StringRef Path) {
180516b0cc9eSSimon Atanasyan   if (Config->Sysroot == "")
180616b0cc9eSSimon Atanasyan     return false;
180716b0cc9eSSimon Atanasyan   for (; !Path.empty(); Path = sys::path::parent_path(Path))
180816b0cc9eSSimon Atanasyan     if (sys::fs::equivalent(Config->Sysroot, Path))
180916b0cc9eSSimon Atanasyan       return true;
181016b0cc9eSSimon Atanasyan   return false;
181116b0cc9eSSimon Atanasyan }
181216b0cc9eSSimon Atanasyan 
181307320e40SRui Ueyama void elf::readLinkerScript(MemoryBufferRef MB) {
181416b0cc9eSSimon Atanasyan   StringRef Path = MB.getBufferIdentifier();
181520b6598cSGeorge Rimar   ScriptParser(MB.getBuffer(), isUnderSysroot(Path)).readLinkerScript();
181620b6598cSGeorge Rimar }
181720b6598cSGeorge Rimar 
181820b6598cSGeorge Rimar void elf::readVersionScript(MemoryBufferRef MB) {
181920b6598cSGeorge Rimar   ScriptParser(MB.getBuffer(), false).readVersionScript();
1820f7c5fbb1SRui Ueyama }
18211ebc8ed7SRui Ueyama 
182207320e40SRui Ueyama template class elf::LinkerScript<ELF32LE>;
182307320e40SRui Ueyama template class elf::LinkerScript<ELF32BE>;
182407320e40SRui Ueyama template class elf::LinkerScript<ELF64LE>;
182507320e40SRui Ueyama template class elf::LinkerScript<ELF64BE>;
1826