================
@@ -63,26 +63,90 @@ DarwinSDKInfo::RelatedTargetVersionMapping::parseJSON(
       Min, Max, MinValue, MaximumDeploymentTarget, std::move(Mapping));
 }
 
-static llvm::Triple::OSType parseOS(const llvm::json::Object &Obj) {
+static std::pair<llvm::Triple, std::unordered_map<llvm::Triple, std::string,
+                                                  DarwinSDKInfo::TripleHash,
+                                                  
DarwinSDKInfo::TripleEqualTo>>
+parseSupportedTargets(const llvm::json::Object &Obj, VersionTuple Version) {
   // The CanonicalName is the Xcode platform followed by a version, e.g.
-  // macosx16.0.
-  auto CanonicalName = Obj.getString("CanonicalName");
-  if (!CanonicalName)
-    return llvm::Triple::UnknownOS;
-  size_t VersionStart = CanonicalName->find_first_of("0123456789");
-  StringRef XcodePlatform = CanonicalName->slice(0, VersionStart);
-  return llvm::StringSwitch<llvm::Triple::OSType>(XcodePlatform)
-      .Case("macosx", llvm::Triple::MacOSX)
-      .Case("iphoneos", llvm::Triple::IOS)
-      .Case("iphonesimulator", llvm::Triple::IOS)
-      .Case("appletvos", llvm::Triple::TvOS)
-      .Case("appletvsimulator", llvm::Triple::TvOS)
-      .Case("watchos", llvm::Triple::WatchOS)
-      .Case("watchsimulator", llvm::Triple::WatchOS)
-      .Case("xros", llvm::Triple::XROS)
-      .Case("xrsimulator", llvm::Triple::XROS)
-      .Case("driverkit", llvm::Triple::DriverKit)
-      .Default(llvm::Triple::UnknownOS);
+  // macosx15.0.
+  StringRef XcodePlatform;
+  if (auto CanonicalName = Obj.getString("CanonicalName")) {
+    size_t VersionStart = CanonicalName->find_first_of("0123456789");
+    XcodePlatform = CanonicalName->slice(0, VersionStart);
+  }
+
+  std::unordered_map<llvm::Triple, std::string, DarwinSDKInfo::TripleHash,
+                     DarwinSDKInfo::TripleEqualTo>
+      SystemPrefixes;
+  auto SupportedTargets = Obj.getObject("SupportedTargets");
+  if (!SupportedTargets) {
+    // For older SDKs that don't have SupportedTargets, infer the triple from
+    // the Xcode platform.
+    llvm::Triple InferredTriple;
+    InferredTriple.setVendor(llvm::Triple::Apple);
+    if (XcodePlatform == "macosx") {
+      InferredTriple.setOS(llvm::Triple::MacOSX);
+    } else if (XcodePlatform == "iphoneos") {
+      InferredTriple.setOS(llvm::Triple::IOS);
+    } else if (XcodePlatform == "iphonesimulator") {
+      InferredTriple.setOS(llvm::Triple::IOS);
+      InferredTriple.setEnvironment(llvm::Triple::Simulator);
+    } else if (XcodePlatform == "appletvos") {
+      InferredTriple.setOS(llvm::Triple::TvOS);
+    } else if (XcodePlatform == "appletvsimulator") {
+      InferredTriple.setOS(llvm::Triple::TvOS);
+      InferredTriple.setEnvironment(llvm::Triple::Simulator);
+    } else if (XcodePlatform == "watchos") {
+      InferredTriple.setOS(llvm::Triple::WatchOS);
+    } else if (XcodePlatform == "watchsimulator") {
+      InferredTriple.setOS(llvm::Triple::WatchOS);
+      InferredTriple.setEnvironment(llvm::Triple::Simulator);
+    } else if (XcodePlatform == "driverkit") {
+      InferredTriple.setOS(llvm::Triple::DriverKit);
+    }
+    return {InferredTriple, SystemPrefixes};
+  }
+
+  llvm::Triple PlatformTriple;
+  for (auto SupportedTargetPair : *SupportedTargets) {
+    llvm::json::Object *SupportedTarget =
+        SupportedTargetPair.getSecond().getAsObject();
+    auto Vendor = SupportedTarget->getString("LLVMTargetTripleVendor");
+    auto OS = SupportedTarget->getString("LLVMTargetTripleSys");
+    if (!Vendor || !OS)
+      continue;
+
+    StringRef Arch = llvm::Triple::getArchName(llvm::Triple::UnknownArch);
+    auto Environment =
+        SupportedTarget->getString("LLVMTargetTripleEnvironment");
+    llvm::Triple Triple;
+    if (Environment)
+      Triple = llvm::Triple(Arch, *Vendor, *OS, *Environment);
+    else
+      Triple = llvm::Triple(Arch, *Vendor, *OS);
+
+    StringRef PlatformOrVariant = SupportedTargetPair.getFirst();
+    if (PlatformOrVariant == XcodePlatform)
+      PlatformTriple = Triple;
+
+    if ((PlatformOrVariant == "iosmac") && (Version < VersionTuple(99))) {
+      // iosmac has an invalid SystemPrefix, ignore it.
----------------
cyndyishida wrote:

What's the expectation here if that gets fixed? Does one need to go back and 
update this code? 

https://github.com/llvm/llvm-project/pull/171970
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to