1 //===- LinkerScript.cpp ---------------------------------------------------===//
2 //
3 //                             The LLVM Linker
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file contains the parser/evaluator of the linker script.
11 // It parses a linker script and write the result to Config or ScriptConfig
12 // objects.
13 //
14 // If SECTIONS command is used, a ScriptConfig contains an AST
15 // of the command which will later be consumed by createSections() and
16 // assignAddresses().
17 //
18 //===----------------------------------------------------------------------===//
19 
20 #include "LinkerScript.h"
21 #include "Config.h"
22 #include "Driver.h"
23 #include "InputSection.h"
24 #include "OutputSections.h"
25 #include "ScriptParser.h"
26 #include "Strings.h"
27 #include "Symbols.h"
28 #include "SymbolTable.h"
29 #include "Target.h"
30 #include "Writer.h"
31 #include "llvm/ADT/StringSwitch.h"
32 #include "llvm/Support/ELF.h"
33 #include "llvm/Support/FileSystem.h"
34 #include "llvm/Support/MemoryBuffer.h"
35 #include "llvm/Support/Path.h"
36 #include "llvm/Support/StringSaver.h"
37 
38 using namespace llvm;
39 using namespace llvm::ELF;
40 using namespace llvm::object;
41 using namespace lld;
42 using namespace lld::elf;
43 
44 LinkerScriptBase *elf::ScriptBase;
45 ScriptConfiguration *elf::ScriptConfig;
46 
47 template <class ELFT> static void addRegular(SymbolAssignment *Cmd) {
48   Symbol *Sym = Symtab<ELFT>::X->addRegular(Cmd->Name, STB_GLOBAL, STV_DEFAULT);
49   Sym->Visibility = Cmd->Hidden ? STV_HIDDEN : STV_DEFAULT;
50   Cmd->Sym = Sym->body();
51 }
52 
53 template <class ELFT> static void addSynthetic(SymbolAssignment *Cmd) {
54   Symbol *Sym = Symtab<ELFT>::X->addSynthetic(
55       Cmd->Name, nullptr, 0, Cmd->Hidden ? STV_HIDDEN : STV_DEFAULT);
56   Cmd->Sym = Sym->body();
57 }
58 
59 template <class ELFT> static void addSymbol(SymbolAssignment *Cmd) {
60   if (Cmd->IsAbsolute)
61     addRegular<ELFT>(Cmd);
62   else
63     addSynthetic<ELFT>(Cmd);
64 }
65 // If a symbol was in PROVIDE(), we need to define it only when
66 // it is an undefined symbol.
67 template <class ELFT> static bool shouldDefine(SymbolAssignment *Cmd) {
68   if (Cmd->Name == ".")
69     return false;
70   if (!Cmd->Provide)
71     return true;
72   SymbolBody *B = Symtab<ELFT>::X->find(Cmd->Name);
73   return B && B->isUndefined();
74 }
75 
76 bool SymbolAssignment::classof(const BaseCommand *C) {
77   return C->Kind == AssignmentKind;
78 }
79 
80 bool OutputSectionCommand::classof(const BaseCommand *C) {
81   return C->Kind == OutputSectionKind;
82 }
83 
84 bool InputSectionDescription::classof(const BaseCommand *C) {
85   return C->Kind == InputSectionKind;
86 }
87 
88 bool AssertCommand::classof(const BaseCommand *C) {
89   return C->Kind == AssertKind;
90 }
91 
92 template <class ELFT> static bool isDiscarded(InputSectionBase<ELFT> *S) {
93   return !S || !S->Live;
94 }
95 
96 template <class ELFT> LinkerScript<ELFT>::LinkerScript() {}
97 template <class ELFT> LinkerScript<ELFT>::~LinkerScript() {}
98 
99 template <class ELFT>
100 bool LinkerScript<ELFT>::shouldKeep(InputSectionBase<ELFT> *S) {
101   for (Regex *Re : Opt.KeptSections)
102     if (Re->match(S->Name))
103       return true;
104   return false;
105 }
106 
107 static bool fileMatches(const InputSectionDescription *Desc,
108                         StringRef Filename) {
109   return const_cast<Regex &>(Desc->FileRe).match(Filename) &&
110          !const_cast<Regex &>(Desc->ExcludedFileRe).match(Filename);
111 }
112 
113 // Returns input sections filtered by given glob patterns.
114 template <class ELFT>
115 std::vector<InputSectionBase<ELFT> *>
116 LinkerScript<ELFT>::getInputSections(const InputSectionDescription *I) {
117   const Regex &Re = I->SectionRe;
118   std::vector<InputSectionBase<ELFT> *> Ret;
119   for (const std::unique_ptr<ObjectFile<ELFT>> &F :
120        Symtab<ELFT>::X->getObjectFiles()) {
121     if (fileMatches(I, sys::path::filename(F->getName())))
122       for (InputSectionBase<ELFT> *S : F->getSections())
123         if (!isDiscarded(S) && !S->OutSec &&
124             const_cast<Regex &>(Re).match(S->Name))
125           Ret.push_back(S);
126   }
127 
128   if (const_cast<Regex &>(Re).match("COMMON"))
129     Ret.push_back(CommonInputSection<ELFT>::X);
130   return Ret;
131 }
132 
133 template <class ELFT>
134 static bool compareName(InputSectionBase<ELFT> *A, InputSectionBase<ELFT> *B) {
135   return A->Name < B->Name;
136 }
137 
138 template <class ELFT>
139 static bool compareAlignment(InputSectionBase<ELFT> *A,
140                              InputSectionBase<ELFT> *B) {
141   // ">" is not a mistake. Larger alignments are placed before smaller
142   // alignments in order to reduce the amount of padding necessary.
143   // This is compatible with GNU.
144   return A->Alignment > B->Alignment;
145 }
146 
147 template <class ELFT>
148 static std::function<bool(InputSectionBase<ELFT> *, InputSectionBase<ELFT> *)>
149 getComparator(SortKind K) {
150   if (K == SortByName)
151     return compareName<ELFT>;
152   return compareAlignment<ELFT>;
153 }
154 
155 template <class ELFT>
156 void LinkerScript<ELFT>::discard(OutputSectionCommand &Cmd) {
157   for (const std::unique_ptr<BaseCommand> &Base : Cmd.Commands) {
158     if (auto *Cmd = dyn_cast<InputSectionDescription>(Base.get())) {
159       for (InputSectionBase<ELFT> *S : getInputSections(Cmd)) {
160         S->Live = false;
161         reportDiscarded(S);
162       }
163     }
164   }
165 }
166 
167 static bool checkConstraint(uint64_t Flags, ConstraintKind Kind) {
168   bool RO = (Kind == ConstraintKind::ReadOnly);
169   bool RW = (Kind == ConstraintKind::ReadWrite);
170   bool Writable = Flags & SHF_WRITE;
171   return !(RO && Writable) && !(RW && !Writable);
172 }
173 
174 template <class ELFT>
175 static bool matchConstraints(ArrayRef<InputSectionBase<ELFT> *> Sections,
176                              ConstraintKind Kind) {
177   if (Kind == ConstraintKind::NoConstraint)
178     return true;
179   return llvm::all_of(Sections, [=](InputSectionBase<ELFT> *Sec) {
180     return checkConstraint(Sec->getSectionHdr()->sh_flags, Kind);
181   });
182 }
183 
184 template <class ELFT>
185 std::vector<InputSectionBase<ELFT> *>
186 LinkerScript<ELFT>::createInputSectionList(OutputSectionCommand &OutCmd) {
187   std::vector<InputSectionBase<ELFT> *> Ret;
188   DenseSet<InputSectionBase<ELFT> *> SectionIndex;
189 
190   for (const std::unique_ptr<BaseCommand> &Base : OutCmd.Commands) {
191     if (auto *OutCmd = dyn_cast<SymbolAssignment>(Base.get())) {
192       if (shouldDefine<ELFT>(OutCmd))
193         addSymbol<ELFT>(OutCmd);
194       OutCmd->GoesAfter = Ret.empty() ? nullptr : Ret.back();
195       continue;
196     }
197 
198     auto *Cmd = cast<InputSectionDescription>(Base.get());
199     std::vector<InputSectionBase<ELFT> *> V = getInputSections(Cmd);
200     if (!matchConstraints<ELFT>(V, OutCmd.Constraint))
201       continue;
202     if (Cmd->SortInner)
203       std::stable_sort(V.begin(), V.end(), getComparator<ELFT>(Cmd->SortInner));
204     if (Cmd->SortOuter)
205       std::stable_sort(V.begin(), V.end(), getComparator<ELFT>(Cmd->SortOuter));
206 
207     // Add all input sections corresponding to rule 'Cmd' to
208     // resulting vector. We do not add duplicate input sections.
209     for (InputSectionBase<ELFT> *S : V)
210       if (SectionIndex.insert(S).second)
211         Ret.push_back(S);
212   }
213   return Ret;
214 }
215 
216 template <class ELFT> void LinkerScript<ELFT>::createAssignments() {
217   for (const std::unique_ptr<SymbolAssignment> &Cmd : Opt.Assignments) {
218     if (shouldDefine<ELFT>(Cmd.get()))
219       addRegular<ELFT>(Cmd.get());
220     if (Cmd->Sym)
221       cast<DefinedRegular<ELFT>>(Cmd->Sym)->Value = Cmd->Expression(0);
222   }
223 }
224 
225 template <class ELFT>
226 void LinkerScript<ELFT>::createSections(OutputSectionFactory<ELFT> &Factory) {
227   for (const std::unique_ptr<BaseCommand> &Base1 : Opt.Commands) {
228     if (auto *Cmd = dyn_cast<SymbolAssignment>(Base1.get())) {
229       if (shouldDefine<ELFT>(Cmd))
230         addRegular<ELFT>(Cmd);
231       continue;
232     }
233 
234     if (auto *Cmd = dyn_cast<OutputSectionCommand>(Base1.get())) {
235       if (Cmd->Name == "/DISCARD/") {
236         discard(*Cmd);
237         continue;
238       }
239 
240       std::vector<InputSectionBase<ELFT> *> V = createInputSectionList(*Cmd);
241       if (V.empty())
242         continue;
243 
244       for (InputSectionBase<ELFT> *Sec : V) {
245         OutputSectionBase<ELFT> *OutSec;
246         bool IsNew;
247         std::tie(OutSec, IsNew) = Factory.create(Sec, Cmd->Name);
248         if (IsNew)
249           OutputSections->push_back(OutSec);
250 
251         uint32_t Subalign = Cmd->SubalignExpr ? Cmd->SubalignExpr(0) : 0;
252 
253         if (Subalign)
254           Sec->Alignment = Subalign;
255         OutSec->addSection(Sec);
256       }
257     }
258   }
259 
260   // Add orphan sections.
261   for (const std::unique_ptr<ObjectFile<ELFT>> &F :
262        Symtab<ELFT>::X->getObjectFiles()) {
263     for (InputSectionBase<ELFT> *S : F->getSections()) {
264       if (isDiscarded(S) || S->OutSec)
265         continue;
266       OutputSectionBase<ELFT> *OutSec;
267       bool IsNew;
268       std::tie(OutSec, IsNew) = Factory.create(S, getOutputSectionName(S));
269       if (IsNew)
270         OutputSections->push_back(OutSec);
271       OutSec->addSection(S);
272     }
273   }
274 }
275 
276 // Sets value of a section-defined symbol. Two kinds of
277 // symbols are processed: synthetic symbols, whose value
278 // is an offset from beginning of section and regular
279 // symbols whose value is absolute.
280 template <class ELFT>
281 static void assignSectionSymbol(SymbolAssignment *Cmd,
282                                 OutputSectionBase<ELFT> *Sec,
283                                 typename ELFT::uint Off) {
284   if (!Cmd->Sym)
285     return;
286 
287   if (auto *Body = dyn_cast<DefinedSynthetic<ELFT>>(Cmd->Sym)) {
288     Body->Section = Sec;
289     Body->Value = Cmd->Expression(Sec->getVA() + Off) - Sec->getVA();
290     return;
291   }
292   auto *Body = cast<DefinedRegular<ELFT>>(Cmd->Sym);
293   Body->Value = Cmd->Expression(Sec->getVA() + Off);
294 }
295 
296 // Linker script may define start and end symbols for special section types,
297 // like .got, .eh_frame_hdr, .eh_frame and others. Those sections are not a list
298 // of regular input input sections, therefore our way of defining symbols for
299 // regular sections will not work. The approach we use for special section types
300 // is not perfect - it handles only start and end symbols.
301 template <class ELFT>
302 void addStartEndSymbols(OutputSectionCommand *Cmd,
303                         OutputSectionBase<ELFT> *Sec) {
304   bool Start = true;
305   BaseCommand *PrevCmd = nullptr;
306 
307   for (std::unique_ptr<BaseCommand> &Base : Cmd->Commands) {
308     if (auto *AssignCmd = dyn_cast<SymbolAssignment>(Base.get())) {
309       assignSectionSymbol<ELFT>(AssignCmd, Sec, Start ? 0 : Sec->getSize());
310     } else {
311       if (!Start && isa<SymbolAssignment>(PrevCmd))
312         error("section '" + Sec->getName() +
313               "' supports only start and end symbols");
314       Start = false;
315     }
316     PrevCmd = Base.get();
317   }
318 }
319 
320 template <class ELFT>
321 void assignOffsets(OutputSectionCommand *Cmd, OutputSectionBase<ELFT> *Sec) {
322   auto *OutSec = dyn_cast<OutputSection<ELFT>>(Sec);
323   if (!OutSec) {
324     Sec->assignOffsets();
325     // This section is not regular output section. However linker script may
326     // have defined start/end symbols for it. This case is handled below.
327     addStartEndSymbols(Cmd, Sec);
328     return;
329   }
330   typedef typename ELFT::uint uintX_t;
331   uintX_t Off = 0;
332   auto ItCmd = Cmd->Commands.begin();
333 
334   // Assigns values to all symbols following the given
335   // input section 'D' in output section 'Sec'. When symbols
336   // are in the beginning of output section the value of 'D'
337   // is nullptr.
338   auto AssignSuccessors = [&](InputSectionData *D) {
339     for (; ItCmd != Cmd->Commands.end(); ++ItCmd) {
340       auto *AssignCmd = dyn_cast<SymbolAssignment>(ItCmd->get());
341       if (!AssignCmd)
342         continue;
343       if (D != AssignCmd->GoesAfter)
344         break;
345 
346       if (AssignCmd->Name == ".") {
347         // Update to location counter means update to section size.
348         Off = AssignCmd->Expression(Sec->getVA() + Off) - Sec->getVA();
349         Sec->setSize(Off);
350         continue;
351       }
352       assignSectionSymbol<ELFT>(AssignCmd, Sec, Off);
353     }
354   };
355 
356   AssignSuccessors(nullptr);
357   for (InputSection<ELFT> *I : OutSec->Sections) {
358     Off = alignTo(Off, I->Alignment);
359     I->OutSecOff = Off;
360     Off += I->getSize();
361     // Update section size inside for-loop, so that SIZEOF
362     // works correctly in the case below:
363     // .foo { *(.aaa) a = SIZEOF(.foo); *(.bbb) }
364     Sec->setSize(Off);
365     // Add symbols following current input section.
366     AssignSuccessors(I);
367   }
368 }
369 
370 template <class ELFT>
371 static std::vector<OutputSectionBase<ELFT> *>
372 findSections(OutputSectionCommand &Cmd,
373              ArrayRef<OutputSectionBase<ELFT> *> Sections) {
374   std::vector<OutputSectionBase<ELFT> *> Ret;
375   for (OutputSectionBase<ELFT> *Sec : Sections)
376     if (Sec->getName() == Cmd.Name &&
377         checkConstraint(Sec->getFlags(), Cmd.Constraint))
378       Ret.push_back(Sec);
379   return Ret;
380 }
381 
382 template <class ELFT> void LinkerScript<ELFT>::assignAddresses() {
383   // Orphan sections are sections present in the input files which
384   // are not explicitly placed into the output file by the linker script.
385   // We place orphan sections at end of file.
386   // Other linkers places them using some heuristics as described in
387   // https://sourceware.org/binutils/docs/ld/Orphan-Sections.html#Orphan-Sections.
388   for (OutputSectionBase<ELFT> *Sec : *OutputSections) {
389     StringRef Name = Sec->getName();
390     if (getSectionIndex(Name) == INT_MAX)
391       Opt.Commands.push_back(llvm::make_unique<OutputSectionCommand>(Name));
392   }
393 
394   // Assign addresses as instructed by linker script SECTIONS sub-commands.
395   Dot = getHeaderSize();
396   uintX_t MinVA = std::numeric_limits<uintX_t>::max();
397   uintX_t ThreadBssOffset = 0;
398 
399   for (const std::unique_ptr<BaseCommand> &Base : Opt.Commands) {
400     if (auto *Cmd = dyn_cast<SymbolAssignment>(Base.get())) {
401       if (Cmd->Name == ".") {
402         Dot = Cmd->Expression(Dot);
403       } else if (Cmd->Sym) {
404         cast<DefinedRegular<ELFT>>(Cmd->Sym)->Value = Cmd->Expression(Dot);
405       }
406       continue;
407     }
408 
409     if (auto *Cmd = dyn_cast<AssertCommand>(Base.get())) {
410       Cmd->Expression(Dot);
411       continue;
412     }
413 
414     auto *Cmd = cast<OutputSectionCommand>(Base.get());
415     for (OutputSectionBase<ELFT> *Sec :
416          findSections<ELFT>(*Cmd, *OutputSections)) {
417 
418       if (Cmd->AddrExpr)
419         Dot = Cmd->AddrExpr(Dot);
420 
421       if (Cmd->AlignExpr)
422         Sec->updateAlignment(Cmd->AlignExpr(Dot));
423 
424       if ((Sec->getFlags() & SHF_TLS) && Sec->getType() == SHT_NOBITS) {
425         uintX_t TVA = Dot + ThreadBssOffset;
426         TVA = alignTo(TVA, Sec->getAlignment());
427         Sec->setVA(TVA);
428         assignOffsets(Cmd, Sec);
429         ThreadBssOffset = TVA - Dot + Sec->getSize();
430         continue;
431       }
432 
433       if (!(Sec->getFlags() & SHF_ALLOC)) {
434         assignOffsets(Cmd, Sec);
435         continue;
436       }
437 
438       Dot = alignTo(Dot, Sec->getAlignment());
439       Sec->setVA(Dot);
440       assignOffsets(Cmd, Sec);
441       MinVA = std::min(MinVA, Dot);
442       Dot += Sec->getSize();
443     }
444   }
445 
446   // ELF and Program headers need to be right before the first section in
447   // memory. Set their addresses accordingly.
448   MinVA = alignDown(MinVA - Out<ELFT>::ElfHeader->getSize() -
449                         Out<ELFT>::ProgramHeaders->getSize(),
450                     Target->PageSize);
451   Out<ELFT>::ElfHeader->setVA(MinVA);
452   Out<ELFT>::ProgramHeaders->setVA(Out<ELFT>::ElfHeader->getSize() + MinVA);
453 }
454 
455 // Creates program headers as instructed by PHDRS linker script command.
456 template <class ELFT>
457 std::vector<PhdrEntry<ELFT>> LinkerScript<ELFT>::createPhdrs() {
458   std::vector<PhdrEntry<ELFT>> Ret;
459 
460   // Process PHDRS and FILEHDR keywords because they are not
461   // real output sections and cannot be added in the following loop.
462   for (const PhdrsCommand &Cmd : Opt.PhdrsCommands) {
463     Ret.emplace_back(Cmd.Type, Cmd.Flags == UINT_MAX ? PF_R : Cmd.Flags);
464     PhdrEntry<ELFT> &Phdr = Ret.back();
465 
466     if (Cmd.HasFilehdr)
467       Phdr.add(Out<ELFT>::ElfHeader);
468     if (Cmd.HasPhdrs)
469       Phdr.add(Out<ELFT>::ProgramHeaders);
470   }
471 
472   // Add output sections to program headers.
473   PhdrEntry<ELFT> *Load = nullptr;
474   uintX_t Flags = PF_R;
475   for (OutputSectionBase<ELFT> *Sec : *OutputSections) {
476     if (!(Sec->getFlags() & SHF_ALLOC))
477       break;
478 
479     std::vector<size_t> PhdrIds = getPhdrIndices(Sec->getName());
480     if (!PhdrIds.empty()) {
481       // Assign headers specified by linker script
482       for (size_t Id : PhdrIds) {
483         Ret[Id].add(Sec);
484         if (Opt.PhdrsCommands[Id].Flags == UINT_MAX)
485           Ret[Id].H.p_flags |= Sec->getPhdrFlags();
486       }
487     } else {
488       // If we have no load segment or flags've changed then we want new load
489       // segment.
490       uintX_t NewFlags = Sec->getPhdrFlags();
491       if (Load == nullptr || Flags != NewFlags) {
492         Load = &*Ret.emplace(Ret.end(), PT_LOAD, NewFlags);
493         Flags = NewFlags;
494       }
495       Load->add(Sec);
496     }
497   }
498   return Ret;
499 }
500 
501 template <class ELFT> bool LinkerScript<ELFT>::ignoreInterpSection() {
502   // Ignore .interp section in case we have PHDRS specification
503   // and PT_INTERP isn't listed.
504   return !Opt.PhdrsCommands.empty() &&
505          llvm::find_if(Opt.PhdrsCommands, [](const PhdrsCommand &Cmd) {
506            return Cmd.Type == PT_INTERP;
507          }) == Opt.PhdrsCommands.end();
508 }
509 
510 template <class ELFT>
511 ArrayRef<uint8_t> LinkerScript<ELFT>::getFiller(StringRef Name) {
512   for (const std::unique_ptr<BaseCommand> &Base : Opt.Commands)
513     if (auto *Cmd = dyn_cast<OutputSectionCommand>(Base.get()))
514       if (Cmd->Name == Name)
515         return Cmd->Filler;
516   return {};
517 }
518 
519 template <class ELFT> Expr LinkerScript<ELFT>::getLma(StringRef Name) {
520   for (const std::unique_ptr<BaseCommand> &Base : Opt.Commands)
521     if (auto *Cmd = dyn_cast<OutputSectionCommand>(Base.get()))
522       if (Cmd->LmaExpr && Cmd->Name == Name)
523         return Cmd->LmaExpr;
524   return {};
525 }
526 
527 // Returns the index of the given section name in linker script
528 // SECTIONS commands. Sections are laid out as the same order as they
529 // were in the script. If a given name did not appear in the script,
530 // it returns INT_MAX, so that it will be laid out at end of file.
531 template <class ELFT> int LinkerScript<ELFT>::getSectionIndex(StringRef Name) {
532   int I = 0;
533   for (std::unique_ptr<BaseCommand> &Base : Opt.Commands) {
534     if (auto *Cmd = dyn_cast<OutputSectionCommand>(Base.get()))
535       if (Cmd->Name == Name)
536         return I;
537     ++I;
538   }
539   return INT_MAX;
540 }
541 
542 // A compartor to sort output sections. Returns -1 or 1 if
543 // A or B are mentioned in linker script. Otherwise, returns 0.
544 template <class ELFT>
545 int LinkerScript<ELFT>::compareSections(StringRef A, StringRef B) {
546   int I = getSectionIndex(A);
547   int J = getSectionIndex(B);
548   if (I == INT_MAX && J == INT_MAX)
549     return 0;
550   return I < J ? -1 : 1;
551 }
552 
553 template <class ELFT> bool LinkerScript<ELFT>::hasPhdrsCommands() {
554   return !Opt.PhdrsCommands.empty();
555 }
556 
557 template <class ELFT>
558 uint64_t LinkerScript<ELFT>::getOutputSectionAddress(StringRef Name) {
559   for (OutputSectionBase<ELFT> *Sec : *OutputSections)
560     if (Sec->getName() == Name)
561       return Sec->getVA();
562   error("undefined section " + Name);
563   return 0;
564 }
565 
566 template <class ELFT>
567 uint64_t LinkerScript<ELFT>::getOutputSectionSize(StringRef Name) {
568   for (OutputSectionBase<ELFT> *Sec : *OutputSections)
569     if (Sec->getName() == Name)
570       return Sec->getSize();
571   error("undefined section " + Name);
572   return 0;
573 }
574 
575 template <class ELFT>
576 uint64_t LinkerScript<ELFT>::getOutputSectionAlign(StringRef Name) {
577   for (OutputSectionBase<ELFT> *Sec : *OutputSections)
578     if (Sec->getName() == Name)
579       return Sec->getAlignment();
580   error("undefined section " + Name);
581   return 0;
582 }
583 
584 template <class ELFT> uint64_t LinkerScript<ELFT>::getHeaderSize() {
585   return Out<ELFT>::ElfHeader->getSize() + Out<ELFT>::ProgramHeaders->getSize();
586 }
587 
588 template <class ELFT> uint64_t LinkerScript<ELFT>::getSymbolValue(StringRef S) {
589   if (SymbolBody *B = Symtab<ELFT>::X->find(S))
590     return B->getVA<ELFT>();
591   error("symbol not found: " + S);
592   return 0;
593 }
594 
595 // Returns indices of ELF headers containing specific section, identified
596 // by Name. Each index is a zero based number of ELF header listed within
597 // PHDRS {} script block.
598 template <class ELFT>
599 std::vector<size_t> LinkerScript<ELFT>::getPhdrIndices(StringRef SectionName) {
600   for (const std::unique_ptr<BaseCommand> &Base : Opt.Commands) {
601     auto *Cmd = dyn_cast<OutputSectionCommand>(Base.get());
602     if (!Cmd || Cmd->Name != SectionName)
603       continue;
604 
605     std::vector<size_t> Ret;
606     for (StringRef PhdrName : Cmd->Phdrs)
607       Ret.push_back(getPhdrIndex(PhdrName));
608     return Ret;
609   }
610   return {};
611 }
612 
613 template <class ELFT>
614 size_t LinkerScript<ELFT>::getPhdrIndex(StringRef PhdrName) {
615   size_t I = 0;
616   for (PhdrsCommand &Cmd : Opt.PhdrsCommands) {
617     if (Cmd.Name == PhdrName)
618       return I;
619     ++I;
620   }
621   error("section header '" + PhdrName + "' is not listed in PHDRS");
622   return 0;
623 }
624 
625 class elf::ScriptParser : public ScriptParserBase {
626   typedef void (ScriptParser::*Handler)();
627 
628 public:
629   ScriptParser(StringRef S, bool B) : ScriptParserBase(S), IsUnderSysroot(B) {}
630 
631   void readLinkerScript();
632   void readVersionScript();
633 
634 private:
635   void addFile(StringRef Path);
636 
637   void readAsNeeded();
638   void readEntry();
639   void readExtern();
640   void readGroup();
641   void readInclude();
642   void readOutput();
643   void readOutputArch();
644   void readOutputFormat();
645   void readPhdrs();
646   void readSearchDir();
647   void readSections();
648   void readVersion();
649   void readVersionScriptCommand();
650 
651   SymbolAssignment *readAssignment(StringRef Name);
652   std::vector<uint8_t> readFill();
653   OutputSectionCommand *readOutputSectionDescription(StringRef OutSec);
654   std::vector<uint8_t> readOutputSectionFiller(StringRef Tok);
655   std::vector<StringRef> readOutputSectionPhdrs();
656   InputSectionDescription *readInputSectionDescription(StringRef Tok);
657   Regex readFilePatterns();
658   InputSectionDescription *readInputSectionRules(StringRef FilePattern);
659   unsigned readPhdrType();
660   SortKind readSortKind();
661   SymbolAssignment *readProvideHidden(bool Provide, bool Hidden);
662   SymbolAssignment *readProvideOrAssignment(StringRef Tok, bool MakeAbsolute);
663   void readSort();
664   Expr readAssert();
665 
666   Expr readExpr();
667   Expr readExpr1(Expr Lhs, int MinPrec);
668   Expr readPrimary();
669   Expr readTernary(Expr Cond);
670   Expr readParenExpr();
671 
672   // For parsing version script.
673   void readExtern(std::vector<SymbolVersion> *Globals);
674   void readVersionDeclaration(StringRef VerStr);
675   void readGlobal(StringRef VerStr);
676   void readLocal();
677 
678   ScriptConfiguration &Opt = *ScriptConfig;
679   StringSaver Saver = {ScriptConfig->Alloc};
680   bool IsUnderSysroot;
681 };
682 
683 void ScriptParser::readVersionScript() {
684   readVersionScriptCommand();
685   if (!atEOF())
686     setError("EOF expected, but got " + next());
687 }
688 
689 void ScriptParser::readVersionScriptCommand() {
690   if (skip("{")) {
691     readVersionDeclaration("");
692     return;
693   }
694 
695   while (!atEOF() && !Error && peek() != "}") {
696     StringRef VerStr = next();
697     if (VerStr == "{") {
698       setError("anonymous version definition is used in "
699                "combination with other version definitions");
700       return;
701     }
702     expect("{");
703     readVersionDeclaration(VerStr);
704   }
705 }
706 
707 void ScriptParser::readVersion() {
708   expect("{");
709   readVersionScriptCommand();
710   expect("}");
711 }
712 
713 void ScriptParser::readLinkerScript() {
714   while (!atEOF()) {
715     StringRef Tok = next();
716     if (Tok == ";")
717       continue;
718 
719     if (Tok == "ENTRY") {
720       readEntry();
721     } else if (Tok == "EXTERN") {
722       readExtern();
723     } else if (Tok == "GROUP" || Tok == "INPUT") {
724       readGroup();
725     } else if (Tok == "INCLUDE") {
726       readInclude();
727     } else if (Tok == "OUTPUT") {
728       readOutput();
729     } else if (Tok == "OUTPUT_ARCH") {
730       readOutputArch();
731     } else if (Tok == "OUTPUT_FORMAT") {
732       readOutputFormat();
733     } else if (Tok == "PHDRS") {
734       readPhdrs();
735     } else if (Tok == "SEARCH_DIR") {
736       readSearchDir();
737     } else if (Tok == "SECTIONS") {
738       readSections();
739     } else if (Tok == "VERSION") {
740       readVersion();
741     } else if (SymbolAssignment *Cmd = readProvideOrAssignment(Tok, true)) {
742       if (Opt.HasContents)
743         Opt.Commands.emplace_back(Cmd);
744       else
745         Opt.Assignments.emplace_back(Cmd);
746     } else {
747       setError("unknown directive: " + Tok);
748     }
749   }
750 }
751 
752 void ScriptParser::addFile(StringRef S) {
753   if (IsUnderSysroot && S.startswith("/")) {
754     SmallString<128> Path;
755     (Config->Sysroot + S).toStringRef(Path);
756     if (sys::fs::exists(Path)) {
757       Driver->addFile(Saver.save(Path.str()));
758       return;
759     }
760   }
761 
762   if (sys::path::is_absolute(S)) {
763     Driver->addFile(S);
764   } else if (S.startswith("=")) {
765     if (Config->Sysroot.empty())
766       Driver->addFile(S.substr(1));
767     else
768       Driver->addFile(Saver.save(Config->Sysroot + "/" + S.substr(1)));
769   } else if (S.startswith("-l")) {
770     Driver->addLibrary(S.substr(2));
771   } else if (sys::fs::exists(S)) {
772     Driver->addFile(S);
773   } else {
774     std::string Path = findFromSearchPaths(S);
775     if (Path.empty())
776       setError("unable to find " + S);
777     else
778       Driver->addFile(Saver.save(Path));
779   }
780 }
781 
782 void ScriptParser::readAsNeeded() {
783   expect("(");
784   bool Orig = Config->AsNeeded;
785   Config->AsNeeded = true;
786   while (!Error && !skip(")"))
787     addFile(next());
788   Config->AsNeeded = Orig;
789 }
790 
791 void ScriptParser::readEntry() {
792   // -e <symbol> takes predecence over ENTRY(<symbol>).
793   expect("(");
794   StringRef Tok = next();
795   if (Config->Entry.empty())
796     Config->Entry = Tok;
797   expect(")");
798 }
799 
800 void ScriptParser::readExtern() {
801   expect("(");
802   while (!Error && !skip(")"))
803     Config->Undefined.push_back(next());
804 }
805 
806 void ScriptParser::readGroup() {
807   expect("(");
808   while (!Error && !skip(")")) {
809     StringRef Tok = next();
810     if (Tok == "AS_NEEDED")
811       readAsNeeded();
812     else
813       addFile(Tok);
814   }
815 }
816 
817 void ScriptParser::readInclude() {
818   StringRef Tok = next();
819   auto MBOrErr = MemoryBuffer::getFile(Tok);
820   if (!MBOrErr) {
821     setError("cannot open " + Tok);
822     return;
823   }
824   std::unique_ptr<MemoryBuffer> &MB = *MBOrErr;
825   StringRef S = Saver.save(MB->getMemBufferRef().getBuffer());
826   std::vector<StringRef> V = tokenize(S);
827   Tokens.insert(Tokens.begin() + Pos, V.begin(), V.end());
828 }
829 
830 void ScriptParser::readOutput() {
831   // -o <file> takes predecence over OUTPUT(<file>).
832   expect("(");
833   StringRef Tok = next();
834   if (Config->OutputFile.empty())
835     Config->OutputFile = Tok;
836   expect(")");
837 }
838 
839 void ScriptParser::readOutputArch() {
840   // Error checking only for now.
841   expect("(");
842   next();
843   expect(")");
844 }
845 
846 void ScriptParser::readOutputFormat() {
847   // Error checking only for now.
848   expect("(");
849   next();
850   StringRef Tok = next();
851   if (Tok == ")")
852     return;
853   if (Tok != ",") {
854     setError("unexpected token: " + Tok);
855     return;
856   }
857   next();
858   expect(",");
859   next();
860   expect(")");
861 }
862 
863 void ScriptParser::readPhdrs() {
864   expect("{");
865   while (!Error && !skip("}")) {
866     StringRef Tok = next();
867     Opt.PhdrsCommands.push_back({Tok, PT_NULL, false, false, UINT_MAX});
868     PhdrsCommand &PhdrCmd = Opt.PhdrsCommands.back();
869 
870     PhdrCmd.Type = readPhdrType();
871     do {
872       Tok = next();
873       if (Tok == ";")
874         break;
875       if (Tok == "FILEHDR")
876         PhdrCmd.HasFilehdr = true;
877       else if (Tok == "PHDRS")
878         PhdrCmd.HasPhdrs = true;
879       else if (Tok == "FLAGS") {
880         expect("(");
881         // Passing 0 for the value of dot is a bit of a hack. It means that
882         // we accept expressions like ".|1".
883         PhdrCmd.Flags = readExpr()(0);
884         expect(")");
885       } else
886         setError("unexpected header attribute: " + Tok);
887     } while (!Error);
888   }
889 }
890 
891 void ScriptParser::readSearchDir() {
892   expect("(");
893   if (!Config->Nostdlib)
894     Config->SearchPaths.push_back(next());
895   expect(")");
896 }
897 
898 void ScriptParser::readSections() {
899   Opt.HasContents = true;
900   expect("{");
901   while (!Error && !skip("}")) {
902     StringRef Tok = next();
903     BaseCommand *Cmd = readProvideOrAssignment(Tok, true);
904     if (!Cmd) {
905       if (Tok == "ASSERT")
906         Cmd = new AssertCommand(readAssert());
907       else
908         Cmd = readOutputSectionDescription(Tok);
909     }
910     Opt.Commands.emplace_back(Cmd);
911   }
912 }
913 
914 static int precedence(StringRef Op) {
915   return StringSwitch<int>(Op)
916       .Case("*", 4)
917       .Case("/", 4)
918       .Case("+", 3)
919       .Case("-", 3)
920       .Case("<", 2)
921       .Case(">", 2)
922       .Case(">=", 2)
923       .Case("<=", 2)
924       .Case("==", 2)
925       .Case("!=", 2)
926       .Case("&", 1)
927       .Case("|", 1)
928       .Default(-1);
929 }
930 
931 Regex ScriptParser::readFilePatterns() {
932   std::vector<StringRef> V;
933   while (!Error && !skip(")"))
934     V.push_back(next());
935   return compileGlobPatterns(V);
936 }
937 
938 SortKind ScriptParser::readSortKind() {
939   if (skip("SORT") || skip("SORT_BY_NAME"))
940     return SortByName;
941   if (skip("SORT_BY_ALIGNMENT"))
942     return SortByAlignment;
943   return SortNone;
944 }
945 
946 InputSectionDescription *
947 ScriptParser::readInputSectionRules(StringRef FilePattern) {
948   auto *Cmd = new InputSectionDescription(FilePattern);
949   expect("(");
950 
951   // Read EXCLUDE_FILE().
952   if (skip("EXCLUDE_FILE")) {
953     expect("(");
954     Cmd->ExcludedFileRe = readFilePatterns();
955   }
956 
957   // Read SORT().
958   if (SortKind K1 = readSortKind()) {
959     Cmd->SortOuter = K1;
960     expect("(");
961     if (SortKind K2 = readSortKind()) {
962       Cmd->SortInner = K2;
963       expect("(");
964       Cmd->SectionRe = readFilePatterns();
965       expect(")");
966     } else {
967       Cmd->SectionRe = readFilePatterns();
968     }
969     expect(")");
970     return Cmd;
971   }
972 
973   Cmd->SectionRe = readFilePatterns();
974   return Cmd;
975 }
976 
977 InputSectionDescription *
978 ScriptParser::readInputSectionDescription(StringRef Tok) {
979   // Input section wildcard can be surrounded by KEEP.
980   // https://sourceware.org/binutils/docs/ld/Input-Section-Keep.html#Input-Section-Keep
981   if (Tok == "KEEP") {
982     expect("(");
983     StringRef FilePattern = next();
984     InputSectionDescription *Cmd = readInputSectionRules(FilePattern);
985     expect(")");
986     Opt.KeptSections.push_back(&Cmd->SectionRe);
987     return Cmd;
988   }
989   return readInputSectionRules(Tok);
990 }
991 
992 void ScriptParser::readSort() {
993   expect("(");
994   expect("CONSTRUCTORS");
995   expect(")");
996 }
997 
998 Expr ScriptParser::readAssert() {
999   expect("(");
1000   Expr E = readExpr();
1001   expect(",");
1002   StringRef Msg = next();
1003   expect(")");
1004   return [=](uint64_t Dot) {
1005     uint64_t V = E(Dot);
1006     if (!V)
1007       error(Msg);
1008     return V;
1009   };
1010 }
1011 
1012 // Reads a FILL(expr) command. We handle the FILL command as an
1013 // alias for =fillexp section attribute, which is different from
1014 // what GNU linkers do.
1015 // https://sourceware.org/binutils/docs/ld/Output-Section-Data.html
1016 std::vector<uint8_t> ScriptParser::readFill() {
1017   expect("(");
1018   std::vector<uint8_t> V = readOutputSectionFiller(next());
1019   expect(")");
1020   expect(";");
1021   return V;
1022 }
1023 
1024 OutputSectionCommand *
1025 ScriptParser::readOutputSectionDescription(StringRef OutSec) {
1026   OutputSectionCommand *Cmd = new OutputSectionCommand(OutSec);
1027 
1028   // Read an address expression.
1029   // https://sourceware.org/binutils/docs/ld/Output-Section-Address.html#Output-Section-Address
1030   if (peek() != ":")
1031     Cmd->AddrExpr = readExpr();
1032 
1033   expect(":");
1034 
1035   if (skip("AT"))
1036     Cmd->LmaExpr = readParenExpr();
1037   if (skip("ALIGN"))
1038     Cmd->AlignExpr = readParenExpr();
1039   if (skip("SUBALIGN"))
1040     Cmd->SubalignExpr = readParenExpr();
1041 
1042   // Parse constraints.
1043   if (skip("ONLY_IF_RO"))
1044     Cmd->Constraint = ConstraintKind::ReadOnly;
1045   if (skip("ONLY_IF_RW"))
1046     Cmd->Constraint = ConstraintKind::ReadWrite;
1047   expect("{");
1048 
1049   while (!Error && !skip("}")) {
1050     StringRef Tok = next();
1051     if (SymbolAssignment *Assignment = readProvideOrAssignment(Tok, false))
1052       Cmd->Commands.emplace_back(Assignment);
1053     else if (Tok == "FILL")
1054       Cmd->Filler = readFill();
1055     else if (Tok == "SORT")
1056       readSort();
1057     else if (peek() == "(")
1058       Cmd->Commands.emplace_back(readInputSectionDescription(Tok));
1059     else
1060       setError("unknown command " + Tok);
1061   }
1062   Cmd->Phdrs = readOutputSectionPhdrs();
1063   if (peek().startswith("="))
1064     Cmd->Filler = readOutputSectionFiller(next().drop_front());
1065   return Cmd;
1066 }
1067 
1068 // Read "=<number>" where <number> is an octal/decimal/hexadecimal number.
1069 // https://sourceware.org/binutils/docs/ld/Output-Section-Fill.html
1070 //
1071 // ld.gold is not fully compatible with ld.bfd. ld.bfd handles
1072 // hexstrings as blobs of arbitrary sizes, while ld.gold handles them
1073 // as 32-bit big-endian values. We will do the same as ld.gold does
1074 // because it's simpler than what ld.bfd does.
1075 std::vector<uint8_t> ScriptParser::readOutputSectionFiller(StringRef Tok) {
1076   uint32_t V;
1077   if (Tok.getAsInteger(0, V)) {
1078     setError("invalid filler expression: " + Tok);
1079     return {};
1080   }
1081   return {uint8_t(V >> 24), uint8_t(V >> 16), uint8_t(V >> 8), uint8_t(V)};
1082 }
1083 
1084 SymbolAssignment *ScriptParser::readProvideHidden(bool Provide, bool Hidden) {
1085   expect("(");
1086   SymbolAssignment *Cmd = readAssignment(next());
1087   Cmd->Provide = Provide;
1088   Cmd->Hidden = Hidden;
1089   expect(")");
1090   expect(";");
1091   return Cmd;
1092 }
1093 
1094 SymbolAssignment *ScriptParser::readProvideOrAssignment(StringRef Tok,
1095                                                         bool MakeAbsolute) {
1096   SymbolAssignment *Cmd = nullptr;
1097   if (peek() == "=" || peek() == "+=") {
1098     Cmd = readAssignment(Tok);
1099     expect(";");
1100   } else if (Tok == "PROVIDE") {
1101     Cmd = readProvideHidden(true, false);
1102   } else if (Tok == "HIDDEN") {
1103     Cmd = readProvideHidden(false, true);
1104   } else if (Tok == "PROVIDE_HIDDEN") {
1105     Cmd = readProvideHidden(true, true);
1106   }
1107   if (Cmd && MakeAbsolute)
1108     Cmd->IsAbsolute = true;
1109   return Cmd;
1110 }
1111 
1112 static uint64_t getSymbolValue(StringRef S, uint64_t Dot) {
1113   if (S == ".")
1114     return Dot;
1115   return ScriptBase->getSymbolValue(S);
1116 }
1117 
1118 SymbolAssignment *ScriptParser::readAssignment(StringRef Name) {
1119   StringRef Op = next();
1120   bool IsAbsolute = false;
1121   Expr E;
1122   assert(Op == "=" || Op == "+=");
1123   if (skip("ABSOLUTE")) {
1124     E = readParenExpr();
1125     IsAbsolute = true;
1126   } else {
1127     E = readExpr();
1128   }
1129   if (Op == "+=")
1130     E = [=](uint64_t Dot) { return getSymbolValue(Name, Dot) + E(Dot); };
1131   return new SymbolAssignment(Name, E, IsAbsolute);
1132 }
1133 
1134 // This is an operator-precedence parser to parse a linker
1135 // script expression.
1136 Expr ScriptParser::readExpr() { return readExpr1(readPrimary(), 0); }
1137 
1138 static Expr combine(StringRef Op, Expr L, Expr R) {
1139   if (Op == "*")
1140     return [=](uint64_t Dot) { return L(Dot) * R(Dot); };
1141   if (Op == "/") {
1142     return [=](uint64_t Dot) -> uint64_t {
1143       uint64_t RHS = R(Dot);
1144       if (RHS == 0) {
1145         error("division by zero");
1146         return 0;
1147       }
1148       return L(Dot) / RHS;
1149     };
1150   }
1151   if (Op == "+")
1152     return [=](uint64_t Dot) { return L(Dot) + R(Dot); };
1153   if (Op == "-")
1154     return [=](uint64_t Dot) { return L(Dot) - R(Dot); };
1155   if (Op == "<")
1156     return [=](uint64_t Dot) { return L(Dot) < R(Dot); };
1157   if (Op == ">")
1158     return [=](uint64_t Dot) { return L(Dot) > R(Dot); };
1159   if (Op == ">=")
1160     return [=](uint64_t Dot) { return L(Dot) >= R(Dot); };
1161   if (Op == "<=")
1162     return [=](uint64_t Dot) { return L(Dot) <= R(Dot); };
1163   if (Op == "==")
1164     return [=](uint64_t Dot) { return L(Dot) == R(Dot); };
1165   if (Op == "!=")
1166     return [=](uint64_t Dot) { return L(Dot) != R(Dot); };
1167   if (Op == "&")
1168     return [=](uint64_t Dot) { return L(Dot) & R(Dot); };
1169   if (Op == "|")
1170     return [=](uint64_t Dot) { return L(Dot) | R(Dot); };
1171   llvm_unreachable("invalid operator");
1172 }
1173 
1174 // This is a part of the operator-precedence parser. This function
1175 // assumes that the remaining token stream starts with an operator.
1176 Expr ScriptParser::readExpr1(Expr Lhs, int MinPrec) {
1177   while (!atEOF() && !Error) {
1178     // Read an operator and an expression.
1179     StringRef Op1 = peek();
1180     if (Op1 == "?")
1181       return readTernary(Lhs);
1182     if (precedence(Op1) < MinPrec)
1183       break;
1184     next();
1185     Expr Rhs = readPrimary();
1186 
1187     // Evaluate the remaining part of the expression first if the
1188     // next operator has greater precedence than the previous one.
1189     // For example, if we have read "+" and "3", and if the next
1190     // operator is "*", then we'll evaluate 3 * ... part first.
1191     while (!atEOF()) {
1192       StringRef Op2 = peek();
1193       if (precedence(Op2) <= precedence(Op1))
1194         break;
1195       Rhs = readExpr1(Rhs, precedence(Op2));
1196     }
1197 
1198     Lhs = combine(Op1, Lhs, Rhs);
1199   }
1200   return Lhs;
1201 }
1202 
1203 uint64_t static getConstant(StringRef S) {
1204   if (S == "COMMONPAGESIZE")
1205     return Target->PageSize;
1206   if (S == "MAXPAGESIZE")
1207     return Target->MaxPageSize;
1208   error("unknown constant: " + S);
1209   return 0;
1210 }
1211 
1212 // Parses Tok as an integer. Returns true if successful.
1213 // It recognizes hexadecimal (prefixed with "0x" or suffixed with "H")
1214 // and decimal numbers. Decimal numbers may have "K" (kilo) or
1215 // "M" (mega) prefixes.
1216 static bool readInteger(StringRef Tok, uint64_t &Result) {
1217   if (Tok.startswith("-")) {
1218     if (!readInteger(Tok.substr(1), Result))
1219       return false;
1220     Result = -Result;
1221     return true;
1222   }
1223   if (Tok.startswith_lower("0x"))
1224     return !Tok.substr(2).getAsInteger(16, Result);
1225   if (Tok.endswith_lower("H"))
1226     return !Tok.drop_back().getAsInteger(16, Result);
1227 
1228   int Suffix = 1;
1229   if (Tok.endswith_lower("K")) {
1230     Suffix = 1024;
1231     Tok = Tok.drop_back();
1232   } else if (Tok.endswith_lower("M")) {
1233     Suffix = 1024 * 1024;
1234     Tok = Tok.drop_back();
1235   }
1236   if (Tok.getAsInteger(10, Result))
1237     return false;
1238   Result *= Suffix;
1239   return true;
1240 }
1241 
1242 Expr ScriptParser::readPrimary() {
1243   if (peek() == "(")
1244     return readParenExpr();
1245 
1246   StringRef Tok = next();
1247 
1248   if (Tok == "~") {
1249     Expr E = readPrimary();
1250     return [=](uint64_t Dot) { return ~E(Dot); };
1251   }
1252   if (Tok == "-") {
1253     Expr E = readPrimary();
1254     return [=](uint64_t Dot) { return -E(Dot); };
1255   }
1256 
1257   // Built-in functions are parsed here.
1258   // https://sourceware.org/binutils/docs/ld/Builtin-Functions.html.
1259   if (Tok == "ADDR") {
1260     expect("(");
1261     StringRef Name = next();
1262     expect(")");
1263     return
1264         [=](uint64_t Dot) { return ScriptBase->getOutputSectionAddress(Name); };
1265   }
1266   if (Tok == "ASSERT")
1267     return readAssert();
1268   if (Tok == "ALIGN") {
1269     Expr E = readParenExpr();
1270     return [=](uint64_t Dot) { return alignTo(Dot, E(Dot)); };
1271   }
1272   if (Tok == "CONSTANT") {
1273     expect("(");
1274     StringRef Tok = next();
1275     expect(")");
1276     return [=](uint64_t Dot) { return getConstant(Tok); };
1277   }
1278   if (Tok == "SEGMENT_START") {
1279     expect("(");
1280     next();
1281     expect(",");
1282     uint64_t Val;
1283     next().getAsInteger(0, Val);
1284     expect(")");
1285     return [=](uint64_t Dot) { return Val; };
1286   }
1287   if (Tok == "DATA_SEGMENT_ALIGN") {
1288     expect("(");
1289     Expr E = readExpr();
1290     expect(",");
1291     readExpr();
1292     expect(")");
1293     return [=](uint64_t Dot) { return alignTo(Dot, E(Dot)); };
1294   }
1295   if (Tok == "DATA_SEGMENT_END") {
1296     expect("(");
1297     expect(".");
1298     expect(")");
1299     return [](uint64_t Dot) { return Dot; };
1300   }
1301   // GNU linkers implements more complicated logic to handle
1302   // DATA_SEGMENT_RELRO_END. We instead ignore the arguments and just align to
1303   // the next page boundary for simplicity.
1304   if (Tok == "DATA_SEGMENT_RELRO_END") {
1305     expect("(");
1306     next();
1307     expect(",");
1308     readExpr();
1309     expect(")");
1310     return [](uint64_t Dot) { return alignTo(Dot, Target->PageSize); };
1311   }
1312   if (Tok == "SIZEOF") {
1313     expect("(");
1314     StringRef Name = next();
1315     expect(")");
1316     return [=](uint64_t Dot) { return ScriptBase->getOutputSectionSize(Name); };
1317   }
1318   if (Tok == "ALIGNOF") {
1319     expect("(");
1320     StringRef Name = next();
1321     expect(")");
1322     return
1323         [=](uint64_t Dot) { return ScriptBase->getOutputSectionAlign(Name); };
1324   }
1325   if (Tok == "SIZEOF_HEADERS")
1326     return [=](uint64_t Dot) { return ScriptBase->getHeaderSize(); };
1327 
1328   // Tok is a literal number.
1329   uint64_t V;
1330   if (readInteger(Tok, V))
1331     return [=](uint64_t Dot) { return V; };
1332 
1333   // Tok is a symbol name.
1334   if (Tok != "." && !isValidCIdentifier(Tok))
1335     setError("malformed number: " + Tok);
1336   return [=](uint64_t Dot) { return getSymbolValue(Tok, Dot); };
1337 }
1338 
1339 Expr ScriptParser::readTernary(Expr Cond) {
1340   next();
1341   Expr L = readExpr();
1342   expect(":");
1343   Expr R = readExpr();
1344   return [=](uint64_t Dot) { return Cond(Dot) ? L(Dot) : R(Dot); };
1345 }
1346 
1347 Expr ScriptParser::readParenExpr() {
1348   expect("(");
1349   Expr E = readExpr();
1350   expect(")");
1351   return E;
1352 }
1353 
1354 std::vector<StringRef> ScriptParser::readOutputSectionPhdrs() {
1355   std::vector<StringRef> Phdrs;
1356   while (!Error && peek().startswith(":")) {
1357     StringRef Tok = next();
1358     Tok = (Tok.size() == 1) ? next() : Tok.substr(1);
1359     if (Tok.empty()) {
1360       setError("section header name is empty");
1361       break;
1362     }
1363     Phdrs.push_back(Tok);
1364   }
1365   return Phdrs;
1366 }
1367 
1368 unsigned ScriptParser::readPhdrType() {
1369   StringRef Tok = next();
1370   unsigned Ret = StringSwitch<unsigned>(Tok)
1371                      .Case("PT_NULL", PT_NULL)
1372                      .Case("PT_LOAD", PT_LOAD)
1373                      .Case("PT_DYNAMIC", PT_DYNAMIC)
1374                      .Case("PT_INTERP", PT_INTERP)
1375                      .Case("PT_NOTE", PT_NOTE)
1376                      .Case("PT_SHLIB", PT_SHLIB)
1377                      .Case("PT_PHDR", PT_PHDR)
1378                      .Case("PT_TLS", PT_TLS)
1379                      .Case("PT_GNU_EH_FRAME", PT_GNU_EH_FRAME)
1380                      .Case("PT_GNU_STACK", PT_GNU_STACK)
1381                      .Case("PT_GNU_RELRO", PT_GNU_RELRO)
1382                      .Default(-1);
1383 
1384   if (Ret == (unsigned)-1) {
1385     setError("invalid program header type: " + Tok);
1386     return PT_NULL;
1387   }
1388   return Ret;
1389 }
1390 
1391 void ScriptParser::readVersionDeclaration(StringRef VerStr) {
1392   // Identifiers start at 2 because 0 and 1 are reserved
1393   // for VER_NDX_LOCAL and VER_NDX_GLOBAL constants.
1394   size_t VersionId = Config->VersionDefinitions.size() + 2;
1395   Config->VersionDefinitions.push_back({VerStr, VersionId});
1396 
1397   if (skip("global:") || peek() != "local:")
1398     readGlobal(VerStr);
1399   if (skip("local:"))
1400     readLocal();
1401   expect("}");
1402 
1403   // Each version may have a parent version. For example, "Ver2" defined as
1404   // "Ver2 { global: foo; local: *; } Ver1;" has "Ver1" as a parent. This
1405   // version hierarchy is, probably against your instinct, purely for human; the
1406   // runtime doesn't care about them at all. In LLD, we simply skip the token.
1407   if (!VerStr.empty() && peek() != ";")
1408     next();
1409   expect(";");
1410 }
1411 
1412 void ScriptParser::readLocal() {
1413   Config->DefaultSymbolVersion = VER_NDX_LOCAL;
1414   expect("*");
1415   expect(";");
1416 }
1417 
1418 void ScriptParser::readExtern(std::vector<SymbolVersion> *Globals) {
1419   expect("C++");
1420   expect("{");
1421 
1422   for (;;) {
1423     if (peek() == "}" || Error)
1424       break;
1425     Globals->push_back({next(), true});
1426     expect(";");
1427   }
1428 
1429   expect("}");
1430   expect(";");
1431 }
1432 
1433 void ScriptParser::readGlobal(StringRef VerStr) {
1434   std::vector<SymbolVersion> *Globals;
1435   if (VerStr.empty())
1436     Globals = &Config->VersionScriptGlobals;
1437   else
1438     Globals = &Config->VersionDefinitions.back().Globals;
1439 
1440   for (;;) {
1441     if (skip("extern"))
1442       readExtern(Globals);
1443 
1444     StringRef Cur = peek();
1445     if (Cur == "}" || Cur == "local:" || Error)
1446       return;
1447     next();
1448     Globals->push_back({Cur, false});
1449     expect(";");
1450   }
1451 }
1452 
1453 static bool isUnderSysroot(StringRef Path) {
1454   if (Config->Sysroot == "")
1455     return false;
1456   for (; !Path.empty(); Path = sys::path::parent_path(Path))
1457     if (sys::fs::equivalent(Config->Sysroot, Path))
1458       return true;
1459   return false;
1460 }
1461 
1462 void elf::readLinkerScript(MemoryBufferRef MB) {
1463   StringRef Path = MB.getBufferIdentifier();
1464   ScriptParser(MB.getBuffer(), isUnderSysroot(Path)).readLinkerScript();
1465 }
1466 
1467 void elf::readVersionScript(MemoryBufferRef MB) {
1468   ScriptParser(MB.getBuffer(), false).readVersionScript();
1469 }
1470 
1471 template class elf::LinkerScript<ELF32LE>;
1472 template class elf::LinkerScript<ELF32BE>;
1473 template class elf::LinkerScript<ELF64LE>;
1474 template class elf::LinkerScript<ELF64BE>;
1475