1*0b57cec5SDimitry Andric //===- Config.h -------------------------------------------------*- C++ -*-===// 2*0b57cec5SDimitry Andric // 3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0b57cec5SDimitry Andric // 7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 8*0b57cec5SDimitry Andric 9*0b57cec5SDimitry Andric #ifndef LLD_COFF_CONFIG_H 10*0b57cec5SDimitry Andric #define LLD_COFF_CONFIG_H 11*0b57cec5SDimitry Andric 12*0b57cec5SDimitry Andric #include "llvm/ADT/StringMap.h" 13*0b57cec5SDimitry Andric #include "llvm/ADT/StringRef.h" 14*0b57cec5SDimitry Andric #include "llvm/Object/COFF.h" 15*0b57cec5SDimitry Andric #include "llvm/Support/CachePruning.h" 16*0b57cec5SDimitry Andric #include <cstdint> 17*0b57cec5SDimitry Andric #include <map> 18*0b57cec5SDimitry Andric #include <set> 19*0b57cec5SDimitry Andric #include <string> 20*0b57cec5SDimitry Andric 21*0b57cec5SDimitry Andric namespace lld { 22*0b57cec5SDimitry Andric namespace coff { 23*0b57cec5SDimitry Andric 24*0b57cec5SDimitry Andric using llvm::COFF::IMAGE_FILE_MACHINE_UNKNOWN; 25*0b57cec5SDimitry Andric using llvm::COFF::WindowsSubsystem; 26*0b57cec5SDimitry Andric using llvm::StringRef; 27*0b57cec5SDimitry Andric class DefinedAbsolute; 28*0b57cec5SDimitry Andric class DefinedRelative; 29*0b57cec5SDimitry Andric class StringChunk; 30*0b57cec5SDimitry Andric class Symbol; 31*0b57cec5SDimitry Andric class InputFile; 32*0b57cec5SDimitry Andric 33*0b57cec5SDimitry Andric // Short aliases. 34*0b57cec5SDimitry Andric static const auto AMD64 = llvm::COFF::IMAGE_FILE_MACHINE_AMD64; 35*0b57cec5SDimitry Andric static const auto ARM64 = llvm::COFF::IMAGE_FILE_MACHINE_ARM64; 36*0b57cec5SDimitry Andric static const auto ARMNT = llvm::COFF::IMAGE_FILE_MACHINE_ARMNT; 37*0b57cec5SDimitry Andric static const auto I386 = llvm::COFF::IMAGE_FILE_MACHINE_I386; 38*0b57cec5SDimitry Andric 39*0b57cec5SDimitry Andric // Represents an /export option. 40*0b57cec5SDimitry Andric struct Export { 41*0b57cec5SDimitry Andric StringRef name; // N in /export:N or /export:E=N 42*0b57cec5SDimitry Andric StringRef extName; // E in /export:E=N 43*0b57cec5SDimitry Andric Symbol *sym = nullptr; 44*0b57cec5SDimitry Andric uint16_t ordinal = 0; 45*0b57cec5SDimitry Andric bool noname = false; 46*0b57cec5SDimitry Andric bool data = false; 47*0b57cec5SDimitry Andric bool isPrivate = false; 48*0b57cec5SDimitry Andric bool constant = false; 49*0b57cec5SDimitry Andric 50*0b57cec5SDimitry Andric // If an export is a form of /export:foo=dllname.bar, that means 51*0b57cec5SDimitry Andric // that foo should be exported as an alias to bar in the DLL. 52*0b57cec5SDimitry Andric // forwardTo is set to "dllname.bar" part. Usually empty. 53*0b57cec5SDimitry Andric StringRef forwardTo; 54*0b57cec5SDimitry Andric StringChunk *forwardChunk = nullptr; 55*0b57cec5SDimitry Andric 56*0b57cec5SDimitry Andric // True if this /export option was in .drectves section. 57*0b57cec5SDimitry Andric bool directives = false; 58*0b57cec5SDimitry Andric StringRef symbolName; 59*0b57cec5SDimitry Andric StringRef exportName; // Name in DLL 60*0b57cec5SDimitry Andric 61*0b57cec5SDimitry Andric bool operator==(const Export &e) { 62*0b57cec5SDimitry Andric return (name == e.name && extName == e.extName && 63*0b57cec5SDimitry Andric ordinal == e.ordinal && noname == e.noname && 64*0b57cec5SDimitry Andric data == e.data && isPrivate == e.isPrivate); 65*0b57cec5SDimitry Andric } 66*0b57cec5SDimitry Andric }; 67*0b57cec5SDimitry Andric 68*0b57cec5SDimitry Andric enum class DebugType { 69*0b57cec5SDimitry Andric None = 0x0, 70*0b57cec5SDimitry Andric CV = 0x1, /// CodeView 71*0b57cec5SDimitry Andric PData = 0x2, /// Procedure Data 72*0b57cec5SDimitry Andric Fixup = 0x4, /// Relocation Table 73*0b57cec5SDimitry Andric }; 74*0b57cec5SDimitry Andric 75*0b57cec5SDimitry Andric enum class GuardCFLevel { 76*0b57cec5SDimitry Andric Off, 77*0b57cec5SDimitry Andric NoLongJmp, // Emit gfids but no longjmp tables 78*0b57cec5SDimitry Andric Full, // Enable all protections. 79*0b57cec5SDimitry Andric }; 80*0b57cec5SDimitry Andric 81*0b57cec5SDimitry Andric // Global configuration. 82*0b57cec5SDimitry Andric struct Configuration { 83*0b57cec5SDimitry Andric enum ManifestKind { SideBySide, Embed, No }; 84*0b57cec5SDimitry Andric bool is64() { return machine == AMD64 || machine == ARM64; } 85*0b57cec5SDimitry Andric 86*0b57cec5SDimitry Andric llvm::COFF::MachineTypes machine = IMAGE_FILE_MACHINE_UNKNOWN; 87*0b57cec5SDimitry Andric size_t wordsize; 88*0b57cec5SDimitry Andric bool verbose = false; 89*0b57cec5SDimitry Andric WindowsSubsystem subsystem = llvm::COFF::IMAGE_SUBSYSTEM_UNKNOWN; 90*0b57cec5SDimitry Andric Symbol *entry = nullptr; 91*0b57cec5SDimitry Andric bool noEntry = false; 92*0b57cec5SDimitry Andric std::string outputFile; 93*0b57cec5SDimitry Andric std::string importName; 94*0b57cec5SDimitry Andric bool demangle = true; 95*0b57cec5SDimitry Andric bool doGC = true; 96*0b57cec5SDimitry Andric bool doICF = true; 97*0b57cec5SDimitry Andric bool tailMerge; 98*0b57cec5SDimitry Andric bool relocatable = true; 99*0b57cec5SDimitry Andric bool forceMultiple = false; 100*0b57cec5SDimitry Andric bool forceMultipleRes = false; 101*0b57cec5SDimitry Andric bool forceUnresolved = false; 102*0b57cec5SDimitry Andric bool debug = false; 103*0b57cec5SDimitry Andric bool debugDwarf = false; 104*0b57cec5SDimitry Andric bool debugGHashes = false; 105*0b57cec5SDimitry Andric bool debugSymtab = false; 106*0b57cec5SDimitry Andric bool showTiming = false; 107*0b57cec5SDimitry Andric bool showSummary = false; 108*0b57cec5SDimitry Andric unsigned debugTypes = static_cast<unsigned>(DebugType::None); 109*0b57cec5SDimitry Andric std::vector<std::string> natvisFiles; 110*0b57cec5SDimitry Andric llvm::SmallString<128> pdbAltPath; 111*0b57cec5SDimitry Andric llvm::SmallString<128> pdbPath; 112*0b57cec5SDimitry Andric llvm::SmallString<128> pdbSourcePath; 113*0b57cec5SDimitry Andric std::vector<llvm::StringRef> argv; 114*0b57cec5SDimitry Andric 115*0b57cec5SDimitry Andric // Symbols in this set are considered as live by the garbage collector. 116*0b57cec5SDimitry Andric std::vector<Symbol *> gcroot; 117*0b57cec5SDimitry Andric 118*0b57cec5SDimitry Andric std::set<std::string> noDefaultLibs; 119*0b57cec5SDimitry Andric bool noDefaultLibAll = false; 120*0b57cec5SDimitry Andric 121*0b57cec5SDimitry Andric // True if we are creating a DLL. 122*0b57cec5SDimitry Andric bool dll = false; 123*0b57cec5SDimitry Andric StringRef implib; 124*0b57cec5SDimitry Andric std::vector<Export> exports; 125*0b57cec5SDimitry Andric std::set<std::string> delayLoads; 126*0b57cec5SDimitry Andric std::map<std::string, int> dllOrder; 127*0b57cec5SDimitry Andric Symbol *delayLoadHelper = nullptr; 128*0b57cec5SDimitry Andric 129*0b57cec5SDimitry Andric bool saveTemps = false; 130*0b57cec5SDimitry Andric 131*0b57cec5SDimitry Andric // /guard:cf 132*0b57cec5SDimitry Andric GuardCFLevel guardCF = GuardCFLevel::Off; 133*0b57cec5SDimitry Andric 134*0b57cec5SDimitry Andric // Used for SafeSEH. 135*0b57cec5SDimitry Andric bool safeSEH = false; 136*0b57cec5SDimitry Andric Symbol *sehTable = nullptr; 137*0b57cec5SDimitry Andric Symbol *sehCount = nullptr; 138*0b57cec5SDimitry Andric 139*0b57cec5SDimitry Andric // Used for /opt:lldlto=N 140*0b57cec5SDimitry Andric unsigned ltoo = 2; 141*0b57cec5SDimitry Andric 142*0b57cec5SDimitry Andric // Used for /opt:lldltojobs=N 143*0b57cec5SDimitry Andric unsigned thinLTOJobs = 0; 144*0b57cec5SDimitry Andric // Used for /opt:lldltopartitions=N 145*0b57cec5SDimitry Andric unsigned ltoPartitions = 1; 146*0b57cec5SDimitry Andric 147*0b57cec5SDimitry Andric // Used for /opt:lldltocache=path 148*0b57cec5SDimitry Andric StringRef ltoCache; 149*0b57cec5SDimitry Andric // Used for /opt:lldltocachepolicy=policy 150*0b57cec5SDimitry Andric llvm::CachePruningPolicy ltoCachePolicy; 151*0b57cec5SDimitry Andric 152*0b57cec5SDimitry Andric // Used for /merge:from=to (e.g. /merge:.rdata=.text) 153*0b57cec5SDimitry Andric std::map<StringRef, StringRef> merge; 154*0b57cec5SDimitry Andric 155*0b57cec5SDimitry Andric // Used for /section=.name,{DEKPRSW} to set section attributes. 156*0b57cec5SDimitry Andric std::map<StringRef, uint32_t> section; 157*0b57cec5SDimitry Andric 158*0b57cec5SDimitry Andric // Options for manifest files. 159*0b57cec5SDimitry Andric ManifestKind manifest = No; 160*0b57cec5SDimitry Andric int manifestID = 1; 161*0b57cec5SDimitry Andric StringRef manifestDependency; 162*0b57cec5SDimitry Andric bool manifestUAC = true; 163*0b57cec5SDimitry Andric std::vector<std::string> manifestInput; 164*0b57cec5SDimitry Andric StringRef manifestLevel = "'asInvoker'"; 165*0b57cec5SDimitry Andric StringRef manifestUIAccess = "'false'"; 166*0b57cec5SDimitry Andric StringRef manifestFile; 167*0b57cec5SDimitry Andric 168*0b57cec5SDimitry Andric // Used for /aligncomm. 169*0b57cec5SDimitry Andric std::map<std::string, int> alignComm; 170*0b57cec5SDimitry Andric 171*0b57cec5SDimitry Andric // Used for /failifmismatch. 172*0b57cec5SDimitry Andric std::map<StringRef, std::pair<StringRef, InputFile *>> mustMatch; 173*0b57cec5SDimitry Andric 174*0b57cec5SDimitry Andric // Used for /alternatename. 175*0b57cec5SDimitry Andric std::map<StringRef, StringRef> alternateNames; 176*0b57cec5SDimitry Andric 177*0b57cec5SDimitry Andric // Used for /order. 178*0b57cec5SDimitry Andric llvm::StringMap<int> order; 179*0b57cec5SDimitry Andric 180*0b57cec5SDimitry Andric // Used for /lldmap. 181*0b57cec5SDimitry Andric std::string mapFile; 182*0b57cec5SDimitry Andric 183*0b57cec5SDimitry Andric // Used for /thinlto-index-only: 184*0b57cec5SDimitry Andric llvm::StringRef thinLTOIndexOnlyArg; 185*0b57cec5SDimitry Andric 186*0b57cec5SDimitry Andric // Used for /thinlto-object-prefix-replace: 187*0b57cec5SDimitry Andric std::pair<llvm::StringRef, llvm::StringRef> thinLTOPrefixReplace; 188*0b57cec5SDimitry Andric 189*0b57cec5SDimitry Andric // Used for /thinlto-object-suffix-replace: 190*0b57cec5SDimitry Andric std::pair<llvm::StringRef, llvm::StringRef> thinLTOObjectSuffixReplace; 191*0b57cec5SDimitry Andric 192*0b57cec5SDimitry Andric uint64_t align = 4096; 193*0b57cec5SDimitry Andric uint64_t imageBase = -1; 194*0b57cec5SDimitry Andric uint64_t fileAlign = 512; 195*0b57cec5SDimitry Andric uint64_t stackReserve = 1024 * 1024; 196*0b57cec5SDimitry Andric uint64_t stackCommit = 4096; 197*0b57cec5SDimitry Andric uint64_t heapReserve = 1024 * 1024; 198*0b57cec5SDimitry Andric uint64_t heapCommit = 4096; 199*0b57cec5SDimitry Andric uint32_t majorImageVersion = 0; 200*0b57cec5SDimitry Andric uint32_t minorImageVersion = 0; 201*0b57cec5SDimitry Andric uint32_t majorOSVersion = 6; 202*0b57cec5SDimitry Andric uint32_t minorOSVersion = 0; 203*0b57cec5SDimitry Andric uint32_t timestamp = 0; 204*0b57cec5SDimitry Andric uint32_t functionPadMin = 0; 205*0b57cec5SDimitry Andric bool dynamicBase = true; 206*0b57cec5SDimitry Andric bool allowBind = true; 207*0b57cec5SDimitry Andric bool nxCompat = true; 208*0b57cec5SDimitry Andric bool allowIsolation = true; 209*0b57cec5SDimitry Andric bool terminalServerAware = true; 210*0b57cec5SDimitry Andric bool largeAddressAware = false; 211*0b57cec5SDimitry Andric bool highEntropyVA = false; 212*0b57cec5SDimitry Andric bool appContainer = false; 213*0b57cec5SDimitry Andric bool mingw = false; 214*0b57cec5SDimitry Andric bool warnMissingOrderSymbol = true; 215*0b57cec5SDimitry Andric bool warnLocallyDefinedImported = true; 216*0b57cec5SDimitry Andric bool warnDebugInfoUnusable = true; 217*0b57cec5SDimitry Andric bool incremental = true; 218*0b57cec5SDimitry Andric bool integrityCheck = false; 219*0b57cec5SDimitry Andric bool killAt = false; 220*0b57cec5SDimitry Andric bool repro = false; 221*0b57cec5SDimitry Andric bool swaprunCD = false; 222*0b57cec5SDimitry Andric bool swaprunNet = false; 223*0b57cec5SDimitry Andric bool thinLTOEmitImportsFiles; 224*0b57cec5SDimitry Andric bool thinLTOIndexOnly; 225*0b57cec5SDimitry Andric }; 226*0b57cec5SDimitry Andric 227*0b57cec5SDimitry Andric extern Configuration *config; 228*0b57cec5SDimitry Andric 229*0b57cec5SDimitry Andric } // namespace coff 230*0b57cec5SDimitry Andric } // namespace lld 231*0b57cec5SDimitry Andric 232*0b57cec5SDimitry Andric #endif 233