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 <cstddef> 7 8namespace llvm { 9class StringRef; 10namespace acc { 11 12LLVM_ENABLE_BITMASK_ENUMS_IN_NAMESPACE(); 13 14enum class Association { 15 Block, 16 Declaration, 17 Delimited, 18 Loop, 19 None, 20 Separating, 21}; 22 23static constexpr std::size_t Association_enumSize = 6; 24 25enum class Directive { 26 ACCD_atomic, 27 ACCD_cache, 28 ACCD_data, 29 ACCD_declare, 30 ACCD_enter_data, 31 ACCD_exit_data, 32 ACCD_host_data, 33 ACCD_init, 34 ACCD_kernels, 35 ACCD_kernels_loop, 36 ACCD_loop, 37 ACCD_parallel, 38 ACCD_parallel_loop, 39 ACCD_routine, 40 ACCD_serial, 41 ACCD_serial_loop, 42 ACCD_set, 43 ACCD_shutdown, 44 ACCD_unknown, 45 ACCD_update, 46 ACCD_wait, 47}; 48 49static constexpr std::size_t Directive_enumSize = 21; 50 51constexpr auto ACCD_atomic = llvm::acc::Directive::ACCD_atomic; 52constexpr auto ACCD_cache = llvm::acc::Directive::ACCD_cache; 53constexpr auto ACCD_data = llvm::acc::Directive::ACCD_data; 54constexpr auto ACCD_declare = llvm::acc::Directive::ACCD_declare; 55constexpr auto ACCD_enter_data = llvm::acc::Directive::ACCD_enter_data; 56constexpr auto ACCD_exit_data = llvm::acc::Directive::ACCD_exit_data; 57constexpr auto ACCD_host_data = llvm::acc::Directive::ACCD_host_data; 58constexpr auto ACCD_init = llvm::acc::Directive::ACCD_init; 59constexpr auto ACCD_kernels = llvm::acc::Directive::ACCD_kernels; 60constexpr auto ACCD_kernels_loop = llvm::acc::Directive::ACCD_kernels_loop; 61constexpr auto ACCD_loop = llvm::acc::Directive::ACCD_loop; 62constexpr auto ACCD_parallel = llvm::acc::Directive::ACCD_parallel; 63constexpr auto ACCD_parallel_loop = llvm::acc::Directive::ACCD_parallel_loop; 64constexpr auto ACCD_routine = llvm::acc::Directive::ACCD_routine; 65constexpr auto ACCD_serial = llvm::acc::Directive::ACCD_serial; 66constexpr auto ACCD_serial_loop = llvm::acc::Directive::ACCD_serial_loop; 67constexpr auto ACCD_set = llvm::acc::Directive::ACCD_set; 68constexpr auto ACCD_shutdown = llvm::acc::Directive::ACCD_shutdown; 69constexpr auto ACCD_unknown = llvm::acc::Directive::ACCD_unknown; 70constexpr auto ACCD_update = llvm::acc::Directive::ACCD_update; 71constexpr auto ACCD_wait = llvm::acc::Directive::ACCD_wait; 72 73enum class Clause { 74 ACCC_async, 75 ACCC_attach, 76 ACCC_auto, 77 ACCC_bind, 78 ACCC_capture, 79 ACCC_collapse, 80 ACCC_copy, 81 ACCC_copyin, 82 ACCC_copyout, 83 ACCC_create, 84 ACCC_default, 85 ACCC_default_async, 86 ACCC_delete, 87 ACCC_detach, 88 ACCC_device, 89 ACCC_device_num, 90 ACCC_deviceptr, 91 ACCC_device_resident, 92 ACCC_device_type, 93 ACCC_finalize, 94 ACCC_firstprivate, 95 ACCC_gang, 96 ACCC_host, 97 ACCC_if, 98 ACCC_if_present, 99 ACCC_independent, 100 ACCC_link, 101 ACCC_no_create, 102 ACCC_nohost, 103 ACCC_num_gangs, 104 ACCC_num_workers, 105 ACCC_present, 106 ACCC_private, 107 ACCC_read, 108 ACCC_reduction, 109 ACCC_self, 110 ACCC_seq, 111 ACCC_tile, 112 ACCC_unknown, 113 ACCC_use_device, 114 ACCC_vector, 115 ACCC_vector_length, 116 ACCC_wait, 117 ACCC_worker, 118 ACCC_write, 119}; 120 121static constexpr std::size_t Clause_enumSize = 45; 122 123constexpr auto ACCC_async = llvm::acc::Clause::ACCC_async; 124constexpr auto ACCC_attach = llvm::acc::Clause::ACCC_attach; 125constexpr auto ACCC_auto = llvm::acc::Clause::ACCC_auto; 126constexpr auto ACCC_bind = llvm::acc::Clause::ACCC_bind; 127constexpr auto ACCC_capture = llvm::acc::Clause::ACCC_capture; 128constexpr auto ACCC_collapse = llvm::acc::Clause::ACCC_collapse; 129constexpr auto ACCC_copy = llvm::acc::Clause::ACCC_copy; 130constexpr auto ACCC_copyin = llvm::acc::Clause::ACCC_copyin; 131constexpr auto ACCC_copyout = llvm::acc::Clause::ACCC_copyout; 132constexpr auto ACCC_create = llvm::acc::Clause::ACCC_create; 133constexpr auto ACCC_default = llvm::acc::Clause::ACCC_default; 134constexpr auto ACCC_default_async = llvm::acc::Clause::ACCC_default_async; 135constexpr auto ACCC_delete = llvm::acc::Clause::ACCC_delete; 136constexpr auto ACCC_detach = llvm::acc::Clause::ACCC_detach; 137constexpr auto ACCC_device = llvm::acc::Clause::ACCC_device; 138constexpr auto ACCC_device_num = llvm::acc::Clause::ACCC_device_num; 139constexpr auto ACCC_deviceptr = llvm::acc::Clause::ACCC_deviceptr; 140constexpr auto ACCC_device_resident = llvm::acc::Clause::ACCC_device_resident; 141constexpr auto ACCC_device_type = llvm::acc::Clause::ACCC_device_type; 142constexpr auto ACCC_finalize = llvm::acc::Clause::ACCC_finalize; 143constexpr auto ACCC_firstprivate = llvm::acc::Clause::ACCC_firstprivate; 144constexpr auto ACCC_gang = llvm::acc::Clause::ACCC_gang; 145constexpr auto ACCC_host = llvm::acc::Clause::ACCC_host; 146constexpr auto ACCC_if = llvm::acc::Clause::ACCC_if; 147constexpr auto ACCC_if_present = llvm::acc::Clause::ACCC_if_present; 148constexpr auto ACCC_independent = llvm::acc::Clause::ACCC_independent; 149constexpr auto ACCC_link = llvm::acc::Clause::ACCC_link; 150constexpr auto ACCC_no_create = llvm::acc::Clause::ACCC_no_create; 151constexpr auto ACCC_nohost = llvm::acc::Clause::ACCC_nohost; 152constexpr auto ACCC_num_gangs = llvm::acc::Clause::ACCC_num_gangs; 153constexpr auto ACCC_num_workers = llvm::acc::Clause::ACCC_num_workers; 154constexpr auto ACCC_present = llvm::acc::Clause::ACCC_present; 155constexpr auto ACCC_private = llvm::acc::Clause::ACCC_private; 156constexpr auto ACCC_read = llvm::acc::Clause::ACCC_read; 157constexpr auto ACCC_reduction = llvm::acc::Clause::ACCC_reduction; 158constexpr auto ACCC_self = llvm::acc::Clause::ACCC_self; 159constexpr auto ACCC_seq = llvm::acc::Clause::ACCC_seq; 160constexpr auto ACCC_tile = llvm::acc::Clause::ACCC_tile; 161constexpr auto ACCC_unknown = llvm::acc::Clause::ACCC_unknown; 162constexpr auto ACCC_use_device = llvm::acc::Clause::ACCC_use_device; 163constexpr auto ACCC_vector = llvm::acc::Clause::ACCC_vector; 164constexpr auto ACCC_vector_length = llvm::acc::Clause::ACCC_vector_length; 165constexpr auto ACCC_wait = llvm::acc::Clause::ACCC_wait; 166constexpr auto ACCC_worker = llvm::acc::Clause::ACCC_worker; 167constexpr auto ACCC_write = llvm::acc::Clause::ACCC_write; 168 169enum class DefaultValue { 170 ACC_Default_present=0, 171 ACC_Default_none=1, 172}; 173 174constexpr auto ACC_Default_present = llvm::acc::DefaultValue::ACC_Default_present; 175constexpr auto ACC_Default_none = llvm::acc::DefaultValue::ACC_Default_none; 176 177// Enumeration helper functions 178Directive getOpenACCDirectiveKind(llvm::StringRef Str); 179 180llvm::StringRef getOpenACCDirectiveName(Directive D); 181 182Clause getOpenACCClauseKind(llvm::StringRef Str); 183 184llvm::StringRef getOpenACCClauseName(Clause C); 185 186/// Return true if \p C is a valid clause for \p D in version \p Version. 187bool isAllowedClauseForDirective(Directive D, Clause C, unsigned Version); 188 189constexpr std::size_t getMaxLeafCount() { return 2; } 190Association getDirectiveAssociation(Directive D); 191DefaultValue getDefaultValue(StringRef); 192llvm::StringRef getOpenACCDefaultValueName(DefaultValue); 193 194} // namespace acc 195} // namespace llvm 196#endif // LLVM_OpenACC_INC 197