Skip to content

Commit 643491e

Browse files
committed
[Driver] Infer simulator-ness for iOS/tvOS/watchOS.
Localize the hack to infer simulator-ness of the target in the driver itself, when it first processes the target. Emit a warning about the missing "-simulator" and correct the triple immediately. This gives a longer grace period for tools that might still not pass through the simulator environment, while narrowing the hack.
1 parent 992ca56 commit 643491e

File tree

3 files changed

+39
-5
lines changed

3 files changed

+39
-5
lines changed

include/swift/AST/DiagnosticsDriver.def

+3
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,9 @@ ERROR(error_unexpected_input_file,none,
8484

8585
ERROR(error_unknown_target,none,
8686
"unknown target '%0'", (StringRef))
87+
WARNING(warning_inferred_simulator_target,none,
88+
"inferring simulator environment for target '%0'; "
89+
"use '-target %1' instead", (StringRef, StringRef))
8790

8891
ERROR(error_framework_bridging_header,none,
8992
"using bridging headers with framework targets is unsupported", ())

lib/Driver/Driver.cpp

+23-5
Original file line numberDiff line numberDiff line change
@@ -264,17 +264,35 @@ static void validateArgs(DiagnosticEngine &diags, const ArgList &args,
264264
std::unique_ptr<ToolChain>
265265
Driver::buildToolChain(const llvm::opt::InputArgList &ArgList) {
266266

267-
if (const Arg *A = ArgList.getLastArg(options::OPT_target))
267+
if (const Arg *A = ArgList.getLastArg(options::OPT_target)) {
268268
DefaultTargetTriple = llvm::Triple::normalize(A->getValue());
269+
}
269270

270-
const llvm::Triple target(DefaultTargetTriple);
271+
llvm::Triple target(DefaultTargetTriple);
271272

272273
switch (target.getOS()) {
273-
case llvm::Triple::Darwin:
274-
case llvm::Triple::MacOSX:
275274
case llvm::Triple::IOS:
276275
case llvm::Triple::TvOS:
277-
case llvm::Triple::WatchOS: {
276+
case llvm::Triple::WatchOS:
277+
// Backward compatibility hack: infer "simulator" environment for x86
278+
// iOS/tvOS/watchOS.
279+
if (!target.isSimulatorEnvironment() &&
280+
(target.getArch() == llvm::Triple::x86 ||
281+
target.getArch() == llvm::Triple::x86_64) &&
282+
!tripleIsMacCatalystEnvironment(target)) {
283+
// Set the simulator environment.
284+
target.setEnvironment(llvm::Triple::EnvironmentType::Simulator);
285+
286+
auto newTargetTriple = target.normalize();
287+
Diags.diagnose(SourceLoc(), diag::warning_inferred_simulator_target,
288+
DefaultTargetTriple, newTargetTriple);
289+
290+
DefaultTargetTriple = newTargetTriple;
291+
}
292+
LLVM_FALLTHROUGH;
293+
294+
case llvm::Triple::Darwin:
295+
case llvm::Triple::MacOSX: {
278296
Optional<llvm::Triple> targetVariant;
279297
if (const Arg *A = ArgList.getLastArg(options::OPT_target_variant))
280298
targetVariant = llvm::Triple(llvm::Triple::normalize(A->getValue()));

test/Driver/infer-simulator.swift

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// Test the inference of the "simulator" environment within the driver.
2+
3+
// RUN: %swiftc_driver -driver-print-jobs -target x86_64-apple-ios11.0 %s > %t.simple.txt 2>&1
4+
// RUN: %FileCheck -check-prefix WARN_IOS_SIMULATOR %s < %t.simple.txt
5+
// WARN_IOS_SIMULATOR: warning: inferring simulator environment for target 'x86_64-apple-ios11.0'; use '-target x86_64-apple-ios11.0-simulator' instead
6+
7+
// RUN: %swiftc_driver -driver-print-jobs -target x86_64-apple-tvos10.0 %s > %t.simple.txt 2>&1
8+
// RUN: %FileCheck -check-prefix WARN_TVOS_SIMULATOR %s < %t.simple.txt
9+
// WARN_TVOS_SIMULATOR: inferring simulator environment for target 'x86_64-apple-tvos10.0'; use '-target x86_64-apple-tvos10.0-simulator' instead
10+
11+
// RUN: %swiftc_driver -driver-print-jobs -target i386-apple-watchos4.0 %s > %t.simple.txt 2>&1
12+
// RUN: %FileCheck -check-prefix WARN_WATCHOS_SIMULATOR %s < %t.simple.txt
13+
// WARN_WATCHOS_SIMULATOR: warning: inferring simulator environment for target 'i386-apple-watchos4.0'; use '-target i386-apple-watchos4.0-simulator' instead

0 commit comments

Comments
 (0)