OpenMPKinds.cpp 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866
  1. //===--- OpenMPKinds.cpp - Token Kinds Support ----------------------------===//
  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. /// \file
  9. /// This file implements the OpenMP enum and support functions.
  10. ///
  11. //===----------------------------------------------------------------------===//
  12. #include "clang/Basic/OpenMPKinds.h"
  13. #include "clang/Basic/IdentifierTable.h"
  14. #include "llvm/ADT/StringRef.h"
  15. #include "llvm/ADT/StringSwitch.h"
  16. #include "llvm/Support/ErrorHandling.h"
  17. #include <cassert>
  18. using namespace clang;
  19. using namespace llvm::omp;
  20. unsigned clang::getOpenMPSimpleClauseType(OpenMPClauseKind Kind, StringRef Str,
  21. const LangOptions &LangOpts) {
  22. switch (Kind) {
  23. case OMPC_default:
  24. return llvm::StringSwitch<unsigned>(Str)
  25. #define OMP_DEFAULT_KIND(Enum, Name) .Case(Name, unsigned(Enum))
  26. #include "llvm/Frontend/OpenMP/OMPKinds.def"
  27. .Default(unsigned(llvm::omp::OMP_DEFAULT_unknown));
  28. case OMPC_proc_bind:
  29. return llvm::StringSwitch<unsigned>(Str)
  30. #define OMP_PROC_BIND_KIND(Enum, Name, Value) .Case(Name, Value)
  31. #include "llvm/Frontend/OpenMP/OMPKinds.def"
  32. .Default(unsigned(llvm::omp::OMP_PROC_BIND_unknown));
  33. case OMPC_schedule:
  34. return llvm::StringSwitch<unsigned>(Str)
  35. #define OPENMP_SCHEDULE_KIND(Name) \
  36. .Case(#Name, static_cast<unsigned>(OMPC_SCHEDULE_##Name))
  37. #define OPENMP_SCHEDULE_MODIFIER(Name) \
  38. .Case(#Name, static_cast<unsigned>(OMPC_SCHEDULE_MODIFIER_##Name))
  39. #include "clang/Basic/OpenMPKinds.def"
  40. .Default(OMPC_SCHEDULE_unknown);
  41. case OMPC_depend: {
  42. unsigned Type = llvm::StringSwitch<unsigned>(Str)
  43. #define OPENMP_DEPEND_KIND(Name) .Case(#Name, OMPC_DEPEND_##Name)
  44. #include "clang/Basic/OpenMPKinds.def"
  45. .Default(OMPC_DEPEND_unknown);
  46. if (LangOpts.OpenMP < 51 && Type == OMPC_DEPEND_inoutset)
  47. return OMPC_DEPEND_unknown;
  48. return Type;
  49. }
  50. case OMPC_linear:
  51. return llvm::StringSwitch<OpenMPLinearClauseKind>(Str)
  52. #define OPENMP_LINEAR_KIND(Name) .Case(#Name, OMPC_LINEAR_##Name)
  53. #include "clang/Basic/OpenMPKinds.def"
  54. .Default(OMPC_LINEAR_unknown);
  55. case OMPC_map: {
  56. unsigned Type = llvm::StringSwitch<unsigned>(Str)
  57. #define OPENMP_MAP_KIND(Name) \
  58. .Case(#Name, static_cast<unsigned>(OMPC_MAP_##Name))
  59. #define OPENMP_MAP_MODIFIER_KIND(Name) \
  60. .Case(#Name, static_cast<unsigned>(OMPC_MAP_MODIFIER_##Name))
  61. #include "clang/Basic/OpenMPKinds.def"
  62. .Default(OMPC_MAP_unknown);
  63. if (LangOpts.OpenMP < 51 && Type == OMPC_MAP_MODIFIER_present)
  64. return OMPC_MAP_MODIFIER_unknown;
  65. if (!LangOpts.OpenMPExtensions && Type == OMPC_MAP_MODIFIER_ompx_hold)
  66. return OMPC_MAP_MODIFIER_unknown;
  67. return Type;
  68. }
  69. case OMPC_to:
  70. case OMPC_from: {
  71. unsigned Type = llvm::StringSwitch<unsigned>(Str)
  72. #define OPENMP_MOTION_MODIFIER_KIND(Name) \
  73. .Case(#Name, static_cast<unsigned>(OMPC_MOTION_MODIFIER_##Name))
  74. #include "clang/Basic/OpenMPKinds.def"
  75. .Default(OMPC_MOTION_MODIFIER_unknown);
  76. if (LangOpts.OpenMP < 51 && Type == OMPC_MOTION_MODIFIER_present)
  77. return OMPC_MOTION_MODIFIER_unknown;
  78. return Type;
  79. }
  80. case OMPC_dist_schedule:
  81. return llvm::StringSwitch<OpenMPDistScheduleClauseKind>(Str)
  82. #define OPENMP_DIST_SCHEDULE_KIND(Name) .Case(#Name, OMPC_DIST_SCHEDULE_##Name)
  83. #include "clang/Basic/OpenMPKinds.def"
  84. .Default(OMPC_DIST_SCHEDULE_unknown);
  85. case OMPC_defaultmap:
  86. return llvm::StringSwitch<unsigned>(Str)
  87. #define OPENMP_DEFAULTMAP_KIND(Name) \
  88. .Case(#Name, static_cast<unsigned>(OMPC_DEFAULTMAP_##Name))
  89. #define OPENMP_DEFAULTMAP_MODIFIER(Name) \
  90. .Case(#Name, static_cast<unsigned>(OMPC_DEFAULTMAP_MODIFIER_##Name))
  91. #include "clang/Basic/OpenMPKinds.def"
  92. .Default(OMPC_DEFAULTMAP_unknown);
  93. case OMPC_atomic_default_mem_order:
  94. return llvm::StringSwitch<OpenMPAtomicDefaultMemOrderClauseKind>(Str)
  95. #define OPENMP_ATOMIC_DEFAULT_MEM_ORDER_KIND(Name) \
  96. .Case(#Name, OMPC_ATOMIC_DEFAULT_MEM_ORDER_##Name)
  97. #include "clang/Basic/OpenMPKinds.def"
  98. .Default(OMPC_ATOMIC_DEFAULT_MEM_ORDER_unknown);
  99. case OMPC_device_type:
  100. return llvm::StringSwitch<OpenMPDeviceType>(Str)
  101. #define OPENMP_DEVICE_TYPE_KIND(Name) .Case(#Name, OMPC_DEVICE_TYPE_##Name)
  102. #include "clang/Basic/OpenMPKinds.def"
  103. .Default(OMPC_DEVICE_TYPE_unknown);
  104. case OMPC_at:
  105. return llvm::StringSwitch<OpenMPAtClauseKind>(Str)
  106. #define OPENMP_AT_KIND(Name) .Case(#Name, OMPC_AT_##Name)
  107. #include "clang/Basic/OpenMPKinds.def"
  108. .Default(OMPC_AT_unknown);
  109. case OMPC_severity:
  110. return llvm::StringSwitch<OpenMPSeverityClauseKind>(Str)
  111. #define OPENMP_SEVERITY_KIND(Name) .Case(#Name, OMPC_SEVERITY_##Name)
  112. #include "clang/Basic/OpenMPKinds.def"
  113. .Default(OMPC_SEVERITY_unknown);
  114. case OMPC_lastprivate:
  115. return llvm::StringSwitch<OpenMPLastprivateModifier>(Str)
  116. #define OPENMP_LASTPRIVATE_KIND(Name) .Case(#Name, OMPC_LASTPRIVATE_##Name)
  117. #include "clang/Basic/OpenMPKinds.def"
  118. .Default(OMPC_LASTPRIVATE_unknown);
  119. case OMPC_order:
  120. return llvm::StringSwitch<unsigned>(Str)
  121. #define OPENMP_ORDER_KIND(Name) \
  122. .Case(#Name, static_cast<unsigned>(OMPC_ORDER_##Name))
  123. #define OPENMP_ORDER_MODIFIER(Name) \
  124. .Case(#Name, static_cast<unsigned>(OMPC_ORDER_MODIFIER_##Name))
  125. #include "clang/Basic/OpenMPKinds.def"
  126. .Default(OMPC_ORDER_unknown);
  127. case OMPC_update:
  128. return llvm::StringSwitch<OpenMPDependClauseKind>(Str)
  129. #define OPENMP_DEPEND_KIND(Name) .Case(#Name, OMPC_DEPEND_##Name)
  130. #include "clang/Basic/OpenMPKinds.def"
  131. .Default(OMPC_DEPEND_unknown);
  132. case OMPC_device:
  133. return llvm::StringSwitch<OpenMPDeviceClauseModifier>(Str)
  134. #define OPENMP_DEVICE_MODIFIER(Name) .Case(#Name, OMPC_DEVICE_##Name)
  135. #include "clang/Basic/OpenMPKinds.def"
  136. .Default(OMPC_DEVICE_unknown);
  137. case OMPC_reduction:
  138. return llvm::StringSwitch<OpenMPReductionClauseModifier>(Str)
  139. #define OPENMP_REDUCTION_MODIFIER(Name) .Case(#Name, OMPC_REDUCTION_##Name)
  140. #include "clang/Basic/OpenMPKinds.def"
  141. .Default(OMPC_REDUCTION_unknown);
  142. case OMPC_adjust_args:
  143. return llvm::StringSwitch<OpenMPAdjustArgsOpKind>(Str)
  144. #define OPENMP_ADJUST_ARGS_KIND(Name) .Case(#Name, OMPC_ADJUST_ARGS_##Name)
  145. #include "clang/Basic/OpenMPKinds.def"
  146. .Default(OMPC_ADJUST_ARGS_unknown);
  147. case OMPC_bind:
  148. return llvm::StringSwitch<unsigned>(Str)
  149. #define OPENMP_BIND_KIND(Name) .Case(#Name, OMPC_BIND_##Name)
  150. #include "clang/Basic/OpenMPKinds.def"
  151. .Default(OMPC_BIND_unknown);
  152. case OMPC_grainsize: {
  153. unsigned Type = llvm::StringSwitch<unsigned>(Str)
  154. #define OPENMP_GRAINSIZE_MODIFIER(Name) .Case(#Name, OMPC_GRAINSIZE_##Name)
  155. #include "clang/Basic/OpenMPKinds.def"
  156. .Default(OMPC_GRAINSIZE_unknown);
  157. if (LangOpts.OpenMP < 51)
  158. return OMPC_GRAINSIZE_unknown;
  159. return Type;
  160. }
  161. case OMPC_num_tasks: {
  162. unsigned Type = llvm::StringSwitch<unsigned>(Str)
  163. #define OPENMP_NUMTASKS_MODIFIER(Name) .Case(#Name, OMPC_NUMTASKS_##Name)
  164. #include "clang/Basic/OpenMPKinds.def"
  165. .Default(OMPC_NUMTASKS_unknown);
  166. if (LangOpts.OpenMP < 51)
  167. return OMPC_NUMTASKS_unknown;
  168. return Type;
  169. }
  170. case OMPC_unknown:
  171. case OMPC_threadprivate:
  172. case OMPC_if:
  173. case OMPC_final:
  174. case OMPC_num_threads:
  175. case OMPC_safelen:
  176. case OMPC_simdlen:
  177. case OMPC_sizes:
  178. case OMPC_allocator:
  179. case OMPC_allocate:
  180. case OMPC_collapse:
  181. case OMPC_private:
  182. case OMPC_firstprivate:
  183. case OMPC_shared:
  184. case OMPC_task_reduction:
  185. case OMPC_in_reduction:
  186. case OMPC_aligned:
  187. case OMPC_copyin:
  188. case OMPC_copyprivate:
  189. case OMPC_ordered:
  190. case OMPC_nowait:
  191. case OMPC_untied:
  192. case OMPC_mergeable:
  193. case OMPC_flush:
  194. case OMPC_depobj:
  195. case OMPC_read:
  196. case OMPC_write:
  197. case OMPC_capture:
  198. case OMPC_compare:
  199. case OMPC_seq_cst:
  200. case OMPC_acq_rel:
  201. case OMPC_acquire:
  202. case OMPC_release:
  203. case OMPC_relaxed:
  204. case OMPC_threads:
  205. case OMPC_simd:
  206. case OMPC_num_teams:
  207. case OMPC_thread_limit:
  208. case OMPC_priority:
  209. case OMPC_nogroup:
  210. case OMPC_hint:
  211. case OMPC_uniform:
  212. case OMPC_use_device_ptr:
  213. case OMPC_use_device_addr:
  214. case OMPC_is_device_ptr:
  215. case OMPC_has_device_addr:
  216. case OMPC_unified_address:
  217. case OMPC_unified_shared_memory:
  218. case OMPC_reverse_offload:
  219. case OMPC_dynamic_allocators:
  220. case OMPC_match:
  221. case OMPC_nontemporal:
  222. case OMPC_destroy:
  223. case OMPC_novariants:
  224. case OMPC_nocontext:
  225. case OMPC_detach:
  226. case OMPC_inclusive:
  227. case OMPC_exclusive:
  228. case OMPC_uses_allocators:
  229. case OMPC_affinity:
  230. case OMPC_when:
  231. case OMPC_append_args:
  232. break;
  233. default:
  234. break;
  235. }
  236. llvm_unreachable("Invalid OpenMP simple clause kind");
  237. }
  238. const char *clang::getOpenMPSimpleClauseTypeName(OpenMPClauseKind Kind,
  239. unsigned Type) {
  240. switch (Kind) {
  241. case OMPC_default:
  242. switch (llvm::omp::DefaultKind(Type)) {
  243. #define OMP_DEFAULT_KIND(Enum, Name) \
  244. case Enum: \
  245. return Name;
  246. #include "llvm/Frontend/OpenMP/OMPKinds.def"
  247. }
  248. llvm_unreachable("Invalid OpenMP 'default' clause type");
  249. case OMPC_proc_bind:
  250. switch (Type) {
  251. #define OMP_PROC_BIND_KIND(Enum, Name, Value) \
  252. case Value: \
  253. return Name;
  254. #include "llvm/Frontend/OpenMP/OMPKinds.def"
  255. }
  256. llvm_unreachable("Invalid OpenMP 'proc_bind' clause type");
  257. case OMPC_schedule:
  258. switch (Type) {
  259. case OMPC_SCHEDULE_unknown:
  260. case OMPC_SCHEDULE_MODIFIER_last:
  261. return "unknown";
  262. #define OPENMP_SCHEDULE_KIND(Name) \
  263. case OMPC_SCHEDULE_##Name: \
  264. return #Name;
  265. #define OPENMP_SCHEDULE_MODIFIER(Name) \
  266. case OMPC_SCHEDULE_MODIFIER_##Name: \
  267. return #Name;
  268. #include "clang/Basic/OpenMPKinds.def"
  269. }
  270. llvm_unreachable("Invalid OpenMP 'schedule' clause type");
  271. case OMPC_depend:
  272. switch (Type) {
  273. case OMPC_DEPEND_unknown:
  274. return "unknown";
  275. #define OPENMP_DEPEND_KIND(Name) \
  276. case OMPC_DEPEND_##Name: \
  277. return #Name;
  278. #include "clang/Basic/OpenMPKinds.def"
  279. }
  280. llvm_unreachable("Invalid OpenMP 'depend' clause type");
  281. case OMPC_linear:
  282. switch (Type) {
  283. case OMPC_LINEAR_unknown:
  284. return "unknown";
  285. #define OPENMP_LINEAR_KIND(Name) \
  286. case OMPC_LINEAR_##Name: \
  287. return #Name;
  288. #include "clang/Basic/OpenMPKinds.def"
  289. }
  290. llvm_unreachable("Invalid OpenMP 'linear' clause type");
  291. case OMPC_map:
  292. switch (Type) {
  293. case OMPC_MAP_unknown:
  294. case OMPC_MAP_MODIFIER_last:
  295. return "unknown";
  296. #define OPENMP_MAP_KIND(Name) \
  297. case OMPC_MAP_##Name: \
  298. return #Name;
  299. #define OPENMP_MAP_MODIFIER_KIND(Name) \
  300. case OMPC_MAP_MODIFIER_##Name: \
  301. return #Name;
  302. #include "clang/Basic/OpenMPKinds.def"
  303. default:
  304. break;
  305. }
  306. llvm_unreachable("Invalid OpenMP 'map' clause type");
  307. case OMPC_to:
  308. case OMPC_from:
  309. switch (Type) {
  310. case OMPC_MOTION_MODIFIER_unknown:
  311. return "unknown";
  312. #define OPENMP_MOTION_MODIFIER_KIND(Name) \
  313. case OMPC_MOTION_MODIFIER_##Name: \
  314. return #Name;
  315. #include "clang/Basic/OpenMPKinds.def"
  316. default:
  317. break;
  318. }
  319. llvm_unreachable("Invalid OpenMP 'to' or 'from' clause type");
  320. case OMPC_dist_schedule:
  321. switch (Type) {
  322. case OMPC_DIST_SCHEDULE_unknown:
  323. return "unknown";
  324. #define OPENMP_DIST_SCHEDULE_KIND(Name) \
  325. case OMPC_DIST_SCHEDULE_##Name: \
  326. return #Name;
  327. #include "clang/Basic/OpenMPKinds.def"
  328. }
  329. llvm_unreachable("Invalid OpenMP 'dist_schedule' clause type");
  330. case OMPC_defaultmap:
  331. switch (Type) {
  332. case OMPC_DEFAULTMAP_unknown:
  333. case OMPC_DEFAULTMAP_MODIFIER_last:
  334. return "unknown";
  335. #define OPENMP_DEFAULTMAP_KIND(Name) \
  336. case OMPC_DEFAULTMAP_##Name: \
  337. return #Name;
  338. #define OPENMP_DEFAULTMAP_MODIFIER(Name) \
  339. case OMPC_DEFAULTMAP_MODIFIER_##Name: \
  340. return #Name;
  341. #include "clang/Basic/OpenMPKinds.def"
  342. }
  343. llvm_unreachable("Invalid OpenMP 'schedule' clause type");
  344. case OMPC_atomic_default_mem_order:
  345. switch (Type) {
  346. case OMPC_ATOMIC_DEFAULT_MEM_ORDER_unknown:
  347. return "unknown";
  348. #define OPENMP_ATOMIC_DEFAULT_MEM_ORDER_KIND(Name) \
  349. case OMPC_ATOMIC_DEFAULT_MEM_ORDER_##Name: \
  350. return #Name;
  351. #include "clang/Basic/OpenMPKinds.def"
  352. }
  353. llvm_unreachable("Invalid OpenMP 'atomic_default_mem_order' clause type");
  354. case OMPC_device_type:
  355. switch (Type) {
  356. case OMPC_DEVICE_TYPE_unknown:
  357. return "unknown";
  358. #define OPENMP_DEVICE_TYPE_KIND(Name) \
  359. case OMPC_DEVICE_TYPE_##Name: \
  360. return #Name;
  361. #include "clang/Basic/OpenMPKinds.def"
  362. }
  363. llvm_unreachable("Invalid OpenMP 'device_type' clause type");
  364. case OMPC_at:
  365. switch (Type) {
  366. case OMPC_AT_unknown:
  367. return "unknown";
  368. #define OPENMP_AT_KIND(Name) \
  369. case OMPC_AT_##Name: \
  370. return #Name;
  371. #include "clang/Basic/OpenMPKinds.def"
  372. }
  373. llvm_unreachable("Invalid OpenMP 'at' clause type");
  374. case OMPC_severity:
  375. switch (Type) {
  376. case OMPC_SEVERITY_unknown:
  377. return "unknown";
  378. #define OPENMP_SEVERITY_KIND(Name) \
  379. case OMPC_SEVERITY_##Name: \
  380. return #Name;
  381. #include "clang/Basic/OpenMPKinds.def"
  382. }
  383. llvm_unreachable("Invalid OpenMP 'severity' clause type");
  384. case OMPC_lastprivate:
  385. switch (Type) {
  386. case OMPC_LASTPRIVATE_unknown:
  387. return "unknown";
  388. #define OPENMP_LASTPRIVATE_KIND(Name) \
  389. case OMPC_LASTPRIVATE_##Name: \
  390. return #Name;
  391. #include "clang/Basic/OpenMPKinds.def"
  392. }
  393. llvm_unreachable("Invalid OpenMP 'lastprivate' clause type");
  394. case OMPC_order:
  395. switch (Type) {
  396. case OMPC_ORDER_unknown:
  397. case OMPC_ORDER_MODIFIER_last:
  398. return "unknown";
  399. #define OPENMP_ORDER_KIND(Name) \
  400. case OMPC_ORDER_##Name: \
  401. return #Name;
  402. #define OPENMP_ORDER_MODIFIER(Name) \
  403. case OMPC_ORDER_MODIFIER_##Name: \
  404. return #Name;
  405. #include "clang/Basic/OpenMPKinds.def"
  406. }
  407. llvm_unreachable("Invalid OpenMP 'order' clause type");
  408. case OMPC_update:
  409. switch (Type) {
  410. case OMPC_DEPEND_unknown:
  411. return "unknown";
  412. #define OPENMP_DEPEND_KIND(Name) \
  413. case OMPC_DEPEND_##Name: \
  414. return #Name;
  415. #include "clang/Basic/OpenMPKinds.def"
  416. }
  417. llvm_unreachable("Invalid OpenMP 'depend' clause type");
  418. case OMPC_device:
  419. switch (Type) {
  420. case OMPC_DEVICE_unknown:
  421. return "unknown";
  422. #define OPENMP_DEVICE_MODIFIER(Name) \
  423. case OMPC_DEVICE_##Name: \
  424. return #Name;
  425. #include "clang/Basic/OpenMPKinds.def"
  426. }
  427. llvm_unreachable("Invalid OpenMP 'device' clause modifier");
  428. case OMPC_reduction:
  429. switch (Type) {
  430. case OMPC_REDUCTION_unknown:
  431. return "unknown";
  432. #define OPENMP_REDUCTION_MODIFIER(Name) \
  433. case OMPC_REDUCTION_##Name: \
  434. return #Name;
  435. #include "clang/Basic/OpenMPKinds.def"
  436. }
  437. llvm_unreachable("Invalid OpenMP 'reduction' clause modifier");
  438. case OMPC_adjust_args:
  439. switch (Type) {
  440. case OMPC_ADJUST_ARGS_unknown:
  441. return "unknown";
  442. #define OPENMP_ADJUST_ARGS_KIND(Name) \
  443. case OMPC_ADJUST_ARGS_##Name: \
  444. return #Name;
  445. #include "clang/Basic/OpenMPKinds.def"
  446. }
  447. llvm_unreachable("Invalid OpenMP 'adjust_args' clause kind");
  448. case OMPC_bind:
  449. switch (Type) {
  450. case OMPC_BIND_unknown:
  451. return "unknown";
  452. #define OPENMP_BIND_KIND(Name) \
  453. case OMPC_BIND_##Name: \
  454. return #Name;
  455. #include "clang/Basic/OpenMPKinds.def"
  456. }
  457. llvm_unreachable("Invalid OpenMP 'bind' clause type");
  458. case OMPC_grainsize:
  459. switch (Type) {
  460. case OMPC_GRAINSIZE_unknown:
  461. return "unknown";
  462. #define OPENMP_GRAINSIZE_MODIFIER(Name) \
  463. case OMPC_GRAINSIZE_##Name: \
  464. return #Name;
  465. #include "clang/Basic/OpenMPKinds.def"
  466. }
  467. llvm_unreachable("Invalid OpenMP 'grainsize' clause modifier");
  468. case OMPC_num_tasks:
  469. switch (Type) {
  470. case OMPC_NUMTASKS_unknown:
  471. return "unknown";
  472. #define OPENMP_NUMTASKS_MODIFIER(Name) \
  473. case OMPC_NUMTASKS_##Name: \
  474. return #Name;
  475. #include "clang/Basic/OpenMPKinds.def"
  476. }
  477. llvm_unreachable("Invalid OpenMP 'num_tasks' clause modifier");
  478. case OMPC_unknown:
  479. case OMPC_threadprivate:
  480. case OMPC_if:
  481. case OMPC_final:
  482. case OMPC_num_threads:
  483. case OMPC_safelen:
  484. case OMPC_simdlen:
  485. case OMPC_sizes:
  486. case OMPC_allocator:
  487. case OMPC_allocate:
  488. case OMPC_collapse:
  489. case OMPC_private:
  490. case OMPC_firstprivate:
  491. case OMPC_shared:
  492. case OMPC_task_reduction:
  493. case OMPC_in_reduction:
  494. case OMPC_aligned:
  495. case OMPC_copyin:
  496. case OMPC_copyprivate:
  497. case OMPC_ordered:
  498. case OMPC_nowait:
  499. case OMPC_untied:
  500. case OMPC_mergeable:
  501. case OMPC_flush:
  502. case OMPC_depobj:
  503. case OMPC_read:
  504. case OMPC_write:
  505. case OMPC_capture:
  506. case OMPC_compare:
  507. case OMPC_seq_cst:
  508. case OMPC_acq_rel:
  509. case OMPC_acquire:
  510. case OMPC_release:
  511. case OMPC_relaxed:
  512. case OMPC_threads:
  513. case OMPC_simd:
  514. case OMPC_num_teams:
  515. case OMPC_thread_limit:
  516. case OMPC_priority:
  517. case OMPC_nogroup:
  518. case OMPC_hint:
  519. case OMPC_uniform:
  520. case OMPC_use_device_ptr:
  521. case OMPC_use_device_addr:
  522. case OMPC_is_device_ptr:
  523. case OMPC_has_device_addr:
  524. case OMPC_unified_address:
  525. case OMPC_unified_shared_memory:
  526. case OMPC_reverse_offload:
  527. case OMPC_dynamic_allocators:
  528. case OMPC_match:
  529. case OMPC_nontemporal:
  530. case OMPC_destroy:
  531. case OMPC_detach:
  532. case OMPC_novariants:
  533. case OMPC_nocontext:
  534. case OMPC_inclusive:
  535. case OMPC_exclusive:
  536. case OMPC_uses_allocators:
  537. case OMPC_affinity:
  538. case OMPC_when:
  539. case OMPC_append_args:
  540. break;
  541. default:
  542. break;
  543. }
  544. llvm_unreachable("Invalid OpenMP simple clause kind");
  545. }
  546. bool clang::isOpenMPLoopDirective(OpenMPDirectiveKind DKind) {
  547. return DKind == OMPD_simd || DKind == OMPD_for || DKind == OMPD_for_simd ||
  548. DKind == OMPD_parallel_for || DKind == OMPD_parallel_for_simd ||
  549. DKind == OMPD_taskloop || DKind == OMPD_taskloop_simd ||
  550. DKind == OMPD_master_taskloop || DKind == OMPD_master_taskloop_simd ||
  551. DKind == OMPD_parallel_master_taskloop ||
  552. DKind == OMPD_parallel_master_taskloop_simd ||
  553. DKind == OMPD_masked_taskloop || DKind == OMPD_masked_taskloop_simd ||
  554. DKind == OMPD_parallel_masked_taskloop || DKind == OMPD_distribute ||
  555. DKind == OMPD_parallel_masked_taskloop_simd ||
  556. DKind == OMPD_target_parallel_for ||
  557. DKind == OMPD_distribute_parallel_for ||
  558. DKind == OMPD_distribute_parallel_for_simd ||
  559. DKind == OMPD_distribute_simd ||
  560. DKind == OMPD_target_parallel_for_simd || DKind == OMPD_target_simd ||
  561. DKind == OMPD_teams_distribute ||
  562. DKind == OMPD_teams_distribute_simd ||
  563. DKind == OMPD_teams_distribute_parallel_for_simd ||
  564. DKind == OMPD_teams_distribute_parallel_for ||
  565. DKind == OMPD_target_teams_distribute ||
  566. DKind == OMPD_target_teams_distribute_parallel_for ||
  567. DKind == OMPD_target_teams_distribute_parallel_for_simd ||
  568. DKind == OMPD_target_teams_distribute_simd || DKind == OMPD_tile ||
  569. DKind == OMPD_unroll || DKind == OMPD_loop ||
  570. DKind == OMPD_teams_loop || DKind == OMPD_target_teams_loop ||
  571. DKind == OMPD_parallel_loop || DKind == OMPD_target_parallel_loop;
  572. }
  573. bool clang::isOpenMPWorksharingDirective(OpenMPDirectiveKind DKind) {
  574. return DKind == OMPD_for || DKind == OMPD_for_simd ||
  575. DKind == OMPD_sections || DKind == OMPD_section ||
  576. DKind == OMPD_single || DKind == OMPD_parallel_for ||
  577. DKind == OMPD_parallel_for_simd || DKind == OMPD_parallel_sections ||
  578. DKind == OMPD_target_parallel_for ||
  579. DKind == OMPD_distribute_parallel_for ||
  580. DKind == OMPD_distribute_parallel_for_simd ||
  581. DKind == OMPD_target_parallel_for_simd ||
  582. DKind == OMPD_teams_distribute_parallel_for_simd ||
  583. DKind == OMPD_teams_distribute_parallel_for ||
  584. DKind == OMPD_target_teams_distribute_parallel_for ||
  585. DKind == OMPD_target_teams_distribute_parallel_for_simd;
  586. }
  587. bool clang::isOpenMPTaskLoopDirective(OpenMPDirectiveKind DKind) {
  588. return DKind == OMPD_taskloop || DKind == OMPD_taskloop_simd ||
  589. DKind == OMPD_master_taskloop || DKind == OMPD_master_taskloop_simd ||
  590. DKind == OMPD_parallel_master_taskloop ||
  591. DKind == OMPD_masked_taskloop || DKind == OMPD_masked_taskloop_simd ||
  592. DKind == OMPD_parallel_masked_taskloop ||
  593. DKind == OMPD_parallel_masked_taskloop_simd ||
  594. DKind == OMPD_parallel_master_taskloop_simd;
  595. }
  596. bool clang::isOpenMPParallelDirective(OpenMPDirectiveKind DKind) {
  597. return DKind == OMPD_parallel || DKind == OMPD_parallel_for ||
  598. DKind == OMPD_parallel_for_simd || DKind == OMPD_parallel_sections ||
  599. DKind == OMPD_target_parallel || DKind == OMPD_target_parallel_for ||
  600. DKind == OMPD_distribute_parallel_for ||
  601. DKind == OMPD_distribute_parallel_for_simd ||
  602. DKind == OMPD_target_parallel_for_simd ||
  603. DKind == OMPD_teams_distribute_parallel_for ||
  604. DKind == OMPD_teams_distribute_parallel_for_simd ||
  605. DKind == OMPD_target_teams_distribute_parallel_for ||
  606. DKind == OMPD_target_teams_distribute_parallel_for_simd ||
  607. DKind == OMPD_parallel_master || DKind == OMPD_parallel_masked ||
  608. DKind == OMPD_parallel_master_taskloop ||
  609. DKind == OMPD_parallel_master_taskloop_simd ||
  610. DKind == OMPD_parallel_masked_taskloop ||
  611. DKind == OMPD_parallel_masked_taskloop_simd ||
  612. DKind == OMPD_parallel_loop || DKind == OMPD_target_parallel_loop;
  613. }
  614. bool clang::isOpenMPTargetExecutionDirective(OpenMPDirectiveKind DKind) {
  615. return DKind == OMPD_target || DKind == OMPD_target_parallel ||
  616. DKind == OMPD_target_parallel_for ||
  617. DKind == OMPD_target_parallel_for_simd || DKind == OMPD_target_simd ||
  618. DKind == OMPD_target_teams || DKind == OMPD_target_teams_distribute ||
  619. DKind == OMPD_target_teams_distribute_parallel_for ||
  620. DKind == OMPD_target_teams_distribute_parallel_for_simd ||
  621. DKind == OMPD_target_teams_distribute_simd ||
  622. DKind == OMPD_target_teams_loop || DKind == OMPD_target_parallel_loop;
  623. }
  624. bool clang::isOpenMPTargetDataManagementDirective(OpenMPDirectiveKind DKind) {
  625. return DKind == OMPD_target_data || DKind == OMPD_target_enter_data ||
  626. DKind == OMPD_target_exit_data || DKind == OMPD_target_update;
  627. }
  628. bool clang::isOpenMPNestingTeamsDirective(OpenMPDirectiveKind DKind) {
  629. return DKind == OMPD_teams || DKind == OMPD_teams_distribute ||
  630. DKind == OMPD_teams_distribute_simd ||
  631. DKind == OMPD_teams_distribute_parallel_for_simd ||
  632. DKind == OMPD_teams_distribute_parallel_for ||
  633. DKind == OMPD_teams_loop;
  634. }
  635. bool clang::isOpenMPTeamsDirective(OpenMPDirectiveKind DKind) {
  636. return isOpenMPNestingTeamsDirective(DKind) || DKind == OMPD_target_teams ||
  637. DKind == OMPD_target_teams_distribute ||
  638. DKind == OMPD_target_teams_distribute_parallel_for ||
  639. DKind == OMPD_target_teams_distribute_parallel_for_simd ||
  640. DKind == OMPD_target_teams_distribute_simd ||
  641. DKind == OMPD_target_teams_loop;
  642. }
  643. bool clang::isOpenMPSimdDirective(OpenMPDirectiveKind DKind) {
  644. return DKind == OMPD_simd || DKind == OMPD_for_simd ||
  645. DKind == OMPD_parallel_for_simd || DKind == OMPD_taskloop_simd ||
  646. DKind == OMPD_master_taskloop_simd ||
  647. DKind == OMPD_masked_taskloop_simd ||
  648. DKind == OMPD_parallel_master_taskloop_simd ||
  649. DKind == OMPD_parallel_masked_taskloop_simd ||
  650. DKind == OMPD_distribute_parallel_for_simd ||
  651. DKind == OMPD_distribute_simd || DKind == OMPD_target_simd ||
  652. DKind == OMPD_teams_distribute_simd ||
  653. DKind == OMPD_teams_distribute_parallel_for_simd ||
  654. DKind == OMPD_target_teams_distribute_parallel_for_simd ||
  655. DKind == OMPD_target_teams_distribute_simd ||
  656. DKind == OMPD_target_parallel_for_simd;
  657. }
  658. bool clang::isOpenMPNestingDistributeDirective(OpenMPDirectiveKind Kind) {
  659. return Kind == OMPD_distribute || Kind == OMPD_distribute_parallel_for ||
  660. Kind == OMPD_distribute_parallel_for_simd ||
  661. Kind == OMPD_distribute_simd;
  662. // TODO add next directives.
  663. }
  664. bool clang::isOpenMPDistributeDirective(OpenMPDirectiveKind Kind) {
  665. return isOpenMPNestingDistributeDirective(Kind) ||
  666. Kind == OMPD_teams_distribute || Kind == OMPD_teams_distribute_simd ||
  667. Kind == OMPD_teams_distribute_parallel_for_simd ||
  668. Kind == OMPD_teams_distribute_parallel_for ||
  669. Kind == OMPD_target_teams_distribute ||
  670. Kind == OMPD_target_teams_distribute_parallel_for ||
  671. Kind == OMPD_target_teams_distribute_parallel_for_simd ||
  672. Kind == OMPD_target_teams_distribute_simd;
  673. }
  674. bool clang::isOpenMPGenericLoopDirective(OpenMPDirectiveKind Kind) {
  675. return Kind == OMPD_loop || Kind == OMPD_teams_loop ||
  676. Kind == OMPD_target_teams_loop || Kind == OMPD_parallel_loop ||
  677. Kind == OMPD_target_parallel_loop;
  678. }
  679. bool clang::isOpenMPPrivate(OpenMPClauseKind Kind) {
  680. return Kind == OMPC_private || Kind == OMPC_firstprivate ||
  681. Kind == OMPC_lastprivate || Kind == OMPC_linear ||
  682. Kind == OMPC_reduction || Kind == OMPC_task_reduction ||
  683. Kind == OMPC_in_reduction; // TODO add next clauses like 'reduction'.
  684. }
  685. bool clang::isOpenMPThreadPrivate(OpenMPClauseKind Kind) {
  686. return Kind == OMPC_threadprivate || Kind == OMPC_copyin;
  687. }
  688. bool clang::isOpenMPTaskingDirective(OpenMPDirectiveKind Kind) {
  689. return Kind == OMPD_task || isOpenMPTaskLoopDirective(Kind);
  690. }
  691. bool clang::isOpenMPLoopBoundSharingDirective(OpenMPDirectiveKind Kind) {
  692. return Kind == OMPD_distribute_parallel_for ||
  693. Kind == OMPD_distribute_parallel_for_simd ||
  694. Kind == OMPD_teams_distribute_parallel_for_simd ||
  695. Kind == OMPD_teams_distribute_parallel_for ||
  696. Kind == OMPD_target_teams_distribute_parallel_for ||
  697. Kind == OMPD_target_teams_distribute_parallel_for_simd;
  698. }
  699. bool clang::isOpenMPLoopTransformationDirective(OpenMPDirectiveKind DKind) {
  700. return DKind == OMPD_tile || DKind == OMPD_unroll;
  701. }
  702. bool clang::isOpenMPCombinedParallelADirective(OpenMPDirectiveKind DKind) {
  703. return DKind == OMPD_parallel_for || DKind == OMPD_parallel_for_simd ||
  704. DKind == OMPD_parallel_master ||
  705. DKind == OMPD_parallel_master_taskloop ||
  706. DKind == OMPD_parallel_master_taskloop_simd ||
  707. DKind == OMPD_parallel_sections;
  708. }
  709. void clang::getOpenMPCaptureRegions(
  710. SmallVectorImpl<OpenMPDirectiveKind> &CaptureRegions,
  711. OpenMPDirectiveKind DKind) {
  712. assert(unsigned(DKind) < llvm::omp::Directive_enumSize);
  713. switch (DKind) {
  714. case OMPD_metadirective:
  715. CaptureRegions.push_back(OMPD_metadirective);
  716. break;
  717. case OMPD_parallel:
  718. case OMPD_parallel_for:
  719. case OMPD_parallel_for_simd:
  720. case OMPD_parallel_master:
  721. case OMPD_parallel_masked:
  722. case OMPD_parallel_sections:
  723. case OMPD_distribute_parallel_for:
  724. case OMPD_distribute_parallel_for_simd:
  725. case OMPD_parallel_loop:
  726. CaptureRegions.push_back(OMPD_parallel);
  727. break;
  728. case OMPD_target_teams:
  729. case OMPD_target_teams_distribute:
  730. case OMPD_target_teams_distribute_simd:
  731. case OMPD_target_teams_loop:
  732. CaptureRegions.push_back(OMPD_task);
  733. CaptureRegions.push_back(OMPD_target);
  734. CaptureRegions.push_back(OMPD_teams);
  735. break;
  736. case OMPD_teams:
  737. case OMPD_teams_distribute:
  738. case OMPD_teams_distribute_simd:
  739. CaptureRegions.push_back(OMPD_teams);
  740. break;
  741. case OMPD_target:
  742. case OMPD_target_simd:
  743. CaptureRegions.push_back(OMPD_task);
  744. CaptureRegions.push_back(OMPD_target);
  745. break;
  746. case OMPD_teams_distribute_parallel_for:
  747. case OMPD_teams_distribute_parallel_for_simd:
  748. CaptureRegions.push_back(OMPD_teams);
  749. CaptureRegions.push_back(OMPD_parallel);
  750. break;
  751. case OMPD_target_parallel:
  752. case OMPD_target_parallel_for:
  753. case OMPD_target_parallel_for_simd:
  754. case OMPD_target_parallel_loop:
  755. CaptureRegions.push_back(OMPD_task);
  756. CaptureRegions.push_back(OMPD_target);
  757. CaptureRegions.push_back(OMPD_parallel);
  758. break;
  759. case OMPD_task:
  760. case OMPD_target_enter_data:
  761. case OMPD_target_exit_data:
  762. case OMPD_target_update:
  763. CaptureRegions.push_back(OMPD_task);
  764. break;
  765. case OMPD_taskloop:
  766. case OMPD_taskloop_simd:
  767. case OMPD_master_taskloop:
  768. case OMPD_master_taskloop_simd:
  769. case OMPD_masked_taskloop:
  770. case OMPD_masked_taskloop_simd:
  771. CaptureRegions.push_back(OMPD_taskloop);
  772. break;
  773. case OMPD_parallel_masked_taskloop:
  774. case OMPD_parallel_masked_taskloop_simd:
  775. case OMPD_parallel_master_taskloop:
  776. case OMPD_parallel_master_taskloop_simd:
  777. CaptureRegions.push_back(OMPD_parallel);
  778. CaptureRegions.push_back(OMPD_taskloop);
  779. break;
  780. case OMPD_target_teams_distribute_parallel_for:
  781. case OMPD_target_teams_distribute_parallel_for_simd:
  782. CaptureRegions.push_back(OMPD_task);
  783. CaptureRegions.push_back(OMPD_target);
  784. CaptureRegions.push_back(OMPD_teams);
  785. CaptureRegions.push_back(OMPD_parallel);
  786. break;
  787. case OMPD_teams_loop:
  788. CaptureRegions.push_back(OMPD_teams);
  789. break;
  790. case OMPD_nothing:
  791. CaptureRegions.push_back(OMPD_nothing);
  792. break;
  793. case OMPD_loop:
  794. // TODO: 'loop' may require different capture regions depending on the bind
  795. // clause or the parent directive when there is no bind clause. Use
  796. // OMPD_unknown for now.
  797. case OMPD_simd:
  798. case OMPD_for:
  799. case OMPD_for_simd:
  800. case OMPD_sections:
  801. case OMPD_section:
  802. case OMPD_single:
  803. case OMPD_master:
  804. case OMPD_critical:
  805. case OMPD_taskgroup:
  806. case OMPD_distribute:
  807. case OMPD_ordered:
  808. case OMPD_atomic:
  809. case OMPD_target_data:
  810. case OMPD_distribute_simd:
  811. case OMPD_dispatch:
  812. CaptureRegions.push_back(OMPD_unknown);
  813. break;
  814. case OMPD_tile:
  815. case OMPD_unroll:
  816. // loop transformations do not introduce captures.
  817. break;
  818. case OMPD_threadprivate:
  819. case OMPD_allocate:
  820. case OMPD_taskyield:
  821. case OMPD_barrier:
  822. case OMPD_error:
  823. case OMPD_taskwait:
  824. case OMPD_cancellation_point:
  825. case OMPD_cancel:
  826. case OMPD_flush:
  827. case OMPD_depobj:
  828. case OMPD_scan:
  829. case OMPD_declare_reduction:
  830. case OMPD_declare_mapper:
  831. case OMPD_declare_simd:
  832. case OMPD_declare_target:
  833. case OMPD_end_declare_target:
  834. case OMPD_requires:
  835. case OMPD_declare_variant:
  836. case OMPD_begin_declare_variant:
  837. case OMPD_end_declare_variant:
  838. llvm_unreachable("OpenMP Directive is not allowed");
  839. case OMPD_unknown:
  840. default:
  841. llvm_unreachable("Unknown OpenMP directive");
  842. }
  843. }