Author: Akira Hatanaka Date: 2026-08-22T00:10:21Z New Revision: 901817e3a9c037c14f67a909f10f10b6acab270b
URL: https://github.com/llvm/llvm-project/commit/901817e3a9c037c14f67a909f10f10b6acab270b DIFF: https://github.com/llvm/llvm-project/commit/901817e3a9c037c14f67a909f10f10b6acab270b.diff LOG: [clang][driver][darwin] Use DefaultDeploymentTarget when inferring deployment target from SDK (#217983) Use "DefaultDeploymentTarget" from SDKSettings.json instead of "Version" for the inferred deployment target version. This only affects the deployment target; other uses of "Version" (e.g., -target-sdk-version=) are unchanged. rdar://184842209 Added: clang/test/Driver/darwin-default-deployment-target.c Modified: clang/include/clang/Basic/DarwinSDKInfo.h clang/lib/Basic/DarwinSDKInfo.cpp clang/lib/Driver/ToolChains/Darwin.cpp clang/unittests/Basic/DarwinSDKInfoTest.cpp Removed: ################################################################################ diff --git a/clang/include/clang/Basic/DarwinSDKInfo.h b/clang/include/clang/Basic/DarwinSDKInfo.h index 2d55f4f61cd90..3c8297569180f 100644 --- a/clang/include/clang/Basic/DarwinSDKInfo.h +++ b/clang/include/clang/Basic/DarwinSDKInfo.h @@ -170,7 +170,8 @@ class DarwinSDKInfo { DarwinSDKInfo( std::string FilePath, llvm::Triple::OSType OS, llvm::Triple::EnvironmentType Environment, VersionTuple Version, - StringRef DisplayName, VersionTuple MaximumDeploymentTarget, + StringRef DisplayName, VersionTuple DefaultDeploymentTarget, + VersionTuple MaximumDeploymentTarget, PlatformInfoStorageType PlatformInfos, llvm::DenseMap<OSEnvPair::StorageType, std::optional<RelatedTargetVersionMapping>> @@ -179,6 +180,7 @@ class DarwinSDKInfo { std::optional<RelatedTargetVersionMapping>>()) : FilePath(std::move(FilePath)), OS(OS), Environment(Environment), Version(Version), DisplayName(DisplayName), + DefaultDeploymentTarget(DefaultDeploymentTarget), MaximumDeploymentTarget(MaximumDeploymentTarget), PlatformInfos(std::move(PlatformInfos)), VersionMappings(std::move(VersionMappings)) { @@ -203,6 +205,10 @@ class DarwinSDKInfo { const llvm::VersionTuple &getVersion() const { return Version; } + const llvm::VersionTuple &getDefaultDeploymentTarget() const { + return DefaultDeploymentTarget; + } + const StringRef getDisplayName() const { return DisplayName; } const llvm::Triple &getCanonicalPlatformTriple() const { @@ -241,6 +247,7 @@ class DarwinSDKInfo { llvm::Triple::EnvironmentType Environment; VersionTuple Version; std::string DisplayName; + VersionTuple DefaultDeploymentTarget; VersionTuple MaximumDeploymentTarget; PlatformInfoStorageType PlatformInfos; // Need to wrap the value in an optional here as the value has to be default diff --git a/clang/lib/Basic/DarwinSDKInfo.cpp b/clang/lib/Basic/DarwinSDKInfo.cpp index 4e44da8febc3e..63608e3e4ad8b 100644 --- a/clang/lib/Basic/DarwinSDKInfo.cpp +++ b/clang/lib/Basic/DarwinSDKInfo.cpp @@ -259,6 +259,9 @@ DarwinSDKInfo::parseDarwinSDKSettingsJSON(std::string FilePath, auto Version = getVersionKey(*Obj, "Version"); if (!Version) return std::nullopt; + auto DefaultDeploymentTarget = getVersionKey(*Obj, "DefaultDeploymentTarget"); + if (!DefaultDeploymentTarget) + return std::nullopt; auto MaximumDeploymentVersion = getVersionKey(*Obj, "MaximumDeploymentTarget"); if (!MaximumDeploymentVersion) @@ -318,7 +321,8 @@ DarwinSDKInfo::parseDarwinSDKSettingsJSON(std::string FilePath, return DarwinSDKInfo(std::move(FilePath), OSAndEnvironment.first, OSAndEnvironment.second, std::move(*Version), - DisplayName, std::move(*MaximumDeploymentVersion), + DisplayName, std::move(*DefaultDeploymentTarget), + std::move(*MaximumDeploymentVersion), std::move(PlatformInfos), std::move(VersionMappings)); } @@ -350,7 +354,7 @@ DarwinSDKInfo::DarwinSDKInfo(llvm::Triple::OSType OS, llvm::Triple::EnvironmentType Environment, VersionTuple Version, StringRef DisplayName, VersionTuple MaximumDeploymentTarget) - : DarwinSDKInfo("", OS, Environment, Version, DisplayName, + : DarwinSDKInfo("", OS, Environment, Version, DisplayName, Version, MaximumDeploymentTarget, legacyPlatformInfos(OS, Environment)) {} diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp b/clang/lib/Driver/ToolChains/Darwin.cpp index d3de04fc5155e..98ace0720343f 100644 --- a/clang/lib/Driver/ToolChains/Darwin.cpp +++ b/clang/lib/Driver/ToolChains/Darwin.cpp @@ -2057,7 +2057,7 @@ struct DarwinPlatform { const DarwinSDKInfo &SDKInfo) { const llvm::Triple &PlatformTriple = SDKInfo.getCanonicalPlatformTriple(); const llvm::Triple::OSType OS = PlatformTriple.getOS(); - VersionTuple Version = SDKInfo.getVersion(); + VersionTuple Version = SDKInfo.getDefaultDeploymentTarget(); if (OS == llvm::Triple::MacOSX) Version = getVersionFromString( getSystemOrSDKMacOSVersion(Version.getAsString())); diff --git a/clang/test/Driver/darwin-default-deployment-target.c b/clang/test/Driver/darwin-default-deployment-target.c new file mode 100644 index 0000000000000..11edec14d6842 --- /dev/null +++ b/clang/test/Driver/darwin-default-deployment-target.c @@ -0,0 +1,85 @@ +// Ensure that the deployment target inferred from the SDK when none is +// specified on the command line uses "DefaultDeploymentTarget" rather than +// "Version" when the SDK specifies both and they diff er. +// REQUIRES: system-darwin && native + +// RUN: rm -rf %t +// RUN: split-file %s %t + +// RUN: %clang -target arm64-apple-darwin -isysroot %t/iPhoneOS18.0.sdk -c -### %s 2>&1 \ +// RUN: | FileCheck %s + +// CHECK: "-triple" "arm64-apple-ios17.0.0" +// CHECK-SAME: -target-sdk-version=18.0 + +// An explicit deployment target on the command line overrides the SDK's +// "DefaultDeploymentTarget". +// RUN: %clang -target arm64-apple-darwin -isysroot %t/iPhoneOS18.0.sdk -miphoneos-version-min=12.0 -c -### %s 2>&1 \ +// RUN: | FileCheck --check-prefix=OVERRIDE %s + +// OVERRIDE: "-triple" "arm64-apple-ios12.0.0" +// OVERRIDE-SAME: -target-sdk-version=18.0 + +// When "DefaultDeploymentTarget" is missing, the whole SDKSettings.json is +// treated as unusable and the version is instead inferred from the SDK +// path. +// RUN: %clang -target arm64-apple-darwin -isysroot %t/iPhoneOS18.3.sdk -c -### %s 2>&1 \ +// RUN: | FileCheck --check-prefix=NO-DEFAULT %s + +// NO-DEFAULT: warning: SDK settings were ignored as 'SDKSettings.json' could not be parsed +// NO-DEFAULT: "-triple" "arm64-apple-ios18.3.0" +// NO-DEFAULT-SAME: -target-sdk-version=18.3 + +//--- iPhoneOS18.0.sdk/SDKSettings.json +{ + "CanonicalName": "iphoneos18.0", + "Version": "18.0", + "IsBaseSDK": "YES", + "DisplayName": "iOS 18.0", + "MinimalDisplayName": "18.0", + "SupportedTargets": { + "iphoneos": { + "PlatformFamilyName": "iOS", + "PlatformFamilyDisplayName": "iOS", + "Archs": ["arm64e", "arm64"], "LLVMTargetTripleVendor": "apple", "LLVMTargetTripleSys": "ios", "LLVMTargetTripleEnvironment": "", + "BuildVersionPlatformID": "2", + "ClangRuntimeLibraryPlatformName": "ios", + "SystemPrefix": "", + "DefaultDeploymentTarget": "17.0", + "RecommendedDeploymentTarget": "15.0", + "MinimumDeploymentTarget": "12.0", "MaximumDeploymentTarget": "18.0.99", + "ValidDeploymentTargets": ["12.0", "12.1", "12.2", "12.3", "12.4", "13.0", "13.1", "13.2", "13.3", "13.4", "13.5", "13.6", "14.0", "14.1", "14.2", "14.3", "14.4", "14.5", "14.6", "14.7", "15.0", "15.1", "15.2", "15.3", "15.4", "15.5", "15.6", "16.0", "16.1", "16.2", "16.3", "16.4", "16.5", "16.6", "17.0", "17.1", "17.2", "17.3", "17.4", "17.5", "17.6", "18.0"] + } + }, + "DefaultDeploymentTarget": "17.0", + "MaximumDeploymentTarget": "18.0.99", + "Comments": [ + "Modified version of the iOS SDK from Xcode 18.0 to have \"DefaultDeploymentTarget\" diff er from \"Version\"." + ] +} + +//--- iPhoneOS18.3.sdk/SDKSettings.json +{ + "CanonicalName": "iphoneos18.6", + "Version": "18.6", + "IsBaseSDK": "YES", + "DisplayName": "iOS 18.6", + "MinimalDisplayName": "18.6", + "SupportedTargets": { + "iphoneos": { + "PlatformFamilyName": "iOS", + "PlatformFamilyDisplayName": "iOS", + "Archs": ["arm64e", "arm64"], "LLVMTargetTripleVendor": "apple", "LLVMTargetTripleSys": "ios", "LLVMTargetTripleEnvironment": "", + "BuildVersionPlatformID": "2", + "ClangRuntimeLibraryPlatformName": "ios", + "SystemPrefix": "", + "RecommendedDeploymentTarget": "15.0", + "MinimumDeploymentTarget": "12.0", "MaximumDeploymentTarget": "18.6.99", + "ValidDeploymentTargets": ["12.0", "12.1", "12.2", "12.3", "12.4", "13.0", "13.1", "13.2", "13.3", "13.4", "13.5", "13.6", "14.0", "14.1", "14.2", "14.3", "14.4", "14.5", "14.6", "14.7", "15.0", "15.1", "15.2", "15.3", "15.4", "15.5", "15.6", "16.0", "16.1", "16.2", "16.3", "16.4", "16.5", "16.6", "17.0", "17.1", "17.2", "17.3", "17.4", "17.5", "17.6", "18.0", "18.1", "18.2", "18.3", "18.4", "18.5", "18.6"] + } + }, + "MaximumDeploymentTarget": "18.6.99", + "Comments": [ + "Modified version of the iOS SDK from Xcode 18.6 with \"DefaultDeploymentTarget\" removed to test the fallback path used when it's missing. The SDK's folder name deliberately diff ers from \"Version\" to show the SDK path, not \"Version\", is used for the fallback." + ] +} diff --git a/clang/unittests/Basic/DarwinSDKInfoTest.cpp b/clang/unittests/Basic/DarwinSDKInfoTest.cpp index 33d817c456403..67b708f9b564a 100644 --- a/clang/unittests/Basic/DarwinSDKInfoTest.cpp +++ b/clang/unittests/Basic/DarwinSDKInfoTest.cpp @@ -81,6 +81,7 @@ TEST(DarwinSDKInfo, VersionMappingParseError) { TEST(DarwinSDKInfo, PlatformPrefix) { llvm::json::Object SDKSettings({{"CanonicalName", "macosx26.0"}, {"Version", "26.0"}, + {"DefaultDeploymentTarget", "26.0"}, {"MaximumDeploymentTarget", "26.0.99"}}); llvm::json::Object SupportedTargets; llvm::json::Object MacOS({{"Archs", {"x86_64", "arm64"}}, @@ -123,6 +124,7 @@ TEST(DarwinSDKInfoTest, ParseAndTestMappingMacCatalyst) { llvm::json::Object Obj; Obj["CanonicalName"] = "macosx11.0"; Obj["Version"] = "11.0"; + Obj["DefaultDeploymentTarget"] = "11.0"; Obj["MaximumDeploymentTarget"] = "11.99"; llvm::json::Object VersionMap; VersionMap["10.15"] = "13.1"; @@ -170,6 +172,7 @@ TEST(DarwinSDKInfoTest, ParseAndTestMappingIOSDerived) { llvm::json::Object Obj; Obj["CanonicalName"] = "appletvos15.0"; Obj["Version"] = "15.0"; + Obj["DefaultDeploymentTarget"] = "15.0"; Obj["MaximumDeploymentTarget"] = "15.0.99"; llvm::json::Object VersionMap; VersionMap["10.0"] = "10.0"; _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
