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