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