1 //===- Config.h -------------------------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLD_MACHO_CONFIG_H 10 #define LLD_MACHO_CONFIG_H 11 12 #include "llvm/ADT/CachedHashString.h" 13 #include "llvm/ADT/DenseMap.h" 14 #include "llvm/ADT/DenseSet.h" 15 #include "llvm/ADT/MapVector.h" 16 #include "llvm/ADT/StringRef.h" 17 #include "llvm/ADT/StringSet.h" 18 #include "llvm/BinaryFormat/MachO.h" 19 #include "llvm/Support/CachePruning.h" 20 #include "llvm/Support/GlobPattern.h" 21 #include "llvm/Support/VersionTuple.h" 22 #include "llvm/TextAPI/Architecture.h" 23 #include "llvm/TextAPI/Platform.h" 24 #include "llvm/TextAPI/Target.h" 25 26 #include <vector> 27 28 namespace lld { 29 namespace macho { 30 31 class InputSection; 32 class Symbol; 33 34 using NamePair = std::pair<llvm::StringRef, llvm::StringRef>; 35 using SectionRenameMap = llvm::DenseMap<NamePair, NamePair>; 36 using SegmentRenameMap = llvm::DenseMap<llvm::StringRef, llvm::StringRef>; 37 38 struct PlatformInfo { 39 llvm::MachO::Target target; 40 llvm::VersionTuple minimum; 41 llvm::VersionTuple sdk; 42 }; 43 44 inline uint32_t encodeVersion(const llvm::VersionTuple &version) { 45 return ((version.getMajor() << 020) | 46 (version.getMinor().value_or(0) << 010) | 47 version.getSubminor().value_or(0)); 48 } 49 50 enum class NamespaceKind { 51 twolevel, 52 flat, 53 }; 54 55 enum class UndefinedSymbolTreatment { 56 unknown, 57 error, 58 warning, 59 suppress, 60 dynamic_lookup, 61 }; 62 63 enum class ICFLevel { 64 unknown, 65 none, 66 safe, 67 all, 68 }; 69 70 struct SectionAlign { 71 llvm::StringRef segName; 72 llvm::StringRef sectName; 73 uint32_t align; 74 }; 75 76 struct SegmentProtection { 77 llvm::StringRef name; 78 uint32_t maxProt; 79 uint32_t initProt; 80 }; 81 82 class SymbolPatterns { 83 public: 84 // GlobPattern can also match literals, 85 // but we prefer the O(1) lookup of DenseSet. 86 llvm::DenseSet<llvm::CachedHashStringRef> literals; 87 std::vector<llvm::GlobPattern> globs; 88 89 bool empty() const { return literals.empty() && globs.empty(); } 90 void clear(); 91 void insert(llvm::StringRef symbolName); 92 bool matchLiteral(llvm::StringRef symbolName) const; 93 bool matchGlob(llvm::StringRef symbolName) const; 94 bool match(llvm::StringRef symbolName) const; 95 }; 96 97 enum class SymtabPresence { 98 All, 99 None, 100 SelectivelyIncluded, 101 SelectivelyExcluded, 102 }; 103 104 struct Configuration { 105 Symbol *entry = nullptr; 106 bool hasReexports = false; 107 bool allLoad = false; 108 bool applicationExtension = false; 109 bool archMultiple = false; 110 bool exportDynamic = false; 111 bool forceLoadObjC = false; 112 bool forceLoadSwift = false; // Only applies to LC_LINKER_OPTIONs. 113 bool staticLink = false; 114 bool implicitDylibs = false; 115 bool isPic = false; 116 bool headerPadMaxInstallNames = false; 117 bool markDeadStrippableDylib = false; 118 bool printDylibSearch = false; 119 bool printEachFile = false; 120 bool printWhyLoad = false; 121 bool searchDylibsFirst = false; 122 bool saveTemps = false; 123 bool adhocCodesign = false; 124 bool emitFunctionStarts = false; 125 bool emitBitcodeBundle = false; 126 bool emitDataInCodeInfo = false; 127 bool emitEncryptionInfo = false; 128 bool timeTraceEnabled = false; 129 bool dataConst = false; 130 bool dedupLiterals = true; 131 bool omitDebugInfo = false; 132 bool warnDylibInstallName = false; 133 bool ignoreOptimizationHints = false; 134 uint32_t headerPad; 135 uint32_t dylibCompatibilityVersion = 0; 136 uint32_t dylibCurrentVersion = 0; 137 uint32_t timeTraceGranularity = 500; 138 unsigned optimize; 139 std::string progName; 140 141 // For `clang -arch arm64 -arch x86_64`, clang will: 142 // 1. invoke the linker twice, to write one temporary output per arch 143 // 2. invoke `lipo` to merge the two outputs into a single file 144 // `outputFile` is the name of the temporary file the linker writes to. 145 // `finalOutput `is the name of the file lipo writes to after the link. 146 llvm::StringRef outputFile; 147 llvm::StringRef finalOutput; 148 149 llvm::StringRef installName; 150 llvm::StringRef mapFile; 151 llvm::StringRef ltoObjPath; 152 llvm::StringRef thinLTOJobs; 153 llvm::StringRef umbrella; 154 uint32_t ltoo = 2; 155 llvm::CachePruningPolicy thinLTOCachePolicy; 156 llvm::StringRef thinLTOCacheDir; 157 bool deadStripDylibs = false; 158 bool demangle = false; 159 bool deadStrip = false; 160 bool errorForArchMismatch = false; 161 PlatformInfo platformInfo; 162 llvm::Optional<PlatformInfo> secondaryPlatformInfo; 163 NamespaceKind namespaceKind = NamespaceKind::twolevel; 164 UndefinedSymbolTreatment undefinedSymbolTreatment = 165 UndefinedSymbolTreatment::error; 166 ICFLevel icfLevel = ICFLevel::none; 167 llvm::MachO::HeaderFileType outputType; 168 std::vector<llvm::StringRef> systemLibraryRoots; 169 std::vector<llvm::StringRef> librarySearchPaths; 170 std::vector<llvm::StringRef> frameworkSearchPaths; 171 std::vector<llvm::StringRef> runtimePaths; 172 std::vector<std::string> astPaths; 173 std::vector<Symbol *> explicitUndefineds; 174 llvm::StringSet<> explicitDynamicLookups; 175 // There are typically few custom sectionAlignments or segmentProtections, 176 // so use a vector instead of a map. 177 std::vector<SectionAlign> sectionAlignments; 178 std::vector<SegmentProtection> segmentProtections; 179 180 bool callGraphProfileSort = false; 181 llvm::StringRef printSymbolOrder; 182 183 SectionRenameMap sectionRenameMap; 184 SegmentRenameMap segmentRenameMap; 185 186 bool hasExplicitExports = false; 187 SymbolPatterns exportedSymbols; 188 SymbolPatterns unexportedSymbols; 189 SymbolPatterns whyLive; 190 191 std::vector<std::pair<llvm::StringRef, llvm::StringRef>> aliasedSymbols; 192 193 SymtabPresence localSymbolsPresence = SymtabPresence::All; 194 SymbolPatterns localSymbolPatterns; 195 196 bool zeroModTime = false; 197 198 llvm::StringRef osoPrefix; 199 200 llvm::MachO::Architecture arch() const { return platformInfo.target.Arch; } 201 202 llvm::MachO::PlatformType platform() const { 203 return platformInfo.target.Platform; 204 } 205 }; 206 207 extern std::unique_ptr<Configuration> config; 208 209 } // namespace macho 210 } // namespace lld 211 212 #endif 213