]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/lld/ELF/Config.h
Merge llvm, clang, lld, lldb, compiler-rt and libc++ r308421, and update
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / lld / ELF / Config.h
1 //===- Config.h -------------------------------------------------*- C++ -*-===//
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 #ifndef LLD_ELF_CONFIG_H
11 #define LLD_ELF_CONFIG_H
12
13 #include "llvm/ADT/MapVector.h"
14 #include "llvm/ADT/StringRef.h"
15 #include "llvm/ADT/StringSet.h"
16 #include "llvm/BinaryFormat/ELF.h"
17 #include "llvm/Support/CachePruning.h"
18 #include "llvm/Support/CodeGen.h"
19 #include "llvm/Support/Endian.h"
20
21 #include <vector>
22
23 namespace lld {
24 namespace elf {
25
26 class InputFile;
27 struct Symbol;
28
29 enum ELFKind {
30   ELFNoneKind,
31   ELF32LEKind,
32   ELF32BEKind,
33   ELF64LEKind,
34   ELF64BEKind
35 };
36
37 // For --build-id.
38 enum class BuildIdKind { None, Fast, Md5, Sha1, Hexstring, Uuid };
39
40 // For --discard-{all,locals,none}.
41 enum class DiscardPolicy { Default, All, Locals, None };
42
43 // For --strip-{all,debug}.
44 enum class StripPolicy { None, All, Debug };
45
46 // For --unresolved-symbols.
47 enum class UnresolvedPolicy { ReportError, Warn, WarnAll, Ignore, IgnoreAll };
48
49 // For --sort-section and linkerscript sorting rules.
50 enum class SortSectionPolicy { Default, None, Alignment, Name, Priority };
51
52 // For --target2
53 enum class Target2Policy { Abs, Rel, GotRel };
54
55 struct SymbolVersion {
56   llvm::StringRef Name;
57   bool IsExternCpp;
58   bool HasWildcard;
59 };
60
61 // This struct contains symbols version definition that
62 // can be found in version script if it is used for link.
63 struct VersionDefinition {
64   llvm::StringRef Name;
65   uint16_t Id = 0;
66   std::vector<SymbolVersion> Globals;
67   size_t NameOff = 0; // Offset in the string table
68 };
69
70 // Structure for mapping renamed symbols
71 struct RenamedSymbol {
72   Symbol *Target;
73   uint8_t OriginalBinding;
74 };
75
76 // This struct contains the global configuration for the linker.
77 // Most fields are direct mapping from the command line options
78 // and such fields have the same name as the corresponding options.
79 // Most fields are initialized by the driver.
80 struct Configuration {
81   InputFile *FirstElf = nullptr;
82   uint8_t OSABI = 0;
83   llvm::CachePruningPolicy ThinLTOCachePolicy;
84   llvm::StringMap<uint64_t> SectionStartMap;
85   llvm::StringRef DynamicLinker;
86   llvm::StringRef Entry;
87   llvm::StringRef Emulation;
88   llvm::StringRef Fini;
89   llvm::StringRef Init;
90   llvm::StringRef LTOAAPipeline;
91   llvm::StringRef LTONewPmPasses;
92   llvm::StringRef MapFile;
93   llvm::StringRef OutputFile;
94   llvm::StringRef OptRemarksFilename;
95   llvm::StringRef SoName;
96   llvm::StringRef Sysroot;
97   llvm::StringRef ThinLTOCacheDir;
98   std::string Rpath;
99   std::vector<VersionDefinition> VersionDefinitions;
100   std::vector<llvm::StringRef> Argv;
101   std::vector<llvm::StringRef> AuxiliaryList;
102   std::vector<llvm::StringRef> FilterList;
103   std::vector<llvm::StringRef> SearchPaths;
104   std::vector<llvm::StringRef> SymbolOrderingFile;
105   std::vector<llvm::StringRef> Undefined;
106   std::vector<SymbolVersion> VersionScriptGlobals;
107   std::vector<SymbolVersion> VersionScriptLocals;
108   std::vector<uint8_t> BuildIdVector;
109   llvm::MapVector<Symbol *, RenamedSymbol> RenamedSymbols;
110   bool AllowMultipleDefinition;
111   bool AsNeeded = false;
112   bool Bsymbolic;
113   bool BsymbolicFunctions;
114   bool ColorDiagnostics = false;
115   bool CompressDebugSections;
116   bool DefineCommon;
117   bool Demangle = true;
118   bool DisableVerify;
119   bool EhFrameHdr;
120   bool EmitRelocs;
121   bool EnableNewDtags;
122   bool ExportDynamic;
123   bool FatalWarnings;
124   bool GcSections;
125   bool GdbIndex;
126   bool GnuHash;
127   bool ICF;
128   bool MipsN32Abi = false;
129   bool NoGnuUnique;
130   bool NoUndefinedVersion;
131   bool Nostdlib;
132   bool OFormatBinary;
133   bool Omagic;
134   bool OptRemarksWithHotness;
135   bool Pie;
136   bool PrintGcSections;
137   bool Relocatable;
138   bool SaveTemps;
139   bool SingleRoRx;
140   bool Shared;
141   bool Static = false;
142   bool SysvHash;
143   bool Target1Rel;
144   bool Threads;
145   bool Trace;
146   bool Verbose;
147   bool WarnCommon;
148   bool WarnMissingEntry;
149   bool ZCombreloc;
150   bool ZExecstack;
151   bool ZNocopyreloc;
152   bool ZNodelete;
153   bool ZNodlopen;
154   bool ZNow;
155   bool ZOrigin;
156   bool ZRelro;
157   bool ZRodynamic;
158   bool ZText;
159   bool ExitEarly;
160   bool ZWxneeded;
161   DiscardPolicy Discard;
162   SortSectionPolicy SortSection;
163   StripPolicy Strip;
164   UnresolvedPolicy UnresolvedSymbols;
165   Target2Policy Target2;
166   BuildIdKind BuildId = BuildIdKind::None;
167   ELFKind EKind = ELFNoneKind;
168   uint16_t DefaultSymbolVersion = llvm::ELF::VER_NDX_GLOBAL;
169   uint16_t EMachine = llvm::ELF::EM_NONE;
170   uint64_t ErrorLimit = 20;
171   uint64_t ImageBase;
172   uint64_t MaxPageSize;
173   uint64_t ZStackSize;
174   unsigned LTOPartitions;
175   unsigned LTOO;
176   unsigned Optimize;
177   unsigned ThinLTOJobs;
178
179   // The following config options do not directly correspond to any
180   // particualr command line options.
181
182   // True if we need to pass through relocations in input files to the
183   // output file. Usually false because we consume relocations.
184   bool CopyRelocs;
185
186   // True if the target is ELF64. False if ELF32.
187   bool Is64;
188
189   // True if the target is little-endian. False if big-endian.
190   bool IsLE;
191
192   // endianness::little if IsLE is true. endianness::big otherwise.
193   llvm::support::endianness Endianness;
194
195   // True if the target is the little-endian MIPS64.
196   //
197   // The reason why we have this variable only for the MIPS is because
198   // we use this often.  Some ELF headers for MIPS64EL are in a
199   // mixed-endian (which is horrible and I'd say that's a serious spec
200   // bug), and we need to know whether we are reading MIPS ELF files or
201   // not in various places.
202   //
203   // (Note that MIPS64EL is not a typo for MIPS64LE. This is the official
204   // name whatever that means. A fun hypothesis is that "EL" is short for
205   // little-endian written in the little-endian order, but I don't know
206   // if that's true.)
207   bool IsMips64EL;
208
209   // The ELF spec defines two types of relocation table entries, RELA and
210   // REL. RELA is a triplet of (offset, info, addend) while REL is a
211   // tuple of (offset, info). Addends for REL are implicit and read from
212   // the location where the relocations are applied. So, REL is more
213   // compact than RELA but requires a bit of more work to process.
214   //
215   // (From the linker writer's view, this distinction is not necessary.
216   // If the ELF had chosen whichever and sticked with it, it would have
217   // been easier to write code to process relocations, but it's too late
218   // to change the spec.)
219   //
220   // Each ABI defines its relocation type. IsRela is true if target
221   // uses RELA. As far as we know, all 64-bit ABIs are using RELA. A
222   // few 32-bit ABIs are using RELA too.
223   bool IsRela;
224
225   // True if we are creating position-independent code.
226   bool Pic;
227
228   // 4 for ELF32, 8 for ELF64.
229   int Wordsize;
230 };
231
232 // The only instance of Configuration struct.
233 extern Configuration *Config;
234
235 } // namespace elf
236 } // namespace lld
237
238 #endif