diff --git a/.gitignore b/.gitignore
index 449436c..752dee4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,2 @@
 SOURCES/hans-gpg-key.asc
-SOURCES/lld-10.0.0.src.tar.xz
+SOURCES/lld-11.0.0.src.tar.xz
diff --git a/.lld.metadata b/.lld.metadata
index f189117..2ae63c0 100644
--- a/.lld.metadata
+++ b/.lld.metadata
@@ -1,2 +1,2 @@
 32fa4b0193960f05064f2ab31b5a89c7cf48a0b9 SOURCES/hans-gpg-key.asc
-ed8dc4f73847e084b65f4ad5d2f6670f6f38a8eb SOURCES/lld-10.0.0.src.tar.xz
+60672d63fa16a0c3b6e267331fa605d76b79e87b SOURCES/lld-11.0.0.src.tar.xz
diff --git a/SOURCES/0001-Revert-lld-Initial-commit-for-new-Mach-O-backend.patch b/SOURCES/0001-Revert-lld-Initial-commit-for-new-Mach-O-backend.patch
new file mode 100644
index 0000000..597ebb9
--- /dev/null
+++ b/SOURCES/0001-Revert-lld-Initial-commit-for-new-Mach-O-backend.patch
@@ -0,0 +1,7986 @@
+From c81a0aa7794dab5420165e47eebd6337b0da5891 Mon Sep 17 00:00:00 2001
+From: Tom Stellard <tstellar@redhat.com>
+Date: Mon, 10 Aug 2020 16:44:53 -0700
+Subject: [PATCH] Revert "[lld] Initial commit for new Mach-O backend"
+
+This reverts commit 03f43b3aca363e16c45d8733400fd0083b1af4d8.
+---
+ lld/CMakeLists.txt                            |    1 -
+ lld/MachO/Arch/X86_64.cpp                     |  286 ----
+ lld/MachO/CMakeLists.txt                      |   36 -
+ lld/MachO/Config.h                            |   57 -
+ lld/MachO/Driver.cpp                          |  451 ------
+ lld/MachO/Driver.h                            |   36 -
+ lld/MachO/ExportTrie.cpp                      |  283 ----
+ lld/MachO/ExportTrie.h                        |   47 -
+ lld/MachO/InputFiles.cpp                      |  433 ------
+ lld/MachO/InputFiles.h                        |  121 --
+ lld/MachO/InputSection.cpp                    |   48 -
+ lld/MachO/InputSection.h                      |   74 -
+ lld/MachO/MachOStructs.h                      |   36 -
+ lld/MachO/MergedOutputSection.cpp             |   74 -
+ lld/MachO/MergedOutputSection.h               |   56 -
+ lld/MachO/Options.td                          | 1297 -----------------
+ lld/MachO/OutputSection.cpp                   |   18 -
+ lld/MachO/OutputSection.h                     |   74 -
+ lld/MachO/OutputSegment.cpp                   |   67 -
+ lld/MachO/OutputSegment.h                     |   62 -
+ lld/MachO/SymbolTable.cpp                     |   87 --
+ lld/MachO/SymbolTable.h                       |   50 -
+ lld/MachO/Symbols.cpp                         |   23 -
+ lld/MachO/Symbols.h                           |  138 --
+ lld/MachO/SyntheticSections.cpp               |  409 ------
+ lld/MachO/SyntheticSections.h                 |  290 ----
+ lld/MachO/Target.cpp                          |   14 -
+ lld/MachO/Target.h                            |   75 -
+ lld/MachO/Writer.cpp                          |  542 -------
+ lld/MachO/Writer.h                            |   31 -
+ lld/include/lld/Common/Driver.h               |    5 -
+ .../Inputs/MacOSX.sdk/usr/lib/libSystem.tbd   |   42 -
+ .../iPhoneSimulator.sdk/usr/lib/libSystem.tbd |   23 -
+ lld/test/MachO/Inputs/libfunction.s           |    6 -
+ lld/test/MachO/Inputs/libgoodbye.s            |   14 -
+ lld/test/MachO/Inputs/libhello.s              |   17 -
+ lld/test/MachO/arch.s                         |   11 -
+ lld/test/MachO/archive.s                      |   35 -
+ lld/test/MachO/bss.s                          |   59 -
+ lld/test/MachO/dylib.s                        |   35 -
+ lld/test/MachO/dylink-lazy.s                  |   62 -
+ lld/test/MachO/dylink.s                       |   69 -
+ lld/test/MachO/entry-symbol.s                 |   28 -
+ lld/test/MachO/export-trie.s                  |   44 -
+ lld/test/MachO/fat-arch.s                     |   16 -
+ .../MachO/invalid/alignment-too-large.yaml    |   58 -
+ lld/test/MachO/invalid/archive-no-index.s     |   17 -
+ lld/test/MachO/invalid/bad-archive.s          |   11 -
+ lld/test/MachO/invalid/duplicate-symbol.s     |   12 -
+ lld/test/MachO/invalid/invalid-executable.s   |   11 -
+ lld/test/MachO/invalid/invalid-fat-narch.s    |   12 -
+ lld/test/MachO/invalid/invalid-fat-offset.s   |   22 -
+ .../invalid/invalid-relocation-length.yaml    |   99 --
+ .../invalid/invalid-relocation-pcrel.yaml     |   99 --
+ lld/test/MachO/invalid/missing-dylib.s        |    5 -
+ lld/test/MachO/invalid/no-id-dylink.yaml      |  166 ---
+ lld/test/MachO/invalid/no-such-file.s         |    4 -
+ .../MachO/invalid/order-file-bad-arch.test    |    9 -
+ .../MachO/invalid/order-file-bad-objfile.test |   10 -
+ .../MachO/invalid/reserved-section-name.s     |   14 -
+ lld/test/MachO/invalid/stub-link.s            |   15 -
+ lld/test/MachO/invalid/undefined-symbol.s     |   11 -
+ lld/test/MachO/link-search-order.s            |   43 -
+ lld/test/MachO/load-commands.s                |   22 -
+ lld/test/MachO/local-got.s                    |   58 -
+ lld/test/MachO/no-exports-dylib.s             |    6 -
+ lld/test/MachO/order-file.s                   |  131 --
+ lld/test/MachO/platform-version.test          |   17 -
+ lld/test/MachO/relocations.s                  |   66 -
+ lld/test/MachO/resolution.s                   |   44 -
+ lld/test/MachO/search-paths-darwin.test       |   20 -
+ lld/test/MachO/search-paths.test              |   15 -
+ lld/test/MachO/section-headers.s              |   46 -
+ lld/test/MachO/section-merge.s                |   26 -
+ lld/test/MachO/segments.s                     |   53 -
+ lld/test/MachO/silent-ignore.test             |    9 -
+ lld/test/MachO/static-link.s                  |   30 -
+ lld/test/MachO/stub-link.s                    |   21 -
+ lld/test/MachO/sub-library.s                  |   74 -
+ lld/test/MachO/subsections-section-relocs.s   |   47 -
+ lld/test/MachO/subsections-symbol-relocs.s    |   55 -
+ lld/test/MachO/symbol-order.s                 |   46 -
+ lld/test/MachO/symtab.s                       |   54 -
+ lld/test/MachO/x86-64-reloc-signed.s          |   64 -
+ lld/test/MachO/x86-64-reloc-unsigned.s        |   31 -
+ lld/tools/lld/CMakeLists.txt                  |    1 -
+ lld/tools/lld/lld.cpp                         |   12 +-
+ 87 files changed, 4 insertions(+), 7244 deletions(-)
+ delete mode 100644 lld/MachO/Arch/X86_64.cpp
+ delete mode 100644 lld/MachO/CMakeLists.txt
+ delete mode 100644 lld/MachO/Config.h
+ delete mode 100644 lld/MachO/Driver.cpp
+ delete mode 100644 lld/MachO/Driver.h
+ delete mode 100644 lld/MachO/ExportTrie.cpp
+ delete mode 100644 lld/MachO/ExportTrie.h
+ delete mode 100644 lld/MachO/InputFiles.cpp
+ delete mode 100644 lld/MachO/InputFiles.h
+ delete mode 100644 lld/MachO/InputSection.cpp
+ delete mode 100644 lld/MachO/InputSection.h
+ delete mode 100644 lld/MachO/MachOStructs.h
+ delete mode 100644 lld/MachO/MergedOutputSection.cpp
+ delete mode 100644 lld/MachO/MergedOutputSection.h
+ delete mode 100644 lld/MachO/Options.td
+ delete mode 100644 lld/MachO/OutputSection.cpp
+ delete mode 100644 lld/MachO/OutputSection.h
+ delete mode 100644 lld/MachO/OutputSegment.cpp
+ delete mode 100644 lld/MachO/OutputSegment.h
+ delete mode 100644 lld/MachO/SymbolTable.cpp
+ delete mode 100644 lld/MachO/SymbolTable.h
+ delete mode 100644 lld/MachO/Symbols.cpp
+ delete mode 100644 lld/MachO/Symbols.h
+ delete mode 100644 lld/MachO/SyntheticSections.cpp
+ delete mode 100644 lld/MachO/SyntheticSections.h
+ delete mode 100644 lld/MachO/Target.cpp
+ delete mode 100644 lld/MachO/Target.h
+ delete mode 100644 lld/MachO/Writer.cpp
+ delete mode 100644 lld/MachO/Writer.h
+ delete mode 100644 lld/test/MachO/Inputs/MacOSX.sdk/usr/lib/libSystem.tbd
+ delete mode 100644 lld/test/MachO/Inputs/iPhoneSimulator.sdk/usr/lib/libSystem.tbd
+ delete mode 100644 lld/test/MachO/Inputs/libfunction.s
+ delete mode 100644 lld/test/MachO/Inputs/libgoodbye.s
+ delete mode 100644 lld/test/MachO/Inputs/libhello.s
+ delete mode 100644 lld/test/MachO/arch.s
+ delete mode 100644 lld/test/MachO/archive.s
+ delete mode 100644 lld/test/MachO/bss.s
+ delete mode 100644 lld/test/MachO/dylib.s
+ delete mode 100644 lld/test/MachO/dylink-lazy.s
+ delete mode 100644 lld/test/MachO/dylink.s
+ delete mode 100644 lld/test/MachO/entry-symbol.s
+ delete mode 100644 lld/test/MachO/export-trie.s
+ delete mode 100644 lld/test/MachO/fat-arch.s
+ delete mode 100644 lld/test/MachO/invalid/alignment-too-large.yaml
+ delete mode 100644 lld/test/MachO/invalid/archive-no-index.s
+ delete mode 100644 lld/test/MachO/invalid/bad-archive.s
+ delete mode 100644 lld/test/MachO/invalid/duplicate-symbol.s
+ delete mode 100644 lld/test/MachO/invalid/invalid-executable.s
+ delete mode 100644 lld/test/MachO/invalid/invalid-fat-narch.s
+ delete mode 100644 lld/test/MachO/invalid/invalid-fat-offset.s
+ delete mode 100644 lld/test/MachO/invalid/invalid-relocation-length.yaml
+ delete mode 100644 lld/test/MachO/invalid/invalid-relocation-pcrel.yaml
+ delete mode 100644 lld/test/MachO/invalid/missing-dylib.s
+ delete mode 100644 lld/test/MachO/invalid/no-id-dylink.yaml
+ delete mode 100644 lld/test/MachO/invalid/no-such-file.s
+ delete mode 100644 lld/test/MachO/invalid/order-file-bad-arch.test
+ delete mode 100644 lld/test/MachO/invalid/order-file-bad-objfile.test
+ delete mode 100644 lld/test/MachO/invalid/reserved-section-name.s
+ delete mode 100644 lld/test/MachO/invalid/stub-link.s
+ delete mode 100644 lld/test/MachO/invalid/undefined-symbol.s
+ delete mode 100644 lld/test/MachO/link-search-order.s
+ delete mode 100644 lld/test/MachO/load-commands.s
+ delete mode 100644 lld/test/MachO/local-got.s
+ delete mode 100644 lld/test/MachO/no-exports-dylib.s
+ delete mode 100644 lld/test/MachO/order-file.s
+ delete mode 100644 lld/test/MachO/platform-version.test
+ delete mode 100644 lld/test/MachO/relocations.s
+ delete mode 100644 lld/test/MachO/resolution.s
+ delete mode 100644 lld/test/MachO/search-paths-darwin.test
+ delete mode 100644 lld/test/MachO/search-paths.test
+ delete mode 100644 lld/test/MachO/section-headers.s
+ delete mode 100644 lld/test/MachO/section-merge.s
+ delete mode 100644 lld/test/MachO/segments.s
+ delete mode 100644 lld/test/MachO/silent-ignore.test
+ delete mode 100644 lld/test/MachO/static-link.s
+ delete mode 100644 lld/test/MachO/stub-link.s
+ delete mode 100644 lld/test/MachO/sub-library.s
+ delete mode 100644 lld/test/MachO/subsections-section-relocs.s
+ delete mode 100644 lld/test/MachO/subsections-symbol-relocs.s
+ delete mode 100644 lld/test/MachO/symbol-order.s
+ delete mode 100644 lld/test/MachO/symtab.s
+ delete mode 100644 lld/test/MachO/x86-64-reloc-signed.s
+ delete mode 100644 lld/test/MachO/x86-64-reloc-unsigned.s
+
+diff --git a/lld/CMakeLists.txt b/lld/CMakeLists.txt
+index 5090c935e75..a0f2132c0f5 100644
+--- a/lld/CMakeLists.txt
++++ b/lld/CMakeLists.txt
+@@ -223,7 +223,6 @@ endif()
+ add_subdirectory(docs)
+ add_subdirectory(COFF)
+ add_subdirectory(ELF)
+-add_subdirectory(MachO)
+ add_subdirectory(MinGW)
+ add_subdirectory(wasm)
+ 
+diff --git a/lld/MachO/Arch/X86_64.cpp b/lld/MachO/Arch/X86_64.cpp
+deleted file mode 100644
+index 36f686ca2f1..00000000000
+--- a/lld/MachO/Arch/X86_64.cpp
++++ /dev/null
+@@ -1,286 +0,0 @@
+-//===- X86_64.cpp ---------------------------------------------------------===//
+-//
+-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+-// See https://llvm.org/LICENSE.txt for license information.
+-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+-//
+-//===----------------------------------------------------------------------===//
+-
+-#include "InputFiles.h"
+-#include "Symbols.h"
+-#include "SyntheticSections.h"
+-#include "Target.h"
+-
+-#include "lld/Common/ErrorHandler.h"
+-#include "llvm/BinaryFormat/MachO.h"
+-#include "llvm/Support/Endian.h"
+-
+-using namespace llvm::MachO;
+-using namespace llvm::support::endian;
+-using namespace lld;
+-using namespace lld::macho;
+-
+-namespace {
+-
+-struct X86_64 : TargetInfo {
+-  X86_64();
+-
+-  uint64_t getImplicitAddend(MemoryBufferRef, const section_64 &,
+-                             const relocation_info &) const override;
+-  void relocateOne(uint8_t *loc, const Reloc &, uint64_t val) const override;
+-
+-  void writeStub(uint8_t *buf, const DylibSymbol &) const override;
+-  void writeStubHelperHeader(uint8_t *buf) const override;
+-  void writeStubHelperEntry(uint8_t *buf, const DylibSymbol &,
+-                            uint64_t entryAddr) const override;
+-
+-  void prepareSymbolRelocation(lld::macho::Symbol &, const InputSection *,
+-                               const Reloc &) override;
+-  uint64_t getSymbolVA(const lld::macho::Symbol &, uint8_t type) const override;
+-};
+-
+-} // namespace
+-
+-static std::string getErrorLocation(MemoryBufferRef mb, const section_64 &sec,
+-                                    const relocation_info &rel) {
+-  return ("invalid relocation at offset " + std::to_string(rel.r_address) +
+-          " of " + sec.segname + "," + sec.sectname + " in " +
+-          mb.getBufferIdentifier())
+-      .str();
+-}
+-
+-static void validateLength(MemoryBufferRef mb, const section_64 &sec,
+-                           const relocation_info &rel,
+-                           const std::vector<uint8_t> &validLengths) {
+-  if (std::find(validLengths.begin(), validLengths.end(), rel.r_length) !=
+-      validLengths.end())
+-    return;
+-
+-  std::string msg = getErrorLocation(mb, sec, rel) + ": relocations of type " +
+-                    std::to_string(rel.r_type) + " must have r_length of ";
+-  bool first = true;
+-  for (uint8_t length : validLengths) {
+-    if (!first)
+-      msg += " or ";
+-    first = false;
+-    msg += std::to_string(length);
+-  }
+-  fatal(msg);
+-}
+-
+-uint64_t X86_64::getImplicitAddend(MemoryBufferRef mb, const section_64 &sec,
+-                                   const relocation_info &rel) const {
+-  auto *buf = reinterpret_cast<const uint8_t *>(mb.getBufferStart());
+-  const uint8_t *loc = buf + sec.offset + rel.r_address;
+-  switch (rel.r_type) {
+-  case X86_64_RELOC_BRANCH:
+-    // XXX: ld64 also supports r_length = 0 here but I'm not sure when such a
+-    // relocation will actually be generated.
+-    validateLength(mb, sec, rel, {2});
+-    break;
+-  case X86_64_RELOC_SIGNED:
+-  case X86_64_RELOC_SIGNED_1:
+-  case X86_64_RELOC_SIGNED_2:
+-  case X86_64_RELOC_SIGNED_4:
+-  case X86_64_RELOC_GOT_LOAD:
+-  case X86_64_RELOC_GOT:
+-    if (!rel.r_pcrel)
+-      fatal(getErrorLocation(mb, sec, rel) + ": relocations of type " +
+-            std::to_string(rel.r_type) + " must be pcrel");
+-    validateLength(mb, sec, rel, {2});
+-    break;
+-  case X86_64_RELOC_UNSIGNED:
+-    if (rel.r_pcrel)
+-      fatal(getErrorLocation(mb, sec, rel) + ": relocations of type " +
+-            std::to_string(rel.r_type) + " must not be pcrel");
+-    validateLength(mb, sec, rel, {2, 3});
+-    break;
+-  default:
+-    error("TODO: Unhandled relocation type " + std::to_string(rel.r_type));
+-    return 0;
+-  }
+-
+-  switch (rel.r_length) {
+-  case 0:
+-    return *loc;
+-  case 1:
+-    return read16le(loc);
+-  case 2:
+-    return read32le(loc);
+-  case 3:
+-    return read64le(loc);
+-  default:
+-    llvm_unreachable("invalid r_length");
+-  }
+-}
+-
+-void X86_64::relocateOne(uint8_t *loc, const Reloc &r, uint64_t val) const {
+-  switch (r.type) {
+-  case X86_64_RELOC_BRANCH:
+-  case X86_64_RELOC_SIGNED:
+-  case X86_64_RELOC_SIGNED_1:
+-  case X86_64_RELOC_SIGNED_2:
+-  case X86_64_RELOC_SIGNED_4:
+-  case X86_64_RELOC_GOT_LOAD:
+-  case X86_64_RELOC_GOT:
+-    // These types are only used for pc-relative relocations, so offset by 4
+-    // since the RIP has advanced by 4 at this point. This is only valid when
+-    // r_length = 2, which is enforced by validateLength().
+-    val -= 4;
+-    break;
+-  case X86_64_RELOC_UNSIGNED:
+-    break;
+-  default:
+-    llvm_unreachable(
+-        "getImplicitAddend should have flagged all unhandled relocation types");
+-  }
+-
+-  switch (r.length) {
+-  case 0:
+-    *loc = val;
+-    break;
+-  case 1:
+-    write16le(loc, val);
+-    break;
+-  case 2:
+-    write32le(loc, val);
+-    break;
+-  case 3:
+-    write64le(loc, val);
+-    break;
+-  default:
+-    llvm_unreachable("invalid r_length");
+-  }
+-}
+-
+-// The following methods emit a number of assembly sequences with RIP-relative
+-// addressing. Note that RIP-relative addressing on X86-64 has the RIP pointing
+-// to the next instruction, not the current instruction, so we always have to
+-// account for the current instruction's size when calculating offsets.
+-// writeRipRelative helps with that.
+-//
+-// bufAddr:  The virtual address corresponding to buf[0].
+-// bufOff:   The offset within buf of the next instruction.
+-// destAddr: The destination address that the current instruction references.
+-static void writeRipRelative(uint8_t *buf, uint64_t bufAddr, uint64_t bufOff,
+-                             uint64_t destAddr) {
+-  uint64_t rip = bufAddr + bufOff;
+-  // For the instructions we care about, the RIP-relative address is always
+-  // stored in the last 4 bytes of the instruction.
+-  write32le(buf + bufOff - 4, destAddr - rip);
+-}
+-
+-static constexpr uint8_t stub[] = {
+-    0xff, 0x25, 0, 0, 0, 0, // jmpq *__la_symbol_ptr(%rip)
+-};
+-
+-void X86_64::writeStub(uint8_t *buf, const DylibSymbol &sym) const {
+-  memcpy(buf, stub, 2); // just copy the two nonzero bytes
+-  uint64_t stubAddr = in.stubs->addr + sym.stubsIndex * sizeof(stub);
+-  writeRipRelative(buf, stubAddr, sizeof(stub),
+-                   in.lazyPointers->addr + sym.stubsIndex * WordSize);
+-}
+-
+-static constexpr uint8_t stubHelperHeader[] = {
+-    0x4c, 0x8d, 0x1d, 0, 0, 0, 0, // 0x0: leaq ImageLoaderCache(%rip), %r11
+-    0x41, 0x53,                   // 0x7: pushq %r11
+-    0xff, 0x25, 0,    0, 0, 0,    // 0x9: jmpq *dyld_stub_binder@GOT(%rip)
+-    0x90,                         // 0xf: nop
+-};
+-
+-static constexpr uint8_t stubHelperEntry[] = {
+-    0x68, 0, 0, 0, 0, // 0x0: pushq <bind offset>
+-    0xe9, 0, 0, 0, 0, // 0x5: jmp <__stub_helper>
+-};
+-
+-void X86_64::writeStubHelperHeader(uint8_t *buf) const {
+-  memcpy(buf, stubHelperHeader, sizeof(stubHelperHeader));
+-  writeRipRelative(buf, in.stubHelper->addr, 7, in.imageLoaderCache->getVA());
+-  writeRipRelative(buf, in.stubHelper->addr, 0xf,
+-                   in.got->addr +
+-                       in.stubHelper->stubBinder->gotIndex * WordSize);
+-}
+-
+-void X86_64::writeStubHelperEntry(uint8_t *buf, const DylibSymbol &sym,
+-                                  uint64_t entryAddr) const {
+-  memcpy(buf, stubHelperEntry, sizeof(stubHelperEntry));
+-  write32le(buf + 1, sym.lazyBindOffset);
+-  writeRipRelative(buf, entryAddr, sizeof(stubHelperEntry),
+-                   in.stubHelper->addr);
+-}
+-
+-void X86_64::prepareSymbolRelocation(lld::macho::Symbol &sym,
+-                                     const InputSection *isec, const Reloc &r) {
+-  switch (r.type) {
+-  case X86_64_RELOC_GOT_LOAD:
+-    // TODO: implement mov -> lea relaxation for non-dynamic symbols
+-  case X86_64_RELOC_GOT:
+-    in.got->addEntry(sym);
+-    break;
+-  case X86_64_RELOC_BRANCH: {
+-    if (auto *dysym = dyn_cast<DylibSymbol>(&sym))
+-      in.stubs->addEntry(*dysym);
+-    break;
+-  }
+-  case X86_64_RELOC_UNSIGNED: {
+-    if (auto *dysym = dyn_cast<DylibSymbol>(&sym)) {
+-      if (r.length != 3) {
+-        error("X86_64_RELOC_UNSIGNED referencing the dynamic symbol " +
+-              dysym->getName() + " must have r_length = 3");
+-        return;
+-      }
+-      in.binding->addEntry(dysym, isec, r.offset, r.addend);
+-    }
+-    break;
+-  }
+-  case X86_64_RELOC_SIGNED:
+-  case X86_64_RELOC_SIGNED_1:
+-  case X86_64_RELOC_SIGNED_2:
+-  case X86_64_RELOC_SIGNED_4:
+-    break;
+-  case X86_64_RELOC_SUBTRACTOR:
+-  case X86_64_RELOC_TLV:
+-    fatal("TODO: handle relocation type " + std::to_string(r.type));
+-    break;
+-  default:
+-    llvm_unreachable("unexpected relocation type");
+-  }
+-}
+-
+-uint64_t X86_64::getSymbolVA(const lld::macho::Symbol &sym,
+-                             uint8_t type) const {
+-  switch (type) {
+-  case X86_64_RELOC_GOT_LOAD:
+-  case X86_64_RELOC_GOT:
+-    return in.got->addr + sym.gotIndex * WordSize;
+-  case X86_64_RELOC_BRANCH:
+-    if (auto *dysym = dyn_cast<DylibSymbol>(&sym))
+-      return in.stubs->addr + dysym->stubsIndex * sizeof(stub);
+-    return sym.getVA();
+-  case X86_64_RELOC_UNSIGNED:
+-  case X86_64_RELOC_SIGNED:
+-  case X86_64_RELOC_SIGNED_1:
+-  case X86_64_RELOC_SIGNED_2:
+-  case X86_64_RELOC_SIGNED_4:
+-    return sym.getVA();
+-  case X86_64_RELOC_SUBTRACTOR:
+-  case X86_64_RELOC_TLV:
+-    fatal("TODO: handle relocation type " + std::to_string(type));
+-  default:
+-    llvm_unreachable("Unexpected relocation type");
+-  }
+-}
+-
+-X86_64::X86_64() {
+-  cpuType = CPU_TYPE_X86_64;
+-  cpuSubtype = CPU_SUBTYPE_X86_64_ALL;
+-
+-  stubSize = sizeof(stub);
+-  stubHelperHeaderSize = sizeof(stubHelperHeader);
+-  stubHelperEntrySize = sizeof(stubHelperEntry);
+-}
+-
+-TargetInfo *macho::createX86_64TargetInfo() {
+-  static X86_64 t;
+-  return &t;
+-}
+diff --git a/lld/MachO/CMakeLists.txt b/lld/MachO/CMakeLists.txt
+deleted file mode 100644
+index 6fe356f5158..00000000000
+--- a/lld/MachO/CMakeLists.txt
++++ /dev/null
+@@ -1,36 +0,0 @@
+-set(LLVM_TARGET_DEFINITIONS Options.td)
+-tablegen(LLVM Options.inc -gen-opt-parser-defs)
+-add_public_tablegen_target(MachOOptionsTableGen)
+-
+-add_lld_library(lldMachO2
+-  Arch/X86_64.cpp
+-  Driver.cpp
+-  ExportTrie.cpp
+-  InputFiles.cpp
+-  InputSection.cpp
+-  MergedOutputSection.cpp
+-  OutputSection.cpp
+-  OutputSegment.cpp
+-  SymbolTable.cpp
+-  Symbols.cpp
+-  SyntheticSections.cpp
+-  Target.cpp
+-  Writer.cpp
+-
+-  LINK_COMPONENTS
+-  ${LLVM_TARGETS_TO_BUILD}
+-  BinaryFormat
+-  Core
+-  Object
+-  Option
+-  Support
+-  TextAPI
+-
+-  LINK_LIBS
+-  lldCommon
+-  ${LLVM_PTHREAD_LIB}
+-
+-  DEPENDS
+-  MachOOptionsTableGen
+-  ${tablegen_deps}
+-  )
+diff --git a/lld/MachO/Config.h b/lld/MachO/Config.h
+deleted file mode 100644
+index 79812a43356..00000000000
+--- a/lld/MachO/Config.h
++++ /dev/null
+@@ -1,57 +0,0 @@
+-//===- Config.h -------------------------------------------------*- C++ -*-===//
+-//
+-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+-// See https://llvm.org/LICENSE.txt for license information.
+-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+-//
+-//===----------------------------------------------------------------------===//
+-
+-#ifndef LLD_MACHO_CONFIG_H
+-#define LLD_MACHO_CONFIG_H
+-
+-#include "llvm/ADT/DenseMap.h"
+-#include "llvm/ADT/StringRef.h"
+-#include "llvm/BinaryFormat/MachO.h"
+-#include "llvm/TextAPI/MachO/Architecture.h"
+-
+-#include <vector>
+-
+-namespace lld {
+-namespace macho {
+-
+-class Symbol;
+-struct SymbolPriorityEntry;
+-
+-struct Configuration {
+-  Symbol *entry;
+-  bool hasReexports = false;
+-  llvm::StringRef installName;
+-  llvm::StringRef outputFile;
+-  llvm::MachO::Architecture arch;
+-  llvm::MachO::HeaderFileType outputType;
+-  std::vector<llvm::StringRef> librarySearchPaths;
+-  // TODO: use the framework search paths
+-  std::vector<llvm::StringRef> frameworkSearchPaths;
+-  llvm::DenseMap<llvm::StringRef, SymbolPriorityEntry> priorities;
+-};
+-
+-// The symbol with the highest priority should be ordered first in the output
+-// section (modulo input section contiguity constraints). Using priority
+-// (highest first) instead of order (lowest first) has the convenient property
+-// that the default-constructed zero priority -- for symbols/sections without a
+-// user-defined order -- naturally ends up putting them at the end of the
+-// output.
+-struct SymbolPriorityEntry {
+-  // The priority given to a matching symbol, regardless of which object file
+-  // it originated from.
+-  size_t anyObjectFile = 0;
+-  // The priority given to a matching symbol from a particular object file.
+-  llvm::DenseMap<llvm::StringRef, size_t> objectFiles;
+-};
+-
+-extern Configuration *config;
+-
+-} // namespace macho
+-} // namespace lld
+-
+-#endif
+diff --git a/lld/MachO/Driver.cpp b/lld/MachO/Driver.cpp
+deleted file mode 100644
+index 2a3b0042162..00000000000
+--- a/lld/MachO/Driver.cpp
++++ /dev/null
+@@ -1,451 +0,0 @@
+-//===- Driver.cpp ---------------------------------------------------------===//
+-//
+-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+-// See https://llvm.org/LICENSE.txt for license information.
+-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+-//
+-//===----------------------------------------------------------------------===//
+-
+-#include "Driver.h"
+-#include "Config.h"
+-#include "InputFiles.h"
+-#include "OutputSection.h"
+-#include "OutputSegment.h"
+-#include "SymbolTable.h"
+-#include "Symbols.h"
+-#include "Target.h"
+-#include "Writer.h"
+-
+-#include "lld/Common/Args.h"
+-#include "lld/Common/Driver.h"
+-#include "lld/Common/ErrorHandler.h"
+-#include "lld/Common/LLVM.h"
+-#include "lld/Common/Memory.h"
+-#include "lld/Common/Version.h"
+-#include "llvm/ADT/DenseSet.h"
+-#include "llvm/ADT/StringExtras.h"
+-#include "llvm/ADT/StringRef.h"
+-#include "llvm/BinaryFormat/MachO.h"
+-#include "llvm/BinaryFormat/Magic.h"
+-#include "llvm/Object/Archive.h"
+-#include "llvm/Option/ArgList.h"
+-#include "llvm/Option/Option.h"
+-#include "llvm/Support/Host.h"
+-#include "llvm/Support/MemoryBuffer.h"
+-#include "llvm/Support/Path.h"
+-
+-using namespace llvm;
+-using namespace llvm::MachO;
+-using namespace llvm::sys;
+-using namespace llvm::opt;
+-using namespace lld;
+-using namespace lld::macho;
+-
+-Configuration *lld::macho::config;
+-
+-// Create prefix string literals used in Options.td
+-#define PREFIX(NAME, VALUE) const char *NAME[] = VALUE;
+-#include "Options.inc"
+-#undef PREFIX
+-
+-// Create table mapping all options defined in Options.td
+-static const opt::OptTable::Info optInfo[] = {
+-#define OPTION(X1, X2, ID, KIND, GROUP, ALIAS, X7, X8, X9, X10, X11, X12)      \
+-  {X1, X2, X10,         X11,         OPT_##ID, opt::Option::KIND##Class,       \
+-   X9, X8, OPT_##GROUP, OPT_##ALIAS, X7,       X12},
+-#include "Options.inc"
+-#undef OPTION
+-};
+-
+-MachOOptTable::MachOOptTable() : OptTable(optInfo) {}
+-
+-opt::InputArgList MachOOptTable::parse(ArrayRef<const char *> argv) {
+-  // Make InputArgList from string vectors.
+-  unsigned missingIndex;
+-  unsigned missingCount;
+-  SmallVector<const char *, 256> vec(argv.data(), argv.data() + argv.size());
+-
+-  opt::InputArgList args = ParseArgs(vec, missingIndex, missingCount);
+-
+-  if (missingCount)
+-    error(Twine(args.getArgString(missingIndex)) + ": missing argument");
+-
+-  for (opt::Arg *arg : args.filtered(OPT_UNKNOWN))
+-    error("unknown argument: " + arg->getSpelling());
+-  return args;
+-}
+-
+-void MachOOptTable::printHelp(const char *argv0, bool showHidden) const {
+-  PrintHelp(lld::outs(), (std::string(argv0) + " [options] file...").c_str(),
+-            "LLVM Linker", showHidden);
+-  lld::outs() << "\n";
+-}
+-
+-static Optional<std::string> findLibrary(StringRef name) {
+-  std::string stub = (llvm::Twine("lib") + name + ".tbd").str();
+-  std::string shared = (llvm::Twine("lib") + name + ".dylib").str();
+-  std::string archive = (llvm::Twine("lib") + name + ".a").str();
+-  llvm::SmallString<260> location;
+-
+-  for (StringRef dir : config->librarySearchPaths) {
+-    for (StringRef library : {stub, shared, archive}) {
+-      location = dir;
+-      llvm::sys::path::append(location, library);
+-      if (fs::exists(location))
+-        return location.str().str();
+-    }
+-  }
+-  return {};
+-}
+-
+-static TargetInfo *createTargetInfo(opt::InputArgList &args) {
+-  StringRef arch = args.getLastArgValue(OPT_arch, "x86_64");
+-  config->arch = llvm::MachO::getArchitectureFromName(
+-      args.getLastArgValue(OPT_arch, arch));
+-  switch (config->arch) {
+-  case llvm::MachO::AK_x86_64:
+-  case llvm::MachO::AK_x86_64h:
+-    return createX86_64TargetInfo();
+-  default:
+-    fatal("missing or unsupported -arch " + arch);
+-  }
+-}
+-
+-static bool isDirectory(StringRef option, StringRef path) {
+-  if (!fs::exists(path)) {
+-    warn("directory not found for option -" + option + path);
+-    return false;
+-  } else if (!fs::is_directory(path)) {
+-    warn("option -" + option + path + " references a non-directory path");
+-    return false;
+-  }
+-  return true;
+-}
+-
+-static void getSearchPaths(std::vector<StringRef> &paths, unsigned optionCode,
+-                           opt::InputArgList &args,
+-                           const SmallVector<StringRef, 2> &systemPaths) {
+-  StringRef optionLetter{(optionCode == OPT_F ? "F" : "L")};
+-  for (auto const &path : args::getStrings(args, optionCode)) {
+-    if (isDirectory(optionLetter, path))
+-      paths.push_back(path);
+-  }
+-  if (!args.hasArg(OPT_Z) && Triple(sys::getProcessTriple()).isOSDarwin()) {
+-    for (auto const &path : systemPaths) {
+-      if (isDirectory(optionLetter, path))
+-        paths.push_back(path);
+-    }
+-  }
+-}
+-
+-static void getLibrarySearchPaths(std::vector<StringRef> &paths,
+-                                  opt::InputArgList &args) {
+-  getSearchPaths(paths, OPT_L, args, {"/usr/lib", "/usr/local/lib"});
+-}
+-
+-static void getFrameworkSearchPaths(std::vector<StringRef> &paths,
+-                                    opt::InputArgList &args) {
+-  getSearchPaths(paths, OPT_F, args,
+-                 {"/Library/Frameworks", "/System/Library/Frameworks"});
+-}
+-
+-static void addFile(StringRef path) {
+-  Optional<MemoryBufferRef> buffer = readFile(path);
+-  if (!buffer)
+-    return;
+-  MemoryBufferRef mbref = *buffer;
+-
+-  switch (identify_magic(mbref.getBuffer())) {
+-  case file_magic::archive: {
+-    std::unique_ptr<object::Archive> file = CHECK(
+-        object::Archive::create(mbref), path + ": failed to parse archive");
+-
+-    if (!file->isEmpty() && !file->hasSymbolTable())
+-      error(path + ": archive has no index; run ranlib to add one");
+-
+-    inputFiles.push_back(make<ArchiveFile>(std::move(file)));
+-    break;
+-  }
+-  case file_magic::macho_object:
+-    inputFiles.push_back(make<ObjFile>(mbref));
+-    break;
+-  case file_magic::macho_dynamically_linked_shared_lib:
+-    inputFiles.push_back(make<DylibFile>(mbref));
+-    break;
+-  case file_magic::tapi_file: {
+-    llvm::Expected<std::unique_ptr<llvm::MachO::InterfaceFile>> result =
+-        TextAPIReader::get(mbref);
+-    if (!result)
+-      return;
+-
+-    inputFiles.push_back(make<DylibFile>(std::move(*result)));
+-    break;
+-  }
+-  default:
+-    error(path + ": unhandled file type");
+-  }
+-}
+-
+-static std::array<StringRef, 6> archNames{"arm",    "arm64", "i386",
+-                                          "x86_64", "ppc",   "ppc64"};
+-static bool isArchString(StringRef s) {
+-  static DenseSet<StringRef> archNamesSet(archNames.begin(), archNames.end());
+-  return archNamesSet.find(s) != archNamesSet.end();
+-}
+-
+-// An order file has one entry per line, in the following format:
+-//
+-//   <arch>:<object file>:<symbol name>
+-//
+-// <arch> and <object file> are optional. If not specified, then that entry
+-// matches any symbol of that name.
+-//
+-// If a symbol is matched by multiple entries, then it takes the lowest-ordered
+-// entry (the one nearest to the front of the list.)
+-//
+-// The file can also have line comments that start with '#'.
+-void parseOrderFile(StringRef path) {
+-  Optional<MemoryBufferRef> buffer = readFile(path);
+-  if (!buffer) {
+-    error("Could not read order file at " + path);
+-    return;
+-  }
+-
+-  MemoryBufferRef mbref = *buffer;
+-  size_t priority = std::numeric_limits<size_t>::max();
+-  for (StringRef rest : args::getLines(mbref)) {
+-    StringRef arch, objectFile, symbol;
+-
+-    std::array<StringRef, 3> fields;
+-    uint8_t fieldCount = 0;
+-    while (rest != "" && fieldCount < 3) {
+-      std::pair<StringRef, StringRef> p = getToken(rest, ": \t\n\v\f\r");
+-      StringRef tok = p.first;
+-      rest = p.second;
+-
+-      // Check if we have a comment
+-      if (tok == "" || tok[0] == '#')
+-        break;
+-
+-      fields[fieldCount++] = tok;
+-    }
+-
+-    switch (fieldCount) {
+-    case 3:
+-      arch = fields[0];
+-      objectFile = fields[1];
+-      symbol = fields[2];
+-      break;
+-    case 2:
+-      (isArchString(fields[0]) ? arch : objectFile) = fields[0];
+-      symbol = fields[1];
+-      break;
+-    case 1:
+-      symbol = fields[0];
+-      break;
+-    case 0:
+-      break;
+-    default:
+-      llvm_unreachable("too many fields in order file");
+-    }
+-
+-    if (!arch.empty()) {
+-      if (!isArchString(arch)) {
+-        error("invalid arch \"" + arch + "\" in order file: expected one of " +
+-              llvm::join(archNames, ", "));
+-        continue;
+-      }
+-
+-      // TODO: Update when we extend support for other archs
+-      if (arch != "x86_64")
+-        continue;
+-    }
+-
+-    if (!objectFile.empty() && !objectFile.endswith(".o")) {
+-      error("invalid object file name \"" + objectFile +
+-            "\" in order file: should end with .o");
+-      continue;
+-    }
+-
+-    if (!symbol.empty()) {
+-      SymbolPriorityEntry &entry = config->priorities[symbol];
+-      if (!objectFile.empty())
+-        entry.objectFiles.insert(std::make_pair(objectFile, priority));
+-      else
+-        entry.anyObjectFile = std::max(entry.anyObjectFile, priority);
+-    }
+-
+-    --priority;
+-  }
+-}
+-
+-// We expect sub-library names of the form "libfoo", which will match a dylib
+-// with a path of .*/libfoo.dylib.
+-static bool markSubLibrary(StringRef searchName) {
+-  for (InputFile *file : inputFiles) {
+-    if (auto *dylibFile = dyn_cast<DylibFile>(file)) {
+-      StringRef filename = path::filename(dylibFile->getName());
+-      if (filename.consume_front(searchName) && filename == ".dylib") {
+-        dylibFile->reexport = true;
+-        return true;
+-      }
+-    }
+-  }
+-  return false;
+-}
+-
+-static void handlePlatformVersion(const opt::Arg *arg) {
+-  // TODO: implementation coming very soon ...
+-}
+-
+-static void warnIfDeprecatedOption(const opt::Option &opt) {
+-  if (!opt.getGroup().isValid())
+-    return;
+-  if (opt.getGroup().getID() == OPT_grp_deprecated) {
+-    warn("Option `" + opt.getPrefixedName() + "' is deprecated in ld64:");
+-    warn(opt.getHelpText());
+-  }
+-}
+-
+-static void warnIfUnimplementedOption(const opt::Option &opt) {
+-  if (!opt.getGroup().isValid())
+-    return;
+-  switch (opt.getGroup().getID()) {
+-  case OPT_grp_deprecated:
+-    // warn about deprecated options elsewhere
+-    break;
+-  case OPT_grp_undocumented:
+-    warn("Option `" + opt.getPrefixedName() +
+-         "' is undocumented. Should lld implement it?");
+-    break;
+-  case OPT_grp_obsolete:
+-    warn("Option `" + opt.getPrefixedName() +
+-         "' is obsolete. Please modernize your usage.");
+-    break;
+-  case OPT_grp_ignored:
+-    warn("Option `" + opt.getPrefixedName() + "' is ignored.");
+-    break;
+-  default:
+-    warn("Option `" + opt.getPrefixedName() +
+-         "' is not yet implemented. Stay tuned...");
+-    break;
+-  }
+-}
+-
+-bool macho::link(llvm::ArrayRef<const char *> argsArr, bool canExitEarly,
+-                 raw_ostream &stdoutOS, raw_ostream &stderrOS) {
+-  lld::stdoutOS = &stdoutOS;
+-  lld::stderrOS = &stderrOS;
+-
+-  stderrOS.enable_colors(stderrOS.has_colors());
+-  // TODO: Set up error handler properly, e.g. the errorLimitExceededMsg
+-
+-  MachOOptTable parser;
+-  opt::InputArgList args = parser.parse(argsArr.slice(1));
+-
+-  if (args.hasArg(OPT_help_hidden)) {
+-    parser.printHelp(argsArr[0], /*showHidden=*/true);
+-    return true;
+-  } else if (args.hasArg(OPT_help)) {
+-    parser.printHelp(argsArr[0], /*showHidden=*/false);
+-    return true;
+-  }
+-
+-  config = make<Configuration>();
+-  symtab = make<SymbolTable>();
+-  target = createTargetInfo(args);
+-
+-  config->entry = symtab->addUndefined(args.getLastArgValue(OPT_e, "_main"));
+-  config->outputFile = args.getLastArgValue(OPT_o, "a.out");
+-  config->installName =
+-      args.getLastArgValue(OPT_install_name, config->outputFile);
+-  getLibrarySearchPaths(config->librarySearchPaths, args);
+-  getFrameworkSearchPaths(config->frameworkSearchPaths, args);
+-  config->outputType = args.hasArg(OPT_dylib) ? MH_DYLIB : MH_EXECUTE;
+-
+-  if (args.hasArg(OPT_v)) {
+-    message(getLLDVersion());
+-    message(StringRef("Library search paths:") +
+-            (config->librarySearchPaths.size()
+-                 ? "\n\t" + llvm::join(config->librarySearchPaths, "\n\t")
+-                 : ""));
+-    message(StringRef("Framework search paths:") +
+-            (config->frameworkSearchPaths.size()
+-                 ? "\n\t" + llvm::join(config->frameworkSearchPaths, "\n\t")
+-                 : ""));
+-    freeArena();
+-    return !errorCount();
+-  }
+-
+-  for (const auto &arg : args) {
+-    const auto &opt = arg->getOption();
+-    warnIfDeprecatedOption(opt);
+-    switch (arg->getOption().getID()) {
+-    case OPT_INPUT:
+-      addFile(arg->getValue());
+-      break;
+-    case OPT_l: {
+-      StringRef name = arg->getValue();
+-      if (Optional<std::string> path = findLibrary(name)) {
+-        addFile(*path);
+-        break;
+-      }
+-      error("library not found for -l" + name);
+-      break;
+-    }
+-    case OPT_platform_version:
+-      handlePlatformVersion(arg);
+-      break;
+-    case OPT_o:
+-    case OPT_dylib:
+-    case OPT_e:
+-    case OPT_L:
+-    case OPT_Z:
+-    case OPT_arch:
+-      // handled elsewhere
+-      break;
+-    default:
+-      warnIfUnimplementedOption(opt);
+-      break;
+-    }
+-  }
+-
+-  // Now that all dylibs have been loaded, search for those that should be
+-  // re-exported.
+-  for (opt::Arg *arg : args.filtered(OPT_sub_library)) {
+-    config->hasReexports = true;
+-    StringRef searchName = arg->getValue();
+-    if (!markSubLibrary(searchName))
+-      error("-sub_library " + searchName + " does not match a supplied dylib");
+-  }
+-
+-  StringRef orderFile = args.getLastArgValue(OPT_order_file);
+-  if (!orderFile.empty())
+-    parseOrderFile(orderFile);
+-
+-  if (config->outputType == MH_EXECUTE && !isa<Defined>(config->entry)) {
+-    error("undefined symbol: " + config->entry->getName());
+-    return false;
+-  }
+-
+-  createSyntheticSections();
+-
+-  // Initialize InputSections.
+-  for (InputFile *file : inputFiles) {
+-    for (SubsectionMap &map : file->subsections) {
+-      for (auto &p : map) {
+-        InputSection *isec = p.second;
+-        inputSections.push_back(isec);
+-      }
+-    }
+-  }
+-
+-  // Write to an output file.
+-  writeResult();
+-
+-  if (canExitEarly)
+-    exitLld(errorCount() ? 1 : 0);
+-
+-  freeArena();
+-  return !errorCount();
+-}
+diff --git a/lld/MachO/Driver.h b/lld/MachO/Driver.h
+deleted file mode 100644
+index 2233740d1db..00000000000
+--- a/lld/MachO/Driver.h
++++ /dev/null
+@@ -1,36 +0,0 @@
+-//===- Driver.h -------------------------------------------------*- C++ -*-===//
+-//
+-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+-// See https://llvm.org/LICENSE.txt for license information.
+-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+-//
+-//===----------------------------------------------------------------------===//
+-
+-#ifndef LLD_MACHO_DRIVER_H
+-#define LLD_MACHO_DRIVER_H
+-
+-#include "lld/Common/LLVM.h"
+-#include "llvm/Option/OptTable.h"
+-
+-namespace lld {
+-namespace macho {
+-
+-class MachOOptTable : public llvm::opt::OptTable {
+-public:
+-  MachOOptTable();
+-  llvm::opt::InputArgList parse(ArrayRef<const char *> argv);
+-  void printHelp(const char *argv0, bool showHidden) const;
+-};
+-
+-// Create enum with OPT_xxx values for each option in Options.td
+-enum {
+-  OPT_INVALID = 0,
+-#define OPTION(_1, _2, ID, _4, _5, _6, _7, _8, _9, _10, _11, _12) OPT_##ID,
+-#include "Options.inc"
+-#undef OPTION
+-};
+-
+-} // namespace macho
+-} // namespace lld
+-
+-#endif
+diff --git a/lld/MachO/ExportTrie.cpp b/lld/MachO/ExportTrie.cpp
+deleted file mode 100644
+index 7cc81bcfd5f..00000000000
+--- a/lld/MachO/ExportTrie.cpp
++++ /dev/null
+@@ -1,283 +0,0 @@
+-//===- ExportTrie.cpp -----------------------------------------------------===//
+-//
+-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+-// See https://llvm.org/LICENSE.txt for license information.
+-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+-//
+-//===----------------------------------------------------------------------===//
+-//
+-// This is a partial implementation of the Mach-O export trie format. It's
+-// essentially a symbol table encoded as a compressed prefix trie, meaning that
+-// the common prefixes of each symbol name are shared for a more compact
+-// representation. The prefixes are stored on the edges of the trie, and one
+-// edge can represent multiple characters. For example, given two exported
+-// symbols _bar and _baz, we will have a trie like this (terminal nodes are
+-// marked with an asterisk):
+-//
+-//              +-+-+
+-//              |   | // root node
+-//              +-+-+
+-//                |
+-//                | _ba
+-//                |
+-//              +-+-+
+-//              |   |
+-//              +-+-+
+-//           r /     \ z
+-//            /       \
+-//        +-+-+       +-+-+
+-//        | * |       | * |
+-//        +-+-+       +-+-+
+-//
+-// More documentation of the format can be found in
+-// llvm/tools/obj2yaml/macho2yaml.cpp.
+-//
+-//===----------------------------------------------------------------------===//
+-
+-#include "ExportTrie.h"
+-#include "Symbols.h"
+-
+-#include "lld/Common/ErrorHandler.h"
+-#include "lld/Common/Memory.h"
+-#include "llvm/ADT/Optional.h"
+-#include "llvm/BinaryFormat/MachO.h"
+-#include "llvm/Support/LEB128.h"
+-
+-using namespace llvm;
+-using namespace llvm::MachO;
+-using namespace lld;
+-using namespace lld::macho;
+-
+-namespace {
+-
+-struct Edge {
+-  Edge(StringRef s, TrieNode *node) : substring(s), child(node) {}
+-
+-  StringRef substring;
+-  struct TrieNode *child;
+-};
+-
+-struct ExportInfo {
+-  uint64_t address;
+-  // TODO: Add proper support for re-exports & stub-and-resolver flags.
+-};
+-
+-} // namespace
+-
+-struct macho::TrieNode {
+-  std::vector<Edge> edges;
+-  Optional<ExportInfo> info;
+-  // Estimated offset from the start of the serialized trie to the current node.
+-  // This will converge to the true offset when updateOffset() is run to a
+-  // fixpoint.
+-  size_t offset = 0;
+-
+-  // Returns whether the new estimated offset differs from the old one.
+-  bool updateOffset(size_t &nextOffset);
+-  void writeTo(uint8_t *buf) const;
+-};
+-
+-bool TrieNode::updateOffset(size_t &nextOffset) {
+-  // Size of the whole node (including the terminalSize and the outgoing edges.)
+-  // In contrast, terminalSize only records the size of the other data in the
+-  // node.
+-  size_t nodeSize;
+-  if (info) {
+-    uint64_t flags = 0;
+-    uint32_t terminalSize =
+-        getULEB128Size(flags) + getULEB128Size(info->address);
+-    // Overall node size so far is the uleb128 size of the length of the symbol
+-    // info + the symbol info itself.
+-    nodeSize = terminalSize + getULEB128Size(terminalSize);
+-  } else {
+-    nodeSize = 1; // Size of terminalSize (which has a value of 0)
+-  }
+-  // Compute size of all child edges.
+-  ++nodeSize; // Byte for number of children.
+-  for (Edge &edge : edges) {
+-    nodeSize += edge.substring.size() + 1             // String length.
+-                + getULEB128Size(edge.child->offset); // Offset len.
+-  }
+-  // On input, 'nextOffset' is the new preferred location for this node.
+-  bool result = (offset != nextOffset);
+-  // Store new location in node object for use by parents.
+-  offset = nextOffset;
+-  nextOffset += nodeSize;
+-  return result;
+-}
+-
+-void TrieNode::writeTo(uint8_t *buf) const {
+-  buf += offset;
+-  if (info) {
+-    // TrieNodes with Symbol info: size, flags address
+-    uint64_t flags = 0; // TODO: emit proper flags
+-    uint32_t terminalSize =
+-        getULEB128Size(flags) + getULEB128Size(info->address);
+-    buf += encodeULEB128(terminalSize, buf);
+-    buf += encodeULEB128(flags, buf);
+-    buf += encodeULEB128(info->address, buf);
+-  } else {
+-    // TrieNode with no Symbol info.
+-    *buf++ = 0; // terminalSize
+-  }
+-  // Add number of children. TODO: Handle case where we have more than 256.
+-  assert(edges.size() < 256);
+-  *buf++ = edges.size();
+-  // Append each child edge substring and node offset.
+-  for (const Edge &edge : edges) {
+-    memcpy(buf, edge.substring.data(), edge.substring.size());
+-    buf += edge.substring.size();
+-    *buf++ = '\0';
+-    buf += encodeULEB128(edge.child->offset, buf);
+-  }
+-}
+-
+-TrieNode *TrieBuilder::makeNode() {
+-  auto *node = make<TrieNode>();
+-  nodes.emplace_back(node);
+-  return node;
+-}
+-
+-static int charAt(const Symbol *sym, size_t pos) {
+-  StringRef str = sym->getName();
+-  if (pos >= str.size())
+-    return -1;
+-  return str[pos];
+-}
+-
+-// Build the trie by performing a three-way radix quicksort: We start by sorting
+-// the strings by their first characters, then sort the strings with the same
+-// first characters by their second characters, and so on recursively. Each
+-// time the prefixes diverge, we add a node to the trie.
+-//
+-// node:    The most recently created node along this path in the trie (i.e.
+-//          the furthest from the root.)
+-// lastPos: The prefix length of the most recently created node, i.e. the number
+-//          of characters along its path from the root.
+-// pos:     The string index we are currently sorting on. Note that each symbol
+-//          S contained in vec has the same prefix S[0...pos).
+-void TrieBuilder::sortAndBuild(MutableArrayRef<const Symbol *> vec,
+-                               TrieNode *node, size_t lastPos, size_t pos) {
+-tailcall:
+-  if (vec.empty())
+-    return;
+-
+-  // Partition items so that items in [0, i) are less than the pivot,
+-  // [i, j) are the same as the pivot, and [j, vec.size()) are greater than
+-  // the pivot.
+-  const Symbol *pivotSymbol = vec[vec.size() / 2];
+-  int pivot = charAt(pivotSymbol, pos);
+-  size_t i = 0;
+-  size_t j = vec.size();
+-  for (size_t k = 0; k < j;) {
+-    int c = charAt(vec[k], pos);
+-    if (c < pivot)
+-      std::swap(vec[i++], vec[k++]);
+-    else if (c > pivot)
+-      std::swap(vec[--j], vec[k]);
+-    else
+-      k++;
+-  }
+-
+-  bool isTerminal = pivot == -1;
+-  bool prefixesDiverge = i != 0 || j != vec.size();
+-  if (lastPos != pos && (isTerminal || prefixesDiverge)) {
+-    TrieNode *newNode = makeNode();
+-    node->edges.emplace_back(pivotSymbol->getName().slice(lastPos, pos),
+-                             newNode);
+-    node = newNode;
+-    lastPos = pos;
+-  }
+-
+-  sortAndBuild(vec.slice(0, i), node, lastPos, pos);
+-  sortAndBuild(vec.slice(j), node, lastPos, pos);
+-
+-  if (isTerminal) {
+-    assert(j - i == 1); // no duplicate symbols
+-    node->info = {pivotSymbol->getVA()};
+-  } else {
+-    // This is the tail-call-optimized version of the following:
+-    // sortAndBuild(vec.slice(i, j - i), node, lastPos, pos + 1);
+-    vec = vec.slice(i, j - i);
+-    ++pos;
+-    goto tailcall;
+-  }
+-}
+-
+-size_t TrieBuilder::build() {
+-  if (exported.empty())
+-    return 0;
+-
+-  TrieNode *root = makeNode();
+-  sortAndBuild(exported, root, 0, 0);
+-
+-  // Assign each node in the vector an offset in the trie stream, iterating
+-  // until all uleb128 sizes have stabilized.
+-  size_t offset;
+-  bool more;
+-  do {
+-    offset = 0;
+-    more = false;
+-    for (TrieNode *node : nodes)
+-      more |= node->updateOffset(offset);
+-  } while (more);
+-
+-  return offset;
+-}
+-
+-void TrieBuilder::writeTo(uint8_t *buf) const {
+-  for (TrieNode *node : nodes)
+-    node->writeTo(buf);
+-}
+-
+-namespace {
+-
+-// Parse a serialized trie and invoke a callback for each entry.
+-class TrieParser {
+-public:
+-  TrieParser(const uint8_t *buf, size_t size, const TrieEntryCallback &callback)
+-      : start(buf), end(start + size), callback(callback) {}
+-
+-  void parse(const uint8_t *buf, const Twine &cumulativeString);
+-
+-  void parse() { parse(start, ""); }
+-
+-  const uint8_t *start;
+-  const uint8_t *end;
+-  const TrieEntryCallback &callback;
+-};
+-
+-} // namespace
+-
+-void TrieParser::parse(const uint8_t *buf, const Twine &cumulativeString) {
+-  if (buf >= end)
+-    fatal("Node offset points outside export section");
+-
+-  unsigned ulebSize;
+-  uint64_t terminalSize = decodeULEB128(buf, &ulebSize);
+-  buf += ulebSize;
+-  uint64_t flags = 0;
+-  size_t offset;
+-  if (terminalSize != 0) {
+-    flags = decodeULEB128(buf, &ulebSize);
+-    callback(cumulativeString, flags);
+-  }
+-  buf += terminalSize;
+-  uint8_t numEdges = *buf++;
+-  for (uint8_t i = 0; i < numEdges; ++i) {
+-    const char *cbuf = reinterpret_cast<const char *>(buf);
+-    StringRef substring = StringRef(cbuf, strnlen(cbuf, end - buf));
+-    buf += substring.size() + 1;
+-    offset = decodeULEB128(buf, &ulebSize);
+-    buf += ulebSize;
+-    parse(start + offset, cumulativeString + substring);
+-  }
+-}
+-
+-void macho::parseTrie(const uint8_t *buf, size_t size,
+-                      const TrieEntryCallback &callback) {
+-  if (size == 0)
+-    return;
+-
+-  TrieParser(buf, size, callback).parse();
+-}
+diff --git a/lld/MachO/ExportTrie.h b/lld/MachO/ExportTrie.h
+deleted file mode 100644
+index 2bd8c33db9a..00000000000
+--- a/lld/MachO/ExportTrie.h
++++ /dev/null
+@@ -1,47 +0,0 @@
+-//===- ExportTrie.h ---------------------------------------------*- C++ -*-===//
+-//
+-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+-// See https://llvm.org/LICENSE.txt for license information.
+-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+-//
+-//===----------------------------------------------------------------------===//
+-
+-#ifndef LLD_MACHO_EXPORT_TRIE_H
+-#define LLD_MACHO_EXPORT_TRIE_H
+-
+-#include "llvm/ADT/ArrayRef.h"
+-#include "llvm/ADT/STLExtras.h"
+-
+-#include <vector>
+-
+-namespace lld {
+-namespace macho {
+-
+-struct TrieNode;
+-class Symbol;
+-
+-class TrieBuilder {
+-public:
+-  void addSymbol(const Symbol &sym) { exported.push_back(&sym); }
+-  // Returns the size in bytes of the serialized trie.
+-  size_t build();
+-  void writeTo(uint8_t *buf) const;
+-
+-private:
+-  TrieNode *makeNode();
+-  void sortAndBuild(llvm::MutableArrayRef<const Symbol *> vec, TrieNode *node,
+-                    size_t lastPos, size_t pos);
+-
+-  std::vector<const Symbol *> exported;
+-  std::vector<TrieNode *> nodes;
+-};
+-
+-using TrieEntryCallback =
+-    llvm::function_ref<void(const llvm::Twine & /*name*/, uint64_t /*flags*/)>;
+-
+-void parseTrie(const uint8_t *buf, size_t size, const TrieEntryCallback &);
+-
+-} // namespace macho
+-} // namespace lld
+-
+-#endif
+diff --git a/lld/MachO/InputFiles.cpp b/lld/MachO/InputFiles.cpp
+deleted file mode 100644
+index 46fe82f9882..00000000000
+--- a/lld/MachO/InputFiles.cpp
++++ /dev/null
+@@ -1,433 +0,0 @@
+-//===- InputFiles.cpp -----------------------------------------------------===//
+-//
+-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+-// See https://llvm.org/LICENSE.txt for license information.
+-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+-//
+-//===----------------------------------------------------------------------===//
+-//
+-// This file contains functions to parse Mach-O object files. In this comment,
+-// we describe the Mach-O file structure and how we parse it.
+-//
+-// Mach-O is not very different from ELF or COFF. The notion of symbols,
+-// sections and relocations exists in Mach-O as it does in ELF and COFF.
+-//
+-// Perhaps the notion that is new to those who know ELF/COFF is "subsections".
+-// In ELF/COFF, sections are an atomic unit of data copied from input files to
+-// output files. When we merge or garbage-collect sections, we treat each
+-// section as an atomic unit. In Mach-O, that's not the case. Sections can
+-// consist of multiple subsections, and subsections are a unit of merging and
+-// garbage-collecting. Therefore, Mach-O's subsections are more similar to
+-// ELF/COFF's sections than Mach-O's sections are.
+-//
+-// A section can have multiple symbols. A symbol that does not have the
+-// N_ALT_ENTRY attribute indicates a beginning of a subsection. Therefore, by
+-// definition, a symbol is always present at the beginning of each subsection. A
+-// symbol with N_ALT_ENTRY attribute does not start a new subsection and can
+-// point to a middle of a subsection.
+-//
+-// The notion of subsections also affects how relocations are represented in
+-// Mach-O. All references within a section need to be explicitly represented as
+-// relocations if they refer to different subsections, because we obviously need
+-// to fix up addresses if subsections are laid out in an output file differently
+-// than they were in object files. To represent that, Mach-O relocations can
+-// refer to an unnamed location via its address. Scattered relocations (those
+-// with the R_SCATTERED bit set) always refer to unnamed locations.
+-// Non-scattered relocations refer to an unnamed location if r_extern is not set
+-// and r_symbolnum is zero.
+-//
+-// Without the above differences, I think you can use your knowledge about ELF
+-// and COFF for Mach-O.
+-//
+-//===----------------------------------------------------------------------===//
+-
+-#include "InputFiles.h"
+-#include "Config.h"
+-#include "ExportTrie.h"
+-#include "InputSection.h"
+-#include "MachOStructs.h"
+-#include "OutputSection.h"
+-#include "SymbolTable.h"
+-#include "Symbols.h"
+-#include "Target.h"
+-
+-#include "lld/Common/ErrorHandler.h"
+-#include "lld/Common/Memory.h"
+-#include "llvm/BinaryFormat/MachO.h"
+-#include "llvm/Support/Endian.h"
+-#include "llvm/Support/MemoryBuffer.h"
+-#include "llvm/Support/Path.h"
+-
+-using namespace llvm;
+-using namespace llvm::MachO;
+-using namespace llvm::support::endian;
+-using namespace llvm::sys;
+-using namespace lld;
+-using namespace lld::macho;
+-
+-std::vector<InputFile *> macho::inputFiles;
+-
+-// Open a given file path and return it as a memory-mapped file.
+-Optional<MemoryBufferRef> macho::readFile(StringRef path) {
+-  // Open a file.
+-  auto mbOrErr = MemoryBuffer::getFile(path);
+-  if (auto ec = mbOrErr.getError()) {
+-    error("cannot open " + path + ": " + ec.message());
+-    return None;
+-  }
+-
+-  std::unique_ptr<MemoryBuffer> &mb = *mbOrErr;
+-  MemoryBufferRef mbref = mb->getMemBufferRef();
+-  make<std::unique_ptr<MemoryBuffer>>(std::move(mb)); // take mb ownership
+-
+-  // If this is a regular non-fat file, return it.
+-  const char *buf = mbref.getBufferStart();
+-  auto *hdr = reinterpret_cast<const MachO::fat_header *>(buf);
+-  if (read32be(&hdr->magic) != MachO::FAT_MAGIC)
+-    return mbref;
+-
+-  // Object files and archive files may be fat files, which contains
+-  // multiple real files for different CPU ISAs. Here, we search for a
+-  // file that matches with the current link target and returns it as
+-  // a MemoryBufferRef.
+-  auto *arch = reinterpret_cast<const MachO::fat_arch *>(buf + sizeof(*hdr));
+-
+-  for (uint32_t i = 0, n = read32be(&hdr->nfat_arch); i < n; ++i) {
+-    if (reinterpret_cast<const char *>(arch + i + 1) >
+-        buf + mbref.getBufferSize()) {
+-      error(path + ": fat_arch struct extends beyond end of file");
+-      return None;
+-    }
+-
+-    if (read32be(&arch[i].cputype) != target->cpuType ||
+-        read32be(&arch[i].cpusubtype) != target->cpuSubtype)
+-      continue;
+-
+-    uint32_t offset = read32be(&arch[i].offset);
+-    uint32_t size = read32be(&arch[i].size);
+-    if (offset + size > mbref.getBufferSize())
+-      error(path + ": slice extends beyond end of file");
+-    return MemoryBufferRef(StringRef(buf + offset, size), path.copy(bAlloc));
+-  }
+-
+-  error("unable to find matching architecture in " + path);
+-  return None;
+-}
+-
+-static const load_command *findCommand(const mach_header_64 *hdr,
+-                                       uint32_t type) {
+-  const uint8_t *p =
+-      reinterpret_cast<const uint8_t *>(hdr) + sizeof(mach_header_64);
+-
+-  for (uint32_t i = 0, n = hdr->ncmds; i < n; ++i) {
+-    auto *cmd = reinterpret_cast<const load_command *>(p);
+-    if (cmd->cmd == type)
+-      return cmd;
+-    p += cmd->cmdsize;
+-  }
+-  return nullptr;
+-}
+-
+-void InputFile::parseSections(ArrayRef<section_64> sections) {
+-  subsections.reserve(sections.size());
+-  auto *buf = reinterpret_cast<const uint8_t *>(mb.getBufferStart());
+-
+-  for (const section_64 &sec : sections) {
+-    InputSection *isec = make<InputSection>();
+-    isec->file = this;
+-    isec->name = StringRef(sec.sectname, strnlen(sec.sectname, 16));
+-    isec->segname = StringRef(sec.segname, strnlen(sec.segname, 16));
+-    isec->data = {isZeroFill(sec.flags) ? nullptr : buf + sec.offset,
+-                  static_cast<size_t>(sec.size)};
+-    if (sec.align >= 32)
+-      error("alignment " + std::to_string(sec.align) + " of section " +
+-            isec->name + " is too large");
+-    else
+-      isec->align = 1 << sec.align;
+-    isec->flags = sec.flags;
+-    subsections.push_back({{0, isec}});
+-  }
+-}
+-
+-// Find the subsection corresponding to the greatest section offset that is <=
+-// that of the given offset.
+-//
+-// offset: an offset relative to the start of the original InputSection (before
+-// any subsection splitting has occurred). It will be updated to represent the
+-// same location as an offset relative to the start of the containing
+-// subsection.
+-static InputSection *findContainingSubsection(SubsectionMap &map,
+-                                              uint32_t *offset) {
+-  auto it = std::prev(map.upper_bound(*offset));
+-  *offset -= it->first;
+-  return it->second;
+-}
+-
+-void InputFile::parseRelocations(const section_64 &sec,
+-                                 SubsectionMap &subsecMap) {
+-  auto *buf = reinterpret_cast<const uint8_t *>(mb.getBufferStart());
+-  ArrayRef<any_relocation_info> relInfos(
+-      reinterpret_cast<const any_relocation_info *>(buf + sec.reloff),
+-      sec.nreloc);
+-
+-  for (const any_relocation_info &anyRel : relInfos) {
+-    if (anyRel.r_word0 & R_SCATTERED)
+-      fatal("TODO: Scattered relocations not supported");
+-
+-    auto rel = reinterpret_cast<const relocation_info &>(anyRel);
+-
+-    Reloc r;
+-    r.type = rel.r_type;
+-    r.pcrel = rel.r_pcrel;
+-    r.length = rel.r_length;
+-    uint64_t rawAddend = target->getImplicitAddend(mb, sec, rel);
+-
+-    if (rel.r_extern) {
+-      r.target = symbols[rel.r_symbolnum];
+-      r.addend = rawAddend;
+-    } else {
+-      if (rel.r_symbolnum == 0 || rel.r_symbolnum > subsections.size())
+-        fatal("invalid section index in relocation for offset " +
+-              std::to_string(r.offset) + " in section " + sec.sectname +
+-              " of " + getName());
+-
+-      SubsectionMap &targetSubsecMap = subsections[rel.r_symbolnum - 1];
+-      const section_64 &targetSec = sectionHeaders[rel.r_symbolnum - 1];
+-      uint32_t targetOffset;
+-      if (rel.r_pcrel) {
+-        // The implicit addend for pcrel section relocations is the pcrel offset
+-        // in terms of the addresses in the input file. Here we adjust it so
+-        // that it describes the offset from the start of the target section.
+-        // TODO: The offset of 4 is probably not right for ARM64, nor for
+-        //       relocations with r_length != 2.
+-        targetOffset =
+-            sec.addr + rel.r_address + 4 + rawAddend - targetSec.addr;
+-      } else {
+-        // The addend for a non-pcrel relocation is its absolute address.
+-        targetOffset = rawAddend - targetSec.addr;
+-      }
+-      r.target = findContainingSubsection(targetSubsecMap, &targetOffset);
+-      r.addend = targetOffset;
+-    }
+-
+-    r.offset = rel.r_address;
+-    InputSection *subsec = findContainingSubsection(subsecMap, &r.offset);
+-    subsec->relocs.push_back(r);
+-  }
+-}
+-
+-void InputFile::parseSymbols(ArrayRef<structs::nlist_64> nList,
+-                             const char *strtab, bool subsectionsViaSymbols) {
+-  // resize(), not reserve(), because we are going to create N_ALT_ENTRY symbols
+-  // out-of-sequence.
+-  symbols.resize(nList.size());
+-  std::vector<size_t> altEntrySymIdxs;
+-
+-  auto createDefined = [&](const structs::nlist_64 &sym, InputSection *isec,
+-                           uint32_t value) -> Symbol * {
+-    StringRef name = strtab + sym.n_strx;
+-    if (sym.n_type & N_EXT)
+-      // Global defined symbol
+-      return symtab->addDefined(name, isec, value);
+-    else
+-      // Local defined symbol
+-      return make<Defined>(name, isec, value);
+-  };
+-
+-  for (size_t i = 0, n = nList.size(); i < n; ++i) {
+-    const structs::nlist_64 &sym = nList[i];
+-
+-    // Undefined symbol
+-    if (!sym.n_sect) {
+-      StringRef name = strtab + sym.n_strx;
+-      symbols[i] = symtab->addUndefined(name);
+-      continue;
+-    }
+-
+-    const section_64 &sec = sectionHeaders[sym.n_sect - 1];
+-    SubsectionMap &subsecMap = subsections[sym.n_sect - 1];
+-    uint64_t offset = sym.n_value - sec.addr;
+-
+-    // If the input file does not use subsections-via-symbols, all symbols can
+-    // use the same subsection. Otherwise, we must split the sections along
+-    // symbol boundaries.
+-    if (!subsectionsViaSymbols) {
+-      symbols[i] = createDefined(sym, subsecMap[0], offset);
+-      continue;
+-    }
+-
+-    // nList entries aren't necessarily arranged in address order. Therefore,
+-    // we can't create alt-entry symbols at this point because a later symbol
+-    // may split its section, which may affect which subsection the alt-entry
+-    // symbol is assigned to. So we need to handle them in a second pass below.
+-    if (sym.n_desc & N_ALT_ENTRY) {
+-      altEntrySymIdxs.push_back(i);
+-      continue;
+-    }
+-
+-    // Find the subsection corresponding to the greatest section offset that is
+-    // <= that of the current symbol. The subsection that we find either needs
+-    // to be used directly or split in two.
+-    uint32_t firstSize = offset;
+-    InputSection *firstIsec = findContainingSubsection(subsecMap, &firstSize);
+-
+-    if (firstSize == 0) {
+-      // Alias of an existing symbol, or the first symbol in the section. These
+-      // are handled by reusing the existing section.
+-      symbols[i] = createDefined(sym, firstIsec, 0);
+-      continue;
+-    }
+-
+-    // We saw a symbol definition at a new offset. Split the section into two
+-    // subsections. The new symbol uses the second subsection.
+-    auto *secondIsec = make<InputSection>(*firstIsec);
+-    secondIsec->data = firstIsec->data.slice(firstSize);
+-    firstIsec->data = firstIsec->data.slice(0, firstSize);
+-    // TODO: ld64 appears to preserve the original alignment as well as each
+-    // subsection's offset from the last aligned address. We should consider
+-    // emulating that behavior.
+-    secondIsec->align = MinAlign(firstIsec->align, offset);
+-
+-    subsecMap[offset] = secondIsec;
+-    // By construction, the symbol will be at offset zero in the new section.
+-    symbols[i] = createDefined(sym, secondIsec, 0);
+-  }
+-
+-  for (size_t idx : altEntrySymIdxs) {
+-    const structs::nlist_64 &sym = nList[idx];
+-    SubsectionMap &subsecMap = subsections[sym.n_sect - 1];
+-    uint32_t off = sym.n_value - sectionHeaders[sym.n_sect - 1].addr;
+-    InputSection *subsec = findContainingSubsection(subsecMap, &off);
+-    symbols[idx] = createDefined(sym, subsec, off);
+-  }
+-}
+-
+-ObjFile::ObjFile(MemoryBufferRef mb) : InputFile(ObjKind, mb) {
+-  auto *buf = reinterpret_cast<const uint8_t *>(mb.getBufferStart());
+-  auto *hdr = reinterpret_cast<const mach_header_64 *>(mb.getBufferStart());
+-
+-  if (const load_command *cmd = findCommand(hdr, LC_SEGMENT_64)) {
+-    auto *c = reinterpret_cast<const segment_command_64 *>(cmd);
+-    sectionHeaders = ArrayRef<section_64>{
+-        reinterpret_cast<const section_64 *>(c + 1), c->nsects};
+-    parseSections(sectionHeaders);
+-  }
+-
+-  // TODO: Error on missing LC_SYMTAB?
+-  if (const load_command *cmd = findCommand(hdr, LC_SYMTAB)) {
+-    auto *c = reinterpret_cast<const symtab_command *>(cmd);
+-    ArrayRef<structs::nlist_64> nList(
+-        reinterpret_cast<const structs::nlist_64 *>(buf + c->symoff), c->nsyms);
+-    const char *strtab = reinterpret_cast<const char *>(buf) + c->stroff;
+-    bool subsectionsViaSymbols = hdr->flags & MH_SUBSECTIONS_VIA_SYMBOLS;
+-    parseSymbols(nList, strtab, subsectionsViaSymbols);
+-  }
+-
+-  // The relocations may refer to the symbols, so we parse them after we have
+-  // parsed all the symbols.
+-  for (size_t i = 0, n = subsections.size(); i < n; ++i)
+-    parseRelocations(sectionHeaders[i], subsections[i]);
+-}
+-
+-DylibFile::DylibFile(MemoryBufferRef mb, DylibFile *umbrella)
+-    : InputFile(DylibKind, mb) {
+-  if (umbrella == nullptr)
+-    umbrella = this;
+-
+-  auto *buf = reinterpret_cast<const uint8_t *>(mb.getBufferStart());
+-  auto *hdr = reinterpret_cast<const mach_header_64 *>(mb.getBufferStart());
+-
+-  // Initialize dylibName.
+-  if (const load_command *cmd = findCommand(hdr, LC_ID_DYLIB)) {
+-    auto *c = reinterpret_cast<const dylib_command *>(cmd);
+-    dylibName = reinterpret_cast<const char *>(cmd) + read32le(&c->dylib.name);
+-  } else {
+-    error("dylib " + getName() + " missing LC_ID_DYLIB load command");
+-    return;
+-  }
+-
+-  // Initialize symbols.
+-  if (const load_command *cmd = findCommand(hdr, LC_DYLD_INFO_ONLY)) {
+-    auto *c = reinterpret_cast<const dyld_info_command *>(cmd);
+-    parseTrie(buf + c->export_off, c->export_size,
+-              [&](const Twine &name, uint64_t flags) {
+-                symbols.push_back(symtab->addDylib(saver.save(name), umbrella));
+-              });
+-  } else {
+-    error("LC_DYLD_INFO_ONLY not found in " + getName());
+-    return;
+-  }
+-
+-  if (hdr->flags & MH_NO_REEXPORTED_DYLIBS)
+-    return;
+-
+-  const uint8_t *p =
+-      reinterpret_cast<const uint8_t *>(hdr) + sizeof(mach_header_64);
+-  for (uint32_t i = 0, n = hdr->ncmds; i < n; ++i) {
+-    auto *cmd = reinterpret_cast<const load_command *>(p);
+-    p += cmd->cmdsize;
+-    if (cmd->cmd != LC_REEXPORT_DYLIB)
+-      continue;
+-
+-    auto *c = reinterpret_cast<const dylib_command *>(cmd);
+-    StringRef reexportPath =
+-        reinterpret_cast<const char *>(c) + read32le(&c->dylib.name);
+-    // TODO: Expand @loader_path, @executable_path etc in reexportPath
+-    Optional<MemoryBufferRef> buffer = readFile(reexportPath);
+-    if (!buffer) {
+-      error("unable to read re-exported dylib at " + reexportPath);
+-      return;
+-    }
+-    reexported.push_back(make<DylibFile>(*buffer, umbrella));
+-  }
+-}
+-
+-DylibFile::DylibFile(std::shared_ptr<llvm::MachO::InterfaceFile> interface,
+-                     DylibFile *umbrella)
+-    : InputFile(DylibKind, MemoryBufferRef()) {
+-  if (umbrella == nullptr)
+-    umbrella = this;
+-
+-  dylibName = saver.save(interface->getInstallName());
+-  // TODO(compnerd) filter out symbols based on the target platform
+-  for (const auto symbol : interface->symbols())
+-    if (symbol->getArchitectures().has(config->arch))
+-      symbols.push_back(
+-          symtab->addDylib(saver.save(symbol->getName()), umbrella));
+-  // TODO(compnerd) properly represent the hierarchy of the documents as it is
+-  // in theory possible to have re-exported dylibs from re-exported dylibs which
+-  // should be parent'ed to the child.
+-  for (auto document : interface->documents())
+-    reexported.push_back(make<DylibFile>(document, umbrella));
+-}
+-
+-ArchiveFile::ArchiveFile(std::unique_ptr<llvm::object::Archive> &&f)
+-    : InputFile(ArchiveKind, f->getMemoryBufferRef()), file(std::move(f)) {
+-  for (const object::Archive::Symbol &sym : file->symbols())
+-    symtab->addLazy(sym.getName(), this, sym);
+-}
+-
+-void ArchiveFile::fetch(const object::Archive::Symbol &sym) {
+-  object::Archive::Child c =
+-      CHECK(sym.getMember(), toString(this) +
+-                                 ": could not get the member for symbol " +
+-                                 sym.getName());
+-
+-  if (!seen.insert(c.getChildOffset()).second)
+-    return;
+-
+-  MemoryBufferRef mb =
+-      CHECK(c.getMemoryBufferRef(),
+-            toString(this) +
+-                ": could not get the buffer for the member defining symbol " +
+-                sym.getName());
+-  auto file = make<ObjFile>(mb);
+-  symbols.insert(symbols.end(), file->symbols.begin(), file->symbols.end());
+-  subsections.insert(subsections.end(), file->subsections.begin(),
+-                     file->subsections.end());
+-}
+-
+-// Returns "<internal>" or "baz.o".
+-std::string lld::toString(const InputFile *file) {
+-  return file ? std::string(file->getName()) : "<internal>";
+-}
+diff --git a/lld/MachO/InputFiles.h b/lld/MachO/InputFiles.h
+deleted file mode 100644
+index bc5ad86ccaa..00000000000
+--- a/lld/MachO/InputFiles.h
++++ /dev/null
+@@ -1,121 +0,0 @@
+-//===- InputFiles.h ---------------------------------------------*- C++ -*-===//
+-//
+-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+-// See https://llvm.org/LICENSE.txt for license information.
+-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+-//
+-//===----------------------------------------------------------------------===//
+-
+-#ifndef LLD_MACHO_INPUT_FILES_H
+-#define LLD_MACHO_INPUT_FILES_H
+-
+-#include "MachOStructs.h"
+-
+-#include "lld/Common/LLVM.h"
+-#include "llvm/ADT/DenseSet.h"
+-#include "llvm/BinaryFormat/MachO.h"
+-#include "llvm/Object/Archive.h"
+-#include "llvm/Support/MemoryBuffer.h"
+-#include "llvm/TextAPI/MachO/InterfaceFile.h"
+-#include "llvm/TextAPI/MachO/TextAPIReader.h"
+-
+-#include <map>
+-#include <vector>
+-
+-namespace lld {
+-namespace macho {
+-
+-class InputSection;
+-class Symbol;
+-struct Reloc;
+-
+-// If .subsections_via_symbols is set, each InputSection will be split along
+-// symbol boundaries. The keys of a SubsectionMap represent the offsets of
+-// each subsection from the start of the original pre-split InputSection.
+-using SubsectionMap = std::map<uint32_t, InputSection *>;
+-
+-class InputFile {
+-public:
+-  enum Kind {
+-    ObjKind,
+-    DylibKind,
+-    ArchiveKind,
+-  };
+-
+-  virtual ~InputFile() = default;
+-  Kind kind() const { return fileKind; }
+-  StringRef getName() const { return mb.getBufferIdentifier(); }
+-
+-  MemoryBufferRef mb;
+-  std::vector<Symbol *> symbols;
+-  ArrayRef<llvm::MachO::section_64> sectionHeaders;
+-  std::vector<SubsectionMap> subsections;
+-
+-protected:
+-  InputFile(Kind kind, MemoryBufferRef mb) : mb(mb), fileKind(kind) {}
+-
+-  void parseSections(ArrayRef<llvm::MachO::section_64>);
+-
+-  void parseSymbols(ArrayRef<lld::structs::nlist_64> nList, const char *strtab,
+-                    bool subsectionsViaSymbols);
+-
+-  void parseRelocations(const llvm::MachO::section_64 &, SubsectionMap &);
+-
+-private:
+-  const Kind fileKind;
+-};
+-
+-// .o file
+-class ObjFile : public InputFile {
+-public:
+-  explicit ObjFile(MemoryBufferRef mb);
+-  static bool classof(const InputFile *f) { return f->kind() == ObjKind; }
+-};
+-
+-// .dylib file
+-class DylibFile : public InputFile {
+-public:
+-  explicit DylibFile(std::shared_ptr<llvm::MachO::InterfaceFile> interface,
+-                     DylibFile *umbrella = nullptr);
+-
+-  // Mach-O dylibs can re-export other dylibs as sub-libraries, meaning that the
+-  // symbols in those sub-libraries will be available under the umbrella
+-  // library's namespace. Those sub-libraries can also have their own
+-  // re-exports. When loading a re-exported dylib, `umbrella` should be set to
+-  // the root dylib to ensure symbols in the child library are correctly bound
+-  // to the root. On the other hand, if a dylib is being directly loaded
+-  // (through an -lfoo flag), then `umbrella` should be a nullptr.
+-  explicit DylibFile(MemoryBufferRef mb, DylibFile *umbrella = nullptr);
+-
+-  static bool classof(const InputFile *f) { return f->kind() == DylibKind; }
+-
+-  StringRef dylibName;
+-  uint64_t ordinal = 0; // Ordinal numbering starts from 1, so 0 is a sentinel
+-  bool reexport = false;
+-  std::vector<DylibFile *> reexported;
+-};
+-
+-// .a file
+-class ArchiveFile : public InputFile {
+-public:
+-  explicit ArchiveFile(std::unique_ptr<llvm::object::Archive> &&file);
+-  static bool classof(const InputFile *f) { return f->kind() == ArchiveKind; }
+-  void fetch(const llvm::object::Archive::Symbol &sym);
+-
+-private:
+-  std::unique_ptr<llvm::object::Archive> file;
+-  // Keep track of children fetched from the archive by tracking
+-  // which address offsets have been fetched already.
+-  llvm::DenseSet<uint64_t> seen;
+-};
+-
+-extern std::vector<InputFile *> inputFiles;
+-
+-llvm::Optional<MemoryBufferRef> readFile(StringRef path);
+-
+-} // namespace macho
+-
+-std::string toString(const macho::InputFile *file);
+-} // namespace lld
+-
+-#endif
+diff --git a/lld/MachO/InputSection.cpp b/lld/MachO/InputSection.cpp
+deleted file mode 100644
+index 72d48928305..00000000000
+--- a/lld/MachO/InputSection.cpp
++++ /dev/null
+@@ -1,48 +0,0 @@
+-//===- InputSection.cpp ---------------------------------------------------===//
+-//
+-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+-// See https://llvm.org/LICENSE.txt for license information.
+-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+-//
+-//===----------------------------------------------------------------------===//
+-
+-#include "InputSection.h"
+-#include "OutputSegment.h"
+-#include "Symbols.h"
+-#include "Target.h"
+-#include "lld/Common/Memory.h"
+-#include "llvm/Support/Endian.h"
+-
+-using namespace llvm;
+-using namespace llvm::MachO;
+-using namespace llvm::support;
+-using namespace lld;
+-using namespace lld::macho;
+-
+-std::vector<InputSection *> macho::inputSections;
+-
+-uint64_t InputSection::getFileOffset() const {
+-  return parent->fileOff + outSecFileOff;
+-}
+-
+-uint64_t InputSection::getVA() const { return parent->addr + outSecOff; }
+-
+-void InputSection::writeTo(uint8_t *buf) {
+-  if (getFileSize() == 0)
+-    return;
+-
+-  memcpy(buf, data.data(), data.size());
+-
+-  for (Reloc &r : relocs) {
+-    uint64_t va = 0;
+-    if (auto *s = r.target.dyn_cast<Symbol *>())
+-      va = target->getSymbolVA(*s, r.type);
+-    else if (auto *isec = r.target.dyn_cast<InputSection *>())
+-      va = isec->getVA();
+-
+-    uint64_t val = va + r.addend;
+-    if (r.pcrel)
+-      val -= getVA() + r.offset;
+-    target->relocateOne(buf + r.offset, r, val);
+-  }
+-}
+diff --git a/lld/MachO/InputSection.h b/lld/MachO/InputSection.h
+deleted file mode 100644
+index 96ae0cbe6ea..00000000000
+--- a/lld/MachO/InputSection.h
++++ /dev/null
+@@ -1,74 +0,0 @@
+-//===- InputSection.h -------------------------------------------*- C++ -*-===//
+-//
+-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+-// See https://llvm.org/LICENSE.txt for license information.
+-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+-//
+-//===----------------------------------------------------------------------===//
+-
+-#ifndef LLD_MACHO_INPUT_SECTION_H
+-#define LLD_MACHO_INPUT_SECTION_H
+-
+-#include "lld/Common/LLVM.h"
+-#include "llvm/ADT/ArrayRef.h"
+-#include "llvm/ADT/PointerUnion.h"
+-#include "llvm/BinaryFormat/MachO.h"
+-
+-namespace lld {
+-namespace macho {
+-
+-class InputFile;
+-class InputSection;
+-class OutputSection;
+-class Symbol;
+-
+-struct Reloc {
+-  uint8_t type;
+-  bool pcrel;
+-  uint8_t length;
+-  // The offset from the start of the subsection that this relocation belongs
+-  // to.
+-  uint32_t offset;
+-  // Adding this offset to the address of the target symbol or subsection gives
+-  // the destination that this relocation refers to.
+-  uint64_t addend;
+-  llvm::PointerUnion<Symbol *, InputSection *> target;
+-};
+-
+-inline bool isZeroFill(uint8_t flags) {
+-  return (flags & llvm::MachO::SECTION_TYPE) == llvm::MachO::S_ZEROFILL;
+-}
+-
+-class InputSection {
+-public:
+-  virtual ~InputSection() = default;
+-  virtual uint64_t getSize() const { return data.size(); }
+-  virtual uint64_t getFileSize() const {
+-    return isZeroFill(flags) ? 0 : getSize();
+-  }
+-  uint64_t getFileOffset() const;
+-  uint64_t getVA() const;
+-
+-  virtual void writeTo(uint8_t *buf);
+-
+-  InputFile *file = nullptr;
+-  StringRef name;
+-  StringRef segname;
+-
+-  OutputSection *parent = nullptr;
+-  uint64_t outSecOff = 0;
+-  uint64_t outSecFileOff = 0;
+-
+-  uint32_t align = 1;
+-  uint32_t flags = 0;
+-
+-  ArrayRef<uint8_t> data;
+-  std::vector<Reloc> relocs;
+-};
+-
+-extern std::vector<InputSection *> inputSections;
+-
+-} // namespace macho
+-} // namespace lld
+-
+-#endif
+diff --git a/lld/MachO/MachOStructs.h b/lld/MachO/MachOStructs.h
+deleted file mode 100644
+index 69b50ec2317..00000000000
+--- a/lld/MachO/MachOStructs.h
++++ /dev/null
+@@ -1,36 +0,0 @@
+-//===- MachOStructs.h -------------------------------------------*- C++ -*-===//
+-//
+-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+-// See https://llvm.org/LICENSE.txt for license information.
+-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+-//
+-//===----------------------------------------------------------------------===//
+-//
+-// This file defines structures used in the MachO object file format. Note that
+-// unlike llvm/BinaryFormat/MachO.h, the structs here are defined in terms of
+-// endian- and alignment-compatibility wrappers.
+-//
+-//===----------------------------------------------------------------------===//
+-
+-#ifndef LLD_MACHO_MACHO_STRUCTS_H
+-#define LLD_MACHO_MACHO_STRUCTS_H
+-
+-#include "llvm/Support/Endian.h"
+-
+-namespace lld {
+-
+-namespace structs {
+-
+-struct nlist_64 {
+-  llvm::support::ulittle32_t n_strx;
+-  uint8_t n_type;
+-  uint8_t n_sect;
+-  llvm::support::ulittle16_t n_desc;
+-  llvm::support::ulittle64_t n_value;
+-};
+-
+-} // namespace structs
+-
+-} // namespace lld
+-
+-#endif
+diff --git a/lld/MachO/MergedOutputSection.cpp b/lld/MachO/MergedOutputSection.cpp
+deleted file mode 100644
+index 2d0be253834..00000000000
+--- a/lld/MachO/MergedOutputSection.cpp
++++ /dev/null
+@@ -1,74 +0,0 @@
+-//===- OutputSection.cpp --------------------------------------------------===//
+-//
+-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+-// See https://llvm.org/LICENSE.txt for license information.
+-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+-//
+-//===----------------------------------------------------------------------===//
+-
+-#include "MergedOutputSection.h"
+-#include "lld/Common/ErrorHandler.h"
+-#include "lld/Common/Memory.h"
+-#include "llvm/BinaryFormat/MachO.h"
+-
+-using namespace llvm;
+-using namespace llvm::MachO;
+-using namespace lld;
+-using namespace lld::macho;
+-
+-void MergedOutputSection::mergeInput(InputSection *input) {
+-  if (inputs.empty()) {
+-    align = input->align;
+-    flags = input->flags;
+-  } else {
+-    mergeFlags(input->flags);
+-    align = std::max(align, input->align);
+-  }
+-
+-  inputs.push_back(input);
+-  input->parent = this;
+-}
+-
+-void MergedOutputSection::finalize() {
+-  uint64_t isecAddr = addr;
+-  uint64_t isecFileOff = fileOff;
+-  for (InputSection *isec : inputs) {
+-    isecAddr = alignTo(isecAddr, isec->align);
+-    isecFileOff = alignTo(isecFileOff, isec->align);
+-    isec->outSecOff = isecAddr - addr;
+-    isec->outSecFileOff = isecFileOff - fileOff;
+-    isecAddr += isec->getSize();
+-    isecFileOff += isec->getFileSize();
+-  }
+-  size = isecAddr - addr;
+-  fileSize = isecFileOff - fileOff;
+-}
+-
+-void MergedOutputSection::writeTo(uint8_t *buf) const {
+-  for (InputSection *isec : inputs) {
+-    isec->writeTo(buf + isec->outSecFileOff);
+-  }
+-}
+-
+-// TODO: this is most likely wrong; reconsider how section flags
+-// are actually merged. The logic presented here was written without
+-// any form of informed research.
+-void MergedOutputSection::mergeFlags(uint32_t inputFlags) {
+-  uint8_t sectionFlag = MachO::SECTION_TYPE & inputFlags;
+-  if (sectionFlag != (MachO::SECTION_TYPE & flags))
+-    error("Cannot add merge section; inconsistent type flags " +
+-          Twine(sectionFlag));
+-
+-  uint32_t inconsistentFlags =
+-      MachO::S_ATTR_DEBUG | MachO::S_ATTR_STRIP_STATIC_SYMS |
+-      MachO::S_ATTR_NO_DEAD_STRIP | MachO::S_ATTR_LIVE_SUPPORT;
+-  if ((inputFlags ^ flags) & inconsistentFlags)
+-    error("Cannot add merge section; cannot merge inconsistent flags");
+-
+-  // Negate pure instruction presence if any section isn't pure.
+-  uint32_t pureMask = ~MachO::S_ATTR_PURE_INSTRUCTIONS | (inputFlags & flags);
+-
+-  // Merge the rest
+-  flags |= inputFlags;
+-  flags &= pureMask;
+-}
+diff --git a/lld/MachO/MergedOutputSection.h b/lld/MachO/MergedOutputSection.h
+deleted file mode 100644
+index 279a7e0f75c..00000000000
+--- a/lld/MachO/MergedOutputSection.h
++++ /dev/null
+@@ -1,56 +0,0 @@
+-//===- OutputSection.h ------------------------------------------*- C++ -*-===//
+-//
+-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+-// See https://llvm.org/LICENSE.txt for license information.
+-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+-//
+-//===----------------------------------------------------------------------===//
+-
+-#ifndef LLD_MACHO_MERGED_OUTPUT_SECTION_H
+-#define LLD_MACHO_MERGED_OUTPUT_SECTION_H
+-
+-#include "InputSection.h"
+-#include "OutputSection.h"
+-#include "lld/Common/LLVM.h"
+-#include "llvm/ADT/MapVector.h"
+-
+-namespace lld {
+-namespace macho {
+-
+-// Linking multiple files will inevitably mean resolving sections in different
+-// files that are labeled with the same segment and section name. This class
+-// contains all such sections and writes the data from each section sequentially
+-// in the final binary.
+-class MergedOutputSection : public OutputSection {
+-public:
+-  MergedOutputSection(StringRef name) : OutputSection(MergedKind, name) {}
+-
+-  const InputSection *firstSection() const { return inputs.front(); }
+-  const InputSection *lastSection() const { return inputs.back(); }
+-
+-  // These accessors will only be valid after finalizing the section
+-  uint64_t getSize() const override { return size; }
+-  uint64_t getFileSize() const override { return fileSize; }
+-
+-  void mergeInput(InputSection *input);
+-  void finalize() override;
+-
+-  void writeTo(uint8_t *buf) const override;
+-
+-  std::vector<InputSection *> inputs;
+-
+-  static bool classof(const OutputSection *sec) {
+-    return sec->kind() == MergedKind;
+-  }
+-
+-private:
+-  void mergeFlags(uint32_t inputFlags);
+-
+-  size_t size = 0;
+-  uint64_t fileSize = 0;
+-};
+-
+-} // namespace macho
+-} // namespace lld
+-
+-#endif
+diff --git a/lld/MachO/Options.td b/lld/MachO/Options.td
+deleted file mode 100644
+index 1e42542b9ac..00000000000
+--- a/lld/MachO/Options.td
++++ /dev/null
+@@ -1,1297 +0,0 @@
+-include "llvm/Option/OptParser.td"
+-
+-def help : Flag<["-", "--"], "help">;
+-def help_hidden : Flag<["--"], "help-hidden">,
+-  HelpText<"Display help for hidden options">;
+-
+-// This is a complete Options.td compiled from Apple's ld(1) manpage
+-// dated 2018-03-07 and cross checked with ld64 source code in repo
+-// https://github.com/apple-opensource/ld64 at git tag "512.4" dated
+-// 2018-03-18.
+-
+-// Flags<[HelpHidden]> marks options that are not yet ported to lld,
+-// and serve as a scoreboard for annotating our progress toward
+-// implementing ld64 options in lld. As you add implementions to
+-// Driver.cpp, please remove the hidden flag here.
+-
+-def grp_kind : OptionGroup<"kind">, HelpText<"OUTPUT KIND">;
+-
+-def execute : Flag<["-"], "execute">,
+-     HelpText<"Produce a main executable (default)">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_kind>;
+-def dylib : Flag<["-"], "dylib">,
+-     HelpText<"Produce a shared library">,
+-     Group<grp_kind>;
+-def bundle : Flag<["-"], "bundle">,
+-     HelpText<"Produce a bundle">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_kind>;
+-def r : Flag<["-"], "r">,
+-     HelpText<"Merge multiple object files into one, retaining relocations">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_kind>;
+-def dylinker : Flag<["-"], "dylinker">,
+-     HelpText<"Produce a dylinker only used when building dyld">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_kind>;
+-def dynamic : Flag<["-"], "dynamic">,
+-     HelpText<"Link dynamically (default)">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_kind>;
+-def static : Flag<["-"], "static">,
+-     HelpText<"Link statically">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_kind>;
+-def preload : Flag<["-"], "preload">,
+-     HelpText<"Produce an unsegmented binary for embedded systems">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_kind>;
+-def arch : Separate<["-"], "arch">,
+-     MetaVarName<"<arch_name>">,
+-     HelpText<"The architecture (e.g. ppc, ppc64, i386, x86_64)">,
+-     Group<grp_kind>;
+-def o : Separate<["-"], "o">,
+-     MetaVarName<"<path>">,
+-     HelpText<"The name of the output file (default: `a.out')">,
+-     Group<grp_kind>;
+-
+-def grp_libs : OptionGroup<"libs">, HelpText<"LIBRARIES">;
+-
+-def l : Joined<["-"], "l">,
+-     MetaVarName<"<name>">,
+-     HelpText<"Search for lib<name>.dylib or lib<name>.a on the library search path">,
+-     Group<grp_libs>;
+-def weak_l : Joined<["-"], "weak-l">,
+-     MetaVarName<"<name>">,
+-     HelpText<"Like -l<name>, but mark library and its references as weak imports">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_libs>;
+-def weak_library : Separate<["-"], "weak_library">,
+-     MetaVarName<"<path>">,
+-     HelpText<"Like bare <path>, but mark library and its references as weak imports">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_libs>;
+-def reexport_l : Joined<["-"], "reexport-l">,
+-     MetaVarName<"<name>">,
+-     HelpText<"Like -l<name>, but export all symbols of <name> from newly created library">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_libs>;
+-def reexport_library : Separate<["-"], "reexport_library">,
+-     MetaVarName<"<path>">,
+-     HelpText<"Like bare <path>, but export all symbols of <path> from newly created library">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_libs>;
+-def upward_l : Joined<["-"], "upward-l">,
+-     MetaVarName<"<name>">,
+-     HelpText<"Like -l<name>, but specify dylib as an upward dependency">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_libs>;
+-def upward_library : Separate<["-"], "upward_library">,
+-     MetaVarName<"<path>">,
+-     HelpText<"Like bare <path>, but specify dylib as an upward dependency">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_libs>;
+-def L : JoinedOrSeparate<["-"], "L">,
+-     MetaVarName<"<dir>">,
+-     HelpText<"Add dir to the library search path">,
+-     Group<grp_libs>;
+-def Z : Flag<["-"], "Z">,
+-     HelpText<"Remove standard directories from the library and framework search paths">,
+-     Group<grp_libs>;
+-def syslibroot : Separate<["-"], "syslibroot">,
+-     MetaVarName<"<rootdir>">,
+-     HelpText<"Prepend <rootdir> to all library and framework search paths">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_libs>;
+-def search_paths_first : Flag<["-"], "search_paths_first">,
+-     HelpText<"Search for lib<name>.dylib and lib<name>.a at each step in traversing search path (default for Xcode 4 and later)">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_libs>;
+-def search_dylibs_first : Flag<["-"], "search_dylibs_first">,
+-     HelpText<"Search for lib<name>.dylib on first pass, then for lib<name>.a on second pass through search path (default for Xcode 3 and earlier)">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_libs>;
+-def framework : Separate<["-"], "framework">,
+-     MetaVarName<"<name>">,
+-     HelpText<"Search for <name>.framework/<name> on the framework search path">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_libs>;
+-def weak_framework : Separate<["-"], "weak_framework">,
+-     MetaVarName<"<name>">,
+-     HelpText<"Like -framework <name>, but mark framework and its references as weak imports">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_libs>;
+-def reexport_framework : Separate<["-"], "reexport_framework">,
+-     MetaVarName<"<name>">,
+-     HelpText<"Like -framework <name>, but export all symbols of <name> from the newly created library">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_libs>;
+-def upward_framework : Separate<["-"], "upward_framework">,
+-     MetaVarName<"<name>">,
+-     HelpText<"Like -framework <name>, but specify the framework as an upward dependency">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_libs>;
+-def F : JoinedOrSeparate<["-"], "F">,
+-     MetaVarName<"<dir>">,
+-     HelpText<"Add dir to the framework search path">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_libs>;
+-def all_load : Flag<["-"], "all_load">,
+-     HelpText<"Load all members of all static archive libraries">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_libs>;
+-def ObjC : Flag<["-"], "ObjC">,
+-     HelpText<"Load all members of static archives that are an Objective-C class or category.">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_libs>;
+-def force_load : Separate<["-"], "force_load">,
+-     MetaVarName<"<path>">,
+-     HelpText<"Load all members static archive library at <path>">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_libs>;
+-
+-def grp_content : OptionGroup<"content">, HelpText<"ADDITIONAL CONTENT">;
+-
+-def sectcreate : MultiArg<["-"], "sectcreate", 3>,
+-     MetaVarName<"<segment> <section> <file>">,
+-     HelpText<"Create <section> in <segment> from the contents of <file>">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_content>;
+-def segcreate : MultiArg<["-"], "segcreate", 3>,
+-     MetaVarName<"<segment> <section> <file>">,
+-     Alias<sectcreate>,
+-     HelpText<"Alias for -sectcreate">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_content>;
+-def filelist : Separate<["-"], "filelist">,
+-     MetaVarName<"<file>">,
+-     HelpText<"Read names of files to link from <file>">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_content>;
+-def dtrace : Separate<["-"], "dtrace">,
+-     MetaVarName<"<script>">,
+-     HelpText<"Enable DTrace static probes according to declarations in <script>">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_content>;
+-
+-def grp_opts : OptionGroup<"opts">, HelpText<"OPTIMIZATIONS">;
+-
+-def dead_strip : Flag<["-"], "dead_strip">,
+-     HelpText<"Remove unreachable functions and data">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_opts>;
+-def order_file : Separate<["-"], "order_file">,
+-     MetaVarName<"<file>">,
+-     HelpText<"Layout functions and data according to specification in <file>">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_opts>;
+-def sectorder : MultiArg<["-"], "sectorder", 3>,
+-     MetaVarName<"<segname> <sectname> <orderfile>">,
+-     HelpText<"Replaced by more general -order_file option">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_opts>;
+-def no_order_inits : Flag<["-"], "no_order_inits">,
+-     HelpText<"Disable default reordering of initializer and terminator functions">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_opts>;
+-def no_order_data : Flag<["-"], "no_order_data">,
+-     HelpText<"Disable default reordering of global data accessed at launch time">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_opts>;
+-def platform_version : MultiArg<["-"], "platform_version", 3>,
+-     MetaVarName<"<platform> <min_version> <sdk_version>">,
+-     HelpText<"Platform (e.g., macos, ios, tvos, watchos, bridgeos, mac-catalyst, ios-sim, tvos-sim, watchos-sim, driverkit) and version numbers">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_opts>;
+-def macos_version_min : Separate<["-"], "macos_version_min">,
+-     MetaVarName<"<version>">,
+-     HelpText<"Oldest macOS version for which linked output is useable">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_opts>;
+-def macosx_version_min : Separate<["-"], "macosx_version_min">,
+-     MetaVarName<"<version>">,
+-     Alias<macos_version_min>,
+-     HelpText<"Alias for -macos_version_min">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_opts>;
+-def ios_version_min : Separate<["-"], "ios_version_min">,
+-     MetaVarName<"<version>">,
+-     HelpText<"Oldest iOS version for which linked output is useable">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_opts>;
+-def iphoneos_version_min : Separate<["-"], "iphoneos_version_min">,
+-     MetaVarName<"<version>">,
+-     Alias<ios_version_min>,
+-     HelpText<"Alias for -ios_version_min">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_opts>;
+-def image_base : Separate<["-"], "image_base">,
+-     MetaVarName<"<address>">,
+-     HelpText<"Preferred hex load address for a dylib or bundle.">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_opts>;
+-def seg1addr : Separate<["-"], "seg1addr">,
+-     MetaVarName<"<address>">,
+-     Alias<image_base>,
+-     HelpText<"Alias for -image_base">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_opts>;
+-def no_implicit_dylibs : Flag<["-"], "no_implicit_dylibs">,
+-     HelpText<"Do not optimize public dylib transitive symbol references">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_opts>;
+-def exported_symbols_order : Separate<["-"], "exported_symbols_order">,
+-     MetaVarName<"<file>">,
+-     HelpText<"Specify frequently-used symbols in <file> to optimize symbol exports">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_opts>;
+-def no_zero_fill_sections : Flag<["-"], "no_zero_fill_sections">,
+-     HelpText<"Explicitly store zeroed data in the final image">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_opts>;
+-def merge_zero_fill_sections : Flag<["-"], "merge_zero_fill_sections">,
+-     HelpText<"Merge all zeroed data into the __zerofill section">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_opts>;
+-def no_branch_islands : Flag<["-"], "no_branch_islands">,
+-     HelpText<"Disable infra for branches beyond the maximum branch distance.">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_opts>;
+-
+-def grp_dylib : OptionGroup<"dylib">, HelpText<"DYNAMIC LIBRARIES (DYLIB)">;
+-
+-def install_name : Separate<["-"], "install_name">,
+-     MetaVarName<"<name>">,
+-     HelpText<"Set an internal install path in a dylib">,
+-     Group<grp_dylib>;
+-def dylib_install_name : Separate<["-"], "dylib_install_name">,
+-     MetaVarName<"<name>">,
+-     Alias<install_name>,
+-     HelpText<"Alias for -install_name">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_dylib>;
+-def dylinker_install_name : Separate<["-"], "dylinker_install_name">,
+-     MetaVarName<"<name>">,
+-     Alias<install_name>,
+-     HelpText<"Alias for -install_name">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_dylib>;
+-def mark_dead_strippable_dylib : Flag<["-"], "mark_dead_strippable_dylib">,
+-     HelpText<"Clients can discard this dylib if it is unreferenced">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_dylib>;
+-def compatibility_version : Separate<["-"], "compatibility_version">,
+-     MetaVarName<"<version>">,
+-     HelpText<"Compatibility <version> of this library">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_dylib>;
+-def dylib_compatibility_version : Separate<["-"], "dylib_compatibility_version">,
+-     MetaVarName<"<version>">,
+-     Alias<compatibility_version>,
+-     HelpText<"Alias for -compatibility_version">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_dylib>;
+-def current_version : Separate<["-"], "current_version">,
+-     MetaVarName<"<version>">,
+-     HelpText<"Current <version> of this library">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_dylib>;
+-def dylib_current_version : Separate<["-"], "dylib_current_version">,
+-     MetaVarName<"<version>">,
+-     Alias<current_version>,
+-     HelpText<"Alias for -current_version">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_dylib>;
+-
+-def grp_main : OptionGroup<"main">, HelpText<"MAIN EXECUTABLE">;
+-
+-def pie : Flag<["-"], "pie">,
+-     HelpText<"Build a position independent executable (default for macOS 10.7 and later)">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_main>;
+-def no_pie : Flag<["-"], "no_pie">,
+-     HelpText<"Do not build a position independent executable (default for macOS 10.6 and earlier)">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_main>;
+-def pagezero_size : Separate<["-"], "pagezero_size">,
+-     MetaVarName<"<size>">,
+-     HelpText<"Size of unreadable segment at address zero is hex <size> (default is 4KB on 32-bit and 4GB on 64-bit)">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_main>;
+-def stack_size : Separate<["-"], "stack_size">,
+-     MetaVarName<"<size>">,
+-     HelpText<"Maximum hex stack size for the main thread in a program. (default is 8MB)">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_main>;
+-def allow_stack_execute : Flag<["-"], "allow_stack_execute">,
+-     HelpText<"Mark stack segment as executable">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_main>;
+-def export_dynamic : Flag<["-"], "export_dynamic">,
+-     HelpText<"Preserve all global symbols during LTO">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_main>;
+-
+-def grp_bundle : OptionGroup<"bundle">, HelpText<"CREATING A BUNDLE">;
+-
+-def bundle_loader : Separate<["-"], "bundle_loader">,
+-     MetaVarName<"<executable>">,
+-     HelpText<"Resolve undefined symbols from <executable>">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_bundle>;
+-
+-def grp_object : OptionGroup<"object">, HelpText<"CREATING AN OBJECT FILE">;
+-
+-def keep_private_externs : Flag<["-"], "keep_private_externs">,
+-     HelpText<"Do not convert private external symbols to static symbols">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_object>;
+-def d : Flag<["-"], "d">,
+-     HelpText<"Force tentative into real definitions for common symbols">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_object>;
+-
+-def grp_resolve : OptionGroup<"resolve">, HelpText<"SYMBOL RESOLUTION">;
+-
+-def exported_symbols_list : Separate<["-"], "exported_symbols_list">,
+-     MetaVarName<"<file>">,
+-     HelpText<"Symbols specified in <file> remain global, while others become private externs">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_resolve>;
+-def exported_symbol : Separate<["-"], "exported_symbol">,
+-     MetaVarName<"<symbol>">,
+-     HelpText<"<symbol> remains global, while others become private externs">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_resolve>;
+-def unexported_symbols_list : Separate<["-"], "unexported_symbols_list">,
+-     MetaVarName<"<file>">,
+-     HelpText<"Global symbols specified in <file> become private externs">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_resolve>;
+-def unexported_symbol : Separate<["-"], "unexported_symbol">,
+-     MetaVarName<"<symbol>">,
+-     HelpText<"Global <symbol> becomes private extern">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_resolve>;
+-def reexported_symbols_list : Separate<["-"], "reexported_symbols_list">,
+-     MetaVarName<"<file>">,
+-     HelpText<"Symbols from dependent dylibs specified in <file> are reexported by this dylib">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_resolve>;
+-def alias : MultiArg<["-"], "alias", 2>,
+-     MetaVarName<"<symbol_name> <alternate_name>">,
+-     HelpText<"Create a symbol alias with default global visibility">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_resolve>;
+-def alias_list : Separate<["-"], "alias_list">,
+-     MetaVarName<"<file>">,
+-     HelpText<"Create symbol aliases specified in <file>">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_resolve>;
+-def flat_namespace : Flag<["-"], "flat_namespace">,
+-     HelpText<"Resolve symbols from all dylibs, both direct & transitive. Do not record source libraries: dyld must re-search at runtime and use the first definition found">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_resolve>;
+-def u : Separate<["-"], "u">,
+-     MetaVarName<"<symbol>">,
+-     HelpText<"Require that <symbol> be defined for the link to succeed">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_resolve>;
+-def U : Separate<["-"], "U">,
+-     MetaVarName<"<symbol>">,
+-     HelpText<"Allow <symbol> to have no definition">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_resolve>;
+-def undefined : Separate<["-"], "undefined">,
+-     MetaVarName<"<treatment>">,
+-     HelpText<"Handle undefined symbols according to <treatment>: error, warning, suppress, or dynamic_lookup (default is error)">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_resolve>;
+-def rpath : Separate<["-"], "rpath">,
+-     MetaVarName<"<path>">,
+-     HelpText<"Add <path> to dyld search list for dylibs with load path prefix `@rpath/'">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_resolve>;
+-def commons : Separate<["-"], "commons">,
+-     MetaVarName<"<treatment>">,
+-     HelpText<"Resolve tentative definitions in dylibs according to <treatment>: ignore_dylibs, use_dylibs, error (default is ignore_dylibs)">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_resolve>;
+-
+-def grp_introspect : OptionGroup<"introspect">, HelpText<"INTROSPECTING THE LINKER">;
+-
+-def why_load : Flag<["-"], "why_load">,
+-     HelpText<"Log the symbol that compels loading of each object file from a static library">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_introspect>;
+-def whyload : Flag<["-"], "whyload">,
+-     Alias<why_load>,
+-     HelpText<"Alias for -why_load">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_introspect>;
+-def why_live : Separate<["-"], "why_live">,
+-     MetaVarName<"<symbol>">,
+-     HelpText<"Log a chain of references to <symbol>, for use with -dead_strip">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_introspect>;
+-def print_statistics : Flag<["-"], "print_statistics">,
+-     HelpText<"Log the linker's memory and CPU usage">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_introspect>;
+-def t : Flag<["-"], "t">,
+-     HelpText<"Log every file the linker loads: object, archive, and dylib">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_introspect>;
+-def whatsloaded : Flag<["-"], "whatsloaded">,
+-     HelpText<"Logs only the object files the linker loads">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_introspect>;
+-def order_file_statistics : Flag<["-"], "order_file_statistics">,
+-     HelpText<"Logs information about -order_file">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_introspect>;
+-def map : Separate<["-"], "map">,
+-     MetaVarName<"<path>">,
+-     HelpText<"Writes all symbols and their addresses to <path>">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_introspect>;
+-
+-def grp_symtab : OptionGroup<"symtab">, HelpText<"SYMBOL TABLE OPTIMIZATIONS">;
+-
+-def S : Flag<["-"], "S">,
+-     HelpText<"Strip debug information (STABS or DWARF) from the output">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_symtab>;
+-def x : Flag<["-"], "x">,
+-     HelpText<"Exclude non-global symbols from the output symbol table">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_symtab>;
+-def non_global_symbols_strip_list : Separate<["-"], "non_global_symbols_strip_list">,
+-     MetaVarName<"<path>">,
+-     HelpText<"Specify in <path> the non-global symbols that should be removed from the output symbol table">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_symtab>;
+-def non_global_symbols_no_strip_list : Separate<["-"], "non_global_symbols_no_strip_list">,
+-     MetaVarName<"<path>">,
+-     HelpText<"Specify in <path> the non-global symbols that should remain in the output symbol table">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_symtab>;
+-def oso_prefix : Separate<["-"], "oso_prefix">,
+-     MetaVarName<"<path>">,
+-     HelpText<"Remove the prefix <path> from OSO symbols in the debug map">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_symtab>;
+-
+-def grp_bitcode : OptionGroup<"bitcode">, HelpText<"BITCODE BUILD FLOW">;
+-
+-def bitcode_bundle : Flag<["-"], "bitcode_bundle">,
+-     HelpText<"Generate an embedded bitcode bundle in the __LLVM,__bundle section of the output">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_bitcode>;
+-def bitcode_hide_symbols : Flag<["-"], "bitcode_hide_symbols">,
+-     HelpText<"With -bitcode_bundle, hide all non-exported symbols from output bitcode bundle.">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_bitcode>;
+-def bitcode_symbol_map : Separate<["-"], "bitcode_symbol_map">,
+-     MetaVarName<"<path>">,
+-     HelpText<"Write the bitcode symbol reverse mapping to file <path>, or if a directory, to <path>/UUID.bcsymbolmap">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_bitcode>;
+-
+-def grp_rare : OptionGroup<"rare">, HelpText<"RARELY USED">;
+-
+-def v : Flag<["-"], "v">,
+-     HelpText<"Print the linker version">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def version_details : Flag<["-"], "version_details">,
+-     HelpText<"Print the linker version in JSON form">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def no_weak_imports : Flag<["-"], "no_weak_imports">,
+-     HelpText<"Fail if any symbols are weak imports, allowed to be NULL at runtime">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def no_deduplicate : Flag<["-"], "no_deduplicate">,
+-     HelpText<"Omit the deduplication pass">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def verbose_deduplicate : Flag<["-"], "verbose_deduplicate">,
+-     HelpText<"Print function names eliminated by deduplication and the total size of code savings">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def no_inits : Flag<["-"], "no_inits">,
+-     HelpText<"Fail if the output contains static initializers">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def no_warn_inits : Flag<["-"], "no_warn_inits">,
+-     HelpText<"Suppress warnings for static initializers in the output">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def debug_variant : Flag<["-"], "debug_variant">,
+-     HelpText<"Suppress warnings germane to binaries shipping to customers">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def unaligned_pointers : Separate<["-"], "unaligned_pointers">,
+-     MetaVarName<"<treatment>">,
+-     HelpText<"Handle unaligned pointers in __DATA segments according to <treatment>: warning, error, or suppress (default for arm64e is error, otherwise suppress)">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def dirty_data_list : Separate<["-"], "dirty_data_list">,
+-     MetaVarName<"<path>">,
+-     HelpText<"Specify data symbols in <path> destined for the __DATA_DIRTY segment">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def max_default_common_align : Separate<["-"], "max_default_common_align">,
+-     MetaVarName<"<boundary>">,
+-     HelpText<"Reduce maximum alignment for common symbols to a hex power-of-2 <boundary>">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def move_to_rw_segment : MultiArg<["-"], "move_to_rw_segment", 2>,
+-     MetaVarName<"<segment> <path>">,
+-     HelpText<"Move data symbols listed in <path> to another <segment>">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def move_to_ro_segment : MultiArg<["-"], "move_to_ro_segment", 2>,
+-     MetaVarName<"<segment> <path>">,
+-     HelpText<"Move code symbols listed in <path> to another <segment>">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def rename_section : MultiArg<["-"], "rename_section", 4>,
+-     MetaVarName<"<from_segment> <from_section> <to_segment> <to_section>">,
+-     HelpText<"Rename <from_segment>/<from_section> as <to_segment>/<to_section>">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def rename_segment : MultiArg<["-"], "rename_segment", 2>,
+-     MetaVarName<"<from_segment> <to_segment>">,
+-     HelpText<"Rename <from_segment> as <to_segment>">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def trace_symbol_layout : Flag<["-"], "trace_symbol_layout">,
+-     HelpText<"Show where and why symbols move, as specified by -move_to_ro_segment, -move_to_rw_segment, -rename_section, and -rename_segment">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def section_order : MultiArg<["-"], "section_order", 2>,
+-     MetaVarName<"<segment> <sections>">,
+-     HelpText<"With -preload, specify layout sequence of colon-separated <sections> in <segment>">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def segment_order : Separate<["-"], "segment_order">,
+-     MetaVarName<"<colon_separated_segment_list>">,
+-     HelpText<"With -preload, specify layout sequence of colon-separated <segments>">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def allow_heap_execute : Flag<["-"], "allow_heap_execute">,
+-     HelpText<"On i386, allow any page to execute code">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def application_extension : Flag<["-"], "application_extension">,
+-     HelpText<"Designate the linker output as safe for use in an application extension">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def no_application_extension : Flag<["-"], "no_application_extension">,
+-     HelpText<"Designate the linker output as unsafe for use in an application extension">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def fatal_warnings : Flag<["-"], "fatal_warnings">,
+-     HelpText<"Escalate warnings as errors">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def no_eh_labels : Flag<["-"], "no_eh_labels">,
+-     HelpText<"In -r mode, suppress .eh labels in the __eh_frame section">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def warn_compact_unwind : Flag<["-"], "warn_compact_unwind">,
+-     HelpText<"Warn for each FDE that cannot compact into the __unwind_info section and must remain in the __eh_frame section">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def warn_weak_exports : Flag<["-"], "warn_weak_exports">,
+-     HelpText<"Warn if the linked image contains weak external symbols">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def no_weak_exports : Flag<["-"], "no_weak_exports">,
+-     HelpText<"Fail if the linked image contains weak external symbols">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def objc_gc_compaction : Flag<["-"], "objc_gc_compaction">,
+-     HelpText<"Mark the Objective-C image as compatible with compacting garbage collection">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def objc_gc : Flag<["-"], "objc_gc">,
+-     HelpText<"Verify that all code was compiled with -fobjc-gc or -fobjc-gc-only">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def objc_gc_only : Flag<["-"], "objc_gc_only">,
+-     HelpText<"Verify that all code was compiled with -fobjc-gc-only">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def dead_strip_dylibs : Flag<["-"], "dead_strip_dylibs">,
+-     HelpText<"Remove dylibs that are unreachable by the entry point or exported symbols">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def allow_sub_type_mismatches : Flag<["-"], "allow_sub_type_mismatches">,
+-     HelpText<"Permit mixing objects compiled for different ARM CPU subtypes">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def no_uuid : Flag<["-"], "no_uuid">,
+-     HelpText<"Do not generate the LC_UUID load command">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def root_safe : Flag<["-"], "root_safe">,
+-     HelpText<"Set the MH_ROOT_SAFE bit in the mach-o header">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def setuid_safe : Flag<["-"], "setuid_safe">,
+-     HelpText<"Set the MH_SETUID_SAFE bit in the mach-o header">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def interposable : Flag<["-"], "interposable">,
+-     HelpText<"Indirects access to all to exported symbols in a dylib">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def multi_module : Flag<["-"], "multi_module">,
+-     Alias<interposable>,
+-     HelpText<"Alias for -interposable">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def init : Separate<["-"], "init">,
+-     MetaVarName<"<symbol>">,
+-     HelpText<"Run <symbol> as the first initializer in a dylib">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def sub_library : Separate<["-"], "sub_library">,
+-     MetaVarName<"<name>">,
+-     HelpText<"Re-export the dylib as <name>">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def sub_umbrella : Separate<["-"], "sub_umbrella">,
+-     MetaVarName<"<name>">,
+-     HelpText<"Re-export the framework as <name>">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def allowable_client : Separate<["-"], "allowable_client">,
+-     MetaVarName<"<name>">,
+-     HelpText<"Specify <name> of a dylib or framework that is allowed to link to this dylib">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def client_name : Separate<["-"], "client_name">,
+-     MetaVarName<"<name>">,
+-     HelpText<"Specifies a <name> this client should match with the -allowable_client <name> in a dependent dylib">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def umbrella : Separate<["-"], "umbrella">,
+-     MetaVarName<"<<name>>">,
+-     HelpText<"Re-export this dylib through the umbrella framework <name>a">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def headerpad : Separate<["-"], "headerpad">,
+-     MetaVarName<"<size>">,
+-     HelpText<"Allocate hex <size> extra space for future expansion of the load commands via install_name_tool">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def headerpad_max_install_names : Flag<["-"], "headerpad_max_install_names">,
+-     HelpText<"Allocate extra space so all load-command paths can expand to MAXPATHLEN via install_name_tool">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def bind_at_load : Flag<["-"], "bind_at_load">,
+-     HelpText<"Tell dyld to bind all symbols at load time, rather than lazily">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def force_flat_namespace : Flag<["-"], "force_flat_namespace">,
+-     HelpText<"Tell dyld to use a flat namespace on this executable and all its dependent dylibs & bundles">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def segalign : Separate<["-"], "segalign">,
+-     MetaVarName<"<boundary>">,
+-     HelpText<"Align all segments to hex power-of-2 <boundary>">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def sectalign : MultiArg<["-"], "sectalign", 3>,
+-     MetaVarName<"<segment> <section> <boundary>">,
+-     HelpText<"Align <section> within <segment> to hex power-of-2 <boundary>">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def stack_addr : Separate<["-"], "stack_addr">,
+-     MetaVarName<"<address>">,
+-     HelpText<"Initialize stack pointer to hex <address> rounded to a page boundary">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def segprot : MultiArg<["-"], "segprot", 3>,
+-     MetaVarName<"<segment> <max> <init>">,
+-     HelpText<"Specifies the <max> and <init> virtual memory protection of <segment> as r/w/x/-seg_addr_table path Specify hex base addresses and dylib install names on successive lines in <path>. This option is obsolete">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def segs_read_write_addr : Separate<["-"], "segs_read_write_addr">,
+-     MetaVarName<"<address>">,
+-     HelpText<"This option is obsolete">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def segs_read_only_addr : Separate<["-"], "segs_read_only_addr">,
+-     MetaVarName<"<address>">,
+-     HelpText<"This option is obsolete">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def segaddr : MultiArg<["-"], "segaddr", 2>,
+-     MetaVarName<"<segment> <address>">,
+-     HelpText<"Specify the starting hex <address> at a 4KiB page boundary for <segment>">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def seg_page_size : MultiArg<["-"], "seg_page_size", 2>,
+-     MetaVarName<"<segment> <size>">,
+-     HelpText<"Specifies the page <size> for <segment>. Segment size will be a multiple of its page size">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def dylib_file : Separate<["-"], "dylib_file">,
+-     MetaVarName<"<install_path:current_path>">,
+-     HelpText<"Specify <current_path> as different from where a dylib normally resides at <install_path>">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def prebind : Flag<["-"], "prebind">,
+-     HelpText<"This option is obsolete">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def weak_reference_mismatches : Separate<["-"], "weak_reference_mismatches">,
+-     MetaVarName<"<treatment>">,
+-     HelpText<"Resolve symbol imports of conflicting weakness according to <treatment> as weak, non-weak, or error (default is non-weak)">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def read_only_relocs : Separate<["-"], "read_only_relocs">,
+-     MetaVarName<"<treatment>">,
+-     HelpText<"Handle relocations that modify read-only pages according to <treatment> of warning, error, or suppress (i.e., allow)">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def force_cpusubtype_ALL : Flag<["-"], "force_cpusubtype_ALL">,
+-     HelpText<"Mark binary as runnable on any PowerPC, ignoring any PowerPC cpu requirements encoded in the object files">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def no_arch_warnings : Flag<["-"], "no_arch_warnings">,
+-     HelpText<"Suppresses warnings about inputs whose architecture does not match the -arch option">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def arch_errors_fatal : Flag<["-"], "arch_errors_fatal">,
+-     HelpText<"Escalate to errors any warnings about inputs whose architecture does not match the -arch option">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def e : Separate<["-"], "e">,
+-     MetaVarName<"<symbol>">,
+-     HelpText<"Make <symbol> the entry point of an executable (default is \"start\" from crt1.o)">,
+-     Group<grp_rare>;
+-def w : Flag<["-"], "w">,
+-     HelpText<"Suppress all warnings">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def final_output : Separate<["-"], "final_output">,
+-     MetaVarName<"<name>">,
+-     HelpText<"Specify the dylib install name if -install_name is not used--used by compiler driver for multiple -arch arguments">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def arch_multiple : Flag<["-"], "arch_multiple">,
+-     HelpText<"Augment error and warning messages with the architecture name">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def twolevel_namespace_hints : Flag<["-"], "twolevel_namespace_hints">,
+-     HelpText<"This option is obsolete">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def dot : Separate<["-"], "dot">,
+-     MetaVarName<"<path>">,
+-     HelpText<"Write a graph of symbol dependencies to <path> as a .dot file viewable with GraphViz">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def keep_relocs : Flag<["-"], "keep_relocs">,
+-     HelpText<"Retain section-based relocation records in the output, which are ignored at runtime by dyld">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def warn_stabs : Flag<["-"], "warn_stabs">,
+-     HelpText<"Warn when bad stab symbols inside a BINCL/EINCL prevent optimization">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def warn_commons : Flag<["-"], "warn_commons">,
+-     HelpText<"Warn when a tentative definition in an object file matches an external symbol in a dylib, which often means \"extern\" is missing from a variable declaration in a header file">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def read_only_stubs : Flag<["-"], "read_only_stubs">,
+-     HelpText<"On i386, make the __IMPORT segment of a final linked image read-only">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def slow_stubs : Flag<["-"], "slow_stubs">,
+-     HelpText<"This option is obsolete">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def interposable_list : Separate<["-"], "interposable_list">,
+-     MetaVarName<"<path>">,
+-     HelpText<"Access global symbols listed in <path> indirectly">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def no_function_starts : Flag<["-"], "no_function_starts">,
+-     HelpText<"Do not creates a compressed table of function start addresses">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def no_objc_category_merging : Flag<["-"], "no_objc_category_merging">,
+-     HelpText<"Do not merge Objective-C categories into their classes">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def object_path_lto : Separate<["-"], "object_path_lto">,
+-     MetaVarName<"<path>">,
+-     HelpText<"Retain any temporary mach-o file in <path> that would otherwise be deleted during LTO">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def lto_library : Separate<["-"], "lto_library">,
+-     MetaVarName<"<path>">,
+-     HelpText<"Override the default ../lib/libLTO.dylib as <path>">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def cache_path_lto : Separate<["-"], "cache_path_lto">,
+-     MetaVarName<"<path>">,
+-     HelpText<"Use <path> as a directory for the incremental LTO cache">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def prune_interval_lto : Separate<["-"], "prune_interval_lto">,
+-     MetaVarName<"<seconds>">,
+-     HelpText<"Prune the incremental LTO cache after <seconds> (-1 disables pruning)">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def prune_after_lto : Separate<["-"], "prune_after_lto">,
+-     MetaVarName<"<seconds>">,
+-     HelpText<"Remove LTO cache entries after <seconds>">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def max_relative_cache_size_lto : Separate<["-"], "max_relative_cache_size_lto">,
+-     MetaVarName<"<percent>">,
+-     HelpText<"Limit the incremental LTO cache growth to <percent> of free disk, space">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def page_align_data_atoms : Flag<["-"], "page_align_data_atoms">,
+-     HelpText<"Distribute global variables on separate pages so page used/dirty status can guide creation of an order file to cluster commonly used/dirty globals">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-def not_for_dyld_shared_cache : Flag<["-"], "not_for_dyld_shared_cache">,
+-     HelpText<"Prevent system dylibs from being placed into the dylib shared cache">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_rare>;
+-
+-def grp_deprecated : OptionGroup<"deprecated">, HelpText<"DEPRECATED">;
+-
+-def lazy_framework : Separate<["-"], "lazy_framework">,
+-     MetaVarName<"<name>">,
+-     HelpText<"This option is deprecated and is now an alias for -framework.">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_deprecated>;
+-def lazy_library : Separate<["-"], "lazy_library">,
+-     MetaVarName<"<path>">,
+-     HelpText<"This option is deprecated and is now an alias for regular linking">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_deprecated>;
+-def lazy_l : Joined<["-"], "lazy-l">,
+-     MetaVarName<"<name>">,
+-     HelpText<"This option is deprecated and is now an alias for -l<path>.">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_deprecated>;
+-def single_module : Flag<["-"], "single_module">,
+-     HelpText<"Unnecessary option: this is already the default">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_deprecated>;
+-def no_dead_strip_inits_and_terms : Flag<["-"], "no_dead_strip_inits_and_terms">,
+-     HelpText<"Unnecessary option: initialization and termination are roots of the dead strip graph, so never dead stripped">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_deprecated>;
+-def noall_load : Flag<["-"], "noall_load">,
+-     HelpText<"Unnecessary option: this is already the default">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_deprecated>;
+-
+-def grp_obsolete : OptionGroup<"obsolete">, HelpText<"OBSOLETE">;
+-
+-def y : Joined<["-"], "y">,
+-     MetaVarName<"<symbol>">,
+-     HelpText<"This option is obsolete in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_obsolete>;
+-def sectobjectsymbols : MultiArg<["-"], "sectobjectsymbols", 2>,
+-     MetaVarName<"<segname> <sectname>">,
+-     HelpText<"This option is obsolete in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_obsolete>;
+-def nofixprebinding : Flag<["-"], "nofixprebinding">,
+-     HelpText<"This option is obsolete in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_obsolete>;
+-def noprebind_all_twolevel_modules : Flag<["-"], "noprebind_all_twolevel_modules">,
+-     HelpText<"This option is obsolete in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_obsolete>;
+-def prebind_all_twolevel_modules : Flag<["-"], "prebind_all_twolevel_modules">,
+-     HelpText<"This option is obsolete in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_obsolete>;
+-def prebind_allow_overlap : Flag<["-"], "prebind_allow_overlap">,
+-     HelpText<"This option is obsolete in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_obsolete>;
+-def noprebind : Flag<["-"], "noprebind">,
+-     HelpText<"This option is obsolete in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_obsolete>;
+-def sect_diff_relocs : Separate<["-"], "sect_diff_relocs">,
+-     MetaVarName<"<treatment>">,
+-     HelpText<"This option is obsolete in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_obsolete>;
+-def A : Separate<["-"], "A">,
+-     MetaVarName<"<basefile>">,
+-     HelpText<"This option is obsolete in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_obsolete>;
+-def b : Flag<["-"], "b">,
+-     HelpText<"This option is obsolete in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_obsolete>;
+-def Sn : Flag<["-"], "Sn">,
+-     HelpText<"This option is obsolete in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_obsolete>;
+-def Si : Flag<["-"], "Si">,
+-     HelpText<"This option is obsolete in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_obsolete>;
+-def Sp : Flag<["-"], "Sp">,
+-     HelpText<"This option is obsolete in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_obsolete>;
+-def X : Flag<["-"], "X">,
+-     HelpText<"This option is obsolete in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_obsolete>;
+-def s : Flag<["-"], "s">,
+-     HelpText<"This option is obsolete in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_obsolete>;
+-def m : Flag<["-"], "m">,
+-     HelpText<"This option is obsolete in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_obsolete>;
+-def Y : Separate<["-"], "Y">,
+-     MetaVarName<"<number>">,
+-     HelpText<"This option is obsolete in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_obsolete>;
+-def nomultidefs : Flag<["-"], "nomultidefs">,
+-     HelpText<"This option is obsolete in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_obsolete>;
+-def multiply_defined_unused : Separate<["-"], "multiply_defined_unused">,
+-     MetaVarName<"<treatment>">,
+-     HelpText<"This option is obsolete in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_obsolete>;
+-def multiply_defined : Separate<["-"], "multiply_defined">,
+-     MetaVarName<"<treatment>">,
+-     HelpText<"This option is obsolete in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_obsolete>;
+-def private_bundle : Flag<["-"], "private_bundle">,
+-     HelpText<"This option is obsolete in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_obsolete>;
+-def seg_addr_table_filename : Separate<["-"], "seg_addr_table_filename">,
+-     MetaVarName<"<path>">,
+-     HelpText<"This option is obsolete in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_obsolete>;
+-def sectorder_detail : Flag<["-"], "sectorder_detail">,
+-     HelpText<"This option is obsolete in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_obsolete>;
+-def no_compact_linkedit : Flag<["-"], "no_compact_linkedit">,
+-     HelpText<"This option is obsolete in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_obsolete>;
+-def dependent_dr_info : Flag<["-"], "dependent_dr_info">,
+-     HelpText<"This option is obsolete in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_obsolete>;
+-def no_dependent_dr_info : Flag<["-"], "no_dependent_dr_info">,
+-     HelpText<"This option is obsolete in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_obsolete>;
+-def seglinkedit : Flag<["-"], "seglinkedit">,
+-     HelpText<"This option is obsolete in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_obsolete>;
+-def noseglinkedit : Flag<["-"], "noseglinkedit">,
+-     HelpText<"This option is obsolete in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_obsolete>;
+-def fvmlib : Flag<["-"], "fvmlib">,
+-     HelpText<"This option is obsolete in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_obsolete>;
+-def run_init_lazily : Flag<["-"], "run_init_lazily">,
+-     HelpText<"This option is obsolete in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_obsolete>;
+-
+-def grp_undocumented : OptionGroup<"undocumented">, HelpText<"UNDOCUMENTED">;
+-
+-def add_ast_path : Flag<["-"], "add_ast_path">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def add_linker_option : Flag<["-"], "add_linker_option">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def add_source_version : Flag<["-"], "add_source_version">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def no_source_version : Flag<["-"], "no_source_version">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def add_split_seg_info : Flag<["-"], "add_split_seg_info">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def allow_dead_duplicates : Flag<["-"], "allow_dead_duplicates">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def allow_simulator_linking_to_macosx_dylibs : Flag<["-"], "allow_simulator_linking_to_macosx_dylibs">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def bitcode_process_mode : Flag<["-"], "bitcode_process_mode">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def bitcode_verify : Flag<["-"], "bitcode_verify">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def classic_linker : Flag<["-"], "classic_linker">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def data_const : Flag<["-"], "data_const">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def no_data_const : Flag<["-"], "no_data_const">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def data_in_code_info : Flag<["-"], "data_in_code_info">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def no_data_in_code_info : Flag<["-"], "no_data_in_code_info">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def debug_snapshot : Flag<["-"], "debug_snapshot">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def demangle : Flag<["-"], "demangle">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def dependency_info : Flag<["-"], "dependency_info">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def dyld_env : Flag<["-"], "dyld_env">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def encryptable : Flag<["-"], "encryptable">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def executable_path : Flag<["-"], "executable_path">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def fixup_chains : Flag<["-"], "fixup_chains">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def fixup_chains_section : Flag<["-"], "fixup_chains_section">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def flto_codegen_only : Flag<["-"], "flto-codegen-only">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def force_load_swift_libs : Flag<["-"], "force_load_swift_libs">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def force_symbol_not_weak : Flag<["-"], "force_symbol_not_weak">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def force_symbols_coalesce_list : Flag<["-"], "force_symbols_coalesce_list">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def force_symbols_not_weak_list : Flag<["-"], "force_symbols_not_weak_list">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def force_symbols_weak_list : Flag<["-"], "force_symbols_weak_list">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def force_symbol_weak : Flag<["-"], "force_symbol_weak">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def function_starts : Flag<["-"], "function_starts">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def i : Flag<["-"], "i">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def ignore_auto_link : Flag<["-"], "ignore_auto_link">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def ignore_optimization_hints : Flag<["-"], "ignore_optimization_hints">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def init_offsets : Flag<["-"], "init_offsets">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def keep_dwarf_unwind : Flag<["-"], "keep_dwarf_unwind">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def no_keep_dwarf_unwind : Flag<["-"], "no_keep_dwarf_unwind">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def kext : Flag<["-"], "kext">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def kext_objects_dir : Flag<["-"], "kext_objects_dir">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def no_kext_objects : Flag<["-"], "no_kext_objects">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def kexts_use_stubs : Flag<["-"], "kexts_use_stubs">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def maccatalyst_version_min : Flag<["-"], "maccatalyst_version_min">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def iosmac_version_min : Flag<["-"], "iosmac_version_min">,
+-     Alias<maccatalyst_version_min>,
+-     HelpText<"Alias for -maccatalyst_version_min">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def uikitformac_version_min : Flag<["-"], "uikitformac_version_min">,
+-     Alias<maccatalyst_version_min>,
+-     HelpText<"Alias for -maccatalyst_version_min">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def mcpu : Flag<["-"], "mcpu">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def mllvm : Flag<["-"], "mllvm">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def no_compact_unwind : Flag<["-"], "no_compact_unwind">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def no_dtrace_dof : Flag<["-"], "no_dtrace_dof">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def no_encryption : Flag<["-"], "no_encryption">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def no_new_main : Flag<["-"], "no_new_main">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def objc_abi_version : Flag<["-"], "objc_abi_version">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def pause : Flag<["-"], "pause">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def random_uuid : Flag<["-"], "random_uuid">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def save_temps : Flag<["-"], "save-temps">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def sdk_version : Flag<["-"], "sdk_version">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def simulator_support : Flag<["-"], "simulator_support">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def snapshot_dir : Flag<["-"], "snapshot_dir">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def source_version : Flag<["-"], "source_version">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def text_exec : Flag<["-"], "text_exec">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def threaded_starts_section : Flag<["-"], "threaded_starts_section">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def twolevel_namespace : Flag<["-"], "twolevel_namespace">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def verbose_optimization_hints : Flag<["-"], "verbose_optimization_hints">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-def version_load_command : Flag<["-"], "version_load_command">,
+-     HelpText<"This option is undocumented in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_undocumented>;
+-
+-def grp_ignored : OptionGroup<"ignored">, HelpText<"IGNORED">;
+-
+-def M : Flag<["-"], "M">,
+-     HelpText<"This option is ignored in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_ignored>;
+-def new_linker : Flag<["-"], "new_linker">,
+-     HelpText<"This option is ignored in ld64">,
+-     Flags<[HelpHidden]>,
+-     Group<grp_ignored>;
+diff --git a/lld/MachO/OutputSection.cpp b/lld/MachO/OutputSection.cpp
+deleted file mode 100644
+index c006828267c..00000000000
+--- a/lld/MachO/OutputSection.cpp
++++ /dev/null
+@@ -1,18 +0,0 @@
+-//===- OutputSection.cpp --------------------------------------------------===//
+-//
+-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+-// See https://llvm.org/LICENSE.txt for license information.
+-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+-//
+-//===----------------------------------------------------------------------===//
+-
+-#include "OutputSection.h"
+-#include "OutputSegment.h"
+-
+-using namespace llvm;
+-using namespace lld;
+-using namespace lld::macho;
+-
+-uint64_t OutputSection::getSegmentOffset() const {
+-  return addr - parent->firstSection()->addr;
+-}
+diff --git a/lld/MachO/OutputSection.h b/lld/MachO/OutputSection.h
+deleted file mode 100644
+index 07b53a04639..00000000000
+--- a/lld/MachO/OutputSection.h
++++ /dev/null
+@@ -1,74 +0,0 @@
+-//===- OutputSection.h ------------------------------------------*- C++ -*-===//
+-//
+-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+-// See https://llvm.org/LICENSE.txt for license information.
+-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+-//
+-//===----------------------------------------------------------------------===//
+-
+-#ifndef LLD_MACHO_OUTPUT_SECTION_H
+-#define LLD_MACHO_OUTPUT_SECTION_H
+-
+-#include "lld/Common/LLVM.h"
+-#include "llvm/ADT/DenseMap.h"
+-
+-namespace lld {
+-namespace macho {
+-
+-class InputSection;
+-class OutputSegment;
+-
+-// Output sections represent the finalized sections present within the final
+-// linked executable. They can represent special sections (like the symbol
+-// table), or represent coalesced sections from the various inputs given to the
+-// linker with the same segment / section name.
+-class OutputSection {
+-public:
+-  enum Kind {
+-    MergedKind,
+-    SyntheticKind,
+-  };
+-
+-  OutputSection(Kind kind, StringRef name) : name(name), sectionKind(kind) {}
+-  virtual ~OutputSection() = default;
+-  Kind kind() const { return sectionKind; }
+-
+-  // These accessors will only be valid after finalizing the section.
+-  uint64_t getSegmentOffset() const;
+-
+-  // How much space the section occupies in the address space.
+-  virtual uint64_t getSize() const = 0;
+-  // How much space the section occupies in the file. Most sections are copied
+-  // as-is so their file size is the same as their address space size.
+-  virtual uint64_t getFileSize() const { return getSize(); }
+-
+-  // Hidden sections omit header content, but body content may still be present.
+-  virtual bool isHidden() const { return false; }
+-  // Unneeded sections are omitted entirely (header and body).
+-  virtual bool isNeeded() const { return true; }
+-
+-  // Specifically finalizes addresses and section size, not content.
+-  virtual void finalize() {
+-    // TODO investigate refactoring synthetic section finalization logic into
+-    // overrides of this function.
+-  }
+-
+-  virtual void writeTo(uint8_t *buf) const = 0;
+-
+-  StringRef name;
+-  OutputSegment *parent = nullptr;
+-
+-  uint32_t index = 0;
+-  uint64_t addr = 0;
+-  uint64_t fileOff = 0;
+-  uint32_t align = 1;
+-  uint32_t flags = 0;
+-
+-private:
+-  Kind sectionKind;
+-};
+-
+-} // namespace macho
+-} // namespace lld
+-
+-#endif
+diff --git a/lld/MachO/OutputSegment.cpp b/lld/MachO/OutputSegment.cpp
+deleted file mode 100644
+index 5e57c49f5c0..00000000000
+--- a/lld/MachO/OutputSegment.cpp
++++ /dev/null
+@@ -1,67 +0,0 @@
+-//===- OutputSegment.cpp --------------------------------------------------===//
+-//
+-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+-// See https://llvm.org/LICENSE.txt for license information.
+-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+-//
+-//===----------------------------------------------------------------------===//
+-
+-#include "OutputSegment.h"
+-#include "InputSection.h"
+-#include "MergedOutputSection.h"
+-#include "SyntheticSections.h"
+-
+-#include "lld/Common/ErrorHandler.h"
+-#include "lld/Common/Memory.h"
+-#include "llvm/BinaryFormat/MachO.h"
+-
+-using namespace llvm;
+-using namespace llvm::MachO;
+-using namespace lld;
+-using namespace lld::macho;
+-
+-static uint32_t initProt(StringRef name) {
+-  if (name == segment_names::text)
+-    return VM_PROT_READ | VM_PROT_EXECUTE;
+-  if (name == segment_names::pageZero)
+-    return 0;
+-  if (name == segment_names::linkEdit)
+-    return VM_PROT_READ;
+-  return VM_PROT_READ | VM_PROT_WRITE;
+-}
+-
+-static uint32_t maxProt(StringRef name) {
+-  if (name == segment_names::pageZero)
+-    return 0;
+-  return VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE;
+-}
+-
+-size_t OutputSegment::numNonHiddenSections() const {
+-  size_t count = 0;
+-  for (const OutputSection *osec : sections) {
+-    count += (!osec->isHidden() ? 1 : 0);
+-  }
+-  return count;
+-}
+-
+-void OutputSegment::addOutputSection(OutputSection *osec) {
+-  osec->parent = this;
+-  sections.push_back(osec);
+-}
+-
+-static llvm::DenseMap<StringRef, OutputSegment *> nameToOutputSegment;
+-std::vector<OutputSegment *> macho::outputSegments;
+-
+-OutputSegment *macho::getOrCreateOutputSegment(StringRef name) {
+-  OutputSegment *&segRef = nameToOutputSegment[name];
+-  if (segRef != nullptr)
+-    return segRef;
+-
+-  segRef = make<OutputSegment>();
+-  segRef->name = name;
+-  segRef->maxProt = maxProt(name);
+-  segRef->initProt = initProt(name);
+-
+-  outputSegments.push_back(segRef);
+-  return segRef;
+-}
+diff --git a/lld/MachO/OutputSegment.h b/lld/MachO/OutputSegment.h
+deleted file mode 100644
+index d977c281272..00000000000
+--- a/lld/MachO/OutputSegment.h
++++ /dev/null
+@@ -1,62 +0,0 @@
+-//===- OutputSegment.h ------------------------------------------*- C++ -*-===//
+-//
+-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+-// See https://llvm.org/LICENSE.txt for license information.
+-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+-//
+-//===----------------------------------------------------------------------===//
+-
+-#ifndef LLD_MACHO_OUTPUT_SEGMENT_H
+-#define LLD_MACHO_OUTPUT_SEGMENT_H
+-
+-#include "OutputSection.h"
+-#include "lld/Common/LLVM.h"
+-
+-namespace lld {
+-namespace macho {
+-
+-namespace segment_names {
+-
+-constexpr const char pageZero[] = "__PAGEZERO";
+-constexpr const char text[] = "__TEXT";
+-constexpr const char data[] = "__DATA";
+-constexpr const char linkEdit[] = "__LINKEDIT";
+-constexpr const char dataConst[] = "__DATA_CONST";
+-
+-} // namespace segment_names
+-
+-class OutputSection;
+-class InputSection;
+-
+-class OutputSegment {
+-public:
+-  const OutputSection *firstSection() const { return sections.front(); }
+-  const OutputSection *lastSection() const { return sections.back(); }
+-
+-  void addOutputSection(OutputSection *os);
+-  void sortOutputSections(
+-      llvm::function_ref<bool(OutputSection *, OutputSection *)> comparator) {
+-    llvm::stable_sort(sections, comparator);
+-  }
+-
+-  const std::vector<OutputSection *> &getSections() const { return sections; }
+-  size_t numNonHiddenSections() const;
+-
+-  uint64_t fileOff = 0;
+-  StringRef name;
+-  uint32_t maxProt = 0;
+-  uint32_t initProt = 0;
+-  uint8_t index;
+-
+-private:
+-  std::vector<OutputSection *> sections;
+-};
+-
+-extern std::vector<OutputSegment *> outputSegments;
+-
+-OutputSegment *getOrCreateOutputSegment(StringRef name);
+-
+-} // namespace macho
+-} // namespace lld
+-
+-#endif
+diff --git a/lld/MachO/SymbolTable.cpp b/lld/MachO/SymbolTable.cpp
+deleted file mode 100644
+index 80e870d7989..00000000000
+--- a/lld/MachO/SymbolTable.cpp
++++ /dev/null
+@@ -1,87 +0,0 @@
+-//===- SymbolTable.cpp ----------------------------------------------------===//
+-//
+-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+-// See https://llvm.org/LICENSE.txt for license information.
+-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+-//
+-//===----------------------------------------------------------------------===//
+-
+-#include "SymbolTable.h"
+-#include "InputFiles.h"
+-#include "Symbols.h"
+-#include "lld/Common/ErrorHandler.h"
+-#include "lld/Common/Memory.h"
+-
+-using namespace llvm;
+-using namespace lld;
+-using namespace lld::macho;
+-
+-Symbol *SymbolTable::find(StringRef name) {
+-  auto it = symMap.find(llvm::CachedHashStringRef(name));
+-  if (it == symMap.end())
+-    return nullptr;
+-  return symVector[it->second];
+-}
+-
+-std::pair<Symbol *, bool> SymbolTable::insert(StringRef name) {
+-  auto p = symMap.insert({CachedHashStringRef(name), (int)symVector.size()});
+-
+-  // Name already present in the symbol table.
+-  if (!p.second)
+-    return {symVector[p.first->second], false};
+-
+-  // Name is a new symbol.
+-  Symbol *sym = reinterpret_cast<Symbol *>(make<SymbolUnion>());
+-  symVector.push_back(sym);
+-  return {sym, true};
+-}
+-
+-Symbol *SymbolTable::addDefined(StringRef name, InputSection *isec,
+-                                uint32_t value) {
+-  Symbol *s;
+-  bool wasInserted;
+-  std::tie(s, wasInserted) = insert(name);
+-
+-  if (!wasInserted && isa<Defined>(s))
+-    error("duplicate symbol: " + name);
+-
+-  replaceSymbol<Defined>(s, name, isec, value);
+-  return s;
+-}
+-
+-Symbol *SymbolTable::addUndefined(StringRef name) {
+-  Symbol *s;
+-  bool wasInserted;
+-  std::tie(s, wasInserted) = insert(name);
+-
+-  if (wasInserted)
+-    replaceSymbol<Undefined>(s, name);
+-  else if (LazySymbol *lazy = dyn_cast<LazySymbol>(s))
+-    lazy->fetchArchiveMember();
+-  return s;
+-}
+-
+-Symbol *SymbolTable::addDylib(StringRef name, DylibFile *file) {
+-  Symbol *s;
+-  bool wasInserted;
+-  std::tie(s, wasInserted) = insert(name);
+-
+-  if (wasInserted || isa<Undefined>(s))
+-    replaceSymbol<DylibSymbol>(s, file, name);
+-  return s;
+-}
+-
+-Symbol *SymbolTable::addLazy(StringRef name, ArchiveFile *file,
+-                             const llvm::object::Archive::Symbol &sym) {
+-  Symbol *s;
+-  bool wasInserted;
+-  std::tie(s, wasInserted) = insert(name);
+-
+-  if (wasInserted)
+-    replaceSymbol<LazySymbol>(s, file, sym);
+-  else if (isa<Undefined>(s))
+-    file->fetch(sym);
+-  return s;
+-}
+-
+-SymbolTable *macho::symtab;
+diff --git a/lld/MachO/SymbolTable.h b/lld/MachO/SymbolTable.h
+deleted file mode 100644
+index 2379008db56..00000000000
+--- a/lld/MachO/SymbolTable.h
++++ /dev/null
+@@ -1,50 +0,0 @@
+-//===- SymbolTable.h --------------------------------------------*- C++ -*-===//
+-//
+-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+-// See https://llvm.org/LICENSE.txt for license information.
+-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+-//
+-//===----------------------------------------------------------------------===//
+-
+-#ifndef LLD_MACHO_SYMBOL_TABLE_H
+-#define LLD_MACHO_SYMBOL_TABLE_H
+-
+-#include "lld/Common/LLVM.h"
+-#include "llvm/ADT/CachedHashString.h"
+-#include "llvm/ADT/DenseMap.h"
+-#include "llvm/Object/Archive.h"
+-
+-namespace lld {
+-namespace macho {
+-
+-class ArchiveFile;
+-class DylibFile;
+-class InputSection;
+-class Symbol;
+-
+-class SymbolTable {
+-public:
+-  Symbol *addDefined(StringRef name, InputSection *isec, uint32_t value);
+-
+-  Symbol *addUndefined(StringRef name);
+-
+-  Symbol *addDylib(StringRef name, DylibFile *file);
+-
+-  Symbol *addLazy(StringRef name, ArchiveFile *file,
+-                  const llvm::object::Archive::Symbol &sym);
+-
+-  ArrayRef<Symbol *> getSymbols() const { return symVector; }
+-  Symbol *find(StringRef name);
+-
+-private:
+-  std::pair<Symbol *, bool> insert(StringRef name);
+-  llvm::DenseMap<llvm::CachedHashStringRef, int> symMap;
+-  std::vector<Symbol *> symVector;
+-};
+-
+-extern SymbolTable *symtab;
+-
+-} // namespace macho
+-} // namespace lld
+-
+-#endif
+diff --git a/lld/MachO/Symbols.cpp b/lld/MachO/Symbols.cpp
+deleted file mode 100644
+index fbafa8a92a4..00000000000
+--- a/lld/MachO/Symbols.cpp
++++ /dev/null
+@@ -1,23 +0,0 @@
+-//===- Symbols.cpp --------------------------------------------------------===//
+-//
+-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+-// See https://llvm.org/LICENSE.txt for license information.
+-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+-//
+-//===----------------------------------------------------------------------===//
+-
+-#include "Symbols.h"
+-#include "InputFiles.h"
+-
+-using namespace llvm;
+-using namespace lld;
+-using namespace lld::macho;
+-
+-void LazySymbol::fetchArchiveMember() { file->fetch(sym); }
+-
+-// Returns a symbol for an error message.
+-std::string lld::toString(const Symbol &sym) {
+-  if (Optional<std::string> s = demangleItanium(sym.getName()))
+-    return *s;
+-  return std::string(sym.getName());
+-}
+diff --git a/lld/MachO/Symbols.h b/lld/MachO/Symbols.h
+deleted file mode 100644
+index 63748ee4832..00000000000
+--- a/lld/MachO/Symbols.h
++++ /dev/null
+@@ -1,138 +0,0 @@
+-//===- Symbols.h ------------------------------------------------*- C++ -*-===//
+-//
+-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+-// See https://llvm.org/LICENSE.txt for license information.
+-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+-//
+-//===----------------------------------------------------------------------===//
+-
+-#ifndef LLD_MACHO_SYMBOLS_H
+-#define LLD_MACHO_SYMBOLS_H
+-
+-#include "InputSection.h"
+-#include "Target.h"
+-#include "lld/Common/ErrorHandler.h"
+-#include "lld/Common/Strings.h"
+-#include "llvm/Object/Archive.h"
+-
+-namespace lld {
+-namespace macho {
+-
+-class InputSection;
+-class DylibFile;
+-class ArchiveFile;
+-
+-struct StringRefZ {
+-  StringRefZ(const char *s) : data(s), size(-1) {}
+-  StringRefZ(StringRef s) : data(s.data()), size(s.size()) {}
+-
+-  const char *data;
+-  const uint32_t size;
+-};
+-
+-class Symbol {
+-public:
+-  enum Kind {
+-    DefinedKind,
+-    UndefinedKind,
+-    DylibKind,
+-    LazyKind,
+-  };
+-
+-  Kind kind() const { return static_cast<Kind>(symbolKind); }
+-
+-  StringRef getName() const { return {name.data, name.size}; }
+-
+-  uint64_t getVA() const;
+-
+-  uint64_t getFileOffset() const;
+-
+-  uint32_t gotIndex = UINT32_MAX;
+-
+-protected:
+-  Symbol(Kind k, StringRefZ name) : symbolKind(k), name(name) {}
+-
+-  Kind symbolKind;
+-  StringRefZ name;
+-};
+-
+-class Defined : public Symbol {
+-public:
+-  Defined(StringRefZ name, InputSection *isec, uint32_t value)
+-      : Symbol(DefinedKind, name), isec(isec), value(value) {}
+-
+-  InputSection *isec;
+-  uint32_t value;
+-
+-  static bool classof(const Symbol *s) { return s->kind() == DefinedKind; }
+-};
+-
+-class Undefined : public Symbol {
+-public:
+-  Undefined(StringRefZ name) : Symbol(UndefinedKind, name) {}
+-
+-  static bool classof(const Symbol *s) { return s->kind() == UndefinedKind; }
+-};
+-
+-class DylibSymbol : public Symbol {
+-public:
+-  DylibSymbol(DylibFile *file, StringRefZ name)
+-      : Symbol(DylibKind, name), file(file) {}
+-
+-  static bool classof(const Symbol *s) { return s->kind() == DylibKind; }
+-
+-  DylibFile *file;
+-  uint32_t stubsIndex = UINT32_MAX;
+-  uint32_t lazyBindOffset = UINT32_MAX;
+-};
+-
+-class LazySymbol : public Symbol {
+-public:
+-  LazySymbol(ArchiveFile *file, const llvm::object::Archive::Symbol &sym)
+-      : Symbol(LazyKind, sym.getName()), file(file), sym(sym) {}
+-
+-  static bool classof(const Symbol *s) { return s->kind() == LazyKind; }
+-
+-  void fetchArchiveMember();
+-
+-private:
+-  ArchiveFile *file;
+-  const llvm::object::Archive::Symbol sym;
+-};
+-
+-inline uint64_t Symbol::getVA() const {
+-  if (auto *d = dyn_cast<Defined>(this))
+-    return d->isec->getVA() + d->value;
+-  return 0;
+-}
+-
+-inline uint64_t Symbol::getFileOffset() const {
+-  if (auto *d = dyn_cast<Defined>(this))
+-    return d->isec->getFileOffset() + d->value;
+-  llvm_unreachable("attempt to get an offset from an undefined symbol");
+-}
+-
+-union SymbolUnion {
+-  alignas(Defined) char a[sizeof(Defined)];
+-  alignas(Undefined) char b[sizeof(Undefined)];
+-  alignas(DylibSymbol) char c[sizeof(DylibSymbol)];
+-  alignas(LazySymbol) char d[sizeof(LazySymbol)];
+-};
+-
+-template <typename T, typename... ArgT>
+-void replaceSymbol(Symbol *s, ArgT &&... arg) {
+-  static_assert(sizeof(T) <= sizeof(SymbolUnion), "SymbolUnion too small");
+-  static_assert(alignof(T) <= alignof(SymbolUnion),
+-                "SymbolUnion not aligned enough");
+-  assert(static_cast<Symbol *>(static_cast<T *>(nullptr)) == nullptr &&
+-         "Not a Symbol");
+-
+-  new (s) T(std::forward<ArgT>(arg)...);
+-}
+-
+-} // namespace macho
+-
+-std::string toString(const macho::Symbol &);
+-} // namespace lld
+-
+-#endif
+diff --git a/lld/MachO/SyntheticSections.cpp b/lld/MachO/SyntheticSections.cpp
+deleted file mode 100644
+index cc0d5a93c40..00000000000
+--- a/lld/MachO/SyntheticSections.cpp
++++ /dev/null
+@@ -1,409 +0,0 @@
+-//===- SyntheticSections.cpp ---------------------------------------------===//
+-//
+-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+-// See https://llvm.org/LICENSE.txt for license information.
+-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+-//
+-//===----------------------------------------------------------------------===//
+-
+-#include "SyntheticSections.h"
+-#include "Config.h"
+-#include "ExportTrie.h"
+-#include "InputFiles.h"
+-#include "MachOStructs.h"
+-#include "MergedOutputSection.h"
+-#include "OutputSegment.h"
+-#include "SymbolTable.h"
+-#include "Symbols.h"
+-#include "Writer.h"
+-
+-#include "lld/Common/ErrorHandler.h"
+-#include "lld/Common/Memory.h"
+-#include "llvm/Support/EndianStream.h"
+-#include "llvm/Support/LEB128.h"
+-
+-using namespace llvm;
+-using namespace llvm::support;
+-using namespace llvm::support::endian;
+-using namespace lld;
+-using namespace lld::macho;
+-
+-InStruct macho::in;
+-std::vector<SyntheticSection *> macho::syntheticSections;
+-
+-SyntheticSection::SyntheticSection(const char *segname, const char *name)
+-    : OutputSection(SyntheticKind, name), segname(segname) {
+-  syntheticSections.push_back(this);
+-}
+-
+-// dyld3's MachOLoaded::getSlide() assumes that the __TEXT segment starts
+-// from the beginning of the file (i.e. the header).
+-MachHeaderSection::MachHeaderSection()
+-    : SyntheticSection(segment_names::text, section_names::header) {}
+-
+-void MachHeaderSection::addLoadCommand(LoadCommand *lc) {
+-  loadCommands.push_back(lc);
+-  sizeOfCmds += lc->getSize();
+-}
+-
+-uint64_t MachHeaderSection::getSize() const {
+-  return sizeof(MachO::mach_header_64) + sizeOfCmds;
+-}
+-
+-void MachHeaderSection::writeTo(uint8_t *buf) const {
+-  auto *hdr = reinterpret_cast<MachO::mach_header_64 *>(buf);
+-  hdr->magic = MachO::MH_MAGIC_64;
+-  hdr->cputype = MachO::CPU_TYPE_X86_64;
+-  hdr->cpusubtype = MachO::CPU_SUBTYPE_X86_64_ALL | MachO::CPU_SUBTYPE_LIB64;
+-  hdr->filetype = config->outputType;
+-  hdr->ncmds = loadCommands.size();
+-  hdr->sizeofcmds = sizeOfCmds;
+-  hdr->flags = MachO::MH_NOUNDEFS | MachO::MH_DYLDLINK | MachO::MH_TWOLEVEL;
+-  if (config->outputType == MachO::MH_DYLIB && !config->hasReexports)
+-    hdr->flags |= MachO::MH_NO_REEXPORTED_DYLIBS;
+-
+-  uint8_t *p = reinterpret_cast<uint8_t *>(hdr + 1);
+-  for (LoadCommand *lc : loadCommands) {
+-    lc->writeTo(p);
+-    p += lc->getSize();
+-  }
+-}
+-
+-PageZeroSection::PageZeroSection()
+-    : SyntheticSection(segment_names::pageZero, section_names::pageZero) {}
+-
+-GotSection::GotSection()
+-    : SyntheticSection(segment_names::dataConst, section_names::got) {
+-  align = 8;
+-  flags = MachO::S_NON_LAZY_SYMBOL_POINTERS;
+-
+-  // TODO: section_64::reserved1 should be an index into the indirect symbol
+-  // table, which we do not currently emit
+-}
+-
+-void GotSection::addEntry(Symbol &sym) {
+-  if (entries.insert(&sym)) {
+-    sym.gotIndex = entries.size() - 1;
+-  }
+-}
+-
+-void GotSection::writeTo(uint8_t *buf) const {
+-  for (size_t i = 0, n = entries.size(); i < n; ++i)
+-    if (auto *defined = dyn_cast<Defined>(entries[i]))
+-      write64le(&buf[i * WordSize], defined->getVA());
+-}
+-
+-BindingSection::BindingSection()
+-    : SyntheticSection(segment_names::linkEdit, section_names::binding) {}
+-
+-bool BindingSection::isNeeded() const {
+-  return bindings.size() != 0 || in.got->isNeeded();
+-}
+-
+-namespace {
+-struct Binding {
+-  OutputSegment *segment = nullptr;
+-  uint64_t offset = 0;
+-  int64_t addend = 0;
+-  uint8_t ordinal = 0;
+-};
+-} // namespace
+-
+-// Encode a sequence of opcodes that tell dyld to write the address of dysym +
+-// addend at osec->addr + outSecOff.
+-//
+-// The bind opcode "interpreter" remembers the values of each binding field, so
+-// we only need to encode the differences between bindings. Hence the use of
+-// lastBinding.
+-static void encodeBinding(const DylibSymbol &dysym, const OutputSection *osec,
+-                          uint64_t outSecOff, int64_t addend,
+-                          Binding &lastBinding, raw_svector_ostream &os) {
+-  using namespace llvm::MachO;
+-  OutputSegment *seg = osec->parent;
+-  uint64_t offset = osec->getSegmentOffset() + outSecOff;
+-  if (lastBinding.segment != seg) {
+-    os << static_cast<uint8_t>(BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB |
+-                               seg->index);
+-    encodeULEB128(offset, os);
+-    lastBinding.segment = seg;
+-    lastBinding.offset = offset;
+-  } else if (lastBinding.offset != offset) {
+-    assert(lastBinding.offset <= offset);
+-    os << static_cast<uint8_t>(BIND_OPCODE_ADD_ADDR_ULEB);
+-    encodeULEB128(offset - lastBinding.offset, os);
+-    lastBinding.offset = offset;
+-  }
+-
+-  if (lastBinding.ordinal != dysym.file->ordinal) {
+-    if (dysym.file->ordinal <= BIND_IMMEDIATE_MASK) {
+-      os << static_cast<uint8_t>(BIND_OPCODE_SET_DYLIB_ORDINAL_IMM |
+-                                 dysym.file->ordinal);
+-    } else {
+-      error("TODO: Support larger dylib symbol ordinals");
+-      return;
+-    }
+-    lastBinding.ordinal = dysym.file->ordinal;
+-  }
+-
+-  if (lastBinding.addend != addend) {
+-    os << static_cast<uint8_t>(BIND_OPCODE_SET_ADDEND_SLEB);
+-    encodeSLEB128(addend, os);
+-    lastBinding.addend = addend;
+-  }
+-
+-  os << static_cast<uint8_t>(BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM)
+-     << dysym.getName() << '\0'
+-     << static_cast<uint8_t>(BIND_OPCODE_SET_TYPE_IMM | BIND_TYPE_POINTER)
+-     << static_cast<uint8_t>(BIND_OPCODE_DO_BIND);
+-  // DO_BIND causes dyld to both perform the binding and increment the offset
+-  lastBinding.offset += WordSize;
+-}
+-
+-// Emit bind opcodes, which are a stream of byte-sized opcodes that dyld
+-// interprets to update a record with the following fields:
+-//  * segment index (of the segment to write the symbol addresses to, typically
+-//    the __DATA_CONST segment which contains the GOT)
+-//  * offset within the segment, indicating the next location to write a binding
+-//  * symbol type
+-//  * symbol library ordinal (the index of its library's LC_LOAD_DYLIB command)
+-//  * symbol name
+-//  * addend
+-// When dyld sees BIND_OPCODE_DO_BIND, it uses the current record state to bind
+-// a symbol in the GOT, and increments the segment offset to point to the next
+-// entry. It does *not* clear the record state after doing the bind, so
+-// subsequent opcodes only need to encode the differences between bindings.
+-void BindingSection::finalizeContents() {
+-  raw_svector_ostream os{contents};
+-  Binding lastBinding;
+-  bool didEncode = false;
+-  size_t gotIdx = 0;
+-  for (const Symbol *sym : in.got->getEntries()) {
+-    if (const auto *dysym = dyn_cast<DylibSymbol>(sym)) {
+-      didEncode = true;
+-      encodeBinding(*dysym, in.got, gotIdx * WordSize, 0, lastBinding, os);
+-    }
+-    ++gotIdx;
+-  }
+-
+-  // Sorting the relocations by segment and address allows us to encode them
+-  // more compactly.
+-  llvm::sort(bindings, [](const BindingEntry &a, const BindingEntry &b) {
+-    OutputSegment *segA = a.isec->parent->parent;
+-    OutputSegment *segB = b.isec->parent->parent;
+-    if (segA != segB)
+-      return segA->fileOff < segB->fileOff;
+-    OutputSection *osecA = a.isec->parent;
+-    OutputSection *osecB = b.isec->parent;
+-    if (osecA != osecB)
+-      return osecA->addr < osecB->addr;
+-    if (a.isec != b.isec)
+-      return a.isec->outSecOff < b.isec->outSecOff;
+-    return a.offset < b.offset;
+-  });
+-  for (const BindingEntry &b : bindings) {
+-    didEncode = true;
+-    encodeBinding(*b.dysym, b.isec->parent, b.isec->outSecOff + b.offset,
+-                  b.addend, lastBinding, os);
+-  }
+-  if (didEncode)
+-    os << static_cast<uint8_t>(MachO::BIND_OPCODE_DONE);
+-}
+-
+-void BindingSection::writeTo(uint8_t *buf) const {
+-  memcpy(buf, contents.data(), contents.size());
+-}
+-
+-StubsSection::StubsSection()
+-    : SyntheticSection(segment_names::text, "__stubs") {}
+-
+-uint64_t StubsSection::getSize() const {
+-  return entries.size() * target->stubSize;
+-}
+-
+-void StubsSection::writeTo(uint8_t *buf) const {
+-  size_t off = 0;
+-  for (const DylibSymbol *sym : in.stubs->getEntries()) {
+-    target->writeStub(buf + off, *sym);
+-    off += target->stubSize;
+-  }
+-}
+-
+-void StubsSection::addEntry(DylibSymbol &sym) {
+-  if (entries.insert(&sym))
+-    sym.stubsIndex = entries.size() - 1;
+-}
+-
+-StubHelperSection::StubHelperSection()
+-    : SyntheticSection(segment_names::text, "__stub_helper") {}
+-
+-uint64_t StubHelperSection::getSize() const {
+-  return target->stubHelperHeaderSize +
+-         in.stubs->getEntries().size() * target->stubHelperEntrySize;
+-}
+-
+-bool StubHelperSection::isNeeded() const {
+-  return !in.stubs->getEntries().empty();
+-}
+-
+-void StubHelperSection::writeTo(uint8_t *buf) const {
+-  target->writeStubHelperHeader(buf);
+-  size_t off = target->stubHelperHeaderSize;
+-  for (const DylibSymbol *sym : in.stubs->getEntries()) {
+-    target->writeStubHelperEntry(buf + off, *sym, addr + off);
+-    off += target->stubHelperEntrySize;
+-  }
+-}
+-
+-void StubHelperSection::setup() {
+-  stubBinder = dyn_cast_or_null<DylibSymbol>(symtab->find("dyld_stub_binder"));
+-  if (stubBinder == nullptr) {
+-    error("symbol dyld_stub_binder not found (normally in libSystem.dylib). "
+-          "Needed to perform lazy binding.");
+-    return;
+-  }
+-  in.got->addEntry(*stubBinder);
+-
+-  inputSections.push_back(in.imageLoaderCache);
+-  symtab->addDefined("__dyld_private", in.imageLoaderCache, 0);
+-}
+-
+-ImageLoaderCacheSection::ImageLoaderCacheSection() {
+-  segname = segment_names::data;
+-  name = "__data";
+-  uint8_t *arr = bAlloc.Allocate<uint8_t>(WordSize);
+-  memset(arr, 0, WordSize);
+-  data = {arr, WordSize};
+-}
+-
+-LazyPointerSection::LazyPointerSection()
+-    : SyntheticSection(segment_names::data, "__la_symbol_ptr") {
+-  align = 8;
+-  flags = MachO::S_LAZY_SYMBOL_POINTERS;
+-}
+-
+-uint64_t LazyPointerSection::getSize() const {
+-  return in.stubs->getEntries().size() * WordSize;
+-}
+-
+-bool LazyPointerSection::isNeeded() const {
+-  return !in.stubs->getEntries().empty();
+-}
+-
+-void LazyPointerSection::writeTo(uint8_t *buf) const {
+-  size_t off = 0;
+-  for (const DylibSymbol *sym : in.stubs->getEntries()) {
+-    uint64_t stubHelperOffset = target->stubHelperHeaderSize +
+-                                sym->stubsIndex * target->stubHelperEntrySize;
+-    write64le(buf + off, in.stubHelper->addr + stubHelperOffset);
+-    off += WordSize;
+-  }
+-}
+-
+-LazyBindingSection::LazyBindingSection()
+-    : SyntheticSection(segment_names::linkEdit, section_names::lazyBinding) {}
+-
+-bool LazyBindingSection::isNeeded() const { return in.stubs->isNeeded(); }
+-
+-void LazyBindingSection::finalizeContents() {
+-  // TODO: Just precompute output size here instead of writing to a temporary
+-  // buffer
+-  for (DylibSymbol *sym : in.stubs->getEntries())
+-    sym->lazyBindOffset = encode(*sym);
+-}
+-
+-void LazyBindingSection::writeTo(uint8_t *buf) const {
+-  memcpy(buf, contents.data(), contents.size());
+-}
+-
+-// Unlike the non-lazy binding section, the bind opcodes in this section aren't
+-// interpreted all at once. Rather, dyld will start interpreting opcodes at a
+-// given offset, typically only binding a single symbol before it finds a
+-// BIND_OPCODE_DONE terminator. As such, unlike in the non-lazy-binding case,
+-// we cannot encode just the differences between symbols; we have to emit the
+-// complete bind information for each symbol.
+-uint32_t LazyBindingSection::encode(const DylibSymbol &sym) {
+-  uint32_t opstreamOffset = contents.size();
+-  OutputSegment *dataSeg = in.lazyPointers->parent;
+-  os << static_cast<uint8_t>(MachO::BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB |
+-                             dataSeg->index);
+-  uint64_t offset = in.lazyPointers->addr - dataSeg->firstSection()->addr +
+-                    sym.stubsIndex * WordSize;
+-  encodeULEB128(offset, os);
+-  if (sym.file->ordinal <= MachO::BIND_IMMEDIATE_MASK)
+-    os << static_cast<uint8_t>(MachO::BIND_OPCODE_SET_DYLIB_ORDINAL_IMM |
+-                               sym.file->ordinal);
+-  else
+-    fatal("TODO: Support larger dylib symbol ordinals");
+-
+-  os << static_cast<uint8_t>(MachO::BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM)
+-     << sym.getName() << '\0'
+-     << static_cast<uint8_t>(MachO::BIND_OPCODE_DO_BIND)
+-     << static_cast<uint8_t>(MachO::BIND_OPCODE_DONE);
+-  return opstreamOffset;
+-}
+-
+-ExportSection::ExportSection()
+-    : SyntheticSection(segment_names::linkEdit, section_names::export_) {}
+-
+-void ExportSection::finalizeContents() {
+-  // TODO: We should check symbol visibility.
+-  for (const Symbol *sym : symtab->getSymbols())
+-    if (auto *defined = dyn_cast<Defined>(sym))
+-      trieBuilder.addSymbol(*defined);
+-  size = trieBuilder.build();
+-}
+-
+-void ExportSection::writeTo(uint8_t *buf) const { trieBuilder.writeTo(buf); }
+-
+-SymtabSection::SymtabSection(StringTableSection &stringTableSection)
+-    : SyntheticSection(segment_names::linkEdit, section_names::symbolTable),
+-      stringTableSection(stringTableSection) {
+-  // TODO: When we introduce the SyntheticSections superclass, we should make
+-  // all synthetic sections aligned to WordSize by default.
+-  align = WordSize;
+-}
+-
+-uint64_t SymtabSection::getSize() const {
+-  return symbols.size() * sizeof(structs::nlist_64);
+-}
+-
+-void SymtabSection::finalizeContents() {
+-  // TODO support other symbol types
+-  for (Symbol *sym : symtab->getSymbols())
+-    if (isa<Defined>(sym))
+-      symbols.push_back({sym, stringTableSection.addString(sym->getName())});
+-}
+-
+-void SymtabSection::writeTo(uint8_t *buf) const {
+-  auto *nList = reinterpret_cast<structs::nlist_64 *>(buf);
+-  for (const SymtabEntry &entry : symbols) {
+-    nList->n_strx = entry.strx;
+-    // TODO support other symbol types
+-    // TODO populate n_desc
+-    if (auto *defined = dyn_cast<Defined>(entry.sym)) {
+-      nList->n_type = MachO::N_EXT | MachO::N_SECT;
+-      nList->n_sect = defined->isec->parent->index;
+-      // For the N_SECT symbol type, n_value is the address of the symbol
+-      nList->n_value = defined->value + defined->isec->getVA();
+-    }
+-    ++nList;
+-  }
+-}
+-
+-StringTableSection::StringTableSection()
+-    : SyntheticSection(segment_names::linkEdit, section_names::stringTable) {}
+-
+-uint32_t StringTableSection::addString(StringRef str) {
+-  uint32_t strx = size;
+-  strings.push_back(str);
+-  size += str.size() + 1; // account for null terminator
+-  return strx;
+-}
+-
+-void StringTableSection::writeTo(uint8_t *buf) const {
+-  uint32_t off = 0;
+-  for (StringRef str : strings) {
+-    memcpy(buf + off, str.data(), str.size());
+-    off += str.size() + 1; // account for null terminator
+-  }
+-}
+diff --git a/lld/MachO/SyntheticSections.h b/lld/MachO/SyntheticSections.h
+deleted file mode 100644
+index a8fbf6c8a26..00000000000
+--- a/lld/MachO/SyntheticSections.h
++++ /dev/null
+@@ -1,290 +0,0 @@
+-//===- SyntheticSections.h -------------------------------------*- C++ -*-===//
+-//
+-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+-// See https://llvm.org/LICENSE.txt for license information.
+-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+-//
+-//===----------------------------------------------------------------------===//
+-
+-#ifndef LLD_MACHO_SYNTHETIC_SECTIONS_H
+-#define LLD_MACHO_SYNTHETIC_SECTIONS_H
+-
+-#include "Config.h"
+-#include "ExportTrie.h"
+-#include "InputSection.h"
+-#include "OutputSection.h"
+-#include "Target.h"
+-
+-#include "llvm/ADT/SetVector.h"
+-#include "llvm/Support/raw_ostream.h"
+-
+-namespace lld {
+-namespace macho {
+-
+-namespace section_names {
+-
+-constexpr const char pageZero[] = "__pagezero";
+-constexpr const char header[] = "__mach_header";
+-constexpr const char binding[] = "__binding";
+-constexpr const char lazyBinding[] = "__lazy_binding";
+-constexpr const char export_[] = "__export";
+-constexpr const char symbolTable[] = "__symbol_table";
+-constexpr const char stringTable[] = "__string_table";
+-constexpr const char got[] = "__got";
+-
+-} // namespace section_names
+-
+-class DylibSymbol;
+-class LoadCommand;
+-
+-class SyntheticSection : public OutputSection {
+-public:
+-  SyntheticSection(const char *segname, const char *name);
+-  virtual ~SyntheticSection() = default;
+-
+-  static bool classof(const OutputSection *sec) {
+-    return sec->kind() == SyntheticKind;
+-  }
+-
+-  const StringRef segname;
+-};
+-
+-// The header of the Mach-O file, which must have a file offset of zero.
+-class MachHeaderSection : public SyntheticSection {
+-public:
+-  MachHeaderSection();
+-  void addLoadCommand(LoadCommand *);
+-  bool isHidden() const override { return true; }
+-  uint64_t getSize() const override;
+-  void writeTo(uint8_t *buf) const override;
+-
+-private:
+-  std::vector<LoadCommand *> loadCommands;
+-  uint32_t sizeOfCmds = 0;
+-};
+-
+-// A hidden section that exists solely for the purpose of creating the
+-// __PAGEZERO segment, which is used to catch null pointer dereferences.
+-class PageZeroSection : public SyntheticSection {
+-public:
+-  PageZeroSection();
+-  bool isHidden() const override { return true; }
+-  uint64_t getSize() const override { return PageZeroSize; }
+-  uint64_t getFileSize() const override { return 0; }
+-  void writeTo(uint8_t *buf) const override {}
+-};
+-
+-// This section will be populated by dyld with addresses to non-lazily-loaded
+-// dylib symbols.
+-class GotSection : public SyntheticSection {
+-public:
+-  GotSection();
+-
+-  const llvm::SetVector<const Symbol *> &getEntries() const { return entries; }
+-
+-  bool isNeeded() const override { return !entries.empty(); }
+-
+-  uint64_t getSize() const override { return entries.size() * WordSize; }
+-
+-  void writeTo(uint8_t *buf) const override;
+-
+-  void addEntry(Symbol &sym);
+-
+-private:
+-  llvm::SetVector<const Symbol *> entries;
+-};
+-
+-struct BindingEntry {
+-  const DylibSymbol *dysym;
+-  const InputSection *isec;
+-  uint64_t offset;
+-  int64_t addend;
+-  BindingEntry(const DylibSymbol *dysym, const InputSection *isec,
+-               uint64_t offset, int64_t addend)
+-      : dysym(dysym), isec(isec), offset(offset), addend(addend) {}
+-};
+-
+-// Stores bind opcodes for telling dyld which symbols to load non-lazily.
+-class BindingSection : public SyntheticSection {
+-public:
+-  BindingSection();
+-  void finalizeContents();
+-  uint64_t getSize() const override { return contents.size(); }
+-  // Like other sections in __LINKEDIT, the binding section is special: its
+-  // offsets are recorded in the LC_DYLD_INFO_ONLY load command, instead of in
+-  // section headers.
+-  bool isHidden() const override { return true; }
+-  bool isNeeded() const override;
+-  void writeTo(uint8_t *buf) const override;
+-
+-  void addEntry(const DylibSymbol *dysym, const InputSection *isec,
+-                uint64_t offset, int64_t addend) {
+-    bindings.emplace_back(dysym, isec, offset, addend);
+-  }
+-
+-private:
+-  std::vector<BindingEntry> bindings;
+-  SmallVector<char, 128> contents;
+-};
+-
+-// The following sections implement lazy symbol binding -- very similar to the
+-// PLT mechanism in ELF.
+-//
+-// ELF's .plt section is broken up into two sections in Mach-O: StubsSection and
+-// StubHelperSection. Calls to functions in dylibs will end up calling into
+-// StubsSection, which contains indirect jumps to addresses stored in the
+-// LazyPointerSection (the counterpart to ELF's .plt.got).
+-//
+-// Initially, the LazyPointerSection contains addresses that point into one of
+-// the entry points in the middle of the StubHelperSection. The code in
+-// StubHelperSection will push on the stack an offset into the
+-// LazyBindingSection. The push is followed by a jump to the beginning of the
+-// StubHelperSection (similar to PLT0), which then calls into dyld_stub_binder.
+-// dyld_stub_binder is a non-lazily-bound symbol, so this call looks it up in
+-// the GOT.
+-//
+-// The stub binder will look up the bind opcodes in the LazyBindingSection at
+-// the given offset. The bind opcodes will tell the binder to update the address
+-// in the LazyPointerSection to point to the symbol, so that subsequent calls
+-// don't have to redo the symbol resolution. The binder will then jump to the
+-// resolved symbol.
+-
+-class StubsSection : public SyntheticSection {
+-public:
+-  StubsSection();
+-  uint64_t getSize() const override;
+-  bool isNeeded() const override { return !entries.empty(); }
+-  void writeTo(uint8_t *buf) const override;
+-
+-  const llvm::SetVector<DylibSymbol *> &getEntries() const { return entries; }
+-
+-  void addEntry(DylibSymbol &sym);
+-
+-private:
+-  llvm::SetVector<DylibSymbol *> entries;
+-};
+-
+-class StubHelperSection : public SyntheticSection {
+-public:
+-  StubHelperSection();
+-  uint64_t getSize() const override;
+-  bool isNeeded() const override;
+-  void writeTo(uint8_t *buf) const override;
+-
+-  void setup();
+-
+-  DylibSymbol *stubBinder = nullptr;
+-};
+-
+-// This section contains space for just a single word, and will be used by dyld
+-// to cache an address to the image loader it uses. Note that unlike the other
+-// synthetic sections, which are OutputSections, the ImageLoaderCacheSection is
+-// an InputSection that gets merged into the __data OutputSection.
+-class ImageLoaderCacheSection : public InputSection {
+-public:
+-  ImageLoaderCacheSection();
+-  uint64_t getSize() const override { return WordSize; }
+-};
+-
+-class LazyPointerSection : public SyntheticSection {
+-public:
+-  LazyPointerSection();
+-  uint64_t getSize() const override;
+-  bool isNeeded() const override;
+-  void writeTo(uint8_t *buf) const override;
+-};
+-
+-class LazyBindingSection : public SyntheticSection {
+-public:
+-  LazyBindingSection();
+-  void finalizeContents();
+-  uint64_t getSize() const override { return contents.size(); }
+-  uint32_t encode(const DylibSymbol &);
+-  // Like other sections in __LINKEDIT, the lazy binding section is special: its
+-  // offsets are recorded in the LC_DYLD_INFO_ONLY load command, instead of in
+-  // section headers.
+-  bool isHidden() const override { return true; }
+-  bool isNeeded() const override;
+-  void writeTo(uint8_t *buf) const override;
+-
+-private:
+-  SmallVector<char, 128> contents;
+-  llvm::raw_svector_ostream os{contents};
+-};
+-
+-// Stores a trie that describes the set of exported symbols.
+-class ExportSection : public SyntheticSection {
+-public:
+-  ExportSection();
+-  void finalizeContents();
+-  uint64_t getSize() const override { return size; }
+-  // Like other sections in __LINKEDIT, the export section is special: its
+-  // offsets are recorded in the LC_DYLD_INFO_ONLY load command, instead of in
+-  // section headers.
+-  bool isHidden() const override { return true; }
+-  void writeTo(uint8_t *buf) const override;
+-
+-private:
+-  TrieBuilder trieBuilder;
+-  size_t size = 0;
+-};
+-
+-// Stores the strings referenced by the symbol table.
+-class StringTableSection : public SyntheticSection {
+-public:
+-  StringTableSection();
+-  // Returns the start offset of the added string.
+-  uint32_t addString(StringRef);
+-  uint64_t getSize() const override { return size; }
+-  // Like other sections in __LINKEDIT, the string table section is special: its
+-  // offsets are recorded in the LC_SYMTAB load command, instead of in section
+-  // headers.
+-  bool isHidden() const override { return true; }
+-  void writeTo(uint8_t *buf) const override;
+-
+-private:
+-  // An n_strx value of 0 always indicates the empty string, so we must locate
+-  // our non-empty string values at positive offsets in the string table.
+-  // Therefore we insert a dummy value at position zero.
+-  std::vector<StringRef> strings{"\0"};
+-  size_t size = 1;
+-};
+-
+-struct SymtabEntry {
+-  Symbol *sym;
+-  size_t strx;
+-};
+-
+-class SymtabSection : public SyntheticSection {
+-public:
+-  SymtabSection(StringTableSection &);
+-  void finalizeContents();
+-  size_t getNumSymbols() const { return symbols.size(); }
+-  uint64_t getSize() const override;
+-  // Like other sections in __LINKEDIT, the symtab section is special: its
+-  // offsets are recorded in the LC_SYMTAB load command, instead of in section
+-  // headers.
+-  bool isHidden() const override { return true; }
+-  void writeTo(uint8_t *buf) const override;
+-
+-private:
+-  StringTableSection &stringTableSection;
+-  std::vector<SymtabEntry> symbols;
+-};
+-
+-struct InStruct {
+-  BindingSection *binding = nullptr;
+-  GotSection *got = nullptr;
+-  LazyPointerSection *lazyPointers = nullptr;
+-  StubsSection *stubs = nullptr;
+-  StubHelperSection *stubHelper = nullptr;
+-  ImageLoaderCacheSection *imageLoaderCache = nullptr;
+-};
+-
+-extern InStruct in;
+-extern std::vector<SyntheticSection *> syntheticSections;
+-
+-} // namespace macho
+-} // namespace lld
+-
+-#endif
+diff --git a/lld/MachO/Target.cpp b/lld/MachO/Target.cpp
+deleted file mode 100644
+index 0f70776a507..00000000000
+--- a/lld/MachO/Target.cpp
++++ /dev/null
+@@ -1,14 +0,0 @@
+-//===- Target.cpp ---------------------------------------------------------===//
+-//
+-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+-// See https://llvm.org/LICENSE.txt for license information.
+-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+-//
+-//===----------------------------------------------------------------------===//
+-
+-#include "Target.h"
+-
+-using namespace lld;
+-using namespace lld::macho;
+-
+-TargetInfo *macho::target = nullptr;
+diff --git a/lld/MachO/Target.h b/lld/MachO/Target.h
+deleted file mode 100644
+index 8ea1bde1230..00000000000
+--- a/lld/MachO/Target.h
++++ /dev/null
+@@ -1,75 +0,0 @@
+-//===- Target.h -------------------------------------------------*- C++ -*-===//
+-//
+-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+-// See https://llvm.org/LICENSE.txt for license information.
+-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+-//
+-//===----------------------------------------------------------------------===//
+-
+-#ifndef LLD_MACHO_TARGET_H
+-#define LLD_MACHO_TARGET_H
+-
+-#include "llvm/BinaryFormat/MachO.h"
+-#include "llvm/Support/MemoryBuffer.h"
+-
+-#include <cstddef>
+-#include <cstdint>
+-
+-namespace lld {
+-namespace macho {
+-
+-class Symbol;
+-class DylibSymbol;
+-class InputSection;
+-struct Reloc;
+-
+-enum : uint64_t {
+-  // We are currently only supporting 64-bit targets since macOS and iOS are
+-  // deprecating 32-bit apps.
+-  WordSize = 8,
+-  PageSize = 4096,
+-  PageZeroSize = 1ull << 32, // XXX should be 4096 for 32-bit targets
+-  MaxAlignmentPowerOf2 = 32,
+-};
+-
+-class TargetInfo {
+-public:
+-  virtual ~TargetInfo() = default;
+-
+-  // Validate the relocation structure and get its addend.
+-  virtual uint64_t
+-  getImplicitAddend(llvm::MemoryBufferRef, const llvm::MachO::section_64 &,
+-                    const llvm::MachO::relocation_info &) const = 0;
+-  virtual void relocateOne(uint8_t *loc, const Reloc &, uint64_t val) const = 0;
+-
+-  // Write code for lazy binding. See the comments on StubsSection for more
+-  // details.
+-  virtual void writeStub(uint8_t *buf, const DylibSymbol &) const = 0;
+-  virtual void writeStubHelperHeader(uint8_t *buf) const = 0;
+-  virtual void writeStubHelperEntry(uint8_t *buf, const DylibSymbol &,
+-                                    uint64_t entryAddr) const = 0;
+-
+-  // Symbols may be referenced via either the GOT or the stubs section,
+-  // depending on the relocation type. prepareSymbolRelocation() will set up the
+-  // GOT/stubs entries, and getSymbolVA() will return the addresses of those
+-  // entries.
+-  virtual void prepareSymbolRelocation(Symbol &, const InputSection *,
+-                                       const Reloc &) = 0;
+-  virtual uint64_t getSymbolVA(const Symbol &, uint8_t type) const = 0;
+-
+-  uint32_t cpuType;
+-  uint32_t cpuSubtype;
+-
+-  size_t stubSize;
+-  size_t stubHelperHeaderSize;
+-  size_t stubHelperEntrySize;
+-};
+-
+-TargetInfo *createX86_64TargetInfo();
+-
+-extern TargetInfo *target;
+-
+-} // namespace macho
+-} // namespace lld
+-
+-#endif
+diff --git a/lld/MachO/Writer.cpp b/lld/MachO/Writer.cpp
+deleted file mode 100644
+index 03000a7f437..00000000000
+--- a/lld/MachO/Writer.cpp
++++ /dev/null
+@@ -1,542 +0,0 @@
+-//===- Writer.cpp ---------------------------------------------------------===//
+-//
+-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+-// See https://llvm.org/LICENSE.txt for license information.
+-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+-//
+-//===----------------------------------------------------------------------===//
+-
+-#include "Writer.h"
+-#include "Config.h"
+-#include "InputFiles.h"
+-#include "InputSection.h"
+-#include "MergedOutputSection.h"
+-#include "OutputSection.h"
+-#include "OutputSegment.h"
+-#include "SymbolTable.h"
+-#include "Symbols.h"
+-#include "SyntheticSections.h"
+-#include "Target.h"
+-
+-#include "lld/Common/ErrorHandler.h"
+-#include "lld/Common/Memory.h"
+-#include "llvm/BinaryFormat/MachO.h"
+-#include "llvm/Support/LEB128.h"
+-#include "llvm/Support/MathExtras.h"
+-#include "llvm/Support/Path.h"
+-
+-using namespace llvm;
+-using namespace llvm::MachO;
+-using namespace lld;
+-using namespace lld::macho;
+-
+-namespace {
+-class LCLinkEdit;
+-class LCDyldInfo;
+-class LCSymtab;
+-
+-class Writer {
+-public:
+-  Writer() : buffer(errorHandler().outputBuffer) {}
+-
+-  void scanRelocations();
+-  void createOutputSections();
+-  void createLoadCommands();
+-  void assignAddresses(OutputSegment *);
+-  void createSymtabContents();
+-
+-  void openFile();
+-  void writeSections();
+-
+-  void run();
+-
+-  std::unique_ptr<FileOutputBuffer> &buffer;
+-  uint64_t addr = 0;
+-  uint64_t fileOff = 0;
+-  MachHeaderSection *headerSection = nullptr;
+-  LazyBindingSection *lazyBindingSection = nullptr;
+-  ExportSection *exportSection = nullptr;
+-  StringTableSection *stringTableSection = nullptr;
+-  SymtabSection *symtabSection = nullptr;
+-};
+-
+-// LC_DYLD_INFO_ONLY stores the offsets of symbol import/export information.
+-class LCDyldInfo : public LoadCommand {
+-public:
+-  LCDyldInfo(BindingSection *bindingSection,
+-             LazyBindingSection *lazyBindingSection,
+-             ExportSection *exportSection)
+-      : bindingSection(bindingSection), lazyBindingSection(lazyBindingSection),
+-        exportSection(exportSection) {}
+-
+-  uint32_t getSize() const override { return sizeof(dyld_info_command); }
+-
+-  void writeTo(uint8_t *buf) const override {
+-    auto *c = reinterpret_cast<dyld_info_command *>(buf);
+-    c->cmd = LC_DYLD_INFO_ONLY;
+-    c->cmdsize = getSize();
+-    if (bindingSection->isNeeded()) {
+-      c->bind_off = bindingSection->fileOff;
+-      c->bind_size = bindingSection->getFileSize();
+-    }
+-    if (lazyBindingSection->isNeeded()) {
+-      c->lazy_bind_off = lazyBindingSection->fileOff;
+-      c->lazy_bind_size = lazyBindingSection->getFileSize();
+-    }
+-    if (exportSection->isNeeded()) {
+-      c->export_off = exportSection->fileOff;
+-      c->export_size = exportSection->getFileSize();
+-    }
+-  }
+-
+-  BindingSection *bindingSection;
+-  LazyBindingSection *lazyBindingSection;
+-  ExportSection *exportSection;
+-};
+-
+-class LCDysymtab : public LoadCommand {
+-public:
+-  uint32_t getSize() const override { return sizeof(dysymtab_command); }
+-
+-  void writeTo(uint8_t *buf) const override {
+-    auto *c = reinterpret_cast<dysymtab_command *>(buf);
+-    c->cmd = LC_DYSYMTAB;
+-    c->cmdsize = getSize();
+-  }
+-};
+-
+-class LCSegment : public LoadCommand {
+-public:
+-  LCSegment(StringRef name, OutputSegment *seg) : name(name), seg(seg) {}
+-
+-  uint32_t getSize() const override {
+-    return sizeof(segment_command_64) +
+-           seg->numNonHiddenSections() * sizeof(section_64);
+-  }
+-
+-  void writeTo(uint8_t *buf) const override {
+-    auto *c = reinterpret_cast<segment_command_64 *>(buf);
+-    buf += sizeof(segment_command_64);
+-
+-    c->cmd = LC_SEGMENT_64;
+-    c->cmdsize = getSize();
+-    memcpy(c->segname, name.data(), name.size());
+-    c->fileoff = seg->fileOff;
+-    c->maxprot = seg->maxProt;
+-    c->initprot = seg->initProt;
+-
+-    if (seg->getSections().empty())
+-      return;
+-
+-    c->vmaddr = seg->firstSection()->addr;
+-    c->vmsize =
+-        seg->lastSection()->addr + seg->lastSection()->getSize() - c->vmaddr;
+-    c->nsects = seg->numNonHiddenSections();
+-
+-    for (OutputSection *osec : seg->getSections()) {
+-      c->filesize += osec->getFileSize();
+-
+-      if (osec->isHidden())
+-        continue;
+-
+-      auto *sectHdr = reinterpret_cast<section_64 *>(buf);
+-      buf += sizeof(section_64);
+-
+-      memcpy(sectHdr->sectname, osec->name.data(), osec->name.size());
+-      memcpy(sectHdr->segname, name.data(), name.size());
+-
+-      sectHdr->addr = osec->addr;
+-      sectHdr->offset = osec->fileOff;
+-      sectHdr->align = Log2_32(osec->align);
+-      sectHdr->flags = osec->flags;
+-      sectHdr->size = osec->getSize();
+-    }
+-  }
+-
+-private:
+-  StringRef name;
+-  OutputSegment *seg;
+-};
+-
+-class LCMain : public LoadCommand {
+-  uint32_t getSize() const override { return sizeof(entry_point_command); }
+-
+-  void writeTo(uint8_t *buf) const override {
+-    auto *c = reinterpret_cast<entry_point_command *>(buf);
+-    c->cmd = LC_MAIN;
+-    c->cmdsize = getSize();
+-    c->entryoff = config->entry->getFileOffset();
+-    c->stacksize = 0;
+-  }
+-};
+-
+-class LCSymtab : public LoadCommand {
+-public:
+-  LCSymtab(SymtabSection *symtabSection, StringTableSection *stringTableSection)
+-      : symtabSection(symtabSection), stringTableSection(stringTableSection) {}
+-
+-  uint32_t getSize() const override { return sizeof(symtab_command); }
+-
+-  void writeTo(uint8_t *buf) const override {
+-    auto *c = reinterpret_cast<symtab_command *>(buf);
+-    c->cmd = LC_SYMTAB;
+-    c->cmdsize = getSize();
+-    c->symoff = symtabSection->fileOff;
+-    c->nsyms = symtabSection->getNumSymbols();
+-    c->stroff = stringTableSection->fileOff;
+-    c->strsize = stringTableSection->getFileSize();
+-  }
+-
+-  SymtabSection *symtabSection = nullptr;
+-  StringTableSection *stringTableSection = nullptr;
+-};
+-
+-// There are several dylib load commands that share the same structure:
+-//   * LC_LOAD_DYLIB
+-//   * LC_ID_DYLIB
+-//   * LC_REEXPORT_DYLIB
+-class LCDylib : public LoadCommand {
+-public:
+-  LCDylib(LoadCommandType type, StringRef path) : type(type), path(path) {}
+-
+-  uint32_t getSize() const override {
+-    return alignTo(sizeof(dylib_command) + path.size() + 1, 8);
+-  }
+-
+-  void writeTo(uint8_t *buf) const override {
+-    auto *c = reinterpret_cast<dylib_command *>(buf);
+-    buf += sizeof(dylib_command);
+-
+-    c->cmd = type;
+-    c->cmdsize = getSize();
+-    c->dylib.name = sizeof(dylib_command);
+-
+-    memcpy(buf, path.data(), path.size());
+-    buf[path.size()] = '\0';
+-  }
+-
+-private:
+-  LoadCommandType type;
+-  StringRef path;
+-};
+-
+-class LCLoadDylinker : public LoadCommand {
+-public:
+-  uint32_t getSize() const override {
+-    return alignTo(sizeof(dylinker_command) + path.size() + 1, 8);
+-  }
+-
+-  void writeTo(uint8_t *buf) const override {
+-    auto *c = reinterpret_cast<dylinker_command *>(buf);
+-    buf += sizeof(dylinker_command);
+-
+-    c->cmd = LC_LOAD_DYLINKER;
+-    c->cmdsize = getSize();
+-    c->name = sizeof(dylinker_command);
+-
+-    memcpy(buf, path.data(), path.size());
+-    buf[path.size()] = '\0';
+-  }
+-
+-private:
+-  // Recent versions of Darwin won't run any binary that has dyld at a
+-  // different location.
+-  const StringRef path = "/usr/lib/dyld";
+-};
+-} // namespace
+-
+-void Writer::scanRelocations() {
+-  for (InputSection *isec : inputSections) {
+-    for (Reloc &r : isec->relocs) {
+-      if (auto *s = r.target.dyn_cast<lld::macho::Symbol *>()) {
+-        if (isa<Undefined>(s))
+-          error("undefined symbol " + s->getName() + ", referenced from " +
+-                sys::path::filename(isec->file->getName()));
+-        else
+-          target->prepareSymbolRelocation(*s, isec, r);
+-      }
+-    }
+-  }
+-}
+-
+-void Writer::createLoadCommands() {
+-  headerSection->addLoadCommand(
+-      make<LCDyldInfo>(in.binding, lazyBindingSection, exportSection));
+-  headerSection->addLoadCommand(
+-      make<LCSymtab>(symtabSection, stringTableSection));
+-  headerSection->addLoadCommand(make<LCDysymtab>());
+-
+-  switch (config->outputType) {
+-  case MH_EXECUTE:
+-    headerSection->addLoadCommand(make<LCMain>());
+-    headerSection->addLoadCommand(make<LCLoadDylinker>());
+-    break;
+-  case MH_DYLIB:
+-    headerSection->addLoadCommand(
+-        make<LCDylib>(LC_ID_DYLIB, config->installName));
+-    break;
+-  default:
+-    llvm_unreachable("unhandled output file type");
+-  }
+-
+-  uint8_t segIndex = 0;
+-  for (OutputSegment *seg : outputSegments) {
+-    headerSection->addLoadCommand(make<LCSegment>(seg->name, seg));
+-    seg->index = segIndex++;
+-  }
+-
+-  uint64_t dylibOrdinal = 1;
+-  for (InputFile *file : inputFiles) {
+-    if (auto *dylibFile = dyn_cast<DylibFile>(file)) {
+-      headerSection->addLoadCommand(
+-          make<LCDylib>(LC_LOAD_DYLIB, dylibFile->dylibName));
+-      dylibFile->ordinal = dylibOrdinal++;
+-
+-      if (dylibFile->reexport)
+-        headerSection->addLoadCommand(
+-            make<LCDylib>(LC_REEXPORT_DYLIB, dylibFile->dylibName));
+-    }
+-  }
+-}
+-
+-static size_t getSymbolPriority(const SymbolPriorityEntry &entry,
+-                                const InputFile &file) {
+-  return std::max(entry.objectFiles.lookup(sys::path::filename(file.getName())),
+-                  entry.anyObjectFile);
+-}
+-
+-// Each section gets assigned the priority of the highest-priority symbol it
+-// contains.
+-static DenseMap<const InputSection *, size_t> buildInputSectionPriorities() {
+-  DenseMap<const InputSection *, size_t> sectionPriorities;
+-
+-  if (config->priorities.empty())
+-    return sectionPriorities;
+-
+-  auto addSym = [&](Defined &sym) {
+-    auto it = config->priorities.find(sym.getName());
+-    if (it == config->priorities.end())
+-      return;
+-
+-    SymbolPriorityEntry &entry = it->second;
+-    size_t &priority = sectionPriorities[sym.isec];
+-    priority = std::max(priority, getSymbolPriority(entry, *sym.isec->file));
+-  };
+-
+-  // TODO: Make sure this handles weak symbols correctly.
+-  for (InputFile *file : inputFiles)
+-    if (isa<ObjFile>(file) || isa<ArchiveFile>(file))
+-      for (lld::macho::Symbol *sym : file->symbols)
+-        if (auto *d = dyn_cast<Defined>(sym))
+-          addSym(*d);
+-
+-  return sectionPriorities;
+-}
+-
+-static int segmentOrder(OutputSegment *seg) {
+-  return StringSwitch<int>(seg->name)
+-      .Case(segment_names::pageZero, -2)
+-      .Case(segment_names::text, -1)
+-      // Make sure __LINKEDIT is the last segment (i.e. all its hidden
+-      // sections must be ordered after other sections).
+-      .Case(segment_names::linkEdit, std::numeric_limits<int>::max())
+-      .Default(0);
+-}
+-
+-static int sectionOrder(OutputSection *osec) {
+-  StringRef segname = osec->parent->name;
+-  // Sections are uniquely identified by their segment + section name.
+-  if (segname == segment_names::text) {
+-    if (osec->name == section_names::header)
+-      return -1;
+-  } else if (segname == segment_names::linkEdit) {
+-    return StringSwitch<int>(osec->name)
+-        .Case(section_names::binding, -4)
+-        .Case(section_names::export_, -3)
+-        .Case(section_names::symbolTable, -2)
+-        .Case(section_names::stringTable, -1)
+-        .Default(0);
+-  }
+-  // ZeroFill sections must always be the at the end of their segments,
+-  // otherwise subsequent sections may get overwritten with zeroes at runtime.
+-  if (isZeroFill(osec->flags))
+-    return std::numeric_limits<int>::max();
+-  return 0;
+-}
+-
+-template <typename T, typename F>
+-static std::function<bool(T, T)> compareByOrder(F ord) {
+-  return [=](T a, T b) { return ord(a) < ord(b); };
+-}
+-
+-// Sorting only can happen once all outputs have been collected. Here we sort
+-// segments, output sections within each segment, and input sections within each
+-// output segment.
+-static void sortSegmentsAndSections() {
+-  llvm::stable_sort(outputSegments,
+-                    compareByOrder<OutputSegment *>(segmentOrder));
+-
+-  DenseMap<const InputSection *, size_t> isecPriorities =
+-      buildInputSectionPriorities();
+-
+-  uint32_t sectionIndex = 0;
+-  for (OutputSegment *seg : outputSegments) {
+-    seg->sortOutputSections(compareByOrder<OutputSection *>(sectionOrder));
+-    for (auto *osec : seg->getSections()) {
+-      // Now that the output sections are sorted, assign the final
+-      // output section indices.
+-      if (!osec->isHidden())
+-        osec->index = ++sectionIndex;
+-
+-      if (!isecPriorities.empty()) {
+-        if (auto *merged = dyn_cast<MergedOutputSection>(osec)) {
+-          llvm::stable_sort(merged->inputs,
+-                            [&](InputSection *a, InputSection *b) {
+-                              return isecPriorities[a] > isecPriorities[b];
+-                            });
+-        }
+-      }
+-    }
+-  }
+-}
+-
+-void Writer::createOutputSections() {
+-  // First, create hidden sections
+-  headerSection = make<MachHeaderSection>();
+-  lazyBindingSection = make<LazyBindingSection>();
+-  stringTableSection = make<StringTableSection>();
+-  symtabSection = make<SymtabSection>(*stringTableSection);
+-  exportSection = make<ExportSection>();
+-
+-  switch (config->outputType) {
+-  case MH_EXECUTE:
+-    make<PageZeroSection>();
+-    break;
+-  case MH_DYLIB:
+-    break;
+-  default:
+-    llvm_unreachable("unhandled output file type");
+-  }
+-
+-  // Then merge input sections into output sections.
+-  MapVector<std::pair<StringRef, StringRef>, MergedOutputSection *>
+-      mergedOutputSections;
+-  for (InputSection *isec : inputSections) {
+-    MergedOutputSection *&osec =
+-        mergedOutputSections[{isec->segname, isec->name}];
+-    if (osec == nullptr)
+-      osec = make<MergedOutputSection>(isec->name);
+-    osec->mergeInput(isec);
+-  }
+-
+-  for (const auto &it : mergedOutputSections) {
+-    StringRef segname = it.first.first;
+-    MergedOutputSection *osec = it.second;
+-    getOrCreateOutputSegment(segname)->addOutputSection(osec);
+-  }
+-
+-  for (SyntheticSection *ssec : syntheticSections) {
+-    auto it = mergedOutputSections.find({ssec->segname, ssec->name});
+-    if (it == mergedOutputSections.end()) {
+-      if (ssec->isNeeded())
+-        getOrCreateOutputSegment(ssec->segname)->addOutputSection(ssec);
+-    } else {
+-      error("section from " + it->second->firstSection()->file->getName() +
+-            " conflicts with synthetic section " + ssec->segname + "," +
+-            ssec->name);
+-    }
+-  }
+-}
+-
+-void Writer::assignAddresses(OutputSegment *seg) {
+-  addr = alignTo(addr, PageSize);
+-  fileOff = alignTo(fileOff, PageSize);
+-  seg->fileOff = fileOff;
+-
+-  for (auto *osec : seg->getSections()) {
+-    addr = alignTo(addr, osec->align);
+-    fileOff = alignTo(fileOff, osec->align);
+-    osec->addr = addr;
+-    osec->fileOff = isZeroFill(osec->flags) ? 0 : fileOff;
+-    osec->finalize();
+-
+-    addr += osec->getSize();
+-    fileOff += osec->getFileSize();
+-  }
+-}
+-
+-void Writer::openFile() {
+-  Expected<std::unique_ptr<FileOutputBuffer>> bufferOrErr =
+-      FileOutputBuffer::create(config->outputFile, fileOff,
+-                               FileOutputBuffer::F_executable);
+-
+-  if (!bufferOrErr)
+-    error("failed to open " + config->outputFile + ": " +
+-          llvm::toString(bufferOrErr.takeError()));
+-  else
+-    buffer = std::move(*bufferOrErr);
+-}
+-
+-void Writer::writeSections() {
+-  uint8_t *buf = buffer->getBufferStart();
+-  for (OutputSegment *seg : outputSegments)
+-    for (OutputSection *osec : seg->getSections())
+-      osec->writeTo(buf + osec->fileOff);
+-}
+-
+-void Writer::run() {
+-  // dyld requires __LINKEDIT segment to always exist (even if empty).
+-  OutputSegment *linkEditSegment =
+-      getOrCreateOutputSegment(segment_names::linkEdit);
+-
+-  scanRelocations();
+-  if (in.stubHelper->isNeeded())
+-    in.stubHelper->setup();
+-
+-  // Sort and assign sections to their respective segments. No more sections nor
+-  // segments may be created after these methods run.
+-  createOutputSections();
+-  sortSegmentsAndSections();
+-
+-  createLoadCommands();
+-
+-  // Ensure that segments (and the sections they contain) are allocated
+-  // addresses in ascending order, which dyld requires.
+-  //
+-  // Note that at this point, __LINKEDIT sections are empty, but we need to
+-  // determine addresses of other segments/sections before generating its
+-  // contents.
+-  for (OutputSegment *seg : outputSegments)
+-    if (seg != linkEditSegment)
+-      assignAddresses(seg);
+-
+-  // Fill __LINKEDIT contents.
+-  in.binding->finalizeContents();
+-  lazyBindingSection->finalizeContents();
+-  exportSection->finalizeContents();
+-  symtabSection->finalizeContents();
+-
+-  // Now that __LINKEDIT is filled out, do a proper calculation of its
+-  // addresses and offsets.
+-  assignAddresses(linkEditSegment);
+-
+-  openFile();
+-  if (errorCount())
+-    return;
+-
+-  writeSections();
+-
+-  if (auto e = buffer->commit())
+-    error("failed to write to the output file: " + toString(std::move(e)));
+-}
+-
+-void macho::writeResult() { Writer().run(); }
+-
+-void macho::createSyntheticSections() {
+-  in.binding = make<BindingSection>();
+-  in.got = make<GotSection>();
+-  in.lazyPointers = make<LazyPointerSection>();
+-  in.stubs = make<StubsSection>();
+-  in.stubHelper = make<StubHelperSection>();
+-  in.imageLoaderCache = make<ImageLoaderCacheSection>();
+-}
+diff --git a/lld/MachO/Writer.h b/lld/MachO/Writer.h
+deleted file mode 100644
+index 7f846233107..00000000000
+--- a/lld/MachO/Writer.h
++++ /dev/null
+@@ -1,31 +0,0 @@
+-//===- Writer.h -------------------------------------------------*- C++ -*-===//
+-//
+-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+-// See https://llvm.org/LICENSE.txt for license information.
+-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+-//
+-//===----------------------------------------------------------------------===//
+-
+-#ifndef LLD_MACHO_WRITER_H
+-#define LLD_MACHO_WRITER_H
+-
+-#include <cstdint>
+-
+-namespace lld {
+-namespace macho {
+-
+-class LoadCommand {
+-public:
+-  virtual ~LoadCommand() = default;
+-  virtual uint32_t getSize() const = 0;
+-  virtual void writeTo(uint8_t *buf) const = 0;
+-};
+-
+-void writeResult();
+-
+-void createSyntheticSections();
+-
+-} // namespace macho
+-} // namespace lld
+-
+-#endif
+diff --git a/lld/include/lld/Common/Driver.h b/lld/include/lld/Common/Driver.h
+index 6db3d234eb5..0a358d8aff6 100644
+--- a/lld/include/lld/Common/Driver.h
++++ b/lld/include/lld/Common/Driver.h
+@@ -33,11 +33,6 @@ bool link(llvm::ArrayRef<const char *> args, bool canExitEarly,
+           llvm::raw_ostream &stdoutOS, llvm::raw_ostream &stderrOS);
+ }
+ 
+-namespace macho {
+-bool link(llvm::ArrayRef<const char *> args, bool canExitEarly,
+-          llvm::raw_ostream &stdoutOS, llvm::raw_ostream &stderrOS);
+-}
+-
+ namespace wasm {
+ bool link(llvm::ArrayRef<const char *> args, bool canExitEarly,
+           llvm::raw_ostream &stdoutOS, llvm::raw_ostream &stderrOS);
+diff --git a/lld/test/MachO/Inputs/MacOSX.sdk/usr/lib/libSystem.tbd b/lld/test/MachO/Inputs/MacOSX.sdk/usr/lib/libSystem.tbd
+deleted file mode 100644
+index fddd192630d..00000000000
+--- a/lld/test/MachO/Inputs/MacOSX.sdk/usr/lib/libSystem.tbd
++++ /dev/null
+@@ -1,42 +0,0 @@
+---- !tapi-tbd-v3
+-archs:            [ x86_64 ]
+-uuids:            [ 'x86_64: 00000000-0000-0000-0000-000000000000' ]
+-platform:         macosx
+-install-name:     '/usr/lib/libSystem.B.dylib'
+-current-version:  0001.001.1
+-exports:
+-  - archs:        [ 'x86_64' ]
+-    re-exports:   [ '/usr/lib/system/libdyld.dylib',
+-                    '/usr/lib/system/libsystem_c.dylib',
+-                    '/usr/lib/system/libsystem_m.dylib' ]
+---- !tapi-tbd-v3
+-archs:            [ x86_64 ]
+-uuids:            [ 'x86_64: 00000000-0000-0000-0000-000000000001' ]
+-platform:         macosx
+-install-name:     '/usr/lib/system/libdyld.dylib'
+-current-version:  0001.001.1
+-parent-umbrella:  System
+-exports:
+-  - archs:        [ 'x86_64' ]
+-    symbols:      [ dyld_stub_binder ]
+---- !tapi-tbd-v3
+-archs:            [ x86_64 ]
+-uuids:            [ 'x86_64: 00000000-0000-0000-0000-000000000002' ]
+-platform:         macosx
+-install-name:     '/usr/lib/system/libsystem_c.dylib'
+-current-version:  0001.001.1
+-parent-umbrella:  System
+-exports:
+-  - archs:        [ 'x86_64' ]
+-    symbols:      [ ]
+---- !tapi-tbd-v3
+-archs:            [ x86_64 ]
+-uuids:            [ 'x86_64: 00000000-0000-0000-0000-000000000003' ]
+-platform:         macosx
+-install-name:     '/usr/lib/system/libsystem_m.dylib'
+-current-version:  0001.001.1
+-parent-umbrella:  System
+-exports:
+-  - archs:        [ 'x86_64' ]
+-    symbols:      [ ___nan ]
+-...
+diff --git a/lld/test/MachO/Inputs/iPhoneSimulator.sdk/usr/lib/libSystem.tbd b/lld/test/MachO/Inputs/iPhoneSimulator.sdk/usr/lib/libSystem.tbd
+deleted file mode 100644
+index 3e62c2ee711..00000000000
+--- a/lld/test/MachO/Inputs/iPhoneSimulator.sdk/usr/lib/libSystem.tbd
++++ /dev/null
+@@ -1,23 +0,0 @@
+---- !tapi-tbd-v3
+-archs:            [ i386, x86_64 ]
+-uuids:            [ 'i386: 00000000-0000-0000-0000-000000000000', 'x86_64: 00000000-0000-0000-0000-000000000001' ]
+-platform:         ios
+-install-name:     '/usr/lib/libSystem.B.dylib'
+-current-version:  1281
+-exports:
+-  - archs:      [ i386, x86_64 ]
+-    re-exports: [ '/usr/lib/system/libcache.dylib' ]
+-    symbols:    [ __crashreporter_info__ ]
+---- !tapi-tbd-v3
+-archs:            [ i386, x86_64 ]
+-uuids:            [ 'i386: 00000000-0000-0000-0000-000000000002', 'x86_64: 00000000-0000-0000-0000-000000000003' ]
+-platform:         ios
+-install-name:     '/usr/lib/libcache.dylib'
+-current-version:  83
+-parent-umbrella:  System
+-exports:
+-  - archs:      [ i386 ]
+-    symbols:    [ __cache_handle_memory_pressure_event ]
+-  - archs:      [ i386, x86_64 ]
+-    symbols:    [ _cache_create, _cache_destroy, _cache_get ]
+-...
+diff --git a/lld/test/MachO/Inputs/libfunction.s b/lld/test/MachO/Inputs/libfunction.s
+deleted file mode 100644
+index fe0b3879a41..00000000000
+--- a/lld/test/MachO/Inputs/libfunction.s
++++ /dev/null
+@@ -1,6 +0,0 @@
+-.section __TEXT,__text
+-.globl _some_function
+-
+-_some_function:
+-  mov $1, %rax
+-  ret
+diff --git a/lld/test/MachO/Inputs/libgoodbye.s b/lld/test/MachO/Inputs/libgoodbye.s
+deleted file mode 100644
+index 40c829cfc6e..00000000000
+--- a/lld/test/MachO/Inputs/libgoodbye.s
++++ /dev/null
+@@ -1,14 +0,0 @@
+-.section __TEXT,__cstring
+-.globl _goodbye_world, _print_goodbye
+-
+-_goodbye_world:
+-.asciz "Goodbye world!\n"
+-
+-.text
+-_print_goodbye:
+-  movl $0x2000004, %eax # write() syscall
+-  mov $1, %rdi # stdout
+-  leaq _goodbye_world(%rip), %rsi
+-  mov $15, %rdx # length of str
+-  syscall
+-  ret
+diff --git a/lld/test/MachO/Inputs/libhello.s b/lld/test/MachO/Inputs/libhello.s
+deleted file mode 100644
+index 0b9930bafcb..00000000000
+--- a/lld/test/MachO/Inputs/libhello.s
++++ /dev/null
+@@ -1,17 +0,0 @@
+-.section __TEXT,__cstring
+-.globl _hello_world, _hello_its_me, _print_hello
+-
+-_hello_world:
+-.asciz "Hello world!\n"
+-
+-_hello_its_me:
+-.asciz "Hello, it's me\n"
+-
+-.text
+-_print_hello:
+-  movl $0x2000004, %eax # write() syscall
+-  mov $1, %rdi # stdout
+-  leaq _hello_world(%rip), %rsi
+-  mov $13, %rdx # length of str
+-  syscall
+-  ret
+diff --git a/lld/test/MachO/arch.s b/lld/test/MachO/arch.s
+deleted file mode 100644
+index a0a1962f640..00000000000
+--- a/lld/test/MachO/arch.s
++++ /dev/null
+@@ -1,11 +0,0 @@
+-# REQUIRES: x86
+-# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-darwin %s -o %t.o
+-# RUN: lld -flavor darwinnew -o /dev/null %t.o
+-# RUN: not lld -flavor darwinnew -arch i386 -o /dev/null %t.o 2>&1 | FileCheck %s
+-# CHECK: error: missing or unsupported -arch i386
+-
+-.text
+-.global _main
+-_main:
+-  mov $0, %rax
+-  ret
+diff --git a/lld/test/MachO/archive.s b/lld/test/MachO/archive.s
+deleted file mode 100644
+index 370980768fa..00000000000
+--- a/lld/test/MachO/archive.s
++++ /dev/null
+@@ -1,35 +0,0 @@
+-# REQUIRES: x86
+-# RUN: mkdir -p %t
+-# RUN: echo ".global _boo; _boo: ret"                           | llvm-mc -filetype=obj -triple=x86_64-apple-darwin -o %t/2.o
+-# RUN: echo ".global _bar; _bar: ret"                           | llvm-mc -filetype=obj -triple=x86_64-apple-darwin -o %t/3.o
+-# RUN: echo ".global _undefined; .global _unused; _unused: ret" | llvm-mc -filetype=obj -triple=x86_64-apple-darwin -o %t/4.o
+-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t/main.o
+-
+-# RUN: rm -f %t/test.a
+-# RUN: llvm-ar rcs %t/test.a %t/2.o %t/3.o %t/4.o
+-# RUN: lld -flavor darwinnew %t/main.o %t/test.a -o %t/test.out
+-
+-## TODO: Run llvm-nm -p to validate symbol order
+-# RUN: llvm-nm %t/test.out | FileCheck %s
+-# CHECK: T _bar
+-# CHECK: T _boo
+-# CHECK: T _main
+-
+-## Linking with the archive first in the command line shouldn't change anything
+-# RUN: lld -flavor darwinnew %t/test.a %t/main.o -o %t/test.out
+-# RUN: llvm-nm %t/test.out | FileCheck %s --check-prefix ARCHIVE-FIRST
+-# ARCHIVE-FIRST: T _bar
+-# ARCHIVE-FIRST: T _boo
+-# ARCHIVE-FIRST: T _main
+-
+-
+-# RUN: llvm-nm %t/test.out | FileCheck %s --check-prefix VISIBLE
+-# VISIBLE-NOT: T _undefined
+-# VISIBLE-NOT: T _unused
+-
+-.global _main
+-_main:
+-  callq _boo
+-  callq _bar
+-  mov $0, %rax
+-  ret
+diff --git a/lld/test/MachO/bss.s b/lld/test/MachO/bss.s
+deleted file mode 100644
+index b56f02d2bcb..00000000000
+--- a/lld/test/MachO/bss.s
++++ /dev/null
+@@ -1,59 +0,0 @@
+-# REQUIRES: x86
+-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t.o
+-# RUN: lld -flavor darwinnew -o %t %t.o
+-# RUN: llvm-readobj --section-headers --macho-segment %t | FileCheck %s
+-
+-## Check that __bss takes up zero file size, is at file offset zero, and
+-## appears at the end of its segment.
+-
+-# CHECK:        Index: 1
+-# CHECK-NEXT:   Name: __data
+-# CHECK-NEXT:   Segment: __DATA
+-# CHECK-NEXT:   Address:
+-# CHECK-NEXT:   Size: 0x8
+-# CHECK-NEXT:   Offset: 4096
+-# CHECK-NEXT:   Alignment: 0
+-# CHECK-NEXT:   RelocationOffset: 0x0
+-# CHECK-NEXT:   RelocationCount: 0
+-# CHECK-NEXT:   Type: Regular (0x0)
+-# CHECK-NEXT:   Attributes [ (0x0)
+-# CHECK-NEXT:   ]
+-# CHECK-NEXT:   Reserved1: 0x0
+-# CHECK-NEXT:   Reserved2: 0x0
+-# CHECK-NEXT:   Reserved3: 0x0
+-
+-# CHECK:        Index: 2
+-# CHECK-NEXT:   Name: __bss
+-# CHECK-NEXT:   Segment: __DATA
+-# CHECK-NEXT:   Address:
+-# CHECK-NEXT:   Size: 0x4
+-# CHECK-NEXT:   Offset: 0
+-# CHECK-NEXT:   Alignment: 0
+-# CHECK-NEXT:   RelocationOffset: 0x0
+-# CHECK-NEXT:   RelocationCount: 0
+-# CHECK-NEXT:   Type: ZeroFill (0x1)
+-# CHECK-NEXT:   Attributes [ (0x0)
+-# CHECK-NEXT:   ]
+-# CHECK-NEXT:   Reserved1: 0x0
+-# CHECK-NEXT:   Reserved2: 0x0
+-# CHECK-NEXT:   Reserved3: 0x0
+-
+-# CHECK:      Name: __DATA
+-# CHECK-NEXT: Size:
+-# CHECK-NEXT: vmaddr:
+-# CHECK-NEXT: vmsize: 0xC
+-# CHECK-NEXT: fileoff:
+-# CHECK-NEXT: filesize: 8
+-
+-.globl _main
+-
+-.text
+-_main:
+-  movq $0, %rax
+-  retq
+-
+-.bss
+-.zero 4
+-
+-.data
+-.quad 0x1234
+diff --git a/lld/test/MachO/dylib.s b/lld/test/MachO/dylib.s
+deleted file mode 100644
+index 507a7de8742..00000000000
+--- a/lld/test/MachO/dylib.s
++++ /dev/null
+@@ -1,35 +0,0 @@
+-# REQUIRES: x86
+-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t.o
+-
+-# RUN: lld -flavor darwinnew -dylib -install_name @executable_path/libfoo.dylib \
+-# RUN:   %t.o -o %t.dylib
+-# RUN: llvm-objdump --macho --dylib-id %t.dylib | FileCheck %s
+-# CHECK: @executable_path/libfoo.dylib
+-
+-## If we are building a dylib, we shouldn't error out even if we are passed
+-## a flag for a missing entry symbol (since dylibs don't have entry symbols).
+-## Also check that we come up with the right install name if one isn't
+-## specified.
+-# RUN: lld -flavor darwinnew -dylib %t.o -o %t.defaultInstallName.dylib -e missing_entry
+-# RUN: obj2yaml %t.defaultInstallName.dylib | FileCheck %s -DOUTPUT=%t.defaultInstallName.dylib --check-prefix=DEFAULT-INSTALL-NAME
+-# DEFAULT-INSTALL-NAME: [[OUTPUT]]
+-
+-## Check for the absence of load commands / segments that should not be in a
+-## dylib.
+-# RUN: llvm-objdump --macho --all-headers %t.dylib | FileCheck %s --check-prefix=NCHECK
+-# NCHECK-NOT: cmd LC_LOAD_DYLINKER
+-# NCHECK-NOT: cmd LC_MAIN
+-# NCHECK-NOT: segname __PAGEZERO
+-
+-# RUN: llvm-objdump --syms --exports-trie %t.dylib | \
+-# RUN:   FileCheck %s --check-prefix=EXPORTS
+-# EXPORTS-LABEL: SYMBOL TABLE:
+-# EXPORTS:       [[#%x, HELLO_WORLD_ADDR:]] {{.*}} _hello_world
+-# EXPORTS-LABEL: Exports trie:
+-# EXPORTS:       0x{{0*}}[[#%X, HELLO_WORLD_ADDR]] _hello_world
+-
+-.section __TEXT,__cstring
+-.globl _hello_world
+-
+-_hello_world:
+-.asciz "Hello world!\n"
+diff --git a/lld/test/MachO/dylink-lazy.s b/lld/test/MachO/dylink-lazy.s
+deleted file mode 100644
+index 16051b45bd9..00000000000
+--- a/lld/test/MachO/dylink-lazy.s
++++ /dev/null
+@@ -1,62 +0,0 @@
+-# REQUIRES: x86, shell
+-# RUN: mkdir -p %t
+-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %p/Inputs/libhello.s \
+-# RUN:   -o %t/libhello.o
+-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %p/Inputs/libgoodbye.s \
+-# RUN:   -o %t/libgoodbye.o
+-# RUN: lld -flavor darwinnew -dylib -L%S/Inputs/MacOSX.sdk/usr/lib \
+-# RUN:   -install_name @executable_path/libhello.dylib %t/libhello.o \
+-# RUN:   -o %t/libhello.dylib
+-# RUN: lld -flavor darwinnew -dylib -L%S/Inputs/MacOSX.sdk/usr/lib \
+-# RUN:   -install_name @executable_path/libgoodbye.dylib %t/libgoodbye.o \
+-# RUN:   -o %t/libgoodbye.dylib
+-
+-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t/dylink-lazy.o
+-# RUN: lld -flavor darwinnew -o %t/dylink-lazy \
+-# RUN:   -L%S/Inputs/MacOSX.sdk/usr/lib -L%t -lhello -lgoodbye %t/dylink-lazy.o -lSystem
+-
+-## When looking at the __stubs section alone, we are unable to easily tell which
+-## symbol each entry points to. So we call objdump twice in order to get the
+-## disassembly of __text and the bind tables first, which allow us to check for
+-## matching entries in __stubs.
+-# RUN: (llvm-objdump -d --no-show-raw-insn --syms --bind --lazy-bind %t/dylink-lazy; \
+-# RUN:  llvm-objdump -D --no-show-raw-insn %t/dylink-lazy) | FileCheck %s
+-
+-# CHECK-LABEL: SYMBOL TABLE:
+-# CHECK:       {{0*}}[[#%x, IMGLOADER:]] {{.*}} __DATA,__data __dyld_private
+-
+-# CHECK-LABEL: Disassembly of section __TEXT,__text:
+-# CHECK:         callq 0x[[#%x, HELLO_STUB:]]
+-# CHECK-NEXT:    callq 0x[[#%x, GOODBYE_STUB:]]
+-
+-# CHECK-LABEL: Bind table:
+-# CHECK:       __DATA_CONST __got 0x[[#%x, BINDER:]] pointer 0 libSystem dyld_stub_binder
+-
+-# CHECK-LABEL: Lazy bind table:
+-# CHECK-DAG:   __DATA __la_symbol_ptr 0x{{0*}}[[#%x, HELLO_LAZY_PTR:]] libhello _print_hello
+-# CHECK-DAG:   __DATA __la_symbol_ptr 0x{{0*}}[[#%x, GOODBYE_LAZY_PTR:]] libgoodbye _print_goodbye
+-
+-# CHECK-LABEL: Disassembly of section __TEXT,__stubs:
+-# CHECK-DAG:     [[#%x, HELLO_STUB]]:   jmpq *[[#%u, HELLO_LAZY_PTR - HELLO_STUB - 6]](%rip)
+-# CHECK-DAG:     [[#%x, GOODBYE_STUB]]: jmpq *[[#%u, GOODBYE_LAZY_PTR - GOODBYE_STUB - 6]](%rip)
+-
+-# CHECK-LABEL: Disassembly of section __TEXT,__stub_helper:
+-# CHECK:         {{0*}}[[#%x, STUB_HELPER_ENTRY:]] <__stub_helper>:
+-# CHECK-NEXT:    leaq [[#%u, IMGLOADER - STUB_HELPER_ENTRY - 7]](%rip), %r11
+-# CHECK-NEXT:    pushq %r11
+-# CHECK-NEXT:    jmpq *[[#%u, BINDER_OFF:]](%rip)
+-# CHECK-NEXT:    [[#%x, BINDER - BINDER_OFF]]: nop
+-# CHECK-NEXT:    pushq $0
+-# CHECK-NEXT:    jmp 0x[[#STUB_HELPER_ENTRY]]
+-# CHECK-NEXT:    pushq $21
+-# CHECK-NEXT:    jmp 0x[[#STUB_HELPER_ENTRY]]
+-
+-.text
+-.globl _main
+-
+-_main:
+-  sub $8, %rsp # 16-byte-align the stack; dyld checks for this
+-  callq _print_hello
+-  callq _print_goodbye
+-  add $8, %rsp
+-  ret
+diff --git a/lld/test/MachO/dylink.s b/lld/test/MachO/dylink.s
+deleted file mode 100644
+index 0549aab9829..00000000000
+--- a/lld/test/MachO/dylink.s
++++ /dev/null
+@@ -1,69 +0,0 @@
+-# REQUIRES: x86
+-# RUN: mkdir -p %t
+-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %p/Inputs/libhello.s \
+-# RUN:   -o %t/libhello.o
+-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %p/Inputs/libgoodbye.s \
+-# RUN:   -o %t/libgoodbye.o
+-# RUN: lld -flavor darwinnew -dylib -install_name \
+-# RUN:   @executable_path/libhello.dylib %t/libhello.o -o %t/libhello.dylib
+-# RUN: lld -flavor darwinnew -dylib -install_name \
+-# RUN:   @executable_path/libgoodbye.dylib %t/libgoodbye.o -o %t/libgoodbye.dylib
+-
+-## Make sure we are using the export trie and not the symbol table when linking
+-## against these dylibs.
+-# RUN: llvm-strip %t/libhello.dylib
+-# RUN: llvm-strip %t/libgoodbye.dylib
+-# RUN: llvm-nm %t/libhello.dylib 2>&1 | FileCheck %s --check-prefix=NOSYM
+-# RUN: llvm-nm %t/libgoodbye.dylib 2>&1 | FileCheck %s --check-prefix=NOSYM
+-# NOSYM: no symbols
+-
+-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t/dylink.o
+-# RUN: lld -flavor darwinnew -o %t/dylink -Z -L%t -lhello -lgoodbye %t/dylink.o
+-# RUN: llvm-objdump --bind -d --no-show-raw-insn %t/dylink | FileCheck %s
+-
+-# CHECK: movq [[#%u, HELLO_OFF:]](%rip), %rsi
+-# CHECK-NEXT: [[#%x, HELLO_RIP:]]:
+-
+-# CHECK: movq [[#%u, HELLO_ITS_ME_OFF:]](%rip), %rsi
+-# CHECK-NEXT: [[#%x, HELLO_ITS_ME_RIP:]]:
+-
+-# CHECK: pushq [[#%u, GOODBYE_OFF:]](%rip)
+-# CHECK-NEXT: [[#%x, GOODBYE_RIP:]]: popq %rsi
+-
+-# CHECK-LABEL: Bind table:
+-# CHECK-DAG: __DATA_CONST __got  0x{{0*}}[[#%x, HELLO_RIP + HELLO_OFF]]               pointer 0   libhello   _hello_world
+-# CHECK-DAG: __DATA_CONST __got  0x{{0*}}[[#%x, HELLO_ITS_ME_RIP + HELLO_ITS_ME_OFF]] pointer 0   libhello   _hello_its_me
+-# CHECK-DAG: __DATA_CONST __got  0x{{0*}}[[#%x, GOODBYE_RIP + GOODBYE_OFF]]           pointer 0   libgoodbye _goodbye_world
+-# CHECK-DAG: __DATA       __data 0x[[#%x, DATA_ADDR:]]                                pointer 0   libhello   _hello_world
+-# CHECK-DAG: __DATA       __data 0x{{0*}}[[#%x, DATA_ADDR + 8]]                       pointer 8   libhello   _hello_its_me
+-# CHECK-DAG: __DATA       __data 0x{{0*}}[[#%x, DATA_ADDR + 16]]                      pointer -15 libgoodbye _goodbye_world
+-
+-.section __TEXT,__text
+-.globl _main
+-
+-_main:
+-  movl $0x2000004, %eax # write() syscall
+-  mov $1, %rdi # stdout
+-  movq _hello_world@GOTPCREL(%rip), %rsi
+-  mov $13, %rdx # length of str
+-  syscall
+-
+-  movl $0x2000004, %eax # write() syscall
+-  mov $1, %rdi # stdout
+-  movq _hello_its_me@GOTPCREL(%rip), %rsi
+-  mov $15, %rdx # length of str
+-  syscall
+-
+-  movl $0x2000004, %eax # write() syscall
+-  mov $1, %rdi # stdout
+-  pushq _goodbye_world@GOTPCREL(%rip)
+-  popq %rsi
+-  mov $15, %rdx # length of str
+-  syscall
+-  mov $0, %rax
+-  ret
+-
+-.data
+-.quad _hello_world
+-.quad _hello_its_me + 0x8
+-.quad _goodbye_world - 0xf
+diff --git a/lld/test/MachO/entry-symbol.s b/lld/test/MachO/entry-symbol.s
+deleted file mode 100644
+index 159c7c5af04..00000000000
+--- a/lld/test/MachO/entry-symbol.s
++++ /dev/null
+@@ -1,28 +0,0 @@
+-# REQUIRES: x86
+-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t.o
+-# RUN: lld -flavor darwinnew -o %t %t.o -e _not_main
+-# RUN: llvm-objdump --macho --all-headers --syms %t | FileCheck %s
+-# CHECK-LABEL: SYMBOL TABLE
+-# CHECK-NEXT: {{0*}}[[#%x, ENTRY_ADDR:]] {{.*}} __TEXT,__text _not_main
+-# CHECK:      cmd  LC_MAIN
+-# CHECK-NEXT: cmdsize  24
+-# CHECK-NEXT: entryoff [[#ENTRYOFF:]]
+-# CHECK:      sectname __text
+-# CHECK-NEXT: segname __TEXT
+-## Note: the following checks assume that the entry symbol is right at the
+-## beginning of __text.
+-# CHECK-NEXT: addr 0x{{0*}}[[#ENTRY_ADDR]]
+-# CHECK-NEXT: size
+-# CHECK-NEXT: offset [[#ENTRYOFF]]
+-
+-
+-# RUN: not lld -flavor darwinnew -o /dev/null %t.o -e _missing 2>&1 | FileCheck %s --check-prefix=UNDEFINED
+-# UNDEFINED: error: undefined symbol: _missing
+-# RUN: not lld -flavor darwinnew -o /dev/null %t.o 2>&1 | FileCheck %s --check-prefix=DEFAULT-ENTRY
+-# DEFAULT-ENTRY: error: undefined symbol: _main
+-
+-.text
+-.global _not_main
+-_not_main:
+-  movq $0, %rax
+-  retq
+diff --git a/lld/test/MachO/export-trie.s b/lld/test/MachO/export-trie.s
+deleted file mode 100644
+index fc1f6d110db..00000000000
+--- a/lld/test/MachO/export-trie.s
++++ /dev/null
+@@ -1,44 +0,0 @@
+-# REQUIRES: x86
+-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t.o
+-# RUN: lld -flavor darwinnew -dylib %t.o -o %t.dylib
+-
+-# RUN: llvm-objdump --syms --exports-trie %t.dylib | \
+-# RUN:   FileCheck %s --check-prefix=EXPORTS
+-# EXPORTS-LABEL: SYMBOL TABLE:
+-# EXPORTS-DAG:   [[#%x, HELLO_ADDR:]] {{.*}} _hello
+-# EXPORTS-DAG:   [[#%x, HELLO_WORLD_ADDR:]] {{.*}} _hello_world
+-# EXPORTS-DAG:   [[#%x, HELLO_ITS_ME_ADDR:]] {{.*}} _hello_its_me
+-# EXPORTS-DAG:   [[#%x, HELLO_ITS_YOU_ADDR:]] {{.*}} _hello_its_you
+-# EXPORTS-LABEL: Exports trie:
+-# EXPORTS-DAG:   0x{{0*}}[[#%X, HELLO_ADDR]] _hello
+-# EXPORTS-DAG:   0x{{0*}}[[#%X, HELLO_WORLD_ADDR]] _hello_world
+-# EXPORTS-DAG:   0x{{0*}}[[#%x, HELLO_ITS_ME_ADDR:]] _hello_its_me
+-# EXPORTS-DAG:   0x{{0*}}[[#%x, HELLO_ITS_YOU_ADDR:]] _hello_its_you
+-
+-## Check that we are sharing prefixes in the trie.
+-# RUN: obj2yaml %t.dylib | FileCheck %s
+-# CHECK-LABEL: ExportTrie:
+-# CHECK: Name: ''
+-# CHECK: Name: _hello
+-# CHECK: Name: _
+-# CHECK: Name: world
+-# CHECK: Name: its_
+-# CHECK: Name: me
+-# CHECK: Name: you
+-
+-.section __TEXT,__cstring
+-.globl _hello, _hello_world, _hello_its_me, _hello_its_you
+-
+-## Test for when an entire symbol name is a prefix of another.
+-_hello:
+-.asciz "Hello!\n"
+-
+-_hello_world:
+-.asciz "Hello world!\n"
+-
+-.data
+-_hello_its_me:
+-.asciz "Hello, it's me\n"
+-
+-_hello_its_you:
+-.asciz "Hello, it's you\n"
+diff --git a/lld/test/MachO/fat-arch.s b/lld/test/MachO/fat-arch.s
+deleted file mode 100644
+index cb5a74b0917..00000000000
+--- a/lld/test/MachO/fat-arch.s
++++ /dev/null
+@@ -1,16 +0,0 @@
+-# REQUIRES: x86
+-# RUN: llvm-mc -filetype=obj -triple=i386-apple-darwin %s -o %t.i386.o
+-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t.x86_64.o
+-# RUN: llvm-lipo %t.i386.o %t.x86_64.o -create -o %t.fat.o
+-# RUN: lld -flavor darwinnew -o /dev/null %t.fat.o
+-
+-# RUN: llvm-lipo %t.i386.o -create -o %t.noarch.o
+-# RUN: not lld -flavor darwinnew -o /dev/null %t.noarch.o 2>&1 | \
+-# RUN:    FileCheck %s -DFILE=%t.noarch.o
+-# CHECK: error: unable to find matching architecture in [[FILE]]
+-
+-.text
+-.global _main
+-_main:
+-  mov $0, %eax
+-  ret
+diff --git a/lld/test/MachO/invalid/alignment-too-large.yaml b/lld/test/MachO/invalid/alignment-too-large.yaml
+deleted file mode 100644
+index 79950524bcf..00000000000
+--- a/lld/test/MachO/invalid/alignment-too-large.yaml
++++ /dev/null
+@@ -1,58 +0,0 @@
+-# RUN: yaml2obj %s -o %t.o
+-# RUN: not lld -flavor darwinnew -o %t %t.o 2>&1 | FileCheck %s
+-#
+-# CHECK: error: alignment 32 of section __text is too large
+---- !mach-o
+-FileHeader:
+-  magic:           0xFEEDFACF
+-  cputype:         0x01000007
+-  cpusubtype:      0x00000003
+-  filetype:        0x00000001
+-  ncmds:           4
+-  sizeofcmds:      280
+-  flags:           0x00000000
+-  reserved:        0x00000000
+-LoadCommands:
+-  - cmd:             LC_SEGMENT_64
+-    cmdsize:         152
+-    segname:         ''
+-    vmaddr:          0
+-    vmsize:          8
+-    fileoff:         312
+-    filesize:        8
+-    maxprot:         7
+-    initprot:        7
+-    nsects:          1
+-    flags:           0
+-    Sections:
+-      - sectname:        __text
+-        segname:         __TEXT
+-        addr:            0x0000000000000000
+-        size:            8
+-        offset:          0x00000138
+-        align:           32
+-        reloff:          0x00000000
+-        nreloc:          0
+-        flags:           0x80000400
+-        reserved1:       0x00000000
+-        reserved2:       0x00000000
+-        reserved3:       0x00000000
+-        content:         48C7C000000000C3
+-  - cmd:             LC_SYMTAB
+-    cmdsize:         24
+-    symoff:          320
+-    nsyms:           1
+-    stroff:          336
+-    strsize:         8
+-LinkEditData:
+-  NameList:
+-    - n_strx:          1
+-      n_type:          0x0F
+-      n_sect:          1
+-      n_desc:          0
+-      n_value:         0
+-  StringTable:
+-    - ''
+-    - _main
+-    - ''
+-...
+diff --git a/lld/test/MachO/invalid/archive-no-index.s b/lld/test/MachO/invalid/archive-no-index.s
+deleted file mode 100644
+index 0f2f023e83c..00000000000
+--- a/lld/test/MachO/invalid/archive-no-index.s
++++ /dev/null
+@@ -1,17 +0,0 @@
+-# REQUIRES: x86
+-# RUN: mkdir -p %t
+-# RUN: echo ".global _boo; _boo: ret"                           | llvm-mc -filetype=obj -triple=x86_64-apple-darwin -o %t/2.o
+-# RUN: echo ".global _bar; _bar: ret"                           | llvm-mc -filetype=obj -triple=x86_64-apple-darwin -o %t/3.o
+-# RUN: echo ".global _undefined; .global _unused; _unused: ret" | llvm-mc -filetype=obj -triple=x86_64-apple-darwin -o %t/4.o
+-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t/main.o
+-
+-# RUN: rm -f %t/test.a
+-# RUN: llvm-ar rcS %t/test.a %t/2.o %t/3.o %t/4.o
+-
+-# RUN: not lld -flavor darwinnew %t/test.o %t/test.a -o /dev/null 2>&1 | FileCheck %s
+-# CHECK: error: {{.*}}.a: archive has no index; run ranlib to add one
+-
+-.global _main
+-_main:
+-  mov $0, %rax
+-  ret
+diff --git a/lld/test/MachO/invalid/bad-archive.s b/lld/test/MachO/invalid/bad-archive.s
+deleted file mode 100644
+index 9429dc3ec31..00000000000
+--- a/lld/test/MachO/invalid/bad-archive.s
++++ /dev/null
+@@ -1,11 +0,0 @@
+-# REQUIRES: x86
+-# RUN: echo "!<arch>" > %t.a
+-# RUN: echo "foo" >> %t.a
+-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t.o
+-
+-# RUN: not lld -flavor darwinnew %t.o %t.a -o /dev/null 2>&1 | FileCheck -DFILE=%t.a %s
+-# CHECK: error: [[FILE]]: failed to parse archive: truncated or malformed archive (remaining size of archive too small for next archive member header at offset 8)
+-
+-.global _main
+-_main:
+-  ret
+diff --git a/lld/test/MachO/invalid/duplicate-symbol.s b/lld/test/MachO/invalid/duplicate-symbol.s
+deleted file mode 100644
+index d08f34fc0de..00000000000
+--- a/lld/test/MachO/invalid/duplicate-symbol.s
++++ /dev/null
+@@ -1,12 +0,0 @@
+-# REQUIRES: x86
+-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t.o
+-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t-dup.o
+-# RUN: not lld -flavor darwinnew -o /dev/null %t-dup.o %t.o 2>&1 | FileCheck %s
+-
+-# CHECK: error: duplicate symbol: _main
+-
+-.text
+-.global _main
+-_main:
+-  mov $0, %rax
+-  ret
+diff --git a/lld/test/MachO/invalid/invalid-executable.s b/lld/test/MachO/invalid/invalid-executable.s
+deleted file mode 100644
+index d8d7accf49c..00000000000
+--- a/lld/test/MachO/invalid/invalid-executable.s
++++ /dev/null
+@@ -1,11 +0,0 @@
+-# REQUIRES: x86
+-# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-darwin %s -o %t.o
+-# RUN: lld -flavor darwinnew -o %t %t.o
+-# RUN: not lld -flavor darwinnew -o /dev/null %t 2>&1 | FileCheck %s -DFILE=%t
+-# CHECK: error: [[FILE]]: unhandled file type
+-
+-.text
+-.global _main
+-_main:
+-  mov $0, %rax
+-  ret
+diff --git a/lld/test/MachO/invalid/invalid-fat-narch.s b/lld/test/MachO/invalid/invalid-fat-narch.s
+deleted file mode 100644
+index 2b74893bff4..00000000000
+--- a/lld/test/MachO/invalid/invalid-fat-narch.s
++++ /dev/null
+@@ -1,12 +0,0 @@
+-# REQUIRES: x86
+-# RUN: yaml2obj %s -o %t.o
+-# RUN: not lld -flavor darwinnew -o /dev/null %t.o 2>&1 | \
+-# RUN:    FileCheck %s -DFILE=%t.o
+-# CHECK: error: [[FILE]]: fat_arch struct extends beyond end of file
+-
+-!fat-mach-o
+-FatHeader:
+-  magic:           0xCAFEBABE
+-  nfat_arch:       2
+-FatArchs:
+-Slices:
+diff --git a/lld/test/MachO/invalid/invalid-fat-offset.s b/lld/test/MachO/invalid/invalid-fat-offset.s
+deleted file mode 100644
+index fed97907352..00000000000
+--- a/lld/test/MachO/invalid/invalid-fat-offset.s
++++ /dev/null
+@@ -1,22 +0,0 @@
+-# REQUIRES: x86
+-# RUN: yaml2obj %s -o %t.o
+-# RUN: not lld -flavor darwinnew -o /dev/null %t.o 2>&1 | \
+-# RUN:    FileCheck %s -DFILE=%t.o
+-# CHECK: error: [[FILE]]: slice extends beyond end of file
+-
+-!fat-mach-o
+-FatHeader:
+-  magic:           0xCAFEBABE
+-  nfat_arch:       2
+-FatArchs:
+-  - cputype:         0x01000007
+-    cpusubtype:      0x00000003
+-    offset:          0x0000000000001000
+-    size:            0
+-    align:           12
+-  - cputype:         0x00000007
+-    cpusubtype:      0x00000003
+-    offset:          0x000000000000B000
+-    size:            0
+-    align:           12
+-Slices:
+diff --git a/lld/test/MachO/invalid/invalid-relocation-length.yaml b/lld/test/MachO/invalid/invalid-relocation-length.yaml
+deleted file mode 100644
+index e256c4fb7a8..00000000000
+--- a/lld/test/MachO/invalid/invalid-relocation-length.yaml
++++ /dev/null
+@@ -1,99 +0,0 @@
+-# REQUIRES: x86
+-# RUN: yaml2obj %s -o %t.o
+-# RUN: not lld -flavor darwinnew -o %t %t.o 2>&1 | FileCheck %s -DFILE=%t.o
+-#
+-# CHECK: error: invalid relocation at offset 1 of __TEXT,__text in [[FILE]]: relocations of type 0 must have r_length of 2 or 3
+-
+-!mach-o
+-FileHeader:
+-  magic:           0xFEEDFACF
+-  cputype:         0x01000007
+-  cpusubtype:      0x00000003
+-  filetype:        0x00000001
+-  ncmds:           4
+-  sizeofcmds:      280
+-  flags:           0x00000000
+-  reserved:        0x00000000
+-LoadCommands:
+-  - cmd:             LC_SEGMENT_64
+-    cmdsize:         152
+-    segname:         ''
+-    vmaddr:          0
+-    vmsize:          9
+-    fileoff:         312
+-    filesize:        9
+-    maxprot:         7
+-    initprot:        7
+-    nsects:          1
+-    flags:           0
+-    Sections:
+-      - sectname:        __text
+-        segname:         __TEXT
+-        addr:            0x0000000000000000
+-        size:            9
+-        offset:          0x00000138
+-        align:           0
+-        reloff:          0x00000144
+-        nreloc:          1
+-        flags:           0x80000000
+-        reserved1:       0x00000000
+-        reserved2:       0x00000000
+-        reserved3:       0x00000000
+-        content:         '000000000000000000'
+-        relocations:
+-          - address:         0x00000001
+-            symbolnum:       1
+-            pcrel:           false
+-            length:          1
+-            extern:          true
+-            type:            0
+-            scattered:       false
+-            value:           0
+-  - cmd:             LC_BUILD_VERSION
+-    cmdsize:         24
+-    platform:        1
+-    minos:           659200
+-    sdk:             0
+-    ntools:          0
+-  - cmd:             LC_SYMTAB
+-    cmdsize:         24
+-    symoff:          332
+-    nsyms:           2
+-    stroff:          364
+-    strsize:         12
+-  - cmd:             LC_DYSYMTAB
+-    cmdsize:         80
+-    ilocalsym:       0
+-    nlocalsym:       0
+-    iextdefsym:      0
+-    nextdefsym:      2
+-    iundefsym:       2
+-    nundefsym:       0
+-    tocoff:          0
+-    ntoc:            0
+-    modtaboff:       0
+-    nmodtab:         0
+-    extrefsymoff:    0
+-    nextrefsyms:     0
+-    indirectsymoff:  0
+-    nindirectsyms:   0
+-    extreloff:       0
+-    nextrel:         0
+-    locreloff:       0
+-    nlocrel:         0
+-LinkEditData:
+-  NameList:
+-    - n_strx:          1
+-      n_type:          0x0F
+-      n_sect:          1
+-      n_desc:          0
+-      n_value:         1
+-    - n_strx:          6
+-      n_type:          0x0F
+-      n_sect:          1
+-      n_desc:          0
+-      n_value:         9
+-  StringTable:
+-    - ''
+-    - _foo
+-    - _main
+diff --git a/lld/test/MachO/invalid/invalid-relocation-pcrel.yaml b/lld/test/MachO/invalid/invalid-relocation-pcrel.yaml
+deleted file mode 100644
+index ed7c24ead74..00000000000
+--- a/lld/test/MachO/invalid/invalid-relocation-pcrel.yaml
++++ /dev/null
+@@ -1,99 +0,0 @@
+-# REQUIRES: x86
+-# RUN: yaml2obj %s -o %t.o
+-# RUN: not lld -flavor darwinnew -o %t %t.o 2>&1 | FileCheck %s -DFILE=%t.o
+-#
+-# CHECK: error: invalid relocation at offset 1 of __TEXT,__text in [[FILE]]: relocations of type 0 must not be pcrel
+-
+-!mach-o
+-FileHeader:
+-  magic:           0xFEEDFACF
+-  cputype:         0x01000007
+-  cpusubtype:      0x00000003
+-  filetype:        0x00000001
+-  ncmds:           4
+-  sizeofcmds:      280
+-  flags:           0x00000000
+-  reserved:        0x00000000
+-LoadCommands:
+-  - cmd:             LC_SEGMENT_64
+-    cmdsize:         152
+-    segname:         ''
+-    vmaddr:          0
+-    vmsize:          9
+-    fileoff:         312
+-    filesize:        9
+-    maxprot:         7
+-    initprot:        7
+-    nsects:          1
+-    flags:           0
+-    Sections:
+-      - sectname:        __text
+-        segname:         __TEXT
+-        addr:            0x0000000000000000
+-        size:            9
+-        offset:          0x00000138
+-        align:           0
+-        reloff:          0x00000144
+-        nreloc:          1
+-        flags:           0x80000000
+-        reserved1:       0x00000000
+-        reserved2:       0x00000000
+-        reserved3:       0x00000000
+-        content:         '000000000000000000'
+-        relocations:
+-          - address:         0x00000001
+-            symbolnum:       1
+-            pcrel:           true
+-            length:          3
+-            extern:          true
+-            type:            0
+-            scattered:       false
+-            value:           0
+-  - cmd:             LC_BUILD_VERSION
+-    cmdsize:         24
+-    platform:        1
+-    minos:           659200
+-    sdk:             0
+-    ntools:          0
+-  - cmd:             LC_SYMTAB
+-    cmdsize:         24
+-    symoff:          332
+-    nsyms:           2
+-    stroff:          364
+-    strsize:         12
+-  - cmd:             LC_DYSYMTAB
+-    cmdsize:         80
+-    ilocalsym:       0
+-    nlocalsym:       0
+-    iextdefsym:      0
+-    nextdefsym:      2
+-    iundefsym:       2
+-    nundefsym:       0
+-    tocoff:          0
+-    ntoc:            0
+-    modtaboff:       0
+-    nmodtab:         0
+-    extrefsymoff:    0
+-    nextrefsyms:     0
+-    indirectsymoff:  0
+-    nindirectsyms:   0
+-    extreloff:       0
+-    nextrel:         0
+-    locreloff:       0
+-    nlocrel:         0
+-LinkEditData:
+-  NameList:
+-    - n_strx:          1
+-      n_type:          0x0F
+-      n_sect:          1
+-      n_desc:          0
+-      n_value:         1
+-    - n_strx:          6
+-      n_type:          0x0F
+-      n_sect:          1
+-      n_desc:          0
+-      n_value:         9
+-  StringTable:
+-    - ''
+-    - _foo
+-    - _main
+diff --git a/lld/test/MachO/invalid/missing-dylib.s b/lld/test/MachO/invalid/missing-dylib.s
+deleted file mode 100644
+index ad7e51130c4..00000000000
+--- a/lld/test/MachO/invalid/missing-dylib.s
++++ /dev/null
+@@ -1,5 +0,0 @@
+-# REQUIRES: x86
+-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t.o
+-# RUN: not lld -flavor darwinnew -Z -o %t -lmissing %t.o 2>&1 | FileCheck %s
+-
+-# CHECK: error: library not found for -lmissing
+diff --git a/lld/test/MachO/invalid/no-id-dylink.yaml b/lld/test/MachO/invalid/no-id-dylink.yaml
+deleted file mode 100644
+index d5b0b33dcfe..00000000000
+--- a/lld/test/MachO/invalid/no-id-dylink.yaml
++++ /dev/null
+@@ -1,166 +0,0 @@
+-# REQUIRES: x86
+-# RUN: mkdir -p %t
+-# RUN: yaml2obj %s -o %t/libnoid.dylib
+-# RUN: echo ".globl _main; .text; _main: ret" | llvm-mc -filetype=obj -triple=x86_64-apple-darwin -o %t/no-id-dylink.o
+-# RUN: not lld -flavor darwinnew -o %t/no-id-dylink -Z -L%t -lnoid %t/no-id-dylink.o 2>&1 | FileCheck %s
+-# CHECK: error: dylib {{.*}}libnoid.dylib missing LC_ID_DYLIB load command
+-
+-## This YAML file was originally generated from linking the following source
+-## input with ld64 and passing the resulting binary through obj2yaml:
+-##
+-## .section __TEXT,__cstring
+-## .globl _hello_world
+-##
+-## _hello_world:
+-## .asciz "Hello world!\n"
+-##
+-## Then we deleted the LC_ID_DYLIB command from the file.
+-
+-!mach-o
+-FileHeader:
+-  magic:           0xFEEDFACF
+-  cputype:         0x01000007
+-  cpusubtype:      0x00000003
+-  filetype:        0x00000006
+-  ncmds:           10
+-  sizeofcmds:      616
+-  flags:           0x00100085
+-  reserved:        0x00000000
+-LoadCommands:
+-  - cmd:             LC_SEGMENT_64
+-    cmdsize:         232
+-    segname:         __TEXT
+-    vmaddr:          0
+-    vmsize:          4096
+-    fileoff:         0
+-    filesize:        4096
+-    maxprot:         5
+-    initprot:        5
+-    nsects:          2
+-    flags:           0
+-    Sections:
+-      - sectname:        __text
+-        segname:         __TEXT
+-        addr:            0x0000000000000FF2
+-        size:            0
+-        offset:          0x00000FF2
+-        align:           0
+-        reloff:          0x00000000
+-        nreloc:          0
+-        flags:           0x80000400
+-        reserved1:       0x00000000
+-        reserved2:       0x00000000
+-        reserved3:       0x00000000
+-        content:         ''
+-      - sectname:        __cstring
+-        segname:         __TEXT
+-        addr:            0x0000000000000FF2
+-        size:            14
+-        offset:          0x00000FF2
+-        align:           0
+-        reloff:          0x00000000
+-        nreloc:          0
+-        flags:           0x00000002
+-        reserved1:       0x00000000
+-        reserved2:       0x00000000
+-        reserved3:       0x00000000
+-        content:         48656C6C6F20776F726C64210A00
+-  - cmd:             LC_SEGMENT_64
+-    cmdsize:         72
+-    segname:         __LINKEDIT
+-    vmaddr:          4096
+-    vmsize:          4096
+-    fileoff:         4096
+-    filesize:        64
+-    maxprot:         1
+-    initprot:        1
+-    nsects:          0
+-    flags:           0
+-  - cmd:             LC_DYLD_INFO_ONLY
+-    cmdsize:         48
+-    rebase_off:      0
+-    rebase_size:     0
+-    bind_off:        0
+-    bind_size:       0
+-    weak_bind_off:   0
+-    weak_bind_size:  0
+-    lazy_bind_off:   0
+-    lazy_bind_size:  0
+-    export_off:      4096
+-    export_size:     24
+-  - cmd:             LC_SYMTAB
+-    cmdsize:         24
+-    symoff:          4128
+-    nsyms:           1
+-    stroff:          4144
+-    strsize:         16
+-  - cmd:             LC_DYSYMTAB
+-    cmdsize:         80
+-    ilocalsym:       0
+-    nlocalsym:       0
+-    iextdefsym:      0
+-    nextdefsym:      1
+-    iundefsym:       1
+-    nundefsym:       0
+-    tocoff:          0
+-    ntoc:            0
+-    modtaboff:       0
+-    nmodtab:         0
+-    extrefsymoff:    0
+-    nextrefsyms:     0
+-    indirectsymoff:  0
+-    nindirectsyms:   0
+-    extreloff:       0
+-    nextrel:         0
+-    locreloff:       0
+-    nlocrel:         0
+-  - cmd:             LC_UUID
+-    cmdsize:         24
+-    uuid:            4826226E-9210-3984-A388-D5BD6D6DB368
+-  - cmd:             LC_BUILD_VERSION
+-    cmdsize:         32
+-    platform:        1
+-    minos:           659200
+-    sdk:             659200
+-    ntools:          1
+-    Tools:
+-      - tool:            3
+-        version:         34734080
+-  - cmd:             LC_SOURCE_VERSION
+-    cmdsize:         16
+-    version:         0
+-  - cmd:             LC_FUNCTION_STARTS
+-    cmdsize:         16
+-    dataoff:         4120
+-    datasize:        8
+-  - cmd:             LC_DATA_IN_CODE
+-    cmdsize:         16
+-    dataoff:         4128
+-    datasize:        0
+-LinkEditData:
+-  ExportTrie:
+-    TerminalSize:    0
+-    NodeOffset:      0
+-    Name:            ''
+-    Flags:           0x0000000000000000
+-    Address:         0x0000000000000000
+-    Other:           0x0000000000000000
+-    ImportName:      ''
+-    Children:
+-      - TerminalSize:    3
+-        NodeOffset:      16
+-        Name:            _hello_world
+-        Flags:           0x0000000000000000
+-        Address:         0x0000000000000FF2
+-        Other:           0x0000000000000000
+-        ImportName:      ''
+-  NameList:
+-    - n_strx:          2
+-      n_type:          0x0F
+-      n_sect:          2
+-      n_desc:          0
+-      n_value:         4082
+-  StringTable:
+-    - ' '
+-    - _hello_world
+-    - ''
+diff --git a/lld/test/MachO/invalid/no-such-file.s b/lld/test/MachO/invalid/no-such-file.s
+deleted file mode 100644
+index 0122c6105fb..00000000000
+--- a/lld/test/MachO/invalid/no-such-file.s
++++ /dev/null
+@@ -1,4 +0,0 @@
+-# REQUIRES: x86
+-# RUN: not lld -flavor darwinnew -o /dev/null %t-no-such-file.o 2>&1 | FileCheck %s
+-
+-# CHECK: error: cannot open {{.*}}no-such-file.o
+diff --git a/lld/test/MachO/invalid/order-file-bad-arch.test b/lld/test/MachO/invalid/order-file-bad-arch.test
+deleted file mode 100644
+index 84fe6963d24..00000000000
+--- a/lld/test/MachO/invalid/order-file-bad-arch.test
++++ /dev/null
+@@ -1,9 +0,0 @@
+-# REQUIRES: x86
+-# RUN: echo ".globl _main; .text; _main: ret" | llvm-mc -filetype=obj -triple=x86_64-apple-darwin -o %t.o
+-# RUN: not lld -flavor darwinnew -o %t %t.o -order_file %s 2>&1 | FileCheck %s
+-# CHECK: error: invalid arch "sparc" in order file:  expected one of arm, arm64, i386, x86_64, ppc, ppc64
+-# CHECK-EMPTY:
+-
+-_barsymbol
+-sparc:hello.o:_foosymbol
+-i386:hello.o:_foosymbol
+diff --git a/lld/test/MachO/invalid/order-file-bad-objfile.test b/lld/test/MachO/invalid/order-file-bad-objfile.test
+deleted file mode 100644
+index 19e9404da42..00000000000
+--- a/lld/test/MachO/invalid/order-file-bad-objfile.test
++++ /dev/null
+@@ -1,10 +0,0 @@
+-# REQUIRES: x86
+-# RUN: echo ".globl _main; .text; _main: ret" | llvm-mc -filetype=obj -triple=x86_64-apple-darwin -o %t.o
+-# RUN: not lld -flavor darwinnew -o %t %t.o -order_file %s 2>&1 | FileCheck %s
+-# CHECK: invalid object file name "helloo" in order file: should end with .o
+-# CHECK: invalid object file name "z80" in order file: should end with .o
+-# CHECK-EMPTY:
+-
+-_barsymbol
+-x86_64:helloo:_foosymbol
+-z80:_foosymbol
+diff --git a/lld/test/MachO/invalid/reserved-section-name.s b/lld/test/MachO/invalid/reserved-section-name.s
+deleted file mode 100644
+index 8d767bcf292..00000000000
+--- a/lld/test/MachO/invalid/reserved-section-name.s
++++ /dev/null
+@@ -1,14 +0,0 @@
+-# REQUIRES: x86
+-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t.o
+-# RUN: not lld -flavor darwinnew -o %t %t.o 2>&1 | FileCheck %s -DFILE=%t.o
+-# CHECK: error: section from [[FILE]] conflicts with synthetic section __DATA_CONST,__got
+-
+-.globl _main
+-
+-.section __DATA_CONST,__got
+-.space 1
+-
+-.text
+-_main:
+-  mov $0, %rax
+-  ret
+diff --git a/lld/test/MachO/invalid/stub-link.s b/lld/test/MachO/invalid/stub-link.s
+deleted file mode 100644
+index f1c15903702..00000000000
+--- a/lld/test/MachO/invalid/stub-link.s
++++ /dev/null
+@@ -1,15 +0,0 @@
+-# REQUIRES: x86
+-
+-# RUN: mkdir -p %t
+-#
+-# RUN: llvm-mc -filetype obj -triple x86_64-apple-ios %s -o %t/test.o
+-# RUN: not lld -flavor darwinnew -o %t/test -Z -L%S/../Inputs/iPhoneSimulator.sdk/usr/lib -lSystem %t/test.o 2>&1 | FileCheck %s
+-
+-# CHECK: error: undefined symbol __cache_handle_memory_pressure_event
+-
+-.section __TEXT,__text
+-.global _main
+-
+-_main:
+-  movq __cache_handle_memory_pressure_event@GOTPCREL(%rip), %rax
+-  ret
+diff --git a/lld/test/MachO/invalid/undefined-symbol.s b/lld/test/MachO/invalid/undefined-symbol.s
+deleted file mode 100644
+index 88eabfd1ce0..00000000000
+--- a/lld/test/MachO/invalid/undefined-symbol.s
++++ /dev/null
+@@ -1,11 +0,0 @@
+-# REQUIRES: x86
+-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t.o
+-# RUN: not lld -flavor darwinnew -Z -o %t %t.o 2>&1 | FileCheck %s -DBASENAME=%basename_t
+-# CHECK: error: undefined symbol _foo, referenced from [[BASENAME]]
+-
+-.globl _main
+-.text
+-_main:
+-  callq _foo
+-  movq $0, %rax
+-  retq
+diff --git a/lld/test/MachO/link-search-order.s b/lld/test/MachO/link-search-order.s
+deleted file mode 100644
+index 9819e171c7d..00000000000
+--- a/lld/test/MachO/link-search-order.s
++++ /dev/null
+@@ -1,43 +0,0 @@
+-# REQUIRES: x86
+-
+-# RUN: mkdir -p %t
+-#
+-# RUN: llvm-mc -filetype obj -triple x86_64-apple-darwin %p/Inputs/libhello.s -o %t/hello.o
+-# RUN: lld -flavor darwinnew -dylib -install_name @executable_path/libhello.dylib %t/hello.o -o %t/libhello.dylib
+-#
+-# RUN: llvm-mc -filetype obj -triple x86_64-apple-darwin %p/Inputs/libgoodbye.s -o %t/goodbye.o
+-# RUN: lld -flavor darwinnew -dylib -install_name @executable_path/libgoodbye.dylib %t/goodbye.o -o %t/libgoodbye.dylib
+-# RUN: llvm-ar --format=darwin crs %t/libgoodbye.a %t/goodbye.o
+-#
+-# RUN: llvm-mc -filetype obj -triple x86_64-apple-darwin %s -o %t/test.o
+-# RUN: lld -flavor darwinnew -L%S/Inputs/MacOSX.sdk/usr/lib -o %t/test -Z -L%t -lhello -lgoodbye -lSystem %t/test.o
+-#
+-# RUN: llvm-objdump --macho --dylibs-used %t/test | FileCheck %s
+-
+-# CHECK: @executable_path/libhello.dylib
+-# CHECK: @executable_path/libgoodbye.dylib
+-# CHECK: /usr/lib/libSystem.B.dylib
+-
+-.section __TEXT,__text
+-.global _main
+-
+-_main:
+-  movl $0x2000004, %eax                         # write()
+-  mov $1, %rdi                                  # stdout
+-  movq _hello_world@GOTPCREL(%rip), %rsi
+-  mov $13, %rdx                                 # length
+-  syscall
+-
+-  movl $0x2000004, %eax                         # write()
+-  mov $1, %rdi                                  # stdout
+-  movq _hello_its_me@GOTPCREL(%rip), %rsi
+-  mov $15, %rdx                                 # length
+-  syscall
+-
+-  movl $0x2000004, %eax                         # write()
+-  mov $1, %rdi                                  # stdout
+-  movq _goodbye_world@GOTPCREL(%rip), %rsi
+-  mov $15, %rdx                                 # length
+-  syscall
+-  mov $0, %rax
+-  ret
+diff --git a/lld/test/MachO/load-commands.s b/lld/test/MachO/load-commands.s
+deleted file mode 100644
+index c9f5d9b5c21..00000000000
+--- a/lld/test/MachO/load-commands.s
++++ /dev/null
+@@ -1,22 +0,0 @@
+-# REQUIRES: x86
+-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t.o
+-# RUN: lld -flavor darwinnew -o %t %t.o
+-
+-## Check for the presence of load commands that are essential for a working
+-## executable.
+-# RUN: llvm-objdump --macho --all-headers %t | FileCheck %s
+-# CHECK-DAG: cmd LC_DYLD_INFO_ONLY
+-# CHECK-DAG: cmd LC_SYMTAB
+-# CHECK-DAG: cmd LC_DYSYMTAB
+-# CHECK-DAG: cmd LC_MAIN
+-# CHECK-DAG: cmd LC_LOAD_DYLINKER
+-
+-## Check for the absence of load commands that should not be in an executable.
+-# RUN: llvm-objdump --macho --all-headers %t | FileCheck %s --check-prefix=NCHECK
+-# NCHECK-NOT: cmd: LC_ID_DYLIB
+-
+-.text
+-.global _main
+-_main:
+-  mov $0, %rax
+-  ret
+diff --git a/lld/test/MachO/local-got.s b/lld/test/MachO/local-got.s
+deleted file mode 100644
+index 6099a6bf18c..00000000000
+--- a/lld/test/MachO/local-got.s
++++ /dev/null
+@@ -1,58 +0,0 @@
+-# REQUIRES: x86
+-# RUN: mkdir -p %t
+-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %p/Inputs/libhello.s \
+-# RUN:   -o %t/libhello.o
+-# RUN: lld -flavor darwinnew -L%S/Inputs/MacOSX.sdk/usr/lib -lSystem -dylib -install_name \
+-# RUN:   @executable_path/libhello.dylib %t/libhello.o -o %t/libhello.dylib
+-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t/test.o
+-# RUN: lld -flavor darwinnew -L%S/Inputs/MacOSX.sdk/usr/lib -lSystem -o %t/test %t/test.o -L%t -lhello
+-# RUN: llvm-objdump --full-contents --bind %t/test | FileCheck %s --match-full-lines
+-
+-## Check that the GOT references the cstrings. --full-contents displays the
+-## address offset and the contents at that address very similarly, so am using
+-## --match-full-lines to make sure we match on the right thing.
+-# CHECK:      Contents of section __cstring:
+-# CHECK-NEXT: 1000003cc {{.*}}
+-
+-## 1st 8 bytes refer to the start of __cstring + 0xe, 2nd 8 bytes refer to the
+-## start of __cstring
+-# CHECK:      Contents of section __got:
+-# CHECK-NEXT: [[#%X,ADDR:]]  da030000 01000000 cc030000 01000000 {{.*}}
+-# CHECK-NEXT: [[#ADDR + 16]] 00000000 00000000 {{.*}}
+-
+-## Check that a non-locally-defined symbol is still bound at the correct offset:
+-# CHECK: Bind table:
+-# CHECK-NEXT: segment      section  address         type     addend  dylib     symbol
+-# CHECK-NEXT: __DATA_CONST __got    0x[[#ADDR+16]]  pointer  0       libhello  _hello_its_me
+-
+-.globl _main
+-
+-.text
+-_main:
+-  movl $0x2000004, %eax # write() syscall
+-  mov $1, %rdi # stdout
+-  movq _hello_its_me@GOTPCREL(%rip), %rsi
+-  mov $15, %rdx # length of str
+-  syscall
+-
+-  movl $0x2000004, %eax # write() syscall
+-  mov $1, %rdi # stdout
+-  movq _hello_world@GOTPCREL(%rip), %rsi
+-  mov $13, %rdx # length of str
+-  syscall
+-
+-  movl $0x2000004, %eax # write() syscall
+-  mov $1, %rdi # stdout
+-  movq _goodbye_world@GOTPCREL(%rip), %rsi
+-  mov $15, %rdx # length of str
+-  syscall
+-
+-  mov $0, %rax
+-  ret
+-
+-.section __TEXT,__cstring
+-_hello_world:
+-  .asciz "Hello world!\n"
+-
+-_goodbye_world:
+-  .asciz "Goodbye world!\n"
+diff --git a/lld/test/MachO/no-exports-dylib.s b/lld/test/MachO/no-exports-dylib.s
+deleted file mode 100644
+index 896c31ef3c2..00000000000
+--- a/lld/test/MachO/no-exports-dylib.s
++++ /dev/null
+@@ -1,6 +0,0 @@
+-# REQUIRES: x86
+-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t.o
+-# RUN: lld -flavor darwinnew -dylib %t.o -o %t.dylib
+-
+-# RUN: obj2yaml %t.dylib | FileCheck %s
+-# CHECK: export_size: 0
+diff --git a/lld/test/MachO/order-file.s b/lld/test/MachO/order-file.s
+deleted file mode 100644
+index 4ced92a4eca..00000000000
+--- a/lld/test/MachO/order-file.s
++++ /dev/null
+@@ -1,131 +0,0 @@
+-# REQUIRES: x86
+-# RUN: mkdir -p %t
+-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t/test.o
+-# RUN: echo ".globl _foo; .text; _foo: _bar: ret" | \
+-# RUN:   llvm-mc -filetype=obj -triple=x86_64-apple-darwin -o %t/foo.o
+-# RUN: rm -f %t/foo.a
+-# RUN: llvm-ar rcs %t/foo.a %t/foo.o
+-
+-# FOO-FIRST: <_foo>:
+-# FOO-FIRST: <_main>:
+-
+-# FOO-SECOND: <_main>:
+-# FOO-SECOND: <_foo>:
+-
+-# RUN: echo "_foo # just a comment" > %t/ord-1
+-# RUN: echo "_main # another comment" >> %t/ord-1
+-# RUN: lld -flavor darwinnew -o %t/test-1 %t/test.o %t/foo.o -order_file %t/ord-1
+-# RUN: llvm-objdump -d %t/test-1 | FileCheck %s --check-prefix=FOO-FIRST
+-## Output should be the same regardless of the command-line order of object files
+-# RUN: lld -flavor darwinnew -o %t/test-1 %t/foo.o %t/test.o -order_file %t/ord-1
+-# RUN: llvm-objdump -d %t/test-1 | FileCheck %s --check-prefix=FOO-FIRST
+-
+-# RUN: echo "_main # just a comment" > %t/ord-2
+-# RUN: echo "_foo # another comment" >> %t/ord-2
+-# RUN: lld -flavor darwinnew -o %t/test-2 %t/test.o %t/foo.o -order_file %t/ord-2
+-# RUN: llvm-objdump -d %t/test-2 | FileCheck %s --check-prefix=FOO-SECOND
+-# RUN: lld -flavor darwinnew -o %t/test-2 %t/foo.o %t/test.o -order_file %t/ord-2
+-# RUN: llvm-objdump -d %t/test-2 | FileCheck %s --check-prefix=FOO-SECOND
+-
+-# RUN: echo "foo.o:_foo" > %t/ord-file-match
+-# RUN: echo "_main" >> %t/ord-file-match
+-# RUN: lld -flavor darwinnew -o %t/test-file-match %t/test.o %t/foo.o -order_file %t/ord-file-match
+-# RUN: llvm-objdump -d %t/test-file-match | FileCheck %s --check-prefix=FOO-FIRST
+-## Output should be the same regardless of the command-line order of object files
+-# RUN: lld -flavor darwinnew -o %t/test-file-match %t/foo.o %t/test.o -order_file %t/ord-file-match
+-# RUN: llvm-objdump -d %t/test-file-match | FileCheck %s --check-prefix=FOO-FIRST
+-
+-# RUN: echo "bar.o:_foo" > %t/ord-file-nomatch
+-# RUN: echo "_main" >> %t/ord-file-nomatch
+-# RUN: echo "_foo" >> %t/ord-file-nomatch
+-# RUN: lld -flavor darwinnew -o %t/test-file-nomatch %t/test.o %t/foo.o -order_file %t/ord-file-nomatch
+-# RUN: llvm-objdump -d %t/test-file-nomatch | FileCheck %s --check-prefix=FOO-SECOND
+-# RUN: lld -flavor darwinnew -o %t/test-file-nomatch %t/foo.o %t/test.o -order_file %t/ord-file-nomatch
+-# RUN: llvm-objdump -d %t/test-file-nomatch | FileCheck %s --check-prefix=FOO-SECOND
+-
+-# RUN: echo "x86_64:_foo" > %t/ord-arch-match
+-# RUN: echo "_main" >> %t/ord-arch-match
+-# RUN: lld -flavor darwinnew -o %t/test-arch-match %t/test.o %t/foo.o -order_file %t/ord-arch-match
+-# RUN: llvm-objdump -d %t/test-arch-match | FileCheck %s --check-prefix=FOO-FIRST
+-# RUN: lld -flavor darwinnew -o %t/test-arch-match %t/foo.o %t/test.o -order_file %t/ord-arch-match
+-# RUN: llvm-objdump -d %t/test-arch-match | FileCheck %s --check-prefix=FOO-FIRST
+-
+-# RUN: echo "ppc:_foo" > %t/ord-arch-nomatch
+-# RUN: echo "_main" >> %t/ord-arch-nomatch
+-# RUN: echo "_foo" >> %t/ord-arch-nomatch
+-# RUN: lld -flavor darwinnew -o %t/test-arch-nomatch %t/test.o %t/foo.o -order_file %t/ord-arch-nomatch
+-# RUN: llvm-objdump -d %t/test-arch-nomatch | FileCheck %s --check-prefix=FOO-SECOND
+-# RUN: lld -flavor darwinnew -o %t/test-arch-nomatch %t/foo.o %t/test.o -order_file %t/ord-arch-nomatch
+-# RUN: llvm-objdump -d %t/test-arch-nomatch | FileCheck %s --check-prefix=FOO-SECOND
+-
+-# RUN: echo "x86_64:bar.o:_foo" > %t/ord-arch-file-match
+-# RUN: echo "_main" >> %t/ord-arch-match
+-# RUN: lld -flavor darwinnew -o %t/test-arch-match %t/test.o %t/foo.o -order_file %t/ord-arch-match
+-# RUN: llvm-objdump -d %t/test-arch-match | FileCheck %s --check-prefix=FOO-FIRST
+-# RUN: lld -flavor darwinnew -o %t/test-arch-match %t/foo.o %t/test.o -order_file %t/ord-arch-match
+-# RUN: llvm-objdump -d %t/test-arch-match | FileCheck %s --check-prefix=FOO-FIRST
+-
+-## Test archives
+-
+-# RUN: lld -flavor darwinnew -o %t/test-archive-1 %t/test.o %t/foo.a -order_file %t/ord-1
+-# RUN: llvm-objdump -d %t/test-archive-1 | FileCheck %s --check-prefix=FOO-FIRST
+-# RUN: lld -flavor darwinnew -o %t/test-archive-1 %t/foo.a %t/test.o -order_file %t/ord-1
+-# RUN: llvm-objdump -d %t/test-archive-1 | FileCheck %s --check-prefix=FOO-FIRST
+-
+-# RUN: lld -flavor darwinnew -o %t/test-archive-file-no-match %t/test.o %t/foo.a -order_file %t/ord-file-nomatch
+-# RUN: llvm-objdump -d %t/test-archive-file-no-match | FileCheck %s --check-prefix=FOO-SECOND
+-# RUN: lld -flavor darwinnew -o %t/test-archive %t/foo.a %t/test.o -order_file %t/ord-file-nomatch
+-# RUN: llvm-objdump -d %t/test-archive-file-no-match | FileCheck %s --check-prefix=FOO-SECOND
+-
+-## The following tests check that if an address is matched by multiple order
+-## file entries, it should always use the lowest-ordered match.
+-
+-# RUN: echo "_foo" > %t/ord-multiple-1
+-# RUN: echo "_main" >> %t/ord-multiple-1
+-# RUN: echo "foo.o:_foo" >> %t/ord-multiple-1
+-# RUN: lld -flavor darwinnew -o %t/test-1 %t/test.o %t/foo.o -order_file %t/ord-multiple-1
+-# RUN: llvm-objdump -d %t/test-1 | FileCheck %s --check-prefix=FOO-FIRST
+-# RUN: lld -flavor darwinnew -o %t/test-1 %t/foo.o %t/test.o -order_file %t/ord-multiple-1
+-# RUN: llvm-objdump -d %t/test-1 | FileCheck %s --check-prefix=FOO-FIRST
+-
+-# RUN: echo "foo.o:_foo" > %t/ord-multiple-2
+-# RUN: echo "_main" >> %t/ord-multiple-2
+-# RUN: echo "_foo" >> %t/ord-multiple-2
+-# RUN: lld -flavor darwinnew -o %t/test-2 %t/test.o %t/foo.o -order_file %t/ord-multiple-2
+-# RUN: llvm-objdump -d %t/test-2 | FileCheck %s --check-prefix=FOO-FIRST
+-# RUN: lld -flavor darwinnew -o %t/test-2 %t/foo.o %t/test.o -order_file %t/ord-multiple-2
+-# RUN: llvm-objdump -d %t/test-2 | FileCheck %s --check-prefix=FOO-FIRST
+-
+-# RUN: echo "_foo" > %t/ord-multiple-3
+-# RUN: echo "_main" >> %t/ord-multiple-3
+-# RUN: echo "_foo" >> %t/ord-multiple-3
+-# RUN: lld -flavor darwinnew -o %t/test-3 %t/test.o %t/foo.o -order_file %t/ord-multiple-3
+-# RUN: llvm-objdump -d %t/test-3 | FileCheck %s --check-prefix=FOO-FIRST
+-# RUN: lld -flavor darwinnew -o %t/test-3 %t/foo.o %t/test.o -order_file %t/ord-multiple-3
+-# RUN: llvm-objdump -d %t/test-3 | FileCheck %s --check-prefix=FOO-FIRST
+-
+-# RUN: echo "foo.o:_foo" > %t/ord-multiple-4
+-# RUN: echo "_main" >> %t/ord-multiple-4
+-# RUN: echo "foo.o:_foo" >> %t/ord-multiple-4
+-# RUN: lld -flavor darwinnew -o %t/test-4 %t/test.o %t/foo.o -order_file %t/ord-multiple-4
+-# RUN: llvm-objdump -d %t/test-4 | FileCheck %s --check-prefix=FOO-FIRST
+-# RUN: lld -flavor darwinnew -o %t/test-4 %t/foo.o %t/test.o -order_file %t/ord-multiple-4
+-# RUN: llvm-objdump -d %t/test-4 | FileCheck %s --check-prefix=FOO-FIRST
+-
+-## _foo and _bar both point to the same location. When both symbols appear in
+-## an order file, the location in question should be ordered according to the
+-## lowest-ordered symbol that references it.
+-# RUN: echo "_bar" > %t/ord-alias
+-# RUN: echo "_main" >> %t/ord-alias
+-# RUN: echo "_foo" >> %t/ord-alias
+-# RUN: lld -flavor darwinnew -o %t/test-alias %t/test.o %t/foo.o -order_file %t/ord-alias
+-# RUN: llvm-objdump -d %t/test-alias | FileCheck %s --check-prefix=FOO-FIRST
+-# RUN: lld -flavor darwinnew -o %t/test-alias %t/foo.o %t/test.o -order_file %t/ord-alias
+-# RUN: llvm-objdump -d %t/test-alias | FileCheck %s --check-prefix=FOO-FIRST
+-
+-.text
+-.globl _main
+-
+-_main:
+-  callq _foo
+-  ret
+diff --git a/lld/test/MachO/platform-version.test b/lld/test/MachO/platform-version.test
+deleted file mode 100644
+index baa4ced08fb..00000000000
+--- a/lld/test/MachO/platform-version.test
++++ /dev/null
+@@ -1,17 +0,0 @@
+-# RUN: not lld -flavor darwinnew -platform_version 2>&1 \
+-# RUN:     | FileCheck --check-prefix=MISSING %s
+-# RUN: not lld -flavor darwinnew -platform_version macos 2>&1 \
+-# RUN:     | FileCheck --check-prefix=MISSING %s
+-# RUN: not lld -flavor darwinnew -platform_version macos 10.15 2>&1 \
+-# RUN:     | FileCheck --check-prefix=MISSING %s
+-# RUN: not lld -flavor darwinnew -platform_version macos -lfoo 10.15 2>&1 \
+-# RUN:     | FileCheck --check-prefix=GOOD %s
+-# RUN: not lld -flavor darwinnew -platform_version macos 10.15 10.15.4 2>&1 \
+-# RUN:     | FileCheck --check-prefix=GOOD %s
+-# RUN: not lld -flavor darwinnew -platform_version macos 10.15 10.15.4 foobar 2>&1 \
+-# RUN:     | FileCheck --check-prefix=FAIL_FILE %s
+-
+-MISSING: -platform_version: missing argument
+-FAIL: usage: -platform_version platform min_version sdk_version
+-GOOD: undefined symbol: _main
+-FAIL_FILE: cannot open foobar
+diff --git a/lld/test/MachO/relocations.s b/lld/test/MachO/relocations.s
+deleted file mode 100644
+index edaa3089356..00000000000
+--- a/lld/test/MachO/relocations.s
++++ /dev/null
+@@ -1,66 +0,0 @@
+-# REQUIRES: x86
+-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t.o
+-# RUN: lld -flavor darwinnew -L%S/Inputs/MacOSX.sdk/usr/lib -lSystem -o %t %t.o
+-# RUN: llvm-objdump --section-headers --syms -d %t | FileCheck %s
+-
+-# CHECK-LABEL: Sections:
+-# CHECK:       __cstring {{[0-9a-z]+}} [[#%x, CSTRING_ADDR:]]
+-
+-# CHECK-LABEL: SYMBOL TABLE:
+-# CHECK:       [[#%x, F_ADDR:]] {{.*}} _f
+-
+-# CHECK-LABEL: <_main>:
+-## Test X86_64_RELOC_BRANCH
+-# CHECK:       callq 0x[[#%x, F_ADDR]] <_f>
+-## Test extern (symbol) X86_64_RELOC_SIGNED
+-# CHECK:       leaq [[#%u, STR_OFF:]](%rip), %rsi
+-# CHECK-NEXT:  [[#%x, CSTRING_ADDR - STR_OFF]]
+-## Test non-extern (section) X86_64_RELOC_SIGNED
+-# CHECK:       leaq [[#%u, LSTR_OFF:]](%rip), %rsi
+-# CHECK-NEXT:  [[#%x, CSTRING_ADDR + 22 - LSTR_OFF]]
+-
+-# RUN: llvm-objdump --section=__const --full-contents -d %t | FileCheck %s --check-prefix=NONPCREL
+-# NONPCREL:      Contents of section __const:
+-# NONPCREL-NEXT: 100001000 b0030000 01000000 b0030000 01000000
+-
+-.section __TEXT,__text
+-.globl _main, _f
+-_main:
+-  callq _f # X86_64_RELOC_BRANCH
+-  mov $0, %rax
+-  ret
+-
+-_f:
+-  movl $0x2000004, %eax # write() syscall
+-  mov $1, %rdi # stdout
+-  leaq _str(%rip), %rsi # Generates a X86_64_RELOC_SIGNED pcrel symbol relocation
+-  mov $21, %rdx # length of str
+-  syscall
+-
+-  movl $0x2000004, %eax # write() syscall
+-  mov $1, %rdi # stdout
+-  leaq L_.str(%rip), %rsi # Generates a X86_64_RELOC_SIGNED pcrel section relocation
+-  mov $15, %rdx # length of str
+-  syscall
+-
+-  movl $0x2000004, %eax # write() syscall
+-  mov $1, %rdi # stdout
+-  movq L_.ptr_1_to_str(%rip), %rsi
+-  mov $15, %rdx # length of str
+-  syscall
+-  ret
+-
+-.section __TEXT,__cstring
+-## References to this generate a symbol relocation
+-_str:
+-  .asciz "Local defined symbol\n"
+-## References to this generate a section relocation
+-L_.str:
+-  .asciz "Private symbol\n"
+-
+-.section __DATA,__const
+-## These generate X86_64_RELOC_UNSIGNED non-pcrel section relocations
+-L_.ptr_1_to_str:
+-  .quad L_.str
+-L_.ptr_2_to_str:
+-  .quad L_.str
+diff --git a/lld/test/MachO/resolution.s b/lld/test/MachO/resolution.s
+deleted file mode 100644
+index a13bb529cf7..00000000000
+--- a/lld/test/MachO/resolution.s
++++ /dev/null
+@@ -1,44 +0,0 @@
+-# REQUIRES: x86
+-# RUN: mkdir -p %t
+-# RUN: echo '.globl _foo, _bar, _baz; _foo: _bar: _baz:' | \
+-# RUN:   llvm-mc -filetype=obj -triple=x86_64-apple-darwin -o %t/libresolution.o
+-# RUN: lld -flavor darwinnew -dylib -install_name \
+-# RUN:   @executable_path/libresolution.dylib %t/libresolution.o -o %t/libresolution.dylib
+-# RUN: lld -flavor darwinnew -dylib -install_name \
+-# RUN:   @executable_path/libresolution2.dylib %t/libresolution.o -o %t/libresolution2.dylib
+-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t/resolution.o
+-
+-## Check that we select the symbol defined in the first dylib passed on the
+-## command line.
+-# RUN: lld -flavor darwinnew -o %t/dylib-first -Z -L%t -lresolution -lresolution2 %t/resolution.o
+-# RUN: llvm-objdump --macho --bind %t/dylib-first | FileCheck %s --check-prefix=DYLIB-FIRST
+-# DYLIB-FIRST:     libresolution _foo
+-
+-# RUN: lld -flavor darwinnew -o %t/dylib2-first -Z -L%t -lresolution2 -lresolution %t/resolution.o
+-# RUN: llvm-objdump --macho --bind %t/dylib2-first | FileCheck %s --check-prefix=DYLIB2-FIRST
+-# DYLIB2-FIRST: libresolution2 _foo
+-
+-## Also check that defined symbols take precedence over dylib symbols.
+-# DYLIB-FIRST-NOT: libresolution _bar
+-# DYLIB-FIRST-NOT: libresolution _baz
+-
+-## Check that we pick the dylib symbol over the undefined symbol in the object
+-## file, even if the object file appears first on the command line.
+-# RUN: lld -flavor darwinnew -o %t/obj-first -Z -L%t %t/resolution.o -lresolution
+-# RUN: llvm-objdump --macho --bind %t/obj-first | FileCheck %s --check-prefix=OBJ-FIRST
+-# OBJ-FIRST: libresolution _foo
+-## But defined symbols should still take precedence.
+-# OBJ-FIRST-NOT: libresolution _bar
+-# OBJ-FIRST-NOT: libresolution _baz
+-
+-.globl _main, _bar
+-# Global defined symbol
+-_bar:
+-# Local defined symbol
+-_baz:
+-
+-_main:
+-  movq _foo@GOTPCREL(%rip), %rsi
+-  movq _bar@GOTPCREL(%rip), %rsi
+-  movq _baz@GOTPCREL(%rip), %rsi
+-  ret
+diff --git a/lld/test/MachO/search-paths-darwin.test b/lld/test/MachO/search-paths-darwin.test
+deleted file mode 100644
+index 85b7e30671b..00000000000
+--- a/lld/test/MachO/search-paths-darwin.test
++++ /dev/null
+@@ -1,20 +0,0 @@
+-REQUIRES: x86
+-REQUIRES: darwin
+-
+-RUN: mkdir -p %t1 %t2
+-
+-RUN: lld -flavor darwinnew -arch x86_64 -v -L%t1 -F%t2 2>&1 | FileCheck -DLDIR=%t1 -DFDIR=%t2 %s
+-CHECK:      Library search paths:
+-CHECK-NEXT: [[LDIR]]
+-CHECK-NEXT: /usr/lib
+-CHECK-NEXT: /usr/local/lib
+-CHECK-NEXT: Framework search paths:
+-CHECK-NEXT: [[FDIR]]
+-CHECK-NEXT: /Library/Frameworks
+-CHECK-NEXT: /System/Library/Frameworks
+-
+-RUN: lld -flavor darwinnew -arch x86_64 -v -L%t1 -F%t2 -Z 2>&1 | FileCheck -DLDIR=%t1 -DFDIR=%t2 --check-prefix=CHECK_Z %s
+-CHECK_Z:      Library search paths:
+-CHECK_Z-NEXT: [[LDIR]]
+-CHECK_Z-NEXT: Framework search paths:
+-CHECK_Z-NEXT: [[FDIR]]
+diff --git a/lld/test/MachO/search-paths.test b/lld/test/MachO/search-paths.test
+deleted file mode 100644
+index 124a2a080b6..00000000000
+--- a/lld/test/MachO/search-paths.test
++++ /dev/null
+@@ -1,15 +0,0 @@
+-UNSUPPORTED: darwin
+-
+-RUN: mkdir -p %t1 %t2
+-
+-RUN: lld -flavor darwinnew -v -L%t1 -F%t2 2>&1 | FileCheck -DLDIR=%t1 -DFDIR=%t2 %s
+-CHECK:      Library search paths:
+-CHECK-NEXT: [[LDIR]]
+-CHECK-NEXT: Framework search paths:
+-CHECK-NEXT: [[FDIR]]
+-
+-RUN: lld -flavor darwinnew -v -L%t1 -F%t2 -Z 2>&1 | FileCheck -DLDIR=%t1 -DFDIR=%t2 --check-prefix=CHECK_Z %s
+-CHECK_Z:      Library search paths:
+-CHECK_Z-NEXT: [[LDIR]]
+-CHECK_Z-NEXT: Framework search paths:
+-CHECK_Z-NEXT: [[FDIR]]
+diff --git a/lld/test/MachO/section-headers.s b/lld/test/MachO/section-headers.s
+deleted file mode 100644
+index 9fafc5a912b..00000000000
+--- a/lld/test/MachO/section-headers.s
++++ /dev/null
+@@ -1,46 +0,0 @@
+-# REQUIRES: x86
+-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t.o
+-# RUN: lld -flavor darwinnew -o %t %t.o
+-# RUN: llvm-readobj --section-headers %t | FileCheck %s
+-
+-# CHECK:      Name: __text
+-# CHECK-NEXT: Segment: __TEXT
+-# CHECK-NOT:  }
+-# CHECK:      Alignment: 1
+-# CHECK-NOT:  }
+-# CHECK:      Type: Regular (0x0)
+-# CHECK-NEXT: Attributes [ (0x800004)
+-# CHECK-NEXT:   PureInstructions (0x800000)
+-# CHECK-NEXT:   SomeInstructions (0x4)
+-# CHECK-NEXT: ]
+-
+-# CHECK:      Name: __cstring
+-# CHECK-NEXT: Segment: __TEXT
+-# CHECK-NOT:  }
+-# CHECK:      Alignment: 2
+-# CHECK-NOT:  }
+-# CHECK:      Type: CStringLiterals (0x2)
+-# CHECK-NEXT: Attributes [ (0x0)
+-# CHECK-NEXT: ]
+-
+-# CHECK:      Name: maxlen_16ch_name
+-# CHECK-NEXT: Segment: __TEXT
+-# CHECK-NOT:  }
+-# CHECK:      Alignment: 3
+-# CHECK-NOT:  }
+-# CHECK:      Type: Regular (0x0)
+-
+-.text
+-.align 1
+-.global _main
+-_main:
+-  mov $0, %rax
+-  ret
+-
+-.section __TEXT,__cstring
+-.align 2
+-str:
+-  .asciz "Hello world!\n"
+-
+-.section __TEXT,maxlen_16ch_name
+-.align 3
+diff --git a/lld/test/MachO/section-merge.s b/lld/test/MachO/section-merge.s
+deleted file mode 100644
+index 69c55a047b4..00000000000
+--- a/lld/test/MachO/section-merge.s
++++ /dev/null
+@@ -1,26 +0,0 @@
+-# REQUIRES: x86
+-# RUN: mkdir -p %t
+-## Verify that we preserve alignment when merging sections.
+-# RUN: echo ".globl _foo; .data; .p2align 0; _foo: .byte 0xca" | llvm-mc -filetype=obj -triple=x86_64-apple-darwin -o %t/foo.o
+-# RUN: echo ".globl _bar; .data; .p2align 2; _bar: .byte 0xfe" | llvm-mc -filetype=obj -triple=x86_64-apple-darwin -o %t/bar.o
+-# RUN: echo ".globl _baz; .data; .p2align 3; _baz: .byte 0xba" | llvm-mc -filetype=obj -triple=x86_64-apple-darwin -o %t/baz.o
+-# RUN: echo ".globl _qux; .data; .p2align 0; _qux: .quad 0xdeadbeef" | llvm-mc -filetype=obj -triple=x86_64-apple-darwin -o %t/qux.o
+-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t/main.o
+-# RUN: lld -flavor darwinnew -o %t/output %t/foo.o %t/bar.o %t/baz.o %t/qux.o %t/main.o
+-
+-# RUN: llvm-objdump --syms --section=__data --full-contents %t/output | FileCheck %s
+-# CHECK:     SYMBOL TABLE:
+-# CHECK-DAG: [[#%x, ADDR:]]      g     O __DATA,__data _foo
+-# CHECK-DAG: {{0*}}[[#ADDR+0x4]] g     O __DATA,__data _bar
+-# CHECK-DAG: {{0*}}[[#ADDR+0x8]] g     O __DATA,__data _baz
+-# CHECK-DAG: {{0*}}[[#ADDR+0x9]] g     O __DATA,__data _qux
+-
+-# CHECK:      Contents of section __data:
+-# CHECK-NEXT: {{0*}}[[#ADDR]] ca000000 fe000000 baefbead de000000
+-
+-.section __TEXT,__text
+-.global _main
+-
+-_main:
+-  mov $0, %rax
+-  ret
+diff --git a/lld/test/MachO/segments.s b/lld/test/MachO/segments.s
+deleted file mode 100644
+index acb0f1e9010..00000000000
+--- a/lld/test/MachO/segments.s
++++ /dev/null
+@@ -1,53 +0,0 @@
+-# REQUIRES: x86
+-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t.o
+-# RUN: lld -flavor darwinnew -o %t %t.o
+-# RUN: llvm-readobj --macho-segment %t | FileCheck %s
+-
+-## These two segments must always be present at the start of an executable.
+-# CHECK-NOT:  Segment {
+-# CHECK:      Segment {
+-# CHECK:        Cmd: LC_SEGMENT_64
+-# CHECK:        Name: __PAGEZERO
+-# CHECK:        Size: 72
+-# CHECK:        vmaddr: 0x0
+-# CHECK:        vmsize: 0x100000000
+-# CHECK:        fileoff: 0
+-# CHECK:        filesize: 0
+-## The kernel won't execute a binary with the wrong protections for __PAGEZERO.
+-# CHECK:        maxprot: ---
+-# CHECK:        initprot: ---
+-# CHECK:        nsects: 0
+-# CHECK:        flags: 0x0
+-# CHECK:      }
+-# CHECK:      Segment {
+-# CHECK:        Cmd: LC_SEGMENT_64
+-# CHECK:        Name: __TEXT
+-# CHECK:        Size: 152
+-# CHECK:        vmaddr: 0x100000000
+-# CHECK:        vmsize:
+-## dyld3 assumes that the __TEXT segment starts from the file header
+-# CHECK:        fileoff: 0
+-# CHECK:        filesize:
+-# CHECK:        maxprot: rwx
+-# CHECK:        initprot: r-x
+-# CHECK:        nsects: 1
+-# CHECK:        flags: 0x0
+-# CHECK:      }
+-
+-## Check that we handle max-length names correctly.
+-# CHECK:      Cmd: LC_SEGMENT_64
+-# CHECK-NEXT: Name: maxlen_16ch_name
+-
+-## This segment must always be present at the end of an executable.
+-# CHECK:      Name: __LINKEDIT
+-# CHECK:      maxprot: rwx
+-# CHECK:      initprot: r--
+-# CHECK-NOT:  Cmd: LC_SEGMENT_64
+-
+-.text
+-.global _main
+-_main:
+-  mov $0, %rax
+-  ret
+-
+-.section maxlen_16ch_name,foo
+diff --git a/lld/test/MachO/silent-ignore.test b/lld/test/MachO/silent-ignore.test
+deleted file mode 100644
+index ae68dd8fe81..00000000000
+--- a/lld/test/MachO/silent-ignore.test
++++ /dev/null
+@@ -1,9 +0,0 @@
+-RUN: lld -flavor darwinnew -v \
+-RUN:   -demangle \
+-RUN:   -dynamic \
+-RUN:   -no_deduplicate \
+-RUN:   -lto_library /lib/foo \
+-RUN:   -macosx_version_min 0 \
+-RUN:   -syslibroot /path/to/MacOSX.platform/Developer/SDKs/MacOSX.sdk
+-RUN: not lld -flavor darwinnew -v --not-an-ignored-argument 2>&1 | FileCheck %s
+-CHECK: error: unknown argument: --not-an-ignored-argument
+diff --git a/lld/test/MachO/static-link.s b/lld/test/MachO/static-link.s
+deleted file mode 100644
+index f8260807df6..00000000000
+--- a/lld/test/MachO/static-link.s
++++ /dev/null
+@@ -1,30 +0,0 @@
+-# REQUIRES: x86
+-
+-# RUN: mkdir -p %t
+-#
+-# RUN: llvm-mc -filetype obj -triple x86_64-apple-darwin %p/Inputs/libgoodbye.s -o %t/goodbye.o
+-# RUN: llvm-ar --format=darwin crs %t/libgoodbye.a %t/goodbye.o
+-#
+-# RUN: llvm-mc -filetype obj -triple x86_64-apple-darwin %s -o %t/test.o
+-# RUN: lld -flavor darwinnew -o %t/test -Z -L%t -lgoodbye %t/test.o
+-#
+-# RUN: llvm-objdump --syms -d -r %t/test | FileCheck %s
+-
+-# CHECK: SYMBOL TABLE:
+-# CHECK: {{0+}}[[ADDR:[0-9a-f]+]] g     O __TEXT,__cstring _goodbye_world
+-
+-# CHECK: Disassembly of section __TEXT,__text
+-# CHECK-LABEL: <_main>:
+-# CHECK: leaq {{.*}}(%rip), %rsi   # [[ADDR]] <_goodbye_world>
+-
+-.section __TEXT,__text
+-.global _main
+-
+-_main:
+-  movl $0x2000004, %eax                 # write()
+-  mov $1, %rdi                          # stdout
+-  leaq _goodbye_world(%rip), %rsi
+-  mov $15, %rdx                         # length
+-  syscall
+-  mov $0, %rax
+-  ret
+diff --git a/lld/test/MachO/stub-link.s b/lld/test/MachO/stub-link.s
+deleted file mode 100644
+index 1bf65c46a78..00000000000
+--- a/lld/test/MachO/stub-link.s
++++ /dev/null
+@@ -1,21 +0,0 @@
+-# REQUIRES: x86
+-
+-# RUN: mkdir -p %t
+-#
+-# RUN: llvm-mc -filetype obj -triple x86_64-apple-darwin %s -o %t/test.o
+-# RUN: lld -flavor darwinnew -o %t/test -Z -L%S/Inputs/MacOSX.sdk/usr/lib -lSystem %t/test.o
+-#
+-# RUN: llvm-objdump --bind --no-show-raw-insn -d -r %t/test | FileCheck %s
+-
+-# CHECK: Disassembly of section __TEXT,__text:
+-# CHECK: movq {{.*}} # [[ADDR:[0-9a-f]+]]
+-
+-# CHECK: Bind table:
+-# CHECK: __DATA_CONST __got 0x[[ADDR]] pointer 0 libSystem ___nan
+-
+-.section __TEXT,__text
+-.global _main
+-
+-_main:
+-  movq ___nan@GOTPCREL(%rip), %rax
+-  ret
+diff --git a/lld/test/MachO/sub-library.s b/lld/test/MachO/sub-library.s
+deleted file mode 100644
+index e858eaf0bff..00000000000
+--- a/lld/test/MachO/sub-library.s
++++ /dev/null
+@@ -1,74 +0,0 @@
+-# REQUIRES: x86
+-# RUN: mkdir -p %t
+-
+-## Create a libsuper that has libgoodbye as a sub-library, which in turn has
+-## libhello as another sub-library.
+-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %p/Inputs/libhello.s \
+-# RUN:   -o %t/libhello.o
+-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %p/Inputs/libgoodbye.s \
+-# RUN:   -o %t/libgoodbye.o
+-# RUN: echo "" | llvm-mc -filetype=obj -triple=x86_64-apple-darwin -o %t/libsuper.o
+-# RUN: lld -flavor darwinnew -dylib %t/libhello.o -o %t/libhello.dylib
+-# RUN: lld -flavor darwinnew -dylib -L%t -sub_library libhello -lhello \
+-# RUN:   %t/libgoodbye.o -o %t/libgoodbye.dylib
+-# RUN: lld -flavor darwinnew -dylib -L%t -sub_library libgoodbye -lgoodbye -install_name \
+-# RUN:   @executable_path/libsuper.dylib %t/libsuper.o -o %t/libsuper.dylib
+-
+-
+-## Check that they have the appropriate LC_REEXPORT_DYLIB commands, and that
+-## NO_REEXPORTED_DYLIBS is (un)set as appropriate.
+-
+-# RUN: llvm-objdump --macho --all-headers %t/libhello.dylib | FileCheck %s \
+-# RUN:   --check-prefix=HELLO-HEADERS
+-# HELLO-HEADERS: NO_REEXPORTED_DYLIBS
+-
+-# RUN: llvm-objdump --macho --all-headers %t/libgoodbye.dylib | FileCheck %s -DDIR=%t \
+-# RUN:   --check-prefix=GOODBYE-HEADERS
+-# GOODBYE-HEADERS-NOT: NO_REEXPORTED_DYLIBS
+-# GOODBYE-HEADERS:     cmd     LC_REEXPORT_DYLIB
+-# GOODBYE-HEADERS-NOT: Load command
+-# GOODBYE-HEADERS:     name    [[DIR]]/libhello.dylib
+-
+-# RUN: llvm-objdump --macho --all-headers %t/libsuper.dylib | FileCheck %s -DDIR=%t \
+-# RUN:   --check-prefix=SUPER-HEADERS
+-# SUPER-HEADERS-NOT: NO_REEXPORTED_DYLIBS
+-# SUPER-HEADERS:     cmd     LC_REEXPORT_DYLIB
+-# SUPER-HEADERS-NOT: Load command
+-# SUPER-HEADERS:     name    [[DIR]]/libgoodbye.dylib
+-
+-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t/sub-library.o
+-# RUN: lld -flavor darwinnew -o %t/sub-library -L%t -lsuper %t/sub-library.o
+-
+-# RUN: llvm-objdump --macho --bind %t/sub-library | FileCheck %s
+-# CHECK-LABEL: Bind table:
+-# CHECK-DAG:   __DATA_CONST __got {{.*}} libsuper _hello_world
+-# CHECK-DAG:   __DATA_CONST __got {{.*}} libsuper _goodbye_world
+-
+-
+-## Check that we fail gracefully if the sub-library is missing
+-# RUN: not lld -flavor darwinnew -dylib -Z -o %t/sub-library -sub_library libmissing %t/sub-library.o 2>&1 \
+-# RUN:   | FileCheck %s --check-prefix=MISSING-SUB-LIBRARY
+-# MISSING-SUB-LIBRARY: error: -sub_library libmissing does not match a supplied dylib
+-# RUN: rm -f %t/libgoodbye.dylib
+-# RUN: not lld -flavor darwinnew -o %t/sub-library -Z -L%t -lsuper %t/sub-library.o 2>&1 \
+-# RUN:  | FileCheck %s --check-prefix=MISSING-REEXPORT -DDIR=%t
+-# MISSING-REEXPORT: error: unable to read re-exported dylib at [[DIR]]/libgoodbye.dylib
+-
+-.text
+-.globl _main
+-
+-_main:
+-  movl $0x2000004, %eax # write() syscall
+-  mov $1, %rdi # stdout
+-  movq _hello_world@GOTPCREL(%rip), %rsi
+-  mov $13, %rdx # length of str
+-  syscall
+-  mov $0, %rax
+-
+-  movl $0x2000004, %eax # write() syscall
+-  mov $1, %rdi # stdout
+-  movq _goodbye_world@GOTPCREL(%rip), %rsi
+-  mov $15, %rdx # length of str
+-  syscall
+-  mov $0, %rax
+-  ret
+diff --git a/lld/test/MachO/subsections-section-relocs.s b/lld/test/MachO/subsections-section-relocs.s
+deleted file mode 100644
+index e8a8d7a3ec4..00000000000
+--- a/lld/test/MachO/subsections-section-relocs.s
++++ /dev/null
+@@ -1,47 +0,0 @@
+-# REQUIRES: x86
+-# RUN: mkdir -p %t
+-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t/test.o
+-
+-# RUN: echo "_bar_str" > %t/order-file
+-# RUN: echo "_foo_str" >> %t/order-file
+-
+-# RUN: lld -flavor darwinnew -o %t/test %t/test.o -order_file %t/order-file
+-# RUN: llvm-objdump --section-headers -d --no-show-raw-insn %t/test | FileCheck %s
+-# CHECK-LABEL: Sections:
+-# CHECK:       __cstring {{[^ ]*}} {{0*}}[[#%x, CSTRING_ADDR:]]
+-# CHECK-LABEL: Disassembly of section __TEXT,__text:
+-## L._str should end up at CSTRING_ADDR + 4, and leaq is 7 bytes long so we
+-## have RIP = ADDR + 7
+-# CHECK:       [[#%x, ADDR:]]: leaq
+-# CHECK-SAME:    [[#%u, CSTRING_ADDR + 4 - ADDR - 7]](%rip), %rsi {{.*}} <_bar_str+0x4>
+-
+-# RUN: llvm-readobj --string-dump=__cstring %t/test | FileCheck %s --check-prefix=STRINGS
+-# STRINGS: bar
+-# STRINGS: Private symbol
+-# STRINGS: foo
+-
+-.text
+-.globl _main, _foo_str, _bar_str
+-
+-_main:
+-  leaq L_.str(%rip), %rsi
+-  mov $0, %rax
+-  ret
+-
+-.section __TEXT,__cstring
+-_foo_str:
+-  .asciz "foo"
+-
+-_bar_str:
+-  .asciz "bar"
+-
+-## References to this generate a section relocation
+-## N.B.: ld64 doesn't actually reorder symbols in __cstring based on the order
+-##       file. Only our implementation does. However, I'm not sure how else to
+-##       test section relocations that target an address inside a relocated
+-##       symbol: using a non-__cstring section would cause llvm-mc to emit a
+-##       symbol relocation instead using the nearest symbol.
+-L_.str:
+-  .asciz "Private symbol"
+-
+-.subsections_via_symbols
+diff --git a/lld/test/MachO/subsections-symbol-relocs.s b/lld/test/MachO/subsections-symbol-relocs.s
+deleted file mode 100644
+index 475c909377d..00000000000
+--- a/lld/test/MachO/subsections-symbol-relocs.s
++++ /dev/null
+@@ -1,55 +0,0 @@
+-# REQUIRES: x86
+-# RUN: mkdir -p %t
+-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t/test.o
+-
+-# RUN: echo "_bar" > %t/order-file-1
+-# RUN: echo "_foo" >> %t/order-file-1
+-# RUN: echo "_main" >> %t/order-file-1
+-## _qux is marked as .alt_entry, so it should not create a new subsection and
+-## its contents should move with _bar to the start of the output despite the
+-## order file listing it at the end.
+-# RUN: echo "_qux" >> %t/order-file-1
+-
+-## _bar and _baz point to the same address, so both order files should achieve
+-## the same result.
+-# RUN: echo "_baz" > %t/order-file-2
+-# RUN: echo "_foo" >> %t/order-file-2
+-# RUN: echo "_main" >> %t/order-file-2
+-# RUN: echo "_qux" >> %t/order-file-2
+-
+-# RUN: lld -flavor darwinnew -o %t/test-1 %t/test.o -order_file %t/order-file-1
+-# RUN: llvm-objdump -d --no-show-raw-insn %t/test-1 | FileCheck %s
+-# RUN: lld -flavor darwinnew -o %t/test-2 %t/test.o -order_file %t/order-file-2
+-# RUN: llvm-objdump -d --no-show-raw-insn %t/test-2 | FileCheck %s
+-# CHECK-LABEL: Disassembly of section __TEXT,__text:
+-# CHECK:       <_bar>:
+-# CHECK-NEXT:    callq {{.*}} <_foo>
+-# CHECK-EMPTY:
+-# CHECK-NEXT:  <_qux>:
+-# CHECK-NEXT:    retq
+-# CHECK:       <_foo>:
+-# CHECK-NEXT:    retq
+-# CHECK:       <_main>:
+-# CHECK-NEXT:    callq {{.*}} <_bar>
+-# CHECK-NEXT:    movq $0, %rax
+-# CHECK-NEXT:    retq
+-
+-.text
+-.globl _main, _foo, _bar, _qux
+-.alt_entry _qux
+-
+-_foo:
+-  retq
+-
+-_main:
+-  callq _bar
+-  movq $0, %rax
+-  retq
+-
+-_bar:
+-_baz:
+-  callq _foo
+-_qux:
+-  retq
+-
+-.subsections_via_symbols
+diff --git a/lld/test/MachO/symbol-order.s b/lld/test/MachO/symbol-order.s
+deleted file mode 100644
+index 328ff9e2475..00000000000
+--- a/lld/test/MachO/symbol-order.s
++++ /dev/null
+@@ -1,46 +0,0 @@
+-# REQUIRES: x86
+-# RUN: mkdir -p %t
+-# RUN: echo ".global f, g; .section __TEXT,test_g; g: callq f"          | llvm-mc -filetype=obj -triple=x86_64-apple-darwin -o %t/g.o
+-# RUN: echo ".global f; .section __TEXT,test_f1; f: ret"                | llvm-mc -filetype=obj -triple=x86_64-apple-darwin -o %t/f1.o
+-# RUN: echo ".global f; .section __TEXT,test_f2; f: ret"                | llvm-mc -filetype=obj -triple=x86_64-apple-darwin -o %t/f2.o
+-# RUN: echo ".global f, g; .section __TEXT,test_fg; f: ret; g: callq f" | llvm-mc -filetype=obj -triple=x86_64-apple-darwin -o %t/fg.o
+-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t/test.o
+-# RUN: lld -flavor darwinnew -L%S/Inputs/MacOSX.sdk/usr/lib -dylib -o %t/libf1.dylib %t/f1.o -lSystem
+-
+-# RUN: rm -f %t/libf2_g.a
+-# RUN: llvm-ar rcs %t/libf2_g.a %t/f2.o %t/g.o
+-
+-# RUN: rm -f %t/libfg.a
+-# RUN: llvm-ar rcs %t/libfg.a %t/fg.o
+-
+-# RUN: lld -flavor darwinnew -L%S/Inputs/MacOSX.sdk/usr/lib %t/libf1.dylib %t/libf2_g.a %t/test.o -o %t/test.out -lSystem
+-# RUN: llvm-objdump --syms --macho --lazy-bind %t/test.out | FileCheck %s --check-prefix DYLIB-FIRST
+-# DYLIB-FIRST:      SYMBOL TABLE:
+-# DYLIB-FIRST-DAG:  __TEXT,test_g g
+-# DYLIB-FIRST:      Lazy bind table:
+-# DYLIB-FIRST-NEXT: segment  section            address       dylib            symbol
+-# DYLIB-FIRST-NEXT: __DATA   __la_symbol_ptr    {{[0-9a-z]+}} libf1            f
+-
+-# RUN: lld -flavor darwinnew -L%S/Inputs/MacOSX.sdk/usr/lib %t/libf2_g.a %t/libf1.dylib %t/test.o -o %t/test.out -lSystem
+-# RUN: llvm-objdump --syms --macho --lazy-bind %t/test.out | FileCheck %s --check-prefix ARCHIVE-FIRST
+-# ARCHIVE-FIRST:      SYMBOL TABLE:
+-# ARCHIVE-FIRST-DAG:  __TEXT,test_f2 f
+-# ARCHIVE-FIRST-DAG:  __TEXT,test_g g
+-# ARCHIVE-FIRST:      Lazy bind table:
+-# ARCHIVE-FIRST-NEXT: segment  section            address       dylib            symbol
+-# ARCHIVE-FIRST-EMPTY:
+-
+-# RUN: lld -flavor darwinnew -L%S/Inputs/MacOSX.sdk/usr/lib %t/libf1.dylib %t/libfg.a %t/test.o -o %t/test.out -lSystem
+-# RUN: llvm-objdump --syms --macho --lazy-bind %t/test.out | FileCheck %s --check-prefix ARCHIVE-PRIORITY
+-# ARCHIVE-PRIORITY:      SYMBOL TABLE:
+-# ARCHIVE-PRIORITY-DAG:  __TEXT,test_fg f
+-# ARCHIVE-PRIORITY-DAG:  __TEXT,test_fg g
+-# ARCHIVE-PRIORITY:      Lazy bind table:
+-# ARCHIVE-PRIORITY-NEXT: segment  section            address       dylib            symbol
+-# ARCHIVE-PRIORITY-EMPTY:
+-
+-.global g
+-.global _main
+-_main:
+-  callq g
+-  ret
+diff --git a/lld/test/MachO/symtab.s b/lld/test/MachO/symtab.s
+deleted file mode 100644
+index 44a016912bd..00000000000
+--- a/lld/test/MachO/symtab.s
++++ /dev/null
+@@ -1,54 +0,0 @@
+-# REQUIRES: x86
+-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t.o
+-# RUN: lld -flavor darwinnew -o %t %t.o
+-# RUN: llvm-readobj -symbols %t | FileCheck %s
+-
+-# CHECK:      Symbols [
+-# CHECK-NEXT:   Symbol {
+-# CHECK-NEXT:     Name: _main
+-# CHECK-NEXT:     Extern
+-# CHECK-NEXT:     Type: Section (0xE)
+-# CHECK-NEXT:     Section: __text (0x1)
+-# CHECK-NEXT:     RefType:
+-# CHECK-NEXT:     Flags [ (0x0)
+-# CHECK-NEXT:     ]
+-# CHECK-NEXT:     Value:
+-# CHECK-NEXT:   }
+-# CHECK-NEXT:   Symbol {
+-# CHECK-NEXT:     Name: bar
+-# CHECK-NEXT:     Extern
+-# CHECK-NEXT:     Type: Section (0xE)
+-# CHECK-NEXT:     Section: __text (0x1)
+-# CHECK-NEXT:     RefType:
+-# CHECK-NEXT:     Flags [ (0x0)
+-# CHECK-NEXT:     ]
+-# CHECK-NEXT:     Value:
+-# CHECK-NEXT:   }
+-# CHECK-NEXT:   Symbol {
+-# CHECK-NEXT:     Name: foo
+-# CHECK-NEXT:     Extern
+-# CHECK-NEXT:     Type: Section (0xE)
+-# CHECK-NEXT:     Section: __data
+-# CHECK-NEXT:     RefType:
+-# CHECK-NEXT:     Flags [ (0x0)
+-# CHECK-NEXT:     ]
+-# CHECK-NEXT:     Value:
+-# CHECK-NEXT:   }
+-# CHECK-NEXT: ]
+-
+-.data
+-.global foo
+-foo:
+-  .asciz "Hello world!\n"
+-
+-.text
+-.global bar
+-.global _main
+-
+-_main:
+-  mov $0, %rax
+-  ret
+-
+-bar:
+-  mov $2, %rax
+-  ret
+diff --git a/lld/test/MachO/x86-64-reloc-signed.s b/lld/test/MachO/x86-64-reloc-signed.s
+deleted file mode 100644
+index 568f65c7c1e..00000000000
+--- a/lld/test/MachO/x86-64-reloc-signed.s
++++ /dev/null
+@@ -1,64 +0,0 @@
+-# REQUIRES: x86
+-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t.o
+-# RUN: lld -flavor darwinnew -o %t %t.o
+-# RUN: llvm-objdump -D %t | FileCheck %s
+-
+-# CHECK:      <_main>:
+-# CHECK-NEXT:   movl {{.*}}  # 100001000 <_s>
+-# CHECK-NEXT:   callq {{.*}}
+-# CHECK-NEXT:   movl {{.*}}  # 100001002 <_s+0x2>
+-# CHECK-NEXT:   callq {{.*}}
+-# CHECK-NEXT:   movb {{.*}}  # 100001000 <_s>
+-# CHECK-NEXT:   callq {{.*}}
+-# CHECK:      <__not_text>:
+-# CHECK-NEXT:   movl {{.*}}  # 100001005
+-# CHECK-NEXT:   callq {{.*}}
+-# CHECK-NEXT:   movl {{.*}}  # 100001007
+-# CHECK-NEXT:   callq {{.*}}
+-# CHECK-NEXT:   movb {{.*}}  # 100001005
+-# CHECK-NEXT:   callq {{.*}}
+-
+-.section __TEXT,__text
+-.globl _main
+-_main:
+-  ## Symbol relocations
+-  movl $0x434241, _s(%rip)  # X86_64_RELOC_SIGNED_4
+-  callq _f
+-  movl $0x44, _s+2(%rip)    # X86_64_RELOC_SIGNED_2
+-  callq _f
+-  movb $0x45, _s(%rip)      # X86_64_RELOC_SIGNED_1
+-  callq _f
+-  xorq %rax, %rax
+-  ret
+-
+-_f:
+-  movl $0x2000004, %eax # write() syscall
+-  mov $1, %rdi # stdout
+-  leaq _s(%rip), %rsi
+-  mov $3, %rdx # length
+-  syscall
+-  ret
+-
+-.section __TEXT,__not_text
+-  ## Section relocations. We intentionally put them in a separate section since
+-  ## the __text section typically starts at an address of zero in object files,
+-  ## and so does not fully exercise the relocation logic.
+-  movl $0x434241, L._s(%rip)  # X86_64_RELOC_SIGNED_4
+-  callq _f
+-  movl $0x44, L._s+2(%rip)    # X86_64_RELOC_SIGNED_2
+-  callq _f
+-  movb $0x45, L._s(%rip)      # X86_64_RELOC_SIGNED_1
+-  callq _f
+-  ret
+-
+-.section __DATA,__data
+-.globl _s
+-_s:
+-  .space 5
+-
+-## Create a new section to force the assembler to use a section relocation for
+-## the private symbol L._s. Otherwise, it will instead use a nearby non-private
+-## symbol to create a symbol relocation plus an addend.
+-.section __DATA,__foo
+-L._s:
+-  .space 5
+diff --git a/lld/test/MachO/x86-64-reloc-unsigned.s b/lld/test/MachO/x86-64-reloc-unsigned.s
+deleted file mode 100644
+index 52a3d536139..00000000000
+--- a/lld/test/MachO/x86-64-reloc-unsigned.s
++++ /dev/null
+@@ -1,31 +0,0 @@
+-# REQUIRES: x86
+-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t.o
+-# RUN: lld -flavor darwinnew -o %t %t.o
+-# RUN: llvm-objdump --full-contents %t | FileCheck %s
+-# CHECK: Contents of section foo:
+-# CHECK:  100001000 08100000 01000000
+-# CHECK: Contents of section bar:
+-# CHECK:  100001008 011000f0 11211111 02000000
+-
+-.globl _main, _foo, _bar
+-
+-.section __DATA,foo
+-_foo:
+-.quad _bar
+-
+-.section __DATA,bar
+-_bar:
+-## We create a .int symbol reference here -- with non-zero data immediately
+-## after -- to check that lld reads precisely 32 bits (and not more) of the
+-## implicit addend when handling unsigned relocations of r_length = 2.
+-## Note that __PAGEZERO occupies the lower 32 bits, so all symbols are above
+-## that. To get a final relocated address that fits within 32 bits, we need to
+-## subtract an offset here.
+-.int _foo - 0x0fffffff
+-## The unsigned relocation should support 64-bit addends too (r_length = 3).
+-.quad _foo + 0x111111111
+-
+-.text
+-_main:
+-  mov $0, %rax
+-  ret
+diff --git a/lld/tools/lld/CMakeLists.txt b/lld/tools/lld/CMakeLists.txt
+index e6f72fcd348..ca589942712 100644
+--- a/lld/tools/lld/CMakeLists.txt
++++ b/lld/tools/lld/CMakeLists.txt
+@@ -15,7 +15,6 @@ target_link_libraries(lld
+   lldCOFF
+   lldDriver
+   lldELF
+-  lldMachO2
+   lldMinGW
+   lldWasm
+   )
+diff --git a/lld/tools/lld/lld.cpp b/lld/tools/lld/lld.cpp
+index 8a8f8d04bbd..1063e80b8a8 100644
+--- a/lld/tools/lld/lld.cpp
++++ b/lld/tools/lld/lld.cpp
+@@ -45,11 +45,10 @@ using namespace llvm::sys;
+ 
+ enum Flavor {
+   Invalid,
+-  Gnu,       // -flavor gnu
+-  WinLink,   // -flavor link
+-  Darwin,    // -flavor darwin
+-  DarwinNew, // -flavor darwinnew
+-  Wasm,      // -flavor wasm
++  Gnu,     // -flavor gnu
++  WinLink, // -flavor link
++  Darwin,  // -flavor darwin
++  Wasm,    // -flavor wasm
+ };
+ 
+ LLVM_ATTRIBUTE_NORETURN static void die(const Twine &s) {
+@@ -63,7 +62,6 @@ static Flavor getFlavor(StringRef s) {
+       .CasesLower("wasm", "ld-wasm", Wasm)
+       .CaseLower("link", WinLink)
+       .CasesLower("ld64", "ld64.lld", "darwin", Darwin)
+-      .CaseLower("darwinnew", DarwinNew)
+       .Default(Invalid);
+ }
+ 
+@@ -151,8 +149,6 @@ int main(int argc, const char **argv) {
+     return !coff::link(args, canExitEarly(), llvm::outs(), llvm::errs());
+   case Darwin:
+     return !mach_o::link(args, canExitEarly(), llvm::outs(), llvm::errs());
+-  case DarwinNew:
+-    return !macho::link(args, canExitEarly(), llvm::outs(), llvm::errs());
+   case Wasm:
+     return !wasm::link(args, canExitEarly(), llvm::outs(), llvm::errs());
+   default:
+-- 
+2.18.1
+
diff --git a/SOURCES/lld-10.0.0.src.tar.xz.sig b/SOURCES/lld-10.0.0.src.tar.xz.sig
deleted file mode 100644
index e30a6d4..0000000
Binary files a/SOURCES/lld-10.0.0.src.tar.xz.sig and /dev/null differ
diff --git a/SOURCES/lld-11.0.0.src.tar.xz.sig b/SOURCES/lld-11.0.0.src.tar.xz.sig
new file mode 100644
index 0000000..0884359
Binary files /dev/null and b/SOURCES/lld-11.0.0.src.tar.xz.sig differ
diff --git a/SOURCES/run-lit-tests b/SOURCES/run-lit-tests
index 7b92d2e..b02c0b3 100755
--- a/SOURCES/run-lit-tests
+++ b/SOURCES/run-lit-tests
@@ -56,8 +56,9 @@ esac
 cd $(mktemp -d)
 ln -s /usr/include include
 tar -xzf /usr/share/lld/src/test.tar.gz
-ln -s $ARCH.site.cfg.py test/lit.site.cfg.py
-ln -s $ARCH.site.cfg.py test/Unit/lit.site.cfg.py
+ln -s /usr/share/lld/src/$ARCH.site.cfg.py test/lit.site.cfg.py
+ln -s /usr/share/lld/src/$ARCH.Unit.site.cfg.py test/Unit/lit.site.cfg.py
+
 
 LD_LIBRARY_PATH=$LIB_DIR/lld:$LD_LIBRARY_PATH \
 lit -v -s $threads_arg test \
diff --git a/SPECS/lld.spec b/SPECS/lld.spec
index 540ad74..01aa3d0 100644
--- a/SPECS/lld.spec
+++ b/SPECS/lld.spec
@@ -1,7 +1,7 @@
 #%%global rc_ver 6
-%global baserelease 1
+%global baserelease 3
 %global lld_srcdir lld-%{version}%{?rc_ver:rc%{rc_ver}}.src
-%global maj_ver 10
+%global maj_ver 11
 %global min_ver 0
 %global patch_ver 0
 
@@ -18,27 +18,26 @@ Summary:	The LLVM Linker
 
 License:	NCSA
 URL:		http://llvm.org
-%if 0%{?rc_ver:1}
-Source0:	https://prereleases.llvm.org/%{version}/rc%{rc_ver}/%{lld_srcdir}.tar.xz
-Source3:	https://prereleases.llvm.org/%{version}/rc%{rc_ver}/%{lld_srcdir}.tar.xz.sig
-%else
-Source0:	https://github.com/llvm/llvm-project/releases/download/llvmorg-%{version}/%{lld_srcdir}.tar.xz
-Source3:	https://github.com/llvm/llvm-project/releases/download/llvmorg-%{version}/%{lld_srcdir}.tar.xz.sig
-%endif
-Source1:	run-lit-tests
-Source2:	lit.lld-test.cfg.py
-Source4:	https://prereleases.llvm.org/%{version}/hans-gpg-key.asc
+Source0:	https://github.com/llvm/llvm-project/releases/download/llvmorg-%{version}%{?rc_ver:-rc%{rc_ver}}/%{lld_srcdir}.tar.xz
+Source1:	https://github.com/llvm/llvm-project/releases/download/llvmorg-%{version}%{?rc_ver:-rc%{rc_ver}}/%{lld_srcdir}.tar.xz.sig
+Source2:	https://prereleases.llvm.org/%{version}/hans-gpg-key.asc
+Source3:	run-lit-tests
+Source4:	lit.lld-test.cfg.py
 
 Patch0:		0001-CMake-Check-for-gtest-headers-even-if-lit.py-is-not-.patch
+Patch1:		0001-Revert-lld-Initial-commit-for-new-Mach-O-backend.patch
+
+ExcludeArch:	s390x
 
 BuildRequires:	gcc
 BuildRequires:	gcc-c++
 BuildRequires:	cmake
+BuildRequires:	ninja-build
 BuildRequires:	llvm-devel = %{version}
 BuildRequires:	llvm-test = %{version}
 BuildRequires:	ncurses-devel
 BuildRequires:	zlib-devel
-BuildRequires:	chrpath
+BuildRequires:	python3-devel
 
 # For make check:
 BuildRequires:	python3-rpm-macros
@@ -57,7 +56,10 @@ The LLVM project linker.
 
 %package devel
 Summary:	Libraries and header files for LLD
-Requires: lld-libs = %{version}-%{release}
+Requires: lld-libs%{?_isa} = %{version}-%{release}
+# lld tools are referenced in the cmake files, so we need to add lld as a
+# dependency.
+Requires: %{name}%{?_isa} = %{version}-%{release}
 
 %description devel
 This package contains library and header files needed to develop new native
@@ -80,7 +82,15 @@ Requires:	lld-libs = %{version}-%{release}
 LLVM regression tests.
 
 %prep
-%autosetup -n %{lld_srcdir} -p1
+
+%setup -q -n %{lld_srcdir}
+
+%patch0 -p1 -b .gtest-fix
+# Remove the MachO backend since it doesn't seem to work on big-endian hosts.
+%ifarch s390x
+%patch1 -p2 -b .remove-MachO
+%endif
+
 
 %build
 
@@ -88,8 +98,10 @@ mkdir %{_target_platform}
 cd %{_target_platform}
 
 %cmake .. \
+	-GNinja \
 	-DLLVM_LINK_LLVM_DYLIB:BOOL=ON \
 	-DLLVM_DYLIB_COMPONENTS="all" \
+	-DCMAKE_SKIP_RPATH:BOOL=ON \
 	-DPYTHON_EXECUTABLE=%{__python3} \
 	-DLLVM_INCLUDE_TESTS=ON \
 	-DLLVM_MAIN_SRC_DIR=%{_datadir}/llvm/src \
@@ -102,10 +114,10 @@ cd %{_target_platform}
 	-DLLVM_LIBDIR_SUFFIX=
 %endif
 
-%make_build
+%ninja_build
 
 # Build the unittests so we can install them.
-%make_build lld-test-depends
+%ninja_build lld-test-depends
 
 %install
 
@@ -125,11 +137,16 @@ done
 
 # Install test files
 install -d %{buildroot}%{_datadir}/lld/src
-cp %{SOURCE2} %{buildroot}%{_datadir}/lld/
+cp %{SOURCE4} %{buildroot}%{_datadir}/lld/
+
+# The various tar options are there to make sur the archive is the same on 32 and 64 bit arch, i.e.
+# the archive creation is reproducible. Move arch-specific content out of the tarball
+mv %{lit_cfg} %{buildroot}%{_datadir}/lld/src/%{_arch}.site.cfg.py
+mv %{lit_unit_cfg} %{buildroot}%{_datadir}/lld/src/%{_arch}.Unit.site.cfg.py
+tar --sort=name --mtime='UTC 2020-01-01' -c test/ | gzip -n > %{buildroot}%{_datadir}/lld/src/test.tar.gz
 
-tar -czf %{buildroot}%{_datadir}/lld/src/test.tar.gz test/
 install -d %{buildroot}%{_libexecdir}/tests/lld
-cp %{SOURCE1} %{buildroot}%{_libexecdir}/tests/lld
+cp %{SOURCE3} %{buildroot}%{_libexecdir}/tests/lld
 
 # Install unit test binaries
 install -d %{buildroot}%{_libdir}/lld/
@@ -141,12 +158,7 @@ cp %{_target_platform}/%{_lib}/libgtest*so* %{buildroot}%{_libdir}/lld/
 
 # Install libraries and binaries
 cd %{_target_platform}
-%make_install
-
-# Remove rpath
-chrpath --delete %{buildroot}%{_bindir}/*
-chrpath --delete %{buildroot}%{_libdir}/*.so*
-chrpath --delete `find %{buildroot}%{_libdir}/lld/ -type f`
+%ninja_install
 
 %if %{with ld_alternative}
 # Required when using update-alternatives:
@@ -166,12 +178,13 @@ fi
 
 # armv7lhl tests disabled because of arm issue, see https://koji.fedoraproject.org/koji/taskinfo?taskID=33660162
 %ifnarch %{arm}
-make -C %{_target_platform} %{?_smp_mflags} check-lld
+%ninja_build -C %{_target_platform} %{?_smp_mflags} check-lld
 %endif
 
 %ldconfig_scriptlets libs
 
 %files
+%license LICENSE.TXT
 %if %{with ld_alternative}
 %ghost %{_bindir}/ld
 %endif
@@ -183,6 +196,7 @@ make -C %{_target_platform} %{?_smp_mflags} check-lld
 %files devel
 %{_includedir}/lld
 %{_libdir}/liblld*.so
+%{_libdir}/cmake/lld/
 
 %files libs
 %{_libdir}/liblld*.so.*
@@ -191,9 +205,26 @@ make -C %{_target_platform} %{?_smp_mflags} check-lld
 %{_libexecdir}/tests/lld/
 %{_libdir}/lld/
 %{_datadir}/lld/src/test.tar.gz
+%{_datadir}/lld/src/%{_arch}.site.cfg.py
+%{_datadir}/lld/src/%{_arch}.Unit.site.cfg.py
 %{_datadir}/lld/lit.lld-test.cfg.py
 
 %changelog
+* Mon Nov 09 2020 sguelton@redhat.com - 11.0.0-3
+- Exclude s390x, see rhbz#1894927
+
+* Thu Oct 29 2020 sguelton@redhat.com - 11.0.0-1
+- 11.0.0 final
+
+* Fri Sep 18 2020 sguelton@redhat.com - 11.0.0-0.1.rc2
+- 11.0.0-rc2 Release
+
+* Fri Jul 24 2020 sguelton@redhat.com - 10.0.1-1
+- 10.0.1 release
+
+* Mon Jul 20 2020 sguelton@redhat.com - 10.0.0-2
+- Fix arch-dependent tarball
+
 * Thu Apr 9 2020 sguelton@redhat.com - 10.0.0-1
 - 10.0.0 final