File indexing completed on 2026-05-10 08:36:48
0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef LLVM_CLANG_BASIC_DARWINSDKINFO_H
0010 #define LLVM_CLANG_BASIC_DARWINSDKINFO_H
0011
0012 #include "clang/Basic/LLVM.h"
0013 #include "llvm/ADT/DenseMap.h"
0014 #include "llvm/Support/Error.h"
0015 #include "llvm/Support/VersionTuple.h"
0016 #include "llvm/Support/VirtualFileSystem.h"
0017 #include "llvm/TargetParser/Triple.h"
0018 #include <optional>
0019
0020 namespace llvm {
0021 namespace json {
0022 class Object;
0023 }
0024 }
0025
0026 namespace clang {
0027
0028
0029 class DarwinSDKInfo {
0030 public:
0031
0032
0033 struct OSEnvPair {
0034 public:
0035 using StorageType = uint64_t;
0036
0037 constexpr OSEnvPair(llvm::Triple::OSType FromOS,
0038 llvm::Triple::EnvironmentType FromEnv,
0039 llvm::Triple::OSType ToOS,
0040 llvm::Triple::EnvironmentType ToEnv)
0041 : Value(((StorageType(FromOS) * StorageType(llvm::Triple::LastOSType) +
0042 StorageType(FromEnv))
0043 << 32ull) |
0044 (StorageType(ToOS) * StorageType(llvm::Triple::LastOSType) +
0045 StorageType(ToEnv))) {}
0046
0047
0048
0049 static inline constexpr OSEnvPair macOStoMacCatalystPair() {
0050 return OSEnvPair(llvm::Triple::MacOSX, llvm::Triple::UnknownEnvironment,
0051 llvm::Triple::IOS, llvm::Triple::MacABI);
0052 }
0053
0054
0055
0056 static inline constexpr OSEnvPair macCatalystToMacOSPair() {
0057 return OSEnvPair(llvm::Triple::IOS, llvm::Triple::MacABI,
0058 llvm::Triple::MacOSX, llvm::Triple::UnknownEnvironment);
0059 }
0060
0061
0062
0063 static inline constexpr OSEnvPair iOStoWatchOSPair() {
0064 return OSEnvPair(llvm::Triple::IOS, llvm::Triple::UnknownEnvironment,
0065 llvm::Triple::WatchOS, llvm::Triple::UnknownEnvironment);
0066 }
0067
0068
0069
0070 static inline constexpr OSEnvPair iOStoTvOSPair() {
0071 return OSEnvPair(llvm::Triple::IOS, llvm::Triple::UnknownEnvironment,
0072 llvm::Triple::TvOS, llvm::Triple::UnknownEnvironment);
0073 }
0074
0075 private:
0076 StorageType Value;
0077
0078 friend class DarwinSDKInfo;
0079 };
0080
0081
0082
0083
0084
0085
0086 class RelatedTargetVersionMapping {
0087 public:
0088 RelatedTargetVersionMapping(
0089 VersionTuple MinimumKeyVersion, VersionTuple MaximumKeyVersion,
0090 VersionTuple MinimumValue, VersionTuple MaximumValue,
0091 llvm::DenseMap<VersionTuple, VersionTuple> Mapping)
0092 : MinimumKeyVersion(MinimumKeyVersion),
0093 MaximumKeyVersion(MaximumKeyVersion), MinimumValue(MinimumValue),
0094 MaximumValue(MaximumValue), Mapping(Mapping) {
0095 assert(!this->Mapping.empty() && "unexpected empty mapping");
0096 }
0097
0098
0099 const VersionTuple &getMinimumValue() const { return MinimumValue; }
0100
0101
0102
0103
0104 std::optional<VersionTuple>
0105 map(const VersionTuple &Key, const VersionTuple &MinimumValue,
0106 std::optional<VersionTuple> MaximumValue) const;
0107
0108
0109
0110
0111 std::optional<VersionTuple>
0112 mapIntroducedAvailabilityVersion(const VersionTuple &Key) const {
0113
0114 if (Key.getMajor() == 100000)
0115 return VersionTuple(100000);
0116
0117 return map(Key, MinimumValue, std::nullopt);
0118 }
0119
0120
0121
0122
0123
0124 std::optional<VersionTuple>
0125 mapDeprecatedObsoletedAvailabilityVersion(const VersionTuple &Key) const {
0126
0127 if (Key.getMajor() == 100000)
0128 return VersionTuple(100000);
0129 return map(Key, MinimumValue, MaximumValue);
0130 }
0131
0132 static std::optional<RelatedTargetVersionMapping>
0133 parseJSON(const llvm::json::Object &Obj,
0134 VersionTuple MaximumDeploymentTarget);
0135
0136 private:
0137 VersionTuple MinimumKeyVersion;
0138 VersionTuple MaximumKeyVersion;
0139 VersionTuple MinimumValue;
0140 VersionTuple MaximumValue;
0141 llvm::DenseMap<VersionTuple, VersionTuple> Mapping;
0142 };
0143
0144 DarwinSDKInfo(
0145 VersionTuple Version, VersionTuple MaximumDeploymentTarget,
0146 llvm::DenseMap<OSEnvPair::StorageType,
0147 std::optional<RelatedTargetVersionMapping>>
0148 VersionMappings =
0149 llvm::DenseMap<OSEnvPair::StorageType,
0150 std::optional<RelatedTargetVersionMapping>>())
0151 : Version(Version), MaximumDeploymentTarget(MaximumDeploymentTarget),
0152 VersionMappings(std::move(VersionMappings)) {}
0153
0154 const llvm::VersionTuple &getVersion() const { return Version; }
0155
0156
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167 const RelatedTargetVersionMapping *getVersionMapping(OSEnvPair Kind) const {
0168 auto Mapping = VersionMappings.find(Kind.Value);
0169 if (Mapping == VersionMappings.end())
0170 return nullptr;
0171 return Mapping->getSecond() ? &*Mapping->getSecond() : nullptr;
0172 }
0173
0174 static std::optional<DarwinSDKInfo>
0175 parseDarwinSDKSettingsJSON(const llvm::json::Object *Obj);
0176
0177 private:
0178 VersionTuple Version;
0179 VersionTuple MaximumDeploymentTarget;
0180
0181
0182
0183 llvm::DenseMap<OSEnvPair::StorageType,
0184 std::optional<RelatedTargetVersionMapping>>
0185 VersionMappings;
0186 };
0187
0188
0189
0190
0191
0192 Expected<std::optional<DarwinSDKInfo>>
0193 parseDarwinSDKInfo(llvm::vfs::FileSystem &VFS, StringRef SDKRootPath);
0194
0195 }
0196
0197 #endif