123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- //===- OpenMP/OMPContext.h ----- OpenMP context helper functions - C++ -*-===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- /// \file
- ///
- /// This file provides helper functions and classes to deal with OpenMP
- /// contexts as used by `[begin/end] declare variant` and `metadirective`.
- ///
- //===----------------------------------------------------------------------===//
- #ifndef LLVM_FRONTEND_OPENMP_OMPCONTEXT_H
- #define LLVM_FRONTEND_OPENMP_OMPCONTEXT_H
- #include "llvm/ADT/APInt.h"
- #include "llvm/ADT/BitVector.h"
- #include "llvm/ADT/DenseMap.h"
- #include "llvm/ADT/DenseMapInfo.h"
- #include "llvm/Frontend/OpenMP/OMPConstants.h"
- namespace llvm {
- class Triple;
- namespace omp {
- /// OpenMP Context related IDs and helpers
- ///
- ///{
- /// IDs for all OpenMP context selector trait sets (construct/device/...).
- enum class TraitSet {
- #define OMP_TRAIT_SET(Enum, ...) Enum,
- #include "llvm/Frontend/OpenMP/OMPKinds.def"
- };
- /// IDs for all OpenMP context selector trait (device={kind/isa...}/...).
- enum class TraitSelector {
- #define OMP_TRAIT_SELECTOR(Enum, ...) Enum,
- #include "llvm/Frontend/OpenMP/OMPKinds.def"
- };
- /// IDs for all OpenMP context trait properties (host/gpu/bsc/llvm/...)
- enum class TraitProperty {
- #define OMP_TRAIT_PROPERTY(Enum, ...) Enum,
- #define OMP_LAST_TRAIT_PROPERTY(Enum) Last = Enum
- #include "llvm/Frontend/OpenMP/OMPKinds.def"
- };
- /// Parse \p Str and return the trait set it matches or TraitSet::invalid.
- TraitSet getOpenMPContextTraitSetKind(StringRef Str);
- /// Return the trait set for which \p Selector is a selector.
- TraitSet getOpenMPContextTraitSetForSelector(TraitSelector Selector);
- /// Return the trait set for which \p Property is a property.
- TraitSet getOpenMPContextTraitSetForProperty(TraitProperty Property);
- /// Return a textual representation of the trait set \p Kind.
- StringRef getOpenMPContextTraitSetName(TraitSet Kind);
- /// Parse \p Str and return the trait set it matches or
- /// TraitSelector::invalid.
- TraitSelector getOpenMPContextTraitSelectorKind(StringRef Str);
- /// Return the trait selector for which \p Property is a property.
- TraitSelector getOpenMPContextTraitSelectorForProperty(TraitProperty Property);
- /// Return a textual representation of the trait selector \p Kind.
- StringRef getOpenMPContextTraitSelectorName(TraitSelector Kind);
- /// Parse \p Str and return the trait property it matches in the set \p Set and
- /// selector \p Selector or TraitProperty::invalid.
- TraitProperty getOpenMPContextTraitPropertyKind(TraitSet Set,
- TraitSelector Selector,
- StringRef Str);
- /// Return the trait property for a singleton selector \p Selector.
- TraitProperty getOpenMPContextTraitPropertyForSelector(TraitSelector Selector);
- /// Return a textual representation of the trait property \p Kind, which might
- /// be the raw string we parsed (\p RawString) if we do not translate the
- /// property into a (distinct) enum.
- StringRef getOpenMPContextTraitPropertyName(TraitProperty Kind,
- StringRef RawString);
- /// Return a textual representation of the trait property \p Kind with selector
- /// and set name included.
- StringRef getOpenMPContextTraitPropertyFullName(TraitProperty Kind);
- /// Return a string listing all trait sets.
- std::string listOpenMPContextTraitSets();
- /// Return a string listing all trait selectors for \p Set.
- std::string listOpenMPContextTraitSelectors(TraitSet Set);
- /// Return a string listing all trait properties for \p Set and \p Selector.
- std::string listOpenMPContextTraitProperties(TraitSet Set,
- TraitSelector Selector);
- ///}
- /// Return true if \p Selector can be nested in \p Set. Also sets
- /// \p AllowsTraitScore and \p RequiresProperty to true/false if the user can
- /// specify a score for properties in \p Selector and if the \p Selector
- /// requires at least one property.
- bool isValidTraitSelectorForTraitSet(TraitSelector Selector, TraitSet Set,
- bool &AllowsTraitScore,
- bool &RequiresProperty);
- /// Return true if \p Property can be nested in \p Selector and \p Set.
- bool isValidTraitPropertyForTraitSetAndSelector(TraitProperty Property,
- TraitSelector Selector,
- TraitSet Set);
- /// Variant match information describes the required traits and how they are
- /// scored (via the ScoresMap). In addition, the required consturct nesting is
- /// decribed as well.
- struct VariantMatchInfo {
- /// Add the trait \p Property to the required trait set. \p RawString is the
- /// string we parsed and derived \p Property from. If \p Score is not null, it
- /// recorded as well. If \p Property is in the `construct` set it is recorded
- /// in-order in the ConstructTraits as well.
- void addTrait(TraitProperty Property, StringRef RawString,
- APInt *Score = nullptr) {
- addTrait(getOpenMPContextTraitSetForProperty(Property), Property, RawString,
- Score);
- }
- /// Add the trait \p Property which is in set \p Set to the required trait
- /// set. \p RawString is the string we parsed and derived \p Property from. If
- /// \p Score is not null, it recorded as well. If \p Set is the `construct`
- /// set it is recorded in-order in the ConstructTraits as well.
- void addTrait(TraitSet Set, TraitProperty Property, StringRef RawString,
- APInt *Score = nullptr) {
- if (Score)
- ScoreMap[Property] = *Score;
- // Special handling for `device={isa(...)}` as we do not match the enum but
- // the raw string.
- if (Property == TraitProperty::device_isa___ANY)
- ISATraits.push_back(RawString);
- RequiredTraits.set(unsigned(Property));
- if (Set == TraitSet::construct)
- ConstructTraits.push_back(Property);
- }
- BitVector RequiredTraits = BitVector(unsigned(TraitProperty::Last) + 1);
- SmallVector<StringRef, 8> ISATraits;
- SmallVector<TraitProperty, 8> ConstructTraits;
- SmallDenseMap<TraitProperty, APInt> ScoreMap;
- };
- /// The context for a source location is made up of active property traits,
- /// e.g., device={kind(host)}, and constructs traits which describe the nesting
- /// in OpenMP constructs at the location.
- struct OMPContext {
- OMPContext(bool IsDeviceCompilation, Triple TargetTriple);
- virtual ~OMPContext() = default;
- void addTrait(TraitProperty Property) {
- addTrait(getOpenMPContextTraitSetForProperty(Property), Property);
- }
- void addTrait(TraitSet Set, TraitProperty Property) {
- ActiveTraits.set(unsigned(Property));
- if (Set == TraitSet::construct)
- ConstructTraits.push_back(Property);
- }
- /// Hook for users to check if an ISA trait matches. The trait is described as
- /// the string that got parsed and it depends on the target and context if
- /// this matches or not.
- virtual bool matchesISATrait(StringRef) const { return false; }
- BitVector ActiveTraits = BitVector(unsigned(TraitProperty::Last) + 1);
- SmallVector<TraitProperty, 8> ConstructTraits;
- };
- /// Return true if \p VMI is applicable in \p Ctx, that is, all traits required
- /// by \p VMI are available in the OpenMP context \p Ctx. If \p DeviceSetOnly is
- /// true, only the device selector set, if present, are checked. Note that we
- /// still honor extension traits provided by the user.
- bool isVariantApplicableInContext(const VariantMatchInfo &VMI,
- const OMPContext &Ctx,
- bool DeviceSetOnly = false);
- /// Return the index (into \p VMIs) of the variant with the highest score
- /// from the ones applicble in \p Ctx. See llvm::isVariantApplicableInContext.
- int getBestVariantMatchForContext(const SmallVectorImpl<VariantMatchInfo> &VMIs,
- const OMPContext &Ctx);
- } // namespace omp
- template <> struct DenseMapInfo<omp::TraitProperty> {
- static inline omp::TraitProperty getEmptyKey() {
- return omp::TraitProperty(-1);
- }
- static inline omp::TraitProperty getTombstoneKey() {
- return omp::TraitProperty(-2);
- }
- static unsigned getHashValue(omp::TraitProperty val) {
- return std::hash<unsigned>{}(unsigned(val));
- }
- static bool isEqual(omp::TraitProperty LHS, omp::TraitProperty RHS) {
- return LHS == RHS;
- }
- };
- } // end namespace llvm
- #endif // LLVM_FRONTEND_OPENMP_OMPCONTEXT_H
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|