Skip to content

[clang][modules] Enable built-in modules for the upcoming Apple releases #102239

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 32 additions & 7 deletions clang/lib/Driver/ToolChains/Darwin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2923,22 +2923,47 @@ bool Darwin::isAlignedAllocationUnavailable() const {
return TargetVersion < alignedAllocMinVersion(OS);
}

static bool sdkSupportsBuiltinModules(const Darwin::DarwinPlatformKind &TargetPlatform, const std::optional<DarwinSDKInfo> &SDKInfo) {
static bool sdkSupportsBuiltinModules(
const Darwin::DarwinPlatformKind &TargetPlatform,
const Darwin::DarwinEnvironmentKind &TargetEnvironment,
const std::optional<DarwinSDKInfo> &SDKInfo) {
switch (TargetEnvironment) {
case Darwin::NativeEnvironment:
case Darwin::Simulator:
case Darwin::MacCatalyst:
// Standard xnu/Mach/Darwin based environments
// depend on the SDK version.
break;
default:
// All other environments support builtin modules from the start.
return true;
}

if (!SDKInfo)
// If there is no SDK info, assume this is building against a
// pre-SDK version of macOS (i.e. before Mac OS X 10.4). Those
// don't support modules anyway, but the headers definitely
// don't support builtin modules either. It might also be some
// kind of degenerate build environment, err on the side of
// the old behavior which is to not use builtin modules.
return false;

VersionTuple SDKVersion = SDKInfo->getVersion();
switch (TargetPlatform) {
// Existing SDKs added support for builtin modules in the fall
// 2024 major releases.
case Darwin::MacOS:
return SDKVersion >= VersionTuple(99U);
return SDKVersion >= VersionTuple(15U);
case Darwin::IPhoneOS:
return SDKVersion >= VersionTuple(99U);
return SDKVersion >= VersionTuple(18U);
case Darwin::TvOS:
return SDKVersion >= VersionTuple(99U);
return SDKVersion >= VersionTuple(18U);
case Darwin::WatchOS:
return SDKVersion >= VersionTuple(99U);
return SDKVersion >= VersionTuple(11U);
case Darwin::XROS:
return SDKVersion >= VersionTuple(99U);
return SDKVersion >= VersionTuple(2U);

// New SDKs support builtin modules from the start.
default:
return true;
}
Expand Down Expand Up @@ -3030,7 +3055,7 @@ void Darwin::addClangTargetOptions(
// i.e. when the builtin stdint.h is in the Darwin module too, the cycle
// goes away. Note that -fbuiltin-headers-in-system-modules does nothing
// to fix the same problem with C++ headers, and is generally fragile.
if (!sdkSupportsBuiltinModules(TargetPlatform, SDKInfo))
if (!sdkSupportsBuiltinModules(TargetPlatform, TargetEnvironment, SDKInfo))
CC1Args.push_back("-fbuiltin-headers-in-system-modules");

if (!DriverArgs.hasArgNoClaim(options::OPT_fdefine_target_os_macros,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"Version":"23.0", "MaximumDeploymentTarget": "23.0.99"}
5 changes: 3 additions & 2 deletions clang/test/Driver/darwin-builtin-modules.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
// RUN: %clang -isysroot %S/Inputs/iPhoneOS13.0.sdk -target arm64-apple-ios13.0 -### %s 2>&1 | FileCheck %s
// CHECK: -fbuiltin-headers-in-system-modules

// RUN: %clang -isysroot %S/Inputs/MacOSX99.0.sdk -target x86_64-apple-macos98.0 -### %s 2>&1 | FileCheck --check-prefix=CHECK_FUTURE %s
// RUN: %clang -isysroot %S/Inputs/MacOSX99.0.sdk -target x86_64-apple-macos99.0 -### %s 2>&1 | FileCheck --check-prefix=CHECK_FUTURE %s
// RUN: %clang -isysroot %S/Inputs/MacOSX15.0.sdk -target x86_64-apple-macos14.0 -### %s 2>&1 | FileCheck --check-prefix=CHECK_FUTURE %s
// RUN: %clang -isysroot %S/Inputs/MacOSX15.0.sdk -target x86_64-apple-macos15.0 -### %s 2>&1 | FileCheck --check-prefix=CHECK_FUTURE %s
// RUN: %clang -isysroot %S/Inputs/DriverKit23.0.sdk -target arm64-apple-driverkit23.0 -### %s 2>&1 | FileCheck --check-prefix=CHECK_FUTURE %s
// CHECK_FUTURE-NOT: -fbuiltin-headers-in-system-modules
Loading