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