]> granicus.if.org Git - clang/commitdiff
Watch and TV OS: wire up basic ABI choices
authorTim Northover <tnorthover@apple.com>
Fri, 30 Oct 2015 16:30:36 +0000 (16:30 +0000)
committerTim Northover <tnorthover@apple.com>
Fri, 30 Oct 2015 16:30:36 +0000 (16:30 +0000)
This sets the mostly expected Darwin default ABI options for these two
platforms. Active changes from these defaults for watchOS are in a later patch.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@251708 91177308-0d34-0410-b5e6-96231b3b80d8

15 files changed:
include/clang/Basic/ObjCRuntime.h
include/clang/Basic/TargetCXXABI.h
lib/ARCMigrate/ARCMT.cpp
lib/ARCMigrate/Transforms.cpp
lib/AST/ASTContext.cpp
lib/Basic/ObjCRuntime.cpp
lib/Basic/Targets.cpp
lib/CodeGen/CGException.cpp
lib/CodeGen/CGObjCGNU.cpp
lib/CodeGen/CGObjCMac.cpp
lib/CodeGen/CodeGenModule.cpp
lib/CodeGen/ItaniumCXXABI.cpp
lib/Driver/ToolChains.cpp
lib/Driver/Tools.cpp
test/Driver/ios-simulator-arcruntime.c

index a1e5b26e78d0e21f7b37c0be4f596dd7d5613400..cf51b146b1dc21c1bc94ad1e66a43bbdc0c30386 100644 (file)
@@ -41,6 +41,10 @@ public:
     /// version of iOS.
     iOS,
 
+    /// 'watchos' is a variant of iOS for Apple's watchOS. The version
+    /// is a release version of watchOS.
+    WatchOS,
+
     /// 'gcc' is the Objective-C runtime shipped with GCC, implementing a
     /// fragile Objective-C ABI
     GCC,
@@ -81,6 +85,7 @@ public:
     case GNUstep: return true;
     case ObjFW: return true;
     case iOS: return true;
+    case WatchOS: return true;
     }
     llvm_unreachable("bad kind");
   }
@@ -114,6 +119,7 @@ public:
     case FragileMacOSX:
     case MacOSX:
     case iOS:
+    case WatchOS:
       return false;
     case GCC:
     case GNUstep:
@@ -138,6 +144,7 @@ public:
       return getVersion() >= VersionTuple(10, 7);
     case MacOSX: return true;
     case iOS: return true;
+    case WatchOS: return true;
     case GCC: return false;
     case GNUstep: return true;
     case ObjFW: return true;
@@ -155,6 +162,7 @@ public:
     case FragileMacOSX: return getVersion() >= VersionTuple(10, 7);
     case MacOSX: return getVersion() >= VersionTuple(10, 7);
     case iOS: return getVersion() >= VersionTuple(5);
+    case WatchOS: return true;
 
     case GCC: return false;
     case GNUstep: return getVersion() >= VersionTuple(1, 6);
@@ -170,6 +178,8 @@ public:
         return getVersion() >= VersionTuple(10, 8);
       case iOS:
         return (getVersion() >= VersionTuple(6));
+      case WatchOS:
+        return true;
       case GNUstep:
         return getVersion() >= VersionTuple(1, 7);
     
@@ -199,6 +209,7 @@ public:
     case FragileMacOSX: return false;
     case MacOSX: return getVersion() >= VersionTuple(10, 8);
     case iOS: return getVersion() >= VersionTuple(6);
+    case WatchOS: return true;
 
     // This is really a lie, because some implementations and versions
     // of the runtime do not support ARC.  Probably -fgnu-runtime
@@ -226,6 +237,7 @@ public:
       return true;
     case MacOSX:
     case iOS:
+    case WatchOS:
     case GNUstep:
     case ObjFW:
       return false;
