1 //===- OMPConstants.h - OpenMP related constants and helpers ------ C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 /// \file 9 /// 10 /// This file defines constans and helpers used when dealing with OpenMP. 11 /// 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_FRONTEND_OPENMP_OMPCONSTANTS_H 15 #define LLVM_FRONTEND_OPENMP_OMPCONSTANTS_H 16 17 #include "llvm/ADT/BitmaskEnum.h" 18 19 #include "llvm/ADT/StringRef.h" 20 #include "llvm/Frontend/OpenMP/OMP.h.inc" 21 22 namespace llvm { 23 namespace omp { 24 LLVM_ENABLE_BITMASK_ENUMS_IN_NAMESPACE(); 25 26 /// IDs for all Internal Control Variables (ICVs). 27 enum class InternalControlVar { 28 #define ICV_DATA_ENV(Enum, ...) Enum, 29 #include "llvm/Frontend/OpenMP/OMPKinds.def" 30 }; 31 32 #define ICV_DATA_ENV(Enum, ...) \ 33 constexpr auto Enum = omp::InternalControlVar::Enum; 34 #include "llvm/Frontend/OpenMP/OMPKinds.def" 35 36 enum class ICVInitValue { 37 #define ICV_INIT_VALUE(Enum, Name) Enum, 38 #include "llvm/Frontend/OpenMP/OMPKinds.def" 39 }; 40 41 #define ICV_INIT_VALUE(Enum, Name) \ 42 constexpr auto Enum = omp::ICVInitValue::Enum; 43 #include "llvm/Frontend/OpenMP/OMPKinds.def" 44 45 /// IDs for all omp runtime library (RTL) functions. 46 enum class RuntimeFunction { 47 #define OMP_RTL(Enum, ...) Enum, 48 #include "llvm/Frontend/OpenMP/OMPKinds.def" 49 }; 50 51 #define OMP_RTL(Enum, ...) constexpr auto Enum = omp::RuntimeFunction::Enum; 52 #include "llvm/Frontend/OpenMP/OMPKinds.def" 53 54 /// IDs for the different default kinds. 55 enum class DefaultKind { 56 #define OMP_DEFAULT_KIND(Enum, Str) Enum, 57 #include "llvm/Frontend/OpenMP/OMPKinds.def" 58 }; 59 60 #define OMP_DEFAULT_KIND(Enum, ...) \ 61 constexpr auto Enum = omp::DefaultKind::Enum; 62 #include "llvm/Frontend/OpenMP/OMPKinds.def" 63 64 /// IDs for all omp runtime library ident_t flag encodings (see 65 /// their defintion in openmp/runtime/src/kmp.h). 66 enum class IdentFlag { 67 #define OMP_IDENT_FLAG(Enum, Str, Value) Enum = Value, 68 #include "llvm/Frontend/OpenMP/OMPKinds.def" 69 LLVM_MARK_AS_BITMASK_ENUM(0x7FFFFFFF) 70 }; 71 72 #define OMP_IDENT_FLAG(Enum, ...) constexpr auto Enum = omp::IdentFlag::Enum; 73 #include "llvm/Frontend/OpenMP/OMPKinds.def" 74 75 /// \note This needs to be kept in sync with kmp.h enum sched_type. 76 /// Todo: Update kmp.h to include this file, and remove the enums in kmp.h 77 enum class OMPScheduleType { 78 // For typed comparisons, not a valid schedule 79 None = 0, 80 81 // Schedule algorithms 82 BaseStaticChunked = 1, 83 BaseStatic = 2, 84 BaseDynamicChunked = 3, 85 BaseGuidedChunked = 4, 86 BaseRuntime = 5, 87 BaseAuto = 6, 88 BaseTrapezoidal = 7, 89 BaseGreedy = 8, 90 BaseBalanced = 9, 91 BaseGuidedIterativeChunked = 10, 92 BaseGuidedAnalyticalChunked = 11, 93 BaseSteal = 12, 94 95 // with chunk adjustment (e.g., simd) 96 BaseStaticBalancedChunked = 13, 97 BaseGuidedSimd = 14, 98 BaseRuntimeSimd = 15, 99 100 // static schedules algorithims for distribute 101 BaseDistributeChunked = 27, 102 BaseDistribute = 28, 103 104 // Modifier flags to be combined with schedule algorithms 105 ModifierUnordered = (1 << 5), 106 ModifierOrdered = (1 << 6), 107 ModifierNomerge = (1 << 7), 108 ModifierMonotonic = (1 << 29), 109 ModifierNonmonotonic = (1 << 30), 110 111 // Masks combining multiple flags 112 OrderingMask = ModifierUnordered | ModifierOrdered | ModifierNomerge, 113 MonotonicityMask = ModifierMonotonic | ModifierNonmonotonic, 114 ModifierMask = OrderingMask | MonotonicityMask, 115 116 // valid schedule type values, without monotonicity flags 117 UnorderedStaticChunked = BaseStaticChunked | ModifierUnordered, // 33 118 UnorderedStatic = BaseStatic | ModifierUnordered, // 34 119 UnorderedDynamicChunked = BaseDynamicChunked | ModifierUnordered, // 35 120 UnorderedGuidedChunked = BaseGuidedChunked | ModifierUnordered, // 36 121 UnorderedRuntime = BaseRuntime | ModifierUnordered, // 37 122 UnorderedAuto = BaseAuto | ModifierUnordered, // 38 123 UnorderedTrapezoidal = BaseTrapezoidal | ModifierUnordered, // 39 124 UnorderedGreedy = BaseGreedy | ModifierUnordered, // 40 125 UnorderedBalanced = BaseBalanced | ModifierUnordered, // 41 126 UnorderedGuidedIterativeChunked = 127 BaseGuidedIterativeChunked | ModifierUnordered, // 42 128 UnorderedGuidedAnalyticalChunked = 129 BaseGuidedAnalyticalChunked | ModifierUnordered, // 43 130 UnorderedSteal = BaseSteal | ModifierUnordered, // 44 131 132 UnorderedStaticBalancedChunked = 133 BaseStaticBalancedChunked | ModifierUnordered, // 45 134 UnorderedGuidedSimd = BaseGuidedSimd | ModifierUnordered, // 46 135 UnorderedRuntimeSimd = BaseRuntimeSimd | ModifierUnordered, // 47 136 137 OrderedStaticChunked = BaseStaticChunked | ModifierOrdered, // 65 138 OrderedStatic = BaseStatic | ModifierOrdered, // 66 139 OrderedDynamicChunked = BaseDynamicChunked | ModifierOrdered, // 67 140 OrderedGuidedChunked = BaseGuidedChunked | ModifierOrdered, // 68 141 OrderedRuntime = BaseRuntime | ModifierOrdered, // 69 142 OrderedAuto = BaseAuto | ModifierOrdered, // 70 143 OrderdTrapezoidal = BaseTrapezoidal | ModifierOrdered, // 71 144 145 OrderedDistributeChunked = BaseDistributeChunked | ModifierOrdered, // 91 146 OrderedDistribute = BaseDistribute | ModifierOrdered, // 92 147 148 NomergeUnorderedStaticChunked = 149 BaseStaticChunked | ModifierUnordered | ModifierNomerge, // 161 150 NomergeUnorderedStatic = 151 BaseStatic | ModifierUnordered | ModifierNomerge, // 162 152 NomergeUnorderedDynamicChunked = 153 BaseDynamicChunked | ModifierUnordered | ModifierNomerge, // 163 154 NomergeUnorderedGuidedChunked = 155 BaseGuidedChunked | ModifierUnordered | ModifierNomerge, // 164 156 NomergeUnorderedRuntime = 157 BaseRuntime | ModifierUnordered | ModifierNomerge, // 165 158 NomergeUnorderedAuto = BaseAuto | ModifierUnordered | ModifierNomerge, // 166 159 NomergeUnorderedTrapezoidal = 160 BaseTrapezoidal | ModifierUnordered | ModifierNomerge, // 167 161 NomergeUnorderedGreedy = 162 BaseGreedy | ModifierUnordered | ModifierNomerge, // 168 163 NomergeUnorderedBalanced = 164 BaseBalanced | ModifierUnordered | ModifierNomerge, // 169 165 NomergeUnorderedGuidedIterativeChunked = 166 BaseGuidedIterativeChunked | ModifierUnordered | ModifierNomerge, // 170 167 NomergeUnorderedGuidedAnalyticalChunked = 168 BaseGuidedAnalyticalChunked | ModifierUnordered | ModifierNomerge, // 171 169 NomergeUnorderedSteal = 170 BaseSteal | ModifierUnordered | ModifierNomerge, // 172 171 172 NomergeOrderedStaticChunked = 173 BaseStaticChunked | ModifierOrdered | ModifierNomerge, // 193 174 NomergeOrderedStatic = BaseStatic | ModifierOrdered | ModifierNomerge, // 194 175 NomergeOrderedDynamicChunked = 176 BaseDynamicChunked | ModifierOrdered | ModifierNomerge, // 195 177 NomergeOrderedGuidedChunked = 178 BaseGuidedChunked | ModifierOrdered | ModifierNomerge, // 196 179 NomergeOrderedRuntime = 180 BaseRuntime | ModifierOrdered | ModifierNomerge, // 197 181 NomergeOrderedAuto = BaseAuto | ModifierOrdered | ModifierNomerge, // 198 182 NomergeOrderedTrapezoidal = 183 BaseTrapezoidal | ModifierOrdered | ModifierNomerge, // 199 184 185 LLVM_MARK_AS_BITMASK_ENUM(/* LargestValue */ ModifierMask) 186 }; 187 188 enum OMPTgtExecModeFlags : int8_t { 189 OMP_TGT_EXEC_MODE_GENERIC = 1 << 0, 190 OMP_TGT_EXEC_MODE_SPMD = 1 << 1, 191 OMP_TGT_EXEC_MODE_GENERIC_SPMD = 192 OMP_TGT_EXEC_MODE_GENERIC | OMP_TGT_EXEC_MODE_SPMD, 193 LLVM_MARK_AS_BITMASK_ENUM(/* LargestValue */ OMP_TGT_EXEC_MODE_GENERIC_SPMD) 194 }; 195 196 enum class AddressSpace : unsigned { 197 Generic = 0, 198 Global = 1, 199 Shared = 3, 200 Constant = 4, 201 Local = 5, 202 }; 203 204 /// \note This needs to be kept in sync with interop.h enum kmp_interop_type_t.: 205 enum class OMPInteropType { Unknown, Target, TargetSync }; 206 207 /// Atomic compare operations. Currently OpenMP only supports ==, >, and <. 208 enum class OMPAtomicCompareOp : unsigned { EQ, MIN, MAX }; 209 210 } // end namespace omp 211 212 } // end namespace llvm 213 214 #endif // LLVM_FRONTEND_OPENMP_OMPCONSTANTS_H 215