[clang] [llvm] [clang][driver][darwin] Base the system prefix on the SDK, not the target (PR #171714)
Ian Anderson via llvm-commits
llvm-commits at lists.llvm.org
Thu Dec 11 11:29:34 PST 2025
https://github.com/ian-twilightcoder updated https://github.com/llvm/llvm-project/pull/171714
>From 267e03c46a55d1261762f6b17d57503df9b74395 Mon Sep 17 00:00:00 2001
From: Ian Anderson <iana at apple.com>
Date: Wed, 10 Dec 2025 13:58:52 -0800
Subject: [PATCH 1/2] [clang][driver][darwin] Base the system prefix on the
SDK, not the target
The search path prefix is really a property of the SDK, and not the target triple. The target is just being used as a proxy for the SDK. That's problemmatic when the SDK being used doesn't match the target assumption, and the prefix should be taken from the SDK rather than hard coded.
The prefix is actually per target triple within an SDK, so make a map from target to prefix in DarwinSDKInfo. That requires making Triple support being used as a DenseMap key. From there, have the DarwinClang tool chain get the prefix from its SDKInfo.
---
clang/include/clang/Basic/DarwinSDKInfo.h | 13 ++++-
clang/lib/Basic/DarwinSDKInfo.cpp | 50 ++++++++++++++++++-
clang/lib/Driver/ToolChains/Darwin.cpp | 14 +++---
clang/lib/Driver/ToolChains/Darwin.h | 6 +++
.../DriverKit21.0.1.sdk/SDKSettings.json | 4 ++
.../Inputs/DriverKit23.0.sdk/SDKSettings.json | 5 +-
.../SDKSettings.json | 14 ++++++
.../Inputs/MacOSX15.0.sdk/SDKSettings.json | 6 ++-
.../Inputs/MacOSX15.1.sdk/SDKSettings.json | 6 ++-
.../Inputs/WatchOS6.0.sdk/SDKSettings.json | 5 +-
.../Inputs/iPhoneOS13.0.sdk/SDKSettings.json | 5 +-
clang/test/Driver/driverkit-path.c | 4 ++
.../Inputs/MacOSX13.0.sdk/SDKSettings.json | 19 ++++++-
.../Inputs/AppleTVOS15.0.sdk/SDKSettings.json | 8 +++
.../Inputs/MacOSX11.0.sdk/SDKSettings.json | 17 ++++++-
.../Inputs/WatchOS7.0.sdk/SDKSettings.json | 8 +++
.../Sema/Inputs/XROS.sdk/SDKSettings.json | 3 ++
clang/unittests/Basic/DarwinSDKInfoTest.cpp | 32 ++++++++++++
llvm/include/llvm/TargetParser/Triple.h | 25 +++++++++-
llvm/lib/TargetParser/Triple.cpp | 2 +
llvm/unittests/TargetParser/TripleTest.cpp | 13 +++++
21 files changed, 243 insertions(+), 16 deletions(-)
create mode 100644 clang/test/Driver/Inputs/DriverKit21.0.1.sdk/SDKSettings.json
diff --git a/clang/include/clang/Basic/DarwinSDKInfo.h b/clang/include/clang/Basic/DarwinSDKInfo.h
index bc122c7d21c72..41ecca4dc4c3a 100644
--- a/clang/include/clang/Basic/DarwinSDKInfo.h
+++ b/clang/include/clang/Basic/DarwinSDKInfo.h
@@ -144,18 +144,28 @@ class DarwinSDKInfo {
DarwinSDKInfo(
VersionTuple Version, VersionTuple MaximumDeploymentTarget,
llvm::Triple::OSType OS,
+ llvm::SmallDenseMap<llvm::Triple, std::string> SystemPrefixes =
+ llvm::SmallDenseMap<llvm::Triple, std::string>(),
llvm::DenseMap<OSEnvPair::StorageType,
std::optional<RelatedTargetVersionMapping>>
VersionMappings =
llvm::DenseMap<OSEnvPair::StorageType,
std::optional<RelatedTargetVersionMapping>>())
: Version(Version), MaximumDeploymentTarget(MaximumDeploymentTarget),
- OS(OS), VersionMappings(std::move(VersionMappings)) {}
+ OS(OS), SystemPrefixes(SystemPrefixes),
+ VersionMappings(std::move(VersionMappings)) {}
const llvm::VersionTuple &getVersion() const { return Version; }
const llvm::Triple::OSType &getOS() const { return OS; }
+ const StringRef getSystemPrefix(llvm::Triple Triple) const {
+ auto SystemPrefix = SystemPrefixes.find(Triple);
+ if (SystemPrefix == SystemPrefixes.end())
+ return StringRef();
+ return SystemPrefix->getSecond();
+ }
+
// Returns the optional, target-specific version mapping that maps from one
// target to another target.
//
@@ -181,6 +191,7 @@ class DarwinSDKInfo {
VersionTuple Version;
VersionTuple MaximumDeploymentTarget;
llvm::Triple::OSType OS;
+ llvm::SmallDenseMap<llvm::Triple, std::string> SystemPrefixes;
// Need to wrap the value in an optional here as the value has to be default
// constructible, and std::unique_ptr doesn't like DarwinSDKInfo being
// Optional as Optional is trying to copy it in emplace.
diff --git a/clang/lib/Basic/DarwinSDKInfo.cpp b/clang/lib/Basic/DarwinSDKInfo.cpp
index 6bcfb9d598377..a41dbe45f2230 100644
--- a/clang/lib/Basic/DarwinSDKInfo.cpp
+++ b/clang/lib/Basic/DarwinSDKInfo.cpp
@@ -85,6 +85,52 @@ static llvm::Triple::OSType parseOS(const llvm::json::Object &Obj) {
.Default(llvm::Triple::UnknownOS);
}
+static llvm::SmallDenseMap<llvm::Triple, std::string>
+parseSystemPrefixes(const llvm::json::Object &Obj, llvm::Triple::OSType SDKOS,
+ VersionTuple Version) {
+ llvm::SmallDenseMap<llvm::Triple, std::string> SystemPrefixes;
+ auto SupportedTargets = Obj.getObject("SupportedTargets");
+ if (!SupportedTargets)
+ return SystemPrefixes;
+ for (auto SupportedTargetPair : *SupportedTargets) {
+ StringRef PlatformOrVariant = SupportedTargetPair.getFirst();
+ if ((PlatformOrVariant == "iosmac") && (Version < VersionTuple(99)))
+ // iosmac has an invalid SystemPrefix, skip it.
+ continue;
+
+ llvm::json::Object *SupportedTarget =
+ SupportedTargetPair.getSecond().getAsObject();
+ auto Archs = SupportedTarget->getArray("Archs");
+ auto Vendor = SupportedTarget->getString("LLVMTargetTripleVendor");
+ auto OS = SupportedTarget->getString("LLVMTargetTripleSys");
+ auto SystemPrefix = SupportedTarget->getString("SystemPrefix");
+ if (!SystemPrefix) {
+ // Older SDKs don't have SystemPrefix in SupportedTargets, manually add
+ // their prefixes.
+ if ((SDKOS == llvm::Triple::DriverKit) && (Version < VersionTuple(22, 1)))
+ SystemPrefix = "/System/DriverKit";
+ }
+ if (!Archs || !Vendor || !OS || !SystemPrefix)
+ continue;
+
+ auto Environment =
+ SupportedTarget->getString("LLVMTargetTripleEnvironment");
+
+ for (auto Arch : *Archs) {
+ auto ArchString = Arch.getAsString();
+ if (!ArchString)
+ continue;
+ llvm::Triple Triple;
+ if (Environment)
+ Triple = llvm::Triple(*ArchString, *Vendor, *OS, *Environment);
+ else
+ Triple = llvm::Triple(*ArchString, *Vendor, *OS);
+ SystemPrefixes[Triple] = *SystemPrefix;
+ }
+ }
+ return SystemPrefixes;
+}
+
static std::optional<VersionTuple> getVersionKey(const llvm::json::Object &Obj,
StringRef Key) {
auto Value = Obj.getString(Key);
@@ -106,6 +152,8 @@ DarwinSDKInfo::parseDarwinSDKSettingsJSON(const llvm::json::Object *Obj) {
if (!MaximumDeploymentVersion)
return std::nullopt;
llvm::Triple::OSType OS = parseOS(*Obj);
+ llvm::SmallDenseMap<llvm::Triple, std::string> SystemPrefixes =
+ parseSystemPrefixes(*Obj, OS, *Version);
llvm::DenseMap<OSEnvPair::StorageType,
std::optional<RelatedTargetVersionMapping>>
VersionMappings;
@@ -149,7 +197,7 @@ DarwinSDKInfo::parseDarwinSDKSettingsJSON(const llvm::json::Object *Obj) {
return DarwinSDKInfo(std::move(*Version),
std::move(*MaximumDeploymentVersion), OS,
- std::move(VersionMappings));
+ std::move(SystemPrefixes), std::move(VersionMappings));
}
Expected<std::optional<DarwinSDKInfo>>
diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp b/clang/lib/Driver/ToolChains/Darwin.cpp
index fc3cd9030f71d..39bb9233104f7 100644
--- a/clang/lib/Driver/ToolChains/Darwin.cpp
+++ b/clang/lib/Driver/ToolChains/Darwin.cpp
@@ -566,8 +566,6 @@ static void renderRemarksOptions(const ArgList &Args, ArgStringList &CmdArgs,
}
}
-static void AppendPlatformPrefix(SmallString<128> &Path, const llvm::Triple &T);
-
void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
@@ -801,7 +799,7 @@ void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
if (auto *Sysroot = Args.getLastArg(options::OPT_isysroot)) {
auto AddSearchPath = [&](StringRef Flag, StringRef SearchPath) {
SmallString<128> P(Sysroot->getValue());
- AppendPlatformPrefix(P, Triple);
+ getMachOToolChain().AppendPlatformPrefix(P, Triple);
llvm::sys::path::append(P, SearchPath);
if (getToolChain().getVFS().exists(P)) {
CmdArgs.push_back(Args.MakeArgString(Flag + P));
@@ -2609,9 +2607,13 @@ void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
// For certain platforms/environments almost all resources (e.g., headers) are
// located in sub-directories, e.g., for DriverKit they live in
// <SYSROOT>/System/DriverKit/usr/include (instead of <SYSROOT>/usr/include).
-static void AppendPlatformPrefix(SmallString<128> &Path,
- const llvm::Triple &T) {
- if (T.isDriverKit()) {
+void DarwinClang::AppendPlatformPrefix(SmallString<128> &Path,
+ const llvm::Triple &T) const {
+ if (SDKInfo) {
+ llvm::sys::path::append(Path, SDKInfo->getSystemPrefix(T));
+ } else if (T.isDriverKit()) {
+ // The first version of DriverKit didn't have SDKSettings.json, manually add
+ // its prefix.
llvm::sys::path::append(Path, "System", "DriverKit");
}
}
diff --git a/clang/lib/Driver/ToolChains/Darwin.h b/clang/lib/Driver/ToolChains/Darwin.h
index d1cfb6f4a5bf7..c4c52c6a6264b 100644
--- a/clang/lib/Driver/ToolChains/Darwin.h
+++ b/clang/lib/Driver/ToolChains/Darwin.h
@@ -197,6 +197,9 @@ class LLVM_LIBRARY_VISIBILITY MachO : public ToolChain {
llvm::opt::ArgStringList &CmdArgs) const {
}
+ virtual void AppendPlatformPrefix(SmallString<128> &Path,
+ const llvm::Triple &T) const {}
+
/// On some iOS platforms, kernel and kernel modules were built statically. Is
/// this such a target?
virtual bool isKernelStatic() const { return false; }
@@ -670,6 +673,9 @@ class LLVM_LIBRARY_VISIBILITY DarwinClang : public Darwin {
void AddLinkARCArgs(const llvm::opt::ArgList &Args,
llvm::opt::ArgStringList &CmdArgs) const override;
+ void AppendPlatformPrefix(SmallString<128> &Path,
+ const llvm::Triple &T) const override;
+
unsigned GetDefaultDwarfVersion() const override;
// Until dtrace (via CTF) and LLDB can deal with distributed debug info,
// Darwin defaults to standalone/full debug info.
diff --git a/clang/test/Driver/Inputs/DriverKit21.0.1.sdk/SDKSettings.json b/clang/test/Driver/Inputs/DriverKit21.0.1.sdk/SDKSettings.json
new file mode 100644
index 0000000000000..f1c42c93057a1
--- /dev/null
+++ b/clang/test/Driver/Inputs/DriverKit21.0.1.sdk/SDKSettings.json
@@ -0,0 +1,4 @@
+{"Version": "21.0.1", "CanonicalName": "driverkit21.0.1", "MaximumDeploymentTarget": "21.0.1.99",
+ "SupportedTargets": {
+ "driverkit": {"Archs": ["x86_64", "x86_64h", "arm64", "arm64e"], "LLVMTargetTripleVendor": "apple", "LLVMTargetTripleSys": "driverkit", "LLVMTargetTripleEnvironment": ""}
+}}
diff --git a/clang/test/Driver/Inputs/DriverKit23.0.sdk/SDKSettings.json b/clang/test/Driver/Inputs/DriverKit23.0.sdk/SDKSettings.json
index edee441adb474..9ad5266c2a248 100644
--- a/clang/test/Driver/Inputs/DriverKit23.0.sdk/SDKSettings.json
+++ b/clang/test/Driver/Inputs/DriverKit23.0.sdk/SDKSettings.json
@@ -1 +1,4 @@
-{"Version":"23.0", "CanonicalName": "driverkit23.0", "MaximumDeploymentTarget": "23.0.99"}
+{"Version":"23.0", "CanonicalName": "driverkit23.0", "MaximumDeploymentTarget": "23.0.99",
+ "SupportedTargets": {
+ "driverkit": {"Archs": ["x86_64", "x86_64h", "arm64", "arm64e"], "LLVMTargetTripleVendor": "apple", "LLVMTargetTripleSys": "driverkit", "LLVMTargetTripleEnvironment": "", "SystemPrefix": "\/System\/DriverKit"}
+}}
diff --git a/clang/test/Driver/Inputs/MacOSX10.15.versioned.sdk/SDKSettings.json b/clang/test/Driver/Inputs/MacOSX10.15.versioned.sdk/SDKSettings.json
index 7325cc45a2808..c3b46502069ba 100644
--- a/clang/test/Driver/Inputs/MacOSX10.15.versioned.sdk/SDKSettings.json
+++ b/clang/test/Driver/Inputs/MacOSX10.15.versioned.sdk/SDKSettings.json
@@ -2,6 +2,20 @@
"Version":"10.15",
"CanonicalName": "macosx10.15",
"MaximumDeploymentTarget": "10.15.99",
+ "SupportedTargets": {
+ "macosx": {
+ "Archs": ["x86_64"],
+ "LLVMTargetTripleVendor": "apple",
+ "LLVMTargetTripleSys": "macosx",
+ "LLVMTargetTripleEnvironment": ""
+ },
+ "iosmac": {
+ "Archs": ["x86_64"],
+ "LLVMTargetTripleVendor": "apple",
+ "LLVMTargetTripleSys": "ios",
+ "LLVMTargetTripleEnvironment": "macabi"
+ }
+ },
"VersionMap" : {
"macOS_iOSMac" : {
"10.15" : "13.1",
diff --git a/clang/test/Driver/Inputs/MacOSX15.0.sdk/SDKSettings.json b/clang/test/Driver/Inputs/MacOSX15.0.sdk/SDKSettings.json
index 81d5ee28a5a05..e7c691dd80307 100644
--- a/clang/test/Driver/Inputs/MacOSX15.0.sdk/SDKSettings.json
+++ b/clang/test/Driver/Inputs/MacOSX15.0.sdk/SDKSettings.json
@@ -1 +1,5 @@
-{"Version":"15.0", "CanonicalName": "macosx15.0", "MaximumDeploymentTarget": "15.0.99"}
+{"Version":"15.0", "CanonicalName": "macosx15.0", "MaximumDeploymentTarget": "15.0.99",
+ "SupportedTargets": {
+ "macosx": {"Archs": ["x86_64", "x86_64h", "arm64", "arm64e"], "LLVMTargetTripleVendor": "apple", "LLVMTargetTripleSys": "macos", "LLVMTargetTripleEnvironment": "", "SystemPrefix": ""},
+ "iosmac": {"Archs": ["x86_64", "x86_64h", "arm64", "arm64e"], "LLVMTargetTripleVendor": "apple", "LLVMTargetTripleSys": "ios", "LLVMTargetTripleEnvironment": "macabi", "SystemPrefix": "\/System\/iOSSupport"}
+}}
diff --git a/clang/test/Driver/Inputs/MacOSX15.1.sdk/SDKSettings.json b/clang/test/Driver/Inputs/MacOSX15.1.sdk/SDKSettings.json
index 956cbe4041b9a..c42e903255296 100644
--- a/clang/test/Driver/Inputs/MacOSX15.1.sdk/SDKSettings.json
+++ b/clang/test/Driver/Inputs/MacOSX15.1.sdk/SDKSettings.json
@@ -1 +1,5 @@
-{"Version":"15.1", "CanonicalName": "macosx15.1", "MaximumDeploymentTarget": "15.1.99"}
+{"Version":"15.1", "CanonicalName": "macosx15.1", "MaximumDeploymentTarget": "15.1.99",
+ "SupportedTargets": {
+ "macosx": {"Archs": ["x86_64", "x86_64h", "arm64", "arm64e"], "LLVMTargetTripleVendor": "apple", "LLVMTargetTripleSys": "macos", "LLVMTargetTripleEnvironment": "", "SystemPrefix": ""},
+ "iosmac": {"Archs": ["x86_64", "x86_64h", "arm64", "arm64e"], "LLVMTargetTripleVendor": "apple", "LLVMTargetTripleSys": "ios", "LLVMTargetTripleEnvironment": "macabi", "SystemPrefix": "\/System\/iOSSupport"}
+}}
diff --git a/clang/test/Driver/Inputs/WatchOS6.0.sdk/SDKSettings.json b/clang/test/Driver/Inputs/WatchOS6.0.sdk/SDKSettings.json
index 314fc22edf7eb..3e2f817ac1406 100644
--- a/clang/test/Driver/Inputs/WatchOS6.0.sdk/SDKSettings.json
+++ b/clang/test/Driver/Inputs/WatchOS6.0.sdk/SDKSettings.json
@@ -1 +1,4 @@
-{"Version":"6.0", "CanonicalName": "watchos6.0", "MaximumDeploymentTarget": "6.0.99"}
+{"Version":"6.0", "CanonicalName": "watchos6.0", "MaximumDeploymentTarget": "6.0.99",
+ "SupportedTargets": {
+ "watchos": {"Archs": ["armv7k", "arm64_32"], "LLVMTargetTripleVendor": "apple", "LLVMTargetTripleSys": "watchos", "LLVMTargetTripleEnvironment": ""}
+}}
diff --git a/clang/test/Driver/Inputs/iPhoneOS13.0.sdk/SDKSettings.json b/clang/test/Driver/Inputs/iPhoneOS13.0.sdk/SDKSettings.json
index c122cf47ce0f7..91cb1fa501b3b 100644
--- a/clang/test/Driver/Inputs/iPhoneOS13.0.sdk/SDKSettings.json
+++ b/clang/test/Driver/Inputs/iPhoneOS13.0.sdk/SDKSettings.json
@@ -1 +1,4 @@
-{"Version":"13.0", "CanonicalName": "iphoneos13.0", "MaximumDeploymentTarget": "13.0.99"}
+{"Version":"13.0", "CanonicalName": "iphoneos13.0", "MaximumDeploymentTarget": "13.0.99",
+ "SupportedTargets": {
+ "iphoneos": {"Archs": ["armv7", "armv7s", "arm64"], "LLVMTargetTripleVendor": "apple", "LLVMTargetTripleSys": "ios", "LLVMTargetTripleEnvironment": ""}
+}}
diff --git a/clang/test/Driver/driverkit-path.c b/clang/test/Driver/driverkit-path.c
index 32f0a6721ab77..bc96201753165 100644
--- a/clang/test/Driver/driverkit-path.c
+++ b/clang/test/Driver/driverkit-path.c
@@ -26,6 +26,10 @@ int main() { return 0; }
// RUN: %clang %s -target x86_64-apple-driverkit19.0 -isysroot %S/Inputs/DriverKit19.0.sdk -x c++ -### 2>&1 \
// RUN: | FileCheck %s -DSDKROOT=%S/Inputs/DriverKit19.0.sdk --check-prefix=INC
+// RUN: %clang %s -target x86_64-apple-driverkit21.0.1 -isysroot %S/Inputs/DriverKit21.0.1.sdk -x c++ -### 2>&1 \
+// RUN: | FileCheck %s -DSDKROOT=%S/Inputs/DriverKit21.0.1.sdk --check-prefix=INC
+// RUN: %clang %s -target x86_64-apple-driverkit23.0 -isysroot %S/Inputs/DriverKit23.0.sdk -x c++ -### 2>&1 \
+// RUN: | FileCheck %s -DSDKROOT=%S/Inputs/DriverKit23.0.sdk --check-prefix=INC
//
// INC: "-isysroot" "[[SDKROOT]]"
// INC: "-internal-isystem" "[[SDKROOT]]/System/DriverKit/usr/local/include"
diff --git a/clang/test/InstallAPI/Inputs/MacOSX13.0.sdk/SDKSettings.json b/clang/test/InstallAPI/Inputs/MacOSX13.0.sdk/SDKSettings.json
index d08288ed1af10..563d17cfface9 100644
--- a/clang/test/InstallAPI/Inputs/MacOSX13.0.sdk/SDKSettings.json
+++ b/clang/test/InstallAPI/Inputs/MacOSX13.0.sdk/SDKSettings.json
@@ -3,7 +3,24 @@
"Version": "13.0",
"CanonicalName": "macosx13.0",
"MaximumDeploymentTarget": "13.0.99",
- "PropertyConditionFallbackNames": [], "VersionMap": {
+ "PropertyConditionFallbackNames": [],
+ "SupportedTargets": {
+ "macosx": {
+ "Archs": ["x86_64", "x86_64h", "arm64", "arm64e"],
+ "LLVMTargetTripleVendor": "apple",
+ "LLVMTargetTripleSys": "macos",
+ "LLVMTargetTripleEnvironment": "",
+ "SystemPrefix": ""
+ },
+ "iosmac": {
+ "Archs": ["x86_64", "x86_64h", "arm64", "arm64e"],
+ "LLVMTargetTripleVendor": "apple",
+ "LLVMTargetTripleSys": "ios",
+ "LLVMTargetTripleEnvironment": "macabi",
+ "SystemPrefix": "\/System\/iOSSupport"
+ }
+ },
+ "VersionMap": {
"iOSMac_macOS": {
"16.1": "13.0",
"15.0": "12.0",
diff --git a/clang/test/Sema/Inputs/AppleTVOS15.0.sdk/SDKSettings.json b/clang/test/Sema/Inputs/AppleTVOS15.0.sdk/SDKSettings.json
index 6cd02f33471ed..1c74c27e48b96 100644
--- a/clang/test/Sema/Inputs/AppleTVOS15.0.sdk/SDKSettings.json
+++ b/clang/test/Sema/Inputs/AppleTVOS15.0.sdk/SDKSettings.json
@@ -4,6 +4,14 @@
"CanonicalName": "appletvos15.0",
"MaximumDeploymentTarget": "15.0.99",
"PropertyConditionFallbackNames": [],
+ "SupportedTargets": {
+ "appletvos": {
+ "Archs": ["arm64e", "arm64"],
+ "LLVMTargetTripleVendor": "apple",
+ "LLVMTargetTripleSys": "tvos",
+ "LLVMTargetTripleEnvironment": ""
+ }
+ },
"VersionMap": {
"iOS_tvOS": {
"10.0": "10.0",
diff --git a/clang/test/Sema/Inputs/MacOSX11.0.sdk/SDKSettings.json b/clang/test/Sema/Inputs/MacOSX11.0.sdk/SDKSettings.json
index e6220abfbe573..fbb8fa69edf5f 100644
--- a/clang/test/Sema/Inputs/MacOSX11.0.sdk/SDKSettings.json
+++ b/clang/test/Sema/Inputs/MacOSX11.0.sdk/SDKSettings.json
@@ -3,7 +3,22 @@
"Version": "11.0",
"CanonicalName": "macosx11.0",
"MaximumDeploymentTarget": "11.0.99",
- "PropertyConditionFallbackNames": [], "VersionMap": {
+ "PropertyConditionFallbackNames": [],
+ "SupportedTargets": {
+ "macosx": {
+ "Archs": ["x86_64", "x86_64h", "arm64", "arm64e"],
+ "LLVMTargetTripleVendor": "apple",
+ "LLVMTargetTripleSys": "macosx",
+ "LLVMTargetTripleEnvironment": ""
+ },
+ "iosmac": {
+ "Archs": ["x86_64", "x86_64h", "arm64", "arm64e"],
+ "LLVMTargetTripleVendor": "apple",
+ "LLVMTargetTripleSys": "ios",
+ "LLVMTargetTripleEnvironment": "macabi"
+ }
+ },
+ "VersionMap": {
"iOSMac_macOS": {
"13.2": "10.15.1",
"13.4": "10.15.4",
diff --git a/clang/test/Sema/Inputs/WatchOS7.0.sdk/SDKSettings.json b/clang/test/Sema/Inputs/WatchOS7.0.sdk/SDKSettings.json
index 84914c105749a..4481ec7ddefd4 100644
--- a/clang/test/Sema/Inputs/WatchOS7.0.sdk/SDKSettings.json
+++ b/clang/test/Sema/Inputs/WatchOS7.0.sdk/SDKSettings.json
@@ -4,6 +4,14 @@
"CanonicalName": "watchos7.0",
"MaximumDeploymentTarget": "7.0.99",
"PropertyConditionFallbackNames": [],
+ "SupportedTargets": {
+ "watchos": {
+ "Archs": ["arm64_32", "armv7k"],
+ "LLVMTargetTripleVendor": "apple",
+ "LLVMTargetTripleSys": "watchos",
+ "LLVMTargetTripleEnvironment": ""
+ }
+ },
"VersionMap": {
"iOS_watchOS": {
"10.0": "3.0",
diff --git a/clang/test/Sema/Inputs/XROS.sdk/SDKSettings.json b/clang/test/Sema/Inputs/XROS.sdk/SDKSettings.json
index a56a7d61431b9..ccae54bcff48c 100644
--- a/clang/test/Sema/Inputs/XROS.sdk/SDKSettings.json
+++ b/clang/test/Sema/Inputs/XROS.sdk/SDKSettings.json
@@ -3,6 +3,9 @@
"Version": "26.0",
"CanonicalName": "xros26.0",
"MaximumDeploymentTarget": "26.0.99",
+ "SupportedTargets": {
+ "xros": {"Archs": ["arm64e", "arm64"], "LLVMTargetTripleVendor": "apple", "LLVMTargetTripleSys": "xros", "LLVMTargetTripleEnvironment": "", "SystemPrefix": ""}
+ },
"VersionMap": {
"iOS_xrOS":{"15.0":"1.0", "16.0":"2.0", "19.0":"26.0", "26.0":"26.0"}
}
diff --git a/clang/unittests/Basic/DarwinSDKInfoTest.cpp b/clang/unittests/Basic/DarwinSDKInfoTest.cpp
index 7214f3bc8e19f..b30ff042c28fd 100644
--- a/clang/unittests/Basic/DarwinSDKInfoTest.cpp
+++ b/clang/unittests/Basic/DarwinSDKInfoTest.cpp
@@ -78,6 +78,38 @@ TEST(DarwinSDKInfo, VersionMappingParseError) {
.has_value());
}
+TEST(DarwinSDKInfo, SystemPrefix) {
+ llvm::json::Object SDKSettings(
+ {{"Version", "26.0"}, {"MaximumDeploymentTarget", "26.0.99"}});
+ llvm::json::Object SupportedTargets;
+ llvm::json::Object MacOS({{"Archs", {"x86_64", "arm64"}},
+ {"LLVMTargetTripleVendor", "apple"},
+ {"LLVMTargetTripleSys", "macos"},
+ {"LLVMTargetTripleEnvironment", ""},
+ {"SystemPrefix", ""}});
+ llvm::json::Object MacCatalyst({{"Archs", {"x86_64", "arm64"}},
+ {"LLVMTargetTripleVendor", "apple"},
+ {"LLVMTargetTripleSys", "ios"},
+ {"LLVMTargetTripleEnvironment", "macabi"},
+ {"SystemPrefix", "/System/iOSSupport"}});
+ llvm::json::Object DriverKit({{"Archs", {"x86_64", "arm64"}},
+ {"LLVMTargetTripleVendor", "apple"},
+ {"LLVMTargetTripleSys", "driverkit"},
+ {"LLVMTargetTripleEnvironment", ""},
+ {"SystemPrefix", "/System/DriverKit"}});
+ SupportedTargets["macosx"] = std::move(MacOS);
+ SupportedTargets["iosmac"] = std::move(MacCatalyst);
+ SupportedTargets["driverkit"] = std::move(DriverKit);
+ SDKSettings["SupportedTargets"] = std::move(SupportedTargets);
+
+ auto SDKInfo = DarwinSDKInfo::parseDarwinSDKSettingsJSON(&SDKSettings);
+ ASSERT_TRUE(SDKInfo);
+ EXPECT_EQ(SDKInfo->getSystemPrefix(Triple("arm64-apple-macos26.0")), "");
+ EXPECT_EQ(SDKInfo->getSystemPrefix(Triple("arm64-apple-ios26.0-macabi")), "");
+ EXPECT_EQ(SDKInfo->getSystemPrefix(Triple("arm64-apple-driverkit")),
+ "/System/DriverKit");
+}
+
TEST(DarwinSDKInfoTest, ParseAndTestMappingMacCatalyst) {
llvm::json::Object Obj;
Obj["Version"] = "11.0";
diff --git a/llvm/include/llvm/TargetParser/Triple.h b/llvm/include/llvm/TargetParser/Triple.h
index 11b76cd183108..09f78fa8eba30 100644
--- a/llvm/include/llvm/TargetParser/Triple.h
+++ b/llvm/include/llvm/TargetParser/Triple.h
@@ -9,6 +9,7 @@
#ifndef LLVM_TARGETPARSER_TRIPLE_H
#define LLVM_TARGETPARSER_TRIPLE_H
+#include "llvm/ADT/DenseMapInfo.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/VersionTuple.h"
@@ -202,7 +203,8 @@ class Triple {
OpenEmbedded,
Intel,
Meta,
- LastVendorType = Meta
+ LastVendorType = Meta,
+ TombstoneVendor = LastVendorType + 1
};
enum OSType {
UnknownOS,
@@ -1364,6 +1366,27 @@ class Triple {
LLVM_ABI std::string computeDataLayout(StringRef ABIName = "") const;
};
+inline hash_code hash_value(const Triple &Val) {
+ return hash_combine(Val.getArch(), Val.getSubArch(), Val.getVendor(),
+ Val.getOS(), Val.getEnvironment(), Val.getObjectFormat());
+}
+
+template <> struct DenseMapInfo<Triple> {
+ static inline Triple getEmptyKey() { return Triple(); }
+
+ static inline Triple getTombstoneKey() {
+ Triple TombstoneKey;
+ TombstoneKey.setVendor(Triple::TombstoneVendor);
+ return TombstoneKey;
+ }
+
+ static unsigned getHashValue(const Triple &Val) { return hash_value(Val); }
+
+ static bool isEqual(const Triple &LHS, const Triple &RHS) {
+ return LHS == RHS;
+ }
+};
+
} // End llvm namespace
diff --git a/llvm/lib/TargetParser/Triple.cpp b/llvm/lib/TargetParser/Triple.cpp
index 11ba9ee32f66a..c468aa778fd93 100644
--- a/llvm/lib/TargetParser/Triple.cpp
+++ b/llvm/lib/TargetParser/Triple.cpp
@@ -281,6 +281,8 @@ StringRef Triple::getVendorTypeName(VendorType Kind) {
case SUSE: return "suse";
case Meta:
return "meta";
+ case TombstoneVendor:
+ return "tombstone";
}
llvm_unreachable("Invalid VendorType!");
diff --git a/llvm/unittests/TargetParser/TripleTest.cpp b/llvm/unittests/TargetParser/TripleTest.cpp
index df8284d7be66a..96fd798e9f53a 100644
--- a/llvm/unittests/TargetParser/TripleTest.cpp
+++ b/llvm/unittests/TargetParser/TripleTest.cpp
@@ -3325,6 +3325,19 @@ TEST(TripleTest, isCompatibleWith) {
}
}
+TEST(TripleTest, equalsAndHash) {
+ EXPECT_EQ(Triple("arm64-apple-ios26.0"), Triple("arm64-apple-ios26.0"));
+ EXPECT_EQ(Triple("arm64-apple-ios26.0"), Triple("arm64-apple-ios26.1"));
+ EXPECT_NE(Triple("arm64-apple-ios26.0"), Triple("arm64-apple-macos26.0"));
+ EXPECT_NE(Triple("arm64-apple-ios26.0"),
+ Triple("arm64-apple-ios26.0-macabi"));
+
+ EXPECT_EQ(hash_value(Triple("arm64-apple-ios26.0")),
+ hash_value(Triple("arm64-apple-ios26.0")));
+ EXPECT_EQ(hash_value(Triple("arm64-apple-ios26.0")),
+ hash_value(Triple("arm64-apple-ios26.1")));
+}
+
TEST(DataLayoutTest, UEFI) {
Triple TT = Triple("x86_64-unknown-uefi");
>From f36adb42947cb9fcc88192a5bd5d25e72c441089 Mon Sep 17 00:00:00 2001
From: Ian Anderson <iana at apple.com>
Date: Thu, 11 Dec 2025 11:17:40 -0800
Subject: [PATCH 2/2] Use unordered_map instead of SmallDenseMap
---
clang/include/clang/Basic/DarwinSDKInfo.h | 9 +++---
clang/lib/Basic/DarwinSDKInfo.cpp | 6 ++--
llvm/include/llvm/TargetParser/Triple.h | 33 +++++++---------------
llvm/lib/TargetParser/Triple.cpp | 2 --
llvm/unittests/TargetParser/TripleTest.cpp | 8 +++---
5 files changed, 22 insertions(+), 36 deletions(-)
diff --git a/clang/include/clang/Basic/DarwinSDKInfo.h b/clang/include/clang/Basic/DarwinSDKInfo.h
index 41ecca4dc4c3a..ffe7be0cefb4a 100644
--- a/clang/include/clang/Basic/DarwinSDKInfo.h
+++ b/clang/include/clang/Basic/DarwinSDKInfo.h
@@ -16,6 +16,7 @@
#include "llvm/Support/VirtualFileSystem.h"
#include "llvm/TargetParser/Triple.h"
#include <optional>
+#include <unordered_map>
namespace llvm {
namespace json {
@@ -144,8 +145,8 @@ class DarwinSDKInfo {
DarwinSDKInfo(
VersionTuple Version, VersionTuple MaximumDeploymentTarget,
llvm::Triple::OSType OS,
- llvm::SmallDenseMap<llvm::Triple, std::string> SystemPrefixes =
- llvm::SmallDenseMap<llvm::Triple, std::string>(),
+ std::unordered_map<llvm::Triple, std::string> SystemPrefixes =
+ std::unordered_map<llvm::Triple, std::string>(),
llvm::DenseMap<OSEnvPair::StorageType,
std::optional<RelatedTargetVersionMapping>>
VersionMappings =
@@ -163,7 +164,7 @@ class DarwinSDKInfo {
auto SystemPrefix = SystemPrefixes.find(Triple);
if (SystemPrefix == SystemPrefixes.end())
return StringRef();
- return SystemPrefix->getSecond();
+ return SystemPrefix->second;
}
// Returns the optional, target-specific version mapping that maps from one
@@ -191,7 +192,7 @@ class DarwinSDKInfo {
VersionTuple Version;
VersionTuple MaximumDeploymentTarget;
llvm::Triple::OSType OS;
- llvm::SmallDenseMap<llvm::Triple, std::string> SystemPrefixes;
+ std::unordered_map<llvm::Triple, std::string> SystemPrefixes;
// Need to wrap the value in an optional here as the value has to be default
// constructible, and std::unique_ptr doesn't like DarwinSDKInfo being
// Optional as Optional is trying to copy it in emplace.
diff --git a/clang/lib/Basic/DarwinSDKInfo.cpp b/clang/lib/Basic/DarwinSDKInfo.cpp
index a41dbe45f2230..2d2d0115d52c1 100644
--- a/clang/lib/Basic/DarwinSDKInfo.cpp
+++ b/clang/lib/Basic/DarwinSDKInfo.cpp
@@ -85,10 +85,10 @@ static llvm::Triple::OSType parseOS(const llvm::json::Object &Obj) {
.Default(llvm::Triple::UnknownOS);
}
-static llvm::SmallDenseMap<llvm::Triple, std::string>
+static std::unordered_map<llvm::Triple, std::string>
parseSystemPrefixes(const llvm::json::Object &Obj, llvm::Triple::OSType SDKOS,
VersionTuple Version) {
- llvm::SmallDenseMap<llvm::Triple, std::string> SystemPrefixes;
+ std::unordered_map<llvm::Triple, std::string> SystemPrefixes;
auto SupportedTargets = Obj.getObject("SupportedTargets");
if (!SupportedTargets)
return SystemPrefixes;
@@ -152,7 +152,7 @@ DarwinSDKInfo::parseDarwinSDKSettingsJSON(const llvm::json::Object *Obj) {
if (!MaximumDeploymentVersion)
return std::nullopt;
llvm::Triple::OSType OS = parseOS(*Obj);
- llvm::SmallDenseMap<llvm::Triple, std::string> SystemPrefixes =
+ std::unordered_map<llvm::Triple, std::string> SystemPrefixes =
parseSystemPrefixes(*Obj, OS, *Version);
llvm::DenseMap<OSEnvPair::StorageType,
std::optional<RelatedTargetVersionMapping>>
diff --git a/llvm/include/llvm/TargetParser/Triple.h b/llvm/include/llvm/TargetParser/Triple.h
index 09f78fa8eba30..b9ba80cd37452 100644
--- a/llvm/include/llvm/TargetParser/Triple.h
+++ b/llvm/include/llvm/TargetParser/Triple.h
@@ -9,10 +9,10 @@
#ifndef LLVM_TARGETPARSER_TRIPLE_H
#define LLVM_TARGETPARSER_TRIPLE_H
-#include "llvm/ADT/DenseMapInfo.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/VersionTuple.h"
+#include <functional>
// Some system headers or GCC predefined macros conflict with identifiers in
// this file. Undefine them here.
@@ -203,8 +203,7 @@ class Triple {
OpenEmbedded,
Intel,
Meta,
- LastVendorType = Meta,
- TombstoneVendor = LastVendorType + 1
+ LastVendorType = Meta
};
enum OSType {
UnknownOS,
@@ -1366,28 +1365,16 @@ class Triple {
LLVM_ABI std::string computeDataLayout(StringRef ABIName = "") const;
};
-inline hash_code hash_value(const Triple &Val) {
- return hash_combine(Val.getArch(), Val.getSubArch(), Val.getVendor(),
- Val.getOS(), Val.getEnvironment(), Val.getObjectFormat());
-}
-
-template <> struct DenseMapInfo<Triple> {
- static inline Triple getEmptyKey() { return Triple(); }
-
- static inline Triple getTombstoneKey() {
- Triple TombstoneKey;
- TombstoneKey.setVendor(Triple::TombstoneVendor);
- return TombstoneKey;
- }
-
- static unsigned getHashValue(const Triple &Val) { return hash_value(Val); }
+} // End llvm namespace
- static bool isEqual(const Triple &LHS, const Triple &RHS) {
- return LHS == RHS;
+namespace std {
+template <> struct hash<llvm::Triple> {
+ size_t operator()(const llvm::Triple &Val) const {
+ return hash_combine(Val.getArch(), Val.getSubArch(), Val.getVendor(),
+ Val.getOS(), Val.getEnvironment(),
+ Val.getObjectFormat());
}
};
-
-} // End llvm namespace
-
+} // namespace std
#endif
diff --git a/llvm/lib/TargetParser/Triple.cpp b/llvm/lib/TargetParser/Triple.cpp
index c468aa778fd93..11ba9ee32f66a 100644
--- a/llvm/lib/TargetParser/Triple.cpp
+++ b/llvm/lib/TargetParser/Triple.cpp
@@ -281,8 +281,6 @@ StringRef Triple::getVendorTypeName(VendorType Kind) {
case SUSE: return "suse";
case Meta:
return "meta";
- case TombstoneVendor:
- return "tombstone";
}
llvm_unreachable("Invalid VendorType!");
diff --git a/llvm/unittests/TargetParser/TripleTest.cpp b/llvm/unittests/TargetParser/TripleTest.cpp
index 96fd798e9f53a..55254f8f3ddb0 100644
--- a/llvm/unittests/TargetParser/TripleTest.cpp
+++ b/llvm/unittests/TargetParser/TripleTest.cpp
@@ -3332,10 +3332,10 @@ TEST(TripleTest, equalsAndHash) {
EXPECT_NE(Triple("arm64-apple-ios26.0"),
Triple("arm64-apple-ios26.0-macabi"));
- EXPECT_EQ(hash_value(Triple("arm64-apple-ios26.0")),
- hash_value(Triple("arm64-apple-ios26.0")));
- EXPECT_EQ(hash_value(Triple("arm64-apple-ios26.0")),
- hash_value(Triple("arm64-apple-ios26.1")));
+ EXPECT_EQ(std::hash<Triple>{}(Triple("arm64-apple-ios26.0")),
+ std::hash<Triple>{}(Triple("arm64-apple-ios26.0")));
+ EXPECT_EQ(std::hash<Triple>{}(Triple("arm64-apple-ios26.0")),
+ std::hash<Triple>{}(Triple("arm64-apple-ios26.1")));
}
TEST(DataLayoutTest, UEFI) {
More information about the llvm-commits
mailing list