File indexing completed on 2026-05-10 08:43:55
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 #ifndef LLVM_FRONTEND_OPENMP_OMPCONTEXT_H
0016 #define LLVM_FRONTEND_OPENMP_OMPCONTEXT_H
0017
0018 #include "llvm/ADT/APInt.h"
0019 #include "llvm/ADT/BitVector.h"
0020 #include "llvm/ADT/DenseMap.h"
0021 #include "llvm/ADT/DenseMapInfo.h"
0022 #include "llvm/Frontend/OpenMP/OMPConstants.h"
0023
0024 namespace llvm {
0025 class Triple;
0026 namespace omp {
0027
0028
0029
0030
0031
0032
0033 enum class TraitSet {
0034 #define OMP_TRAIT_SET(Enum, ...) Enum,
0035 #include "llvm/Frontend/OpenMP/OMPKinds.def"
0036 };
0037
0038
0039 enum class TraitSelector {
0040 #define OMP_TRAIT_SELECTOR(Enum, ...) Enum,
0041 #include "llvm/Frontend/OpenMP/OMPKinds.def"
0042 };
0043
0044
0045 enum class TraitProperty {
0046 #define OMP_TRAIT_PROPERTY(Enum, ...) Enum,
0047 #define OMP_LAST_TRAIT_PROPERTY(Enum) Last = Enum
0048 #include "llvm/Frontend/OpenMP/OMPKinds.def"
0049 };
0050
0051
0052 TraitSet getOpenMPContextTraitSetKind(StringRef Str);
0053
0054
0055 TraitSet getOpenMPContextTraitSetForSelector(TraitSelector Selector);
0056
0057
0058 TraitSet getOpenMPContextTraitSetForProperty(TraitProperty Property);
0059
0060
0061 StringRef getOpenMPContextTraitSetName(TraitSet Kind);
0062
0063
0064
0065 TraitSelector getOpenMPContextTraitSelectorKind(StringRef Str);
0066
0067
0068 TraitSelector getOpenMPContextTraitSelectorForProperty(TraitProperty Property);
0069
0070
0071 StringRef getOpenMPContextTraitSelectorName(TraitSelector Kind);
0072
0073
0074
0075 TraitProperty getOpenMPContextTraitPropertyKind(TraitSet Set,
0076 TraitSelector Selector,
0077 StringRef Str);
0078
0079
0080 TraitProperty getOpenMPContextTraitPropertyForSelector(TraitSelector Selector);
0081
0082
0083
0084
0085 StringRef getOpenMPContextTraitPropertyName(TraitProperty Kind,
0086 StringRef RawString);
0087
0088
0089
0090 StringRef getOpenMPContextTraitPropertyFullName(TraitProperty Kind);
0091
0092
0093 std::string listOpenMPContextTraitSets();
0094
0095
0096 std::string listOpenMPContextTraitSelectors(TraitSet Set);
0097
0098
0099 std::string listOpenMPContextTraitProperties(TraitSet Set,
0100 TraitSelector Selector);
0101
0102
0103
0104
0105
0106
0107 bool isValidTraitSelectorForTraitSet(TraitSelector Selector, TraitSet Set,
0108 bool &AllowsTraitScore,
0109 bool &RequiresProperty);
0110
0111
0112 bool isValidTraitPropertyForTraitSetAndSelector(TraitProperty Property,
0113 TraitSelector Selector,
0114 TraitSet Set);
0115
0116
0117
0118
0119 struct VariantMatchInfo {
0120
0121
0122
0123
0124 void addTrait(TraitProperty Property, StringRef RawString,
0125 APInt *Score = nullptr) {
0126 addTrait(getOpenMPContextTraitSetForProperty(Property), Property, RawString,
0127 Score);
0128 }
0129
0130
0131
0132
0133 void addTrait(TraitSet Set, TraitProperty Property, StringRef RawString,
0134 APInt *Score = nullptr) {
0135 if (Score)
0136 ScoreMap[Property] = *Score;
0137
0138
0139
0140 if (Property == TraitProperty::device_isa___ANY)
0141 ISATraits.push_back(RawString);
0142
0143 RequiredTraits.set(unsigned(Property));
0144 if (Set == TraitSet::construct)
0145 ConstructTraits.push_back(Property);
0146 }
0147
0148 BitVector RequiredTraits = BitVector(unsigned(TraitProperty::Last) + 1);
0149 SmallVector<StringRef, 8> ISATraits;
0150 SmallVector<TraitProperty, 8> ConstructTraits;
0151 SmallDenseMap<TraitProperty, APInt> ScoreMap;
0152 };
0153
0154
0155
0156
0157 struct OMPContext {
0158 OMPContext(bool IsDeviceCompilation, Triple TargetTriple);
0159 virtual ~OMPContext() = default;
0160
0161 void addTrait(TraitProperty Property) {
0162 addTrait(getOpenMPContextTraitSetForProperty(Property), Property);
0163 }
0164 void addTrait(TraitSet Set, TraitProperty Property) {
0165 ActiveTraits.set(unsigned(Property));
0166 if (Set == TraitSet::construct)
0167 ConstructTraits.push_back(Property);
0168 }
0169
0170
0171
0172
0173 virtual bool matchesISATrait(StringRef) const { return false; }
0174
0175 BitVector ActiveTraits = BitVector(unsigned(TraitProperty::Last) + 1);
0176 SmallVector<TraitProperty, 8> ConstructTraits;
0177 };
0178
0179
0180
0181
0182
0183 bool isVariantApplicableInContext(const VariantMatchInfo &VMI,
0184 const OMPContext &Ctx,
0185 bool DeviceSetOnly = false);
0186
0187
0188
0189 int getBestVariantMatchForContext(const SmallVectorImpl<VariantMatchInfo> &VMIs,
0190 const OMPContext &Ctx);
0191
0192 }
0193
0194 template <> struct DenseMapInfo<omp::TraitProperty> {
0195 static inline omp::TraitProperty getEmptyKey() {
0196 return omp::TraitProperty(-1);
0197 }
0198 static inline omp::TraitProperty getTombstoneKey() {
0199 return omp::TraitProperty(-2);
0200 }
0201 static unsigned getHashValue(omp::TraitProperty val) {
0202 return std::hash<unsigned>{}(unsigned(val));
0203 }
0204 static bool isEqual(omp::TraitProperty LHS, omp::TraitProperty RHS) {
0205 return LHS == RHS;
0206 }
0207 };
0208
0209 }
0210 #endif