| 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 | // Version of the kernel argument format used by the omp runtime. |
| 76 | #define OMP_KERNEL_ARG_VERSION 2 |
| 77 | |
| 78 | /// \note This needs to be kept in sync with kmp.h enum sched_type. |
| 79 | /// Todo: Update kmp.h to include this file, and remove the enums in kmp.h |
| 80 | enum class OMPScheduleType { |
| 81 | // For typed comparisons, not a valid schedule |
| 82 | None = 0, |
| 83 | |
| 84 | // Schedule algorithms |
| 85 | BaseStaticChunked = 1, |
| 86 | BaseStatic = 2, |
| 87 | BaseDynamicChunked = 3, |
| 88 | BaseGuidedChunked = 4, |
| 89 | BaseRuntime = 5, |
| 90 | BaseAuto = 6, |
| 91 | BaseTrapezoidal = 7, |
| 92 | BaseGreedy = 8, |
| 93 | BaseBalanced = 9, |
| 94 | BaseGuidedIterativeChunked = 10, |
| 95 | BaseGuidedAnalyticalChunked = 11, |
| 96 | BaseSteal = 12, |
| 97 | |
| 98 | // with chunk adjustment (e.g., simd) |
| 99 | BaseStaticBalancedChunked = 13, |
| 100 | BaseGuidedSimd = 14, |
| 101 | BaseRuntimeSimd = 15, |
| 102 | |
| 103 | // static schedules algorithims for distribute |
| 104 | BaseDistributeChunked = 27, |
| 105 | BaseDistribute = 28, |
| 106 | |
| 107 | // Modifier flags to be combined with schedule algorithms |
| 108 | ModifierUnordered = (1 << 5), |
| 109 | ModifierOrdered = (1 << 6), |
| 110 | ModifierNomerge = (1 << 7), |
| 111 | ModifierMonotonic = (1 << 29), |
| 112 | ModifierNonmonotonic = (1 << 30), |
| 113 | |
| 114 | // Masks combining multiple flags |
| 115 | OrderingMask = ModifierUnordered | ModifierOrdered | ModifierNomerge, |
| 116 | MonotonicityMask = ModifierMonotonic | ModifierNonmonotonic, |
| 117 | ModifierMask = OrderingMask | MonotonicityMask, |
| 118 | |
| 119 | // valid schedule type values, without monotonicity flags |
| 120 | UnorderedStaticChunked = BaseStaticChunked | ModifierUnordered, // 33 |
| 121 | UnorderedStatic = BaseStatic | ModifierUnordered, // 34 |
| 122 | UnorderedDynamicChunked = BaseDynamicChunked | ModifierUnordered, // 35 |
| 123 | UnorderedGuidedChunked = BaseGuidedChunked | ModifierUnordered, // 36 |
| 124 | UnorderedRuntime = BaseRuntime | ModifierUnordered, // 37 |
| 125 | UnorderedAuto = BaseAuto | ModifierUnordered, // 38 |
| 126 | UnorderedTrapezoidal = BaseTrapezoidal | ModifierUnordered, // 39 |
| 127 | UnorderedGreedy = BaseGreedy | ModifierUnordered, // 40 |
| 128 | UnorderedBalanced = BaseBalanced | ModifierUnordered, // 41 |
| 129 | UnorderedGuidedIterativeChunked = |
| 130 | BaseGuidedIterativeChunked | ModifierUnordered, // 42 |
| 131 | UnorderedGuidedAnalyticalChunked = |
| 132 | BaseGuidedAnalyticalChunked | ModifierUnordered, // 43 |
| 133 | UnorderedSteal = BaseSteal | ModifierUnordered, // 44 |
| 134 | |
| 135 | UnorderedStaticBalancedChunked = |
| 136 | BaseStaticBalancedChunked | ModifierUnordered, // 45 |
| 137 | UnorderedGuidedSimd = BaseGuidedSimd | ModifierUnordered, // 46 |
| 138 | UnorderedRuntimeSimd = BaseRuntimeSimd | ModifierUnordered, // 47 |
| 139 | |
| 140 | OrderedStaticChunked = BaseStaticChunked | ModifierOrdered, // 65 |
| 141 | OrderedStatic = BaseStatic | ModifierOrdered, // 66 |
| 142 | OrderedDynamicChunked = BaseDynamicChunked | ModifierOrdered, // 67 |
| 143 | OrderedGuidedChunked = BaseGuidedChunked | ModifierOrdered, // 68 |
| 144 | OrderedRuntime = BaseRuntime | ModifierOrdered, // 69 |
| 145 | OrderedAuto = BaseAuto | ModifierOrdered, // 70 |
| 146 | OrderdTrapezoidal = BaseTrapezoidal | ModifierOrdered, // 71 |
| 147 | |
| 148 | OrderedDistributeChunked = BaseDistributeChunked | ModifierOrdered, // 91 |
| 149 | OrderedDistribute = BaseDistribute | ModifierOrdered, // 92 |
| 150 | |
| 151 | NomergeUnorderedStaticChunked = |
| 152 | BaseStaticChunked | ModifierUnordered | ModifierNomerge, // 161 |
| 153 | NomergeUnorderedStatic = |
| 154 | BaseStatic | ModifierUnordered | ModifierNomerge, // 162 |
| 155 | NomergeUnorderedDynamicChunked = |
| 156 | BaseDynamicChunked | ModifierUnordered | ModifierNomerge, // 163 |
| 157 | NomergeUnorderedGuidedChunked = |
| 158 | BaseGuidedChunked | ModifierUnordered | ModifierNomerge, // 164 |
| 159 | NomergeUnorderedRuntime = |
| 160 | BaseRuntime | ModifierUnordered | ModifierNomerge, // 165 |
| 161 | NomergeUnorderedAuto = BaseAuto | ModifierUnordered | ModifierNomerge, // 166 |
| 162 | NomergeUnorderedTrapezoidal = |
| 163 | BaseTrapezoidal | ModifierUnordered | ModifierNomerge, // 167 |
| 164 | NomergeUnorderedGreedy = |
| 165 | BaseGreedy | ModifierUnordered | ModifierNomerge, // 168 |
| 166 | NomergeUnorderedBalanced = |
| 167 | BaseBalanced | ModifierUnordered | ModifierNomerge, // 169 |
| 168 | NomergeUnorderedGuidedIterativeChunked = |
| 169 | BaseGuidedIterativeChunked | ModifierUnordered | ModifierNomerge, // 170 |
| 170 | NomergeUnorderedGuidedAnalyticalChunked = |
| 171 | BaseGuidedAnalyticalChunked | ModifierUnordered | ModifierNomerge, // 171 |
| 172 | NomergeUnorderedSteal = |
| 173 | BaseSteal | ModifierUnordered | ModifierNomerge, // 172 |
| 174 | |
| 175 | NomergeOrderedStaticChunked = |
| 176 | BaseStaticChunked | ModifierOrdered | ModifierNomerge, // 193 |
| 177 | NomergeOrderedStatic = BaseStatic | ModifierOrdered | ModifierNomerge, // 194 |
| 178 | NomergeOrderedDynamicChunked = |
| 179 | BaseDynamicChunked | ModifierOrdered | ModifierNomerge, // 195 |
| 180 | NomergeOrderedGuidedChunked = |
| 181 | BaseGuidedChunked | ModifierOrdered | ModifierNomerge, // 196 |
| 182 | NomergeOrderedRuntime = |
| 183 | BaseRuntime | ModifierOrdered | ModifierNomerge, // 197 |
| 184 | NomergeOrderedAuto = BaseAuto | ModifierOrdered | ModifierNomerge, // 198 |
| 185 | NomergeOrderedTrapezoidal = |
| 186 | BaseTrapezoidal | ModifierOrdered | ModifierNomerge, // 199 |
| 187 | |
| 188 | LLVM_MARK_AS_BITMASK_ENUM(/* LargestValue */ ModifierMask) |
| 189 | }; |
| 190 | |
| 191 | /// Values for bit flags used to specify the mapping type for |
| 192 | /// offloading. |
| 193 | enum class OpenMPOffloadMappingFlags : uint64_t { |
| 194 | /// No flags |
| 195 | OMP_MAP_NONE = 0x0, |
| 196 | /// Allocate memory on the device and move data from host to device. |
| 197 | OMP_MAP_TO = 0x01, |
| 198 | /// Allocate memory on the device and move data from device to host. |
| 199 | OMP_MAP_FROM = 0x02, |
| 200 | /// Always perform the requested mapping action on the element, even |
| 201 | /// if it was already mapped before. |
| 202 | OMP_MAP_ALWAYS = 0x04, |
| 203 | /// Delete the element from the device environment, ignoring the |
| 204 | /// current reference count associated with the element. |
| 205 | OMP_MAP_DELETE = 0x08, |
| 206 | /// The element being mapped is a pointer-pointee pair; both the |
| 207 | /// pointer and the pointee should be mapped. |
| 208 | OMP_MAP_PTR_AND_OBJ = 0x10, |
| 209 | /// This flags signals that the base address of an entry should be |
| 210 | /// passed to the target kernel as an argument. |
| 211 | OMP_MAP_TARGET_PARAM = 0x20, |
| 212 | /// Signal that the runtime library has to return the device pointer |
| 213 | /// in the current position for the data being mapped. Used when we have the |
| 214 | /// use_device_ptr or use_device_addr clause. |
| 215 | OMP_MAP_RETURN_PARAM = 0x40, |
| 216 | /// This flag signals that the reference being passed is a pointer to |
| 217 | /// private data. |
| 218 | OMP_MAP_PRIVATE = 0x80, |
| 219 | /// Pass the element to the device by value. |
| 220 | OMP_MAP_LITERAL = 0x100, |
| 221 | /// Implicit map |
| 222 | OMP_MAP_IMPLICIT = 0x200, |
| 223 | /// Close is a hint to the runtime to allocate memory close to |
| 224 | /// the target device. |
| 225 | OMP_MAP_CLOSE = 0x400, |
| 226 | /// 0x800 is reserved for compatibility with XLC. |
| 227 | /// Produce a runtime error if the data is not already allocated. |
| 228 | OMP_MAP_PRESENT = 0x1000, |
| 229 | // Increment and decrement a separate reference counter so that the data |
| 230 | // cannot be unmapped within the associated region. Thus, this flag is |
| 231 | // intended to be used on 'target' and 'target data' directives because they |
| 232 | // are inherently structured. It is not intended to be used on 'target |
| 233 | // enter data' and 'target exit data' directives because they are inherently |
| 234 | // dynamic. |
| 235 | // This is an OpenMP extension for the sake of OpenACC support. |
| 236 | OMP_MAP_OMPX_HOLD = 0x2000, |
| 237 | /// Signal that the runtime library should use args as an array of |
| 238 | /// descriptor_dim pointers and use args_size as dims. Used when we have |
| 239 | /// non-contiguous list items in target update directive |
| 240 | OMP_MAP_NON_CONTIG = 0x100000000000, |
| 241 | /// The 16 MSBs of the flags indicate whether the entry is member of some |
| 242 | /// struct/class. |
| 243 | OMP_MAP_MEMBER_OF = 0xffff000000000000, |
| 244 | LLVM_MARK_AS_BITMASK_ENUM(/* LargestFlag = */ OMP_MAP_MEMBER_OF) |
| 245 | }; |
| 246 | |
| 247 | enum OpenMPOffloadingReservedDeviceIDs { |
| 248 | /// Device ID if the device was not defined, runtime should get it |
| 249 | /// from environment variables in the spec. |
| 250 | OMP_DEVICEID_UNDEF = -1 |
| 251 | }; |
| 252 | |
| 253 | enum class AddressSpace : unsigned { |
| 254 | Generic = 0, |
| 255 | Global = 1, |
| 256 | Shared = 3, |
| 257 | Constant = 4, |
| 258 | Local = 5, |
| 259 | }; |
| 260 | |
| 261 | /// \note This needs to be kept in sync with interop.h enum kmp_interop_type_t.: |
| 262 | enum class OMPInteropType { Unknown, Target, TargetSync }; |
| 263 | |
| 264 | /// Atomic compare operations. Currently OpenMP only supports ==, >, and <. |
| 265 | enum class OMPAtomicCompareOp : unsigned { EQ, MIN, MAX }; |
| 266 | |
| 267 | /// Fields ids in kmp_depend_info record. |
| 268 | enum class RTLDependInfoFields { BaseAddr, Len, Flags }; |
| 269 | |
| 270 | /// Dependence kind for RTL. |
| 271 | enum class RTLDependenceKindTy { |
| 272 | DepUnknown = 0x0, |
| 273 | DepIn = 0x01, |
| 274 | DepInOut = 0x3, |
| 275 | DepMutexInOutSet = 0x4, |
| 276 | DepInOutSet = 0x8, |
| 277 | DepOmpAllMem = 0x80, |
| 278 | }; |
| 279 | |
| 280 | } // end namespace omp |
| 281 | |
| 282 | } // end namespace llvm |
| 283 | |
| 284 | #include "OMPDeviceConstants.h" |
| 285 | |
| 286 | #endif // LLVM_FRONTEND_OPENMP_OMPCONSTANTS_H |
| 287 | |