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 };
// 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(0), options(), fromFileList(false) {};
+ 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(0), options(), fromFileList(false) {};
+ FileInfo(const char *_path) : path(strdup(_path)), fileLen(0), modTime(-1), options(), fromFileList(false) {};
~FileInfo() { if (path) ::free((void*)path); }
// 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 {
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);
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; }
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<std::string> &tbdExtensions, FileInfo& result) const;
UUIDMode UUIDMode() const { return fUUIDMode; }
bool warnStabs();
bool pauseAtEnd() { return fPause; }
const std::vector<DylibOverride>& 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); }
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 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;
std::vector<std::string> 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:
typedef std::unordered_map<const char*, unsigned int, ld::CStringHash, ld::CStringEquals> NameToOrder;
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);
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;
bool fMakeCompressedDyldInfoForceOff;
bool fNoEHLabels;
bool fAllowCpuSubtypeMismatches;
+ bool fEnforceDylibSubtypesMatch;
bool fUseSimplifiedDylibReExports;
bool fObjCABIVersion2Override;
bool fObjCABIVersion1Override;
bool fTraceDylibs;
bool fTraceIndirectDylibs;
bool fTraceArchives;
+ bool fTraceEmitJSON;
bool fOutputSlidable;
bool fWarnWeakExports;
bool fObjcGcCompaction;
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;
std::vector<SegmentRename> fSegmentRenames;
std::vector<SymbolsMove> fSymbolsMovesData;
std::vector<SymbolsMove> fSymbolsMovesCode;
- std::vector<SymbolsMove> fSymbolsMovesZeroFill;
bool fSaveTempFiles;
mutable Snapshot fLinkSnapshot;
bool fSnapshotRequested;
const char* fPipelineFifo;
const char* fDependencyInfoPath;
mutable int fDependencyFileDescriptor;
+ uint8_t fMaxDefaultCommonAlign;
};