offtarget 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (886) hide show
  1. offload/__init__.py +10 -0
  2. offload/__main__.py +5 -0
  3. offload/_bundle.py +74 -0
  4. offload/_root/catalog/acc/claims.yaml +197 -0
  5. offload/_root/catalog/acc/clauses.yaml +391 -0
  6. offload/_root/catalog/acc/no_oracle.yaml +89 -0
  7. offload/_root/catalog/acc/out_of_scope.yaml +17 -0
  8. offload/_root/catalog/acc/rules.yaml +433 -0
  9. offload/_root/catalog/acc/semantic_atoms.yaml +27 -0
  10. offload/_root/catalog/acc/skeleton.yaml +1567 -0
  11. offload/_root/catalog/acc/spec_overrides.yaml +72 -0
  12. offload/_root/catalog/later_forms.yaml +76 -0
  13. offload/_root/catalog/machines.yaml +218 -0
  14. offload/_root/catalog/omp/claims.yaml +2047 -0
  15. offload/_root/catalog/omp/clauses.yaml +914 -0
  16. offload/_root/catalog/omp/derivations.yaml +177 -0
  17. offload/_root/catalog/omp/memory_modes.yaml +40 -0
  18. offload/_root/catalog/omp/no_oracle.yaml +373 -0
  19. offload/_root/catalog/omp/omp50_delta.yaml +377 -0
  20. offload/_root/catalog/omp/out_of_scope.yaml +64 -0
  21. offload/_root/catalog/omp/port_equivalence.yaml +352 -0
  22. offload/_root/catalog/omp/rules.yaml +3131 -0
  23. offload/_root/catalog/omp/rules_coverage.yaml +9939 -0
  24. offload/_root/catalog/omp/semantic_atoms.yaml +34 -0
  25. offload/_root/catalog/omp/skeleton.yaml +9181 -0
  26. offload/_root/catalog/omp/spec_overrides.yaml +932 -0
  27. offload/_root/catalog/toolchains.yaml +472 -0
  28. offload/_root/catalog/vendor_claims_generic.yaml +40925 -0
  29. offload/_root/data/canuse/b.json +1 -0
  30. offload/_root/data/canuse/c.json +1 -0
  31. offload/_root/data/canuse/columns.json +1 -0
  32. offload/_root/data/canuse/d.json +1 -0
  33. offload/_root/data/canuse/f.json +1 -0
  34. offload/_root/data/canuse/index.json +1 -0
  35. offload/_root/data/canuse/p.json +1 -0
  36. offload/_root/data/compilers/afar.json +1 -0
  37. offload/_root/data/compilers/cce19.json +1 -0
  38. offload/_root/data/compilers/cce20.json +1 -0
  39. offload/_root/data/compilers/cce21.json +1 -0
  40. offload/_root/data/compilers/cce21_4.json +1 -0
  41. offload/_root/data/compilers/gcc.json +1 -0
  42. offload/_root/data/compilers/gcc_sm80.json +1 -0
  43. offload/_root/data/compilers/nvhpc.json +1 -0
  44. offload/_root/data/compilers/nvhpc269.json +1 -0
  45. offload/_root/data/findings/AUTHORING.md +107 -0
  46. offload/_root/data/findings/README.md +33 -0
  47. offload/_root/data/findings/afar-c-error-directive-in-target-link.c +37 -0
  48. offload/_root/data/findings/afar-c-lastprivate-distribute-parallel-for-small-type.c +56 -0
  49. offload/_root/data/findings/afar-c-teams-distribute-reduction-first-team.c +59 -0
  50. offload/_root/data/findings/afar-c-update-iterator-copy-mode.c +45 -0
  51. offload/_root/data/findings/afar-c-xnack1-target-is-present.c +31 -0
  52. offload/_root/data/findings/afar-cce19-character-defaultmap.f90 +27 -0
  53. offload/_root/data/findings/afar-cce19-task-in-target-ice.f90 +23 -0
  54. offload/_root/data/findings/afar-clang-requires-device-safesync-hang.c +24 -0
  55. offload/_root/data/findings/afar-flang-firstprivate-map-two-targets.f90 +34 -0
  56. offload/_root/data/findings/afar-flang-loop-bind-teams-reduction.f90 +27 -0
  57. offload/_root/data/findings/afar-flang-task-reduction-max.f90 +31 -0
  58. offload/_root/data/findings/afar-flang-thread-limit-target-parallel-do.f90 +22 -0
  59. offload/_root/data/findings/afar-linear-ref-omp50.f90 +29 -0
  60. offload/_root/data/findings/afar-loop-bind-thread-in-teams.f90 +44 -0
  61. offload/_root/data/findings/afar-nontemporal-assumed-shape-ice.f90 +38 -0
  62. offload/_root/data/findings/afar-udr-derived-type-link.f90 +41 -0
  63. offload/_root/data/findings/afar-xnack1-atomic-min-nested-parallel.f90 +53 -0
  64. offload/_root/data/findings/afar-xnack1-present-not-enforced.f90 +36 -0
  65. offload/_root/data/findings/afar-xnack1-target-is-present.f90 +47 -0
  66. offload/_root/data/findings/apps/afar-cce-teams-private-array-nested-parallel-wrong.f90 +100 -0
  67. offload/_root/data/findings/apps/cce20-device-link-infer-address-spaces-crash.f90 +159 -0
  68. offload/_root/data/findings/apps/cce21-device-link-agpr-copy-mfma-assert.f90 +343 -0
  69. offload/_root/data/findings/apps/cce21-private-array-loaded-subscript-wrong.f90 +113 -0
  70. offload/_root/data/findings/apps/controls/bubble-simple-rddot.f90 +284 -0
  71. offload/_root/data/findings/apps/controls/bubble-two-substeps.f90 +287 -0
  72. offload/_root/data/findings/apps/controls/cbc-inline.f90 +97 -0
  73. offload/_root/data/findings/apps/controls/cbc-integers.f90 +91 -0
  74. offload/_root/data/findings/apps/controls/cbc-only-density.f90 +97 -0
  75. offload/_root/data/findings/apps/controls/cbc-only-velocity.f90 +97 -0
  76. offload/_root/data/findings/apps/controls/gcc-acc-c-tile-control.c +26 -0
  77. offload/_root/data/findings/apps/controls/gcc-acc-tile-control.f90 +29 -0
  78. offload/_root/data/findings/apps/controls/private-array-subscript-probes.f90 +45 -0
  79. offload/_root/data/findings/apps/controls/teams-private-array-read-par.f90 +31 -0
  80. offload/_root/data/findings/apps/controls/teams-private-array-seq.f90 +30 -0
  81. offload/_root/data/findings/apps/controls/teams-private-array-shared.f90 +34 -0
  82. offload/_root/data/findings/apps/controls/teams-private-array-split.f90 +36 -0
  83. offload/_root/data/findings/apps/controls/teams-private-array-write-par.f90 +31 -0
  84. offload/_root/data/findings/apps/gcc-acc-c-tile-partial-tiles-wrong.c +60 -0
  85. offload/_root/data/findings/apps/gcc-acc-tile-partial-tiles-wrong.f90 +64 -0
  86. offload/_root/data/findings/catalog/afar-c-complex-reduction-link.c +66 -0
  87. offload/_root/data/findings/catalog/afar-c-critical-hint-link.c +68 -0
  88. offload/_root/data/findings/catalog/afar-c-ordered-doacross-link.c +62 -0
  89. offload/_root/data/findings/catalog/afar-c-reduction-task-link.c +81 -0
  90. offload/_root/data/findings/catalog/afar-flang-absent-optional-target-crash.f90 +76 -0
  91. offload/_root/data/findings/catalog/afar-flang-critical-target-parallel-wrong.f90 +74 -0
  92. offload/_root/data/findings/catalog/afar-flang-dist-schedule-chunk.f90 +80 -0
  93. offload/_root/data/findings/catalog/afar-flang-linear-parallel-ice.f90 +68 -0
  94. offload/_root/data/findings/catalog/afar-flang-named-critical-link.f90 +67 -0
  95. offload/_root/data/findings/catalog/afar-flang-ordered-wrong.f90 +78 -0
  96. offload/_root/data/findings/catalog/afar-flang-reduction-minus-rejected.f90 +77 -0
  97. offload/_root/data/findings/catalog/afar-flang-reduction-task-ice.f90 +68 -0
  98. offload/_root/data/findings/catalog/afar-flang-sections-in-target-ice.f90 +67 -0
  99. offload/_root/data/findings/catalog/afar-flang-workdistribute-ice.f90 +71 -0
  100. offload/_root/data/findings/catalog/c-allocate-const-mem-firstprivate-wrong.c +79 -0
  101. offload/_root/data/findings/catalog/cce-acc-allocate-in-compute-crash.f90 +65 -0
  102. offload/_root/data/findings/catalog/cce-acc-character-dummy-routine-ice.f90 +81 -0
  103. offload/_root/data/findings/catalog/cce-acc-loop-seq-in-routine-wrong.f90 +81 -0
  104. offload/_root/data/findings/catalog/cce-acc-stop-in-compute-crash.f90 +62 -0
  105. offload/_root/data/findings/catalog/cce-allocators-stack-ice.f90 +81 -0
  106. offload/_root/data/findings/catalog/cce-atomic-default-mem-order-acquire-release-rejected.f90 +61 -0
  107. offload/_root/data/findings/catalog/cce-c-allocate-align-link.c +83 -0
  108. offload/_root/data/findings/catalog/cce-c-allocate-allocator-modifier-rejected.c +77 -0
  109. offload/_root/data/findings/catalog/cce-c-device-type-directive-name-ice.c +70 -0
  110. offload/_root/data/findings/catalog/cce-c-dist-schedule-chunk.c +81 -0
  111. offload/_root/data/findings/catalog/cce-c-f-pointer-device-link.f90 +70 -0
  112. offload/_root/data/findings/catalog/cce-c-lastprivate-parallel-in-seq-loop-wrong.c +64 -0
  113. offload/_root/data/findings/catalog/cce-c-long-double-ice.c +61 -0
  114. offload/_root/data/findings/catalog/cce-c-map-iterator-ice.c +92 -0
  115. offload/_root/data/findings/catalog/cce-c-motion-iterator-rejected.c +68 -0
  116. offload/_root/data/findings/catalog/cce-c-ordered-doacross-link.c +64 -0
  117. offload/_root/data/findings/catalog/cce-c-ordered-link.c +77 -0
  118. offload/_root/data/findings/catalog/cce-c-recursive-function-ice.c +62 -0
  119. offload/_root/data/findings/catalog/cce-c-reduction-inscan-ice.c +67 -0
  120. offload/_root/data/findings/catalog/cce-c-reduction-task-link.c +73 -0
  121. offload/_root/data/findings/catalog/cce-c-sections-in-target-wrong.c +70 -0
  122. offload/_root/data/findings/catalog/cce-c-single-masked-task-link.c +66 -0
  123. offload/_root/data/findings/catalog/cce-c-task-in-target-link.c +75 -0
  124. offload/_root/data/findings/catalog/cce-c-uses-allocators-traits-rejected.c +71 -0
  125. offload/_root/data/findings/catalog/cce-flang-allocate-const-mem-ice.f90 +67 -0
  126. offload/_root/data/findings/catalog/cce-flang-allocate-in-target-crash.f90 +68 -0
  127. offload/_root/data/findings/catalog/cce-flang-lastprivate-parallel-in-seq-loop-wrong.f90 +83 -0
  128. offload/_root/data/findings/catalog/cce-flang-stop-in-target-crash.f90 +64 -0
  129. offload/_root/data/findings/catalog/cce-iterator-link.f90 +67 -0
  130. offload/_root/data/findings/catalog/cce-linear-lastprivate-ice.f90 +69 -0
  131. offload/_root/data/findings/catalog/cce-nohost-link.f90 +90 -0
  132. offload/_root/data/findings/catalog/cce-reduction-inscan-ice.f90 +66 -0
  133. offload/_root/data/findings/catalog/cce-reduction-task-link.f90 +76 -0
  134. offload/_root/data/findings/catalog/cce19-reduction-task-addrspacecast-ice.f90 +77 -0
  135. offload/_root/data/findings/catalog/cce20-c-defaultmap-private-storage-rejected.c +85 -0
  136. offload/_root/data/findings/catalog/cce20-map-self-rejected.f90 +64 -0
  137. offload/_root/data/findings/catalog/cce21-c-declare-target-local-rejected.c +73 -0
  138. offload/_root/data/findings/catalog/cce21-c-target-loop-ice.c +77 -0
  139. offload/_root/data/findings/catalog/defaultmap-present-private-array-abort.f90 +73 -0
  140. offload/_root/data/findings/catalog/nvhpc-acc-associate-illegal-address.f90 +66 -0
  141. offload/_root/data/findings/catalog/nvhpc-c-function-pointer-kernel-missing.c +68 -0
  142. offload/_root/data/findings/catalog/nvhpc-c-long-double-kernel-missing.c +64 -0
  143. offload/_root/data/findings/catalog/nvhpc-c-static-local-kernel-missing.c +73 -0
  144. offload/_root/data/findings/catalog/nvhpc-c-vla-kernel-missing.c +63 -0
  145. offload/_root/data/findings/catalog/nvhpc-flang-type-bound-kernel-missing.f90 +86 -0
  146. offload/_root/data/findings/cce-acc-init-set-runtime-assert.f90 +35 -0
  147. offload/_root/data/findings/cce-acc-reduction-200-int8-scalars-wrong.f90 +1278 -0
  148. offload/_root/data/findings/cce-acc-routine-bind-module-ice.f90 +35 -0
  149. offload/_root/data/findings/cce-acc-self-condition-ignored.f90 +17 -0
  150. offload/_root/data/findings/cce-c-dist-schedule-segv.c +34 -0
  151. offload/_root/data/findings/cce-c-map-delete-refcount.c +47 -0
  152. offload/_root/data/findings/cce-c-map-present-assert.c +45 -0
  153. offload/_root/data/findings/cce-c-openmp45-device-link.c +34 -0
  154. offload/_root/data/findings/cce-c-parallel-for-in-target.c +73 -0
  155. offload/_root/data/findings/cce-defaultmap-tofrom-explicit-map.f90 +92 -0
  156. offload/_root/data/findings/cce-mapper-next-map-copy-back.f90 +48 -0
  157. offload/_root/data/findings/cce-trim-merge-output-one-character.f90 +40 -0
  158. offload/_root/data/findings/cce-uses-allocators-traits-omp50.f90 +28 -0
  159. offload/_root/data/findings/cce19-acc-if-false-link.f90 +17 -0
  160. offload/_root/data/findings/cce19-c-reduction-63-scalars-one-wrong.c +235 -0
  161. offload/_root/data/findings/cce19-target-parallel-guarded-loop.f90 +35 -0
  162. offload/_root/data/findings/cce19-target-parallel-single-ice.f90 +38 -0
  163. offload/_root/data/findings/cce21-alloc-2e32-sum-wrong.f90 +68 -0
  164. offload/_root/data/findings/cce21-defaultmap-aggregate-flag.f90 +52 -0
  165. offload/_root/data/findings/cce21-in-reduction-assumed-shape-write-lost.f90 +61 -0
  166. offload/_root/data/findings/cce21-in-reduction-taskwait-link.f90 +59 -0
  167. offload/_root/data/findings/cce21-linear-modifier-default-none.f90 +59 -0
  168. offload/_root/data/findings/clang-c-declare-target-to-omp52.c +50 -0
  169. offload/_root/data/findings/clang-c-linear-directive-name-hang.c +30 -0
  170. offload/_root/data/findings/clang-c-map-iterator-omp51.c +51 -0
  171. offload/_root/data/findings/clang-c-shared-declare-target-combined.c +58 -0
  172. offload/_root/data/findings/dataenv/cce-value-dummy-target-write-visible.f90 +74 -0
  173. offload/_root/data/findings/defaultmap-none-loop-variable.f90 +69 -0
  174. offload/_root/data/findings/fortran-loop-bind-thread-in-parallel.f90 +53 -0
  175. offload/_root/data/findings/fortran-schedule-static-in-target.f90 +55 -0
  176. offload/_root/data/findings/fresh/cce-common-block-name-in-map-rejected.f90 +47 -0
  177. offload/_root/data/findings/fresh/cce-if-stop-in-target-ice-one-condition.f90 +38 -0
  178. offload/_root/data/findings/fresh/cce-if-stop-in-target-ice.f90 +43 -0
  179. offload/_root/data/findings/fresh/cce-list-directed-print-in-target-copy-crash.f90 +40 -0
  180. offload/_root/data/findings/fresh/cce19-acc-automatic-array-copyout-copy-crash.f90 +56 -0
  181. offload/_root/data/findings/fresh/cce21-combined-if-runtime-expr-loop-skipped.f90 +57 -0
  182. offload/_root/data/findings/fresh/nvhpc-acc-gang-worker-collapse-nested-vector-reduction-lost.f90 +67 -0
  183. offload/_root/data/findings/fresh/nvhpc-teams-loop-module-allocatable-assign-fort2-crash.f90 +73 -0
  184. offload/_root/data/findings/fuzz/1131-afar.f90 +48 -0
  185. offload/_root/data/findings/fuzz/1391-cce20.f90 +40 -0
  186. offload/_root/data/findings/fuzz/14-cce20.f90 +36 -0
  187. offload/_root/data/findings/fuzz/1505-cce20.f90 +88 -0
  188. offload/_root/data/findings/fuzz/1540-afar.f90 +44 -0
  189. offload/_root/data/findings/fuzz/158-afar.f90 +63 -0
  190. offload/_root/data/findings/fuzz/16-cce20.f90 +39 -0
  191. offload/_root/data/findings/fuzz/1644-cce21.f90 +31 -0
  192. offload/_root/data/findings/fuzz/165-cce19.f90 +52 -0
  193. offload/_root/data/findings/fuzz/1749-cce20.f90 +34 -0
  194. offload/_root/data/findings/fuzz/1936-afar.f90 +61 -0
  195. offload/_root/data/findings/fuzz/1978-cce19.f90 +41 -0
  196. offload/_root/data/findings/fuzz/2014-cce19.f90 +46 -0
  197. offload/_root/data/findings/fuzz/2224-cce19.f90 +30 -0
  198. offload/_root/data/findings/fuzz/2334-cce19.f90 +57 -0
  199. offload/_root/data/findings/fuzz/536-cce19.f90 +38 -0
  200. offload/_root/data/findings/fuzz/591-cce19.f90 +54 -0
  201. offload/_root/data/findings/fuzz/650-afar.f90 +58 -0
  202. offload/_root/data/findings/fuzz/698-afar.f90 +68 -0
  203. offload/_root/data/findings/fuzz/700-afar.f90 +46 -0
  204. offload/_root/data/findings/fuzz/775-cce21.f90 +33 -0
  205. offload/_root/data/findings/fuzz/87-afar.f90 +47 -0
  206. offload/_root/data/findings/fuzz/916-afar.f90 +67 -0
  207. offload/_root/data/findings/fuzz/958-cce20.f90 +44 -0
  208. offload/_root/data/findings/fuzz/98-cce19.f90 +40 -0
  209. offload/_root/data/findings/fuzz/README.md +236 -0
  210. offload/_root/data/findings/fuzz/b1-121-afar.f90 +47 -0
  211. offload/_root/data/findings/fuzz/b1-183-afar.f90 +55 -0
  212. offload/_root/data/findings/fuzz/b1-22-cce20.f90 +38 -0
  213. offload/_root/data/findings/fuzz/b1-231-afar.f90 +56 -0
  214. offload/_root/data/findings/fuzz/b1-268-afar.f90 +46 -0
  215. offload/_root/data/findings/fuzz/b2-183-afar.f90 +57 -0
  216. offload/_root/data/findings/fuzz/b2-209-cce19.f90 +51 -0
  217. offload/_root/data/findings/fuzz/b2-213-afar.f90 +63 -0
  218. offload/_root/data/findings/fuzz/b2-52-afar.f90 +56 -0
  219. offload/_root/data/findings/fuzz/b2-68-afar.f90 +54 -0
  220. offload/_root/data/findings/fuzz/b2-85-cce20.f90 +55 -0
  221. offload/_root/data/findings/fuzz/b3-188-cce19.f90 +90 -0
  222. offload/_root/data/findings/fuzz/b3-190-cce21.f90 +88 -0
  223. offload/_root/data/findings/fuzz/b3-197-cce19.f90 +77 -0
  224. offload/_root/data/findings/fuzz/b3-250-cce20.f90 +89 -0
  225. offload/_root/data/findings/fuzz/b3-278-cce19.f90 +70 -0
  226. offload/_root/data/findings/fuzz/b3-45-cce21.f90 +83 -0
  227. offload/_root/data/findings/fuzz/b3-54-afar.f90 +67 -0
  228. offload/_root/data/findings/fuzz/b3-61-cce20.f90 +100 -0
  229. offload/_root/data/findings/fuzz/b3-9-afar.f90 +100 -0
  230. offload/_root/data/findings/fuzz/b3-9-cce21.f90 +103 -0
  231. offload/_root/data/findings/fuzz/b3-94-afar.f90 +80 -0
  232. offload/_root/data/findings/fuzz/b4-39-afar.f90 +141 -0
  233. offload/_root/data/findings/fuzz/b4-86-cce19.f90 +71 -0
  234. offload/_root/data/findings/fuzz/controls/gcc-complex-pointer-store-control.f90 +28 -0
  235. offload/_root/data/findings/fuzz/controls/gcc-declare-reduction-module-control.f90 +29 -0
  236. offload/_root/data/findings/fuzz/controls/gcc-target-simd-map-nontemporal-control.f90 +21 -0
  237. offload/_root/data/findings/fuzz/controls/nvhpc-allocatable-component-mapped-control.f90 +22 -0
  238. offload/_root/data/findings/fuzz/controls/nvhpc-allocatable-component-unreferenced-control.f90 +22 -0
  239. offload/_root/data/findings/fuzz/controls/nvhpc-default-none-removed-control.f90 +18 -0
  240. offload/_root/data/findings/fuzz/controls/nvhpc-default-shared-control.f90 +18 -0
  241. offload/_root/data/findings/fuzz/controls/nvhpc-defaultmap-firstprivate-removed-control.f90 +15 -0
  242. offload/_root/data/findings/fuzz/controls/nvhpc-defaultmap-to-scalar-reduction-mapped-control.f90 +17 -0
  243. offload/_root/data/findings/fuzz/controls/nvhpc-defaultmap-to-scalar-removed-control.f90 +17 -0
  244. offload/_root/data/findings/fuzz/controls/nvhpc-defaultmap-tofrom-lastprivate-control.f90 +15 -0
  245. offload/_root/data/findings/fuzz/controls/nvhpc-depend-explicit-map-control.f90 +22 -0
  246. offload/_root/data/findings/fuzz/controls/nvhpc-depend-removed-control.f90 +22 -0
  247. offload/_root/data/findings/fuzz/controls/nvhpc-distribute-end-distribute-control.f90 +16 -0
  248. offload/_root/data/findings/fuzz/controls/nvhpc-distribute-parallel-num-threads-removed-control.f90 +26 -0
  249. offload/_root/data/findings/fuzz/controls/nvhpc-distribute-parallel-removed-control.f90 +22 -0
  250. offload/_root/data/findings/fuzz/controls/nvhpc-distribute-simd-no-end-directive-control.f90 +15 -0
  251. offload/_root/data/findings/fuzz/controls/nvhpc-explicit-length-character-dummy-control.f90 +18 -0
  252. offload/_root/data/findings/fuzz/controls/nvhpc-loop-character-array-value-control.f90 +23 -0
  253. offload/_root/data/findings/fuzz/controls/nvhpc-loop-character-distribute-control.f90 +20 -0
  254. offload/_root/data/findings/fuzz/controls/nvhpc-map-always-first-control.f90 +15 -0
  255. offload/_root/data/findings/fuzz/controls/nvhpc-map-always-removed-control.f90 +15 -0
  256. offload/_root/data/findings/fuzz/controls/nvhpc-num-threads-removed-control.f90 +12 -0
  257. offload/_root/data/findings/fuzz/controls/nvhpc-target-parallel-firstprivate-dropped-control.f90 +15 -0
  258. offload/_root/data/findings/fuzz/controls/nvhpc-target-parallel-single-nowait-control.f90 +13 -0
  259. offload/_root/data/findings/fuzz/controls/nvhpc-target-parallel-split-control.f90 +15 -0
  260. offload/_root/data/findings/fuzz/controls/nvhpc-target-simd-collapse-split-control.f90 +21 -0
  261. offload/_root/data/findings/fuzz/controls/nvhpc-target-simd-end-directive-control.f90 +14 -0
  262. offload/_root/data/findings/fuzz/controls/nvhpc-target-simd-no-collapse-control.f90 +19 -0
  263. offload/_root/data/findings/fuzz/controls/nvhpc-target-simd-split-no-end-directive-control.f90 +15 -0
  264. offload/_root/data/findings/fuzz/gcc-declare-reduction-module-not-found.f90 +66 -0
  265. offload/_root/data/findings/fuzz/gcc-strided-target-update-rejected.f90 +58 -0
  266. offload/_root/data/findings/fuzz/gcc-target-simd-map-nontemporal-rejected.f90 +54 -0
  267. offload/_root/data/findings/fuzz/nvhpc-allocatable-component-implicit-map-illegal-address.f90 +84 -0
  268. offload/_root/data/findings/fuzz/nvhpc-assumed-length-character-dummy-map-ice.f90 +69 -0
  269. offload/_root/data/findings/fuzz/nvhpc-default-none-reduction-lastprivate-fort1-crash.f90 +70 -0
  270. offload/_root/data/findings/fuzz/nvhpc-defaultmap-firstprivate-lastprivate-ice.f90 +71 -0
  271. offload/_root/data/findings/fuzz/nvhpc-defaultmap-to-scalar-reduction-lost.f90 +82 -0
  272. offload/_root/data/findings/fuzz/nvhpc-depend-implicit-map-illegal-address.f90 +81 -0
  273. offload/_root/data/findings/fuzz/nvhpc-distribute-parallel-num-threads-writes-lost.f90 +79 -0
  274. offload/_root/data/findings/fuzz/nvhpc-end-distribute-simd-rejected.f90 +70 -0
  275. offload/_root/data/findings/fuzz/nvhpc-loop-character-achar-unsupported.f90 +75 -0
  276. offload/_root/data/findings/fuzz/nvhpc-map-always-after-map-to-not-copied-back.f90 +70 -0
  277. offload/_root/data/findings/fuzz/nvhpc-num-threads-reduction-identity-lost.f90 +54 -0
  278. offload/_root/data/findings/fuzz/nvhpc-target-parallel-firstprivate-translate-failure.f90 +66 -0
  279. offload/_root/data/findings/fuzz/nvhpc-target-parallel-single-hang.f90 +68 -0
  280. offload/_root/data/findings/fuzz/nvhpc-target-simd-collapse-translate-failure.f90 +73 -0
  281. offload/_root/data/findings/fuzz/nvhpc-target-simd-no-end-directive-rejected.f90 +68 -0
  282. offload/_root/data/findings/fuzz/par-s1-2082-gcc_g90.f90 +71 -0
  283. offload/_root/data/findings/fuzz/s1-2370-cce21.f90 +67 -0
  284. offload/_root/data/findings/fuzz/s1-2592-cce21.f90 +56 -0
  285. offload/_root/data/findings/fuzz/s1-3463-cce21.f90 +92 -0
  286. offload/_root/data/findings/fuzz/s1-4339-afar.f90 +79 -0
  287. offload/_root/data/findings/fuzz/s1-6085-cce21.f90 +96 -0
  288. offload/_root/data/findings/fuzz/s1-6760-cce20.f90 +65 -0
  289. offload/_root/data/findings/fuzz/s1-6888-cce21.f90 +76 -0
  290. offload/_root/data/findings/fuzz/s1-7882-cce20.f90 +63 -0
  291. offload/_root/data/findings/fuzz/s1-8634-cce21.f90 +45 -0
  292. offload/_root/data/findings/fuzz/s1-91-cce21.f90 +92 -0
  293. offload/_root/data/findings/fuzz/s1-9443-afar.f90 +59 -0
  294. offload/_root/data/findings/fuzz/s1-9914-cce19.f90 +78 -0
  295. offload/_root/data/findings/gcc/controls/gcc-acc-c-detach-control.c +34 -0
  296. offload/_root/data/findings/gcc/controls/gcc-acc-detach-control.f90 +26 -0
  297. offload/_root/data/findings/gcc/controls/gcc-defaultmap-to-pointer-control.f90 +31 -0
  298. offload/_root/data/findings/gcc/controls/gcc-target-in-task-control.c +26 -0
  299. offload/_root/data/findings/gcc/controls/gcc-target-in-task-control.f90 +21 -0
  300. offload/_root/data/findings/gcc/gcc-acc-bind-device-type-rejected.f90 +71 -0
  301. offload/_root/data/findings/gcc/gcc-acc-c-bind-device-type-rejected.c +76 -0
  302. offload/_root/data/findings/gcc/gcc-acc-c-detach-delete-attach-underflow.c +74 -0
  303. offload/_root/data/findings/gcc/gcc-acc-c-gang-dim-rejected.c +79 -0
  304. offload/_root/data/findings/gcc/gcc-acc-c-link-in-routine-rejected.c +82 -0
  305. offload/_root/data/findings/gcc/gcc-acc-detach-delete-attach-underflow.f90 +66 -0
  306. offload/_root/data/findings/gcc/gcc-acc-gang-dim-collapse-force-rejected.f90 +69 -0
  307. offload/_root/data/findings/gcc/gcc-acc-init-set-shutdown-rejected.f90 +70 -0
  308. offload/_root/data/findings/gcc/gcc-acc-link-in-routine-rejected.f90 +82 -0
  309. offload/_root/data/findings/gcc/gcc-acc-use-device-allocatable-rejected.f90 +88 -0
  310. offload/_root/data/findings/gcc/gcc-c-motion-mapper-rejected.c +110 -0
  311. offload/_root/data/findings/gcc/gcc-c-omp60-undocumented-rejected.c +76 -0
  312. offload/_root/data/findings/gcc/gcc-c-omp60-unimplemented-rejected.c +119 -0
  313. offload/_root/data/findings/gcc/gcc-c-target-in-task-mandatory-device-not-found.c +87 -0
  314. offload/_root/data/findings/gcc/gcc-c-uses-allocators-traits-unimplemented.c +85 -0
  315. offload/_root/data/findings/gcc/gcc-declare-mapper-rejected.f90 +85 -0
  316. offload/_root/data/findings/gcc/gcc-defaultmap-to-pointer-copy-back.f90 +66 -0
  317. offload/_root/data/findings/gcc/gcc-loop-bind-default-none-rejected.f90 +93 -0
  318. offload/_root/data/findings/gcc/gcc-omp60-undocumented-rejected.f90 +72 -0
  319. offload/_root/data/findings/gcc/gcc-omp60-unimplemented-rejected.f90 +112 -0
  320. offload/_root/data/findings/gcc/gcc-target-in-task-mandatory-device-not-found.f90 +83 -0
  321. offload/_root/data/findings/gcc/gcc-uses-allocators-traits-unimplemented.f90 +78 -0
  322. offload/_root/data/findings/harvest/afar-flang-strided-target-update.f90 +96 -0
  323. offload/_root/data/findings/harvest/cce-acc-declare-create-module-allocatable-xnack1-fault.f90 +58 -0
  324. offload/_root/data/findings/harvest/cce-c-implicit-struct-map-partly-present.c +100 -0
  325. offload/_root/data/findings/harvest/cce-c-strided-target-update.c +74 -0
  326. offload/_root/data/findings/harvest/cce-ftn-target-parallel-thread-query-ice.f90 +67 -0
  327. offload/_root/data/findings/harvest/cce-named-constant-array-declare-target-routine-rejected.f90 +69 -0
  328. offload/_root/data/findings/harvest/cce-use-device-ptr-c-ptr-not-converted.f90 +64 -0
  329. offload/_root/data/findings/harvest/cce21-declare-target-link-module-variable-write-lost.f90 +63 -0
  330. offload/_root/data/findings/harvest/cce21-internal-procedure-calls-internal-in-target-fault.f90 +71 -0
  331. offload/_root/data/findings/harvest/controls/cce-c-implicit-struct-map-partly-present-target-only-control.c +22 -0
  332. offload/_root/data/findings/harvest/controls/cce-c-implicit-struct-map-partly-present-whole-control.c +23 -0
  333. offload/_root/data/findings/harvest/controls/gcc-acc-declare-create-allocatable-control.f90 +34 -0
  334. offload/_root/data/findings/harvest/controls/gcc-c-same-item-two-maps-control.c +17 -0
  335. offload/_root/data/findings/harvest/controls/gcc-c-target-data-struct-pointer-section-control.c +27 -0
  336. offload/_root/data/findings/harvest/controls/gcc-c-target-data-two-maps-control.c +20 -0
  337. offload/_root/data/findings/harvest/controls/gcc-same-item-two-maps-control.f90 +16 -0
  338. offload/_root/data/findings/harvest/controls/gcc-teams-simd-matmul-allocatable-control.f90 +27 -0
  339. offload/_root/data/findings/harvest/gcc-acc-declare-create-allocatable-not-mapped.f90 +66 -0
  340. offload/_root/data/findings/harvest/gcc-c-same-item-two-maps-rejected.c +45 -0
  341. offload/_root/data/findings/harvest/gcc-c-strided-section-rejected.c +70 -0
  342. offload/_root/data/findings/harvest/gcc-c-target-data-struct-pointer-section-ice.c +78 -0
  343. offload/_root/data/findings/harvest/gcc-c-target-data-two-maps-ice.c +49 -0
  344. offload/_root/data/findings/harvest/gcc-same-item-two-maps-rejected.f90 +46 -0
  345. offload/_root/data/findings/harvest/gcc-teams-simd-matmul-allocatable-ice.f90 +53 -0
  346. offload/_root/data/findings/harvest/nvhpc-c-target-data-if-false-use-device-ptr-garbage.c +49 -0
  347. offload/_root/data/findings/harvest/nvhpc-named-constant-array-declare-target-routine-rejected.f90 +65 -0
  348. offload/_root/data/findings/harvest/nvhpc-use-device-ptr-c-ptr-not-found.f90 +60 -0
  349. offload/_root/data/findings/harvest/nvhpc2511-target-nowait-in-parallel-for-ice.c +59 -0
  350. offload/_root/data/findings/hecbench/controls/f16-ctl-float-array.c +28 -0
  351. offload/_root/data/findings/hecbench/controls/pc-ctl-builtin-popcount.c +37 -0
  352. offload/_root/data/findings/hecbench/controls/pc-ctl-shift-sum.c +43 -0
  353. offload/_root/data/findings/hecbench/gcc-c-float16-array-in-target-lto-ice.c +65 -0
  354. offload/_root/data/findings/hecbench/gcc-c-swar-popcount-assembler-error.c +80 -0
  355. offload/_root/data/findings/index.yaml +2453 -0
  356. offload/_root/data/findings/malloc/afar-device-malloc-in-kernel-corrupts-records.c +371 -0
  357. offload/_root/data/findings/malloc/controls/afar-first-use-malloc-direct.c +52 -0
  358. offload/_root/data/findings/malloc/controls/afar-first-use-malloc-fence.c +57 -0
  359. offload/_root/data/findings/malloc/controls/afar-first-use-malloc-flush.c +57 -0
  360. offload/_root/data/findings/malloc/controls/afar-first-use-malloc-stack.c +52 -0
  361. offload/_root/data/findings/multithread-allocatable-section-maps.f90 +91 -0
  362. offload/_root/data/findings/nested/afar-cce-c-call-result-member-in-target-rejected.c +69 -0
  363. offload/_root/data/findings/nested/afar-cce-c-update-struct-and-member-rejected.c +92 -0
  364. offload/_root/data/findings/nested/afar-flang-pointer-root-allocatable-component-enter-data-fault.f90 +121 -0
  365. offload/_root/data/findings/nested/cce-c-struct-and-nested-pointee-sections-ice.c +79 -0
  366. offload/_root/data/findings/nested/cce-fortran-nested-allocatable-component-copy-fault.f90 +64 -0
  367. offload/_root/data/findings/nested/cce-fortran-pointer-to-type-with-allocatable-scalar-component-typed-transfer.f90 +93 -0
  368. offload/_root/data/findings/nested/cce-fortran-update-to-pointer-root-allocatable-scalar-component-no-accelerator-object.f90 +80 -0
  369. offload/_root/data/findings/nested/controls/c3-ctl-nested-data.c +27 -0
  370. offload/_root/data/findings/nested/controls/c5-acc-serial-struct-and-array.c +26 -0
  371. offload/_root/data/findings/nested/controls/e2-ctl-two-directives.c +42 -0
  372. offload/_root/data/findings/nested/controls/e3-ctl-attach-clause.c +42 -0
  373. offload/_root/data/findings/nested/controls/f3-pointer-array-only.c +33 -0
  374. offload/_root/data/findings/nested/controls/f5-ctl-copyout-exit.c +33 -0
  375. offload/_root/data/findings/nested/controls/f6-ctl-pointer-to-struct-array.c +28 -0
  376. offload/_root/data/findings/nested/controls/g2-ctl-allocatable.f90 +34 -0
  377. offload/_root/data/findings/nested/controls/g2-ctl-entered-to.f90 +34 -0
  378. offload/_root/data/findings/nested/controls/g3-ctl-from-struct-no-element.c +27 -0
  379. offload/_root/data/findings/nested/controls/g3-ptrs-two-elements-to.c +27 -0
  380. offload/_root/data/findings/nested/controls/g3-ptrs-two-elements-tofrom.c +27 -0
  381. offload/_root/data/findings/nested/controls/g5-ctl-element-pointers-only.f90 +36 -0
  382. offload/_root/data/findings/nested/controls/g5-ctl-root-pointer-only.f90 +36 -0
  383. offload/_root/data/findings/nested/controls/gp2-ctl-no-mapper-explicit-maps.c +24 -0
  384. offload/_root/data/findings/nested/controls/gt2-ctl-no-always.c +26 -0
  385. offload/_root/data/findings/nested/controls/gt3-ctl-always-on-structure-only.c +26 -0
  386. offload/_root/data/findings/nested/controls/j1-embedded-struct-pointer-to-struct.c +24 -0
  387. offload/_root/data/findings/nested/controls/j2-ctl-pointer-instead-of-embedded.c +24 -0
  388. offload/_root/data/findings/nested/controls/j6-ctl-struct-and-one-pointee-level.c +23 -0
  389. offload/_root/data/findings/nested/controls/j7-ctl-struct-and-embedded-pointee.c +24 -0
  390. offload/_root/data/findings/nested/controls/m2-ctl-variable-root.f90 +32 -0
  391. offload/_root/data/findings/nested/controls/m3-ctl-fixed-array-component.f90 +32 -0
  392. offload/_root/data/findings/nested/controls/m5-ctl-no-enter-data.f90 +33 -0
  393. offload/_root/data/findings/nested/controls/n8-ctl-fixed-array-in-component.f90 +33 -0
  394. offload/_root/data/findings/nested/controls/n9-ctl-allocatable-in-the-variable.f90 +33 -0
  395. offload/_root/data/findings/nested/controls/ns4-ctl-two-directives-struct-then-pointee.c +27 -0
  396. offload/_root/data/findings/nested/controls/ns8-ctl-enter-together-exit-split.c +26 -0
  397. offload/_root/data/findings/nested/controls/nu3-ctl-update-pointee-only.c +28 -0
  398. offload/_root/data/findings/nested/controls/p2-ctl-pointer-variable.c +27 -0
  399. offload/_root/data/findings/nested/controls/p3-ctl-direct-member.c +26 -0
  400. offload/_root/data/findings/nested/controls/q2-ctl-fixed-array.f90 +37 -0
  401. offload/_root/data/findings/nested/controls/q3-ctl-allocatable-component-of-the-variable.f90 +38 -0
  402. offload/_root/data/findings/nested/controls/ta2-ctl-no-allocatable-component.f90 +42 -0
  403. offload/_root/data/findings/nested/controls/ta3-ctl-allocatable-scalar-in-the-variable.f90 +38 -0
  404. offload/_root/data/findings/nested/controls/ta4-ctl-pointer-component-only.f90 +42 -0
  405. offload/_root/data/findings/nested/controls/u3-ctl-update-member-only.c +24 -0
  406. offload/_root/data/findings/nested/controls/u4-ctl-two-updates.c +25 -0
  407. offload/_root/data/findings/nested/controls/u5-ctl-same-list-in-map.c +25 -0
  408. offload/_root/data/findings/nested/controls/ua2-ctl-variable-root.f90 +37 -0
  409. offload/_root/data/findings/nested/controls/ua4-ctl-to-in-place-of-alloc-and-update.f90 +37 -0
  410. offload/_root/data/findings/nested/controls/v2-ctl-parent-first.c +25 -0
  411. offload/_root/data/findings/nested/controls/v4-ctl-embedded-member.c +24 -0
  412. offload/_root/data/findings/nested/gcc-acc-c-exit-data-of-a-pointer-array-element-target-hangs.c +83 -0
  413. offload/_root/data/findings/nested/gcc-acc-c-parent-and-shared-pointee-one-directive.c +88 -0
  414. offload/_root/data/findings/nested/gcc-acc-c-struct-and-member-array-one-directive.c +84 -0
  415. offload/_root/data/findings/nested/gcc-c-always-on-pointer-member-section-ice.c +75 -0
  416. offload/_root/data/findings/nested/gcc-c-declare-mapper-pointer-member-section-gpu-fault.c +93 -0
  417. offload/_root/data/findings/nested/gcc-c-from-struct-and-pointee-section-rejected.c +83 -0
  418. offload/_root/data/findings/nested/gcc-fortran-pointer-component-alloc-bounds-lost.f90 +62 -0
  419. offload/_root/data/findings/nested/gcc-fortran-root-and-element-pointer-components-ice.f90 +77 -0
  420. offload/_root/data/findings/nested/nvhpc-c-pointee-before-parent-in-one-map-list-copy-fault.c +55 -0
  421. offload/_root/data/findings/nested/nvhpc-c-update-from-structure-overwrites-attached-pointer-segv.c +86 -0
  422. offload/_root/data/findings/nvhpc-acc-atomic-update-sum-fort2-crash.f90 +53 -0
  423. offload/_root/data/findings/nvhpc-c-acc-atomic-update-sum-ice.c +43 -0
  424. offload/_root/data/findings/nvhpc-c-dist-schedule-chunk-compile-hang.c +41 -0
  425. offload/_root/data/findings/nvhpc-c-map-present-ignored.c +42 -0
  426. offload/_root/data/findings/nvhpc-c-ordered-in-target-nvcpfe-crash.c +92 -0
  427. offload/_root/data/findings/nvhpc-c-parallel-for-firstprivate-in-target.c +62 -0
  428. offload/_root/data/findings/nvhpc-c-parallel-if-in-target-nvvm-ice.c +56 -0
  429. offload/_root/data/findings/nvhpc-defaultmap-firstprivate-explicit-map.f90 +45 -0
  430. offload/_root/data/findings/nvhpc-defaultmap-from-allocatable-indexing.f90 +60 -0
  431. offload/_root/data/findings/nvhpc-depend-inoutset-ignored.f90 +64 -0
  432. offload/_root/data/findings/nvhpc-dist-schedule-chunk-illegal-address.f90 +52 -0
  433. offload/_root/data/findings/nvhpc-managed-acc-shutdown-host-access.f90 +42 -0
  434. offload/_root/data/findings/nvhpc-parallel-if-in-target-nvvm-ice.f90 +60 -0
  435. offload/_root/data/findings/oop/afar-final-dealloc-device-link.f90 +85 -0
  436. offload/_root/data/findings/oop/afar-pdt-length-parameter-not-implemented.f90 +65 -0
  437. offload/_root/data/findings/oop/cce-class-is-device-link.f90 +86 -0
  438. offload/_root/data/findings/oop/cce-copy-alloc-component-section-fault.f90 +73 -0
  439. offload/_root/data/findings/oop/cce-copy-parent-to-component-tofrom-lost.f90 +65 -0
  440. offload/_root/data/findings/oop/cce-copy-second-member-section-lost.f90 +65 -0
  441. offload/_root/data/findings/oop/cce-element-component-map-lost.f90 +64 -0
  442. offload/_root/data/findings/oop/cce-final-dealloc-device-abort.f90 +85 -0
  443. offload/_root/data/findings/oop/cce-pdt-default-mapper-rejected.f90 +71 -0
  444. offload/_root/data/findings/oop/cce-polymorphic-dispatch-device-link.f90 +100 -0
  445. offload/_root/data/findings/oop/cce-section-of-element-component-overlap.f90 +76 -0
  446. offload/_root/data/findings/oop/cce-select-type-guard-not-taken.f90 +91 -0
  447. offload/_root/data/findings/oop/cce-udr-derived-type-unsupported.f90 +69 -0
  448. offload/_root/data/findings/oop/cce21-element-component-map-lost.f90 +62 -0
  449. offload/_root/data/findings/oop/controls/alloccomp-comp-only.f90 +44 -0
  450. offload/_root/data/findings/oop/controls/alloccomp-whole-explicit-component.f90 +50 -0
  451. offload/_root/data/findings/oop/controls/alloccomp-whole.f90 +49 -0
  452. offload/_root/data/findings/oop/controls/elemsec-element.f90 +47 -0
  453. offload/_root/data/findings/oop/controls/final-local.f90 +64 -0
  454. offload/_root/data/findings/oop/controls/host-class-star-select-type.f90 +58 -0
  455. offload/_root/data/findings/oop/controls/host-firstprivate-defined-assignment.f90 +54 -0
  456. offload/_root/data/findings/oop/controls/host-lastprivate-defined-assignment.f90 +58 -0
  457. offload/_root/data/findings/oop/controls/host-private-finalization.f90 +51 -0
  458. offload/_root/data/findings/oop/controls/host-select-type.f90 +65 -0
  459. offload/_root/data/findings/oop/controls/parent-and-comp-component-only.f90 +45 -0
  460. offload/_root/data/findings/oop/controls/pdt-kind.f90 +46 -0
  461. offload/_root/data/findings/oop/controls/pdt-len-host.f90 +43 -0
  462. offload/_root/data/findings/oop/controls/pdt-len-unparameterized.f90 +46 -0
  463. offload/_root/data/findings/oop/controls/poly-dispatch-static.f90 +75 -0
  464. offload/_root/data/findings/oop/controls/section-alloc-whole-component.f90 +49 -0
  465. offload/_root/data/findings/oop/controls/section-element-whole-array.f90 +50 -0
  466. offload/_root/data/findings/oop/controls/section-element-whole-component.f90 +50 -0
  467. offload/_root/data/findings/oop/controls/section-fixed.f90 +43 -0
  468. offload/_root/data/findings/oop/controls/tbp-override.f90 +64 -0
  469. offload/_root/data/findings/oop/gcc-acc-parent-and-member-data-rejected.f90 +63 -0
  470. offload/_root/data/findings/oop/gcc-pdt-length-parameter-abort.f90 +68 -0
  471. offload/_root/data/findings/oop/gcc-polymorphic-dispatch-abort.f90 +97 -0
  472. offload/_root/data/findings/oop/gcc-vtab-not-marked-for-offload.f90 +94 -0
  473. offload/_root/data/findings/oop/nvhpc-copy-alloc-component-illegal-address.f90 +76 -0
  474. offload/_root/data/findings/oop/nvhpc-copy-pdt-length-parameter-illegal-address.f90 +69 -0
  475. offload/_root/data/findings/oop/nvhpc-named-mapper-rejected.f90 +65 -0
  476. offload/_root/data/findings/oop/nvhpc-polymorphic-dispatch-translate-failure.f90 +90 -0
  477. offload/_root/data/findings/oop/nvhpc-polymorphism-runtime-unsupported.f90 +94 -0
  478. offload/_root/data/findings/oop/nvhpc-type-bound-call-rejected.f90 +89 -0
  479. offload/_root/data/findings/oop/nvhpc-udr-derived-type-rejected.f90 +67 -0
  480. offload/_root/data/findings/reviews/afar-c-error-directive-in-target-link.json +217 -0
  481. offload/_root/data/findings/reviews/afar-c-lastprivate-distribute-parallel-for-small-type.json +113 -0
  482. offload/_root/data/findings/reviews/afar-c-teams-distribute-reduction-first-team.json +130 -0
  483. offload/_root/data/findings/reviews/afar-c-update-iterator-copy-mode.json +113 -0
  484. offload/_root/data/findings/reviews/afar-cce19-character-defaultmap.json +292 -0
  485. offload/_root/data/findings/reviews/afar-clang-requires-device-safesync-hang.json +191 -0
  486. offload/_root/data/findings/reviews/afar-flang-firstprivate-map-two-targets.json +130 -0
  487. offload/_root/data/findings/reviews/afar-flang-loop-bind-teams-reduction.json +126 -0
  488. offload/_root/data/findings/reviews/afar-flang-task-reduction-max.json +113 -0
  489. offload/_root/data/findings/reviews/afar-flang-thread-limit-target-parallel-do.json +113 -0
  490. offload/_root/data/findings/reviews/afar-loop-bind-thread-in-teams.json +191 -0
  491. offload/_root/data/findings/reviews/afar-nontemporal-assumed-shape-ice.json +113 -0
  492. offload/_root/data/findings/reviews/afar-udr-derived-type-link.json +113 -0
  493. offload/_root/data/findings/reviews/afar-xnack1-atomic-min-nested-parallel.json +113 -0
  494. offload/_root/data/findings/reviews/afar-xnack1-target-is-present.json +113 -0
  495. offload/_root/data/findings/reviews/apps--afar-cce-teams-private-array-nested-parallel-wrong.json +113 -0
  496. offload/_root/data/findings/reviews/apps--cce20-device-link-infer-address-spaces-crash.json +113 -0
  497. offload/_root/data/findings/reviews/apps--cce21-device-link-agpr-copy-mfma-assert.json +113 -0
  498. offload/_root/data/findings/reviews/apps--cce21-private-array-loaded-subscript-wrong.json +113 -0
  499. offload/_root/data/findings/reviews/apps--gcc-acc-c-tile-partial-tiles-wrong.json +113 -0
  500. offload/_root/data/findings/reviews/catalog--afar-c-ordered-doacross-link.json +113 -0
  501. offload/_root/data/findings/reviews/catalog--afar-c-reduction-task-link.json +113 -0
  502. offload/_root/data/findings/reviews/catalog--afar-flang-absent-optional-target-crash.json +113 -0
  503. offload/_root/data/findings/reviews/catalog--afar-flang-critical-target-parallel-wrong.json +113 -0
  504. offload/_root/data/findings/reviews/catalog--afar-flang-dist-schedule-chunk.json +113 -0
  505. offload/_root/data/findings/reviews/catalog--afar-flang-linear-parallel-ice.json +113 -0
  506. offload/_root/data/findings/reviews/catalog--afar-flang-named-critical-link.json +126 -0
  507. offload/_root/data/findings/reviews/catalog--afar-flang-ordered-wrong.json +113 -0
  508. offload/_root/data/findings/reviews/catalog--afar-flang-reduction-minus-rejected.json +113 -0
  509. offload/_root/data/findings/reviews/catalog--afar-flang-sections-in-target-ice.json +113 -0
  510. offload/_root/data/findings/reviews/catalog--afar-flang-workdistribute-ice.json +113 -0
  511. offload/_root/data/findings/reviews/catalog--c-allocate-const-mem-firstprivate-wrong.json +113 -0
  512. offload/_root/data/findings/reviews/catalog--cce-acc-character-dummy-routine-ice.json +113 -0
  513. offload/_root/data/findings/reviews/catalog--cce-acc-loop-seq-in-routine-wrong.json +113 -0
  514. offload/_root/data/findings/reviews/catalog--cce-allocators-stack-ice.json +113 -0
  515. offload/_root/data/findings/reviews/catalog--cce-c-allocate-align-link.json +113 -0
  516. offload/_root/data/findings/reviews/catalog--cce-c-allocate-allocator-modifier-rejected.json +113 -0
  517. offload/_root/data/findings/reviews/catalog--cce-c-dist-schedule-chunk.json +113 -0
  518. offload/_root/data/findings/reviews/catalog--cce-c-f-pointer-device-link.json +130 -0
  519. offload/_root/data/findings/reviews/catalog--cce-c-long-double-ice.json +217 -0
  520. offload/_root/data/findings/reviews/catalog--cce-c-map-iterator-ice.json +217 -0
  521. offload/_root/data/findings/reviews/catalog--cce-c-recursive-function-ice.json +113 -0
  522. offload/_root/data/findings/reviews/catalog--cce-c-sections-in-target-wrong.json +113 -0
  523. offload/_root/data/findings/reviews/catalog--cce-flang-allocate-in-target-crash.json +113 -0
  524. offload/_root/data/findings/reviews/catalog--cce-flang-lastprivate-parallel-in-seq-loop-wrong.json +113 -0
  525. offload/_root/data/findings/reviews/catalog--cce-flang-stop-in-target-crash.json +113 -0
  526. offload/_root/data/findings/reviews/catalog--cce-iterator-link.json +113 -0
  527. offload/_root/data/findings/reviews/catalog--cce-linear-lastprivate-ice.json +113 -0
  528. offload/_root/data/findings/reviews/catalog--cce-reduction-inscan-ice.json +113 -0
  529. offload/_root/data/findings/reviews/catalog--cce-reduction-task-link.json +113 -0
  530. offload/_root/data/findings/reviews/catalog--cce19-reduction-task-addrspacecast-ice.json +113 -0
  531. offload/_root/data/findings/reviews/catalog--cce20-c-defaultmap-private-storage-rejected.json +217 -0
  532. offload/_root/data/findings/reviews/catalog--cce20-map-self-rejected.json +204 -0
  533. offload/_root/data/findings/reviews/catalog--cce21-c-target-loop-ice.json +126 -0
  534. offload/_root/data/findings/reviews/catalog--defaultmap-present-private-array-abort.json +236 -0
  535. offload/_root/data/findings/reviews/catalog--nvhpc-acc-associate-illegal-address.json +113 -0
  536. offload/_root/data/findings/reviews/catalog--nvhpc-c-function-pointer-kernel-missing.json +268 -0
  537. offload/_root/data/findings/reviews/cce-acc-init-set-runtime-assert.json +113 -0
  538. offload/_root/data/findings/reviews/cce-acc-reduction-200-int8-scalars-wrong.json +113 -0
  539. offload/_root/data/findings/reviews/cce-acc-routine-bind-module-ice.json +113 -0
  540. offload/_root/data/findings/reviews/cce-c-dist-schedule-segv.json +113 -0
  541. offload/_root/data/findings/reviews/cce-c-map-delete-refcount.json +149 -0
  542. offload/_root/data/findings/reviews/cce-c-map-present-assert.json +126 -0
  543. offload/_root/data/findings/reviews/cce-c-openmp45-device-link.json +113 -0
  544. offload/_root/data/findings/reviews/cce-c-parallel-for-in-target.json +141 -0
  545. offload/_root/data/findings/reviews/cce-mapper-next-map-copy-back.json +208 -0
  546. offload/_root/data/findings/reviews/cce-uses-allocators-traits-omp50.json +191 -0
  547. offload/_root/data/findings/reviews/cce19-c-reduction-63-scalars-one-wrong.json +113 -0
  548. offload/_root/data/findings/reviews/cce19-target-parallel-guarded-loop.json +113 -0
  549. offload/_root/data/findings/reviews/cce19-target-parallel-single-ice.json +113 -0
  550. offload/_root/data/findings/reviews/cce21-alloc-2e32-sum-wrong.json +113 -0
  551. offload/_root/data/findings/reviews/cce21-defaultmap-aggregate-flag.json +210 -0
  552. offload/_root/data/findings/reviews/cce21-in-reduction-assumed-shape-write-lost.json +113 -0
  553. offload/_root/data/findings/reviews/cce21-in-reduction-taskwait-link.json +113 -0
  554. offload/_root/data/findings/reviews/clang-c-declare-target-to-omp52.json +113 -0
  555. offload/_root/data/findings/reviews/clang-c-linear-directive-name-hang.json +113 -0
  556. offload/_root/data/findings/reviews/clang-c-shared-declare-target-combined.json +132 -0
  557. offload/_root/data/findings/reviews/dataenv--cce-value-dummy-target-write-visible.json +113 -0
  558. offload/_root/data/findings/reviews/defaultmap-none-loop-variable.json +113 -0
  559. offload/_root/data/findings/reviews/fortran-schedule-static-in-target.json +113 -0
  560. offload/_root/data/findings/reviews/fresh--cce-common-block-name-in-map-rejected.json +113 -0
  561. offload/_root/data/findings/reviews/fresh--cce-list-directed-print-in-target-copy-crash.json +217 -0
  562. offload/_root/data/findings/reviews/fresh--cce19-acc-automatic-array-copyout-copy-crash.json +113 -0
  563. offload/_root/data/findings/reviews/fresh--cce21-combined-if-runtime-expr-loop-skipped.json +113 -0
  564. offload/_root/data/findings/reviews/fresh--nvhpc-acc-gang-worker-collapse-nested-vector-reduction-lost.json +113 -0
  565. offload/_root/data/findings/reviews/fresh--nvhpc-teams-loop-module-allocatable-assign-fort2-crash.json +113 -0
  566. offload/_root/data/findings/reviews/fuzz--1505-cce20.json +113 -0
  567. offload/_root/data/findings/reviews/fuzz--1540-afar.json +113 -0
  568. offload/_root/data/findings/reviews/fuzz--1978-cce19.json +130 -0
  569. offload/_root/data/findings/reviews/fuzz--2334-cce19.json +113 -0
  570. offload/_root/data/findings/reviews/fuzz--591-cce19.json +147 -0
  571. offload/_root/data/findings/reviews/fuzz--650-afar.json +113 -0
  572. offload/_root/data/findings/reviews/fuzz--916-afar.json +130 -0
  573. offload/_root/data/findings/reviews/fuzz--98-cce19.json +113 -0
  574. offload/_root/data/findings/reviews/fuzz--b1-121-afar.json +160 -0
  575. offload/_root/data/findings/reviews/fuzz--b2-209-cce19.json +141 -0
  576. offload/_root/data/findings/reviews/fuzz--b2-68-afar.json +113 -0
  577. offload/_root/data/findings/reviews/fuzz--b2-85-cce20.json +217 -0
  578. offload/_root/data/findings/reviews/fuzz--b3-188-cce19.json +113 -0
  579. offload/_root/data/findings/reviews/fuzz--b3-278-cce19.json +212 -0
  580. offload/_root/data/findings/reviews/fuzz--b3-54-afar.json +113 -0
  581. offload/_root/data/findings/reviews/fuzz--b3-61-cce20.json +191 -0
  582. offload/_root/data/findings/reviews/fuzz--b4-86-cce19.json +113 -0
  583. offload/_root/data/findings/reviews/fuzz--gcc-declare-reduction-module-not-found.json +113 -0
  584. offload/_root/data/findings/reviews/fuzz--gcc-target-simd-map-nontemporal-rejected.json +113 -0
  585. offload/_root/data/findings/reviews/fuzz--nvhpc-allocatable-component-implicit-map-illegal-address.json +141 -0
  586. offload/_root/data/findings/reviews/fuzz--nvhpc-assumed-length-character-dummy-map-ice.json +113 -0
  587. offload/_root/data/findings/reviews/fuzz--nvhpc-default-none-reduction-lastprivate-fort1-crash.json +113 -0
  588. offload/_root/data/findings/reviews/fuzz--nvhpc-defaultmap-firstprivate-lastprivate-ice.json +113 -0
  589. offload/_root/data/findings/reviews/fuzz--nvhpc-defaultmap-to-scalar-reduction-lost.json +113 -0
  590. offload/_root/data/findings/reviews/fuzz--nvhpc-depend-implicit-map-illegal-address.json +113 -0
  591. offload/_root/data/findings/reviews/fuzz--nvhpc-distribute-parallel-num-threads-writes-lost.json +113 -0
  592. offload/_root/data/findings/reviews/fuzz--nvhpc-end-distribute-simd-rejected.json +113 -0
  593. offload/_root/data/findings/reviews/fuzz--nvhpc-loop-character-achar-unsupported.json +113 -0
  594. offload/_root/data/findings/reviews/fuzz--nvhpc-map-always-after-map-to-not-copied-back.json +113 -0
  595. offload/_root/data/findings/reviews/fuzz--nvhpc-num-threads-reduction-identity-lost.json +113 -0
  596. offload/_root/data/findings/reviews/fuzz--nvhpc-target-parallel-firstprivate-translate-failure.json +191 -0
  597. offload/_root/data/findings/reviews/fuzz--nvhpc-target-parallel-single-hang.json +113 -0
  598. offload/_root/data/findings/reviews/fuzz--nvhpc-target-simd-collapse-translate-failure.json +113 -0
  599. offload/_root/data/findings/reviews/fuzz--nvhpc-target-simd-no-end-directive-rejected.json +113 -0
  600. offload/_root/data/findings/reviews/fuzz--par-s1-2082-gcc_g90.json +126 -0
  601. offload/_root/data/findings/reviews/fuzz--s1-2370-cce21.json +113 -0
  602. offload/_root/data/findings/reviews/fuzz--s1-2592-cce21.json +113 -0
  603. offload/_root/data/findings/reviews/fuzz--s1-3463-cce21.json +113 -0
  604. offload/_root/data/findings/reviews/fuzz--s1-6760-cce20.json +130 -0
  605. offload/_root/data/findings/reviews/fuzz--s1-6888-cce21.json +113 -0
  606. offload/_root/data/findings/reviews/fuzz--s1-7882-cce20.json +113 -0
  607. offload/_root/data/findings/reviews/fuzz--s1-8634-cce21.json +113 -0
  608. offload/_root/data/findings/reviews/fuzz--s1-91-cce21.json +113 -0
  609. offload/_root/data/findings/reviews/fuzz--s1-9443-afar.json +113 -0
  610. offload/_root/data/findings/reviews/fuzz--s1-9914-cce19.json +141 -0
  611. offload/_root/data/findings/reviews/gcc--gcc-acc-bind-device-type-rejected.json +113 -0
  612. offload/_root/data/findings/reviews/gcc--gcc-acc-detach-delete-attach-underflow.json +314 -0
  613. offload/_root/data/findings/reviews/gcc--gcc-acc-gang-dim-collapse-force-rejected.json +113 -0
  614. offload/_root/data/findings/reviews/gcc--gcc-acc-init-set-shutdown-rejected.json +113 -0
  615. offload/_root/data/findings/reviews/gcc--gcc-acc-link-in-routine-rejected.json +113 -0
  616. offload/_root/data/findings/reviews/gcc--gcc-acc-use-device-allocatable-rejected.json +113 -0
  617. offload/_root/data/findings/reviews/gcc--gcc-c-motion-mapper-rejected.json +113 -0
  618. offload/_root/data/findings/reviews/gcc--gcc-c-omp60-undocumented-rejected.json +217 -0
  619. offload/_root/data/findings/reviews/gcc--gcc-c-omp60-unimplemented-rejected.json +236 -0
  620. offload/_root/data/findings/reviews/gcc--gcc-c-target-in-task-mandatory-device-not-found.json +236 -0
  621. offload/_root/data/findings/reviews/gcc--gcc-c-uses-allocators-traits-unimplemented.json +113 -0
  622. offload/_root/data/findings/reviews/gcc--gcc-declare-mapper-rejected.json +113 -0
  623. offload/_root/data/findings/reviews/gcc--gcc-defaultmap-to-pointer-copy-back.json +217 -0
  624. offload/_root/data/findings/reviews/gcc--gcc-loop-bind-default-none-rejected.json +113 -0
  625. offload/_root/data/findings/reviews/harvest--afar-flang-strided-target-update.json +141 -0
  626. offload/_root/data/findings/reviews/harvest--cce-acc-declare-create-module-allocatable-xnack1-fault.json +113 -0
  627. offload/_root/data/findings/reviews/harvest--cce-c-implicit-struct-map-partly-present.json +217 -0
  628. offload/_root/data/findings/reviews/harvest--cce-c-strided-target-update.json +141 -0
  629. offload/_root/data/findings/reviews/harvest--cce-ftn-target-parallel-thread-query-ice.json +130 -0
  630. offload/_root/data/findings/reviews/harvest--cce-named-constant-array-declare-target-routine-rejected.json +113 -0
  631. offload/_root/data/findings/reviews/harvest--cce-use-device-ptr-c-ptr-not-converted.json +113 -0
  632. offload/_root/data/findings/reviews/harvest--cce21-declare-target-link-module-variable-write-lost.json +113 -0
  633. offload/_root/data/findings/reviews/harvest--cce21-internal-procedure-calls-internal-in-target-fault.json +158 -0
  634. offload/_root/data/findings/reviews/harvest--gcc-acc-declare-create-allocatable-not-mapped.json +204 -0
  635. offload/_root/data/findings/reviews/harvest--gcc-c-same-item-two-maps-rejected.json +143 -0
  636. offload/_root/data/findings/reviews/harvest--gcc-c-strided-section-rejected.json +164 -0
  637. offload/_root/data/findings/reviews/harvest--gcc-c-target-data-struct-pointer-section-ice.json +113 -0
  638. offload/_root/data/findings/reviews/harvest--gcc-c-target-data-two-maps-ice.json +113 -0
  639. offload/_root/data/findings/reviews/harvest--gcc-teams-simd-matmul-allocatable-ice.json +113 -0
  640. offload/_root/data/findings/reviews/harvest--nvhpc-c-target-data-if-false-use-device-ptr-garbage.json +113 -0
  641. offload/_root/data/findings/reviews/harvest--nvhpc-named-constant-array-declare-target-routine-rejected.json +126 -0
  642. offload/_root/data/findings/reviews/harvest--nvhpc-use-device-ptr-c-ptr-not-found.json +113 -0
  643. offload/_root/data/findings/reviews/harvest--nvhpc2511-target-nowait-in-parallel-for-ice.json +130 -0
  644. offload/_root/data/findings/reviews/hecbench--gcc-c-float16-array-in-target-lto-ice.json +217 -0
  645. offload/_root/data/findings/reviews/hecbench--gcc-c-swar-popcount-assembler-error.json +126 -0
  646. offload/_root/data/findings/reviews/malloc--afar-device-malloc-in-kernel-corrupts-records.json +270 -0
  647. offload/_root/data/findings/reviews/multithread-allocatable-section-maps.json +191 -0
  648. offload/_root/data/findings/reviews/nested--afar-cce-c-call-result-member-in-target-rejected.json +113 -0
  649. offload/_root/data/findings/reviews/nested--afar-cce-c-update-struct-and-member-rejected.json +126 -0
  650. offload/_root/data/findings/reviews/nested--afar-flang-pointer-root-allocatable-component-enter-data-fault.json +191 -0
  651. offload/_root/data/findings/reviews/nested--cce-c-struct-and-nested-pointee-sections-ice.json +113 -0
  652. offload/_root/data/findings/reviews/nested--cce-fortran-nested-allocatable-component-copy-fault.json +214 -0
  653. offload/_root/data/findings/reviews/nested--cce-fortran-pointer-to-type-with-allocatable-scalar-component-typed-transfer.json +191 -0
  654. offload/_root/data/findings/reviews/nested--cce-fortran-update-to-pointer-root-allocatable-scalar-component-no-accelerator-object.json +297 -0
  655. offload/_root/data/findings/reviews/nested--gcc-acc-c-exit-data-of-a-pointer-array-element-target-hangs.json +204 -0
  656. offload/_root/data/findings/reviews/nested--gcc-acc-c-parent-and-shared-pointee-one-directive.json +130 -0
  657. offload/_root/data/findings/reviews/nested--gcc-acc-c-struct-and-member-array-one-directive.json +141 -0
  658. offload/_root/data/findings/reviews/nested--gcc-c-always-on-pointer-member-section-ice.json +113 -0
  659. offload/_root/data/findings/reviews/nested--gcc-c-declare-mapper-pointer-member-section-gpu-fault.json +113 -0
  660. offload/_root/data/findings/reviews/nested--gcc-c-from-struct-and-pointee-section-rejected.json +113 -0
  661. offload/_root/data/findings/reviews/nested--gcc-fortran-pointer-component-alloc-bounds-lost.json +217 -0
  662. offload/_root/data/findings/reviews/nested--gcc-fortran-root-and-element-pointer-components-ice.json +217 -0
  663. offload/_root/data/findings/reviews/nested--nvhpc-c-pointee-before-parent-in-one-map-list-copy-fault.json +204 -0
  664. offload/_root/data/findings/reviews/nested--nvhpc-c-update-from-structure-overwrites-attached-pointer-segv.json +191 -0
  665. offload/_root/data/findings/reviews/nvhpc-c-acc-atomic-update-sum-ice.json +277 -0
  666. offload/_root/data/findings/reviews/nvhpc-c-dist-schedule-chunk-compile-hang.json +113 -0
  667. offload/_root/data/findings/reviews/nvhpc-c-map-present-ignored.json +113 -0
  668. offload/_root/data/findings/reviews/nvhpc-c-ordered-in-target-nvcpfe-crash.json +113 -0
  669. offload/_root/data/findings/reviews/nvhpc-c-parallel-for-firstprivate-in-target.json +113 -0
  670. offload/_root/data/findings/reviews/nvhpc-defaultmap-firstprivate-explicit-map.json +113 -0
  671. offload/_root/data/findings/reviews/nvhpc-defaultmap-from-allocatable-indexing.json +132 -0
  672. offload/_root/data/findings/reviews/nvhpc-depend-inoutset-ignored.json +113 -0
  673. offload/_root/data/findings/reviews/nvhpc-dist-schedule-chunk-illegal-address.json +113 -0
  674. offload/_root/data/findings/reviews/nvhpc-managed-acc-shutdown-host-access.json +113 -0
  675. offload/_root/data/findings/reviews/nvhpc-parallel-if-in-target-nvvm-ice.json +113 -0
  676. offload/_root/data/findings/reviews/oop--afar-final-dealloc-device-link.json +132 -0
  677. offload/_root/data/findings/reviews/oop--afar-pdt-length-parameter-not-implemented.json +113 -0
  678. offload/_root/data/findings/reviews/oop--cce-class-is-device-link.json +130 -0
  679. offload/_root/data/findings/reviews/oop--cce-copy-alloc-component-section-fault.json +217 -0
  680. offload/_root/data/findings/reviews/oop--cce-copy-parent-to-component-tofrom-lost.json +217 -0
  681. offload/_root/data/findings/reviews/oop--cce-copy-second-member-section-lost.json +113 -0
  682. offload/_root/data/findings/reviews/oop--cce-element-component-map-lost.json +113 -0
  683. offload/_root/data/findings/reviews/oop--cce-final-dealloc-device-abort.json +208 -0
  684. offload/_root/data/findings/reviews/oop--cce-pdt-default-mapper-rejected.json +191 -0
  685. offload/_root/data/findings/reviews/oop--cce-polymorphic-dispatch-device-link.json +247 -0
  686. offload/_root/data/findings/reviews/oop--cce-section-of-element-component-overlap.json +113 -0
  687. offload/_root/data/findings/reviews/oop--cce-select-type-guard-not-taken.json +191 -0
  688. offload/_root/data/findings/reviews/oop--cce-udr-derived-type-unsupported.json +132 -0
  689. offload/_root/data/findings/reviews/oop--gcc-acc-parent-and-member-data-rejected.json +141 -0
  690. offload/_root/data/findings/reviews/oop--gcc-pdt-length-parameter-abort.json +141 -0
  691. offload/_root/data/findings/reviews/oop--gcc-polymorphic-dispatch-abort.json +217 -0
  692. offload/_root/data/findings/reviews/oop--gcc-vtab-not-marked-for-offload.json +113 -0
  693. offload/_root/data/findings/reviews/oop--nvhpc-copy-alloc-component-illegal-address.json +113 -0
  694. offload/_root/data/findings/reviews/oop--nvhpc-copy-pdt-length-parameter-illegal-address.json +236 -0
  695. offload/_root/data/findings/reviews/oop--nvhpc-named-mapper-rejected.json +113 -0
  696. offload/_root/data/findings/reviews/oop--nvhpc-polymorphic-dispatch-translate-failure.json +223 -0
  697. offload/_root/data/findings/reviews/oop--nvhpc-polymorphism-runtime-unsupported.json +126 -0
  698. offload/_root/data/findings/reviews/oop--nvhpc-type-bound-call-rejected.json +113 -0
  699. offload/_root/data/findings/reviews/oop--nvhpc-udr-derived-type-rejected.json +113 -0
  700. offload/_root/data/findings/reviews/stress--afar-c-lastprivate-combined-target-not-mapped.json +113 -0
  701. offload/_root/data/findings/reviews/stress--afar-target-scalar-implicit-firstprivate.json +175 -0
  702. offload/_root/data/findings/reviews/stress--cce-acc-declare-create-scalar-serial-firstprivate.json +113 -0
  703. offload/_root/data/findings/reviews/stress--cce-c-distribute-lastprivate-lost.json +113 -0
  704. offload/_root/data/findings/reviews/stress--cce-c-flto-offload-dropped.json +204 -0
  705. offload/_root/data/findings/reviews/stress--cce-ftn-cif-record-split-abort.json +113 -0
  706. offload/_root/data/findings/reviews/stress--cce-lastprivate-num-threads-collapse-simd.json +113 -0
  707. offload/_root/data/findings/reviews/stress--cce-teams-reduction-many-teams-wrap.json +113 -0
  708. offload/_root/data/findings/reviews/stress--cce21-declare-target-scalar-map-write-lost.json +113 -0
  709. offload/_root/data/findings/reviews/stress--gcc-declare-target-allocatable-component-ice.json +191 -0
  710. offload/_root/data/findings/reviews/stress--nvhpc-acc-derived-type-component-not-copied.json +126 -0
  711. offload/_root/data/findings/reviews/stress--nvhpc-c-lastprivate-teams-distribute-parallel-for-lost.json +113 -0
  712. offload/_root/data/findings/reviews/stress--nvhpc-declare-target-scalar-write-lost.json +113 -0
  713. offload/_root/data/findings/reviews/stress--nvhpc-lastprivate-combined-target-not-mapped.json +113 -0
  714. offload/_root/data/findings/reviews/stress--nvhpc-target-scalar-implicit-firstprivate.json +130 -0
  715. offload/_root/data/findings/reviews/target-update-sections-in-parallel.json +113 -0
  716. offload/_root/data/findings/stress/afar-c-lastprivate-combined-target-not-mapped.c +72 -0
  717. offload/_root/data/findings/stress/afar-target-scalar-implicit-firstprivate.f90 +47 -0
  718. offload/_root/data/findings/stress/cce-acc-declare-create-scalar-serial-firstprivate.f90 +43 -0
  719. offload/_root/data/findings/stress/cce-c-distribute-lastprivate-lost.c +52 -0
  720. offload/_root/data/findings/stress/cce-c-flto-offload-dropped.c +73 -0
  721. offload/_root/data/findings/stress/cce-ftn-cif-record-split-abort.f90 +109 -0
  722. offload/_root/data/findings/stress/cce-lastprivate-num-threads-collapse-simd.f90 +66 -0
  723. offload/_root/data/findings/stress/cce-teams-reduction-many-teams-wrap.f90 +55 -0
  724. offload/_root/data/findings/stress/cce21-declare-target-scalar-map-write-lost.f90 +58 -0
  725. offload/_root/data/findings/stress/controls/gcc-declare-target-allocatable-component-control.f90 +29 -0
  726. offload/_root/data/findings/stress/gcc-declare-target-allocatable-component-ice.f90 +61 -0
  727. offload/_root/data/findings/stress/nvhpc-acc-derived-type-component-not-copied.f90 +33 -0
  728. offload/_root/data/findings/stress/nvhpc-c-lastprivate-teams-distribute-parallel-for-lost.c +62 -0
  729. offload/_root/data/findings/stress/nvhpc-declare-target-scalar-write-lost.f90 +43 -0
  730. offload/_root/data/findings/stress/nvhpc-lastprivate-combined-target-not-mapped.f90 +60 -0
  731. offload/_root/data/findings/stress/nvhpc-target-scalar-implicit-firstprivate.f90 +41 -0
  732. offload/_root/data/findings/target-update-sections-in-parallel.f90 +53 -0
  733. offload/_root/data/issues.json +1 -0
  734. offload/_root/data/search.json +1 -0
  735. offload/_root/data/vendor/checks/build.py +288 -0
  736. offload/_version.py +24 -0
  737. offload/canuse.py +88 -0
  738. offload/cli.py +52 -0
  739. offload/data.py +85 -0
  740. offload/engine/__init__.py +0 -0
  741. offload/engine/acc_c_gen.py +415 -0
  742. offload/engine/acc_gen.py +1104 -0
  743. offload/engine/acc_rules.py +656 -0
  744. offload/engine/apps.py +804 -0
  745. offload/engine/baseline.py +324 -0
  746. offload/engine/c_gen.py +883 -0
  747. offload/engine/c_program.py +913 -0
  748. offload/engine/c_rules.py +503 -0
  749. offload/engine/campaign.py +1180 -0
  750. offload/engine/campaigns/__init__.py +2 -0
  751. offload/engine/campaigns/hecbench.py +153 -0
  752. offload/engine/campaigns/nested.py +76 -0
  753. offload/engine/campaigns/oop.py +61 -0
  754. offload/engine/canary.py +275 -0
  755. offload/engine/catalog.py +860 -0
  756. offload/engine/citations.py +532 -0
  757. offload/engine/clang_oracle.py +208 -0
  758. offload/engine/combos.py +234 -0
  759. offload/engine/confirm/__init__.py +2 -0
  760. offload/engine/confirm/backlog.py +159 -0
  761. offload/engine/confirm/claims.py +423 -0
  762. offload/engine/confirm/collectors.py +665 -0
  763. offload/engine/confirm/decisions.py +202 -0
  764. offload/engine/confirm/draft.py +195 -0
  765. offload/engine/confirm/engine.py +157 -0
  766. offload/engine/confirm/execute.py +382 -0
  767. offload/engine/confirm/facts.py +467 -0
  768. offload/engine/confirm/findings.py +617 -0
  769. offload/engine/confirm/forms.py +145 -0
  770. offload/engine/confirm/ingest.py +372 -0
  771. offload/engine/confirm/jobs.py +215 -0
  772. offload/engine/confirm/legality.py +323 -0
  773. offload/engine/confirm/machines.py +254 -0
  774. offload/engine/confirm/minimize.py +268 -0
  775. offload/engine/confirm/model.py +249 -0
  776. offload/engine/confirm/ports.py +107 -0
  777. offload/engine/confirm/programs.py +222 -0
  778. offload/engine/confirm/registry.py +151 -0
  779. offload/engine/confirm/regress.py +278 -0
  780. offload/engine/confirm/rules.py +565 -0
  781. offload/engine/confirm/store.py +63 -0
  782. offload/engine/confirm/triage.py +838 -0
  783. offload/engine/confirm/validate.py +607 -0
  784. offload/engine/confirm/witness.py +355 -0
  785. offload/engine/corpus_check.py +388 -0
  786. offload/engine/coverage.py +318 -0
  787. offload/engine/dataenv_gen.py +1318 -0
  788. offload/engine/dataenv_rules.py +278 -0
  789. offload/engine/devtemps.py +146 -0
  790. offload/engine/expected.py +2559 -0
  791. offload/engine/f2c.py +1783 -0
  792. offload/engine/finding_claims.py +330 -0
  793. offload/engine/finding_header.py +229 -0
  794. offload/engine/finding_rows.py +382 -0
  795. offload/engine/flang_oracle.py +299 -0
  796. offload/engine/fsource.py +620 -0
  797. offload/engine/fuzz.py +2455 -0
  798. offload/engine/fuzz_base.py +2016 -0
  799. offload/engine/fuzz_campaign.py +592 -0
  800. offload/engine/fuzz_exec.py +798 -0
  801. offload/engine/fuzz_min.py +1049 -0
  802. offload/engine/fuzz_profile.py +340 -0
  803. offload/engine/fuzz_report.py +1270 -0
  804. offload/engine/fuzz_steer.py +181 -0
  805. offload/engine/gate.py +1013 -0
  806. offload/engine/gate_report.py +711 -0
  807. offload/engine/gate_run.py +118 -0
  808. offload/engine/gate_stored.py +466 -0
  809. offload/engine/gen.py +1114 -0
  810. offload/engine/gen_templates.py +2583 -0
  811. offload/engine/grammar.py +695 -0
  812. offload/engine/harness.py +1472 -0
  813. offload/engine/harvest/__init__.py +3 -0
  814. offload/engine/harvest/c_runtime.py +465 -0
  815. offload/engine/harvest/checks.py +534 -0
  816. offload/engine/harvest/convert.py +784 -0
  817. offload/engine/harvest/f_runtime.py +668 -0
  818. offload/engine/harvest/filters.py +338 -0
  819. offload/engine/harvest/history.py +122 -0
  820. offload/engine/harvest/inventory.py +399 -0
  821. offload/engine/harvest2/__init__.py +5 -0
  822. offload/engine/harvest2/aomp.py +119 -0
  823. offload/engine/harvest2/examples.py +116 -0
  824. offload/engine/harvest2/gomp.py +679 -0
  825. offload/engine/harvest2/hand.py +150 -0
  826. offload/engine/harvest2/split.py +78 -0
  827. offload/engine/harvest_known/__init__.py +2 -0
  828. offload/engine/harvest_known/apps.py +65 -0
  829. offload/engine/harvest_known/cases.py +128 -0
  830. offload/engine/harvest_known/centres.py +184 -0
  831. offload/engine/harvest_known/forum.py +180 -0
  832. offload/engine/harvest_known/relnotes.py +42 -0
  833. offload/engine/harvest_known/textscan.py +107 -0
  834. offload/engine/hdrwrap.py +42 -0
  835. offload/engine/hecbench.py +568 -0
  836. offload/engine/hecbench_report.py +265 -0
  837. offload/engine/hecbench_run.py +483 -0
  838. offload/engine/idioms.py +1427 -0
  839. offload/engine/kbody_cites.py +81 -0
  840. offload/engine/kbody_emit.py +949 -0
  841. offload/engine/kbody_gen.py +795 -0
  842. offload/engine/legality_review.py +236 -0
  843. offload/engine/localcfg.py +58 -0
  844. offload/engine/malloc_dd.py +267 -0
  845. offload/engine/mutate.py +1933 -0
  846. offload/engine/nested_cites.py +196 -0
  847. offload/engine/nested_emit.py +789 -0
  848. offload/engine/nested_gen.py +1721 -0
  849. offload/engine/offload_scope.py +197 -0
  850. offload/engine/ompvv.py +624 -0
  851. offload/engine/oop_gen.py +2249 -0
  852. offload/engine/prerun.py +1435 -0
  853. offload/engine/program_source.py +739 -0
  854. offload/engine/provenance.py +103 -0
  855. offload/engine/reduce.py +2098 -0
  856. offload/engine/report.py +3374 -0
  857. offload/engine/root.py +33 -0
  858. offload/engine/rules.py +4256 -0
  859. offload/engine/run_matrix.py +325 -0
  860. offload/engine/site/__init__.py +1 -0
  861. offload/engine/site/columns.py +53 -0
  862. offload/engine/site/data.py +648 -0
  863. offload/engine/site/header.py +228 -0
  864. offload/engine/site/inputs.py +115 -0
  865. offload/engine/site/matrix.py +434 -0
  866. offload/engine/site/scrub.py +294 -0
  867. offload/engine/skeleton.py +121 -0
  868. offload/engine/spec_text.py +242 -0
  869. offload/engine/stress.py +4122 -0
  870. offload/engine/stress_c.py +1000 -0
  871. offload/engine/stress_exec.py +805 -0
  872. offload/engine/stress_min.py +248 -0
  873. offload/engine/stress_report.py +552 -0
  874. offload/engine/textclean.py +97 -0
  875. offload/engine/toolchains.py +1070 -0
  876. offload/engine/transforms.py +511 -0
  877. offload/engine/usage.py +1252 -0
  878. offload/engine/widen.py +673 -0
  879. offload/engine/widen_progs.py +2396 -0
  880. offload/issues.py +146 -0
  881. offtarget-0.1.0.dist-info/METADATA +86 -0
  882. offtarget-0.1.0.dist-info/RECORD +886 -0
  883. offtarget-0.1.0.dist-info/WHEEL +4 -0
  884. offtarget-0.1.0.dist-info/entry_points.txt +2 -0
  885. offtarget-0.1.0.dist-info/licenses/LICENSE +21 -0
  886. offtarget-0.1.0.dist-info/licenses/THIRD_PARTY_NOTICES.md +20 -0
