diff --git a/lld/MachO/Driver.cpp b/lld/MachO/Driver.cpp index 411fbcfcf233e..2afc1adc3ff49 100644 --- a/lld/MachO/Driver.cpp +++ b/lld/MachO/Driver.cpp @@ -49,6 +49,7 @@ #include "llvm/Support/TargetSelect.h" #include "llvm/Support/TimeProfiler.h" #include "llvm/TargetParser/Host.h" +#include "llvm/TextAPI/Architecture.h" #include "llvm/TextAPI/PackedVersion.h" #include @@ -1042,41 +1043,53 @@ static bool shouldEmitChainedFixups(const InputArgList &args) { if (arg && arg->getOption().matches(OPT_no_fixup_chains)) return false; - bool isRequested = arg != nullptr; - - // Version numbers taken from the Xcode 13.3 release notes. - static const std::array, 4> minVersion = - {{{PLATFORM_MACOS, VersionTuple(11, 0)}, - {PLATFORM_IOS, VersionTuple(13, 4)}, - {PLATFORM_TVOS, VersionTuple(14, 0)}, - {PLATFORM_WATCHOS, VersionTuple(7, 0)}}}; - PlatformType platform = removeSimulator(config->platformInfo.target.Platform); - auto it = llvm::find_if(minVersion, - [&](const auto &p) { return p.first == platform; }); - if (it != minVersion.end() && - it->second > config->platformInfo.target.MinDeployment) { - if (!isRequested) - return false; + bool requested = arg && arg->getOption().matches(OPT_fixup_chains); + if (!config->isPic) { + if (requested) + error("-fixup_chains is incompatible with -no_pie"); - warn("-fixup_chains requires " + getPlatformName(config->platform()) + " " + - it->second.getAsString() + ", which is newer than target minimum of " + - config->platformInfo.target.MinDeployment.getAsString()); + return false; } if (!is_contained({AK_x86_64, AK_x86_64h, AK_arm64}, config->arch())) { - if (isRequested) + if (requested) error("-fixup_chains is only supported on x86_64 and arm64 targets"); + return false; } - if (!config->isPic) { - if (isRequested) - error("-fixup_chains is incompatible with -no_pie"); + if (args.hasArg(OPT_preload)) { + if (requested) + error("-fixup_chains is incompatible with -preload"); + return false; } - // TODO: Enable by default once stable. - return isRequested; + if (requested) + return true; + + static const std::array, 7> minVersion = + {{ + {PLATFORM_IOS, VersionTuple(13, 4)}, + {PLATFORM_IOSSIMULATOR, VersionTuple(16, 0)}, + {PLATFORM_MACOS, VersionTuple(13, 0)}, + {PLATFORM_TVOS, VersionTuple(14, 0)}, + {PLATFORM_TVOSSIMULATOR, VersionTuple(15, 0)}, + {PLATFORM_WATCHOS, VersionTuple(7, 0)}, + {PLATFORM_WATCHOSSIMULATOR, VersionTuple(8, 0)}, + }}; + PlatformType platform = config->platformInfo.target.Platform; + auto it = llvm::find_if(minVersion, + [&](const auto &p) { return p.first == platform; }); + + // We don't know the versions for other platforms, so default to disabled. + if (it == minVersion.end()) + return false; + + if (it->second > config->platformInfo.target.MinDeployment) + return false; + + return true; } void SymbolPatterns::clear() { diff --git a/lld/test/MachO/arm64-32-stubs.s b/lld/test/MachO/arm64-32-stubs.s index 743d5c419bf1a..a5d48ff5baef3 100644 --- a/lld/test/MachO/arm64-32-stubs.s +++ b/lld/test/MachO/arm64-32-stubs.s @@ -10,7 +10,7 @@ # RUN: llvm-mc -filetype=obj -triple=arm64_32-apple-watchos %t/test.s -o %t/test.o # RUN: %lld-watchos -dylib -install_name @executable_path/libfoo.dylib %t/foo.o -o %t/libfoo.dylib # RUN: %lld-watchos -dylib -install_name @executable_path/libbar.dylib %t/bar.o -o %t/libbar.dylib -# RUN: %lld-watchos -lSystem %t/libfoo.dylib %t/libbar.dylib %t/test.o -o %t/test +# RUN: %lld-watchos -lSystem %t/libfoo.dylib %t/libbar.dylib %t/test.o -o %t/test -no_fixup_chains # RUN: llvm-objdump --no-print-imm-hex --macho -d --no-show-raw-insn --section="__TEXT,__stubs" --section="__TEXT,__stub_helper" %t/test | FileCheck %s diff --git a/lld/test/MachO/arm64-stubs.s b/lld/test/MachO/arm64-stubs.s index f714e20084895..6fd94661d32e2 100644 --- a/lld/test/MachO/arm64-stubs.s +++ b/lld/test/MachO/arm64-stubs.s @@ -5,7 +5,7 @@ # RUN: llvm-mc -filetype=obj -triple=arm64-apple-darwin %t/test.s -o %t/test.o # RUN: %lld -arch arm64 -dylib -install_name @executable_path/libfoo.dylib %t/foo.o -o %t/libfoo.dylib # RUN: %lld -arch arm64 -dylib -install_name @executable_path/libbar.dylib %t/bar.o -o %t/libbar.dylib -# RUN: %lld -arch arm64 -lSystem %t/libfoo.dylib %t/libbar.dylib %t/test.o -o %t/test +# RUN: %lld -arch arm64 -lSystem %t/libfoo.dylib %t/libbar.dylib %t/test.o -o %t/test -no_fixup_chains # RUN: llvm-objdump --no-print-imm-hex --macho -d --no-show-raw-insn --section="__TEXT,__stubs" --section="__TEXT,__stub_helper" %t/test | FileCheck %s diff --git a/lld/test/MachO/dyld-stub-binder.s b/lld/test/MachO/dyld-stub-binder.s index 1d2e556607c79..170fe8abd89bd 100644 --- a/lld/test/MachO/dyld-stub-binder.s +++ b/lld/test/MachO/dyld-stub-binder.s @@ -14,27 +14,27 @@ # RUN: %lld -arch arm64 -lSystem -dylib %t/foo.o -o %t/libfoo.dylib # RUN: llvm-nm -m %t/libfoo.dylib | FileCheck --check-prefix=STUB %s - ## Dylibs that do lazy dynamic calls do need dyld_stub_binder. # RUN: not %no-lsystem-lld -arch arm64 -dylib %t/bar.o %t/libfoo.dylib \ -# RUN: -o %t/libbar.dylib 2>&1 | FileCheck --check-prefix=MISSINGSTUB %s +# RUN: -o %t/libbar.dylib -no_fixup_chains 2>&1 | \ +# RUN: FileCheck --check-prefix=MISSINGSTUB %s # RUN: %lld -arch arm64 -lSystem -dylib %t/bar.o %t/libfoo.dylib \ -# RUN: -o %t/libbar.dylib +# RUN: -o %t/libbar.dylib -no_fixup_chains # RUN: llvm-nm -m %t/libbar.dylib | FileCheck --check-prefix=STUB %s ## As do executables. # RUN: not %no-lsystem-lld -arch arm64 %t/libfoo.dylib %t/libbar.dylib %t/test.o \ -# RUN: -o %t/test 2>&1 | FileCheck --check-prefix=MISSINGSTUB %s +# RUN: -o %t/test -no_fixup_chains 2>&1 | FileCheck --check-prefix=MISSINGSTUB %s # RUN: %lld -arch arm64 -lSystem %t/libfoo.dylib %t/libbar.dylib %t/test.o \ -# RUN: -o %t/test +# RUN: -o %t/test -no_fixup_chains # RUN: llvm-nm -m %t/test | FileCheck --check-prefix=STUB %s ## Test dynamic lookup of dyld_stub_binder. # RUN: %no-lsystem-lld -arch arm64 %t/libfoo.dylib %t/libbar.dylib %t/test.o \ -# RUN: -o %t/test -undefined dynamic_lookup +# RUN: -o %t/test -undefined dynamic_lookup -no_fixup_chains # RUN: llvm-nm -m %t/test | FileCheck --check-prefix=DYNSTUB %s # RUN: %no-lsystem-lld -arch arm64 %t/libfoo.dylib %t/libbar.dylib %t/test.o \ -# RUN: -o %t/test -U dyld_stub_binder +# RUN: -o %t/test -U dyld_stub_binder -no_fixup_chains # RUN: llvm-nm -m %t/test | FileCheck --check-prefix=DYNSTUB %s # MISSINGSTUB: error: undefined symbol: dyld_stub_binder diff --git a/lld/test/MachO/icf-safe.ll b/lld/test/MachO/icf-safe.ll index 71c6f9f7ddac8..7f342e12e5c2a 100644 --- a/lld/test/MachO/icf-safe.ll +++ b/lld/test/MachO/icf-safe.ll @@ -3,14 +3,14 @@ ; RUN: rm -rf %t; mkdir %t ; RUN: llc -filetype=obj %s -O3 -o %t/icf-obj.o -enable-machine-outliner=never -mtriple arm64-apple-macos -addrsig -; RUN: %lld -arch arm64 -lSystem --icf=safe -dylib -o %t/icf-safe.dylib %t/icf-obj.o -; RUN: %lld -arch arm64 -lSystem --icf=all -dylib -o %t/icf-all.dylib %t/icf-obj.o +; RUN: %lld -arch arm64 -lSystem --icf=safe -dylib -o %t/icf-safe.dylib %t/icf-obj.o -no_fixup_chains +; RUN: %lld -arch arm64 -lSystem --icf=all -dylib -o %t/icf-all.dylib %t/icf-obj.o -no_fixup_chains ; RUN: llvm-objdump %t/icf-safe.dylib -d --macho | FileCheck %s --check-prefix=ICFSAFE ; RUN: llvm-objdump %t/icf-all.dylib -d --macho | FileCheck %s --check-prefix=ICFALL ; RUN: llvm-as %s -o %t/icf-bitcode.o -; RUN: %lld -arch arm64 -lSystem --icf=safe -dylib -o %t/icf-safe-bitcode.dylib %t/icf-bitcode.o -; RUN: %lld -arch arm64 -lSystem --icf=all -dylib -o %t/icf-all-bitcode.dylib %t/icf-bitcode.o +; RUN: %lld -arch arm64 -lSystem --icf=safe -dylib -o %t/icf-safe-bitcode.dylib %t/icf-bitcode.o -no_fixup_chains +; RUN: %lld -arch arm64 -lSystem --icf=all -dylib -o %t/icf-all-bitcode.dylib %t/icf-bitcode.o -no_fixup_chains ; RUN: llvm-objdump %t/icf-safe-bitcode.dylib -d --macho | FileCheck %s --check-prefix=ICFSAFE ; RUN: llvm-objdump %t/icf-all-bitcode.dylib -d --macho | FileCheck %s --check-prefix=ICFALL diff --git a/lld/test/MachO/invalid/chained-fixups-incompatible.s b/lld/test/MachO/invalid/chained-fixups-incompatible.s index 83411472beb9f..0589204968fe3 100644 --- a/lld/test/MachO/invalid/chained-fixups-incompatible.s +++ b/lld/test/MachO/invalid/chained-fixups-incompatible.s @@ -2,9 +2,6 @@ # RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t.o # RUN: not %lld -lSystem -no_pie -fixup_chains %t.o -o /dev/null 2>&1 | \ # RUN: FileCheck %s --check-prefix=NO-PIE -# RUN: %no-fatal-warnings-lld -fixup_chains %t.o -o /dev/null \ -# RUN: -lSystem -platform_version macos 10.15 10.15 2>&1 | \ -# RUN: FileCheck %s --check-prefix=VERSION # RUN: llvm-mc -filetype=obj -triple=arm64_32-apple-darwin %s -o %t-arm64_32.o # RUN: not %lld-watchos -lSystem -fixup_chains %t-arm64_32.o -o /dev/null 2>&1 | \ # RUN: FileCheck %s --check-prefix=ARCH @@ -12,7 +9,6 @@ ## Check that we emit diagnostics when -fixup_chains is explicitly specified, ## but we don't support creating chained fixups for said configuration. # NO-PIE: error: -fixup_chains is incompatible with -no_pie -# VERSION: warning: -fixup_chains requires macOS 11.0, which is newer than target minimum of 10.15 # ARCH: error: -fixup_chains is only supported on x86_64 and arm64 targets .globl _main diff --git a/lld/test/MachO/objc-selrefs.s b/lld/test/MachO/objc-selrefs.s index 9dff440727ac3..a906978cc2cf7 100644 --- a/lld/test/MachO/objc-selrefs.s +++ b/lld/test/MachO/objc-selrefs.s @@ -6,14 +6,14 @@ # RUN: llvm-mc -filetype=obj -triple=arm64-apple-darwin %t/implicit-selrefs.s -o %t/implicit-selrefs.o # RUN: %lld -dylib -arch arm64 -lSystem -o %t/explicit-only-no-icf \ -# RUN: %t/explicit-selrefs-1.o %t/explicit-selrefs-2.o +# RUN: %t/explicit-selrefs-1.o %t/explicit-selrefs-2.o -no_fixup_chains # RUN: llvm-otool -vs __DATA __objc_selrefs %t/explicit-only-no-icf | \ # RUN: FileCheck %s --check-prefix=EXPLICIT-NO-ICF ## NOTE: ld64 always dedups the selrefs unconditionally, but we only do it when ## ICF is enabled. # RUN: %lld -dylib -arch arm64 -lSystem -o %t/explicit-only-with-icf \ -# RUN: %t/explicit-selrefs-1.o %t/explicit-selrefs-2.o +# RUN: %t/explicit-selrefs-1.o %t/explicit-selrefs-2.o -no_fixup_chains # RUN: llvm-otool -vs __DATA __objc_selrefs %t/explicit-only-with-icf \ # RUN: | FileCheck %s --check-prefix=EXPLICIT-WITH-ICF @@ -26,7 +26,8 @@ ## We don't yet support dedup'ing implicitly-defined selrefs. # RUN: %lld -dylib -arch arm64 -lSystem --icf=all -o %t/explicit-and-implicit \ -# RUN: %t/explicit-selrefs-1.o %t/explicit-selrefs-2.o %t/implicit-selrefs.o +# RUN: %t/explicit-selrefs-1.o %t/explicit-selrefs-2.o %t/implicit-selrefs.o \ +# RUN: -no_fixup_chains # RUN: llvm-otool -vs __DATA __objc_selrefs %t/explicit-and-implicit \ # RUN: | FileCheck %s --check-prefix=EXPLICIT-AND-IMPLICIT