//===- 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 { class ScriptParser; template class InputSectionBase; // This class represents each rule in SECTIONS command. class SectionRule { public: SectionRule(StringRef D, StringRef S, bool Keep) : Dest(D), Keep(Keep), SectionPattern(S) {} // Returns true if S should be in Dest section. template bool match(InputSectionBase *S); StringRef Dest; // KEEP command saves unused sections even if --gc-sections is specified. bool Keep = false; private: StringRef SectionPattern; }; // This is a runner of the linker script. class LinkerScript { friend class ScriptParser; public: // Parses a linker script. Calling this function may update // this object and Config. void read(MemoryBufferRef MB); template StringRef getOutputSection(InputSectionBase *S); ArrayRef getFiller(StringRef Name); template bool isDiscarded(InputSectionBase *S); template bool shouldKeep(InputSectionBase *S); int compareSections(StringRef A, StringRef B); private: template SectionRule *find(InputSectionBase *S); // SECTIONS commands. std::vector Sections; // Output sections are sorted by this order. std::vector SectionOrder; // Section fill attribute for each section. llvm::StringMap> Filler; llvm::BumpPtrAllocator Alloc; }; extern LinkerScript *Script; } // namespace elf } // namespace lld #endif