@@ -0,0 +1,1070 @@
1
+ """The toolchain registry: every compiler release the project measures, read
2
+ from catalog/toolchains.yaml. The matrix, gate, confirmer, support tables,
3
+ site and job scripts all ask this module for the list.
4
+
5
+ A toolchain has a family (releases and arch twins of one compiler share bugs),
6
+ a version, a machine and arch (catalog/machines.yaml), its memory modes, a
7
+ recipe (prelude, compilers, flags, environment) and its display names.
8
+
9
+ A twin is a toolchain's install on another GPU, named with the arch's
10
+ ``twin_suffix`` (afar_g90) or after its machine (afar_mi300x).
11
+
12
+ NVHPC's memory mode is a compile flag (catalog/machines.yaml
13
+ ``modes.<mode>.flags``), so ``for_mode`` returns a toolchain compiled for one
14
+ mode. AMD modes are run-time settings (HSA_XNACK), so it returns an AMD
15
+ toolchain unchanged. GCC 16.2 is ``under_test_only``."""
16
+ from __future__ import annotations
17
+
18
+ import dataclasses
19
+ import os
20
+ import re
21
+ import subprocess
22
+ from dataclasses import dataclass, field
23
+ from functools import lru_cache
24
+ from pathlib import Path
25
+
26
+ import yaml
27
+
28
+ from offload.engine import localcfg
29
+ from offload.engine.root import ROOT # noqa: E402
30
+ CATALOG = ROOT / "catalog" / "toolchains.yaml"
31
+ # the environment variable that points the registry at another catalog
32
+ # (tests: a copy with a fake toolchain added)
33
+ CATALOG_ENV = "COMPLIANT_TOOLCHAINS"
34
+
35
+
36
+ def _afar_bin(lustre: str, vast: str, isdir=os.path.isdir) -> str:
37
+ """An install root with a fallback copy: the default install, or on a
38
+ host without it that has the copy (Tioga: /p/vast1) the copy, so its
39
+ front end (the legality checks, e.g. the fuzz minimizer's) runs there
40
+ too."""
41
+ return lustre if isdir(lustre) or not isdir(vast) else vast
42
+
43
+
44
+ @dataclass(frozen=True)
45
+ class Family:
46
+ """A compiler family of catalog/toolchains.yaml."""
47
+ id: str
48
+ name: str # the short label ("CCE")
49
+ long_name: str # the site's method table ("Cray CCE")
50
+ site_name: str # the issue list's family button
51
+ vendor: str | None # the vendor packet (data/vendor/<vendor>)
52
+ kind: str # the recipe kind (Toolchain.kind)
53
+ message_table: str # offload.engine.harness PATTERNS key
54
+ compile_s: float # the gate's seconds per compile
55
+ flags: dict = field(default_factory=dict) # model -> lang -> template
56
+ unsupported: dict = field(default_factory=dict) # "acc" | "acc/c" -> why
57
+ prelude: str = ""
58
+ fc: str = ""
59
+ cc: str = ""
60
+ cxx: str = "" # the C++ driver (the hecbench campaign), "" when none
61
+ version_flags: dict = field(default_factory=dict) # OpenMP version -> flag
62
+ c_version_flag: bool = False
63
+ offload_targets: dict = field(default_factory=dict) # GCC: arch prefix -> target
64
+ latomic: dict = field(default_factory=dict) # GCC: target -> extra flag
65
+ under_test_only: str = "" # the reason it is never a legality witness
66
+ witness: str = "" # "other_families": its compilers witness other cases
67
+ site_gpus: str = "" # the method table's "GPUs and memory modes" text
68
+ site_public: dict = field(default_factory=dict) # path template -> public form
69
+ site_runtime_env: bool = False # the site's commands export LD_LIBRARY_PATH
70
+
71
+ def supports_model(self, model: str) -> bool:
72
+ """Whether any language of the family compiles `model`."""
73
+ return model not in self.unsupported
74
+
75
+ def why_unsupported(self, model: str, lang: str) -> str | None:
76
+ return self.unsupported.get(model) or self.unsupported.get(f"{model}/{lang}")
77
+
78
+
79
+ @dataclass(frozen=True)
80
+ class Toolchain:
81
+ name: str
82
+ prelude: str # plain statement list (no pipes) run before compiling
83
+ fc: str # Fortran compiler command
84
+ extra: str = "" # extra flags of a non-baseline run (version, includes)
85
+ model: str = "omp" # "acc": compile OpenACC (CCE only)
86
+ cc: str = "" # C compiler command
87
+ lang: str = "f90" # "c": compile C (OpenMP only); "cpp": C++ (takes C's flags)
88
+ arch: str = "gfx942" # The offload target
89
+ machine: str = "tuolumne" # Where it runs
90
+ # Extra run-time environment (Tioga: AFAR's library path)
91
+ env: tuple[tuple[str, str], ...] = ()
92
+ xnack_modes: tuple[int, ...] = (0, 1) # Tioga runs X=0 only
93
+ # The compiler vendor of the recipe ("afar", "cce", "nvhpc");
94
+ # "" = by name (AFAR or, otherwise, CCE: the early toolchains)
95
+ vendor: str = ""
96
+ # The memory mode (row key) this toolchain is compiled for,
97
+ # on a machine whose modes are compile flags (for_mode); None elsewhere
98
+ mode: int | None = None
99
+ # --- catalog attributes (catalog/toolchains.yaml; "" for an ad-hoc
100
+ # test toolchain) ---
101
+ family_id: str = ""
102
+ version: str = ""
103
+ label: str = "" # the support tables' column name
104
+ site_version: str = "" # the version label the site shows
105
+ site_pill: str = "" # the issue list's version pill
106
+ site_targets: tuple[str, ...] = () # the site columns it has cells in ("" = all of its GPU kind)
107
+ site_plan_runs: bool = False
108
+ site_root_var: str = ""
109
+ site_gpus: str = ""
110
+ merged_key: str | None = None # its key in the merged result tables (dashboard, can-I-use)
111
+ report_column: bool = True
112
+ regression_of: str | None = None
113
+ twin_of: str | None = None
114
+ lane: str = ""
115
+ canaries: str = "" # its entry in catalog/canaries.yaml
116
+ mention_words: tuple[str, ...] = () # words near the family name that pick this install
117
+ install_root: str = "" # the resolved install root ({root})
118
+ install_roots: tuple[str, ...] = () # every root the recipe may name (default, fallback)
119
+ install_env: str = "" # the environment variable that overrides the root
120
+ cxx: str = "" # C++ compiler command (the hecbench campaign)
121
+
122
+ @property
123
+ def base(self) -> str:
124
+ """The gfx942 toolchain name."""
125
+ return base_name(self.name)
126
+
127
+ @property
128
+ def kind(self) -> str:
129
+ """The recipe's vendor."""
130
+ return self.vendor or ("afar" if self.base == "afar" else "cce")
131
+
132
+ @property
133
+ def family(self) -> Family:
134
+ """The family of the recipe: the catalog's for a registered
135
+ toolchain, else the family of its ``kind`` (ad-hoc test toolchains
136
+ named like the AMD ones)."""
137
+ reg = registry()
138
+ if self.family_id in reg.families:
139
+ return reg.families[self.family_id]
140
+ return reg.family_of_kind(self.kind)
141
+
142
+ def _machine(self):
143
+ """The toolchain's machine in catalog/machines.yaml, None for a
144
+ machine it does not list (ad-hoc test toolchains)."""
145
+ from offload.engine.confirm.machines import load
146
+ return load().get(self.machine)
147
+
148
+ def compile_time_modes(self) -> bool:
149
+ """Whether the memory mode is a compile flag (NVHPC)."""
150
+ m = self._machine()
151
+ return m is not None and m.compile_time_modes
152
+
153
+ def for_mode(self, xnack: int) -> "Toolchain":
154
+ """The toolchain compiled for mode `xnack` (a row key): itself when
155
+ the machine selects modes at run time (AMD); with ``mode`` set (its
156
+ compile flag added by ``flags``) when modes are compile flags."""
157
+ if not self.compile_time_modes():
158
+ return self
159
+ if xnack not in self.xnack_modes:
160
+ raise ValueError(f"{self.name} has no mode stored as {xnack} "
161
+ f"(its modes: {self.xnack_modes})")
162
+ return self if self.mode == xnack else \
163
+ dataclasses.replace(self, mode=xnack)
164
+
165
+ def mode_flag(self) -> str:
166
+ """The compile flag of the selected mode ("" for AMD). A toolchain
167
+ whose modes are compile flags must have one selected."""
168
+ if not self.compile_time_modes():
169
+ return ""
170
+ if self.mode is None:
171
+ raise ValueError(f"{self.name}: its memory mode is a compile "
172
+ "flag: select one with for_mode(row key)")
173
+ m = self._machine()
174
+ return m.flags(m.mode_of_row_key(self.mode), self.kind)
175
+
176
+ def _template_fields(self) -> dict:
177
+ """The values a family's flag template may name."""
178
+ fam = self.family
179
+ fields = {"arch": self.arch, "cc": "", "target": "", "latomic": ""}
180
+ if fam.kind == "nvhpc":
181
+ cc = re.fullmatch(r"sm_(\d+)", self.arch)
182
+ if cc is None:
183
+ raise ValueError(f"{self.name}: arch {self.arch} is not sm_NN")
184
+ fields["cc"] = cc.group(1)
185
+ if fam.offload_targets:
186
+ target = next((t for p, t in fam.offload_targets.items()
187
+ if self.arch.startswith(p)), None)
188
+ if target is None:
189
+ raise ValueError(f"{self.name}: no {fam.name} offload target "
190
+ f"for {self.arch}")
191
+ fields["target"] = target
192
+ fields["latomic"] = fam.latomic.get(target, "")
193
+ return fields
194
+
195
+ def flags(self) -> str:
196
+ """The fixed compile flags (without the optimisation level): the
197
+ family's template for the model and language
198
+ (catalog/toolchains.yaml ``flags``), the memory mode's compile flag
199
+ where the mode is one, then `extra`. A (model, language)
200
+ the family does not compile is refused with the catalog's reason."""
201
+ fam = self.family
202
+ lang = "c" if self.lang == "cpp" else self.lang # C++ takes C's flags
203
+ why = fam.why_unsupported(self.model, lang)
204
+ if why:
205
+ raise ValueError(why)
206
+ tpl = (fam.flags.get(self.model) or {}).get(lang)
207
+ if tpl is None:
208
+ raise ValueError(f"{self.name}: {fam.name} has no flags for "
209
+ f"{self.model} {self.lang}")
210
+ base = tpl.format(**self._template_fields())
211
+ parts = [base, self.mode_flag(), self.extra]
212
+ return " ".join(p for p in parts if p)
213
+
214
+ def compiler(self) -> str:
215
+ """The compiler command of the toolchain's language."""
216
+ if self.lang == "cpp":
217
+ if not self.cxx:
218
+ raise ValueError(f"toolchain {self.name} has no C++ compiler")
219
+ return self.cxx
220
+ if self.lang == "c":
221
+ if not self.cc:
222
+ raise ValueError(f"toolchain {self.name} has no C compiler")
223
+ return self.cc
224
+ return self.fc
225
+
226
+ def compile_cmd(self, src: str, out: str, opt: str = "-O2") -> str:
227
+ cmd = f"{self.compiler()} {self.flags()} {opt} {src} -o {out}"
228
+ return f"{self.prelude}\n{cmd}" if self.prelude else cmd
229
+
230
+ def run_env(self, xnack: int) -> dict[str, str]:
231
+ """The run-time environment of mode `xnack` (a row key): the
232
+ machine's mode ``env`` (AMD: HSA_XNACK=<key>) and the toolchain's
233
+ own. On a machine whose modes are compile flags the
234
+ environment selects nothing, and a build for another mode is
235
+ refused."""
236
+ if xnack not in self.xnack_modes:
237
+ raise ValueError(f"{self.name} runs at HSA_XNACK="
238
+ f"{self.xnack_modes} only, not {xnack}")
239
+ m = self._machine()
240
+ if m is None or not m.compile_time_modes:
241
+ return {"HSA_XNACK": str(xnack), **dict(self.env)}
242
+ if self.mode is not None and self.mode != xnack:
243
+ raise ValueError(f"{self.name} was compiled for mode "
244
+ f"{self.mode}, not {xnack}")
245
+ return {**m.env(m.mode_of_row_key(xnack)), **dict(self.env)}
246
+
247
+ def targets(self) -> tuple[str, ...]:
248
+ """The site's GPU/mode columns it has cells in: the catalog's
249
+ ``site_targets``, else every target of its GPU vendor kind."""
250
+ if self.site_targets:
251
+ return self.site_targets
252
+ reg = registry()
253
+ gpu = reg.arches[self.arch]["gpu"]
254
+ return tuple(t for t, g in reg.target_kinds().items() if g == gpu)
255
+
256
+ def public(self, text: str) -> str:
257
+ """`text` with the install paths in their public form (the site's
258
+ command lines: ``$AFAR/bin/``, a bare ``nvfortran``, ``$GCC_16_2``;
259
+ catalog/toolchains.yaml ``site_public``)."""
260
+ for root in self.install_roots:
261
+ fields = _root_fields(root)
262
+ fields["var"] = self.site_root_var
263
+ pairs = [(tpl.format(**fields), pub.format(**fields))
264
+ for tpl, pub in self.family.site_public.items()]
265
+ for path, pub in sorted(pairs, key=lambda kv: -len(kv[0])):
266
+ text = text.replace(path, pub)
267
+ return text
268
+
269
+
270
+ def _root_fields(root: str) -> dict:
271
+ """The placeholders an install root fills in a recipe template."""
272
+ p = Path(root)
273
+ return {"root": root, "root_dir": str(p.parent),
274
+ "root_grandparent": str(p.parent.parent)}
275
+
276
+
277
+ class Registry:
278
+ """The checked contents of catalog/toolchains.yaml."""
279
+
280
+ def __init__(self, data: dict, environ=None):
281
+ if data.get("version") != 1:
282
+ raise ValueError("toolchains: unknown version")
283
+ self.environ = os.environ if environ is None else environ
284
+ self.arches: dict[str, dict] = dict(data.get("arches") or {})
285
+ self.site: dict = dict(data.get("site") or {})
286
+ self.lane_docs: dict[str, str] = dict(data.get("lanes") or {})
287
+ # machine -> the directory a campaign's private copy of the tree
288
+ # goes under (tools/jobs/campaign_remote.sh)
289
+ self.campaign_lanes: dict[str, str] = dict(data.get("campaign_lanes") or {})
290
+ # machine -> {max_minutes, hosts}: the interactive-queue rules a
291
+ # foreground job of a campaign obeys (tools/campaign.py submit)
292
+ self.pdebug: dict[str, dict] = {k: dict(v) for k, v in
293
+ (data.get("pdebug") or {}).items()}
294
+ self.families: dict[str, Family] = {}
295
+ for fid, d in (data.get("families") or {}).items():
296
+ self.families[fid] = self._family(fid, d)
297
+ self.toolchains: dict[str, Toolchain] = {}
298
+ for name, d in (data.get("toolchains") or {}).items():
299
+ self.toolchains[name] = self._toolchain(name, d)
300
+ self._check()
301
+
302
+ # --- construction -------------------------------------------------
303
+
304
+ def _family(self, fid: str, d: dict) -> Family:
305
+ for key in ("name", "long_name", "kind", "message_table", "compile_s"):
306
+ if key not in d:
307
+ raise ValueError(f"toolchains: family {fid}: no {key}")
308
+ if not d.get("flags"):
309
+ raise ValueError(f"toolchains: family {fid}: no flags")
310
+ return Family(
311
+ fid, d["name"], d["long_name"], d.get("site_name") or d["long_name"],
312
+ d.get("vendor"), d["kind"], d["message_table"], float(d["compile_s"]),
313
+ {m: dict(v) for m, v in d["flags"].items()},
314
+ dict(d.get("unsupported") or {}), d.get("prelude") or "",
315
+ d.get("fc") or "", d.get("cc") or "", d.get("cxx") or "",
316
+ {int(k): v for k, v in (d.get("version_flags") or {}).items()},
317
+ bool(d.get("c_version_flag")), dict(d.get("offload_targets") or {}),
318
+ dict(d.get("latomic") or {}), d.get("under_test_only") or "",
319
+ d.get("witness") or "", d.get("site_gpus") or "",
320
+ dict(d.get("site_public") or {}), bool(d.get("site_runtime_env")))
321
+
322
+ def _toolchain(self, name: str, d: dict) -> Toolchain:
323
+ for key in ("family", "version", "machine", "arch", "modes"):
324
+ if key not in d:
325
+ raise ValueError(f"toolchains: {name}: no {key}")
326
+ fam = self.families.get(d["family"])
327
+ if fam is None:
328
+ raise ValueError(f"toolchains: {name}: unknown family {d['family']}")
329
+ if d["arch"] not in self.arches:
330
+ raise ValueError(f"toolchains: {name}: unknown arch {d['arch']}")
331
+ inst = d.get("install") or {}
332
+ roots = []
333
+ root = ""
334
+ if inst:
335
+ default = str(inst["default"])
336
+ roots.append(default)
337
+ root = default
338
+ if inst.get("fallback"):
339
+ roots.append(str(inst["fallback"]))
340
+ root = _afar_bin(default, str(inst["fallback"]))
341
+ if inst.get("env"):
342
+ root = self.environ.get(inst["env"], root)
343
+ fields = _root_fields(root) if root else {}
344
+ mods = {k: str(v) for k, v in (d.get("modules") or {}).items()}
345
+ fields.update(mods)
346
+ fields["arch"] = d["arch"]
347
+
348
+ def fill(s: str) -> str:
349
+ try:
350
+ return s.format(**fields) if s else s
351
+ except KeyError as e:
352
+ raise ValueError(f"toolchains: {name}: the recipe names {{{e.args[0]}}}: "
353
+ "give it in `modules` (or `install`)") from None
354
+ prelude = d.get("prelude") if "prelude" in d else fam.prelude
355
+ fc = d.get("fc") or fam.fc
356
+ cc = d.get("cc") or fam.cc
357
+ cxx = d.get("cxx") or fam.cxx
358
+ env = tuple((k, fill(str(v))) for k, v in (d.get("env") or {}).items())
359
+ modes = tuple(d["modes"])
360
+ row_keys = self._row_keys(name, d["machine"], modes)
361
+ return Toolchain(
362
+ name, fill(prelude or ""), fill(fc), cc=fill(cc), cxx=fill(cxx), arch=d["arch"],
363
+ machine=d["machine"], env=env, xnack_modes=row_keys,
364
+ vendor=fam.kind, family_id=fam.id, version=str(d["version"]),
365
+ label=d.get("label") or "", site_version=str(d.get("site_version") or d["version"]),
366
+ site_pill=str(d.get("site_pill") or d.get("site_version") or d["version"]),
367
+ site_targets=tuple(d.get("site_targets") or ()),
368
+ site_plan_runs=bool(d.get("site_plan_runs")),
369
+ site_root_var=d.get("site_root_var") or "",
370
+ site_gpus=d.get("site_gpus") or fam.site_gpus,
371
+ merged_key=d.get("merged_key"), report_column=d.get("report_column", True),
372
+ regression_of=d.get("regression_of"), twin_of=d.get("twin_of"),
373
+ lane=d.get("lane") or "", canaries=d.get("canaries") or name,
374
+ mention_words=tuple(d.get("mention_words") or ()),
375
+ install_root=root, install_roots=tuple(roots),
376
+ install_env=inst.get("env") or "")
377
+
378
+ def _row_keys(self, name: str, machine: str, modes: tuple) -> tuple[int, ...]:
379
+ """The stored row keys of the machine's modes, ascending."""
380
+ from offload.engine.confirm.machines import load
381
+ m = load().get(machine)
382
+ if m is None: # reported by check_registry
383
+ return ()
384
+ for mode in modes:
385
+ if not m.has(mode):
386
+ raise ValueError(f"toolchains: {name}: {machine} has no "
387
+ f"{mode} mode")
388
+ return tuple(sorted(m.row_key(x) for x in modes))
389
+
390
+ def _check(self) -> None:
391
+ for name, tc in self.toolchains.items():
392
+ if tc.twin_of is not None and tc.twin_of not in self.toolchains:
393
+ raise ValueError(f"toolchains: {name}: twin_of {tc.twin_of} "
394
+ "is not a toolchain")
395
+ if tc.regression_of is not None and \
396
+ tc.regression_of not in self.toolchains:
397
+ raise ValueError(f"toolchains: {name}: regression_of "
398
+ f"{tc.regression_of} is not a toolchain")
399
+ if tc.twin_of is not None and name not in self._twin_names(tc):
400
+ raise ValueError(f"toolchains: {name}: a twin of {tc.twin_of} on "
401
+ f"{tc.machine} is named "
402
+ f"{' or '.join(self._twin_names(tc))}")
403
+ if tc.twin_of is None and tc.regression_of is None and not tc.label:
404
+ raise ValueError(f"toolchains: {name}: no label")
405
+ if tc.lane and tc.lane not in self.lane_docs:
406
+ raise ValueError(f"toolchains: {name}: lane {tc.lane} is not described "
407
+ f"under `lanes:` (known: {', '.join(self.lane_docs)})")
408
+
409
+ def _twin_names(self, tc: Toolchain) -> tuple[str, ...]:
410
+ """The names a twin may have: its base and the arch's suffix (gfx90a), or its base
411
+ and its machine (an arch without a suffix, or another machine of the arch)."""
412
+ suffix = self.arches[tc.arch].get("twin_suffix")
413
+ return tuple(f"{tc.twin_of}{s}" for s in (suffix, f"_{tc.machine}") if s)
414
+
415
+ # --- the lists --------------------------------------------------------
416
+
417
+ def family_of(self, name: str) -> Family | None:
418
+ tc = self.toolchains.get(name)
419
+ return self.families.get(tc.family_id) if tc is not None else None
420
+
421
+ def family_of_kind(self, kind: str) -> Family:
422
+ for fam in self.families.values():
423
+ if fam.kind == kind:
424
+ return fam
425
+ raise KeyError(f"no compiler family of kind {kind}")
426
+
427
+ def message_table(self, name: str) -> str:
428
+ """The message-table key of a toolchain (``family()``): its
429
+ family's; for a name the catalog does not know, the family whose
430
+ id prefixes the name (test toolchains named like the real ones),
431
+ else the name itself."""
432
+ base = base_name(name)
433
+ fam = self.family_of(base)
434
+ if fam is None:
435
+ fam = next((f for f in self.families.values()
436
+ if base.startswith(f.id)), None)
437
+ return fam.message_table if fam is not None else base
438
+
439
+ def label(self, name: str) -> str:
440
+ """The support-table column name: the catalog's label, a twin's
441
+ ``<base label> <arch>``."""
442
+ tc = self.toolchains[name]
443
+ if tc.label:
444
+ return tc.label
445
+ if tc.twin_of:
446
+ if self.twin_tag(name) == tc.arch:
447
+ return f"{self.label(tc.twin_of)} {tc.arch}"
448
+ from offload.engine.confirm.machines import load
449
+ return f"{self.label(tc.twin_of)} {load()[tc.machine].device.split()[-1]}"
450
+ return name
451
+
452
+ def headline(self) -> tuple[str, ...]:
453
+ """The toolchains that are neither a twin nor a regression release,
454
+ in catalog order (the site's toolchains)."""
455
+ return tuple(n for n, t in self.toolchains.items()
456
+ if t.twin_of is None and t.regression_of is None)
457
+
458
+ def site_toolchains(self) -> tuple[str, ...]:
459
+ """The toolchains the site has cells for: every one that is not an
460
+ arch twin (the site keys cells by machine)."""
461
+ return tuple(n for n, t in self.toolchains.items() if t.twin_of is None)
462
+
463
+ def of_arch(self, arch: str) -> tuple[str, ...]:
464
+ """The toolchains of `arch` that are neither twins on another machine of the arch
465
+ nor regression releases."""
466
+ return tuple(n for n, t in self.toolchains.items() if t.arch == arch
467
+ and t.regression_of is None
468
+ and not (t.twin_of and self.toolchains[t.twin_of].arch == arch))
469
+
470
+ def of_gpu(self, gpu: str) -> tuple[str, ...]:
471
+ """The report columns of the machines with GPUs of `gpu` (amd,
472
+ nvidia), twins and regression releases left out."""
473
+ return tuple(n for n, t in self.toolchains.items()
474
+ if self.arches[t.arch]["gpu"] == gpu and t.report_column
475
+ and t.twin_of is None and t.regression_of is None)
476
+
477
+ def of_family(self, fid: str) -> tuple[str, ...]:
478
+ return tuple(n for n, t in self.toolchains.items() if t.family_id == fid)
479
+
480
+ def of_machine(self, machine: str) -> tuple[str, ...]:
481
+ """The measured toolchains of a machine (a regression release is
482
+ not one): catalog/machines.yaml's former ``toolchains`` lists."""
483
+ return tuple(n for n, t in self.toolchains.items()
484
+ if t.machine == machine and t.regression_of is None)
485
+
486
+ def of_lane(self, lane: str) -> tuple[str, ...]:
487
+ return tuple(n for n, t in self.toolchains.items() if t.lane == lane)
488
+
489
+ def lanes(self) -> tuple[str, ...]:
490
+ return tuple(dict.fromkeys(t.lane for t in self.toolchains.values() if t.lane))
491
+
492
+ def lane_doc(self, lane: str) -> str:
493
+ """Which scripts run a lane (catalog ``lanes``); a lane the catalog
494
+ does not describe is refused by the check below."""
495
+ return self.lane_docs.get(lane, "")
496
+
497
+ def regression(self) -> dict[str, str]:
498
+ return {n: t.regression_of for n, t in self.toolchains.items()
499
+ if t.regression_of is not None}
500
+
501
+ def twins(self) -> dict[str, str]:
502
+ return {n: t.twin_of for n, t in self.toolchains.items() if t.twin_of}
503
+
504
+ def twins_of(self, name: str) -> tuple[str, ...]:
505
+ """The twins of `name`, in catalog order."""
506
+ return tuple(n for n, t in self.toolchains.items() if t.twin_of == name)
507
+
508
+ def base_of(self, name: str) -> str:
509
+ """The toolchain a twin is the twin of (a name the catalog does not
510
+ know: ``base_name``'s suffix rule)."""
511
+ t = self.toolchains.get(name)
512
+ if t is None:
513
+ return base_name(name)
514
+ return t.twin_of or name
515
+
516
+ def twin_key(self, name: str) -> str:
517
+ """What a twin's name adds to its base's ("_g90", "_mi300x"; "" for a
518
+ toolchain that is no twin)."""
519
+ t = self.toolchains[name]
520
+ return name[len(t.twin_of):] if t.twin_of else ""
521
+
522
+ def twin_tag(self, name: str) -> str:
523
+ """How the support tables name a twin's GPU: the arch for a twin named
524
+ with the arch's suffix (gfx90a), else its machine (mi300x)."""
525
+ t = self.toolchains[name]
526
+ suffix = self.arches[t.arch].get("twin_suffix")
527
+ return t.arch if suffix and self.twin_key(name) == suffix else t.machine
528
+
529
+ def machine_twins(self) -> frozenset:
530
+ """The twins named after their machine (afar_mi300x, gcc_mi350x): support-table cells
531
+ only, outside the evidence machines (MI300A, MI250X, the A100)."""
532
+ return frozenset(n for n, t in self.toolchains.items()
533
+ if t.twin_of and self.twin_tag(n) == t.machine)
534
+
535
+ def table_only(self) -> frozenset:
536
+ """The toolchains whose rows are support-table cells only, never
537
+ evidence (the confirmer, the expected values): the machine twins
538
+ and the toolchains of a family under test only (GCC)."""
539
+ return self.machine_twins() | frozenset(
540
+ n for n, t in self.toolchains.items() if t.family_id in self.under_test_only())
541
+
542
+ def twin(self, name: str, arch: str) -> str | None:
543
+ """The twin of `name` on `arch`, if the catalog has one."""
544
+ return next((n for n, t in self.toolchains.items()
545
+ if t.twin_of == name and t.arch == arch), None)
546
+
547
+ def merged(self) -> tuple[str, ...]:
548
+ """The headline toolchains with a key in the merged result tables."""
549
+ return tuple(n for n in self.headline() if self.toolchains[n].merged_key)
550
+
551
+ def in_merged(self, name: str) -> bool:
552
+ """Whether a toolchain's rows are in the merged result files: it,
553
+ or the toolchain it is the twin of, has a ``merged_key``."""
554
+ t = self.toolchains[name]
555
+ base = self.toolchains[t.twin_of] if t.twin_of else t
556
+ return bool(base.merged_key)
557
+
558
+ def under_test_only(self) -> dict[str, str]:
559
+ return {f.id: f.under_test_only for f in self.families.values()
560
+ if f.under_test_only}
561
+
562
+ def versions(self) -> dict[str, tuple[str, str, int]]:
563
+ """toolchain -> (family, site version label, release order within
564
+ the family) for the site's toolchains (offload.engine.site.matrix
565
+ VERSIONS): the order is the version's rank among the family's
566
+ distinct versions in catalog order."""
567
+ out = {}
568
+ seen: dict[str, list] = {}
569
+ for n in self.site_toolchains():
570
+ t = self.toolchains[n]
571
+ vs = seen.setdefault(t.family_id, [])
572
+ if t.version not in vs:
573
+ vs.append(t.version)
574
+ out[n] = (t.family_id, t.site_version, vs.index(t.version))
575
+ return out
576
+
577
+ def targets(self) -> dict[tuple[str, str], str]:
578
+ """(machine, mode row key as text) -> the site's target id
579
+ (catalog/machines.yaml ``modes.<mode>.target``), machines and
580
+ modes in file order."""
581
+ from offload.engine.confirm.machines import load
582
+ out = {}
583
+ for m in load().values():
584
+ for mode in m.modes:
585
+ t = m.mode_table[mode].get("target")
586
+ if t:
587
+ out[(m.name, str(m.row_key(mode)))] = t
588
+ return out
589
+
590
+ def run_targets(self, name: str) -> tuple[str, ...]:
591
+ """The site targets a toolchain and its twins were measured on (their
592
+ machines' modes; the catalog's ``site_targets`` where it has them): the
593
+ feature-support cells it can have, any other being n/a."""
594
+ if self.toolchains[name].site_targets:
595
+ return self.toolchains[name].site_targets
596
+ ran = {(t.machine, str(x)) for t in (self.toolchains[n] for n in (name, *self.twins_of(name)))
597
+ for x in t.xnack_modes}
598
+ return tuple(t for k, t in self.targets().items() if k in ran)
599
+
600
+ def target_kinds(self) -> dict[str, str]:
601
+ """target id -> GPU vendor kind of its machine."""
602
+ from offload.engine.confirm.machines import load
603
+ out = {}
604
+ for m in load().values():
605
+ for mode in m.modes:
606
+ t = m.mode_table[mode].get("target")
607
+ if t:
608
+ out[t] = self.arches[m.arch]["gpu"]
609
+ return out
610
+
611
+ def family_order(self) -> tuple[str, ...]:
612
+ """The site's family order (the first is the default family)."""
613
+ return tuple(self.site.get("family_order") or self.families)
614
+
615
+ def install_roots(self) -> tuple[str, ...]:
616
+ """Every install root a recipe may name, unique, in catalog order."""
617
+ return tuple(dict.fromkeys(r for t in self.toolchains.values()
618
+ for r in t.install_roots))
619
+
620
+ def arch_machines(self) -> dict[str, str]:
621
+ from offload.engine.confirm.machines import load
622
+ out: dict[str, str] = {}
623
+ for m in load().values():
624
+ out.setdefault(m.arch, m.name) # the first machine of an arch, when several share its ISA
625
+ return out
626
+
627
+
628
+ def load(path: Path | str | None = None, environ=None) -> Registry:
629
+ """The registry of `path` (default: the catalog, or the file
630
+ ``COMPLIANT_TOOLCHAINS`` names)."""
631
+ p = Path(path or os.environ.get(CATALOG_ENV) or CATALOG)
632
+ data = yaml.safe_load(p.read_text()) or {}
633
+ if p == CATALOG:
634
+ data = localcfg.overlay("toolchains.yaml", data)
635
+ return Registry(data, environ)
636
+
637
+
638
+ @lru_cache(maxsize=None)
639
+ def _registry(path: str) -> Registry:
640
+ return load(path)
641
+
642
+
643
+ def registry() -> Registry:
644
+ """The registry in use (cached per catalog path)."""
645
+ return _registry(str(os.environ.get(CATALOG_ENV) or CATALOG))
646
+
647
+
648
+ def reset() -> None:
649
+ """Forget the cached registry (tests that point COMPLIANT_TOOLCHAINS at
650
+ another catalog, then reload the consumer modules)."""
651
+ _registry.cache_clear()
652
+ import sys
653
+ fi = sys.modules.get("offload.engine.confirm.findings")
654
+ if fi is not None:
655
+ fi.front_end.cache_clear()
656
+
657
+
658
+ _R = registry()
659
+ TOOLCHAINS: dict[str, Toolchain] = dict(_R.toolchains)
660
+ # the device of each arch (``device_of``), the machine of each arch and the
661
+ # toolchain-name suffix of an arch's twin toolchains ("" for gfx942)
662
+ DEVICES = {a: d["device"] for a, d in _R.arches.items()}
663
+ MACHINES = _R.arch_machines()
664
+ ARCH_SUFFIX = {a: d["twin_suffix"] for a, d in _R.arches.items()
665
+ if "twin_suffix" in d}
666
+ DEVICE = DEVICES[next(iter(ARCH_SUFFIX))] # the target device of Tuolumne runs
667
+ # the gfx942 headline toolchains of the families that witness for each other
668
+ # (a family under test only, GCC, is left out: the fuzz, stress and widened
669
+ # campaigns' targets) and their gfx90a twins
670
+ GFX942_TOOLCHAINS = tuple(t for t in _R.of_arch("gfx942")
671
+ if _R.toolchains[t].family_id not in _R.under_test_only())
672
+ GFX90A_TOOLCHAINS = tuple(_R.twin(t, "gfx90a") for t in GFX942_TOOLCHAINS
673
+ if _R.twin(t, "gfx90a"))
674
+ # Toolchains measured only by regression mode (tools/confirm.py
675
+ # regress), each with the headline toolchain it is compared with. They are
676
+ # never headline columns and their rows go to results/confirm/regress/
677
+ REGRESSION_TOOLCHAINS = _R.regression()
678
+ GCC_TOOLCHAINS = _R.of_family("gcc")
679
+ # the toolchains of other machines than the AMD ones (support-table
680
+ # columns of their own; offload.engine.report): the NVIDIA machine's
681
+ NVIDIA_TOOLCHAINS = _R.of_gpu("nvidia")
682
+ # the install roots other modules name directly: AFAR's front end is the
683
+ # legality pre-check's (offload.engine.prerun), its /p/vast1 copy serves Tioga
684
+ AFAR_BIN = f"{TOOLCHAINS['afar'].install_root}/bin"
685
+ AFAR_VAST = TOOLCHAINS["afar_g90"].install_root
686
+ AFAR_BIN_G90 = f"{AFAR_VAST}/bin"
687
+ NVHPC_BIN = TOOLCHAINS["nvhpc"].install_root
688
+ NVHPC269_BIN = TOOLCHAINS["nvhpc269"].install_root
689
+ GCC_G90_ROOT = TOOLCHAINS["gcc_g90"].install_root
690
+ GCC_SM80_ROOT = TOOLCHAINS["gcc_sm80"].install_root
691
+ GCC_VERSION = TOOLCHAINS["gcc_sm80"].version
692
+ # C: the OpenMP C flags of the AMD recipe kinds on gfx942
693
+ # (offload.engine.run_matrix; tests)
694
+ C_FLAGS = {k: _R.family_of_kind(k).flags["omp"]["c"].format(arch="gfx942")
695
+ for k in ("afar", "cce")}
696
+
697
+
698
+ def install_roots() -> tuple[str, ...]:
699
+ """Every compiler install root of the catalog (paths to scrub from
700
+ recorded messages)."""
701
+ return registry().install_roots()
702
+
703
+
704
+ @lru_cache(maxsize=None)
705
+ def base_name(name: str) -> str:
706
+ """The toolchain a twin is the twin of (``cce21_g90``, ``afar_mi300x`` -> ``cce21``,
707
+ ``afar``); a name the catalog does not know loses an arch's twin suffix."""
708
+ tc = TOOLCHAINS.get(name)
709
+ if tc is not None:
710
+ return tc.twin_of or name
711
+ for suffix in ARCH_SUFFIX.values():
712
+ if suffix and name.endswith(suffix):
713
+ return name[:-len(suffix)]
714
+ return name
715
+
716
+
717
+ def arch_of(name: str) -> str:
718
+ """The arch of a registered toolchain (``TOOLCHAINS``). A name the registry does not know raises KeyError (it used to
719
+ default to gfx942, so an unregistered toolchain's rows were recorded
720
+ as MI300A rows)."""
721
+ tc = TOOLCHAINS.get(name)
722
+ if tc is not None:
723
+ return tc.arch
724
+ raise KeyError(f"unknown toolchain {name}: register it in "
725
+ "catalog/toolchains.yaml (docs/tooling/contributing.md, "
726
+ "\"Add a compiler\")")
727
+
728
+
729
+ def device_of(tc: Toolchain) -> str:
730
+ """The target device of a toolchain's runs."""
731
+ return DEVICES[tc.arch]
732
+
733
+
734
+ def parse_rocminfo(text: str) -> tuple[str, str]:
735
+ """(gfx name, marketing name) of the first GPU agent in rocminfo's
736
+ output; ("", "") if none."""
737
+ m = re.search(r"^\s*Name:\s+(gfx[0-9a-f]+)\s*$", text, re.M)
738
+ if m is None:
739
+ return "", ""
740
+ # the agent's marketing name follows its name, before the next agent
741
+ rest = text[m.end():]
742
+ nxt = re.search(r"^\s*Name:", rest, re.M)
743
+ mk = re.search(r"^\s*Marketing Name:\s+(\S.*?)\s*$",
744
+ rest[:nxt.start()] if nxt else rest, re.M)
745
+ return m.group(1), mk.group(1) if mk else ""
746
+
747
+
748
+ def gpu_count(text: str) -> int:
749
+ """The number of GPU agents in rocminfo's output (the devices a run
750
+ sees; ROCR_VISIBLE_DEVICES filters them)."""
751
+ return len(re.findall(r"^\s*Name:\s+gfx[0-9a-f]+\s*$", text, re.M))
752
+
753
+
754
+ def detect_gpu_count() -> int | None:
755
+ """GPU agents visible to this process per rocminfo (else the
756
+ NVIDIA GPUs per nvidia-smi, narrowed by CUDA_VISIBLE_DEVICES), None
757
+ without either."""
758
+ for exe in ["/opt/rocm/bin/rocminfo"] + sorted(
759
+ str(p) for p in Path("/opt").glob("rocm-*/bin/rocminfo"))[::-1]:
760
+ if Path(exe).is_file():
761
+ try:
762
+ res = subprocess.run([exe], capture_output=True, text=True,
763
+ timeout=60)
764
+ except (subprocess.SubprocessError, OSError):
765
+ continue
766
+ return gpu_count(res.stdout)
767
+ gpus = _nvidia_gpus()
768
+ if gpus is None:
769
+ return None
770
+ return len(visible_nvidia(gpus, os.environ.get("CUDA_VISIBLE_DEVICES")))
771
+
772
+
773
+ NVIDIA_SMI = "nvidia-smi"
774
+ _NV_QUERY = ["--query-gpu=index,uuid,compute_cap,name",
775
+ "--format=csv,noheader"]
776
+
777
+
778
+ def parse_nvidia_smi(text: str) -> list[tuple[str, str, str, str]]:
779
+ """(index, uuid, sm arch, name) per GPU of ``nvidia-smi
780
+ --query-gpu=index,uuid,compute_cap,name --format=csv,noheader``
781
+ : compute capability 8.0 is ``sm_80``."""
782
+ out = []
783
+ for line in text.splitlines():
784
+ parts = [x.strip() for x in line.split(",")]
785
+ if len(parts) < 4 or not re.fullmatch(r"\d+\.\d+", parts[2]):
786
+ continue
787
+ out.append((parts[0], parts[1], "sm_" + parts[2].replace(".", ""),
788
+ ", ".join(parts[3:])))
789
+ return out
790
+
791
+
792
+ def visible_nvidia(gpus: list, cuda_visible: str | None) -> list:
793
+ """The GPUs a CUDA process sees: CUDA_VISIBLE_DEVICES (indices or
794
+ UUIDs, in its order; nvidia-smi itself ignores it) narrows the list."""
795
+ if cuda_visible is None:
796
+ return list(gpus)
797
+ out = []
798
+ for tok in (t.strip() for t in cuda_visible.split(",")):
799
+ if not tok:
800
+ break
801
+ hit = [g for g in gpus if tok == g[0] or g[1].startswith(tok)]
802
+ if not hit: # CUDA stops at the first invalid entry
803
+ break
804
+ out.append(hit[0])
805
+ return out
806
+
807
+
808
+ def _nvidia_gpus() -> list | None:
809
+ try:
810
+ res = subprocess.run([NVIDIA_SMI, *_NV_QUERY], capture_output=True,
811
+ text=True, timeout=60)
812
+ except (subprocess.SubprocessError, OSError):
813
+ return None
814
+ if res.returncode != 0:
815
+ return None
816
+ return parse_nvidia_smi(res.stdout)
817
+
818
+
819
+ def detect_gpu() -> tuple[str, str]:
820
+ """(gfx name, marketing name) of this node's first GPU per rocminfo
821
+ (recorded in every result row); without rocminfo,
822
+ (sm arch, name) of the first visible NVIDIA GPU per nvidia-smi; ("",
823
+ "") without a GPU or either tool. Cached."""
824
+ if _GPU:
825
+ return _GPU[0]
826
+ found = ("", "")
827
+ cands = ["/opt/rocm/bin/rocminfo"] + sorted(
828
+ str(p) for p in Path("/opt").glob("rocm-*/bin/rocminfo"))[::-1]
829
+ for exe in cands:
830
+ if not Path(exe).is_file():
831
+ continue
832
+ try:
833
+ res = subprocess.run([exe], capture_output=True, text=True,
834
+ timeout=60)
835
+ except (subprocess.SubprocessError, OSError):
836
+ continue
837
+ found = parse_rocminfo(res.stdout)
838
+ if found[0]:
839
+ break
840
+ if not found[0]: # An NVIDIA node (nvidia-smi)
841
+ vis = visible_nvidia(_nvidia_gpus() or [],
842
+ os.environ.get("CUDA_VISIBLE_DEVICES"))
843
+ if vis:
844
+ found = (vis[0][2], vis[0][3])
845
+ _GPU.append(found)
846
+ return found
847
+
848
+
849
+ _GPU: list[tuple[str, str]] = []
850
+
851
+ _TRIPLE = re.compile(rb"amdgcn-amd-amdhsa--gfx[0-9a-f]+(?::[a-z]+[+-])*")
852
+
853
+
854
+ def code_object_targets(data: bytes) -> list[str]:
855
+ """The AMDGPU code-object target ids (``amdgcn-amd-amdhsa--gfx90a``,
856
+ with ``:xnack-``/``:xnack+`` when the code object is not "xnack any")
857
+ named in an executable's bytes, sorted and unique (run
858
+ metadata; AFAR's packaged images are read with llvm-objdump
859
+ --offloading instead)."""
860
+ return sorted({m.decode() for m in _TRIPLE.findall(data)})
861
+
862
+
863
+ # GCC's offload image for AMD is an AMDGPU ELF code object embedded in the
864
+ # host executable; its e_flags name the GPU (EF_AMDGPU_MACH, the low byte;
865
+ # gcc/config/gcn/gcn-devices.def) and the xnack setting (code object v4+:
866
+ # 0x100 any, 0x200 off, 0x300 on)
867
+ _GCN_MACH = {0x30: "gfx908", 0x3f: "gfx90a", 0x4c: "gfx942", 0x4f: "gfx950"}
868
+ _EM_AMDGPU = 224
869
+
870
+
871
+ def gcn_targets(data: bytes) -> list[str]:
872
+ """The target ids (``amdgcn-amd-amdhsa--gfx90a``, ``:xnack-``/
873
+ ``:xnack+`` when not "any") of the AMDGPU ELF code objects embedded in
874
+ an executable's bytes (GCC's offload images), sorted and unique."""
875
+ import struct
876
+ out = set()
877
+ i = data.find(b"\x7fELF")
878
+ while i >= 0:
879
+ if len(data) >= i + 52 and data[i + 4] == 2 and data[i + 5] == 1:
880
+ machine, = struct.unpack_from("<H", data, i + 18)
881
+ flags, = struct.unpack_from("<I", data, i + 48)
882
+ if machine == _EM_AMDGPU:
883
+ mach = _GCN_MACH.get(flags & 0xff, f"mach{flags & 0xff:#x}")
884
+ xn = {0x200: ":xnack-", 0x300: ":xnack+"}.get(
885
+ flags & 0x300, "")
886
+ out.add(f"amdgcn-amd-amdhsa--{mach}{xn}")
887
+ i = data.find(b"\x7fELF", i + 1)
888
+ return sorted(out)
889
+
890
+
891
+ def parse_nvhpc_cuda(dryrun: str) -> str:
892
+ """The CUDA version an NVHPC compile uses, from its -dryrun output
893
+ (the bundled toolkit path ``.../cuda/<X.Y>/...``); "" if none."""
894
+ found = re.findall(r"/cuda/(\d+\.\d+)\b", dryrun)
895
+ return found[0] if found else ""
896
+
897
+
898
+ def nvhpc_cuda(tc, workdir) -> str:
899
+ """The default CUDA of an NVHPC toolchain (recorded
900
+ in the toolchain metadata), from -dryrun of the smoke program."""
901
+ res = subprocess.run(["bash", "-c", tc.compile_cmd(
902
+ str(_DEV_F90), str(Path(workdir) / "dryrun.out")).replace(
903
+ " -o ", " -dryrun -o ", 1)], capture_output=True, text=True,
904
+ timeout=300, cwd=workdir)
905
+ return parse_nvhpc_cuda(res.stdout + res.stderr)
906
+
907
+
908
+ _SM = re.compile(rb"\bsm_[0-9]{2,3}[af]?\b")
909
+
910
+
911
+ def nvidia_targets(data: bytes) -> list[str]:
912
+ """The sm_NN arches named in an NVHPC executable's embedded
913
+ device images, sorted and unique."""
914
+ return sorted({m.decode() for m in _SM.findall(data)})
915
+
916
+
917
+ def loaded_rocm_version(tc: Toolchain) -> str | None:
918
+ """ROCm version the toolchain's prelude loads, or None if it loads none."""
919
+ if not any(t == "rocm" or t.startswith("rocm/")
920
+ for t in tc.prelude.split()):
921
+ return None
922
+ res = subprocess.run(
923
+ ["bash", "-c", f'{{ {tc.prelude}\n}} >/dev/null 2>&1 && echo "$ROCM_PATH"'],
924
+ capture_output=True, text=True, check=True)
925
+ m = re.search(r"rocm-(\d+\.\d+(?:\.\d+)?)", res.stdout)
926
+ return m.group(1) if m else None
927
+
928
+
929
+ def compiler_version(tc: Toolchain) -> str:
930
+ """The compiler's version banner (its first line, plus CCE's target line
931
+ when there is one), run through the toolchain's prelude; "" if the
932
+ compiler cannot be run. C toolchains report the C compiler's
933
+ banner ("AMD clang version ...", "Cray clang version ...")."""
934
+ key = tc.name if tc.lang != "c" else f"{tc.name}:c"
935
+ cached = _VERSIONS.get(key)
936
+ if cached is not None:
937
+ return cached
938
+ try:
939
+ res = subprocess.run(
940
+ ["bash", "-c", f"{{ {tc.prelude or 'true'}\n}} >/dev/null 2>&1; "
941
+ f"{tc.compiler()} --version 2>&1"],
942
+ capture_output=True, text=True, timeout=120)
943
+ lines = [ln.strip() for ln in res.stdout.splitlines()
944
+ if ln.strip().startswith(("AMD flang", "Cray Fortran",
945
+ "AMD clang", "Cray clang",
946
+ "nvfortran ", "nvc ",
947
+ "GNU Fortran (GCC)",
948
+ "gcc (GCC)"))]
949
+ out = " | ".join(lines)
950
+ except (subprocess.SubprocessError, OSError):
951
+ out = ""
952
+ _VERSIONS[key] = out
953
+ return out
954
+
955
+
956
+ _VERSIONS: dict[str, str] = {}
957
+
958
+
959
+ def parse_module_list(text: str) -> list[str]:
960
+ """The module names of ``module -t list`` output."""
961
+ return [ln.strip() for ln in text.splitlines()
962
+ if ln.strip() and not ln.rstrip().endswith(":")
963
+ and " " not in ln.strip()]
964
+
965
+
966
+ _DEV_F90 = ROOT / "tests" / "data" / "dev.f90"
967
+
968
+
969
+ def toolchain_meta(tc: Toolchain, workdir: Path) -> dict:
970
+ """Run metadata of a toolchain: its machine, arch and device,
971
+ the modules its prelude leaves loaded (``module -t list``) and the
972
+ code-object target ids of a compiled smoke program (tests/data/dev.f90;
973
+ AFAR's offload images through its llvm-objdump --offloading, CCE's
974
+ triples from the executable's bytes). The compilers' default code
975
+ objects are "xnack any": no ``:xnack`` feature in the id."""
976
+ import dataclasses
977
+ workdir = Path(workdir)
978
+ workdir.mkdir(parents=True, exist_ok=True)
979
+ out: dict = {"name": tc.name, "machine": tc.machine, "arch": tc.arch,
980
+ "device": device_of(tc), "modules": [], "code_object": []}
981
+ if "module " in tc.prelude:
982
+ res = subprocess.run(
983
+ ["bash", "-c", f"{{ {tc.prelude}\n}} >/dev/null 2>&1; "
984
+ "module -t list 2>&1"],
985
+ capture_output=True, text=True, timeout=120)
986
+ out["modules"] = parse_module_list(res.stdout)
987
+ f = dataclasses.replace(tc, lang="f90", model="omp")
988
+ if f.compile_time_modes(): # Built for its headline mode
989
+ m = f._machine()
990
+ f = f.for_mode(m.row_key(m.headline_mode))
991
+ exe = workdir / f"{tc.name}.meta.out"
992
+ res = subprocess.run(["bash", "-c", f.compile_cmd(str(_DEV_F90),
993
+ str(exe))],
994
+ capture_output=True, text=True, timeout=600,
995
+ cwd=workdir)
996
+ if res.returncode != 0 or not exe.is_file():
997
+ out["code_object_error"] = (res.stdout + res.stderr)[-400:]
998
+ return out
999
+ found = code_object_targets(exe.read_bytes())
1000
+ if tc.kind == "gcc" and tc.arch.startswith("gfx"): # embedded ELF
1001
+ found = gcn_targets(exe.read_bytes())
1002
+ if tc.kind == "nvhpc" or tc.arch.startswith("sm_"): # The
1003
+ found = nvidia_targets(exe.read_bytes()) # embedded images' arch
1004
+ objdump = Path(tc.fc).parent.parent / "lib" / "llvm" / "bin" / \
1005
+ "llvm-objdump"
1006
+ if tc.base == "afar" and objdump.is_file():
1007
+ r = subprocess.run([str(objdump), "--offloading", str(exe)],
1008
+ capture_output=True, text=True, timeout=120)
1009
+ arches = re.findall(r"^arch\s+(\S+)", r.stdout, re.M)
1010
+ triples = re.findall(r"^triple\s+(\S+)", r.stdout, re.M)
1011
+ found += [f"{t} {a}" for t, a in zip(triples, arches)]
1012
+ out["code_object"] = found
1013
+ if tc.kind == "nvhpc": # The CUDA the compiler picks
1014
+ out["cuda"] = nvhpc_cuda(f, workdir)
1015
+ # The runtime the runs load (LD_LIBRARY_PATH)
1016
+ out["runtime_libs"] = dict(tc.env).get("LD_LIBRARY_PATH", "")
1017
+ if tc.kind == "gcc": # the release's runtime (and ROCm's HSA)
1018
+ out["runtime_libs"] = dict(tc.env).get("LD_LIBRARY_PATH", "")
1019
+ return out
1020
+
1021
+
1022
+
1023
+ def family(name: str) -> str:
1024
+ """The message-table key of a toolchain (catalog/toolchains.yaml
1025
+ ``families.<f>.message_table``): every CCE release shares the tables
1026
+ captured from CCE 19."""
1027
+ return registry().message_table(name)
1028
+
1029
+
1030
+ def check_registry(reg: Registry | None = None) -> list[str]:
1031
+ """The toolchain registry against the machines
1032
+ (catalog/machines.yaml), the support-table columns (offload.engine.report)
1033
+ and the canaries (catalog/canaries.yaml). Returns the problems (empty
1034
+ when consistent); a new toolchain fails here until every place that
1035
+ must know it does."""
1036
+ from offload.engine.confirm.machines import load
1037
+ from offload.engine import canary
1038
+ reg = reg or registry()
1039
+ machines = load()
1040
+ twins = {w for t in reg.of_arch("gfx942") for w in reg.twins_of(t)}
1041
+ columns = set(reg.of_arch("gfx942")) | twins | set(reg.of_gpu("nvidia")) | \
1042
+ {n for n, t in reg.toolchains.items() if not t.report_column}
1043
+ canaries = set((canary.load().get("toolchains") or {}))
1044
+ out = []
1045
+ for name, tc in reg.toolchains.items():
1046
+ m = machines.get(tc.machine)
1047
+ if m is None:
1048
+ out.append(f"{name}: machine {tc.machine} is not in "
1049
+ "catalog/machines.yaml")
1050
+ elif m.arch != tc.arch:
1051
+ out.append(f"{name}: arch {tc.arch}, machine {m.name} is "
1052
+ f"{m.arch}")
1053
+ if tc.canaries not in canaries:
1054
+ out.append(f"{name}: no canaries in catalog/canaries.yaml "
1055
+ f"(entry {tc.canaries}: the five kinds, measured)")
1056
+ if not tc.lane:
1057
+ out.append(f"{name}: no lane (which run scripts run it)")
1058
+ if name in reg.regression():
1059
+ continue
1060
+ if m is not None and name not in m.toolchains:
1061
+ out.append(f"{name}: not in machines.yaml {m.name} toolchains")
1062
+ if name not in columns:
1063
+ out.append(f"{name}: not a support-table column "
1064
+ "(offload.engine.report.ALL_TOOLCHAINS)")
1065
+ for m in machines.values():
1066
+ for name in m.toolchains:
1067
+ if name not in reg.toolchains:
1068
+ out.append(f"machines.yaml {m.name}: toolchain {name} is "
1069
+ "not registered")
1070
+ return out