[OpenMP][NFC] Remove the need to include `OpenMPClause.h`
[lldb.git] / clang / include / clang / Basic / OpenMPKinds.h
1 //===--- OpenMPKinds.h - OpenMP enums ---------------------------*- 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 ///
9 /// \file
10 /// Defines some OpenMP-specific enums and functions.
11 ///
12 //===----------------------------------------------------------------------===//
13
14 #ifndef LLVM_CLANG_BASIC_OPENMPKINDS_H
15 #define LLVM_CLANG_BASIC_OPENMPKINDS_H
16
17 #include "llvm/ADT/StringRef.h"
18 #include "llvm/Frontend/OpenMP/OMPConstants.h"
19
20 namespace clang {
21
22 /// OpenMP directives.
23 using OpenMPDirectiveKind = llvm::omp::Directive;
24
25 /// OpenMP clauses.
26 enum OpenMPClauseKind {
27 #define OPENMP_CLAUSE(Name, Class) \
28   OMPC_##Name,
29 #include "clang/Basic/OpenMPKinds.def"
30   OMPC_threadprivate,
31   OMPC_uniform,
32   OMPC_device_type,
33   OMPC_match,
34   OMPC_unknown
35 };
36
37 /// OpenMP attributes for 'schedule' clause.
38 enum OpenMPScheduleClauseKind {
39 #define OPENMP_SCHEDULE_KIND(Name) \
40   OMPC_SCHEDULE_##Name,
41 #include "clang/Basic/OpenMPKinds.def"
42   OMPC_SCHEDULE_unknown
43 };
44
45 /// OpenMP modifiers for 'schedule' clause.
46 enum OpenMPScheduleClauseModifier {
47   OMPC_SCHEDULE_MODIFIER_unknown = OMPC_SCHEDULE_unknown,
48 #define OPENMP_SCHEDULE_MODIFIER(Name) \
49   OMPC_SCHEDULE_MODIFIER_##Name,
50 #include "clang/Basic/OpenMPKinds.def"
51   OMPC_SCHEDULE_MODIFIER_last
52 };
53
54 /// OpenMP modifiers for 'device' clause.
55 enum OpenMPDeviceClauseModifier {
56 #define OPENMP_DEVICE_MODIFIER(Name) OMPC_DEVICE_##Name,
57 #include "clang/Basic/OpenMPKinds.def"
58   OMPC_DEVICE_unknown,
59 };
60
61 /// OpenMP attributes for 'depend' clause.
62 enum OpenMPDependClauseKind {
63 #define OPENMP_DEPEND_KIND(Name) \
64   OMPC_DEPEND_##Name,
65 #include "clang/Basic/OpenMPKinds.def"
66   OMPC_DEPEND_unknown
67 };
68
69 /// OpenMP attributes for 'linear' clause.
70 enum OpenMPLinearClauseKind {
71 #define OPENMP_LINEAR_KIND(Name) \
72   OMPC_LINEAR_##Name,
73 #include "clang/Basic/OpenMPKinds.def"
74   OMPC_LINEAR_unknown
75 };
76
77 /// OpenMP mapping kind for 'map' clause.
78 enum OpenMPMapClauseKind {
79 #define OPENMP_MAP_KIND(Name) \
80   OMPC_MAP_##Name,
81 #include "clang/Basic/OpenMPKinds.def"
82   OMPC_MAP_unknown
83 };
84
85 /// OpenMP modifier kind for 'map' clause.
86 enum OpenMPMapModifierKind {
87   OMPC_MAP_MODIFIER_unknown = OMPC_MAP_unknown,
88 #define OPENMP_MAP_MODIFIER_KIND(Name) \
89   OMPC_MAP_MODIFIER_##Name,
90 #include "clang/Basic/OpenMPKinds.def"
91   OMPC_MAP_MODIFIER_last
92 };
93
94   /// Number of allowed map-type-modifiers.
95 static constexpr unsigned NumberOfOMPMapClauseModifiers =
96     OMPC_MAP_MODIFIER_last - OMPC_MAP_MODIFIER_unknown - 1;
97
98 /// OpenMP modifier kind for 'to' clause.
99 enum OpenMPToModifierKind {
100 #define OPENMP_TO_MODIFIER_KIND(Name) \
101   OMPC_TO_MODIFIER_##Name,
102 #include "clang/Basic/OpenMPKinds.def"
103   OMPC_TO_MODIFIER_unknown
104 };
105
106 /// OpenMP modifier kind for 'from' clause.
107 enum OpenMPFromModifierKind {
108 #define OPENMP_FROM_MODIFIER_KIND(Name) \
109   OMPC_FROM_MODIFIER_##Name,
110 #include "clang/Basic/OpenMPKinds.def"
111   OMPC_FROM_MODIFIER_unknown
112 };
113
114 /// OpenMP attributes for 'dist_schedule' clause.
115 enum OpenMPDistScheduleClauseKind {
116 #define OPENMP_DIST_SCHEDULE_KIND(Name) OMPC_DIST_SCHEDULE_##Name,
117 #include "clang/Basic/OpenMPKinds.def"
118   OMPC_DIST_SCHEDULE_unknown
119 };
120
121 /// OpenMP attributes for 'defaultmap' clause.
122 enum OpenMPDefaultmapClauseKind {
123 #define OPENMP_DEFAULTMAP_KIND(Name) \
124   OMPC_DEFAULTMAP_##Name,
125 #include "clang/Basic/OpenMPKinds.def"
126   OMPC_DEFAULTMAP_unknown
127 };
128
129 /// OpenMP modifiers for 'defaultmap' clause.
130 enum OpenMPDefaultmapClauseModifier {
131   OMPC_DEFAULTMAP_MODIFIER_unknown = OMPC_DEFAULTMAP_unknown,
132 #define OPENMP_DEFAULTMAP_MODIFIER(Name) \
133   OMPC_DEFAULTMAP_MODIFIER_##Name,
134 #include "clang/Basic/OpenMPKinds.def"
135   OMPC_DEFAULTMAP_MODIFIER_last
136 };
137
138 /// OpenMP attributes for 'atomic_default_mem_order' clause.
139 enum OpenMPAtomicDefaultMemOrderClauseKind {
140 #define OPENMP_ATOMIC_DEFAULT_MEM_ORDER_KIND(Name)  \
141   OMPC_ATOMIC_DEFAULT_MEM_ORDER_##Name,
142 #include "clang/Basic/OpenMPKinds.def"
143   OMPC_ATOMIC_DEFAULT_MEM_ORDER_unknown
144 };
145
146 /// OpenMP device type for 'device_type' clause.
147 enum OpenMPDeviceType {
148 #define OPENMP_DEVICE_TYPE_KIND(Name) \
149   OMPC_DEVICE_TYPE_##Name,
150 #include "clang/Basic/OpenMPKinds.def"
151   OMPC_DEVICE_TYPE_unknown
152 };
153
154 /// OpenMP 'lastprivate' clause modifier.
155 enum OpenMPLastprivateModifier {
156 #define OPENMP_LASTPRIVATE_KIND(Name) OMPC_LASTPRIVATE_##Name,
157 #include "clang/Basic/OpenMPKinds.def"
158   OMPC_LASTPRIVATE_unknown,
159 };
160
161 /// OpenMP attributes for 'order' clause.
162 enum OpenMPOrderClauseKind {
163 #define OPENMP_ORDER_KIND(Name) OMPC_ORDER_##Name,
164 #include "clang/Basic/OpenMPKinds.def"
165   OMPC_ORDER_unknown,
166 };
167
168 /// Scheduling data for loop-based OpenMP directives.
169 struct OpenMPScheduleTy final {
170   OpenMPScheduleClauseKind Schedule = OMPC_SCHEDULE_unknown;
171   OpenMPScheduleClauseModifier M1 = OMPC_SCHEDULE_MODIFIER_unknown;
172   OpenMPScheduleClauseModifier M2 = OMPC_SCHEDULE_MODIFIER_unknown;
173 };
174
175 /// OpenMP modifiers for 'reduction' clause.
176 enum OpenMPReductionClauseModifier {
177 #define OPENMP_REDUCTION_MODIFIER(Name) OMPC_REDUCTION_##Name,
178 #include "clang/Basic/OpenMPKinds.def"
179   OMPC_REDUCTION_unknown,
180 };
181
182 OpenMPClauseKind getOpenMPClauseKind(llvm::StringRef Str);
183 const char *getOpenMPClauseName(OpenMPClauseKind Kind);
184
185 unsigned getOpenMPSimpleClauseType(OpenMPClauseKind Kind, llvm::StringRef Str);
186 const char *getOpenMPSimpleClauseTypeName(OpenMPClauseKind Kind, unsigned Type);
187
188 bool isAllowedClauseForDirective(OpenMPDirectiveKind DKind,
189                                  OpenMPClauseKind CKind,
190                                  unsigned OpenMPVersion);
191
192 /// Checks if the specified directive is a directive with an associated
193 /// loop construct.
194 /// \param DKind Specified directive.
195 /// \return true - the directive is a loop-associated directive like 'omp simd'
196 /// or 'omp for' directive, otherwise - false.
197 bool isOpenMPLoopDirective(OpenMPDirectiveKind DKind);
198
199 /// Checks if the specified directive is a worksharing directive.
200 /// \param DKind Specified directive.
201 /// \return true - the directive is a worksharing directive like 'omp for',
202 /// otherwise - false.
203 bool isOpenMPWorksharingDirective(OpenMPDirectiveKind DKind);
204
205 /// Checks if the specified directive is a taskloop directive.
206 /// \param DKind Specified directive.
207 /// \return true - the directive is a worksharing directive like 'omp taskloop',
208 /// otherwise - false.
209 bool isOpenMPTaskLoopDirective(OpenMPDirectiveKind DKind);
210
211 /// Checks if the specified directive is a parallel-kind directive.
212 /// \param DKind Specified directive.
213 /// \return true - the directive is a parallel-like directive like 'omp
214 /// parallel', otherwise - false.
215 bool isOpenMPParallelDirective(OpenMPDirectiveKind DKind);
216
217 /// Checks if the specified directive is a target code offload directive.
218 /// \param DKind Specified directive.
219 /// \return true - the directive is a target code offload directive like
220 /// 'omp target', 'omp target parallel', 'omp target xxx'
221 /// otherwise - false.
222 bool isOpenMPTargetExecutionDirective(OpenMPDirectiveKind DKind);
223
224 /// Checks if the specified directive is a target data offload directive.
225 /// \param DKind Specified directive.
226 /// \return true - the directive is a target data offload directive like
227 /// 'omp target data', 'omp target update', 'omp target enter data',
228 /// 'omp target exit data'
229 /// otherwise - false.
230 bool isOpenMPTargetDataManagementDirective(OpenMPDirectiveKind DKind);
231
232 /// Checks if the specified composite/combined directive constitutes a teams
233 /// directive in the outermost nest.  For example
234 /// 'omp teams distribute' or 'omp teams distribute parallel for'.
235 /// \param DKind Specified directive.
236 /// \return true - the directive has teams on the outermost nest, otherwise -
237 /// false.
238 bool isOpenMPNestingTeamsDirective(OpenMPDirectiveKind DKind);
239
240 /// Checks if the specified directive is a teams-kind directive.  For example,
241 /// 'omp teams distribute' or 'omp target teams'.
242 /// \param DKind Specified directive.
243 /// \return true - the directive is a teams-like directive, otherwise - false.
244 bool isOpenMPTeamsDirective(OpenMPDirectiveKind DKind);
245
246 /// Checks if the specified directive is a simd directive.
247 /// \param DKind Specified directive.
248 /// \return true - the directive is a simd directive like 'omp simd',
249 /// otherwise - false.
250 bool isOpenMPSimdDirective(OpenMPDirectiveKind DKind);
251
252 /// Checks if the specified directive is a distribute directive.
253 /// \param DKind Specified directive.
254 /// \return true - the directive is a distribute-directive like 'omp
255 /// distribute',
256 /// otherwise - false.
257 bool isOpenMPDistributeDirective(OpenMPDirectiveKind DKind);
258
259 /// Checks if the specified composite/combined directive constitutes a
260 /// distribute directive in the outermost nest.  For example,
261 /// 'omp distribute parallel for' or 'omp distribute'.
262 /// \param DKind Specified directive.
263 /// \return true - the directive has distribute on the outermost nest.
264 /// otherwise - false.
265 bool isOpenMPNestingDistributeDirective(OpenMPDirectiveKind DKind);
266
267 /// Checks if the specified clause is one of private clauses like
268 /// 'private', 'firstprivate', 'reduction' etc..
269 /// \param Kind Clause kind.
270 /// \return true - the clause is a private clause, otherwise - false.
271 bool isOpenMPPrivate(OpenMPClauseKind Kind);
272
273 /// Checks if the specified clause is one of threadprivate clauses like
274 /// 'threadprivate', 'copyin' or 'copyprivate'.
275 /// \param Kind Clause kind.
276 /// \return true - the clause is a threadprivate clause, otherwise - false.
277 bool isOpenMPThreadPrivate(OpenMPClauseKind Kind);
278
279 /// Checks if the specified directive kind is one of tasking directives - task,
280 /// taskloop, taksloop simd, master taskloop, parallel master taskloop, master
281 /// taskloop simd, or parallel master taskloop simd.
282 bool isOpenMPTaskingDirective(OpenMPDirectiveKind Kind);
283
284 /// Checks if the specified directive kind is one of the composite or combined
285 /// directives that need loop bound sharing across loops outlined in nested
286 /// functions
287 bool isOpenMPLoopBoundSharingDirective(OpenMPDirectiveKind Kind);
288
289 /// Return the captured regions of an OpenMP directive.
290 void getOpenMPCaptureRegions(
291     llvm::SmallVectorImpl<OpenMPDirectiveKind> &CaptureRegions,
292     OpenMPDirectiveKind DKind);
293 }
294
295 #endif
296