40 const llvm::json::Object &Obj, VersionTuple MaximumDeploymentTarget) {
41 VersionTuple
Min = VersionTuple(std::numeric_limits<unsigned>::max());
42 VersionTuple
Max = VersionTuple(0);
43 VersionTuple MinValue =
Min;
44 llvm::DenseMap<VersionTuple, VersionTuple> Mapping;
45 for (
const auto &KV : Obj) {
46 if (
auto Val = KV.getSecond().getAsString()) {
47 llvm::VersionTuple KeyVersion;
48 llvm::VersionTuple ValueVersion;
49 if (KeyVersion.tryParse(KV.getFirst()) || ValueVersion.tryParse(*Val))
51 Mapping[KeyVersion.normalize()] = ValueVersion;
56 if (ValueVersion < MinValue)
57 MinValue = ValueVersion;
63 Min,
Max, MinValue, MaximumDeploymentTarget, std::move(Mapping));
71 StringRef XcodePlatform;
72 if (
auto CanonicalName = Obj.getString(
"CanonicalName")) {
73 size_t VersionStart = CanonicalName->find_first_of(
"0123456789");
74 XcodePlatform = CanonicalName->slice(0, VersionStart);
78 auto SupportedTargets = Obj.getObject(
"SupportedTargets");
79 if (!SupportedTargets) {
82 if (XcodePlatform ==
"macosx") {
83 PlatformInfos.push_back({llvm::Triple::Apple, llvm::Triple::MacOSX,
84 llvm::Triple::UnknownEnvironment,
85 llvm::Triple::MachO,
""});
86 }
else if (XcodePlatform ==
"iphoneos") {
87 PlatformInfos.push_back({llvm::Triple::Apple, llvm::Triple::IOS,
88 llvm::Triple::UnknownEnvironment,
89 llvm::Triple::MachO,
""});
90 }
else if (XcodePlatform ==
"iphonesimulator") {
91 PlatformInfos.push_back({llvm::Triple::Apple, llvm::Triple::IOS,
92 llvm::Triple::Simulator, llvm::Triple::MachO,
94 }
else if (XcodePlatform ==
"appletvos") {
95 PlatformInfos.push_back({llvm::Triple::Apple, llvm::Triple::TvOS,
96 llvm::Triple::UnknownEnvironment,
97 llvm::Triple::MachO,
""});
98 }
else if (XcodePlatform ==
"appletvsimulator") {
99 PlatformInfos.push_back({llvm::Triple::Apple, llvm::Triple::TvOS,
100 llvm::Triple::Simulator, llvm::Triple::MachO,
102 }
else if (XcodePlatform ==
"watchos") {
103 PlatformInfos.push_back({llvm::Triple::Apple, llvm::Triple::WatchOS,
104 llvm::Triple::UnknownEnvironment,
105 llvm::Triple::MachO,
""});
106 }
else if (XcodePlatform ==
"watchsimulator") {
107 PlatformInfos.push_back({llvm::Triple::Apple, llvm::Triple::WatchOS,
108 llvm::Triple::Simulator, llvm::Triple::MachO,
110 }
else if (XcodePlatform ==
"driverkit") {
111 PlatformInfos.push_back({llvm::Triple::Apple, llvm::Triple::DriverKit,
112 llvm::Triple::UnknownEnvironment,
113 llvm::Triple::MachO,
"/System/DriverKit"});
115 llvm::reportFatalUsageError(
116 "Unrecognized CanonicalName in SDKSettings.json. SupportedTargets is "
117 "expected, or a recognized CanonicalName.");
119 return PlatformInfos;
122 for (
auto SupportedTargetPair : *SupportedTargets) {
123 llvm::json::Object *SupportedTarget =
124 SupportedTargetPair.getSecond().getAsObject();
125 auto Vendor = SupportedTarget->getString(
"LLVMTargetTripleVendor");
126 auto OS = SupportedTarget->getString(
"LLVMTargetTripleSys");
130 StringRef
Arch = llvm::Triple::getArchName(llvm::Triple::UnknownArch);
132 SupportedTarget->getString(
"LLVMTargetTripleEnvironment");
135 Triple = llvm::Triple(
Arch, *Vendor, *OS, *Environment);
137 Triple = llvm::Triple(
Arch, *Vendor, *OS);
139 StringRef PlatformOrVariant = SupportedTargetPair.getFirst();
141 StringRef EffectivePlatformPrefix;
143 if ((PlatformOrVariant !=
"iosmac") || (Version >= VersionTuple(99))) {
144 auto PlatformPrefix = SupportedTarget->getString(
"SystemPrefix");
145 if (PlatformPrefix) {
146 EffectivePlatformPrefix = *PlatformPrefix;
150 if ((Triple.getOS() == llvm::Triple::DriverKit) &&
151 (Version < VersionTuple(22, 1)))
152 EffectivePlatformPrefix =
"/System/DriverKit";
157 Triple.getVendor(), Triple.getOS(), Triple.getEnvironment(),
158 Triple.getObjectFormat(), EffectivePlatformPrefix);
159 if (PlatformOrVariant == XcodePlatform)
160 PlatformInfos.insert(PlatformInfos.begin(), PlatformInfo);
162 PlatformInfos.push_back(PlatformInfo);
164 return PlatformInfos;
183 auto MaximumDeploymentVersion =
185 if (!MaximumDeploymentVersion)
189 std::optional<RelatedTargetVersionMapping>>
191 if (
const auto *VM = Obj->getObject(
"VersionMap")) {
194 for (
const auto &KV : *VM) {
195 auto Pair = StringRef(KV.getFirst()).split(
"_");
196 if (Pair.first.compare_insensitive(
"ios") == 0) {
197 llvm::Triple TT(llvm::Twine(
"--") + Pair.second.lower());
198 if (TT.getOS() != llvm::Triple::UnknownOS) {
200 *KV.getSecond().getAsObject(), *MaximumDeploymentVersion);
202 VersionMappings[
OSEnvPair(llvm::Triple::IOS,
203 llvm::Triple::UnknownEnvironment,
205 llvm::Triple::UnknownEnvironment)
206 .Value] = std::move(Mapping);
211 if (
const auto *Mapping = VM->getObject(
"macOS_iOSMac")) {
213 *Mapping, *MaximumDeploymentVersion);
217 std::move(VersionMap);
219 if (
const auto *Mapping = VM->getObject(
"iOSMac_macOS")) {
221 *Mapping, *MaximumDeploymentVersion);
225 std::move(VersionMap);
230 std::move(*MaximumDeploymentVersion),
231 std::move(PlatformInfos), std::move(VersionMappings));