mirror of https://github.com/microsoft/clang.git
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
This commit is contained in:
parent
74a7cafa2f
commit
9605ec4bd7
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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>())
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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";
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue