diff options
Diffstat (limited to 'contrib/llvm-project/clang/lib/Basic/DarwinSDKInfo.cpp')
-rw-r--r-- | contrib/llvm-project/clang/lib/Basic/DarwinSDKInfo.cpp | 59 |
1 files changed, 40 insertions, 19 deletions
diff --git a/contrib/llvm-project/clang/lib/Basic/DarwinSDKInfo.cpp b/contrib/llvm-project/clang/lib/Basic/DarwinSDKInfo.cpp index fe35f77782c9..00aa5f9e63cd 100644 --- a/contrib/llvm-project/clang/lib/Basic/DarwinSDKInfo.cpp +++ b/contrib/llvm-project/clang/lib/Basic/DarwinSDKInfo.cpp @@ -11,12 +11,13 @@ #include "llvm/Support/JSON.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/Path.h" +#include <optional> using namespace clang; -Optional<VersionTuple> DarwinSDKInfo::RelatedTargetVersionMapping::map( +std::optional<VersionTuple> DarwinSDKInfo::RelatedTargetVersionMapping::map( const VersionTuple &Key, const VersionTuple &MinimumValue, - Optional<VersionTuple> MaximumValue) const { + std::optional<VersionTuple> MaximumValue) const { if (Key < MinimumKeyVersion) return MinimumValue; if (Key > MaximumKeyVersion) @@ -29,11 +30,11 @@ Optional<VersionTuple> DarwinSDKInfo::RelatedTargetVersionMapping::map( // the major-only check. if (Key.getMinor()) return map(VersionTuple(Key.getMajor()), MinimumValue, MaximumValue); - // If this a major only key, return None for a missing entry. - return None; + // If this a major only key, return std::nullopt for a missing entry. + return std::nullopt; } -Optional<DarwinSDKInfo::RelatedTargetVersionMapping> +std::optional<DarwinSDKInfo::RelatedTargetVersionMapping> DarwinSDKInfo::RelatedTargetVersionMapping::parseJSON( const llvm::json::Object &Obj, VersionTuple MaximumDeploymentTarget) { VersionTuple Min = VersionTuple(std::numeric_limits<unsigned>::max()); @@ -45,7 +46,7 @@ DarwinSDKInfo::RelatedTargetVersionMapping::parseJSON( llvm::VersionTuple KeyVersion; llvm::VersionTuple ValueVersion; if (KeyVersion.tryParse(KV.getFirst()) || ValueVersion.tryParse(*Val)) - return None; + return std::nullopt; Mapping[KeyVersion.normalize()] = ValueVersion; if (KeyVersion < Min) Min = KeyVersion; @@ -56,39 +57,59 @@ DarwinSDKInfo::RelatedTargetVersionMapping::parseJSON( } } if (Mapping.empty()) - return None; + return std::nullopt; return RelatedTargetVersionMapping( Min, Max, MinValue, MaximumDeploymentTarget, std::move(Mapping)); } -static Optional<VersionTuple> getVersionKey(const llvm::json::Object &Obj, - StringRef Key) { +static std::optional<VersionTuple> getVersionKey(const llvm::json::Object &Obj, + StringRef Key) { auto Value = Obj.getString(Key); if (!Value) - return None; + return std::nullopt; VersionTuple Version; if (Version.tryParse(*Value)) - return None; + return std::nullopt; return Version; } -Optional<DarwinSDKInfo> +std::optional<DarwinSDKInfo> DarwinSDKInfo::parseDarwinSDKSettingsJSON(const llvm::json::Object *Obj) { auto Version = getVersionKey(*Obj, "Version"); if (!Version) - return None; + return std::nullopt; auto MaximumDeploymentVersion = getVersionKey(*Obj, "MaximumDeploymentTarget"); if (!MaximumDeploymentVersion) - return None; - llvm::DenseMap<OSEnvPair::StorageType, Optional<RelatedTargetVersionMapping>> + return std::nullopt; + llvm::DenseMap<OSEnvPair::StorageType, + std::optional<RelatedTargetVersionMapping>> VersionMappings; if (const auto *VM = Obj->getObject("VersionMap")) { + // FIXME: Generalize this out beyond iOS-deriving targets. + // Look for ios_<targetos> version mapping for targets that derive from ios. + for (const auto &KV : *VM) { + auto Pair = StringRef(KV.getFirst()).split("_"); + if (Pair.first.compare_insensitive("ios") == 0) { + llvm::Triple TT(llvm::Twine("--") + Pair.second.lower()); + if (TT.getOS() != llvm::Triple::UnknownOS) { + auto Mapping = RelatedTargetVersionMapping::parseJSON( + *KV.getSecond().getAsObject(), *MaximumDeploymentVersion); + if (Mapping) + VersionMappings[OSEnvPair(llvm::Triple::IOS, + llvm::Triple::UnknownEnvironment, + TT.getOS(), + llvm::Triple::UnknownEnvironment) + .Value] = std::move(Mapping); + } + } + } + if (const auto *Mapping = VM->getObject("macOS_iOSMac")) { auto VersionMap = RelatedTargetVersionMapping::parseJSON( *Mapping, *MaximumDeploymentVersion); if (!VersionMap) - return None; + return std::nullopt; VersionMappings[OSEnvPair::macOStoMacCatalystPair().Value] = std::move(VersionMap); } @@ -96,7 +117,7 @@ DarwinSDKInfo::parseDarwinSDKSettingsJSON(const llvm::json::Object *Obj) { auto VersionMap = RelatedTargetVersionMapping::parseJSON( *Mapping, *MaximumDeploymentVersion); if (!VersionMap) - return None; + return std::nullopt; VersionMappings[OSEnvPair::macCatalystToMacOSPair().Value] = std::move(VersionMap); } @@ -107,7 +128,7 @@ DarwinSDKInfo::parseDarwinSDKSettingsJSON(const llvm::json::Object *Obj) { std::move(VersionMappings)); } -Expected<Optional<DarwinSDKInfo>> +Expected<std::optional<DarwinSDKInfo>> clang::parseDarwinSDKInfo(llvm::vfs::FileSystem &VFS, StringRef SDKRootPath) { llvm::SmallString<256> Filepath = SDKRootPath; llvm::sys::path::append(Filepath, "SDKSettings.json"); @@ -115,7 +136,7 @@ clang::parseDarwinSDKInfo(llvm::vfs::FileSystem &VFS, StringRef SDKRootPath) { VFS.getBufferForFile(Filepath); if (!File) { // If the file couldn't be read, assume it just doesn't exist. - return None; + return std::nullopt; } Expected<llvm::json::Value> Result = llvm::json::parse(File.get()->getBuffer()); |