Skip to content

Commit 6b8c83a

Browse files
[overlay] Support the older @rpath Darwin library for _Builtin_float's $ld$previous$ symbols
The _Builtin_float symbols were moved twice, most recently from the OS Darwin library, but previously they were in the embedded @rpath Darwin library. @_originallyDefinedIn doesn't support multiple install names, but it can be replaced with -module-abi-name, and then multiple $ld$previous$ symbols can be used. Update the Platform and Concurrency magic symbols to use $ld$previous$ everywhere. rdar://130107191
1 parent bb16e50 commit 6b8c83a

22 files changed

+434
-263
lines changed

stdlib/linker-support/magic-symbols-for-install-name.c

Lines changed: 41 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
//
33
// This source file is part of the Swift.org open source project
44
//
5-
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
5+
// Copyright (c) 2014 - 2024 Apple Inc. and the Swift project authors
66
// Licensed under Apache License v2.0 with Runtime Library Exception
77
//
88
// See https://swift.org/LICENSE.txt for license information
@@ -19,74 +19,54 @@
1919

2020
#if defined(__APPLE__) && defined(__MACH__) && SWIFT_STDLIB_SUPPORT_BACK_DEPLOYMENT
2121

22-
#include <Availability.h>
22+
#include <mach-o/loader.h>
2323
#include <TargetConditionals.h>
2424
#include "swift/shims/Visibility.h"
2525

26-
#define RPATH_INSTALL_NAME_DIRECTIVE_IMPL2(name, major, minor) \
27-
SWIFT_RUNTIME_EXPORT const char install_name_ ## major ## _ ## minor \
28-
__asm("$ld$install_name$os" #major "." #minor "$@rpath/lib" #name ".dylib"); \
29-
const char install_name_ ## major ## _ ## minor = 0;
26+
// Swift was supported as an embedded library in macOS (née OS X) 10.9, iOS 7.0, watchOS 2.0, tvOS 9.0.
27+
// It became part of the OS in macOS 10.14.4, iOS 12.2, watchOS 5.2, tvOS 12.2. Projects can continue
28+
// to embed Swift, but the linker will see the OS version and try to link on that by default. In order
29+
// to support back deployment, add a magic symbol to the OS library so that back deployment will link
30+
// on the embedded library instead. When running on a newer OS, the OS version of the library will be
31+
// used due to Xcode inserting a runpath search path of /usr/lib/swift based on the deployment target
32+
// being less than SupportedTargets[target][SwiftOSRuntimeMinimumDeploymentTarget] in SDKSettings.plist.
3033

31-
#define RPATH_INSTALL_NAME_DIRECTIVE_IMPL(name, major, minor) \
32-
RPATH_INSTALL_NAME_DIRECTIVE_IMPL2(name, major, minor)
34+
// The linker uses a specially formatted symbol to do the back deployment:
35+
// $ld$previous$<install-name>$<compatibility-version>$<platform>$<start-version>$<end-version>$<symbol-name>$
36+
// compatibility-version and symbol-name are left off to apply to all library versions and symbols.
37+
// This symbol isn't a legal C identifier, so it needs to be specified with __asm.
38+
#define RPATH_PREVIOUS_DIRECTIVE_IMPL(name, platform, startVersion, endVersion) \
39+
SWIFT_RUNTIME_EXPORT const char ld_previous_ ## platform \
40+
__asm("$ld$previous$@rpath/lib" __STRING(name) ".dylib$$" __STRING(platform) "$" __STRING(startVersion) "$" __STRING(endVersion) "$$"); \
41+
const char ld_previous_ ## platform = 0;
42+
// Using the __STRING macro is important so that name and platform get expanded before being
43+
// stringified. The versions could just be #version, __STRING is only used for consistency.
3344

34-
#define RPATH_INSTALL_NAME_DIRECTIVE(major, minor) \
35-
RPATH_INSTALL_NAME_DIRECTIVE_IMPL(SWIFT_TARGET_LIBRARY_NAME, major, minor)
45+
#define RPATH_PREVIOUS_DIRECTIVE(platform, startVersion, endVersion) \
46+
RPATH_PREVIOUS_DIRECTIVE_IMPL(SWIFT_TARGET_LIBRARY_NAME, platform, startVersion, endVersion)
3647

37-
38-
#if TARGET_OS_WATCH
39-
// Check watchOS first, because TARGET_OS_IPHONE includes watchOS.
40-
RPATH_INSTALL_NAME_DIRECTIVE( 2, 0)
41-
RPATH_INSTALL_NAME_DIRECTIVE( 2, 1)
42-
RPATH_INSTALL_NAME_DIRECTIVE( 2, 2)
43-
RPATH_INSTALL_NAME_DIRECTIVE( 3, 0)
44-
RPATH_INSTALL_NAME_DIRECTIVE( 3, 1)
45-
RPATH_INSTALL_NAME_DIRECTIVE( 3, 2)
46-
RPATH_INSTALL_NAME_DIRECTIVE( 4, 0)
47-
RPATH_INSTALL_NAME_DIRECTIVE( 4, 1)
48-
RPATH_INSTALL_NAME_DIRECTIVE( 4, 2)
49-
RPATH_INSTALL_NAME_DIRECTIVE( 4, 3)
50-
RPATH_INSTALL_NAME_DIRECTIVE( 5, 0)
51-
RPATH_INSTALL_NAME_DIRECTIVE( 5, 1)
52-
#elif TARGET_OS_IPHONE
53-
RPATH_INSTALL_NAME_DIRECTIVE( 7, 0)
54-
RPATH_INSTALL_NAME_DIRECTIVE( 7, 1)
55-
RPATH_INSTALL_NAME_DIRECTIVE( 8, 0)
56-
RPATH_INSTALL_NAME_DIRECTIVE( 8, 1)
57-
RPATH_INSTALL_NAME_DIRECTIVE( 8, 2)
58-
RPATH_INSTALL_NAME_DIRECTIVE( 8, 3)
59-
RPATH_INSTALL_NAME_DIRECTIVE( 8, 4)
60-
RPATH_INSTALL_NAME_DIRECTIVE( 9, 0)
61-
RPATH_INSTALL_NAME_DIRECTIVE( 9, 1)
62-
RPATH_INSTALL_NAME_DIRECTIVE( 9, 2)
63-
RPATH_INSTALL_NAME_DIRECTIVE( 9, 3)
64-
RPATH_INSTALL_NAME_DIRECTIVE(10, 0)
65-
RPATH_INSTALL_NAME_DIRECTIVE(10, 1)
66-
RPATH_INSTALL_NAME_DIRECTIVE(10, 2)
67-
RPATH_INSTALL_NAME_DIRECTIVE(10, 3)
68-
RPATH_INSTALL_NAME_DIRECTIVE(11, 0)
69-
RPATH_INSTALL_NAME_DIRECTIVE(11, 1)
70-
RPATH_INSTALL_NAME_DIRECTIVE(11, 2)
71-
RPATH_INSTALL_NAME_DIRECTIVE(11, 3)
72-
RPATH_INSTALL_NAME_DIRECTIVE(11, 4)
73-
RPATH_INSTALL_NAME_DIRECTIVE(12, 0)
74-
RPATH_INSTALL_NAME_DIRECTIVE(12, 1)
75-
#elif TARGET_OS_OSX
76-
RPATH_INSTALL_NAME_DIRECTIVE(10, 9)
77-
RPATH_INSTALL_NAME_DIRECTIVE(10, 10)
78-
RPATH_INSTALL_NAME_DIRECTIVE(10, 11)
79-
RPATH_INSTALL_NAME_DIRECTIVE(10, 12)
80-
RPATH_INSTALL_NAME_DIRECTIVE(10, 13)
81-
82-
// When building with a deployment target of < macOS 10.14,
83-
// treat macOS 10.14 as an "older OS."
84-
#if __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_14
85-
RPATH_INSTALL_NAME_DIRECTIVE(10, 14)
48+
#if TARGET_OS_OSX || TARGET_OS_MACCATALYST
49+
RPATH_PREVIOUS_DIRECTIVE(PLATFORM_MACOS, 10.9, 10.14.4)
50+
#elif TARGET_OS_IOS && !TARGET_OS_VISION
51+
#if TARGET_OS_SIMULATOR
52+
RPATH_PREVIOUS_DIRECTIVE(PLATFORM_IOSSIMULATOR, 7.0, 12.2)
53+
#else
54+
RPATH_PREVIOUS_DIRECTIVE(PLATFORM_IOS, 7.0, 12.2)
8655
#endif
87-
56+
#elif TARGET_OS_WATCH
57+
#if TARGET_OS_SIMULATOR
58+
RPATH_PREVIOUS_DIRECTIVE(PLATFORM_WATCHOSSIMULATOR, 2.0, 5.2)
8859
#else
89-
#error Unknown target.
60+
RPATH_PREVIOUS_DIRECTIVE(PLATFORM_WATCHOS, 2.0, 5.2)
61+
#endif
62+
#elif TARGET_OS_TV
63+
#if TARGET_OS_SIMULATOR
64+
RPATH_PREVIOUS_DIRECTIVE(PLATFORM_TVOSSIMULATOR, 9.0, 12.2)
65+
#else
66+
RPATH_PREVIOUS_DIRECTIVE(PLATFORM_TVOS, 9.0, 12.2)
67+
#endif
9068
#endif
69+
// Swift wasn't supported as an embedded library in any other OS, so no need to create back deployment
70+
// symbols for any of the other ones.
9171

9272
#endif // defined(__APPLE__) && defined(__MACH__) && SWIFT_STDLIB_SUPPORT_BACK_DEPLOYMENT

stdlib/linker-support/previous-module-installname.json

Lines changed: 0 additions & 6 deletions
This file was deleted.

stdlib/public/ClangOverlays/CMakeLists.txt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,23 @@
11
if(NOT DEFINED SWIFT_BUILD_CLANG_OVERLAYS_SKIP_BUILTIN_FLOAT OR NOT SWIFT_BUILD_CLANG_OVERLAYS_SKIP_BUILTIN_FLOAT)
2+
if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
3+
set(BUILTIN_FLOAT_SWIFT_FLAGS -Xfrontend -module-abi-name -Xfrontend Darwin)
4+
else()
5+
set(BUILTIN_FLOAT_SWIFT_FLAGS)
6+
endif()
7+
28
add_swift_target_library(swift_Builtin_float
39
${SWIFT_STDLIB_LIBRARY_BUILD_TYPES}
410
IS_SDK_OVERLAY
11+
12+
linker-support/magic-symbols-for-install-name.c
513

614
GYB_SOURCES
715
float.swift.gyb
816

917
SWIFT_COMPILE_FLAGS
1018
${SWIFT_RUNTIME_SWIFT_COMPILE_FLAGS}
1119
${SWIFT_STANDARD_LIBRARY_SWIFT_FLAGS}
12-
-Xfrontend -previous-module-installname-map-file -Xfrontend "${SWIFT_SOURCE_DIR}/stdlib/linker-support/previous-module-installname.json"
20+
${BUILTIN_FLOAT_SWIFT_FLAGS}
1321

1422
LINK_FLAGS
1523
${SWIFT_RUNTIME_SWIFT_LINK_FLAGS}

stdlib/public/ClangOverlays/float.swift.gyb

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414

1515
@available(swift, deprecated: 3.0, message: "Please use 'T.radix' to get the radix of a FloatingPoint type 'T'.")
1616
@available(macOS 10.9, iOS 7.0, watchOS 2.0, tvOS 9.0, visionOS 1.0, *)
17-
@_originallyDefinedIn(module: "Darwin", macOS 15.0, iOS 18.0, watchOS 11.0, tvOS 18.0, visionOS 2.0)
1817
public let FLT_RADIX = Double.radix
1918

2019
%for type, prefix in [('Float', 'FLT'), ('Double', 'DBL'), ('Float80', 'LDBL')]:
@@ -25,7 +24,6 @@ public let FLT_RADIX = Double.radix
2524
// significand bit, but Swift does not. Neither is really right or wrong.
2625
@available(swift, deprecated: 3.0, message: "Please use '${type}.significandBitCount + 1'.")
2726
@available(macOS 10.9, iOS 7.0, watchOS 2.0, tvOS 9.0, visionOS 1.0, *)
28-
@_originallyDefinedIn(module: "Darwin", macOS 15.0, iOS 18.0, watchOS 11.0, tvOS 18.0, visionOS 2.0)
2927
public let ${prefix}_MANT_DIG = ${type}.significandBitCount + 1
3028

3129
// Where does the 1 come from? C models floating-point numbers as having a
@@ -34,32 +32,26 @@ public let ${prefix}_MANT_DIG = ${type}.significandBitCount + 1
3432
// as well.
3533
@available(swift, deprecated: 3.0, message: "Please use '${type}.greatestFiniteMagnitude.exponent + 1'.")
3634
@available(macOS 10.9, iOS 7.0, watchOS 2.0, tvOS 9.0, visionOS 1.0, *)
37-
@_originallyDefinedIn(module: "Darwin", macOS 15.0, iOS 18.0, watchOS 11.0, tvOS 18.0, visionOS 2.0)
3835
public let ${prefix}_MAX_EXP = ${type}.greatestFiniteMagnitude.exponent + 1
3936

4037
@available(swift, deprecated: 3.0, message: "Please use '${type}.leastNormalMagnitude.exponent + 1'.")
4138
@available(macOS 10.9, iOS 7.0, watchOS 2.0, tvOS 9.0, visionOS 1.0, *)
42-
@_originallyDefinedIn(module: "Darwin", macOS 15.0, iOS 18.0, watchOS 11.0, tvOS 18.0, visionOS 2.0)
4339
public let ${prefix}_MIN_EXP = ${type}.leastNormalMagnitude.exponent + 1
4440

4541
@available(swift, deprecated: 3.0, message: "Please use '${type}.greatestFiniteMagnitude' or '.greatestFiniteMagnitude'.")
4642
@available(macOS 10.9, iOS 7.0, watchOS 2.0, tvOS 9.0, visionOS 1.0, *)
47-
@_originallyDefinedIn(module: "Darwin", macOS 15.0, iOS 18.0, watchOS 11.0, tvOS 18.0, visionOS 2.0)
4843
public let ${prefix}_MAX = ${type}.greatestFiniteMagnitude
4944

5045
@available(swift, deprecated: 3.0, message: "Please use '${type}.ulpOfOne' or '.ulpOfOne'.")
5146
@available(macOS 10.9, iOS 7.0, watchOS 2.0, tvOS 9.0, visionOS 1.0, *)
52-
@_originallyDefinedIn(module: "Darwin", macOS 15.0, iOS 18.0, watchOS 11.0, tvOS 18.0, visionOS 2.0)
5347
public let ${prefix}_EPSILON = ${type}.ulpOfOne
5448

5549
@available(swift, deprecated: 3.0, message: "Please use '${type}.leastNormalMagnitude' or '.leastNormalMagnitude'.")
5650
@available(macOS 10.9, iOS 7.0, watchOS 2.0, tvOS 9.0, visionOS 1.0, *)
57-
@_originallyDefinedIn(module: "Darwin", macOS 15.0, iOS 18.0, watchOS 11.0, tvOS 18.0, visionOS 2.0)
5851
public let ${prefix}_MIN = ${type}.leastNormalMagnitude
5952

6053
@available(swift, deprecated: 3.0, message: "Please use '${type}.leastNonzeroMagnitude' or '.leastNonzeroMagnitude'.")
6154
@available(macOS 10.9, iOS 7.0, watchOS 2.0, tvOS 9.0, visionOS 1.0, *)
62-
@_originallyDefinedIn(module: "Darwin", macOS 15.0, iOS 18.0, watchOS 11.0, tvOS 18.0, visionOS 2.0)
6355
public let ${prefix}_TRUE_MIN = ${type}.leastNonzeroMagnitude
6456

6557
% if type == "Float80":
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
//===--- magic-symbols-for-install-name.c - Magic linker directive symbols ===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2024 Apple Inc. and the Swift project authors
6+
// Licensed under Apache License v2.0 with Runtime Library Exception
7+
//
8+
// See https://swift.org/LICENSE.txt for license information
9+
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
10+
//
11+
//===----------------------------------------------------------------------===//
12+
//
13+
// A file containing magic symbols that instruct the linker to use a
14+
// different install name when targeting older OSes. This file gets
15+
// compiled into all of the libraries that are embedded for backward
16+
// deployment.
17+
//
18+
// This file is specific to the Builtin_float library; there is a matching
19+
// file for the standard library with the same name.
20+
//
21+
//===----------------------------------------------------------------------===//
22+
23+
#if defined(__APPLE__) && defined(__MACH__) && SWIFT_STDLIB_SUPPORT_BACK_DEPLOYMENT
24+
25+
#include <mach-o/loader.h>
26+
#include <TargetConditionals.h>
27+
#include "swift/shims/Visibility.h"
28+
29+
// Builtin_float was split out from the Darwin library in macOS 15.0, iOS 18.0, watchOS 11.0, tvOS 18.0,
30+
// visionOS 2.0 Prior to macOS 10.14.4, iOS 12.2, watchOS 5.2, tvOS 12.2, Darwin was supported as an
31+
// embedded library starting in macOS (née OS X) 10.9, iOS 7.0, watchOS 2.0, tvOS 9.0. In order to
32+
// support back deployment, add a magic symbol so that back deployment will link on Darwin instead, and
33+
// the embedded version on particularly old deployment targets. On newer OS versions, Darwin re-exports
34+
// Builtin_float which is where the APIs are implemented.
35+
36+
// The linker uses a specially formatted symbol to do the back deployment:
37+
// $ld$previous$<install-name>$<compatibility-version>$<platform>$<start-version>$<end-version>$<symbol-name>$
38+
// compatibility-version and symbol-name are left off to apply to all library versions and symbols.
39+
// This symbol isn't a legal C identifier, so it needs to be specified with __asm.
40+
#define DARWIN_RPATH_PREVIOUS_DIRECTIVE(platform, startVersion, endVersion) \
41+
SWIFT_RUNTIME_EXPORT const char ld_previous_rpath_ ## platform \
42+
__asm("$ld$previous$@rpath/libswiftDarwin.dylib$$" __STRING(platform) "$" __STRING(startVersion) "$" __STRING(endVersion) "$$"); \
43+
const char ld_previous_rpath_ ## platform = 0;
44+
// Using the __STRING macro is important so that platform gets expanded before being stringified.
45+
// The versions could just be #version, __STRING is only used for consistency.
46+
47+
#define DARWIN_PREVIOUS_DIRECTIVE(platform, startVersion, endVersion) \
48+
SWIFT_RUNTIME_EXPORT const char ld_previous_ ## platform \
49+
__asm("$ld$previous$/usr/lib/swift/libswiftDarwin.dylib$$" __STRING(platform) "$" __STRING(startVersion) "$" __STRING(endVersion) "$$"); \
50+
const char ld_previous_ ## platform = 0;
51+
52+
#if TARGET_OS_OSX || TARGET_OS_MACCATALYST
53+
DARWIN_RPATH_PREVIOUS_DIRECTIVE(PLATFORM_MACOS, 10.9, 10.14.4)
54+
DARWIN_PREVIOUS_DIRECTIVE(PLATFORM_MACOS, 10.14.4, 15.0)
55+
DARWIN_PREVIOUS_DIRECTIVE(PLATFORM_MACCATALYST, 13.1, 18.0)
56+
#elif TARGET_OS_IOS && !TARGET_OS_VISION
57+
#if TARGET_OS_SIMULATOR
58+
DARWIN_RPATH_PREVIOUS_DIRECTIVE(PLATFORM_IOSSIMULATOR, 7.0, 12.2)
59+
DARWIN_PREVIOUS_DIRECTIVE(PLATFORM_IOSSIMULATOR, 12.2, 18.0)
60+
#else
61+
DARWIN_RPATH_PREVIOUS_DIRECTIVE(PLATFORM_IOS, 7.0, 12.2)
62+
DARWIN_PREVIOUS_DIRECTIVE(PLATFORM_IOS, 12.2, 18.0)
63+
#endif
64+
#elif TARGET_OS_WATCH
65+
#if TARGET_OS_SIMULATOR
66+
DARWIN_RPATH_PREVIOUS_DIRECTIVE(PLATFORM_WATCHOSSIMULATOR, 2.0, 5.2)
67+
DARWIN_PREVIOUS_DIRECTIVE(PLATFORM_WATCHOSSIMULATOR, 5.2, 11.0)
68+
#else
69+
DARWIN_RPATH_PREVIOUS_DIRECTIVE(PLATFORM_WATCHOS, 2.0, 5.2)
70+
DARWIN_PREVIOUS_DIRECTIVE(PLATFORM_WATCHOS, 5.2, 11.0)
71+
#endif
72+
#elif TARGET_OS_TV
73+
#if TARGET_OS_SIMULATOR
74+
DARWIN_RPATH_PREVIOUS_DIRECTIVE(PLATFORM_TVOSSIMULATOR, 9.0, 12.2)
75+
DARWIN_PREVIOUS_DIRECTIVE(PLATFORM_TVOSSIMULATOR, 12.2, 18.0)
76+
#else
77+
DARWIN_RPATH_PREVIOUS_DIRECTIVE(PLATFORM_TVOS, 9.0, 12.2)
78+
DARWIN_PREVIOUS_DIRECTIVE(PLATFORM_TVOS, 12.2, 18.0)
79+
#endif
80+
#elif TARGET_OS_VISION
81+
#if TARGET_OS_SIMULATOR
82+
DARWIN_PREVIOUS_DIRECTIVE(PLATFORM_VISIONOSSIMULATOR, 1.0, 2.0);
83+
#else
84+
DARWIN_PREVIOUS_DIRECTIVE(PLATFORM_VISIONOS, 1.0, 2.0);
85+
#endif
86+
#endif
87+
88+
#endif // defined(__APPLE__) && defined(__MACH__) && SWIFT_STDLIB_SUPPORT_BACK_DEPLOYMENT

0 commit comments

Comments
 (0)