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