1 //===- Config.h -------------------------------------------------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 #ifndef LLD_MACHO_CONFIG_H
10 #define LLD_MACHO_CONFIG_H
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"
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
>;
39 llvm::MachO::Target target
;
40 llvm::VersionTuple minimum
;
41 llvm::VersionTuple sdk
;
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));
50 enum class NamespaceKind
{
55 enum class UndefinedSymbolTreatment
{
71 llvm::StringRef segName
;
72 llvm::StringRef sectName
;
76 struct SegmentProtection
{
82 class SymbolPatterns
{
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
;
89 bool empty() const { return literals
.empty() && globs
.empty(); }
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;
97 enum class SymtabPresence
{
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;
113 bool staticLink
= false;
114 bool implicitDylibs
= 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 // Temporary config flag that will be removed once we have fully implemented
134 // support for __eh_frame.
135 bool parseEhFrames
= false;
137 uint32_t dylibCompatibilityVersion
= 0;
138 uint32_t dylibCurrentVersion
= 0;
139 uint32_t timeTraceGranularity
= 500;
141 std::string progName
;
143 // For `clang -arch arm64 -arch x86_64`, clang will:
144 // 1. invoke the linker twice, to write one temporary output per arch
145 // 2. invoke `lipo` to merge the two outputs into a single file
146 // `outputFile` is the name of the temporary file the linker writes to.
147 // `finalOutput `is the name of the file lipo writes to after the link.
148 llvm::StringRef outputFile
;
149 llvm::StringRef finalOutput
;
151 llvm::StringRef installName
;
152 llvm::StringRef mapFile
;
153 llvm::StringRef ltoObjPath
;
154 llvm::StringRef thinLTOJobs
;
155 llvm::StringRef umbrella
;
157 llvm::CachePruningPolicy thinLTOCachePolicy
;
158 llvm::StringRef thinLTOCacheDir
;
159 bool deadStripDylibs
= false;
160 bool demangle
= false;
161 bool deadStrip
= false;
162 bool errorForArchMismatch
= false;
163 PlatformInfo platformInfo
;
164 llvm::Optional
<PlatformInfo
> secondaryPlatformInfo
;
165 NamespaceKind namespaceKind
= NamespaceKind::twolevel
;
166 UndefinedSymbolTreatment undefinedSymbolTreatment
=
167 UndefinedSymbolTreatment::error
;
168 ICFLevel icfLevel
= ICFLevel::none
;
169 llvm::MachO::HeaderFileType outputType
;
170 std::vector
<llvm::StringRef
> systemLibraryRoots
;
171 std::vector
<llvm::StringRef
> librarySearchPaths
;
172 std::vector
<llvm::StringRef
> frameworkSearchPaths
;
173 std::vector
<llvm::StringRef
> runtimePaths
;
174 std::vector
<std::string
> astPaths
;
175 std::vector
<Symbol
*> explicitUndefineds
;
176 llvm::StringSet
<> explicitDynamicLookups
;
177 // There are typically few custom sectionAlignments or segmentProtections,
178 // so use a vector instead of a map.
179 std::vector
<SectionAlign
> sectionAlignments
;
180 std::vector
<SegmentProtection
> segmentProtections
;
182 bool callGraphProfileSort
= false;
183 llvm::StringRef printSymbolOrder
;
185 SectionRenameMap sectionRenameMap
;
186 SegmentRenameMap segmentRenameMap
;
188 bool hasExplicitExports
= false;
189 SymbolPatterns exportedSymbols
;
190 SymbolPatterns unexportedSymbols
;
191 SymbolPatterns whyLive
;
193 SymtabPresence localSymbolsPresence
= SymtabPresence::All
;
194 SymbolPatterns localSymbolPatterns
;
196 bool zeroModTime
= false;
198 llvm::StringRef osoPrefix
;
200 llvm::MachO::Architecture
arch() const { return platformInfo
.target
.Arch
; }
202 llvm::MachO::PlatformType
platform() const {
203 return platformInfo
.target
.Platform
;
207 // Whether to force-load an archive.
208 enum class ForceLoad
{
209 Default
, // Apply -all_load or -ObjC behaviors if those flags are enabled
210 Yes
, // Always load the archive, regardless of other flags
211 No
, // Never load the archive, regardless of other flags
214 extern std::unique_ptr
<Configuration
> config
;