@@ -247,6 +259,7 @@ public:
     case FragileMacOSX: return getVersion() >= VersionTuple(10, 8);
     case MacOSX: return getVersion() >= VersionTuple(10, 8);
     case iOS: return getVersion() >= VersionTuple(5);
+    case WatchOS: return true;
     case GCC: return false;
     case GNUstep: return false;
     case ObjFW: return false;
@@ -259,6 +272,7 @@ public:
     switch (getKind()) {
     case MacOSX: return true;
     case iOS: return true;
+    case WatchOS: return true;
     case FragileMacOSX: return false;
     case GCC: return true;
     case GNUstep: return true;
@@ -272,6 +286,7 @@ public:
     switch (getKind()) {
     case MacOSX: return true;
     case iOS: return true;
+    case WatchOS: return true;
     case FragileMacOSX: return false;
     case GCC: return true;
     case GNUstep: return true;
@@ -285,6 +300,7 @@ public:
     case FragileMacOSX:
     case MacOSX:
     case iOS:
+    case WatchOS:
       return true;
     case GNUstep:
       return getVersion() >= VersionTuple(1, 7);
index 46243beb464cdfde0aa816f2a94d614c7019083b..67247ead2eb44b3d12b59150347dbb3485e13805 100644 (file)
@@ -71,6 +71,11 @@ public:
     ///                  /help/topic/com.arm.doc.ihi0059a/IHI0059A_cppabi64.pdf
     iOS64,
 
+    /// WatchOS is a modernisation of the iOS ABI, which roughly means it's
+    /// the iOS64 ABI ported to 32-bits. The primary difference from iOS64 is
+    /// that RTTI objects must still be unique at the moment.
+    WatchOS,
+
     /// The generic AArch64 ABI is also a modified version of the Itanium ABI,
     /// but it has fewer divergences than the 32-bit ARM ABI.
     ///
@@ -135,6 +140,7 @@ public:
     case GenericARM:
     case iOS:
     case iOS64:
+    case WatchOS:
     case GenericMIPS:
     case WebAssembly:
       return true;
@@ -153,6 +159,7 @@ public:
     case GenericARM:
     case iOS:
     case iOS64:
+    case WatchOS:
     case GenericMIPS:
     case WebAssembly:
       return false;
@@ -186,6 +193,7 @@ public:
     case GenericItanium:
     case iOS:
     case iOS64:
+    case WatchOS:
     case Microsoft:
       return true;
     }
@@ -261,6 +269,7 @@ public:
     case GenericARM:
     case iOS64:
     case WebAssembly:
+    case WatchOS:
       return false;
 
     case GenericAArch64:
@@ -320,6 +329,7 @@ public:
     // the Itanium exception about classes with over-large bitfields.
     case iOS64:
     case WebAssembly:
+    case WatchOS:
       return UseTailPaddingUnlessPOD11;
 
     // MSVC always allocates fields in the tail-padding of a base class
index 82d8acd87e83310696a3d9cf69d2f56385fb31a2..8c04c8371cefc6ca171c22ac3c808cef485cebcc 100644 (file)
@@ -153,6 +153,9 @@ static bool HasARCRuntime(CompilerInvocation &origCI) {
   if (triple.isiOS())
     return triple.getOSMajorVersion() >= 5;
 
+  if (triple.isWatchOS())
+    return true;
+
   if (triple.getOS() == llvm::Triple::Darwin)
     return triple.getOSMajorVersion() >= 11;
 
index 99cfacb63dc40cc15bf0269daaa5a22b48062a4a..f3d8d8e7545688a3d5d6f3115e38723290b7d492 100644 (file)
@@ -50,7 +50,8 @@ bool trans::canApplyWeak(ASTContext &Ctx, QualType type,
     return false;
 
   // iOS is always safe to use 'weak'.
-  if (Ctx.getTargetInfo().getTriple().isiOS())
+  if (Ctx.getTargetInfo().getTriple().isiOS() ||
+      Ctx.getTargetInfo().getTriple().isWatchOS())
     AllowOnUnknownClass = true;
 
   while (const PointerType *ptr = T->getAs<PointerType>())
index a27f9b37d262abc56ea392656e11bbf8c5c46c10..6e3fcd87f136fb01dc2fa1bce4a401f489a333b1 100644 (file)
@@ -683,6 +683,7 @@ CXXABI *ASTContext::createCXXABI(const TargetInfo &T) {
   case TargetCXXABI::GenericARM: // Same as Itanium at this level
   case TargetCXXABI::iOS:
   case TargetCXXABI::iOS64:
+  case TargetCXXABI::WatchOS:
   case TargetCXXABI::GenericAArch64:
   case TargetCXXABI::GenericMIPS:
   case TargetCXXABI::GenericItanium:
@@ -8496,6 +8497,7 @@ MangleContext *ASTContext::createMangleContext() {
   case TargetCXXABI::iOS:
   case TargetCXXABI::iOS64:
   case TargetCXXABI::WebAssembly:
+  case TargetCXXABI::WatchOS:
     return ItaniumMangleContext::create(*this, getDiagnostics());
   case TargetCXXABI::Microsoft:
     return MicrosoftMangleContext::create(*this, getDiagnostics());
index be50fc4fe24fa40983005312a21a2d016d758abc..133c66945dde163514338bfc678300183ec09695 100644 (file)
@@ -30,6 +30,7 @@ raw_ostream &clang::operator<<(raw_ostream &out, const ObjCRuntime &value) {
   case ObjCRuntime::MacOSX: out << "macosx"; break;
   case ObjCRuntime::FragileMacOSX: out << "macosx-fragile"; break;
   case ObjCRuntime::iOS: out << "ios"; break;
+  case ObjCRuntime::WatchOS: out << "watchos"; break;
   case ObjCRuntime::GNUstep: out << "gnustep"; break;
   case ObjCRuntime::GCC: out << "gcc"; break;
   case ObjCRuntime::ObjFW: out << "objfw"; break;
@@ -62,6 +63,8 @@ bool ObjCRuntime::tryParse(StringRef input) {
     kind = ObjCRuntime::FragileMacOSX;
   } else if (runtimeName == "ios") {
     kind = ObjCRuntime::iOS;
+  } else if (runtimeName == "watchos") {
+    kind = ObjCRuntime::WatchOS;
   } else if (runtimeName == "gnustep") {
     // If no version is specified then default to the most recent one that we
     // know about.
index 2a220360088a043baf1dfed114da936b85488968..52fa910b77f852b37654f021264ed327d7432bc3 100644 (file)
@@ -19,6 +19,7 @@
 #include "clang/Basic/MacroBuilder.h"
 #include "clang/Basic/TargetBuiltins.h"
 #include "clang/Basic/TargetOptions.h"
+#include "clang/Basic/Version.h"
 #include "llvm/ADT/APFloat.h"
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/StringExtras.h"
@@ -4464,7 +4465,9 @@ public:
     //
     // FIXME: We need support for -meabi... we could just mangle it into the
     // name.
-    if (Name == "apcs-gnu") {
+    // FIXME: aapcs16 isn't really the same as APCS, this allows tests to pass
+    // until the real ABI is committed.
+    if (Name == "apcs-gnu" || Name == "aapcs16") {
       setABIAPCS();
       return true;
     }
index 2c1ede4b76d62772322ac19833489a611a82cbf3..f5b44345d632930734d6f620bec52ba1e4a588b4 100644 (file)
@@ -129,6 +129,7 @@ static const EHPersonality &getObjCPersonality(const llvm::Triple &T,
     return getCPersonality(T, L);
   case ObjCRuntime::MacOSX:
   case ObjCRuntime::iOS:
+  case ObjCRuntime::WatchOS:
     return EHPersonality::NeXT_ObjC;
   case ObjCRuntime::GNUstep:
     if (L.ObjCRuntime.getVersion() >= VersionTuple(1, 7))
@@ -160,6 +161,7 @@ static const EHPersonality &getObjCXXPersonality(const llvm::Triple &T,
   // function on targets using (backend-driven) SJLJ EH.
   case ObjCRuntime::MacOSX:
   case ObjCRuntime::iOS:
+  case ObjCRuntime::WatchOS:
     return EHPersonality::NeXT_ObjC;
 
   // In the fragile ABI, just use C++ exception handling and hope
index 54721a0cb154ef9fe30dd877afe38eeeef1890ed..1e5db240429877c2635695b28e9ea62d0c88a9f7 100644 (file)
@@ -2889,6 +2889,7 @@ clang::CodeGen::CreateGNUObjCRuntime(CodeGenModule &CGM) {
   case ObjCRuntime::FragileMacOSX:
   case ObjCRuntime::MacOSX:
   case ObjCRuntime::iOS:
+  case ObjCRuntime::WatchOS:
     llvm_unreachable("these runtimes are not GNU runtimes");
   }
   llvm_unreachable("bad runtime");
index 830bdb031b3d33996c0bf9e79c5d834041fc7e34..4eaa2e51f25dbb549698f82a5b25b03e917e8a4b 100644 (file)
@@ -4489,7 +4489,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() &&
+  if ((Triple.isiOS() || Triple.isWatchOS()) &&
       (Triple.getArch() == llvm::Triple::x86 ||
        Triple.getArch() == llvm::Triple::x86_64))
     Mod.addModuleFlag(llvm::Module::Error, "Objective-C Is Simulated",
@@ -5902,7 +5902,8 @@ void CGObjCNonFragileABIMac::GenerateClass(const ObjCImplementationDecl *ID) {
     // Make this entry NULL for any iOS device target, any iOS simulator target,
     // OS X with deployment target 10.9 or later.
     const llvm::Triple &Triple = CGM.getTarget().getTriple();
-    if (Triple.isiOS() || (Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 9)))
+    if (Triple.isiOS() || Triple.isWatchOS() ||
+        (Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 9)))
       // This entry will be null.
       ObjCEmptyVtableVar = nullptr;
     else
@@ -7224,6 +7225,7 @@ CodeGen::CreateMacObjCRuntime(CodeGen::CodeGenModule &CGM) {
 
   case ObjCRuntime::MacOSX:
   case ObjCRuntime::iOS:
+  case ObjCRuntime::WatchOS:
     return new CGObjCNonFragileABIMac(CGM);
 
   case ObjCRuntime::GNUstep:
index c19fb46ab9251c0a48f41ce292bb6de3496a1a18..85cdbc48ca4d62312a331136c0ecaa8add64e00e 100644 (file)
@@ -65,6 +65,7 @@ static CGCXXABI *createCXXABI(CodeGenModule &CGM) {
   case TargetCXXABI::GenericARM:
   case TargetCXXABI::iOS:
   case TargetCXXABI::iOS64:
+  case TargetCXXABI::WatchOS:
   case TargetCXXABI::GenericMIPS:
   case TargetCXXABI::GenericItanium:
   case TargetCXXABI::WebAssembly:
@@ -187,6 +188,7 @@ void CodeGenModule::createObjCRuntime() {
   case ObjCRuntime::FragileMacOSX:
   case ObjCRuntime::MacOSX:
   case ObjCRuntime::iOS:
+  case ObjCRuntime::WatchOS:
     ObjCRuntime = CreateMacObjCRuntime(*this);
     return;
   }
index 8392f6a7ba2e1cd709ab606653d1080e1181d94a..7f96c1101f61bc72d36e147933633499b1c062f6 100644 (file)
@@ -461,6 +461,7 @@ CodeGen::CGCXXABI *CodeGen::CreateItaniumCXXABI(CodeGenModule &CGM) {
   // between the ARM and iOS ABIs.
   case TargetCXXABI::GenericARM:
   case TargetCXXABI::iOS:
+  case TargetCXXABI::WatchOS:
     return new ARMCXXABI(CGM);
 
   case TargetCXXABI::iOS64:
index d7b0ad1c441c0cf0fe93fdf99c18a761330ca256..b65c5c136084c64935e415e4b4e32e485522dda0 100644 (file)
@@ -68,9 +68,7 @@ bool MachO::HasNativeLLVMSupport() const { return true; }
 /// Darwin provides an ARC runtime starting in MacOS X 10.7 and iOS 5.0.
 ObjCRuntime Darwin::getDefaultObjCRuntime(bool isNonFragile) const {
   if (isTargetWatchOSBased())
-    // FIXME: not quite iOS because of version mismatch. Choose something for
-    // now.
-    return ObjCRuntime(ObjCRuntime::iOS, TargetVersion);
+    return ObjCRuntime(ObjCRuntime::WatchOS, TargetVersion);
   if (isTargetIOSBased())
     return ObjCRuntime(ObjCRuntime::iOS, TargetVersion);
   if (isNonFragile)
index 29b100ebbf81e4b61b70cbee3011c34773b2ccba..42a168584cd676d10505c60e706da9aa794f4157 100644 (file)
@@ -611,11 +611,15 @@ arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) {
     switch (Triple.getOS()) {
     case llvm::Triple::Darwin:
     case llvm::Triple::MacOSX:
-    case llvm::Triple::IOS: {
+    case llvm::Triple::IOS:
+    case llvm::Triple::TvOS: {
       // Darwin defaults to "softfp" for v6 and v7.
       ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
       break;
     }
+    case llvm::Triple::WatchOS:
+      ABI = FloatABI::Hard;
+      break;
 
     // FIXME: this is invalid for WindowsCE
     case llvm::Triple::Win32:
@@ -803,7 +807,8 @@ static void getARMTargetFeatures(const ToolChain &TC,
                                options::OPT_mno_long_calls)) {
     if (A->getOption().matches(options::OPT_mlong_calls))
       Features.push_back("+long-calls");
-  } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6))) {
+  } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
+             !Triple.isWatchOS()) {
       Features.push_back("+long-calls");
   }
 
@@ -866,6 +871,8 @@ void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
   } else if (Triple.isOSBinFormatMachO()) {
     if (useAAPCSForMachO(Triple)) {
       ABIName = "aapcs";
+    } else if (Triple.isWatchOS()) {
+      ABIName = "aapcs16";
     } else {
       ABIName = "apcs-gnu";
     }
index 605df93f4957e6f67de5f5aa8d8c64a90e8bf77e..dbe306e4467b79091de7767e22bb94f3632300fd 100644 (file)
@@ -6,3 +6,11 @@
 // CHECK-OPTIONS1: -fobjc-runtime=ios-4.2.1
 // CHECK-OPTIONS2: i386-apple-ios5.0.0
 // CHECK-OPTIONS2: -fobjc-runtime=ios-5.0.0
+
+// RUN: %clang -### -x objective-c -target x86_64-apple-darwin -mtvos-simulator-version-min=8.3.0 -fobjc-arc -fsyntax-only %s 2>&1 | FileCheck -check-prefix=CHECK-OPTIONS3 %s
+// CHECK-OPTIONS3: x86_64-apple-tvos8.3.0
+// CHECK-OPTIONS3: -fobjc-runtime=ios-8.3.0
+
+// RUN: %clang -### -x objective-c -target x86_64-apple-darwin -mwatchos-simulator-version-min=2.0.0 -fobjc-arc -fsyntax-only %s 2>&1 | FileCheck -check-prefix=CHECK-OPTIONS4 %s
+// CHECK-OPTIONS4: x86_64-apple-watchos2.0.0
+// CHECK-OPTIONS4: -fobjc-runtime=watchos-2.0.0