X-Git-Url: https://git.saurik.com/apple/ld64.git/blobdiff_plain/afe874b1634377ecb27057ee76deb04915bb34d7..7f09b9353af9897bf18933788d6a59c152c29edd:/src/ld/Options.h diff --git a/src/ld/Options.h b/src/ld/Options.h index d9becf3..e257e30 100644 --- a/src/ld/Options.h +++ b/src/ld/Options.h @@ -30,25 +30,31 @@ #include #include -#include -#include +#include +#include #include "ld.hpp" +#include "Snapshot.h" +#include "MachOFileAbstraction.hpp" extern void throwf (const char* format, ...) __attribute__ ((noreturn,format(printf, 1, 2))); extern void warning(const char* format, ...) __attribute__((format(printf, 1, 2))); +class Snapshot; + class LibraryOptions { public: LibraryOptions() : fWeakImport(false), fReExport(false), fBundleLoader(false), - fLazyLoad(false), fUpward(false), fForceLoad(false) {} + fLazyLoad(false), fUpward(false), fIndirectDylib(false), + fForceLoad(false) {} // for dynamic libraries bool fWeakImport; bool fReExport; bool fBundleLoader; bool fLazyLoad; bool fUpward; + bool fIndirectDylib; // for static libraries bool fForceLoad; }; @@ -80,13 +86,96 @@ public: enum CommonsMode { kCommonsIgnoreDylibs, kCommonsOverriddenByDylibs, kCommonsConflictsDylibsError }; enum UUIDMode { kUUIDNone, kUUIDRandom, kUUIDContent }; enum LocalSymbolHandling { kLocalSymbolsAll, kLocalSymbolsNone, kLocalSymbolsSelectiveInclude, kLocalSymbolsSelectiveExclude }; + enum BitcodeMode { kBitcodeProcess, kBitcodeAsData, kBitcodeMarker, kBitcodeStrip }; enum DebugInfoStripping { kDebugInfoNone, kDebugInfoMinimal, kDebugInfoFull }; +#if SUPPORT_APPLE_TV + enum Platform { kPlatformUnknown, kPlatformOSX, kPlatformiOS, kPlatformWatchOS, kPlatform_tvOS }; +#else + enum Platform { kPlatformUnknown, kPlatformOSX, kPlatformiOS, kPlatformWatchOS }; +#endif + + static Platform platformForLoadCommand(uint32_t lc) { + switch (lc) { + case LC_VERSION_MIN_MACOSX: + return kPlatformOSX; + case LC_VERSION_MIN_IPHONEOS: + return kPlatformiOS; + case LC_VERSION_MIN_WATCHOS: + return kPlatformWatchOS; + #if SUPPORT_APPLE_TV + case LC_VERSION_MIN_TVOS: + return kPlatform_tvOS; + #endif + } + assert(!lc && "unknown LC_VERSION_MIN load command"); + return kPlatformUnknown; + } + + static const char* platformName(Platform platform) { + switch (platform) { + case kPlatformOSX: + return "OSX"; + case kPlatformiOS: + return "iOS"; + case kPlatformWatchOS: + return "watchOS"; + #if SUPPORT_APPLE_TV + case kPlatform_tvOS: + return "tvOS"; + #endif + case kPlatformUnknown: + default: + return "(unknown)"; + } + } - struct FileInfo { + class FileInfo { + public: const char* path; uint64_t fileLen; time_t modTime; LibraryOptions options; + ld::File::Ordinal ordinal; + bool fromFileList; + + // These are used by the threaded input file parsing engine. + mutable int inputFileSlot; // The input file "slot" assigned to this particular file + bool readyToParse; + + // The use pattern for FileInfo is to create one on the stack in a leaf function and return + // it to the calling frame by copy. Therefore the copy constructor steals the path string from + // the source, which dies with the stack frame. + FileInfo(FileInfo const &other) : path(other.path), fileLen(other.fileLen), modTime(other.modTime), options(other.options), ordinal(other.ordinal), fromFileList(other.fromFileList), inputFileSlot(-1) { ((FileInfo&)other).path = NULL; }; + + FileInfo &operator=(FileInfo other) { + std::swap(path, other.path); + std::swap(fileLen, other.fileLen); + std::swap(modTime, other.modTime); + std::swap(options, other.options); + std::swap(ordinal, other.ordinal); + std::swap(fromFileList, other.fromFileList); + std::swap(inputFileSlot, other.inputFileSlot); + std::swap(readyToParse, other.readyToParse); + return *this; + } + + // Create an empty FileInfo. The path can be set implicitly by checkFileExists(). + FileInfo() : path(NULL), fileLen(0), modTime(-1), options(), fromFileList(false) {}; + + // Create a FileInfo for a specific path, but does not stat the file. + FileInfo(const char *_path) : path(strdup(_path)), fileLen(0), modTime(-1), options(), fromFileList(false) {}; + + ~FileInfo() { if (path) ::free((void*)path); } + + // Stat the file and update fileLen and modTime. + // If the object already has a path the p must be NULL. + // If the object does not have a path then p can be any candidate path, and if the file exists the object permanently remembers the path. + // Returns true if the file exists, false if not. + bool checkFileExists(const Options& options, const char *p=NULL); + + // Returns true if a previous call to checkFileExists() succeeded. + // Returns false if the file does not exist of checkFileExists() has never been called. + bool missing() const { return modTime == -1; } }; struct ExtraSection { @@ -105,6 +194,11 @@ public: uint8_t alignment; }; + struct SectionOrderList { + const char* segmentName; + std::vector sectionOrder; + }; + struct OrderedSymbol { const char* symbolName; const char* objectFileName; @@ -137,6 +231,25 @@ public: const char* alias; }; + struct SectionRename { + const char* fromSegment; + const char* fromSection; + const char* toSegment; + const char* toSection; + }; + + struct SegmentRename { + const char* fromSegment; + const char* toSegment; + }; + + enum { depLinkerVersion=0x00, depObjectFile=0x10, depDirectDylib=0x10, depIndirectDylib=0x10, + depUpwardDirectDylib=0x10, depUpwardIndirectDylib=0x10, depArchive=0x10, + depFileList=0x10, depSection=0x10, depBundleLoader=0x10, depMisc=0x10, depNotFound=0x11, + depOutputFile = 0x40 }; + + void dumpDependency(uint8_t, const char* path) const; + typedef const char* const* UndefinesIterator; // const ObjectFile::ReaderOptions& readerOptions(); @@ -147,16 +260,18 @@ public: bool preferSubArchitecture() const { return fHasPreferredSubType; } cpu_subtype_t subArchitecture() const { return fSubArchitecture; } bool allowSubArchitectureMismatches() const { return fAllowCpuSubtypeMismatches; } + bool enforceDylibSubtypesMatch() const { return fEnforceDylibSubtypesMatch; } bool forceCpuSubtypeAll() const { return fForceSubtypeAll; } const char* architectureName() const { return fArchitectureName; } - void setArchitecture(cpu_type_t, cpu_subtype_t subtype); + void setArchitecture(cpu_type_t, cpu_subtype_t subtype, Options::Platform platform); bool archSupportsThumb2() const { return fArchSupportsThumb2; } OutputKind outputKind() const { return fOutputKind; } bool prebind() const { return fPrebind; } bool bindAtLoad() const { return fBindAtLoad; } NameSpace nameSpace() const { return fNameSpace; } const char* installPath() const; // only for kDynamicLibrary - uint32_t currentVersion() const { return fDylibCurrentVersion; } // only for kDynamicLibrary + uint64_t currentVersion() const { return fDylibCurrentVersion; } // only for kDynamicLibrary + uint32_t currentVersion32() const; // only for kDynamicLibrary uint32_t compatibilityVersion() const { return fDylibCompatVersion; } // only for kDynamicLibrary const char* entryName() const { return fEntryName; } // only for kDynamicExecutable or kStaticExecutable const char* executablePath(); @@ -173,14 +288,19 @@ public: bool allGlobalsAreDeadStripRoots() const; bool shouldExport(const char*) const; bool shouldReExport(const char*) const; + std::vector exportsData() const; bool ignoreOtherArchInputFiles() const { return fIgnoreOtherArchFiles; } bool traceDylibs() const { return fTraceDylibs; } bool traceArchives() const { return fTraceArchives; } + bool traceEmitJSON() const { return fTraceEmitJSON; } bool deadCodeStrip() const { return fDeadStrip; } UndefinedTreatment undefinedTreatment() const { return fUndefinedTreatment; } ld::MacVersionMin macosxVersionMin() const { return fMacVersionMin; } ld::IOSVersionMin iOSVersionMin() const { return fIOSVersionMin; } + ld::WatchOSVersionMin watchOSVersionMin() const { return fWatchOSVersionMin; } + uint32_t minOSversion() const; bool minOS(ld::MacVersionMin mac, ld::IOSVersionMin iPhoneOS); + bool min_iOS(ld::IOSVersionMin requirediOSMin); bool messagesPrefixedWithArchitecture(); Treatment picTreatment(); WeakReferenceMismatchTreatment weakReferenceMismatchTreatment() const { return fWeakReferenceMismatchTreatment; } @@ -197,6 +317,7 @@ public: bool hasNonExecutableHeap() const { return fNonExecutableHeap; } UndefinesIterator initialUndefinesBegin() const { return &fInitialUndefines[0]; } UndefinesIterator initialUndefinesEnd() const { return &fInitialUndefines[fInitialUndefines.size()]; } + const std::vector& initialUndefines() const { return fInitialUndefines; } bool printWhyLive(const char* name) const; uint32_t minimumHeaderPad() const { return fMinimumHeaderPad; } bool maxMminimumHeaderPad() const { return fMaxMinimumHeaderPad; } @@ -205,7 +326,8 @@ public: CommonsMode commonsMode() const { return fCommonsMode; } bool warnCommons() const { return fWarnCommons; } bool keepRelocations(); - FileInfo findFile(const char* path) const; + FileInfo findFile(const std::string &path, const ld::dylib::File* fromDylib=nullptr) const; + bool findFile(const std::string &path, const std::vector &tbdExtensions, FileInfo& result) const; UUIDMode UUIDMode() const { return fUUIDMode; } bool warnStabs(); bool pauseAtEnd() { return fPause; } @@ -235,7 +357,7 @@ public: const std::vector& dylibOverrides() const { return fDylibOverrides; } const char* generatedMapPath() const { return fMapPath; } bool positionIndependentExecutable() const { return fPositionIndependentExecutable; } - Options::FileInfo findFileUsingPaths(const char* path) const; + Options::FileInfo findIndirectDylib(const std::string& installName, const ld::dylib::File* fromDylib) const; bool deadStripDylibs() const { return fDeadStripDylibs; } bool allowedUndefined(const char* name) const { return ( fAllowedUndefined.find(name) != fAllowedUndefined.end() ); } bool someAllowedUndefines() const { return (fAllowedUndefined.size() != 0); } @@ -243,12 +365,17 @@ public: bool keepLocalSymbol(const char* symbolName) const; bool allowTextRelocs() const { return fAllowTextRelocs; } bool warnAboutTextRelocs() const { return fWarnTextRelocs; } + bool kextsUseStubs() const { return fKextsUseStubs; } bool usingLazyDylibLinking() const { return fUsingLazyDylibLinking; } bool verbose() const { return fVerbose; } bool makeEncryptable() const { return fEncryptable; } bool needsUnwindInfoSection() const { return fAddCompactUnwindEncoding; } const std::vector& llvmOptions() const{ return fLLVMOptions; } + const std::vector& segmentOrder() const{ return fSegmentOrder; } + bool segmentOrderAfterFixedAddressSegment(const char* segName) const; + const std::vector* sectionOrder(const char* segName) const; const std::vector& dyldEnvironExtras() const{ return fDyldEnvironExtras; } + const std::vector& astFilePaths() const{ return fASTFilePaths; } bool makeCompressedDyldInfo() const { return fMakeCompressedDyldInfo; } bool hasExportedSymbolOrder(); bool exportedSymbolOrder(const char* sym, unsigned int* order) const; @@ -281,27 +408,88 @@ public: bool objcGc() const { return fObjCGc; } bool objcGcOnly() const { return fObjCGcOnly; } bool canUseThreadLocalVariables() const { return fTLVSupport; } - bool demangleSymbols() const { return fDemangle; } - bool addVersionLoadCommand() const { return fVersionLoadCommand; } + bool addVersionLoadCommand() const { return fVersionLoadCommand && (fPlatform != kPlatformUnknown); } bool addFunctionStarts() const { return fFunctionStartsLoadCommand; } + bool addDataInCodeInfo() const { return fDataInCodeInfoLoadCommand; } bool canReExportSymbols() const { return fCanReExportSymbols; } + const char* ltoCachePath() const { return fLtoCachePath; } + int ltoPruneInterval() const { return fLtoPruneInterval; } + int ltoPruneAfter() const { return fLtoPruneAfter; } + unsigned ltoMaxCacheSize() const { return fLtoMaxCacheSize; } const char* tempLtoObjectPath() const { return fTempLtoObjectPath; } + const char* overridePathlibLTO() const { return fOverridePathlibLTO; } + const char* mcpuLTO() const { return fLtoCpu; } bool objcCategoryMerging() const { return fObjcCategoryMerging; } bool pageAlignDataAtoms() const { return fPageAlignDataAtoms; } + bool keepDwarfUnwind() const { return fKeepDwarfUnwind; } + bool verboseOptimizationHints() const { return fVerboseOptimizationHints; } + bool ignoreOptimizationHints() const { return fIgnoreOptimizationHints; } + bool generateDtraceDOF() const { return fGenerateDtraceDOF; } + bool allowBranchIslands() const { return fAllowBranchIslands; } + bool traceSymbolLayout() const { return fTraceSymbolLayout; } + bool markAppExtensionSafe() const { return fMarkAppExtensionSafe; } + bool checkDylibsAreAppExtensionSafe() const { return fCheckAppExtensionSafe; } + bool forceLoadSwiftLibs() const { return fForceLoadSwiftLibs; } + bool bundleBitcode() const { return fBundleBitcode; } + bool hideSymbols() const { return fHideSymbols; } + bool verifyBitcode() const { return fVerifyBitcode; } + bool renameReverseSymbolMap() const { return fReverseMapUUIDRename; } + bool deduplicateFunctions() const { return fDeDupe; } + bool verboseDeduplicate() const { return fVerboseDeDupe; } + const char* reverseSymbolMapPath() const { return fReverseMapPath; } + std::string reverseMapTempPath() const { return fReverseMapTempPath; } + bool ltoCodegenOnly() const { return fLTOCodegenOnly; } + bool ignoreAutoLink() const { return fIgnoreAutoLink; } + bool allowDeadDuplicates() const { return fAllowDeadDups; } + bool allowWeakImports() const { return fAllowWeakImports; } + BitcodeMode bitcodeKind() const { return fBitcodeKind; } + bool sharedRegionEncodingV2() const { return fSharedRegionEncodingV2; } + bool useDataConstSegment() const { return fUseDataConstSegment; } + bool useTextExecSegment() const { return fUseTextExecSegment; } bool hasWeakBitTweaks() const; bool forceWeak(const char* symbolName) const; bool forceNotWeak(const char* symbolName) const; bool forceWeakNonWildCard(const char* symbolName) const; bool forceNotWeakNonWildcard(const char* symbolName) const; + bool forceCoalesce(const char* symbolName) const; + Snapshot& snapshot() const { return fLinkSnapshot; } + bool errorBecauseOfWarnings() const; + bool needsThreadLoadCommand() const { return fNeedsThreadLoadCommand; } + bool needsEntryPointLoadCommand() const { return fEntryPointLoadCommand; } + bool needsSourceVersionLoadCommand() const { return fSourceVersionLoadCommand; } + bool canUseAbsoluteSymbols() const { return fAbsoluteSymbols; } + bool allowSimulatorToLinkWithMacOSX() const { return fAllowSimulatorToLinkWithMacOSX; } + uint64_t sourceVersion() const { return fSourceVersion; } + uint32_t sdkVersion() const { return fSDKVersion; } + const char* demangleSymbol(const char* sym) const; + bool pipelineEnabled() const { return fPipelineFifo != NULL; } + const char* pipelineFifo() const { return fPipelineFifo; } + bool dumpDependencyInfo() const { return (fDependencyInfoPath != NULL); } + const char* dependencyInfoPath() const { return fDependencyInfoPath; } + bool targetIOSSimulator() const { return fTargetIOSSimulator; } + ld::relocatable::File::LinkerOptionsList& + linkerOptions() const { return fLinkerOptions; } + FileInfo findFramework(const char* frameworkName) const; + FileInfo findLibrary(const char* rootName, bool dylibsOnly=false) const; + bool armUsesZeroCostExceptions() const; + const std::vector& sectionRenames() const { return fSectionRenames; } + const std::vector& segmentRenames() const { return fSegmentRenames; } + bool moveRoSymbol(const char* symName, const char* filePath, const char*& seg, bool& wildCardMatch) const; + bool moveRwSymbol(const char* symName, const char* filePath, const char*& seg, bool& wildCardMatch) const; + Platform platform() const { return fPlatform; } + const std::vector& sdkPaths() const { return fSDKPaths; } + std::vector writeBitcodeLinkOptions() const; + std::string getSDKVersionStr() const; + std::string getPlatformStr() const; + uint8_t maxDefaultCommonAlign() const { return fMaxDefaultCommonAlign; } + bool hasDataSymbolMoves() const { return !fSymbolsMovesData.empty(); } + bool hasCodeSymbolMoves() const { return !fSymbolsMovesCode.empty(); } + + static uint32_t parseVersionNumber32(const char*); private: - class CStringEquals - { - public: - bool operator()(const char* left, const char* right) const { return (strcmp(left, right) == 0); } - }; - typedef __gnu_cxx::hash_map, CStringEquals> NameToOrder; - typedef __gnu_cxx::hash_set, CStringEquals> NameSet; + typedef std::unordered_map NameToOrder; + typedef std::unordered_set NameSet; enum ExportMode { kExportDefault, kExportSome, kDontExportSome }; enum LibrarySearchMode { kSearchDylibAndArchiveInEachDir, kSearchAllDirsForDylibsThenAllDirsForArchives }; enum InterposeMode { kInterposeNone, kInterposeAllExternal, kInterposeSome }; @@ -309,13 +497,15 @@ private: class SetWithWildcards { public: void insert(const char*); - bool contains(const char*) const; + bool contains(const char*, bool* wildCardMatch=NULL) const; + bool containsWithPrefix(const char* symbol, const char* file, bool& wildCardMatch) const; bool containsNonWildcard(const char*) const; bool empty() const { return fRegular.empty() && fWildCard.empty(); } bool hasWildCards() const { return !fWildCard.empty(); } NameSet::iterator regularBegin() const { return fRegular.begin(); } NameSet::iterator regularEnd() const { return fRegular.end(); } void remove(const NameSet&); + std::vector data() const; private: static bool hasWildCards(const char*); bool wildCardMatch(const char* pattern, const char* candidate) const; @@ -325,22 +515,27 @@ private: std::vector fWildCard; }; + struct SymbolsMove { + const char* toSegment; + SetWithWildcards symbols; + }; void parse(int argc, const char* argv[]); void checkIllegalOptionCombinations(); void buildSearchPaths(int argc, const char* argv[]); void parseArch(const char* architecture); - FileInfo findLibrary(const char* rootName, bool dylibsOnly=false); - FileInfo findFramework(const char* frameworkName); - FileInfo findFramework(const char* rootName, const char* suffix); + FileInfo findFramework(const char* rootName, const char* suffix) const; bool checkForFile(const char* format, const char* dir, const char* rootName, FileInfo& result) const; - uint32_t parseVersionNumber(const char*); + uint64_t parseVersionNumber64(const char*); + std::string getVersionString32(uint32_t ver) const; + std::string getVersionString64(uint64_t ver) const; + bool parsePackedVersion32(const std::string& versionStr, uint32_t &result); void parseSectionOrderFile(const char* segment, const char* section, const char* path); void parseOrderFile(const char* path, bool cstring); void addSection(const char* segment, const char* section, const char* path); void addSubLibrary(const char* name); - void loadFileList(const char* fileOfPaths); + void loadFileList(const char* fileOfPaths, ld::File::Ordinal baseOrdinal); uint64_t parseAddress(const char* addr); void loadExportFile(const char* fileOfExports, const char* option, SetWithWildcards& set); void parseAliasFile(const char* fileOfAliases); @@ -349,6 +544,7 @@ private: void setUndefinedTreatment(const char* treatment); void setMacOSXVersionMin(const char* version); void setIOSVersionMin(const char* version); + void setWatchOSVersionMin(const char* version); void setWeakReferenceMismatchTreatment(const char* treatment); void addDylibOverride(const char* paths); void addSectionAlignment(const char* segment, const char* section, const char* alignment); @@ -361,7 +557,10 @@ private: void warnObsolete(const char* arg); uint32_t parseProtection(const char* prot); void loadSymbolOrderFile(const char* fileOfExports, NameToOrder& orderMapping); - + void addSectionRename(const char* srcSegment, const char* srcSection, const char* dstSegment, const char* dstSection); + void addSegmentRename(const char* srcSegment, const char* dstSegment); + void addSymbolMove(const char* dstSegment, const char* symbolList, std::vector& list, const char* optionName); + void cannotBeUsedWithBitcode(const char* arg); // ObjectFile::ReaderOptions fReaderOptions; @@ -384,7 +583,7 @@ private: bool fDeadStrip; NameSpace fNameSpace; uint32_t fDylibCompatVersion; - uint32_t fDylibCurrentVersion; + uint64_t fDylibCurrentVersion; const char* fDylibInstallName; const char* fFinalName; const char* fEntryName; @@ -398,6 +597,7 @@ private: SetWithWildcards fForceWeakSymbols; SetWithWildcards fForceNotWeakSymbols; SetWithWildcards fReExportSymbols; + SetWithWildcards fForceCoalesceSymbols; NameSet fRemovedExports; NameToOrder fExportSymbolsOrder; ExportMode fExportMode; @@ -419,10 +619,18 @@ private: const char* fSegAddrTablePath; const char* fMapPath; const char* fDyldInstallPath; + const char* fLtoCachePath; + int fLtoPruneInterval; + int fLtoPruneAfter; + unsigned fLtoMaxCacheSize; const char* fTempLtoObjectPath; + const char* fOverridePathlibLTO; + const char* fLtoCpu; uint64_t fZeroPageSize; uint64_t fStackSize; uint64_t fStackAddr; + uint64_t fSourceVersion; + uint32_t fSDKVersion; bool fExecutableStack; bool fNonExecutableHeap; bool fDisableNonExecutableHeap; @@ -442,6 +650,7 @@ private: bool fStatistics; bool fPrintOptions; bool fSharedRegionEligible; + bool fSharedRegionEligibleForceOff; bool fPrintOrderFileStatistics; bool fReadOnlyx86Stubs; bool fPositionIndependentExecutable; @@ -451,14 +660,18 @@ private: bool fDeadStripDylibs; bool fAllowTextRelocs; bool fWarnTextRelocs; + bool fKextsUseStubs; bool fUsingLazyDylibLinking; bool fEncryptable; + bool fEncryptableForceOn; + bool fEncryptableForceOff; bool fOrderData; bool fMarkDeadStrippableDylib; bool fMakeCompressedDyldInfo; bool fMakeCompressedDyldInfoForceOff; bool fNoEHLabels; bool fAllowCpuSubtypeMismatches; + bool fEnforceDylibSubtypesMatch; bool fUseSimplifiedDylibReExports; bool fObjCABIVersion2Override; bool fObjCABIVersion1Override; @@ -486,6 +699,7 @@ private: bool fTraceDylibs; bool fTraceIndirectDylibs; bool fTraceArchives; + bool fTraceEmitJSON; bool fOutputSlidable; bool fWarnWeakExports; bool fObjcGcCompaction; @@ -499,17 +713,62 @@ private: bool fFunctionStartsLoadCommand; bool fFunctionStartsForcedOn; bool fFunctionStartsForcedOff; + bool fDataInCodeInfoLoadCommand; + bool fDataInCodeInfoLoadCommandForcedOn; + bool fDataInCodeInfoLoadCommandForcedOff; bool fCanReExportSymbols; bool fObjcCategoryMerging; bool fPageAlignDataAtoms; + bool fNeedsThreadLoadCommand; + bool fEntryPointLoadCommand; + bool fEntryPointLoadCommandForceOn; + bool fEntryPointLoadCommandForceOff; + bool fSourceVersionLoadCommand; + bool fSourceVersionLoadCommandForceOn; + bool fSourceVersionLoadCommandForceOff; + bool fTargetIOSSimulator; + bool fExportDynamic; + bool fAbsoluteSymbols; + bool fAllowSimulatorToLinkWithMacOSX; + bool fKeepDwarfUnwind; + bool fKeepDwarfUnwindForcedOn; + bool fKeepDwarfUnwindForcedOff; + bool fVerboseOptimizationHints; + bool fIgnoreOptimizationHints; + bool fGenerateDtraceDOF; + bool fAllowBranchIslands; + bool fTraceSymbolLayout; + bool fMarkAppExtensionSafe; + bool fCheckAppExtensionSafe; + bool fForceLoadSwiftLibs; + bool fSharedRegionEncodingV2; + bool fUseDataConstSegment; + bool fUseDataConstSegmentForceOn; + bool fUseDataConstSegmentForceOff; + bool fUseTextExecSegment; + bool fBundleBitcode; + bool fHideSymbols; + bool fVerifyBitcode; + bool fReverseMapUUIDRename; + bool fDeDupe; + bool fVerboseDeDupe; + const char* fReverseMapPath; + std::string fReverseMapTempPath; + bool fLTOCodegenOnly; + bool fIgnoreAutoLink; + bool fAllowDeadDups; + bool fAllowWeakImports; + BitcodeMode fBitcodeKind; + Platform fPlatform; DebugInfoStripping fDebugInfoStripping; const char* fTraceOutputFile; ld::MacVersionMin fMacVersionMin; ld::IOSVersionMin fIOSVersionMin; + ld::WatchOSVersionMin fWatchOSVersionMin; std::vector fAliases; std::vector fInitialUndefines; NameSet fAllowedUndefined; - NameSet fWhyLive; + SetWithWildcards fWhyLive; std::vector fExtraSections; std::vector fSectionAlignments; std::vector fOrderedSymbols; @@ -522,7 +781,21 @@ private: std::vector fFrameworkSearchPaths; std::vector fSDKPaths; std::vector fDyldEnvironExtras; + std::vector fSegmentOrder; + std::vector fASTFilePaths; + std::vector fSectionOrder; + std::vector< std::vector > fLinkerOptions; + std::vector fSectionRenames; + std::vector fSegmentRenames; + std::vector fSymbolsMovesData; + std::vector fSymbolsMovesCode; bool fSaveTempFiles; + mutable Snapshot fLinkSnapshot; + bool fSnapshotRequested; + const char* fPipelineFifo; + const char* fDependencyInfoPath; + mutable int fDependencyFileDescriptor; + uint8_t fMaxDefaultCommonAlign; };