//===- LinkerScript.h -------------------------------------------*- C++ -*-===// // // The LLVM Linker // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef LLD_ELF_LINKER_SCRIPT_H #define LLD_ELF_LINKER_SCRIPT_H #include "lld/Core/LLVM.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/MapVector.h" #include "llvm/Support/Allocator.h" #include "llvm/Support/MemoryBuffer.h" namespace lld { namespace elf { // Parses a linker script. Calling this function updates // Config and ScriptConfig. void readLinkerScript(MemoryBufferRef MB); class ScriptParser; template class InputSectionBase; template class OutputSectionBase; // This class represents each rule in SECTIONS command. struct SectionRule { SectionRule(StringRef D, StringRef S) : Dest(D), SectionPattern(S) {} StringRef Dest; StringRef SectionPattern; }; // This enum represents what we can observe in SECTIONS tag of script: // ExprKind is a location counter change, like ". = . + 0x1000" // SectionKind is a description of output section, like ".data :..." enum SectionsCommandKind { SectionKind, AssignmentKind }; struct SectionsCommand { SectionsCommandKind Kind; std::vector Expr; StringRef Name; }; // ScriptConfiguration holds linker script parse results. struct ScriptConfiguration { // SECTIONS commands. std::vector Sections; // Section fill attribute for each section. llvm::StringMap> Filler; // Used to assign addresses to sections. std::vector Commands; bool DoLayout = false; llvm::BumpPtrAllocator Alloc; // List of section patterns specified with KEEP commands. They will // be kept even if they are unused and --gc-sections is specified. std::vector KeptSections; }; extern ScriptConfiguration *ScriptConfig; // This is a runner of the linker script. template class LinkerScript { typedef typename ELFT::uint uintX_t; public: StringRef getOutputSection(InputSectionBase *S); ArrayRef getFiller(StringRef Name); bool isDiscarded(InputSectionBase *S); bool shouldKeep(InputSectionBase *S); void assignAddresses(ArrayRef *> S); int compareSections(StringRef A, StringRef B); void addScriptedSymbols(); private: // "ScriptConfig" is a bit too long, so define a short name for it. ScriptConfiguration &Opt = *ScriptConfig; int getSectionIndex(StringRef Name); uintX_t Dot; }; // Variable template is a C++14 feature, so we can't template // a global variable. Use a struct to workaround. template struct Script { static LinkerScript *X; }; template LinkerScript *Script::X; } // namespace elf } // namespace lld #endif