xref: /freebsd/contrib/llvm-project/llvm/include/llvm/Frontend/OpenMP/OMPConstants.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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