10b57cec5SDimitry Andric //===- Config.h -------------------------------------------------*- C++ -*-===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric 90b57cec5SDimitry Andric #ifndef LLD_COFF_CONFIG_H 100b57cec5SDimitry Andric #define LLD_COFF_CONFIG_H 110b57cec5SDimitry Andric 12*e8d8bef9SDimitry Andric #include "llvm/ADT/MapVector.h" 130b57cec5SDimitry Andric #include "llvm/ADT/StringMap.h" 140b57cec5SDimitry Andric #include "llvm/ADT/StringRef.h" 150b57cec5SDimitry Andric #include "llvm/Object/COFF.h" 160b57cec5SDimitry Andric #include "llvm/Support/CachePruning.h" 170b57cec5SDimitry Andric #include <cstdint> 180b57cec5SDimitry Andric #include <map> 190b57cec5SDimitry Andric #include <set> 200b57cec5SDimitry Andric #include <string> 210b57cec5SDimitry Andric 220b57cec5SDimitry Andric namespace lld { 230b57cec5SDimitry Andric namespace coff { 240b57cec5SDimitry Andric 250b57cec5SDimitry Andric using llvm::COFF::IMAGE_FILE_MACHINE_UNKNOWN; 260b57cec5SDimitry Andric using llvm::COFF::WindowsSubsystem; 270b57cec5SDimitry Andric using llvm::StringRef; 280b57cec5SDimitry Andric class DefinedAbsolute; 290b57cec5SDimitry Andric class DefinedRelative; 300b57cec5SDimitry Andric class StringChunk; 310b57cec5SDimitry Andric class Symbol; 320b57cec5SDimitry Andric class InputFile; 33*e8d8bef9SDimitry Andric class SectionChunk; 340b57cec5SDimitry Andric 350b57cec5SDimitry Andric // Short aliases. 360b57cec5SDimitry Andric static const auto AMD64 = llvm::COFF::IMAGE_FILE_MACHINE_AMD64; 370b57cec5SDimitry Andric static const auto ARM64 = llvm::COFF::IMAGE_FILE_MACHINE_ARM64; 380b57cec5SDimitry Andric static const auto ARMNT = llvm::COFF::IMAGE_FILE_MACHINE_ARMNT; 390b57cec5SDimitry Andric static const auto I386 = llvm::COFF::IMAGE_FILE_MACHINE_I386; 400b57cec5SDimitry Andric 410b57cec5SDimitry Andric // Represents an /export option. 420b57cec5SDimitry Andric struct Export { 430b57cec5SDimitry Andric StringRef name; // N in /export:N or /export:E=N 440b57cec5SDimitry Andric StringRef extName; // E in /export:E=N 450b57cec5SDimitry Andric Symbol *sym = nullptr; 460b57cec5SDimitry Andric uint16_t ordinal = 0; 470b57cec5SDimitry Andric bool noname = false; 480b57cec5SDimitry Andric bool data = false; 490b57cec5SDimitry Andric bool isPrivate = false; 500b57cec5SDimitry Andric bool constant = false; 510b57cec5SDimitry Andric 520b57cec5SDimitry Andric // If an export is a form of /export:foo=dllname.bar, that means 530b57cec5SDimitry Andric // that foo should be exported as an alias to bar in the DLL. 540b57cec5SDimitry Andric // forwardTo is set to "dllname.bar" part. Usually empty. 550b57cec5SDimitry Andric StringRef forwardTo; 560b57cec5SDimitry Andric StringChunk *forwardChunk = nullptr; 570b57cec5SDimitry Andric 580b57cec5SDimitry Andric // True if this /export option was in .drectves section. 590b57cec5SDimitry Andric bool directives = false; 600b57cec5SDimitry Andric StringRef symbolName; 610b57cec5SDimitry Andric StringRef exportName; // Name in DLL 620b57cec5SDimitry Andric 630b57cec5SDimitry Andric bool operator==(const Export &e) { 640b57cec5SDimitry Andric return (name == e.name && extName == e.extName && 650b57cec5SDimitry Andric ordinal == e.ordinal && noname == e.noname && 660b57cec5SDimitry Andric data == e.data && isPrivate == e.isPrivate); 670b57cec5SDimitry Andric } 680b57cec5SDimitry Andric }; 690b57cec5SDimitry Andric 700b57cec5SDimitry Andric enum class DebugType { 710b57cec5SDimitry Andric None = 0x0, 720b57cec5SDimitry Andric CV = 0x1, /// CodeView 730b57cec5SDimitry Andric PData = 0x2, /// Procedure Data 740b57cec5SDimitry Andric Fixup = 0x4, /// Relocation Table 750b57cec5SDimitry Andric }; 760b57cec5SDimitry Andric 770b57cec5SDimitry Andric enum class GuardCFLevel { 780b57cec5SDimitry Andric Off, 790b57cec5SDimitry Andric NoLongJmp, // Emit gfids but no longjmp tables 800b57cec5SDimitry Andric Full, // Enable all protections. 810b57cec5SDimitry Andric }; 820b57cec5SDimitry Andric 830b57cec5SDimitry Andric // Global configuration. 840b57cec5SDimitry Andric struct Configuration { 850b57cec5SDimitry Andric enum ManifestKind { SideBySide, Embed, No }; 860b57cec5SDimitry Andric bool is64() { return machine == AMD64 || machine == ARM64; } 870b57cec5SDimitry Andric 880b57cec5SDimitry Andric llvm::COFF::MachineTypes machine = IMAGE_FILE_MACHINE_UNKNOWN; 890b57cec5SDimitry Andric size_t wordsize; 900b57cec5SDimitry Andric bool verbose = false; 910b57cec5SDimitry Andric WindowsSubsystem subsystem = llvm::COFF::IMAGE_SUBSYSTEM_UNKNOWN; 920b57cec5SDimitry Andric Symbol *entry = nullptr; 930b57cec5SDimitry Andric bool noEntry = false; 940b57cec5SDimitry Andric std::string outputFile; 950b57cec5SDimitry Andric std::string importName; 960b57cec5SDimitry Andric bool demangle = true; 970b57cec5SDimitry Andric bool doGC = true; 980b57cec5SDimitry Andric bool doICF = true; 990b57cec5SDimitry Andric bool tailMerge; 1000b57cec5SDimitry Andric bool relocatable = true; 1010b57cec5SDimitry Andric bool forceMultiple = false; 1020b57cec5SDimitry Andric bool forceMultipleRes = false; 1030b57cec5SDimitry Andric bool forceUnresolved = false; 1040b57cec5SDimitry Andric bool debug = false; 1050b57cec5SDimitry Andric bool debugDwarf = false; 1060b57cec5SDimitry Andric bool debugGHashes = false; 1070b57cec5SDimitry Andric bool debugSymtab = false; 108480093f4SDimitry Andric bool driver = false; 109480093f4SDimitry Andric bool driverUponly = false; 110480093f4SDimitry Andric bool driverWdm = false; 1110b57cec5SDimitry Andric bool showTiming = false; 1120b57cec5SDimitry Andric bool showSummary = false; 1130b57cec5SDimitry Andric unsigned debugTypes = static_cast<unsigned>(DebugType::None); 1140b57cec5SDimitry Andric std::vector<std::string> natvisFiles; 1155ffd83dbSDimitry Andric llvm::StringMap<std::string> namedStreams; 1160b57cec5SDimitry Andric llvm::SmallString<128> pdbAltPath; 1170b57cec5SDimitry Andric llvm::SmallString<128> pdbPath; 1180b57cec5SDimitry Andric llvm::SmallString<128> pdbSourcePath; 1190b57cec5SDimitry Andric std::vector<llvm::StringRef> argv; 1200b57cec5SDimitry Andric 1210b57cec5SDimitry Andric // Symbols in this set are considered as live by the garbage collector. 1220b57cec5SDimitry Andric std::vector<Symbol *> gcroot; 1230b57cec5SDimitry Andric 1240b57cec5SDimitry Andric std::set<std::string> noDefaultLibs; 1250b57cec5SDimitry Andric bool noDefaultLibAll = false; 1260b57cec5SDimitry Andric 1270b57cec5SDimitry Andric // True if we are creating a DLL. 1280b57cec5SDimitry Andric bool dll = false; 1290b57cec5SDimitry Andric StringRef implib; 1300b57cec5SDimitry Andric std::vector<Export> exports; 13185868e8aSDimitry Andric bool hadExplicitExports; 1320b57cec5SDimitry Andric std::set<std::string> delayLoads; 1330b57cec5SDimitry Andric std::map<std::string, int> dllOrder; 1340b57cec5SDimitry Andric Symbol *delayLoadHelper = nullptr; 1350b57cec5SDimitry Andric 1360b57cec5SDimitry Andric bool saveTemps = false; 1370b57cec5SDimitry Andric 1380b57cec5SDimitry Andric // /guard:cf 1390b57cec5SDimitry Andric GuardCFLevel guardCF = GuardCFLevel::Off; 1400b57cec5SDimitry Andric 1410b57cec5SDimitry Andric // Used for SafeSEH. 1420b57cec5SDimitry Andric bool safeSEH = false; 1430b57cec5SDimitry Andric Symbol *sehTable = nullptr; 1440b57cec5SDimitry Andric Symbol *sehCount = nullptr; 145979e22ffSDimitry Andric bool noSEH = false; 1460b57cec5SDimitry Andric 1470b57cec5SDimitry Andric // Used for /opt:lldlto=N 1480b57cec5SDimitry Andric unsigned ltoo = 2; 1490b57cec5SDimitry Andric 1500b57cec5SDimitry Andric // Used for /opt:lldltojobs=N 1515ffd83dbSDimitry Andric std::string thinLTOJobs; 1520b57cec5SDimitry Andric // Used for /opt:lldltopartitions=N 1530b57cec5SDimitry Andric unsigned ltoPartitions = 1; 1540b57cec5SDimitry Andric 1550b57cec5SDimitry Andric // Used for /opt:lldltocache=path 1560b57cec5SDimitry Andric StringRef ltoCache; 1570b57cec5SDimitry Andric // Used for /opt:lldltocachepolicy=policy 1580b57cec5SDimitry Andric llvm::CachePruningPolicy ltoCachePolicy; 1590b57cec5SDimitry Andric 160*e8d8bef9SDimitry Andric // Used for /opt:[no]ltonewpassmanager 161*e8d8bef9SDimitry Andric bool ltoNewPassManager = false; 162*e8d8bef9SDimitry Andric // Used for /opt:[no]ltodebugpassmanager 163*e8d8bef9SDimitry Andric bool ltoDebugPassManager = false; 164*e8d8bef9SDimitry Andric 1650b57cec5SDimitry Andric // Used for /merge:from=to (e.g. /merge:.rdata=.text) 1660b57cec5SDimitry Andric std::map<StringRef, StringRef> merge; 1670b57cec5SDimitry Andric 1680b57cec5SDimitry Andric // Used for /section=.name,{DEKPRSW} to set section attributes. 1690b57cec5SDimitry Andric std::map<StringRef, uint32_t> section; 1700b57cec5SDimitry Andric 1710b57cec5SDimitry Andric // Options for manifest files. 1720b57cec5SDimitry Andric ManifestKind manifest = No; 1730b57cec5SDimitry Andric int manifestID = 1; 1740b57cec5SDimitry Andric StringRef manifestDependency; 1750b57cec5SDimitry Andric bool manifestUAC = true; 1760b57cec5SDimitry Andric std::vector<std::string> manifestInput; 1770b57cec5SDimitry Andric StringRef manifestLevel = "'asInvoker'"; 1780b57cec5SDimitry Andric StringRef manifestUIAccess = "'false'"; 1790b57cec5SDimitry Andric StringRef manifestFile; 1800b57cec5SDimitry Andric 1810b57cec5SDimitry Andric // Used for /aligncomm. 1820b57cec5SDimitry Andric std::map<std::string, int> alignComm; 1830b57cec5SDimitry Andric 1840b57cec5SDimitry Andric // Used for /failifmismatch. 1850b57cec5SDimitry Andric std::map<StringRef, std::pair<StringRef, InputFile *>> mustMatch; 1860b57cec5SDimitry Andric 1870b57cec5SDimitry Andric // Used for /alternatename. 1880b57cec5SDimitry Andric std::map<StringRef, StringRef> alternateNames; 1890b57cec5SDimitry Andric 1900b57cec5SDimitry Andric // Used for /order. 1910b57cec5SDimitry Andric llvm::StringMap<int> order; 1920b57cec5SDimitry Andric 1930b57cec5SDimitry Andric // Used for /lldmap. 1945ffd83dbSDimitry Andric std::string lldmapFile; 1955ffd83dbSDimitry Andric 1965ffd83dbSDimitry Andric // Used for /map. 1970b57cec5SDimitry Andric std::string mapFile; 1980b57cec5SDimitry Andric 1990b57cec5SDimitry Andric // Used for /thinlto-index-only: 2000b57cec5SDimitry Andric llvm::StringRef thinLTOIndexOnlyArg; 2010b57cec5SDimitry Andric 2020b57cec5SDimitry Andric // Used for /thinlto-object-prefix-replace: 2030b57cec5SDimitry Andric std::pair<llvm::StringRef, llvm::StringRef> thinLTOPrefixReplace; 2040b57cec5SDimitry Andric 2050b57cec5SDimitry Andric // Used for /thinlto-object-suffix-replace: 2060b57cec5SDimitry Andric std::pair<llvm::StringRef, llvm::StringRef> thinLTOObjectSuffixReplace; 2070b57cec5SDimitry Andric 20885868e8aSDimitry Andric // Used for /lto-obj-path: 20985868e8aSDimitry Andric llvm::StringRef ltoObjPath; 21085868e8aSDimitry Andric 211*e8d8bef9SDimitry Andric // Used for /call-graph-ordering-file: 212*e8d8bef9SDimitry Andric llvm::MapVector<std::pair<const SectionChunk *, const SectionChunk *>, 213*e8d8bef9SDimitry Andric uint64_t> 214*e8d8bef9SDimitry Andric callGraphProfile; 215*e8d8bef9SDimitry Andric bool callGraphProfileSort = false; 216*e8d8bef9SDimitry Andric 217*e8d8bef9SDimitry Andric // Used for /print-symbol-order: 218*e8d8bef9SDimitry Andric StringRef printSymbolOrder; 219*e8d8bef9SDimitry Andric 2200b57cec5SDimitry Andric uint64_t align = 4096; 2210b57cec5SDimitry Andric uint64_t imageBase = -1; 2220b57cec5SDimitry Andric uint64_t fileAlign = 512; 2230b57cec5SDimitry Andric uint64_t stackReserve = 1024 * 1024; 2240b57cec5SDimitry Andric uint64_t stackCommit = 4096; 2250b57cec5SDimitry Andric uint64_t heapReserve = 1024 * 1024; 2260b57cec5SDimitry Andric uint64_t heapCommit = 4096; 2270b57cec5SDimitry Andric uint32_t majorImageVersion = 0; 2280b57cec5SDimitry Andric uint32_t minorImageVersion = 0; 229*e8d8bef9SDimitry Andric // If changing the default os/subsys version here, update the default in 230*e8d8bef9SDimitry Andric // the MinGW driver accordingly. 2310b57cec5SDimitry Andric uint32_t majorOSVersion = 6; 2320b57cec5SDimitry Andric uint32_t minorOSVersion = 0; 233*e8d8bef9SDimitry Andric uint32_t majorSubsystemVersion = 6; 234*e8d8bef9SDimitry Andric uint32_t minorSubsystemVersion = 0; 2350b57cec5SDimitry Andric uint32_t timestamp = 0; 2360b57cec5SDimitry Andric uint32_t functionPadMin = 0; 2370b57cec5SDimitry Andric bool dynamicBase = true; 2380b57cec5SDimitry Andric bool allowBind = true; 2395ffd83dbSDimitry Andric bool cetCompat = false; 2400b57cec5SDimitry Andric bool nxCompat = true; 2410b57cec5SDimitry Andric bool allowIsolation = true; 2420b57cec5SDimitry Andric bool terminalServerAware = true; 2430b57cec5SDimitry Andric bool largeAddressAware = false; 2440b57cec5SDimitry Andric bool highEntropyVA = false; 2450b57cec5SDimitry Andric bool appContainer = false; 2460b57cec5SDimitry Andric bool mingw = false; 2470b57cec5SDimitry Andric bool warnMissingOrderSymbol = true; 2480b57cec5SDimitry Andric bool warnLocallyDefinedImported = true; 2490b57cec5SDimitry Andric bool warnDebugInfoUnusable = true; 250480093f4SDimitry Andric bool warnLongSectionNames = true; 2510b57cec5SDimitry Andric bool incremental = true; 2520b57cec5SDimitry Andric bool integrityCheck = false; 2530b57cec5SDimitry Andric bool killAt = false; 2540b57cec5SDimitry Andric bool repro = false; 2550b57cec5SDimitry Andric bool swaprunCD = false; 2560b57cec5SDimitry Andric bool swaprunNet = false; 2570b57cec5SDimitry Andric bool thinLTOEmitImportsFiles; 2580b57cec5SDimitry Andric bool thinLTOIndexOnly; 2595ffd83dbSDimitry Andric bool autoImport = false; 2605ffd83dbSDimitry Andric bool pseudoRelocs = false; 2610b57cec5SDimitry Andric }; 2620b57cec5SDimitry Andric 2630b57cec5SDimitry Andric extern Configuration *config; 2640b57cec5SDimitry Andric 2650b57cec5SDimitry Andric } // namespace coff 2660b57cec5SDimitry Andric } // namespace lld 2670b57cec5SDimitry Andric 2680b57cec5SDimitry Andric #endif 269