1#ifndef LLVM_OpenACC_INC
2#define LLVM_OpenACC_INC
3
4#include "llvm/ADT/ArrayRef.h"
5#include "llvm/ADT/BitmaskEnum.h"
6#include "llvm/ADT/Sequence.h"
7#include "llvm/ADT/STLExtras.h"
8#include "llvm/ADT/StringRef.h"
9#include "llvm/Frontend/Directive/Spelling.h"
10#include "llvm/Support/Compiler.h"
11#include <cstddef>
12#include <utility>
13
14namespace llvm {
15
16namespace acc {
17
18LLVM_ENABLE_BITMASK_ENUMS_IN_NAMESPACE();
19
20enum class Association {
21 Block,
22 First_ = Block,
23 Declaration,
24 Delimited,
25 LoopNest,
26 LoopSeq,
27 None,
28 Separating,
29 Last_ = Separating,
30};
31
32static constexpr std::size_t Association_enumSize = 7;
33
34enum class Category {
35 Declarative,
36 First_ = Declarative,
37 Executable,
38 Informational,
39 Meta,
40 Subsidiary,
41 Utility,
42 Last_ = Utility,
43};
44
45static constexpr std::size_t Category_enumSize = 6;
46
47enum class SourceLanguage : uint32_t {
48 C = 1U,
49 Fortran = 2U,
50 LLVM_MARK_AS_BITMASK_ENUM(/*LargestValue=*/Fortran)
51};
52
53static constexpr std::size_t SourceLanguage_enumSize = 2;
54
55enum class Directive {
56 ACCD_atomic,
57 First_ = ACCD_atomic,
58 ACCD_cache,
59 ACCD_data,
60 ACCD_declare,
61 ACCD_enter_data,
62 ACCD_exit_data,
63 ACCD_host_data,
64 ACCD_init,
65 ACCD_kernels,
66 ACCD_kernels_loop,
67 ACCD_loop,
68 ACCD_parallel,
69 ACCD_parallel_loop,
70 ACCD_routine,
71 ACCD_serial,
72 ACCD_serial_loop,
73 ACCD_set,
74 ACCD_shutdown,
75 ACCD_unknown,
76 ACCD_update,
77 ACCD_wait,
78 Last_ = ACCD_wait,
79};
80
81static constexpr std::size_t Directive_enumSize = 21;
82
83constexpr auto ACCD_atomic = Directive::ACCD_atomic;
84constexpr auto ACCD_cache = Directive::ACCD_cache;
85constexpr auto ACCD_data = Directive::ACCD_data;
86constexpr auto ACCD_declare = Directive::ACCD_declare;
87constexpr auto ACCD_enter_data = Directive::ACCD_enter_data;
88constexpr auto ACCD_exit_data = Directive::ACCD_exit_data;
89constexpr auto ACCD_host_data = Directive::ACCD_host_data;
90constexpr auto ACCD_init = Directive::ACCD_init;
91constexpr auto ACCD_kernels = Directive::ACCD_kernels;
92constexpr auto ACCD_kernels_loop = Directive::ACCD_kernels_loop;
93constexpr auto ACCD_loop = Directive::ACCD_loop;
94constexpr auto ACCD_parallel = Directive::ACCD_parallel;
95constexpr auto ACCD_parallel_loop = Directive::ACCD_parallel_loop;
96constexpr auto ACCD_routine = Directive::ACCD_routine;
97constexpr auto ACCD_serial = Directive::ACCD_serial;
98constexpr auto ACCD_serial_loop = Directive::ACCD_serial_loop;
99constexpr auto ACCD_set = Directive::ACCD_set;
100constexpr auto ACCD_shutdown = Directive::ACCD_shutdown;
101constexpr auto ACCD_unknown = Directive::ACCD_unknown;
102constexpr auto ACCD_update = Directive::ACCD_update;
103constexpr auto ACCD_wait = Directive::ACCD_wait;
104
105enum class Clause {
106 ACCC_async,
107 First_ = ACCC_async,
108 ACCC_attach,
109 ACCC_auto,
110 ACCC_bind,
111 ACCC_capture,
112 ACCC_collapse,
113 ACCC_copy,
114 ACCC_copyin,
115 ACCC_copyout,
116 ACCC_create,
117 ACCC_default,
118 ACCC_default_async,
119 ACCC_delete,
120 ACCC_detach,
121 ACCC_device,
122 ACCC_device_num,
123 ACCC_deviceptr,
124 ACCC_device_resident,
125 ACCC_device_type,
126 ACCC_finalize,
127 ACCC_firstprivate,
128 ACCC_gang,
129 ACCC_host,
130 ACCC_if,
131 ACCC_if_present,
132 ACCC_independent,
133 ACCC_link,
134 ACCC_no_create,
135 ACCC_nohost,
136 ACCC_num_gangs,
137 ACCC_num_workers,
138 ACCC_present,
139 ACCC_private,
140 ACCC_read,
141 ACCC_reduction,
142 ACCC_self,
143 ACCC_seq,
144 ACCC_shortloop,
145 ACCC_tile,
146 ACCC_unknown,
147 ACCC_use_device,
148 ACCC_vector,
149 ACCC_vector_length,
150 ACCC_wait,
151 ACCC_worker,
152 ACCC_write,
153 Last_ = ACCC_write,
154};
155
156static constexpr std::size_t Clause_enumSize = 46;
157
158constexpr auto ACCC_async = Clause::ACCC_async;
159constexpr auto ACCC_attach = Clause::ACCC_attach;
160constexpr auto ACCC_auto = Clause::ACCC_auto;
161constexpr auto ACCC_bind = Clause::ACCC_bind;
162constexpr auto ACCC_capture = Clause::ACCC_capture;
163constexpr auto ACCC_collapse = Clause::ACCC_collapse;
164constexpr auto ACCC_copy = Clause::ACCC_copy;
165constexpr auto ACCC_copyin = Clause::ACCC_copyin;
166constexpr auto ACCC_copyout = Clause::ACCC_copyout;
167constexpr auto ACCC_create = Clause::ACCC_create;
168constexpr auto ACCC_default = Clause::ACCC_default;
169constexpr auto ACCC_default_async = Clause::ACCC_default_async;
170constexpr auto ACCC_delete = Clause::ACCC_delete;
171constexpr auto ACCC_detach = Clause::ACCC_detach;
172constexpr auto ACCC_device = Clause::ACCC_device;
173constexpr auto ACCC_device_num = Clause::ACCC_device_num;
174constexpr auto ACCC_deviceptr = Clause::ACCC_deviceptr;
175constexpr auto ACCC_device_resident = Clause::ACCC_device_resident;
176constexpr auto ACCC_device_type = Clause::ACCC_device_type;
177constexpr auto ACCC_finalize = Clause::ACCC_finalize;
178constexpr auto ACCC_firstprivate = Clause::ACCC_firstprivate;
179constexpr auto ACCC_gang = Clause::ACCC_gang;
180constexpr auto ACCC_host = Clause::ACCC_host;
181constexpr auto ACCC_if = Clause::ACCC_if;
182constexpr auto ACCC_if_present = Clause::ACCC_if_present;
183constexpr auto ACCC_independent = Clause::ACCC_independent;
184constexpr auto ACCC_link = Clause::ACCC_link;
185constexpr auto ACCC_no_create = Clause::ACCC_no_create;
186constexpr auto ACCC_nohost = Clause::ACCC_nohost;
187constexpr auto ACCC_num_gangs = Clause::ACCC_num_gangs;
188constexpr auto ACCC_num_workers = Clause::ACCC_num_workers;
189constexpr auto ACCC_present = Clause::ACCC_present;
190constexpr auto ACCC_private = Clause::ACCC_private;
191constexpr auto ACCC_read = Clause::ACCC_read;
192constexpr auto ACCC_reduction = Clause::ACCC_reduction;
193constexpr auto ACCC_self = Clause::ACCC_self;
194constexpr auto ACCC_seq = Clause::ACCC_seq;
195constexpr auto ACCC_shortloop = Clause::ACCC_shortloop;
196constexpr auto ACCC_tile = Clause::ACCC_tile;
197constexpr auto ACCC_unknown = Clause::ACCC_unknown;
198constexpr auto ACCC_use_device = Clause::ACCC_use_device;
199constexpr auto ACCC_vector = Clause::ACCC_vector;
200constexpr auto ACCC_vector_length = Clause::ACCC_vector_length;
201constexpr auto ACCC_wait = Clause::ACCC_wait;
202constexpr auto ACCC_worker = Clause::ACCC_worker;
203constexpr auto ACCC_write = Clause::ACCC_write;
204
205enum class LoopModifier {
206 flattened,
207 First_ = flattened,
208 fused,
209 grid,
210 identity,
211 interchanged,
212 intratile,
213 offsets,
214 reversed,
215 split,
216 unrolled,
217 Last_ = unrolled,
218};
219
220static constexpr std::size_t LoopModifier_enumSize = 10;
221
222constexpr auto flattened = LoopModifier::flattened;
223constexpr auto fused = LoopModifier::fused;
224constexpr auto grid = LoopModifier::grid;
225constexpr auto identity = LoopModifier::identity;
226constexpr auto interchanged = LoopModifier::interchanged;
227constexpr auto intratile = LoopModifier::intratile;
228constexpr auto offsets = LoopModifier::offsets;
229constexpr auto reversed = LoopModifier::reversed;
230constexpr auto split = LoopModifier::split;
231constexpr auto unrolled = LoopModifier::unrolled;
232
233enum class DefaultValue {
234 ACC_Default_present=0,
235 ACC_Default_none=1,
236};
237
238constexpr auto ACC_Default_present = DefaultValue::ACC_Default_present;
239constexpr auto ACC_Default_none = DefaultValue::ACC_Default_none;
240
241// Constexpr functions.
242
243constexpr Association getDirectiveAssociation(Directive Dir) {
244 switch (Dir) {
245 case ACCD_atomic:
246 return Association::Block;
247 case ACCD_cache:
248 return Association::None;
249 case ACCD_data:
250 return Association::Block;
251 case ACCD_declare:
252 return Association::None;
253 case ACCD_enter_data:
254 return Association::None;
255 case ACCD_exit_data:
256 return Association::None;
257 case ACCD_host_data:
258 return Association::Block;
259 case ACCD_init:
260 return Association::None;
261 case ACCD_kernels:
262 return Association::Block;
263 case ACCD_kernels_loop:
264 return Association::LoopNest;
265 case ACCD_loop:
266 return Association::LoopNest;
267 case ACCD_parallel:
268 return Association::Block;
269 case ACCD_parallel_loop:
270 return Association::LoopNest;
271 case ACCD_routine:
272 return Association::Declaration;
273 case ACCD_serial:
274 return Association::Block;
275 case ACCD_serial_loop:
276 return Association::LoopNest;
277 case ACCD_set:
278 return Association::None;
279 case ACCD_shutdown:
280 return Association::None;
281 case ACCD_unknown:
282 return Association::None;
283 case ACCD_update:
284 return Association::None;
285 case ACCD_wait:
286 return Association::None;
287 } // switch (Dir)
288#if !defined(__clang__) && defined(__GNUC__) && __GNUC__ < 9
289 abort();
290#else
291 llvm_unreachable("Unexpected directive");
292#endif
293}
294
295constexpr Category getDirectiveCategory(Directive Dir) {
296 switch (Dir) {
297 case ACCD_atomic:
298 return Category::Executable;
299 case ACCD_cache:
300 return Category::Executable;
301 case ACCD_data:
302 return Category::Executable;
303 case ACCD_declare:
304 return Category::Declarative;
305 case ACCD_enter_data:
306 return Category::Executable;
307 case ACCD_exit_data:
308 return Category::Executable;
309 case ACCD_host_data:
310 return Category::Executable;
311 case ACCD_init:
312 return Category::Executable;
313 case ACCD_kernels:
314 return Category::Executable;
315 case ACCD_kernels_loop:
316 return Category::Executable;
317 case ACCD_loop:
318 return Category::Executable;
319 case ACCD_parallel:
320 return Category::Executable;
321 case ACCD_parallel_loop:
322 return Category::Executable;
323 case ACCD_routine:
324 return Category::Declarative;
325 case ACCD_serial:
326 return Category::Executable;
327 case ACCD_serial_loop:
328 return Category::Executable;
329 case ACCD_set:
330 return Category::Executable;
331 case ACCD_shutdown:
332 return Category::Executable;
333 case ACCD_unknown:
334 return Category::Utility;
335 case ACCD_update:
336 return Category::Executable;
337 case ACCD_wait:
338 return Category::Executable;
339 } // switch (Dir)
340#if !defined(__clang__) && defined(__GNUC__) && __GNUC__ < 9
341 abort();
342#else
343 llvm_unreachable("Unexpected directive");
344#endif
345}
346
347constexpr SourceLanguage getDirectiveLanguages(Directive D) {
348 switch (D) {
349 case ACCD_atomic:
350 return SourceLanguage::C | SourceLanguage::Fortran;
351 case ACCD_cache:
352 return SourceLanguage::C | SourceLanguage::Fortran;
353 case ACCD_data:
354 return SourceLanguage::C | SourceLanguage::Fortran;
355 case ACCD_declare:
356 return SourceLanguage::C | SourceLanguage::Fortran;
357 case ACCD_enter_data:
358 return SourceLanguage::C | SourceLanguage::Fortran;
359 case ACCD_exit_data:
360 return SourceLanguage::C | SourceLanguage::Fortran;
361 case ACCD_host_data:
362 return SourceLanguage::C | SourceLanguage::Fortran;
363 case ACCD_init:
364 return SourceLanguage::C | SourceLanguage::Fortran;
365 case ACCD_kernels:
366 return SourceLanguage::C | SourceLanguage::Fortran;
367 case ACCD_kernels_loop:
368 return SourceLanguage::C | SourceLanguage::Fortran;
369 case ACCD_loop:
370 return SourceLanguage::C | SourceLanguage::Fortran;
371 case ACCD_parallel:
372 return SourceLanguage::C | SourceLanguage::Fortran;
373 case ACCD_parallel_loop:
374 return SourceLanguage::C | SourceLanguage::Fortran;
375 case ACCD_routine:
376 return SourceLanguage::C | SourceLanguage::Fortran;
377 case ACCD_serial:
378 return SourceLanguage::C | SourceLanguage::Fortran;
379 case ACCD_serial_loop:
380 return SourceLanguage::C | SourceLanguage::Fortran;
381 case ACCD_set:
382 return SourceLanguage::C | SourceLanguage::Fortran;
383 case ACCD_shutdown:
384 return SourceLanguage::C | SourceLanguage::Fortran;
385 case ACCD_unknown:
386 return SourceLanguage::C | SourceLanguage::Fortran;
387 case ACCD_update:
388 return SourceLanguage::C | SourceLanguage::Fortran;
389 case ACCD_wait:
390 return SourceLanguage::C | SourceLanguage::Fortran;
391 } // switch(D)
392#if !defined(__clang__) && defined(__GNUC__) && __GNUC__ < 9
393 abort();
394#else
395 llvm_unreachable("Unexpected directive");
396#endif
397}
398
399// Enumeration helper functions
400LLVM_ABI std::pair<Directive, directive::VersionRange> getOpenACCDirectiveKindAndVersions(StringRef Str);
401inline Directive getOpenACCDirectiveKind(StringRef Str) {
402 return getOpenACCDirectiveKindAndVersions(Str).first;
403}
404
405LLVM_ABI StringRef getOpenACCDirectiveName(Directive D, unsigned Ver = 0);
406
407LLVM_ABI std::pair<Clause, directive::VersionRange> getOpenACCClauseKindAndVersions(StringRef Str);
408
409inline Clause getOpenACCClauseKind(StringRef Str) {
410 return getOpenACCClauseKindAndVersions(Str).first;
411}
412
413LLVM_ABI StringRef getOpenACCClauseName(Clause C, unsigned Ver = 0);
414
415/// Return true if \p C is a valid clause for \p D in version \p Version.
416LLVM_ABI bool isAllowedClauseForDirective(Directive D, Clause C, unsigned Version);
417
418constexpr std::size_t getMaxLeafCount() { return 2; }
419LLVM_ABI bool isAllowedLoopModifier(Directive D, LoopModifier LM);
420LLVM_ABI StringRef getLoopModifierName(LoopModifier LM, unsigned Ver = 0);
421LLVM_ABI DefaultValue getDefaultValue(StringRef Str);
422LLVM_ABI StringRef getOpenACCDefaultValueName(DefaultValue x);
423
424} // namespace acc
425
426template <> struct enum_iteration_traits<acc::Association> {
427 static constexpr bool is_iterable = true;
428};
429
430template <> struct enum_iteration_traits<acc::Category> {
431 static constexpr bool is_iterable = true;
432};
433
434template <> struct enum_iteration_traits<acc::Directive> {
435 static constexpr bool is_iterable = true;
436};
437
438template <> struct enum_iteration_traits<acc::Clause> {
439 static constexpr bool is_iterable = true;
440};
441
442template <> struct enum_iteration_traits<acc::LoopModifier> {
443 static constexpr bool is_iterable = true;
444};
445
446} // namespace llvm
447
448#endif // LLVM_OpenACC_INC
449
450