1480093f4SDimitry Andric //===- OMPConstants.h - OpenMP related constants and helpers ------ C++ -*-===// 2480093f4SDimitry Andric // 3480093f4SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4480093f4SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5480093f4SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6480093f4SDimitry Andric // 7480093f4SDimitry Andric //===----------------------------------------------------------------------===// 8480093f4SDimitry Andric /// \file 9480093f4SDimitry Andric /// 10480093f4SDimitry Andric /// This file defines constans and helpers used when dealing with OpenMP. 11480093f4SDimitry Andric /// 12480093f4SDimitry Andric //===----------------------------------------------------------------------===// 13480093f4SDimitry Andric 14fe6060f1SDimitry Andric #ifndef LLVM_FRONTEND_OPENMP_OMPCONSTANTS_H 15fe6060f1SDimitry Andric #define LLVM_FRONTEND_OPENMP_OMPCONSTANTS_H 16480093f4SDimitry Andric 17480093f4SDimitry Andric #include "llvm/ADT/BitmaskEnum.h" 18e8d8bef9SDimitry Andric #include "llvm/ADT/StringRef.h" 19*0fca6ea1SDimitry Andric #include "llvm/Frontend/OpenMP/OMP.h" 20480093f4SDimitry Andric 21480093f4SDimitry Andric namespace llvm { 22480093f4SDimitry Andric namespace omp { 23480093f4SDimitry Andric LLVM_ENABLE_BITMASK_ENUMS_IN_NAMESPACE(); 24480093f4SDimitry Andric 255ffd83dbSDimitry Andric /// IDs for all Internal Control Variables (ICVs). 265ffd83dbSDimitry Andric enum class InternalControlVar { 275ffd83dbSDimitry Andric #define ICV_DATA_ENV(Enum, ...) Enum, 28480093f4SDimitry Andric #include "llvm/Frontend/OpenMP/OMPKinds.def" 29480093f4SDimitry Andric }; 30480093f4SDimitry Andric 315ffd83dbSDimitry Andric #define ICV_DATA_ENV(Enum, ...) \ 325ffd83dbSDimitry Andric constexpr auto Enum = omp::InternalControlVar::Enum; 335ffd83dbSDimitry Andric #include "llvm/Frontend/OpenMP/OMPKinds.def" 345ffd83dbSDimitry Andric 355ffd83dbSDimitry Andric enum class ICVInitValue { 36e8d8bef9SDimitry Andric #define ICV_INIT_VALUE(Enum, Name) Enum, 375ffd83dbSDimitry Andric #include "llvm/Frontend/OpenMP/OMPKinds.def" 385ffd83dbSDimitry Andric }; 395ffd83dbSDimitry Andric 40e8d8bef9SDimitry Andric #define ICV_INIT_VALUE(Enum, Name) \ 41e8d8bef9SDimitry Andric constexpr auto Enum = omp::ICVInitValue::Enum; 42480093f4SDimitry Andric #include "llvm/Frontend/OpenMP/OMPKinds.def" 43480093f4SDimitry Andric 44480093f4SDimitry Andric /// IDs for all omp runtime library (RTL) functions. 45480093f4SDimitry Andric enum class RuntimeFunction { 46480093f4SDimitry Andric #define OMP_RTL(Enum, ...) Enum, 47480093f4SDimitry Andric #include "llvm/Frontend/OpenMP/OMPKinds.def" 48480093f4SDimitry Andric }; 49480093f4SDimitry Andric 50480093f4SDimitry Andric #define OMP_RTL(Enum, ...) constexpr auto Enum = omp::RuntimeFunction::Enum; 51480093f4SDimitry Andric #include "llvm/Frontend/OpenMP/OMPKinds.def" 52480093f4SDimitry Andric 535ffd83dbSDimitry Andric /// IDs for the different default kinds. 545ffd83dbSDimitry Andric enum class DefaultKind { 555ffd83dbSDimitry Andric #define OMP_DEFAULT_KIND(Enum, Str) Enum, 565ffd83dbSDimitry Andric #include "llvm/Frontend/OpenMP/OMPKinds.def" 575ffd83dbSDimitry Andric }; 585ffd83dbSDimitry Andric 595ffd83dbSDimitry Andric #define OMP_DEFAULT_KIND(Enum, ...) \ 605ffd83dbSDimitry Andric constexpr auto Enum = omp::DefaultKind::Enum; 615ffd83dbSDimitry Andric #include "llvm/Frontend/OpenMP/OMPKinds.def" 625ffd83dbSDimitry Andric 63480093f4SDimitry Andric /// IDs for all omp runtime library ident_t flag encodings (see 64480093f4SDimitry Andric /// their defintion in openmp/runtime/src/kmp.h). 65480093f4SDimitry Andric enum class IdentFlag { 66480093f4SDimitry Andric #define OMP_IDENT_FLAG(Enum, Str, Value) Enum = Value, 67480093f4SDimitry Andric #include "llvm/Frontend/OpenMP/OMPKinds.def" 68480093f4SDimitry Andric LLVM_MARK_AS_BITMASK_ENUM(0x7FFFFFFF) 69480093f4SDimitry Andric }; 70480093f4SDimitry Andric 71480093f4SDimitry Andric #define OMP_IDENT_FLAG(Enum, ...) constexpr auto Enum = omp::IdentFlag::Enum; 72480093f4SDimitry Andric #include "llvm/Frontend/OpenMP/OMPKinds.def" 73480093f4SDimitry Andric 7406c3fb27SDimitry Andric // Version of the kernel argument format used by the omp runtime. 75*0fca6ea1SDimitry Andric #define OMP_KERNEL_ARG_VERSION 3 76*0fca6ea1SDimitry Andric 77*0fca6ea1SDimitry Andric // Minimum version of the compiler that generates a kernel dynamic pointer. 78*0fca6ea1SDimitry Andric #define OMP_KERNEL_ARG_MIN_VERSION_WITH_DYN_PTR 3 7906c3fb27SDimitry Andric 80fe6060f1SDimitry Andric /// \note This needs to be kept in sync with kmp.h enum sched_type. 81fe6060f1SDimitry Andric /// Todo: Update kmp.h to include this file, and remove the enums in kmp.h 82fe6060f1SDimitry Andric enum class OMPScheduleType { 8381ad6265SDimitry Andric // For typed comparisons, not a valid schedule 8481ad6265SDimitry Andric None = 0, 85fe6060f1SDimitry Andric 8681ad6265SDimitry Andric // Schedule algorithms 8781ad6265SDimitry Andric BaseStaticChunked = 1, 8881ad6265SDimitry Andric BaseStatic = 2, 8981ad6265SDimitry Andric BaseDynamicChunked = 3, 9081ad6265SDimitry Andric BaseGuidedChunked = 4, 9181ad6265SDimitry Andric BaseRuntime = 5, 9281ad6265SDimitry Andric BaseAuto = 6, 9381ad6265SDimitry Andric BaseTrapezoidal = 7, 9481ad6265SDimitry Andric BaseGreedy = 8, 9581ad6265SDimitry Andric BaseBalanced = 9, 9681ad6265SDimitry Andric BaseGuidedIterativeChunked = 10, 9781ad6265SDimitry Andric BaseGuidedAnalyticalChunked = 11, 9881ad6265SDimitry Andric BaseSteal = 12, 994824e7fdSDimitry Andric 10081ad6265SDimitry Andric // with chunk adjustment (e.g., simd) 10181ad6265SDimitry Andric BaseStaticBalancedChunked = 13, 10281ad6265SDimitry Andric BaseGuidedSimd = 14, 10381ad6265SDimitry Andric BaseRuntimeSimd = 15, 10481ad6265SDimitry Andric 10581ad6265SDimitry Andric // static schedules algorithims for distribute 10681ad6265SDimitry Andric BaseDistributeChunked = 27, 10781ad6265SDimitry Andric BaseDistribute = 28, 10881ad6265SDimitry Andric 10981ad6265SDimitry Andric // Modifier flags to be combined with schedule algorithms 11081ad6265SDimitry Andric ModifierUnordered = (1 << 5), 11181ad6265SDimitry Andric ModifierOrdered = (1 << 6), 11281ad6265SDimitry Andric ModifierNomerge = (1 << 7), 11381ad6265SDimitry Andric ModifierMonotonic = (1 << 29), 11481ad6265SDimitry Andric ModifierNonmonotonic = (1 << 30), 11581ad6265SDimitry Andric 11681ad6265SDimitry Andric // Masks combining multiple flags 11781ad6265SDimitry Andric OrderingMask = ModifierUnordered | ModifierOrdered | ModifierNomerge, 11881ad6265SDimitry Andric MonotonicityMask = ModifierMonotonic | ModifierNonmonotonic, 11981ad6265SDimitry Andric ModifierMask = OrderingMask | MonotonicityMask, 12081ad6265SDimitry Andric 12181ad6265SDimitry Andric // valid schedule type values, without monotonicity flags 12281ad6265SDimitry Andric UnorderedStaticChunked = BaseStaticChunked | ModifierUnordered, // 33 12381ad6265SDimitry Andric UnorderedStatic = BaseStatic | ModifierUnordered, // 34 12481ad6265SDimitry Andric UnorderedDynamicChunked = BaseDynamicChunked | ModifierUnordered, // 35 12581ad6265SDimitry Andric UnorderedGuidedChunked = BaseGuidedChunked | ModifierUnordered, // 36 12681ad6265SDimitry Andric UnorderedRuntime = BaseRuntime | ModifierUnordered, // 37 12781ad6265SDimitry Andric UnorderedAuto = BaseAuto | ModifierUnordered, // 38 12881ad6265SDimitry Andric UnorderedTrapezoidal = BaseTrapezoidal | ModifierUnordered, // 39 12981ad6265SDimitry Andric UnorderedGreedy = BaseGreedy | ModifierUnordered, // 40 13081ad6265SDimitry Andric UnorderedBalanced = BaseBalanced | ModifierUnordered, // 41 13181ad6265SDimitry Andric UnorderedGuidedIterativeChunked = 13281ad6265SDimitry Andric BaseGuidedIterativeChunked | ModifierUnordered, // 42 13381ad6265SDimitry Andric UnorderedGuidedAnalyticalChunked = 13481ad6265SDimitry Andric BaseGuidedAnalyticalChunked | ModifierUnordered, // 43 13581ad6265SDimitry Andric UnorderedSteal = BaseSteal | ModifierUnordered, // 44 13681ad6265SDimitry Andric 13781ad6265SDimitry Andric UnorderedStaticBalancedChunked = 13881ad6265SDimitry Andric BaseStaticBalancedChunked | ModifierUnordered, // 45 13981ad6265SDimitry Andric UnorderedGuidedSimd = BaseGuidedSimd | ModifierUnordered, // 46 14081ad6265SDimitry Andric UnorderedRuntimeSimd = BaseRuntimeSimd | ModifierUnordered, // 47 14181ad6265SDimitry Andric 14281ad6265SDimitry Andric OrderedStaticChunked = BaseStaticChunked | ModifierOrdered, // 65 14381ad6265SDimitry Andric OrderedStatic = BaseStatic | ModifierOrdered, // 66 14481ad6265SDimitry Andric OrderedDynamicChunked = BaseDynamicChunked | ModifierOrdered, // 67 14581ad6265SDimitry Andric OrderedGuidedChunked = BaseGuidedChunked | ModifierOrdered, // 68 14681ad6265SDimitry Andric OrderedRuntime = BaseRuntime | ModifierOrdered, // 69 14781ad6265SDimitry Andric OrderedAuto = BaseAuto | ModifierOrdered, // 70 14881ad6265SDimitry Andric OrderdTrapezoidal = BaseTrapezoidal | ModifierOrdered, // 71 14981ad6265SDimitry Andric 15081ad6265SDimitry Andric OrderedDistributeChunked = BaseDistributeChunked | ModifierOrdered, // 91 15181ad6265SDimitry Andric OrderedDistribute = BaseDistribute | ModifierOrdered, // 92 15281ad6265SDimitry Andric 15381ad6265SDimitry Andric NomergeUnorderedStaticChunked = 15481ad6265SDimitry Andric BaseStaticChunked | ModifierUnordered | ModifierNomerge, // 161 15581ad6265SDimitry Andric NomergeUnorderedStatic = 15681ad6265SDimitry Andric BaseStatic | ModifierUnordered | ModifierNomerge, // 162 15781ad6265SDimitry Andric NomergeUnorderedDynamicChunked = 15881ad6265SDimitry Andric BaseDynamicChunked | ModifierUnordered | ModifierNomerge, // 163 15981ad6265SDimitry Andric NomergeUnorderedGuidedChunked = 16081ad6265SDimitry Andric BaseGuidedChunked | ModifierUnordered | ModifierNomerge, // 164 16181ad6265SDimitry Andric NomergeUnorderedRuntime = 16281ad6265SDimitry Andric BaseRuntime | ModifierUnordered | ModifierNomerge, // 165 16381ad6265SDimitry Andric NomergeUnorderedAuto = BaseAuto | ModifierUnordered | ModifierNomerge, // 166 16481ad6265SDimitry Andric NomergeUnorderedTrapezoidal = 16581ad6265SDimitry Andric BaseTrapezoidal | ModifierUnordered | ModifierNomerge, // 167 16681ad6265SDimitry Andric NomergeUnorderedGreedy = 16781ad6265SDimitry Andric BaseGreedy | ModifierUnordered | ModifierNomerge, // 168 16881ad6265SDimitry Andric NomergeUnorderedBalanced = 16981ad6265SDimitry Andric BaseBalanced | ModifierUnordered | ModifierNomerge, // 169 17081ad6265SDimitry Andric NomergeUnorderedGuidedIterativeChunked = 17181ad6265SDimitry Andric BaseGuidedIterativeChunked | ModifierUnordered | ModifierNomerge, // 170 17281ad6265SDimitry Andric NomergeUnorderedGuidedAnalyticalChunked = 17381ad6265SDimitry Andric BaseGuidedAnalyticalChunked | ModifierUnordered | ModifierNomerge, // 171 17481ad6265SDimitry Andric NomergeUnorderedSteal = 17581ad6265SDimitry Andric BaseSteal | ModifierUnordered | ModifierNomerge, // 172 17681ad6265SDimitry Andric 17781ad6265SDimitry Andric NomergeOrderedStaticChunked = 17881ad6265SDimitry Andric BaseStaticChunked | ModifierOrdered | ModifierNomerge, // 193 17981ad6265SDimitry Andric NomergeOrderedStatic = BaseStatic | ModifierOrdered | ModifierNomerge, // 194 18081ad6265SDimitry Andric NomergeOrderedDynamicChunked = 18181ad6265SDimitry Andric BaseDynamicChunked | ModifierOrdered | ModifierNomerge, // 195 18281ad6265SDimitry Andric NomergeOrderedGuidedChunked = 18381ad6265SDimitry Andric BaseGuidedChunked | ModifierOrdered | ModifierNomerge, // 196 18481ad6265SDimitry Andric NomergeOrderedRuntime = 18581ad6265SDimitry Andric BaseRuntime | ModifierOrdered | ModifierNomerge, // 197 18681ad6265SDimitry Andric NomergeOrderedAuto = BaseAuto | ModifierOrdered | ModifierNomerge, // 198 18781ad6265SDimitry Andric NomergeOrderedTrapezoidal = 18881ad6265SDimitry Andric BaseTrapezoidal | ModifierOrdered | ModifierNomerge, // 199 18981ad6265SDimitry Andric 190fe6060f1SDimitry Andric LLVM_MARK_AS_BITMASK_ENUM(/* LargestValue */ ModifierMask) 191fe6060f1SDimitry Andric }; 192fe6060f1SDimitry Andric 193bdd1243dSDimitry Andric /// Values for bit flags used to specify the mapping type for 194bdd1243dSDimitry Andric /// offloading. 195bdd1243dSDimitry Andric enum class OpenMPOffloadMappingFlags : uint64_t { 196bdd1243dSDimitry Andric /// No flags 197bdd1243dSDimitry Andric OMP_MAP_NONE = 0x0, 198bdd1243dSDimitry Andric /// Allocate memory on the device and move data from host to device. 199bdd1243dSDimitry Andric OMP_MAP_TO = 0x01, 200bdd1243dSDimitry Andric /// Allocate memory on the device and move data from device to host. 201bdd1243dSDimitry Andric OMP_MAP_FROM = 0x02, 202bdd1243dSDimitry Andric /// Always perform the requested mapping action on the element, even 203bdd1243dSDimitry Andric /// if it was already mapped before. 204bdd1243dSDimitry Andric OMP_MAP_ALWAYS = 0x04, 205bdd1243dSDimitry Andric /// Delete the element from the device environment, ignoring the 206bdd1243dSDimitry Andric /// current reference count associated with the element. 207bdd1243dSDimitry Andric OMP_MAP_DELETE = 0x08, 208bdd1243dSDimitry Andric /// The element being mapped is a pointer-pointee pair; both the 209bdd1243dSDimitry Andric /// pointer and the pointee should be mapped. 210bdd1243dSDimitry Andric OMP_MAP_PTR_AND_OBJ = 0x10, 211bdd1243dSDimitry Andric /// This flags signals that the base address of an entry should be 212bdd1243dSDimitry Andric /// passed to the target kernel as an argument. 213bdd1243dSDimitry Andric OMP_MAP_TARGET_PARAM = 0x20, 214bdd1243dSDimitry Andric /// Signal that the runtime library has to return the device pointer 215bdd1243dSDimitry Andric /// in the current position for the data being mapped. Used when we have the 216bdd1243dSDimitry Andric /// use_device_ptr or use_device_addr clause. 217bdd1243dSDimitry Andric OMP_MAP_RETURN_PARAM = 0x40, 218bdd1243dSDimitry Andric /// This flag signals that the reference being passed is a pointer to 219bdd1243dSDimitry Andric /// private data. 220bdd1243dSDimitry Andric OMP_MAP_PRIVATE = 0x80, 221bdd1243dSDimitry Andric /// Pass the element to the device by value. 222bdd1243dSDimitry Andric OMP_MAP_LITERAL = 0x100, 223bdd1243dSDimitry Andric /// Implicit map 224bdd1243dSDimitry Andric OMP_MAP_IMPLICIT = 0x200, 225bdd1243dSDimitry Andric /// Close is a hint to the runtime to allocate memory close to 226bdd1243dSDimitry Andric /// the target device. 227bdd1243dSDimitry Andric OMP_MAP_CLOSE = 0x400, 228bdd1243dSDimitry Andric /// 0x800 is reserved for compatibility with XLC. 229bdd1243dSDimitry Andric /// Produce a runtime error if the data is not already allocated. 230bdd1243dSDimitry Andric OMP_MAP_PRESENT = 0x1000, 231bdd1243dSDimitry Andric // Increment and decrement a separate reference counter so that the data 232bdd1243dSDimitry Andric // cannot be unmapped within the associated region. Thus, this flag is 233bdd1243dSDimitry Andric // intended to be used on 'target' and 'target data' directives because they 234bdd1243dSDimitry Andric // are inherently structured. It is not intended to be used on 'target 235bdd1243dSDimitry Andric // enter data' and 'target exit data' directives because they are inherently 236bdd1243dSDimitry Andric // dynamic. 237bdd1243dSDimitry Andric // This is an OpenMP extension for the sake of OpenACC support. 238bdd1243dSDimitry Andric OMP_MAP_OMPX_HOLD = 0x2000, 239bdd1243dSDimitry Andric /// Signal that the runtime library should use args as an array of 240bdd1243dSDimitry Andric /// descriptor_dim pointers and use args_size as dims. Used when we have 241bdd1243dSDimitry Andric /// non-contiguous list items in target update directive 242bdd1243dSDimitry Andric OMP_MAP_NON_CONTIG = 0x100000000000, 243bdd1243dSDimitry Andric /// The 16 MSBs of the flags indicate whether the entry is member of some 244bdd1243dSDimitry Andric /// struct/class. 245bdd1243dSDimitry Andric OMP_MAP_MEMBER_OF = 0xffff000000000000, 246bdd1243dSDimitry Andric LLVM_MARK_AS_BITMASK_ENUM(/* LargestFlag = */ OMP_MAP_MEMBER_OF) 247349cc55cSDimitry Andric }; 248349cc55cSDimitry Andric 24906c3fb27SDimitry Andric enum OpenMPOffloadingReservedDeviceIDs { 25006c3fb27SDimitry Andric /// Device ID if the device was not defined, runtime should get it 25106c3fb27SDimitry Andric /// from environment variables in the spec. 25206c3fb27SDimitry Andric OMP_DEVICEID_UNDEF = -1 25306c3fb27SDimitry Andric }; 25406c3fb27SDimitry Andric 25504eeddc0SDimitry Andric enum class AddressSpace : unsigned { 25604eeddc0SDimitry Andric Generic = 0, 25704eeddc0SDimitry Andric Global = 1, 25804eeddc0SDimitry Andric Shared = 3, 25904eeddc0SDimitry Andric Constant = 4, 26004eeddc0SDimitry Andric Local = 5, 26104eeddc0SDimitry Andric }; 26204eeddc0SDimitry Andric 2631fd87a68SDimitry Andric /// \note This needs to be kept in sync with interop.h enum kmp_interop_type_t.: 2641fd87a68SDimitry Andric enum class OMPInteropType { Unknown, Target, TargetSync }; 2651fd87a68SDimitry Andric 26681ad6265SDimitry Andric /// Atomic compare operations. Currently OpenMP only supports ==, >, and <. 26781ad6265SDimitry Andric enum class OMPAtomicCompareOp : unsigned { EQ, MIN, MAX }; 26881ad6265SDimitry Andric 269bdd1243dSDimitry Andric /// Fields ids in kmp_depend_info record. 270bdd1243dSDimitry Andric enum class RTLDependInfoFields { BaseAddr, Len, Flags }; 271bdd1243dSDimitry Andric 272bdd1243dSDimitry Andric /// Dependence kind for RTL. 273bdd1243dSDimitry Andric enum class RTLDependenceKindTy { 274bdd1243dSDimitry Andric DepUnknown = 0x0, 275bdd1243dSDimitry Andric DepIn = 0x01, 276bdd1243dSDimitry Andric DepInOut = 0x3, 277bdd1243dSDimitry Andric DepMutexInOutSet = 0x4, 278bdd1243dSDimitry Andric DepInOutSet = 0x8, 279bdd1243dSDimitry Andric DepOmpAllMem = 0x80, 280bdd1243dSDimitry Andric }; 281bdd1243dSDimitry Andric 2825f757f3fSDimitry Andric /// A type of worksharing loop construct 2835f757f3fSDimitry Andric enum class WorksharingLoopType { 2845f757f3fSDimitry Andric // Worksharing `for`-loop 2855f757f3fSDimitry Andric ForStaticLoop, 2865f757f3fSDimitry Andric // Worksharing `distrbute`-loop 2875f757f3fSDimitry Andric DistributeStaticLoop, 2885f757f3fSDimitry Andric // Worksharing `distrbute parallel for`-loop 2895f757f3fSDimitry Andric DistributeForStaticLoop 2905f757f3fSDimitry Andric }; 2915f757f3fSDimitry Andric 292480093f4SDimitry Andric } // end namespace omp 293480093f4SDimitry Andric 294480093f4SDimitry Andric } // end namespace llvm 295480093f4SDimitry Andric 296bdd1243dSDimitry Andric #include "OMPDeviceConstants.h" 297bdd1243dSDimitry Andric 298fe6060f1SDimitry Andric #endif // LLVM_FRONTEND_OPENMP_OMPCONSTANTS_H 299