1f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//===- lld/ReaderWriter/MachOLinkingContext.h -----------------------------===// 2f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// 3f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// The LLVM Linker 4f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// 5f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// This file is distributed under the University of Illinois Open Source 6f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// License. See LICENSE.TXT for details. 7f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// 8f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//===----------------------------------------------------------------------===// 9f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 10f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#ifndef LLD_READER_WRITER_MACHO_LINKING_CONTEXT_H 11f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#define LLD_READER_WRITER_MACHO_LINKING_CONTEXT_H 12f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 13f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "lld/Core/LinkingContext.h" 14f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "lld/Core/Reader.h" 15f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "lld/Core/Writer.h" 16f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/ADT/STLExtras.h" 17f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/ADT/StringMap.h" 18f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/ADT/StringSet.h" 19f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/BinaryFormat/MachO.h" 20f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/Support/ErrorHandling.h" 21f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include <set> 22f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 23f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotusing llvm::MachO::HeaderFileType; 24f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 25f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotnamespace lld { 26f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 27f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotnamespace mach_o { 28f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ArchHandler; 29f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass MachODylibFile; 30f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass MachOFile; 31f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass SectCreateFile; 32f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot} 33f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 34f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass MachOLinkingContext : public LinkingContext { 35f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic: 36f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MachOLinkingContext(); 37f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ~MachOLinkingContext() override; 38f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 39f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot enum Arch { 40f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot arch_unknown, 41f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot arch_ppc, 42f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot arch_x86, 43f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot arch_x86_64, 44f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot arch_armv6, 45f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot arch_armv7, 46f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot arch_armv7s, 47f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot arch_arm64, 48f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot }; 49f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 50f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot enum class OS { 51f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unknown, 52f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot macOSX, 53f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot iOS, 54f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot iOS_simulator 55f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot }; 56f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 57f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot enum class ExportMode { 58f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot globals, // Default, all global symbols exported. 59f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot whiteList, // -exported_symbol[s_list], only listed symbols exported. 60f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot blackList // -unexported_symbol[s_list], no listed symbol exported. 61f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot }; 62f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 63f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot enum class DebugInfoMode { 64f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot addDebugMap, // Default 65f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot noDebugMap // -S option 66f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot }; 67f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 68f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot enum class UndefinedMode { 69f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot error, 70f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot warning, 71f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot suppress, 72f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot dynamicLookup 73f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot }; 74f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 75f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot enum ObjCConstraint { 76f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot objc_unknown = 0, 77f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot objc_supports_gc = 2, 78f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot objc_gc_only = 4, 79f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // Image optimized by dyld = 8 80f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // GC compaction = 16 81f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot objc_retainReleaseForSimulator = 32, 82f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot objc_retainRelease 83f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot }; 84f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 85f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Initializes the context to sane default values given the specified output 86f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// file type, arch, os, and minimum os version. This should be called before 87f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// other setXXX() methods. 88f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void configure(HeaderFileType type, Arch arch, OS os, uint32_t minOSVersion, 89f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool exportDynamicSymbols); 90f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 91f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void addPasses(PassManager &pm) override; 92f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool validateImpl(raw_ostream &diagnostics) override; 93f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot std::string demangle(StringRef symbolName) const override; 94f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 95f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void createImplicitFiles(std::vector<std::unique_ptr<File>> &) override; 96f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 97f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Creates a new file which is owned by the context. Returns a pointer to 98f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// the new file. 99f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot template <class T, class... Args> 100f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot typename std::enable_if<!std::is_array<T>::value, T *>::type 101f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot make_file(Args &&... args) const { 102f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot auto file = std::unique_ptr<T>(new T(std::forward<Args>(args)...)); 103f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot auto *filePtr = file.get(); 104f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot auto *ctx = const_cast<MachOLinkingContext *>(this); 105f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ctx->getNodes().push_back(llvm::make_unique<FileNode>(std::move(file))); 106f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return filePtr; 107f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 108f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 109f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot uint32_t getCPUType() const; 110f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot uint32_t getCPUSubType() const; 111f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 112f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool addEntryPointLoadCommand() const; 113f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool addUnixThreadLoadCommand() const; 114f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool outputTypeHasEntry() const; 115f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool is64Bit() const; 116f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 117f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot virtual uint64_t pageZeroSize() const { return _pageZeroSize; } 118f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot virtual uint64_t pageSize() const { return _pageSize; } 119f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 120f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot mach_o::ArchHandler &archHandler() const; 121f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 122f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot HeaderFileType outputMachOType() const { return _outputMachOType; } 123f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 124f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Arch arch() const { return _arch; } 125f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot StringRef archName() const { return nameFromArch(_arch); } 126f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot OS os() const { return _os; } 127f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 128f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ExportMode exportMode() const { return _exportMode; } 129f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setExportMode(ExportMode mode) { _exportMode = mode; } 130f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void addExportSymbol(StringRef sym); 131f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool exportRestrictMode() const { return _exportMode != ExportMode::globals; } 132f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool exportSymbolNamed(StringRef sym) const; 133f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 134f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot DebugInfoMode debugInfoMode() const { return _debugInfoMode; } 135f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setDebugInfoMode(DebugInfoMode mode) { 136f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot _debugInfoMode = mode; 137f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 138f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 139f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void appendOrderedSymbol(StringRef symbol, StringRef filename); 140f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 141f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool keepPrivateExterns() const { return _keepPrivateExterns; } 142f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setKeepPrivateExterns(bool v) { _keepPrivateExterns = v; } 143f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool demangleSymbols() const { return _demangle; } 144f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setDemangleSymbols(bool d) { _demangle = d; } 145f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool mergeObjCCategories() const { return _mergeObjCCategories; } 146f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setMergeObjCCategories(bool v) { _mergeObjCCategories = v; } 147f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Create file at specified path which will contain a binary encoding 148f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// of all input and output file paths. 149f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot std::error_code createDependencyFile(StringRef path); 150f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void addInputFileDependency(StringRef path) const; 151f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void addInputFileNotFound(StringRef path) const; 152f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void addOutputFileDependency(StringRef path) const; 153f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 154f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool minOS(StringRef mac, StringRef iOS) const; 155f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setDoNothing(bool value) { _doNothing = value; } 156f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool doNothing() const { return _doNothing; } 157f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool printAtoms() const { return _printAtoms; } 158f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool testingFileUsage() const { return _testingFileUsage; } 159f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const StringRefVector &searchDirs() const { return _searchDirs; } 160f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const StringRefVector &frameworkDirs() const { return _frameworkDirs; } 161f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setSysLibRoots(const StringRefVector &paths); 162f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const StringRefVector &sysLibRoots() const { return _syslibRoots; } 163f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool PIE() const { return _pie; } 164f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setPIE(bool pie) { _pie = pie; } 165f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool generateVersionLoadCommand() const { 166f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return _generateVersionLoadCommand; 167f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 168f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setGenerateVersionLoadCommand(bool v) { 169f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot _generateVersionLoadCommand = v; 170f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 171f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 172f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool generateFunctionStartsLoadCommand() const { 173f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return _generateFunctionStartsLoadCommand; 174f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 175f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setGenerateFunctionStartsLoadCommand(bool v) { 176f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot _generateFunctionStartsLoadCommand = v; 177f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 178f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 179f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool generateDataInCodeLoadCommand() const { 180f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return _generateDataInCodeLoadCommand; 181f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 182f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setGenerateDataInCodeLoadCommand(bool v) { 183f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot _generateDataInCodeLoadCommand = v; 184f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 185f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 186f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot uint64_t stackSize() const { return _stackSize; } 187f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setStackSize(uint64_t stackSize) { _stackSize = stackSize; } 188f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 189f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot uint64_t baseAddress() const { return _baseAddress; } 190f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setBaseAddress(uint64_t baseAddress) { _baseAddress = baseAddress; } 191f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 192f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ObjCConstraint objcConstraint() const { return _objcConstraint; } 193f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 194f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot uint32_t osMinVersion() const { return _osMinVersion; } 195f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 196f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot uint32_t sdkVersion() const { return _sdkVersion; } 197f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setSdkVersion(uint64_t v) { _sdkVersion = v; } 198f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 199f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot uint64_t sourceVersion() const { return _sourceVersion; } 200f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setSourceVersion(uint64_t v) { _sourceVersion = v; } 201f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 202f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot uint32_t swiftVersion() const { return _swiftVersion; } 203f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 204f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Checks whether a given path on the filesystem exists. 205f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 206f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// When running in -test_file_usage mode, this method consults an 207f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// internally maintained list of files that exist (provided by -path_exists) 208f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// instead of the actual filesystem. 209f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool pathExists(StringRef path) const; 210f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 211f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Like pathExists() but only used on files - not directories. 212f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool fileExists(StringRef path) const; 213f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 214f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Adds any library search paths derived from the given base, possibly 215f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// modified by -syslibroots. 216f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 217f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The set of paths added consists of approximately all syslibroot-prepended 218f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// versions of libPath that exist, or the original libPath if there are none 219f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// for whatever reason. With various edge-cases for compatibility. 220f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void addModifiedSearchDir(StringRef libPath, bool isSystemPath = false); 221f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 222f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Determine whether -lFoo can be resolve within the given path, and 223f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// return the filename if so. 224f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 225f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The -lFoo option is documented to search for libFoo.dylib and libFoo.a in 226f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// that order, unless Foo ends in ".o", in which case only the exact file 227f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// matches (e.g. -lfoo.o would only find foo.o). 228f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot llvm::Optional<StringRef> searchDirForLibrary(StringRef path, 229f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot StringRef libName) const; 230f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 231f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Iterates through all search path entries looking for libName (as 232f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// specified by -lFoo). 233f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot llvm::Optional<StringRef> searchLibrary(StringRef libName) const; 234f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 235f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Add a framework search path. Internally, this method may be prepended 236f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// the path with syslibroot. 237f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void addFrameworkSearchDir(StringRef fwPath, bool isSystemPath = false); 238f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 239f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Iterates through all framework directories looking for 240f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Foo.framework/Foo (when fwName = "Foo"). 241f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot llvm::Optional<StringRef> findPathForFramework(StringRef fwName) const; 242f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 243f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief The dylib's binary compatibility version, in the raw uint32 format. 244f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 245f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// When building a dynamic library, this is the compatibility version that 246f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// gets embedded into the result. Other Mach-O binaries that link against 247f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// this library will store the compatibility version in its load command. At 248f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// runtime, the loader will verify that the binary is compatible with the 249f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// installed dynamic library. 250f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot uint32_t compatibilityVersion() const { return _compatibilityVersion; } 251f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 252f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief The dylib's current version, in the the raw uint32 format. 253f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 254f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// When building a dynamic library, this is the current version that gets 255f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// embedded into the result. Other Mach-O binaries that link against 256f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// this library will store the compatibility version in its load command. 257f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot uint32_t currentVersion() const { return _currentVersion; } 258f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 259f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief The dylib's install name. 260f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 261f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Binaries that link against the dylib will embed this path into the dylib 262f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// load command. When loading the binaries at runtime, this is the location 263f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// on disk that the loader will look for the dylib. 264f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot StringRef installName() const { return _installName; } 265f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 266f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Whether or not the dylib has side effects during initialization. 267f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 268f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Dylibs marked as being dead strippable provide the guarantee that loading 269f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// the dylib has no side effects, allowing the linker to strip out the dylib 270f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// when linking a binary that does not use any of its symbols. 271f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool deadStrippableDylib() const { return _deadStrippableDylib; } 272f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 273f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Whether or not to use flat namespace. 274f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 275f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// MachO usually uses a two-level namespace, where each external symbol 276f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// referenced by the target is associated with the dylib that will provide 277f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// the symbol's definition at runtime. Using flat namespace overrides this 278f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// behavior: the linker searches all dylibs on the command line and all 279f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// dylibs those original dylibs depend on, but does not record which dylib 280f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// an external symbol came from. At runtime dyld again searches all images 281f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// and uses the first definition it finds. In addition, any undefines in 282f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// loaded flat_namespace dylibs must be resolvable at build time. 283f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool useFlatNamespace() const { return _flatNamespace; } 284f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 285f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief How to handle undefined symbols. 286f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 287f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Options are: 288f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// * error: Report an error and terminate linking. 289f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// * warning: Report a warning, but continue linking. 290f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// * suppress: Ignore and continue linking. 291f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// * dynamic_lookup: For use with -twolevel namespace: Records source dylibs 292f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// for symbols that are defined in a linked dylib at static link time. 293f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Undefined symbols are handled by searching all loaded images at 294f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// runtime. 295f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot UndefinedMode undefinedMode() const { return _undefinedMode; } 296f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 297f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief The path to the executable that will load the bundle at runtime. 298f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 299f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// When building a Mach-O bundle, this executable will be examined if there 300f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// are undefined symbols after the main link phase. It is expected that this 301f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// binary will be loading the bundle at runtime and will provide the symbols 302f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// at that point. 303f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot StringRef bundleLoader() const { return _bundleLoader; } 304f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 305f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setCompatibilityVersion(uint32_t vers) { _compatibilityVersion = vers; } 306f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setCurrentVersion(uint32_t vers) { _currentVersion = vers; } 307f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setInstallName(StringRef name) { _installName = name; } 308f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setDeadStrippableDylib(bool deadStrippable) { 309f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot _deadStrippableDylib = deadStrippable; 310f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 311f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setUseFlatNamespace(bool flatNamespace) { 312f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot _flatNamespace = flatNamespace; 313f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 314f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 315f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setUndefinedMode(UndefinedMode undefinedMode) { 316f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot _undefinedMode = undefinedMode; 317f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 318f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 319f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setBundleLoader(StringRef loader) { _bundleLoader = loader; } 320f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setPrintAtoms(bool value=true) { _printAtoms = value; } 321f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setTestingFileUsage(bool value = true) { 322f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot _testingFileUsage = value; 323f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 324f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void addExistingPathForDebug(StringRef path) { 325f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot _existingPaths.insert(path); 326f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 327f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 328f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void addRpath(StringRef rpath); 329f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const StringRefVector &rpaths() const { return _rpaths; } 330f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 331f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Add section alignment constraint on final layout. 332f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void addSectionAlignment(StringRef seg, StringRef sect, uint16_t align); 333f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 334f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Add a section based on a command-line sectcreate option. 335f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void addSectCreateSection(StringRef seg, StringRef sect, 336f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot std::unique_ptr<MemoryBuffer> content); 337f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 338f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Returns true if specified section had alignment constraints. 339f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool sectionAligned(StringRef seg, StringRef sect, uint16_t &align) const; 340f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 341f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot StringRef dyldPath() const { return "/usr/lib/dyld"; } 342f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 343f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Stub creation Pass should be run. 344f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool needsStubsPass() const; 345f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 346f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // GOT creation Pass should be run. 347f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool needsGOTPass() const; 348f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 349f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Pass to add TLV sections. 350f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool needsTLVPass() const; 351f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 352f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Pass to transform __compact_unwind into __unwind_info should be run. 353f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool needsCompactUnwindPass() const; 354f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 355f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Pass to add shims switching between thumb and arm mode. 356f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool needsShimPass() const; 357f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 358f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Pass to add objc image info and optimized objc data. 359f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool needsObjCPass() const; 360f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 361f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Magic symbol name stubs will need to help lazy bind. 362f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot StringRef binderSymbolName() const; 363f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 364f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Used to keep track of direct and indirect dylibs. 365f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void registerDylib(mach_o::MachODylibFile *dylib, bool upward) const; 366f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 367f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // Reads a file from disk to memory. Returns only a needed chunk 368f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // if a fat binary. 369f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ErrorOr<std::unique_ptr<MemoryBuffer>> getMemoryBuffer(StringRef path); 370f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 371f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Used to find indirect dylibs. Instantiates a MachODylibFile if one 372f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// has not already been made for the requested dylib. Uses -L and -F 373f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// search paths to allow indirect dylibs to be overridden. 374f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot mach_o::MachODylibFile* findIndirectDylib(StringRef path); 375f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 376f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot uint32_t dylibCurrentVersion(StringRef installName) const; 377f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 378f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot uint32_t dylibCompatVersion(StringRef installName) const; 379f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 380f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ArrayRef<mach_o::MachODylibFile*> allDylibs() const { 381f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return _allDylibs; 382f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 383f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 384f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Creates a copy (owned by this MachOLinkingContext) of a string. 385f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot StringRef copy(StringRef str) { return str.copy(_allocator); } 386f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 387f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// If the memoryBuffer is a fat file with a slice for the current arch, 388f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// this method will return the offset and size of that slice. 389f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool sliceFromFatFile(MemoryBufferRef mb, uint32_t &offset, uint32_t &size); 390f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 391f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Returns if a command line option specified dylib is an upward link. 392f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isUpwardDylib(StringRef installName) const; 393f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 394f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static bool isThinObjectFile(StringRef path, Arch &arch); 395f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static Arch archFromCpuType(uint32_t cputype, uint32_t cpusubtype); 396f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static Arch archFromName(StringRef archName); 397f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static StringRef nameFromArch(Arch arch); 398f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static uint32_t cpuTypeFromArch(Arch arch); 399f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static uint32_t cpuSubtypeFromArch(Arch arch); 400f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static bool is64Bit(Arch arch); 401f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static bool isHostEndian(Arch arch); 402f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static bool isBigEndian(Arch arch); 403f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 404f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Construct 32-bit value from string "X.Y.Z" where 405f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// bits are xxxx.yy.zz. Largest number is 65535.255.255 406f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static bool parsePackedVersion(StringRef str, uint32_t &result); 407f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 408f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Construct 64-bit value from string "A.B.C.D.E" where 409f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// bits are aaaa.bb.cc.dd.ee. Largest number is 16777215.1023.1023.1023.1023 410f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static bool parsePackedVersion(StringRef str, uint64_t &result); 411f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 412f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void finalizeInputFiles() override; 413f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 414f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot llvm::Error handleLoadedFile(File &file) override; 415f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 416f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool customAtomOrderer(const DefinedAtom *left, const DefinedAtom *right, 417f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool &leftBeforeRight) const; 418f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 419f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Return the 'flat namespace' file. This is the file that supplies 420f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// atoms for otherwise undefined symbols when the -flat_namespace or 421f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// -undefined dynamic_lookup options are used. 422f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot File* flatNamespaceFile() const { return _flatNamespaceFile; } 423f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 424f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprivate: 425f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Writer &writer() const override; 426f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot mach_o::MachODylibFile* loadIndirectDylib(StringRef path); 427f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void checkExportWhiteList(const DefinedAtom *atom) const; 428f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void checkExportBlackList(const DefinedAtom *atom) const; 429f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot struct ArchInfo { 430f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot StringRef archName; 431f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MachOLinkingContext::Arch arch; 432f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool littleEndian; 433f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot uint32_t cputype; 434f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot uint32_t cpusubtype; 435f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot }; 436f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 437f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot struct SectionAlign { 438f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot StringRef segmentName; 439f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot StringRef sectionName; 440f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot uint16_t align; 441f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot }; 442f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 443f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot struct OrderFileNode { 444f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot StringRef fileFilter; 445f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned order; 446f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot }; 447f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 448f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static bool findOrderOrdinal(const std::vector<OrderFileNode> &nodes, 449f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const DefinedAtom *atom, unsigned &ordinal); 450f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 451f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static ArchInfo _s_archInfos[]; 452f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 453f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot std::set<StringRef> _existingPaths; // For testing only. 454f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot StringRefVector _searchDirs; 455f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot StringRefVector _syslibRoots; 456f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot StringRefVector _frameworkDirs; 457f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot HeaderFileType _outputMachOType = llvm::MachO::MH_EXECUTE; 458f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool _outputMachOTypeStatic = false; // Disambiguate static vs dynamic prog 459f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool _doNothing = false; // for -help and -v which just print info 460f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool _pie = false; 461f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Arch _arch = arch_unknown; 462f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot OS _os = OS::macOSX; 463f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot uint32_t _osMinVersion = 0; 464f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot uint32_t _sdkVersion = 0; 465f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot uint64_t _sourceVersion = 0; 466f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot uint64_t _pageZeroSize = 0; 467f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot uint64_t _pageSize = 4096; 468f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot uint64_t _baseAddress = 0; 469f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot uint64_t _stackSize = 0; 470f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot uint32_t _compatibilityVersion = 0; 471f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot uint32_t _currentVersion = 0; 472f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ObjCConstraint _objcConstraint = objc_unknown; 473f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot uint32_t _swiftVersion = 0; 474f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot StringRef _installName; 475f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot StringRefVector _rpaths; 476f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool _flatNamespace = false; 477f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot UndefinedMode _undefinedMode = UndefinedMode::error; 478f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool _deadStrippableDylib = false; 479f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool _printAtoms = false; 480f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool _testingFileUsage = false; 481f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool _keepPrivateExterns = false; 482f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool _demangle = false; 483f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool _mergeObjCCategories = true; 484f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool _generateVersionLoadCommand = false; 485f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool _generateFunctionStartsLoadCommand = false; 486f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool _generateDataInCodeLoadCommand = false; 487f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot StringRef _bundleLoader; 488f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot mutable std::unique_ptr<mach_o::ArchHandler> _archHandler; 489f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot mutable std::unique_ptr<Writer> _writer; 490f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot std::vector<SectionAlign> _sectAligns; 491f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot mutable llvm::StringMap<mach_o::MachODylibFile*> _pathToDylibMap; 492f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot mutable std::vector<mach_o::MachODylibFile*> _allDylibs; 493f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot mutable std::set<mach_o::MachODylibFile*> _upwardDylibs; 494f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot mutable std::vector<std::unique_ptr<File>> _indirectDylibs; 495f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot mutable std::mutex _dylibsMutex; 496f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ExportMode _exportMode = ExportMode::globals; 497f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot llvm::StringSet<> _exportedSymbols; 498f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot DebugInfoMode _debugInfoMode = DebugInfoMode::addDebugMap; 499f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot std::unique_ptr<llvm::raw_fd_ostream> _dependencyInfo; 500f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot llvm::StringMap<std::vector<OrderFileNode>> _orderFiles; 501f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned _orderFileEntries = 0; 502f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot File *_flatNamespaceFile = nullptr; 503f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot mach_o::SectCreateFile *_sectCreateFile = nullptr; 504f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot}; 505f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 506f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot} // end namespace lld 507f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 508f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#endif // LLD_READER_WRITER_MACHO_LINKING_CONTEXT_H 509