diff options
Diffstat (limited to 'contrib/llvm-project/clang/lib/Basic/TargetID.cpp')
-rw-r--r-- | contrib/llvm-project/clang/lib/Basic/TargetID.cpp | 58 |
1 files changed, 39 insertions, 19 deletions
diff --git a/contrib/llvm-project/clang/lib/Basic/TargetID.cpp b/contrib/llvm-project/clang/lib/Basic/TargetID.cpp index 59d416f0e015..3c06d9bad1dc 100644 --- a/contrib/llvm-project/clang/lib/Basic/TargetID.cpp +++ b/contrib/llvm-project/clang/lib/Basic/TargetID.cpp @@ -8,14 +8,15 @@ #include "clang/Basic/TargetID.h" #include "llvm/ADT/SmallSet.h" -#include "llvm/ADT/Triple.h" -#include "llvm/Support/TargetParser.h" #include "llvm/Support/raw_ostream.h" +#include "llvm/TargetParser/TargetParser.h" +#include "llvm/TargetParser/Triple.h" #include <map> +#include <optional> namespace clang { -static const llvm::SmallVector<llvm::StringRef, 4> +static llvm::SmallVector<llvm::StringRef, 4> getAllPossibleAMDGPUTargetIDFeatures(const llvm::Triple &T, llvm::StringRef Proc) { // Entries in returned vector should be in alphabetical order. @@ -33,7 +34,7 @@ getAllPossibleAMDGPUTargetIDFeatures(const llvm::Triple &T, return Ret; } -const llvm::SmallVector<llvm::StringRef, 4> +llvm::SmallVector<llvm::StringRef, 4> getAllPossibleTargetIDFeatures(const llvm::Triple &T, llvm::StringRef Processor) { llvm::SmallVector<llvm::StringRef, 4> Ret; @@ -62,7 +63,7 @@ llvm::StringRef getProcessorFromTargetID(const llvm::Triple &T, // A target ID is a processor name followed by a list of target features // delimited by colon. Each target feature is a string post-fixed by a plus // or minus sign, e.g. gfx908:sramecc+:xnack-. -static llvm::Optional<llvm::StringRef> +static std::optional<llvm::StringRef> parseTargetIDWithFormatCheckingOnly(llvm::StringRef TargetID, llvm::StringMap<bool> *FeatureMap) { llvm::StringRef Processor; @@ -73,7 +74,7 @@ parseTargetIDWithFormatCheckingOnly(llvm::StringRef TargetID, auto Split = TargetID.split(':'); Processor = Split.first; if (Processor.empty()) - return llvm::None; + return std::nullopt; auto Features = Split.second; if (Features.empty()) @@ -88,31 +89,30 @@ parseTargetIDWithFormatCheckingOnly(llvm::StringRef TargetID, auto Sign = Splits.first.back(); auto Feature = Splits.first.drop_back(); if (Sign != '+' && Sign != '-') - return llvm::None; + return std::nullopt; bool IsOn = Sign == '+'; auto Loc = FeatureMap->find(Feature); // Each feature can only show up at most once in target ID. if (Loc != FeatureMap->end()) - return llvm::None; + return std::nullopt; (*FeatureMap)[Feature] = IsOn; Features = Splits.second; } return Processor; } -llvm::Optional<llvm::StringRef> +std::optional<llvm::StringRef> parseTargetID(const llvm::Triple &T, llvm::StringRef TargetID, llvm::StringMap<bool> *FeatureMap) { auto OptionalProcessor = parseTargetIDWithFormatCheckingOnly(TargetID, FeatureMap); if (!OptionalProcessor) - return llvm::None; + return std::nullopt; - llvm::StringRef Processor = - getCanonicalProcessorName(T, OptionalProcessor.getValue()); + llvm::StringRef Processor = getCanonicalProcessorName(T, *OptionalProcessor); if (Processor.empty()) - return llvm::None; + return std::nullopt; llvm::SmallSet<llvm::StringRef, 4> AllFeatures; for (auto &&F : getAllPossibleTargetIDFeatures(T, Processor)) @@ -120,7 +120,7 @@ parseTargetID(const llvm::Triple &T, llvm::StringRef TargetID, for (auto &&F : *FeatureMap) if (!AllFeatures.count(F.first())) - return llvm::None; + return std::nullopt; return Processor; } @@ -133,7 +133,7 @@ std::string getCanonicalTargetID(llvm::StringRef Processor, std::map<const llvm::StringRef, bool> OrderedMap; for (const auto &F : Features) OrderedMap[F.first()] = F.second; - for (auto F : OrderedMap) + for (const auto &F : OrderedMap) TargetID = TargetID + ':' + F.first.str() + (F.second ? "+" : "-"); return TargetID; } @@ -141,7 +141,7 @@ std::string getCanonicalTargetID(llvm::StringRef Processor, // For a specific processor, a feature either shows up in all target IDs, or // does not show up in any target IDs. Otherwise the target ID combination // is invalid. -llvm::Optional<std::pair<llvm::StringRef, llvm::StringRef>> +std::optional<std::pair<llvm::StringRef, llvm::StringRef>> getConflictTargetIDCombination(const std::set<llvm::StringRef> &TargetIDs) { struct Info { llvm::StringRef TargetID; @@ -150,8 +150,7 @@ getConflictTargetIDCombination(const std::set<llvm::StringRef> &TargetIDs) { llvm::StringMap<Info> FeatureMap; for (auto &&ID : TargetIDs) { llvm::StringMap<bool> Features; - llvm::StringRef Proc = - parseTargetIDWithFormatCheckingOnly(ID, &Features).getValue(); + llvm::StringRef Proc = *parseTargetIDWithFormatCheckingOnly(ID, &Features); auto Loc = FeatureMap.find(Proc); if (Loc == FeatureMap.end()) FeatureMap[Proc] = Info{ID, Features}; @@ -163,7 +162,28 @@ getConflictTargetIDCombination(const std::set<llvm::StringRef> &TargetIDs) { return std::make_pair(Loc->second.TargetID, ID); } } - return llvm::None; + return std::nullopt; +} + +bool isCompatibleTargetID(llvm::StringRef Provided, llvm::StringRef Requested) { + llvm::StringMap<bool> ProvidedFeatures, RequestedFeatures; + llvm::StringRef ProvidedProc = + *parseTargetIDWithFormatCheckingOnly(Provided, &ProvidedFeatures); + llvm::StringRef RequestedProc = + *parseTargetIDWithFormatCheckingOnly(Requested, &RequestedFeatures); + if (ProvidedProc != RequestedProc) + return false; + for (const auto &F : ProvidedFeatures) { + auto Loc = RequestedFeatures.find(F.first()); + // The default (unspecified) value of a feature is 'All', which can match + // either 'On' or 'Off'. + if (Loc == RequestedFeatures.end()) + return false; + // If a feature is specified, it must have exact match. + if (Loc->second != F.second) + return false; + } + return true; } } // namespace clang |