@@ -3081,22 +3081,45 @@ bool Darwin::isAlignedAllocationUnavailable() const {
3081
3081
return TargetVersion < alignedAllocMinVersion (OS);
3082
3082
}
3083
3083
3084
- static bool sdkSupportsBuiltinModules (const Darwin::DarwinPlatformKind &TargetPlatform, const std::optional<DarwinSDKInfo> &SDKInfo) {
3084
+ static bool sdkSupportsBuiltinModules (
3085
+ const Darwin::DarwinPlatformKind &TargetPlatform,
3086
+ const Darwin::DarwinEnvironmentKind &TargetEnvironment,
3087
+ const std::optional<DarwinSDKInfo> &SDKInfo) {
3088
+ if (TargetEnvironment == Darwin::NativeEnvironment ||
3089
+ TargetEnvironment == Darwin::Simulator ||
3090
+ TargetEnvironment == Darwin::MacCatalyst) {
3091
+ // Standard xnu/Mach/Darwin based environments
3092
+ // depend on the SDK version.
3093
+ } else {
3094
+ // All other environments support builtin modules from the start.
3095
+ return true ;
3096
+ }
3097
+
3085
3098
if (!SDKInfo)
3099
+ // If there is no SDK info, assume this is building against a
3100
+ // pre-SDK version of macOS (i.e. before Mac OS X 10.4). Those
3101
+ // don't support modules anyway, but the headers definitely
3102
+ // don't support builtin modules either. It might also be some
3103
+ // kind of degenerate build environment, err on the side of
3104
+ // the old behavior which is to not use builtin modules.
3086
3105
return false ;
3087
3106
3088
3107
VersionTuple SDKVersion = SDKInfo->getVersion ();
3089
3108
switch (TargetPlatform) {
3109
+ // Existing SDKs added support for builtin modules in the fall
3110
+ // 2024 major releases.
3090
3111
case Darwin::MacOS:
3091
- return SDKVersion >= VersionTuple (99U );
3112
+ return SDKVersion >= VersionTuple (15U );
3092
3113
case Darwin::IPhoneOS:
3093
- return SDKVersion >= VersionTuple (99U );
3114
+ return SDKVersion >= VersionTuple (18U );
3094
3115
case Darwin::TvOS:
3095
- return SDKVersion >= VersionTuple (99U );
3116
+ return SDKVersion >= VersionTuple (18U );
3096
3117
case Darwin::WatchOS:
3097
- return SDKVersion >= VersionTuple (99U );
3118
+ return SDKVersion >= VersionTuple (11U );
3098
3119
case Darwin::XROS:
3099
- return SDKVersion >= VersionTuple (99U );
3120
+ return SDKVersion >= VersionTuple (2U );
3121
+
3122
+ // New SDKs support builtin modules from the start.
3100
3123
default :
3101
3124
return true ;
3102
3125
}
@@ -3136,7 +3159,7 @@ void Darwin::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
3136
3159
// i.e. when the builtin stdint.h is in the Darwin module too, the cycle
3137
3160
// goes away. Note that -fbuiltin-headers-in-system-modules does nothing
3138
3161
// to fix the same problem with C++ headers, and is generally fragile.
3139
- if (!sdkSupportsBuiltinModules (TargetPlatform, SDKInfo))
3162
+ if (!sdkSupportsBuiltinModules (TargetPlatform, TargetEnvironment, SDKInfo))
3140
3163
CC1Args.push_back (" -fbuiltin-headers-in-system-modules" );
3141
3164
}
3142
3165
0 commit comments