Skip to content

Commit df974b2

Browse files
committed
[Driver] Always link arclite when deploying earlier than macOS 10.14
For the upcoming hook in the ObjC runtime for class_getImageName (see previous commit).
1 parent 3ed3774 commit df974b2

File tree

2 files changed

+35
-12
lines changed

2 files changed

+35
-12
lines changed

lib/Driver/DarwinToolChains.cpp

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,26 @@ static void addVersionString(const ArgList &inputArgs, ArgStringList &arguments,
198198
arguments.push_back(inputArgs.MakeArgString(os.str()));
199199
}
200200

201+
/// Returns true if the compiler depends on features provided by the ObjC
202+
/// runtime that are not present on the deployment target indicated by
203+
/// \p triple.
204+
static bool wantsObjCRuntime(const llvm::Triple &triple) {
205+
assert((!triple.isTvOS() || triple.isiOS()) &&
206+
"tvOS is considered a kind of iOS");
207+
208+
// When updating the versions listed here, please record the most recent
209+
// feature being depended on and when it was introduced:
210+
//
211+
// - The hook to override class_getImageName (macOS 10.14 and equivalent)
212+
if (triple.isiOS())
213+
return triple.isOSVersionLT(12);
214+
if (triple.isMacOSX())
215+
return triple.isMacOSXVersionLT(10, 14);
216+
if (triple.isWatchOS())
217+
return triple.isOSVersionLT(5);
218+
llvm_unreachable("unknown Darwin OS");
219+
}
220+
201221
ToolChain::InvocationInfo
202222
toolchains::Darwin::constructInvocation(const LinkJobAction &job,
203223
const JobContext &context) const {
@@ -282,15 +302,9 @@ toolchains::Darwin::constructInvocation(const LinkJobAction &job,
282302
if (llvm::sys::fs::exists(CompilerRTPath))
283303
Arguments.push_back(context.Args.MakeArgString(CompilerRTPath));
284304

285-
bool wantsObjCRuntime = false;
286-
if (Triple.isiOS())
287-
wantsObjCRuntime = Triple.isOSVersionLT(9);
288-
else if (Triple.isMacOSX())
289-
wantsObjCRuntime = Triple.isMacOSXVersionLT(10, 11);
290-
291305
if (context.Args.hasFlag(options::OPT_link_objc_runtime,
292306
options::OPT_no_link_objc_runtime,
293-
/*Default=*/wantsObjCRuntime)) {
307+
/*Default=*/wantsObjCRuntime(Triple))) {
294308
llvm::SmallString<128> ARCLiteLib(D.getSwiftProgramPath());
295309
llvm::sys::path::remove_filename(ARCLiteLib); // 'swift'
296310
llvm::sys::path::remove_filename(ARCLiteLib); // 'bin'

test/Driver/linker-arclite.swift

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,24 @@
1111

1212
// RUN: %swiftc_driver -driver-print-jobs -target x86_64-apple-ios8.0 %S/../Inputs/empty.swift | %FileCheck -check-prefix IOS_ARCLITE %s
1313

14-
// RUN: %swiftc_driver -driver-print-jobs -target x86_64-apple-macosx10.11 %S/../Inputs/empty.swift | %FileCheck -check-prefix NO_ARCLITE %s
15-
// RUN: %swiftc_driver -driver-print-jobs -target x86_64-apple-ios9.0 %S/../Inputs/empty.swift | %FileCheck -check-prefix NO_ARCLITE %s
16-
// RUN: %swiftc_driver -driver-print-jobs -target arm64-apple-tvos9.0 %S/../Inputs/empty.swift | %FileCheck -check-prefix NO_ARCLITE %s
17-
// RUN: %swiftc_driver -driver-print-jobs -target armv7k-apple-watchos2.0 %S/../Inputs/empty.swift | %FileCheck -check-prefix NO_ARCLITE %s
18-
1914
// IOS_ARCLITE: bin/ld{{"? }}
2015
// IOS_ARCLITE: -force_load {{[^ ]+/lib/arc/libarclite_iphonesimulator.a}}
2116
// IOS_ARCLITE: -o {{[^ ]+}}
2217

18+
19+
// RUN: %swiftc_driver -driver-print-jobs -target x86_64-apple-macosx10.14 %S/../Inputs/empty.swift | %FileCheck -check-prefix NO_ARCLITE %s
20+
// RUN: %swiftc_driver -driver-print-jobs -target x86_64-apple-macosx10.13 %S/../Inputs/empty.swift | %FileCheck -check-prefix ANY_ARCLITE %s
21+
// RUN: %swiftc_driver -driver-print-jobs -target x86_64-apple-ios12 %S/../Inputs/empty.swift | %FileCheck -check-prefix NO_ARCLITE %s
22+
// RUN: %swiftc_driver -driver-print-jobs -target x86_64-apple-ios11 %S/../Inputs/empty.swift | %FileCheck -check-prefix ANY_ARCLITE %s
23+
// RUN: %swiftc_driver -driver-print-jobs -target arm64-apple-tvos12 %S/../Inputs/empty.swift | %FileCheck -check-prefix NO_ARCLITE %s
24+
// RUN: %swiftc_driver -driver-print-jobs -target arm64-apple-tvos11 %S/../Inputs/empty.swift | %FileCheck -check-prefix ANY_ARCLITE %s
25+
// RUN: %swiftc_driver -driver-print-jobs -target armv7k-apple-watchos5 %S/../Inputs/empty.swift | %FileCheck -check-prefix NO_ARCLITE %s
26+
// RUN: %swiftc_driver -driver-print-jobs -target armv7k-apple-watchos4 %S/../Inputs/empty.swift | %FileCheck -check-prefix ANY_ARCLITE %s
27+
2328
// NO_ARCLITE: bin/ld{{"? }}
2429
// NO_ARCLITE-NOT: arclite
2530
// NO_ARCLITE: -o {{[^ ]+}}
31+
32+
// ANY_ARCLITE: bin/ld{{"? }}
33+
// ANY_ARCLITE: -force_load {{[^ ]+}}/lib/arc/libarclite_{{.+}}.a
34+
// ANY_ARCLITE: -o {{[^ ]+}}

0 commit comments

Comments
 (0)