================
@@ -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