From 6cdef0efb7bf62cc44e80cd0c8973eda26d09db4 Mon Sep 17 00:00:00 2001 From: Alex Lorenz Date: Thu, 7 Dec 2017 19:04:10 +0000 Subject: [PATCH] [driver] Set the 'simulator' environment for Darwin when compiling for iOS/tvOS/watchOS simulator rdar://35135215 Differential Revision: https://reviews.llvm.org/D40682 llvm-svn: 320073 --- clang/include/clang/Driver/ToolChain.h | 4 +++- clang/lib/CodeGen/CGObjCMac.cpp | 5 +---- clang/lib/Driver/ToolChain.cpp | 6 ++++++ clang/lib/Driver/ToolChains/Darwin.cpp | 8 -------- clang/lib/Driver/ToolChains/Darwin.h | 3 +++ clang/lib/Frontend/InitPreprocessor.cpp | 5 +++++ clang/test/Driver/darwin-sdkroot.c | 2 +- clang/test/Driver/darwin-simulator-macro.c | 7 +++---- clang/test/Driver/darwin-version.c | 16 ++++++++-------- clang/test/Driver/fsanitize.c | 8 ++++---- 10 files changed, 34 insertions(+), 30 deletions(-) diff --git a/clang/include/clang/Driver/ToolChain.h b/clang/include/clang/Driver/ToolChain.h index 95f1461c4959..13f54d3718b4 100644 --- a/clang/include/clang/Driver/ToolChain.h +++ b/clang/include/clang/Driver/ToolChain.h @@ -93,7 +93,7 @@ public: private: const Driver &D; - const llvm::Triple Triple; + llvm::Triple Triple; const llvm::opt::ArgList &Args; // We need to initialize CachedRTTIArg before CachedRTTIMode const llvm::opt::Arg *const CachedRTTIArg; @@ -136,6 +136,8 @@ protected: ToolChain(const Driver &D, const llvm::Triple &T, const llvm::opt::ArgList &Args); + void setTripleEnvironment(llvm::Triple::EnvironmentType Env); + virtual Tool *buildAssembler() const; virtual Tool *buildLinker() const; virtual Tool *getTool(Action::ActionClass AC) const; diff --git a/clang/lib/CodeGen/CGObjCMac.cpp b/clang/lib/CodeGen/CGObjCMac.cpp index 6c47da8ab99a..ef4e6cd4f01b 100644 --- a/clang/lib/CodeGen/CGObjCMac.cpp +++ b/clang/lib/CodeGen/CGObjCMac.cpp @@ -4885,10 +4885,7 @@ void CGObjCCommonMac::EmitImageInfo() { } // Indicate whether we're compiling this to run on a simulator. - const llvm::Triple &Triple = CGM.getTarget().getTriple(); - if ((Triple.isiOS() || Triple.isWatchOS()) && - (Triple.getArch() == llvm::Triple::x86 || - Triple.getArch() == llvm::Triple::x86_64)) + if (CGM.getTarget().getTriple().isSimulatorEnvironment()) Mod.addModuleFlag(llvm::Module::Error, "Objective-C Is Simulated", eImageInfo_ImageIsSimulated); diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp index 328b88559b70..f96a1182e3ca 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -81,6 +81,12 @@ ToolChain::ToolChain(const Driver &D, const llvm::Triple &T, getFilePaths().push_back(CandidateLibPath); } +void ToolChain::setTripleEnvironment(llvm::Triple::EnvironmentType Env) { + Triple.setEnvironment(Env); + if (EffectiveTriple != llvm::Triple()) + EffectiveTriple.setEnvironment(Env); +} + ToolChain::~ToolChain() { } diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp b/clang/lib/Driver/ToolChains/Darwin.cpp index 7c401aa9dd55..2b0e59a6b596 100644 --- a/clang/lib/Driver/ToolChains/Darwin.cpp +++ b/clang/lib/Driver/ToolChains/Darwin.cpp @@ -1214,14 +1214,6 @@ void Darwin::AddDeploymentTarget(DerivedArgList &Args) const { if (iOSVersion) ExplicitIOSDeploymentTargetStr = iOSVersion->getAsString(Args); - // Add a macro to differentiate between m(iphone|tv|watch)os-version-min=X.Y and - // -m(iphone|tv|watch)simulator-version-min=X.Y. - if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ) || - Args.hasArg(options::OPT_mtvos_simulator_version_min_EQ) || - Args.hasArg(options::OPT_mwatchos_simulator_version_min_EQ)) - Args.append(Args.MakeSeparateArg(nullptr, Opts.getOption(options::OPT_D), - " __APPLE_EMBEDDED_SIMULATOR__=1")); - if (OSXVersion && (iOSVersion || TvOSVersion || WatchOSVersion)) { getDriver().Diag(diag::err_drv_argument_not_allowed_with) << OSXVersion->getAsString(Args) diff --git a/clang/lib/Driver/ToolChains/Darwin.h b/clang/lib/Driver/ToolChains/Darwin.h index c861f172fe1f..6d6493a6d1b7 100644 --- a/clang/lib/Driver/ToolChains/Darwin.h +++ b/clang/lib/Driver/ToolChains/Darwin.h @@ -329,6 +329,9 @@ protected: TargetInitialized = true; TargetPlatform = Platform; TargetVersion = VersionTuple(Major, Minor, Micro); + if (Platform == IPhoneOSSimulator || Platform == TvOSSimulator || + Platform == WatchOSSimulator) + const_cast(this)->setTripleEnvironment(llvm::Triple::Simulator); } bool isTargetIPhoneOS() const { diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index 617b6aabcc75..a7ce2868a633 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -998,6 +998,11 @@ static void InitializePredefinedMacros(const TargetInfo &TI, Builder.defineMacro("__nullable", "_Nullable"); } + // Add a macro to differentiate between regular iOS/tvOS/watchOS targets and + // the corresponding simulator targets. + if (TI.getTriple().isOSDarwin() && TI.getTriple().isSimulatorEnvironment()) + Builder.defineMacro("__APPLE_EMBEDDED_SIMULATOR__", "1"); + // OpenMP definition // OpenMP 2.2: // In implementations that support a preprocessor, the _OPENMP diff --git a/clang/test/Driver/darwin-sdkroot.c b/clang/test/Driver/darwin-sdkroot.c index 4f1fca2785b0..8b3782ea22a7 100644 --- a/clang/test/Driver/darwin-sdkroot.c +++ b/clang/test/Driver/darwin-sdkroot.c @@ -60,7 +60,7 @@ // // CHECK-SIMULATOR: clang // CHECK-SIMULATOR: "-cc1" -// CHECK-SIMULATOR: "-triple" "x86_64-apple-ios8.0.0" +// CHECK-SIMULATOR: "-triple" "x86_64-apple-ios8.0.0-simulator" // CHECK-SIMULATOR: ld // CHECK-SIMULATOR: "-ios_simulator_version_min" "8.0.0" // diff --git a/clang/test/Driver/darwin-simulator-macro.c b/clang/test/Driver/darwin-simulator-macro.c index 6971e9303a6d..cf172997d67f 100644 --- a/clang/test/Driver/darwin-simulator-macro.c +++ b/clang/test/Driver/darwin-simulator-macro.c @@ -4,9 +4,8 @@ // RUN: %clang -target x86_64-apple-darwin10 -arch x86_64 -mappletvsimulator-version-min=6.0.0 -E -dM %s | FileCheck -check-prefix=SIM %s // RUN: %clang -target x86_64-apple-darwin10 -arch x86_64 -mwatchos-simulator-version-min=6.0.0 -E -dM %s | FileCheck -check-prefix=SIM %s // RUN: %clang -target x86_64-apple-darwin10 -arch x86_64 -mwatchsimulator-version-min=6.0.0 -E -dM %s | FileCheck -check-prefix=SIM %s -// RUN: %clang -target x86_64-apple-darwin10 -arch x86_64 -mios-version-min=6.0.0 -E -dM %s | FileCheck -check-prefix=DEV %s -// RUN: %clang -target x86_64-apple-darwin10 -arch x86_64 -mtvos-version-min=6.0.0 -E -dM %s | FileCheck -check-prefix=DEV %s -// RUN: %clang -target x86_64-apple-darwin10 -arch x86_64 -mwatchos-version-min=6.0.0 -E -dM %s | FileCheck -check-prefix=DEV %s +// RUN: %clang -target x86_64-apple-darwin10 -arch x86_64 -mios-version-min=6.0.0 -E -dM %s | FileCheck -check-prefix=SIM %s +// RUN: %clang -target x86_64-apple-darwin10 -arch x86_64 -mtvos-version-min=6.0.0 -E -dM %s | FileCheck -check-prefix=SIM %s +// RUN: %clang -target x86_64-apple-darwin10 -arch x86_64 -mwatchos-version-min=6.0.0 -E -dM %s | FileCheck -check-prefix=SIM %s // SIM: #define __APPLE_EMBEDDED_SIMULATOR__ 1 -// DEV-NOT: __APPLE_EMBEDDED_SIMULATOR__ diff --git a/clang/test/Driver/darwin-version.c b/clang/test/Driver/darwin-version.c index 3ff49aca6c02..a7947880354b 100644 --- a/clang/test/Driver/darwin-version.c +++ b/clang/test/Driver/darwin-version.c @@ -41,7 +41,7 @@ // RUN: %clang -target x86_64-apple-darwin -mios-simulator-version-min=11.0 -c -### %s 2>&1 | \ // RUN: FileCheck --check-prefix=CHECK-VERSION-IOS10 %s -// CHECK-VERSION-IOS10: x86_64-apple-ios11.0.0 +// CHECK-VERSION-IOS10: x86_64-apple-ios11.0.0-simulator // RUN: %clang -target arm64-apple-ios11.1 -c -### %s 2>&1 | \ // RUN: FileCheck --check-prefix=CHECK-VERSION-IOS11 %s @@ -85,13 +85,13 @@ // CHECK-VERSION-TVOS83: "thumbv7-apple-tvos8.3.0" // RUN: %clang -target i386-apple-darwin -mtvos-simulator-version-min=8.3 -c %s -### 2>&1 | \ // RUN: FileCheck --check-prefix=CHECK-VERSION-TVSIM83 %s -// CHECK-VERSION-TVSIM83: "i386-apple-tvos8.3.0" +// CHECK-VERSION-TVSIM83: "i386-apple-tvos8.3.0-simulator" // RUN: %clang -target armv7k-apple-darwin -mwatchos-version-min=2.0 -c %s -### 2>&1 | \ // RUN: FileCheck --check-prefix=CHECK-VERSION-WATCHOS20 %s // CHECK-VERSION-WATCHOS20: "thumbv7k-apple-watchos2.0.0" // RUN: %clang -target i386-apple-darwin -mwatchos-simulator-version-min=2.0 -c %s -### 2>&1 | \ // RUN: FileCheck --check-prefix=CHECK-VERSION-WATCHSIM20 %s -// CHECK-VERSION-WATCHSIM20: "i386-apple-watchos2.0.0" +// CHECK-VERSION-WATCHSIM20: "i386-apple-watchos2.0.0-simulator" // Check environment variable gets interpreted correctly // RUN: env MACOSX_DEPLOYMENT_TARGET=10.5 IPHONEOS_DEPLOYMENT_TARGET=2.0 \ @@ -117,7 +117,7 @@ // RUN: env TVOS_DEPLOYMENT_TARGET=8.3.1 \ // RUN: %clang -target i386-apple-darwin9 -c %s -### 2>&1 | \ // RUN: FileCheck --check-prefix=CHECK-VERSION-TVOSSIM %s -// CHECK-VERSION-TVOSSIM: "i386-apple-tvos8.3.1" +// CHECK-VERSION-TVOSSIM: "i386-apple-tvos8.3.1-simulator" // RUN: env MACOSX_DEPLOYMENT_TARGET=10.5 WATCHOS_DEPLOYMENT_TARGET=2.0 \ // RUN: %clang -target armv7-apple-darwin9 -c %s -### 2>&1 | \ @@ -126,16 +126,16 @@ // RUN: env WATCHOS_DEPLOYMENT_TARGET=2.0 \ // RUN: %clang -target i386-apple-darwin9 -c %s -### 2>&1 | \ // RUN: FileCheck --check-prefix=CHECK-VERSION-WATCHOSSIM %s -// CHECK-VERSION-WATCHOSSIM: "i386-apple-watchos2.0.0" +// CHECK-VERSION-WATCHOSSIM: "i386-apple-watchos2.0.0-simulator" // RUN: %clang -target x86_64-apple-ios11.0.0 -c %s -### 2>&1 | \ // RUN: FileCheck --check-prefix=CHECK-VERSION-IOS-TARGET %s -// CHECK-VERSION-IOS-TARGET: "x86_64-apple-ios11.0.0" +// CHECK-VERSION-IOS-TARGET: "x86_64-apple-ios11.0.0-simulator" // RUN: %clang -target x86_64-apple-tvos11.0 -c %s -### 2>&1 | \ // RUN: FileCheck --check-prefix=CHECK-VERSION-TVOS-TARGET %s -// CHECK-VERSION-TVOS-TARGET: "x86_64-apple-tvos11.0.0" +// CHECK-VERSION-TVOS-TARGET: "x86_64-apple-tvos11.0.0-simulator" // RUN: %clang -target x86_64-apple-watchos4.0 -c %s -### 2>&1 | \ // RUN: FileCheck --check-prefix=CHECK-VERSION-WATCHOS-TARGET %s -// CHECK-VERSION-WATCHOS-TARGET: "x86_64-apple-watchos4.0.0" +// CHECK-VERSION-WATCHOS-TARGET: "x86_64-apple-watchos4.0.0-simulator" diff --git a/clang/test/Driver/fsanitize.c b/clang/test/Driver/fsanitize.c index 3de6fa0b35a4..cd965469d926 100644 --- a/clang/test/Driver/fsanitize.c +++ b/clang/test/Driver/fsanitize.c @@ -334,10 +334,10 @@ // CHECK-TSAN-ARM-IOS: unsupported option '-fsanitize=thread' for target 'arm-apple-ios' // RUN: %clang -target i386-apple-iossimulator -fsanitize=thread %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-TSAN-I386-IOSSIMULATOR -// CHECK-TSAN-I386-IOSSIMULATOR: unsupported option '-fsanitize=thread' for target 'i386-apple-iossimulator' +// CHECK-TSAN-I386-IOSSIMULATOR: unsupported option '-fsanitize=thread' for target 'i386-apple-iossimulator-simulator' // RUN: %clang -target i386-apple-tvossimulator -fsanitize=thread %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-TSAN-I386-TVOSSIMULATOR -// CHECK-TSAN-I386-TVOSSIMULATOR: unsupported option '-fsanitize=thread' for target 'i386-apple-tvossimulator' +// CHECK-TSAN-I386-TVOSSIMULATOR: unsupported option '-fsanitize=thread' for target 'i386-apple-tvossimulator-simulator' // RUN: %clang -target x86_64-linux-gnu -fsanitize=thread -fsanitize-thread-memory-access %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-TSAN-MEMORY-ACCESS // CHECK-TSAN-MEMORY-ACCESS-NOT: -cc1{{.*}}tsan-instrument-memory-accesses=0 @@ -423,11 +423,11 @@ // RUN: %clang -target i386-apple-iossimulator -fsanitize=efficiency-cache-frag %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-ESAN-I386-IOSSIMULATOR // RUN: %clang -target i386-apple-iossimulator -fsanitize=efficiency-working-set %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-ESAN-I386-IOSSIMULATOR -// CHECK-ESAN-I386-IOSSIMULATOR: unsupported option '-fsanitize=efficiency-{{.*}}' for target 'i386-apple-iossimulator' +// CHECK-ESAN-I386-IOSSIMULATOR: unsupported option '-fsanitize=efficiency-{{.*}}' for target 'i386-apple-iossimulator-simulator' // RUN: %clang -target i386-apple-tvossimulator -fsanitize=efficiency-cache-frag %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-ESAN-I386-TVOSSIMULATOR // RUN: %clang -target i386-apple-tvossimulator -fsanitize=efficiency-working-set %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-ESAN-I386-TVOSSIMULATOR -// CHECK-ESAN-I386-TVOSSIMULATOR: unsupported option '-fsanitize=efficiency-{{.*}}' for target 'i386-apple-tvossimulator' +// CHECK-ESAN-I386-TVOSSIMULATOR: unsupported option '-fsanitize=efficiency-{{.*}}' for target 'i386-apple-tvossimulator-simulator'