diff --git a/clang/include/clang/Basic/DarwinSDKInfo.h b/clang/include/clang/Basic/DarwinSDKInfo.h index bc122c7d21c72..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 +#include namespace llvm { namespace json { @@ -144,18 +145,28 @@ class DarwinSDKInfo { DarwinSDKInfo( VersionTuple Version, VersionTuple MaximumDeploymentTarget, llvm::Triple::OSType OS, + std::unordered_map SystemPrefixes = + std::unordered_map(), llvm::DenseMap> VersionMappings = llvm::DenseMap>()) : 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->second; + } + // Returns the optional, target-specific version mapping that maps from one // target to another target. // @@ -181,6 +192,7 @@ class DarwinSDKInfo { VersionTuple Version; VersionTuple MaximumDeploymentTarget; llvm::Triple::OSType OS; + std::unordered_map 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..2d2d0115d52c1 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 std::unordered_map +parseSystemPrefixes(const llvm::json::Object &Obj, llvm::Triple::OSType SDKOS, + VersionTuple Version) { + std::unordered_map 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 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); + std::unordered_map SystemPrefixes = + parseSystemPrefixes(*Obj, OS, *Version); llvm::DenseMap> 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> diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp b/clang/lib/Driver/ToolChains/Darwin.cpp index fc3cd9030f71d..a6688df6f395e 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,15 @@ 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 // /System/DriverKit/usr/include (instead of /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) { + const StringRef SystemPrefix = SDKInfo->getSystemPrefix(T); + if (!SystemPrefix.empty()) + llvm::sys::path::append(Path, SystemPrefix); + } 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 9480e7b36dc2c..4688c83b1bba5 100644 --- a/llvm/include/llvm/TargetParser/Triple.h +++ b/llvm/include/llvm/TargetParser/Triple.h @@ -12,6 +12,7 @@ #include "llvm/ADT/StringRef.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/VersionTuple.h" +#include // Some system headers or GCC predefined macros conflict with identifiers in // this file. Undefine them here. @@ -1366,5 +1367,14 @@ class Triple { } // End llvm namespace +namespace std { +template <> struct hash { + size_t operator()(const llvm::Triple &Val) const { + return hash_combine(Val.getArch(), Val.getSubArch(), Val.getVendor(), + Val.getOS(), Val.getEnvironment(), + Val.getObjectFormat()); + } +}; +} // namespace std #endif diff --git a/llvm/unittests/TargetParser/TripleTest.cpp b/llvm/unittests/TargetParser/TripleTest.cpp index df8284d7be66a..92c42a9dcf98a 100644 --- a/llvm/unittests/TargetParser/TripleTest.cpp +++ b/llvm/unittests/TargetParser/TripleTest.cpp @@ -3325,6 +3325,20 @@ 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")); + + std::hash Hasher; + EXPECT_EQ(Hasher(Triple("arm64-apple-ios26.0")), + Hasher(Triple("arm64-apple-ios26.0"))); + EXPECT_EQ(Hasher(Triple("arm64-apple-ios26.0")), + Hasher(Triple("arm64-apple-ios26.1"))); +} + TEST(DataLayoutTest, UEFI) { Triple TT = Triple("x86_64-unknown-uefi");