mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-18 07:16:40 +00:00
Revert "[lld] enable fixup chains by default (#79894)"
This caused links to fail with:
lld/MachO/Symbols.cpp:97:
virtual uint64_t lld::macho::Defined::getVA() const:
Assertion `target->usesThunks()' failed.
or crash when asserts are disabled. See comment on
https://github.com/llvm/llvm-project/pull/79894
> Enable chained fixups in lld when all platform and version criteria are
> met. This is an attempt at simplifying the logic used in ld 907:
>
> 93d74eafc3/src/ld/Options.cpp (L5458-L5549)
>
> Some changes were made to simplify the logic:
> - only enable chained fixups for macOS from 13.0 to avoid the arch check
> - only enable chained fixups for iphonesimulator from 16.0 to avoid the
> arch check
> - don't enable chained fixups for not specifically listed platforms
> - don't enable chained fixups for arm64_32
This reverts commit 775c2856fb32868f357a3ce3f2b4139541e12578.
This commit is contained in:
parent
53c0e809fa
commit
f55b79f59a
@ -49,7 +49,6 @@
|
||||
#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 <algorithm>
|
||||
@ -1043,53 +1042,41 @@ static bool shouldEmitChainedFixups(const InputArgList &args) {
|
||||
if (arg && arg->getOption().matches(OPT_no_fixup_chains))
|
||||
return false;
|
||||
|
||||
bool requested = arg && arg->getOption().matches(OPT_fixup_chains);
|
||||
if (!config->isPic) {
|
||||
if (requested)
|
||||
error("-fixup_chains is incompatible with -no_pie");
|
||||
bool isRequested = arg != nullptr;
|
||||
|
||||
return false;
|
||||
// Version numbers taken from the Xcode 13.3 release notes.
|
||||
static const std::array<std::pair<PlatformType, VersionTuple>, 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;
|
||||
|
||||
warn("-fixup_chains requires " + getPlatformName(config->platform()) + " " +
|
||||
it->second.getAsString() + ", which is newer than target minimum of " +
|
||||
config->platformInfo.target.MinDeployment.getAsString());
|
||||
}
|
||||
|
||||
if (!is_contained({AK_x86_64, AK_x86_64h, AK_arm64}, config->arch())) {
|
||||
if (requested)
|
||||
if (isRequested)
|
||||
error("-fixup_chains is only supported on x86_64 and arm64 targets");
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
if (args.hasArg(OPT_preload)) {
|
||||
if (requested)
|
||||
error("-fixup_chains is incompatible with -preload");
|
||||
|
||||
if (!config->isPic) {
|
||||
if (isRequested)
|
||||
error("-fixup_chains is incompatible with -no_pie");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (requested)
|
||||
return true;
|
||||
|
||||
static const std::array<std::pair<PlatformType, VersionTuple>, 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;
|
||||
// TODO: Enable by default once stable.
|
||||
return isRequested;
|
||||
}
|
||||
|
||||
void SymbolPatterns::clear() {
|
||||
|
@ -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 -no_fixup_chains
|
||||
# RUN: %lld-watchos -lSystem %t/libfoo.dylib %t/libbar.dylib %t/test.o -o %t/test
|
||||
|
||||
# RUN: llvm-objdump --no-print-imm-hex --macho -d --no-show-raw-insn --section="__TEXT,__stubs" --section="__TEXT,__stub_helper" %t/test | FileCheck %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 -no_fixup_chains
|
||||
# RUN: %lld -arch arm64 -lSystem %t/libfoo.dylib %t/libbar.dylib %t/test.o -o %t/test
|
||||
|
||||
# RUN: llvm-objdump --no-print-imm-hex --macho -d --no-show-raw-insn --section="__TEXT,__stubs" --section="__TEXT,__stub_helper" %t/test | FileCheck %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 -no_fixup_chains 2>&1 | \
|
||||
# RUN: FileCheck --check-prefix=MISSINGSTUB %s
|
||||
# RUN: -o %t/libbar.dylib 2>&1 | FileCheck --check-prefix=MISSINGSTUB %s
|
||||
# RUN: %lld -arch arm64 -lSystem -dylib %t/bar.o %t/libfoo.dylib \
|
||||
# RUN: -o %t/libbar.dylib -no_fixup_chains
|
||||
# RUN: -o %t/libbar.dylib
|
||||
# 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 -no_fixup_chains 2>&1 | FileCheck --check-prefix=MISSINGSTUB %s
|
||||
# RUN: -o %t/test 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 -no_fixup_chains
|
||||
# RUN: -o %t/test
|
||||
# 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 -no_fixup_chains
|
||||
# RUN: -o %t/test -undefined dynamic_lookup
|
||||
# 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 -no_fixup_chains
|
||||
# RUN: -o %t/test -U dyld_stub_binder
|
||||
# RUN: llvm-nm -m %t/test | FileCheck --check-prefix=DYNSTUB %s
|
||||
|
||||
# MISSINGSTUB: error: undefined symbol: dyld_stub_binder
|
||||
|
@ -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 -no_fixup_chains
|
||||
; RUN: %lld -arch arm64 -lSystem --icf=all -dylib -o %t/icf-all.dylib %t/icf-obj.o -no_fixup_chains
|
||||
; 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: 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 -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: %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: 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
|
||||
|
||||
|
@ -2,6 +2,9 @@
|
||||
# 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
|
||||
@ -9,6 +12,7 @@
|
||||
## 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
|
||||
|
@ -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 -no_fixup_chains
|
||||
# RUN: %t/explicit-selrefs-1.o %t/explicit-selrefs-2.o
|
||||
# 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 -no_fixup_chains
|
||||
# RUN: %t/explicit-selrefs-1.o %t/explicit-selrefs-2.o
|
||||
# RUN: llvm-otool -vs __DATA __objc_selrefs %t/explicit-only-with-icf \
|
||||
# RUN: | FileCheck %s --check-prefix=EXPLICIT-WITH-ICF
|
||||
|
||||
@ -25,8 +25,7 @@
|
||||
# SELREFS-EMPTY:
|
||||
|
||||
# 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: -no_fixup_chains
|
||||
# RUN: %t/explicit-selrefs-1.o %t/explicit-selrefs-2.o %t/implicit-selrefs.o
|
||||
# RUN: llvm-otool -vs __DATA __objc_selrefs %t/explicit-and-implicit \
|
||||
# RUN: | FileCheck %s --check-prefix=EXPLICIT-AND-IMPLICIT
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user