From: Tim Northover Date: Fri, 30 Oct 2015 16:30:36 +0000 (+0000) Subject: Watch and TV OS: wire up basic ABI choices X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9605ec4bd74ff5396a0a0af7342c375c49655c08;p=clang Watch and TV OS: wire up basic ABI choices 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 --- diff --git a/include/clang/Basic/ObjCRuntime.h b/include/clang/Basic/ObjCRuntime.h index a1e5b26e78..cf51b146b1 100644 --- a/include/clang/Basic/ObjCRuntime.h +++ b/include/clang/Basic/ObjCRuntime.h @@ -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); diff --git a/include/clang/Basic/TargetCXXABI.h b/include/clang/Basic/TargetCXXABI.h index 46243beb46..67247ead2e 100644 --- a/include/clang/Basic/TargetCXXABI.h +++ b/include/clang/Basic/TargetCXXABI.h @@ -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 diff --git a/lib/ARCMigrate/ARCMT.cpp b/lib/ARCMigrate/ARCMT.cpp index 82d8acd87e..8c04c8371c 100644 --- a/lib/ARCMigrate/ARCMT.cpp +++ b/lib/ARCMigrate/ARCMT.cpp @@ -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; diff --git a/lib/ARCMigrate/Transforms.cpp b/lib/ARCMigrate/Transforms.cpp index 99cfacb63d..f3d8d8e754 100644 --- a/lib/ARCMigrate/Transforms.cpp +++ b/lib/ARCMigrate/Transforms.cpp @@ -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()) diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index a27f9b37d2..6e3fcd87f1 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -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()); diff --git a/lib/Basic/ObjCRuntime.cpp b/lib/Basic/ObjCRuntime.cpp index be50fc4fe2..133c66945d 100644 --- a/lib/Basic/ObjCRuntime.cpp +++ b/lib/Basic/ObjCRuntime.cpp @@ -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. diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp index 2a22036008..52fa910b77 100644 --- a/lib/Basic/Targets.cpp +++ b/lib/Basic/Targets.cpp @@ -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; } diff --git a/lib/CodeGen/CGException.cpp b/lib/CodeGen/CGException.cpp index 2c1ede4b76..f5b44345d6 100644 --- a/lib/CodeGen/CGException.cpp +++ b/lib/CodeGen/CGException.cpp @@ -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 diff --git a/lib/CodeGen/CGObjCGNU.cpp b/lib/CodeGen/CGObjCGNU.cpp index 54721a0cb1..1e5db24042 100644 --- a/lib/CodeGen/CGObjCGNU.cpp +++ b/lib/CodeGen/CGObjCGNU.cpp @@ -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"); diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp index 830bdb031b..4eaa2e51f2 100644 --- a/lib/CodeGen/CGObjCMac.cpp +++ b/lib/CodeGen/CGObjCMac.cpp @@ -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: diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index c19fb46ab9..85cdbc48ca 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -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; } diff --git a/lib/CodeGen/ItaniumCXXABI.cpp b/lib/CodeGen/ItaniumCXXABI.cpp index 8392f6a7ba..7f96c1101f 100644 --- a/lib/CodeGen/ItaniumCXXABI.cpp +++ b/lib/CodeGen/ItaniumCXXABI.cpp @@ -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: diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp index d7b0ad1c44..b65c5c1360 100644 --- a/lib/Driver/ToolChains.cpp +++ b/lib/Driver/ToolChains.cpp @@ -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) diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index 29b100ebbf..42a168584c 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -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"; } diff --git a/test/Driver/ios-simulator-arcruntime.c b/test/Driver/ios-simulator-arcruntime.c index 605df93f49..dbe306e446 100644 --- a/test/Driver/ios-simulator-arcruntime.c +++ b/test/Driver/ios-simulator-arcruntime.c @@ -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