X-Git-Url: https://git.saurik.com/apple/ld64.git/blobdiff_plain/dd9e569f384b2c941bcc73d89d1468756788ee5b..c1f6aec514f7e3059b9613d90f479f494f19f7bb:/src/ld/Options.h diff --git a/src/ld/Options.h b/src/ld/Options.h index e7ffff2..4ff780c 100644 --- a/src/ld/Options.h +++ b/src/ld/Options.h @@ -88,8 +88,9 @@ public: enum LocalSymbolHandling { kLocalSymbolsAll, kLocalSymbolsNone, kLocalSymbolsSelectiveInclude, kLocalSymbolsSelectiveExclude }; enum BitcodeMode { kBitcodeProcess, kBitcodeAsData, kBitcodeMarker, kBitcodeStrip }; enum DebugInfoStripping { kDebugInfoNone, kDebugInfoMinimal, kDebugInfoFull }; + enum UnalignedPointerTreatment { kUnalignedPointerError, kUnalignedPointerWarning, kUnalignedPointerIgnore }; #if SUPPORT_APPLE_TV - enum Platform { kPlatformUnknown, kPlatformOSX, kPlatformiOS, kPlatformWatchOS, kPlatform_tvOS }; + enum Platform { kPlatformUnknown, kPlatformOSX=1, kPlatformiOS=2, kPlatformWatchOS=3, kPlatform_tvOS=4, kPlatform_bridgeOS=5 }; #else enum Platform { kPlatformUnknown, kPlatformOSX, kPlatformiOS, kPlatformWatchOS }; #endif @@ -123,16 +124,41 @@ public: case kPlatform_tvOS: return "tvOS"; #endif + case kPlatform_bridgeOS: + return "bridgeOS"; case kPlatformUnknown: default: return "(unknown)"; } } + static void userReadableSwiftVersion(uint8_t value, char versionString[64]) + { + switch (value) { + case 1: + strcpy(versionString, "1.0"); + break; + case 2: + strcpy(versionString, "1.1"); + break; + case 3: + strcpy(versionString, "2.0"); + break; + case 4: + strcpy(versionString, "3.0"); + break; + case 5: + strcpy(versionString, "4.0"); + break; + default: + sprintf(versionString, "unknown ABI version 0x%02X", value); + } + } + + class FileInfo { public: const char* path; - uint64_t fileLen; time_t modTime; LibraryOptions options; ld::File::Ordinal ordinal; @@ -145,13 +171,24 @@ public: // 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(FileInfo const &other) : path(other.path), 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(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(0), options(), fromFileList(false) {}; + FileInfo() : path(NULL), 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(0), options(), fromFileList(false) {}; + FileInfo(const char *_path) : path(strdup(_path)), modTime(-1), options(), fromFileList(false) {}; ~FileInfo() { if (path) ::free((void*)path); } @@ -163,7 +200,7 @@ public: // 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==0; } + bool missing() const { return modTime == -1; } }; struct ExtraSection { @@ -248,6 +285,7 @@ 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, Options::Platform platform); @@ -279,6 +317,7 @@ public: 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; } @@ -312,7 +351,8 @@ public: CommonsMode commonsMode() const { return fCommonsMode; } bool warnCommons() const { return fWarnCommons; } bool keepRelocations(); - FileInfo findFile(const std::string &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; } @@ -342,7 +382,7 @@ public: const std::vector& dylibOverrides() const { return fDylibOverrides; } const char* generatedMapPath() const { return fMapPath; } bool positionIndependentExecutable() const { return fPositionIndependentExecutable; } - Options::FileInfo findFileUsingPaths(const std::string &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); } @@ -394,9 +434,14 @@ public: bool objcGcOnly() const { return fObjCGcOnly; } bool canUseThreadLocalVariables() const { return fTLVSupport; } bool addVersionLoadCommand() const { return fVersionLoadCommand && (fPlatform != kPlatformUnknown); } + bool addBuildVersionLoadCommand() const { return fBuildVersionLoadCommand; } 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; } @@ -415,14 +460,19 @@ public: 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; } + bool noInitializers() const { return fNoInitializers; } 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; @@ -458,6 +508,13 @@ public: 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(); } + void writeToTraceFile(const char* buffer, size_t len) const; + UnalignedPointerTreatment unalignedPointerTreatment() const { return fUnalignedPointerTreatment; } + + static uint32_t parseVersionNumber32(const char*); private: typedef std::unordered_map NameToOrder; @@ -500,9 +557,9 @@ private: bool checkForFile(const char* format, const char* dir, const char* rootName, FileInfo& result) const; uint64_t parseVersionNumber64(const char*); - uint32_t parseVersionNumber32(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); @@ -591,6 +648,10 @@ 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; @@ -639,6 +700,7 @@ private: bool fMakeCompressedDyldInfoForceOff; bool fNoEHLabels; bool fAllowCpuSubtypeMismatches; + bool fEnforceDylibSubtypesMatch; bool fUseSimplifiedDylibReExports; bool fObjCABIVersion2Override; bool fObjCABIVersion1Override; @@ -666,6 +728,7 @@ private: bool fTraceDylibs; bool fTraceIndirectDylibs; bool fTraceArchives; + bool fTraceEmitJSON; bool fOutputSlidable; bool fWarnWeakExports; bool fObjcGcCompaction; @@ -676,6 +739,7 @@ private: bool fVersionLoadCommand; bool fVersionLoadCommandForcedOn; bool fVersionLoadCommandForcedOff; + bool fBuildVersionLoadCommand; bool fFunctionStartsLoadCommand; bool fFunctionStartsForcedOn; bool fFunctionStartsForcedOff; @@ -711,15 +775,20 @@ private: 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; + bool fNoInitializers; BitcodeMode fBitcodeKind; Platform fPlatform; DebugInfoStripping fDebugInfoStripping; @@ -751,13 +820,15 @@ private: std::vector fSegmentRenames; std::vector fSymbolsMovesData; std::vector fSymbolsMovesCode; - std::vector fSymbolsMovesZeroFill; bool fSaveTempFiles; mutable Snapshot fLinkSnapshot; bool fSnapshotRequested; const char* fPipelineFifo; const char* fDependencyInfoPath; mutable int fDependencyFileDescriptor; + mutable int fTraceFileDescriptor; + uint8_t fMaxDefaultCommonAlign; + UnalignedPointerTreatment fUnalignedPointerTreatment; };