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