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,1049 @@
1
+ """Delta-debugging minimizer for fuzz failures.
2
+
3
+ ``minimize(source, failure)`` shrinks a program while ``failure`` (a
4
+ ``Failure``: toolchain, kind, signature) persists and the program stays legal:
5
+ every candidate must pass ``offload.engine.fuzz.check`` before it is compiled.
6
+ Only the lines between ``! fuzz: kernels`` and ``! fuzz: checksum`` change,
7
+ so no variable is read uninitialised; a final cleanup removes declarations no
8
+ kernel line names. Transformations are tried coarse to fine and a batch of
9
+ candidates runs in parallel: delete a block, drop a nest level, delete a
10
+ statement, a clause or a list item, replace a right-hand side by an operand.
11
+ ``file_candidates`` also removes unused functions and files of a bundle.
12
+ The predicate runs twice (``Oracle``) before a candidate is accepted. A
13
+ wrong-code or run-error candidate must also run without signed overflow
14
+ (``overflow_trap``) and use a reference from another compiler family
15
+ (``trusted_refs``)."""
16
+ from __future__ import annotations
17
+
18
+ import hashlib
19
+ import re
20
+ import shutil
21
+ import tempfile
22
+ from dataclasses import dataclass, field
23
+ from pathlib import Path
24
+
25
+ from offload.engine import fuzz_exec as fe
26
+ from offload.engine import reduce as RD
27
+ from offload.engine.fuzz import check, directive_valid, wrap_directive, wrap_stmt
28
+ from offload.engine.fuzz_base import FILE_MARK
29
+ from offload.engine.toolchains import TOOLCHAINS, family
30
+
31
+ # the generator's range bounds (offload.engine.fuzz): kept by step 5
32
+ BOUNDS = ("mod", "iand")
33
+ # the reference that is no toolchain: sequential elision
34
+ # (offload.engine.expected.elision_evidence)
35
+ ELISION_REF = "elision"
36
+
37
+ MARK_BEGIN = "! fuzz: kernels"
38
+ MARK_END = "! fuzz: checksum"
39
+
40
+
41
+ # --- logical lines ------------------------------------------------------------------
42
+
43
+ def join_lines(source: str) -> list[str]:
44
+ """Logical lines: a directive continued with `!$omp&` and a statement
45
+ continued with a leading `&` become one line each."""
46
+ out: list[str] = []
47
+ raw = source.splitlines()
48
+ k = 0
49
+ while k < len(raw):
50
+ line = raw[k].rstrip()
51
+ while line.endswith("&") and k + 1 < len(raw):
52
+ k += 1
53
+ nxt = raw[k].strip()
54
+ if nxt.lower().startswith("!$omp&"):
55
+ nxt = nxt[6:].strip()
56
+ elif nxt.startswith("&"):
57
+ nxt = nxt[1:].strip()
58
+ line = line[:-1].rstrip() + " " + nxt
59
+ out.append(line)
60
+ k += 1
61
+ return out
62
+
63
+
64
+ def split_directive(text: str) -> tuple[str, list[str]]:
65
+ """(directive name, clauses) of `!$omp name clause clause ...` (the
66
+ name is the longest prefix of words that is a skeleton directive)."""
67
+ body = re.sub(r"^\s*!\$omp\s+", "", text, flags=re.I)
68
+ toks, depth, cur = [], 0, ""
69
+ for ch in body:
70
+ if ch == " " and depth == 0:
71
+ if cur:
72
+ toks.append(cur)
73
+ cur = ""
74
+ continue
75
+ depth += {"(": 1, ")": -1}.get(ch, 0)
76
+ cur += ch
77
+ if cur:
78
+ toks.append(cur)
79
+ words = []
80
+ for t in toks:
81
+ if "(" in t:
82
+ break
83
+ words.append(t)
84
+ start = 1 if words[:1] == ["end"] else 0
85
+ n = len(words)
86
+ while n > start + 1 and not directive_valid(" ".join(words[start:n])):
87
+ n -= 1
88
+ return " ".join(toks[:n]), toks[n:]
89
+
90
+
91
+ def render(lines: list[str]) -> str:
92
+ out: list[str] = []
93
+ for line in lines:
94
+ ind = re.match(r"\s*", line).group()
95
+ s = line.strip()
96
+ if len(line) <= 100:
97
+ out.append(line)
98
+ elif s.lower().startswith("!$omp"):
99
+ name, cl = split_directive(s)
100
+ out += wrap_directive(ind, name, cl)
101
+ elif s.startswith("!"):
102
+ out.append(line)
103
+ else:
104
+ out += wrap_stmt(ind, s)
105
+ return "\n".join(out) + "\n"
106
+
107
+
108
+ def region(lines: list[str]) -> tuple[int, int]:
109
+ b = next(k for k, ln in enumerate(lines) if ln.strip() == MARK_BEGIN)
110
+ e = next(k for k, ln in enumerate(lines) if ln.strip() == MARK_END)
111
+ return b + 1, e
112
+
113
+
114
+ def indent(line: str) -> int:
115
+ return len(line) - len(line.lstrip())
116
+
117
+
118
+ def is_dir(line: str) -> bool:
119
+ return line.strip().lower().startswith("!$omp")
120
+
121
+
122
+ LOOP_END = ("do", "simd", "loop", "distribute")
123
+ STANDALONE = ("target update", "target enter data", "target exit data",
124
+ "taskwait", "barrier")
125
+
126
+
127
+ def block_end(lines: list[str], k: int, hi: int) -> int | None:
128
+ """Index of the last line of the construct/block starting at line k
129
+ (inclusive), or None if line k does not start one."""
130
+ s = lines[k].strip().lower()
131
+ ind = indent(lines[k])
132
+ if is_dir(lines[k]):
133
+ name, _ = split_directive(s)
134
+ if name.startswith("end") or name in STANDALONE or \
135
+ name == "declare target":
136
+ return k if name in STANDALONE else None
137
+ if name == "atomic" or name.startswith("atomic"):
138
+ return k + 1
139
+ last = name.split()[-1]
140
+ if last in LOOP_END and k + 1 < hi and \
141
+ lines[k + 1].strip().lower().startswith("do "):
142
+ e = block_end(lines, k + 1, hi)
143
+ if e is None:
144
+ return None
145
+ if e + 1 < hi and indent(lines[e + 1]) == ind and \
146
+ lines[e + 1].strip().lower().startswith(
147
+ f"!$omp end {name}"):
148
+ e += 1
149
+ return e
150
+ for j in range(k + 1, hi):
151
+ t = lines[j].strip().lower()
152
+ if indent(lines[j]) == ind and t.startswith(f"!$omp end {name}") \
153
+ and split_directive(t)[0] in (f"end {name}",):
154
+ return j
155
+ if indent(lines[j]) < ind:
156
+ return None
157
+ return None
158
+ if re.match(r"do\b", s) or re.match(r"if\s*\(.*\)\s*then$", s) or \
159
+ s == "block":
160
+ closer = {"d": "end do", "i": "end if", "b": "end block"}[s[0]]
161
+ for j in range(k + 1, hi):
162
+ if indent(lines[j]) == ind and lines[j].strip().lower() == closer:
163
+ return j
164
+ if indent(lines[j]) < ind:
165
+ return None
166
+ return None
167
+
168
+
169
+ def directive_name(line: str) -> str:
170
+ return split_directive(line.strip())[0]
171
+
172
+
173
+ # --- candidates -----------------------------------------------------------------------
174
+
175
+ @dataclass(frozen=True)
176
+ class Cand:
177
+ what: str
178
+ lines: tuple
179
+
180
+
181
+ def _readers(lines, lo, hi, name: str, skip: int) -> bool:
182
+ """Some line of lo..hi other than `skip` names `name`."""
183
+ pat = re.compile(rf"\b{re.escape(name)}\b", re.I)
184
+ return any(pat.search(lines[j]) for j in range(lo, hi) if j != skip)
185
+
186
+
187
+ def _initialised(lines: list[str], name: str) -> bool:
188
+ lo, _ = region(lines)
189
+ pat = re.compile(rf"^\s*{re.escape(name)}\s*=", re.I)
190
+ return any(pat.match(ln) for ln in lines[:lo])
191
+
192
+
193
+ def procedure_regions(lines: list[str]) -> list[tuple[int, int]]:
194
+ """(lo, hi) of the executable part of each internal subroutine kp<k>
195
+ holding a kernel (stage 3): after its declarations, before
196
+ its end."""
197
+ out = []
198
+ for k, ln in enumerate(lines):
199
+ m = re.match(r"^\s*subroutine (kp\d+)\(", ln)
200
+ if not m:
201
+ continue
202
+ end = next((j for j in range(k + 1, len(lines)) if re.match(
203
+ rf"^\s*end subroutine {m.group(1)}\s*$", lines[j])), None)
204
+ if end is None:
205
+ continue
206
+ lo = k + 1
207
+ while lo < end and ("::" in lines[lo] or not lines[lo].strip()):
208
+ lo += 1
209
+ out.append((lo, end))
210
+ return out
211
+
212
+
213
+ def all_regions(lines: list[str]) -> list[tuple[int, int]]:
214
+ return [region(lines)] + procedure_regions(lines)
215
+
216
+
217
+ def candidates(lines: list[str], span=None) -> list[Cand]:
218
+ """Candidates in the kernels region and in every kernel procedure
219
+ (`span`: one of them)."""
220
+ if span is None:
221
+ return [c for sp in all_regions(lines)
222
+ for c in candidates(lines, sp)]
223
+ lo, hi = span
224
+ out: list[Cand] = []
225
+ L = list(lines)
226
+ text = "\n".join("\n".join(L[a:b])
227
+ for a, b in all_regions(L)).lower()
228
+ has_nowait = "nowait" in text
229
+ # a present modifier (or defaultmap(present)) needs the data region
230
+ # that maps its item: the data constructs stay while one is left (the
231
+ # host references would not see the runtime error termination)
232
+ has_present = re.search(r"\bpresent\b", text) is not None
233
+ data_dirs = ("target data", "target enter data")
234
+
235
+ def put(what, new):
236
+ out.append(Cand(what, tuple(new)))
237
+ # 1. blocks, coarsest (outermost) first
238
+ blocks = []
239
+ for k in range(lo, hi):
240
+ e = block_end(L, k, hi)
241
+ if e is not None:
242
+ blocks.append((k, e))
243
+ for k, e in sorted(blocks, key=lambda b: (b[0] - b[1], b[0])):
244
+ s = L[k].strip().lower()
245
+ if is_dir(L[k]) and directive_name(L[k]) in ("taskwait", "barrier") \
246
+ and has_nowait:
247
+ continue
248
+ if is_dir(L[k]) and has_present and \
249
+ directive_name(L[k]) in data_dirs:
250
+ continue
251
+ if s.startswith("do ") and k > lo and is_dir(L[k - 1]) and \
252
+ block_end(L, k - 1, hi) is not None:
253
+ continue # the loop of a loop construct goes with it
254
+ put(f"delete lines {k + 1}-{e + 1}: {s[:60]}", L[:k] + L[e + 1:])
255
+ # 2. nest levels
256
+ for k, e in blocks:
257
+ if not is_dir(L[k]):
258
+ continue
259
+ name = directive_name(L[k])
260
+ body_has_end = L[e].strip().lower().startswith("!$omp end")
261
+ inner = L[k + 1:e if body_has_end else e + 1]
262
+ inner_text = "\n".join(inner).lower()
263
+ unwrap = False
264
+ if (name == "target data" and not has_present) or (
265
+ name == "taskgroup" and
266
+ "task_reduction" not in L[k].lower()):
267
+ unwrap = True
268
+ elif name == "simd" or name.startswith("parallel do") or \
269
+ name == "parallel loop":
270
+ unwrap = True
271
+ elif name == "parallel" and not re.search(
272
+ r"!\$omp\s+(do|loop|single|masked|barrier|critical|"
273
+ r"end do)", inner_text):
274
+ unwrap = True
275
+ if unwrap:
276
+ put(f"unwrap {name} at {k + 1}",
277
+ L[:k] + L[k + 1:e] + L[e + 1:] if body_has_end
278
+ else L[:k] + L[k + 1:])
279
+ leaves = [] if name in STANDALONE else name.split()
280
+ for cut in range(len(leaves) - 1, 0, -1):
281
+ new = " ".join(leaves[:cut])
282
+ if leaves[cut - 1] not in ("target", "distribute", "do") or \
283
+ not directive_valid(new):
284
+ continue
285
+ nl = list(L)
286
+ _, cl = split_directive(L[k])
287
+ ind = re.match(r"\s*", L[k]).group()
288
+ nl[k] = f"{ind}!$omp {new}" + ("".join(" " + c for c in cl))
289
+ if body_has_end:
290
+ nl[e] = re.sub(rf"!\$omp end {re.escape(name)}",
291
+ f"!$omp end {new}", L[e], flags=re.I)
292
+ elif leaves[cut - 1] == "target":
293
+ # a block construct needs its end directive
294
+ nl.insert(e + 1, f"{ind}!$omp end {new}")
295
+ put(f"rename {name} -> {new} at {k + 1}", nl)
296
+ # 3. statements
297
+ for k in range(lo, hi):
298
+ s = L[k].strip()
299
+ if not s or s.startswith("!") or block_end(L, k, hi) is not None:
300
+ continue
301
+ low = s.lower()
302
+ if low in ("end do", "end if", "end block", "else") or \
303
+ low.startswith(("do ", "block")):
304
+ continue
305
+ if k > lo and L[k - 1].strip().lower().startswith("!$omp atomic"):
306
+ continue
307
+ m = re.match(r"(?:if\s*\(.*\)\s*)?([a-z]\w*)\s*=", low)
308
+ if m and not _initialised(L, m.group(1)) and \
309
+ _readers(L, lo, hi, m.group(1), k):
310
+ continue
311
+ put(f"delete statement {k + 1}: {s[:60]}", L[:k] + L[k + 1:])
312
+ # 4. clauses
313
+ ptr_comps = _pointer_components(L)
314
+ for k in range(lo, hi):
315
+ if not is_dir(L[k]):
316
+ continue
317
+ name, cl = split_directive(L[k])
318
+ if has_present and name in data_dirs:
319
+ continue
320
+ e = block_end(L, k, hi) or k
321
+ body = L[k + 1:e + 1]
322
+ nowait = any(c == "nowait" for c in cl)
323
+ ind = re.match(r"\s*", L[k]).group()
324
+ assigned = _assigned_scalars(L, body)
325
+ for ci, c in enumerate(cl):
326
+ # a pointer component keeps its explicit map: through the
327
+ # structure's default mapper its association is undefined
328
+ # (5.2 §5.8.3; offload.engine.fuzz_base, stage 3)
329
+ if c.lower().startswith("map(") and any(
330
+ re.search(rf"%{pc}\b", c, re.I) for pc in ptr_comps):
331
+ continue
332
+ # a structure element keeps its map: 5.2 §13.8 needs every
333
+ # referenced element of a structure with a mapped element
334
+ # mapped too
335
+ if c.lower().startswith("map(") and "%" in c:
336
+ continue
337
+ word = re.match(r"\w+", c).group().lower() if re.match(
338
+ r"\w+", c) else c
339
+ items = _items(c)
340
+ # a scalar the construct assigns keeps its map (and a scalar
341
+ # defaultmap): unmapped it would become firstprivate, and the
342
+ # hosts disagree about firstprivate in host fallback
343
+ if word == "map" and set(items) & assigned:
344
+ if len(items) > 1:
345
+ for it in items:
346
+ if it in assigned:
347
+ continue
348
+ nc = _drop_item(c, it)
349
+ nl = list(L)
350
+ nl[k] = f"{ind}!$omp {name}" + "".join(
351
+ " " + (nc if x is c else x) for x in cl)
352
+ put(f"drop {it} from {c} at {k + 1}", nl)
353
+ continue
354
+ if word == "defaultmap" and assigned and re.search(
355
+ r":\s*(scalar|all)\)", c):
356
+ continue
357
+ if word in ("reduction", "lastprivate", "private",
358
+ "in_reduction", "task_reduction"):
359
+ if any(_readers(body, 0, len(body), it, -1)
360
+ for it in items if it not in ("i", "j")):
361
+ continue
362
+ if word == "depend" and nowait:
363
+ continue
364
+ if word == "map":
365
+ m = re.match(r"map\(([^:()]*):(.*)\)$", c)
366
+ mods = [x.strip() for x in m.group(1).split(",")] if m \
367
+ else []
368
+ for mod in mods[:-1]: # the last one is the map type
369
+ rest_mods = [x for x in mods if x != mod]
370
+ nc = f"map({', '.join(rest_mods)}:{m.group(2)})"
371
+ nl = list(L)
372
+ nl[k] = f"{ind}!$omp {name}" + "".join(
373
+ " " + (nc if x is c else x) for x in cl)
374
+ put(f"drop modifier {mod} from {c} at {k + 1}", nl)
375
+ if word == "nowait" and name.startswith("end"):
376
+ pass
377
+ rest = cl[:ci] + cl[ci + 1:]
378
+ nl = list(L)
379
+ nl[k] = f"{ind}!$omp {name}" + "".join(" " + x for x in rest)
380
+ put(f"delete clause {c} at {k + 1}", nl)
381
+ if len(items) > 1 and word in ("map", "shared", "firstprivate",
382
+ "private", "depend"):
383
+ for it in items:
384
+ if word == "private" and it not in ("i", "j") and \
385
+ _readers(body, 0, len(body), it, -1):
386
+ continue
387
+ nc = _drop_item(c, it)
388
+ nl = list(L)
389
+ nl[k] = f"{ind}!$omp {name}" + "".join(
390
+ " " + (nc if x is c else x) for x in cl)
391
+ put(f"drop {it} from {c} at {k + 1}", nl)
392
+ # 5. expressions
393
+ for k in range(lo, hi):
394
+ s = L[k].strip()
395
+ if s.startswith("!") or s.lower().startswith(("do ", "end", "if (")
396
+ ) and "=" not in s:
397
+ continue
398
+ parts = split_assignment(s)
399
+ if parts is None:
400
+ continue
401
+ lhs, rhs = parts
402
+ if "omp_is_initial_device" in rhs:
403
+ continue
404
+ name = re.match(r"[a-z]\w*", lhs.split(")")[-1].strip() or lhs,
405
+ re.I)
406
+ target = re.search(r"([a-z]\w*)\s*(\(.*\))?\s*=\s*$", lhs, re.I)
407
+ var = target.group(1) if target else None
408
+ upd = _update_form(var, rhs) if var and not target.group(2) \
409
+ else None
410
+ if var and upd is None and re.search(rf"\b{var}\b", rhs):
411
+ continue # an update of another shape: leave it
412
+ if upd is not None:
413
+ # an update (v = v op e, v = op(v, e)) stays an update with the
414
+ # same operator, so its order independence is kept
415
+ head, operand, tail = upd
416
+ subs = [head + x + tail for x in _operands(operand)
417
+ if x != operand]
418
+ else:
419
+ subs = [x for x in _operands(rhs) if x != rhs]
420
+ for sub in subs:
421
+ nl = list(L)
422
+ nl[k] = re.match(r"\s*", L[k]).group() + lhs + sub
423
+ put(f"simplify {k + 1}: {sub[:50]}", nl)
424
+ return out
425
+
426
+
427
+ def split_assignment(s: str) -> tuple[str, str] | None:
428
+ """(everything up to and including "= ", the right-hand side) of an
429
+ assignment statement, optionally guarded by a one-line `if (...)`."""
430
+ k = 0
431
+ if re.match(r"if\s*\(", s, re.I):
432
+ depth, k = 0, s.index("(")
433
+ while k < len(s):
434
+ depth += {"(": 1, ")": -1}.get(s[k], 0)
435
+ k += 1
436
+ if depth == 0:
437
+ break
438
+ m = re.match(r"\s*[a-z]\w*(\s*\([^=]*\))?\s*=\s*", s[k:], re.I)
439
+ if not m or s[k + m.end():].startswith("="):
440
+ return None
441
+ return s[:k + m.end()], s[k + m.end():]
442
+
443
+
444
+ def _update_form(var: str, rhs: str):
445
+ """(head, operand, tail) when `rhs` is `var op operand` or
446
+ `op(var, operand)` (the generator's reduction updates), else None."""
447
+ m = re.match(rf"{re.escape(var)} ([+*]) (.*)$", rhs)
448
+ if m:
449
+ return f"{var} {m.group(1)} ", m.group(2), ""
450
+ m = re.match(rf"(max|min|iand|ior|ieor)\({re.escape(var)}, (.*)\)$",
451
+ rhs)
452
+ if m and _balanced(m.group(2)):
453
+ return f"{m.group(1)}({var}, ", m.group(2), ")"
454
+ return None
455
+
456
+
457
+ def _pointer_components(lines: list[str]) -> set[str]:
458
+ """Names of the POINTER components of the derived types defined in
459
+ the program."""
460
+ out, in_type = set(), False
461
+ for ln in lines:
462
+ t = ln.strip().lower()
463
+ if re.match(r"type\s*::\s*\w+$", t):
464
+ in_type = True
465
+ elif t.startswith("end type"):
466
+ in_type = False
467
+ elif in_type and "pointer" in t.split("::")[0] and "::" in t:
468
+ out |= set(re.findall(r"([a-z_]\w*)\s*\(",
469
+ t.split("::", 1)[1]))
470
+ return out
471
+
472
+
473
+ def _assigned_scalars(lines: list[str], body: list[str]) -> set[str]:
474
+ """Scalar variables (declared without a shape) assigned in `body`."""
475
+ ents = "\n".join(ln.split("::", 1)[1] for ln in lines if "::" in ln)
476
+ arrays = set(re.findall(r"\b([a-z]\w*)\s*\(", ents))
477
+ out = set()
478
+ for ln in body:
479
+ m = re.match(r"\s*(?:if\s*\(.*\)\s*)?([a-z]\w*)\s*=[^=]",
480
+ ln.strip())
481
+ if m and m.group(1) not in arrays:
482
+ out.add(m.group(1))
483
+ return out
484
+
485
+
486
+ def _items(clause: str) -> list[str]:
487
+ m = re.match(r"\w+\((.*)\)$", clause)
488
+ if not m:
489
+ return []
490
+ inner = m.group(1)
491
+ depth, top = 0, ""
492
+ for ch in inner:
493
+ depth += {"(": 1, ")": -1}.get(ch, 0)
494
+ top += ch if depth == 0 or ch in "()" else ("_" if ch == ":" else ch)
495
+ if ":" in top:
496
+ inner = inner[top.rindex(":") + 1:]
497
+ items, depth, cur = [], 0, ""
498
+ for ch in inner:
499
+ if ch == "," and depth == 0:
500
+ items.append(cur.strip())
501
+ cur = ""
502
+ continue
503
+ depth += {"(": 1, ")": -1}.get(ch, 0)
504
+ cur += ch
505
+ if cur.strip():
506
+ items.append(cur.strip())
507
+ return [re.match(r"\w+", x).group() if re.match(r"\w+", x) else x
508
+ for x in items]
509
+
510
+
511
+ def _drop_item(clause: str, item: str) -> str:
512
+ head, inner = clause.split("(", 1)
513
+ inner = inner[:-1]
514
+ prefix = ""
515
+ depth, top = 0, ""
516
+ for ch in inner:
517
+ depth += {"(": 1, ")": -1}.get(ch, 0)
518
+ top += ch if depth == 0 or ch in "()" else "_"
519
+ if ":" in top:
520
+ cut = top.rindex(":") + 1
521
+ prefix, inner = inner[:cut] + " ", inner[cut:]
522
+ parts, depth, cur = [], 0, ""
523
+ for ch in inner:
524
+ if ch == "," and depth == 0:
525
+ parts.append(cur.strip())
526
+ cur = ""
527
+ continue
528
+ depth += {"(": 1, ")": -1}.get(ch, 0)
529
+ cur += ch
530
+ parts.append(cur.strip())
531
+ keep = [p for p in parts if not re.match(rf"{re.escape(item)}\b", p)]
532
+ return f"{head}({prefix.strip() + ' ' if prefix else ''}" \
533
+ f"{', '.join(keep)})".replace("( ", "(")
534
+
535
+
536
+ def _operands(expr: str) -> list[str]:
537
+ """Immediate operands of a generated expression: `(a op b)` -> a, b;
538
+ `f(x, y)` -> x, y (merge: its two values); plus "0"."""
539
+ e = expr.strip()
540
+ out = []
541
+
542
+ def split_top(s, seps):
543
+ parts, depth, cur, k = [], 0, "", 0
544
+ while k < len(s):
545
+ ch = s[k]
546
+ if depth == 0:
547
+ for sep in seps:
548
+ if s.startswith(sep, k):
549
+ parts.append(cur.strip())
550
+ cur = ""
551
+ k += len(sep)
552
+ break
553
+ else:
554
+ depth += {"(": 1, ")": -1}.get(ch, 0)
555
+ cur += ch
556
+ k += 1
557
+ continue
558
+ depth += {"(": 1, ")": -1}.get(ch, 0)
559
+ cur += ch
560
+ k += 1
561
+ parts.append(cur.strip())
562
+ return parts
563
+ m = re.match(r"(\w+)\((.*)\)$", e)
564
+ if m and _balanced(m.group(2)):
565
+ args = split_top(m.group(2), (",",))
566
+ if m.group(1).lower() in BOUNDS and len(args) == 2:
567
+ # keep the bound: the wrapper around a smaller operand, or the
568
+ # bound itself
569
+ out += [f"{m.group(1)}({x}, {args[1]})"
570
+ for x in _operands(args[0]) if x not in (args[0], "0")]
571
+ out.append(args[1])
572
+ out.append("0")
573
+ return out
574
+ if m.group(1).lower() == "merge":
575
+ args = args[:2]
576
+ out += [a for a in args if a]
577
+ elif e.startswith("(") and e.endswith(")") and _balanced(e[1:-1]):
578
+ parts = split_top(e[1:-1], (" + ", " - ", " * ", " / "))
579
+ if len(parts) >= 2:
580
+ out += parts
581
+ out.append("0")
582
+ return out
583
+
584
+
585
+ def _balanced(s: str) -> bool:
586
+ d = 0
587
+ for ch in s:
588
+ d += {"(": 1, ")": -1}.get(ch, 0)
589
+ if d < 0:
590
+ return False
591
+ return d == 0
592
+
593
+
594
+ # --- procedures and files (outside the kernels) --------------------------
595
+
596
+ _FUNC_HEAD = re.compile(r"^\s*(?:module\s+)?integer function (\w+)\(")
597
+ _USE_ONLY = re.compile(r"^(\s*use \w+, only: )(.*)$")
598
+
599
+
600
+ def _func_blocks(lines: list[str]) -> dict[str, list[tuple[int, int]]]:
601
+ """name -> [(first, last)] of every function definition or interface
602
+ body of `name` (logical lines)."""
603
+ out: dict[str, list] = {}
604
+ for k, ln in enumerate(lines):
605
+ m = _FUNC_HEAD.match(ln)
606
+ if not m:
607
+ continue
608
+ name = m.group(1)
609
+ for j in range(k + 1, len(lines)):
610
+ if re.match(rf"^\s*end function {name}\s*$", lines[j]):
611
+ out.setdefault(name, []).append((k, j))
612
+ break
613
+ return out
614
+
615
+
616
+ def _sections(lines: list[str]) -> list[tuple[int, int]]:
617
+ """(first, last) of each file of a bundle (from its marker)."""
618
+ marks = [k for k, ln in enumerate(lines) if ln.startswith(FILE_MARK)]
619
+ return [(a, (marks[i + 1] - 1) if i + 1 < len(marks) else len(lines) - 1)
620
+ for i, a in enumerate(marks)]
621
+
622
+
623
+ def file_candidates(lines: list[str]) -> list[Cand]:
624
+ """Shrink the program outside the kernels, across the files of a
625
+ bundle: delete a function nothing calls (its definition, interface
626
+ bodies and use-only entries, and an interface block left empty),
627
+ delete a file nothing uses, simplify a function's result expression
628
+ (keeping the generator's mod/iand bounds)."""
629
+ out: list[Cand] = []
630
+ blocks = _func_blocks(lines)
631
+ for name, spans in sorted(blocks.items()):
632
+ inside = {k for a, b in spans for k in range(a, b + 1)}
633
+ pat = re.compile(rf"\b{name}\b", re.I)
634
+ used = any(pat.search(ln) for k, ln in enumerate(lines)
635
+ if k not in inside and not _USE_ONLY.match(ln)
636
+ and not ln.lstrip().startswith("!"))
637
+ if used:
638
+ continue
639
+ new = []
640
+ for k, ln in enumerate(lines):
641
+ if k in inside:
642
+ continue
643
+ m = _USE_ONLY.match(ln)
644
+ if m and pat.search(m.group(2)):
645
+ rest = [x.strip() for x in m.group(2).split(",")
646
+ if x.strip().lower() != name.lower()]
647
+ if not rest:
648
+ continue
649
+ ln = m.group(1) + ", ".join(rest)
650
+ new.append(ln)
651
+ cleaned = []
652
+ for k, ln in enumerate(new):
653
+ if ln.strip() == "interface" and k + 1 < len(new) and \
654
+ new[k + 1].strip() == "end interface":
655
+ continue
656
+ if ln.strip() == "end interface" and cleaned and \
657
+ cleaned[-1].strip() == "interface":
658
+ cleaned.pop()
659
+ continue
660
+ cleaned.append(ln)
661
+ out.append(Cand(f"delete function {name}", tuple(cleaned)))
662
+ for a, b in _sections(lines):
663
+ if lines[a].strip().endswith("fuzz_prog.f90"):
664
+ continue
665
+ body = lines[a + 1:b + 1]
666
+ mods = [re.match(r"^(?:module|submodule \(\w+\)) (\w+)$",
667
+ x).group(1) for x in body
668
+ if re.match(r"^(?:module|submodule \(\w+\)) (\w+)$", x)]
669
+ rest = lines[:a] + lines[b + 1:]
670
+ if any(re.search(rf"\b(use|submodule \()\s*{m}\b", x)
671
+ for m in mods for x in rest):
672
+ continue
673
+ if any(_FUNC_HEAD.match(x) for x in body):
674
+ continue # its functions go first (delete function)
675
+ out.append(Cand(f"delete file {lines[a][len(FILE_MARK):]}",
676
+ tuple(rest)))
677
+ for name, spans in sorted(blocks.items()):
678
+ for a, b in spans:
679
+ for k in range(a + 1, b):
680
+ m = re.match(rf"^(\s*{name} = )(.*)$", lines[k])
681
+ if not m:
682
+ continue
683
+ for sub in _operands(m.group(2)):
684
+ if sub == m.group(2):
685
+ continue
686
+ nl = list(lines)
687
+ nl[k] = m.group(1) + sub
688
+ out.append(Cand(f"simplify {name}: {sub[:40]}",
689
+ tuple(nl)))
690
+ return out
691
+
692
+
693
+ # --- cleanup of unused variables --------------------------------------------------------
694
+
695
+ def cleanup_candidates(lines: list[str]) -> list[Cand]:
696
+ """Remove an array or scalar that no kernel line names: its entity in
697
+ the declarations, every other line outside the kernels that names it
698
+ (allocate, initialisation, checksum), loops left empty, and its entry
699
+ in the final max(...) of host flags."""
700
+ lo, hi = region(lines)
701
+ kern = "\n".join("\n".join(lines[a:b])
702
+ for a, b in all_regions(lines)).lower()
703
+ decl = {k for k, ln in enumerate(lines[:lo])
704
+ if re.match(r"\s*(integer|real|complex|logical|character|"
705
+ r"double precision)\b[^:]*::", ln)
706
+ and "parameter" not in ln.split("::")[0]}
707
+ names = set()
708
+ for k in decl:
709
+ ents = re.sub(r"\([^)]*\)", "", lines[k].split("::", 1)[1])
710
+ names |= {x.strip() for x in ents.split(",") if x.strip()}
711
+ out = []
712
+ for name in sorted(names - {"i", "j", "cs"}):
713
+ pat = re.compile(rf"\b{re.escape(name)}\b", re.I)
714
+ if pat.search(kern):
715
+ continue
716
+ new = []
717
+ for k, ln in enumerate(lines):
718
+ if lo <= k < hi or not pat.search(ln):
719
+ new.append(ln)
720
+ elif k in decl:
721
+ head, ents = ln.split("::", 1)
722
+ parts = [p.strip() for p in re.split(r",(?![^()]*\))", ents)]
723
+ keep = [p for p in parts
724
+ if not re.match(rf"{re.escape(name)}\b", p)]
725
+ if keep:
726
+ new.append(f"{head}:: {', '.join(keep)}")
727
+ elif ln.strip().startswith("print"):
728
+ t = re.sub(rf"\b{re.escape(name)}, ", "", ln)
729
+ new.append(t.replace("max(0)", "0"))
730
+ changed = True
731
+ while changed:
732
+ changed = False
733
+ nlo, nhi = region(new)
734
+ for k in range(len(new) - 1):
735
+ if nlo <= k < nhi:
736
+ continue # a kernel's loops stay (their directives)
737
+ if new[k].strip().startswith("do ") and \
738
+ new[k + 1].strip() == "end do":
739
+ del new[k:k + 2]
740
+ changed = True
741
+ break
742
+ if new != lines:
743
+ out.append(Cand(f"remove unused {name}", tuple(new)))
744
+ return out
745
+
746
+
747
+ # --- the oracle -----------------------------------------------------------------------
748
+
749
+ @dataclass(frozen=True)
750
+ class Failure:
751
+ toolchain: str
752
+ kind: str # wrong_code | ice | run_error
753
+ signature: str = ""
754
+ host: int = 0 # ran_on_host of the failing device run
755
+
756
+
757
+ def ice_signature(reason: str, output: str = "") -> str:
758
+ """A compiler-message key for ICE dedupe: the message without version
759
+ hashes, paths, line/column numbers of the program and addresses; for
760
+ AFAR the first frame of the stack dump that names a flang function."""
761
+ text = reason
762
+ m = re.search(r"error: loc\([^)]*\): (.*)", output)
763
+ if "verification of lowering to FIR failed" in reason and m:
764
+ text = "afar FIR verification: " + m.group(1)
765
+ if "PLEASE submit a bug report" in reason or \
766
+ "unable to execute command" in reason:
767
+ frames = re.findall(r"#\d+ 0x[0-9a-f]+ (?:\S+ )?\(?([A-Za-z_][\w:<>~]*"
768
+ r"(?:\([^)]*\))?)", output)
769
+ useful = [f for f in frames if not re.match(
770
+ r"(llvm::sys|_ZN4llvm3sys|SignalHandler|__restore_rt|"
771
+ r"PrintStackTrace|abort|raise|gsignal)", f)]
772
+ if useful:
773
+ text = "afar stack: " + useful[0][:120]
774
+ text = re.sub(r"version [0-9a-f]+", "version <v>", text)
775
+ text = re.sub(r"<tmpdir>\S*|(?<![\w])/\S+/", "", text)
776
+ # GCC locates an ICE at the program's own file and line ("fuzz_prog.f90:
777
+ # 97:44: internal compiler error: ..."; coverage parity)
778
+ text = re.sub(r"(?<![\w/])[\w.-]+\.(?:f90|c):\d+:\d+:\s*", "", text)
779
+ text = re.sub(r"(File|Line|Column) = [^,]+,?", "", text)
780
+ text = re.sub(r"0x[0-9a-f]+", "0x", text)
781
+ return " ".join(text.split())[:240]
782
+
783
+
784
+ class Oracle:
785
+ """Is the failure still there? Each source is compiled and run at most
786
+ once (cache by hash).
787
+
788
+ References: host runs (OMP_TARGET_OFFLOAD=disabled) of the toolchains
789
+ in `refs` (by default AFAR, or CCE 19 for an AFAR failure), and
790
+ ``ELISION_REF``: the sequential elision of the candidate
791
+ (offload.engine.expected.elision_evidence, no OpenMP toolchain). A
792
+ reference never comes from the failing toolchain's family (its own
793
+ host run, or another CCE release for a CCE failure, can share the
794
+ bug). Use ``trusted_refs`` to pick references whose value of the
795
+ ORIGINAL program matched the model. Every reference must give a value
796
+ and all must agree: a reduction that makes two references disagree
797
+ has stepped into a host-side difference (an undefined value, or a
798
+ host-fallback bug of one compiler), not the device failure. A
799
+ candidate whose elided gfortran -ftrapv build traps on a signed
800
+ overflow is rejected (``overflow_trap``). A wrong-code verdict then
801
+ needs the device checksum to differ from the reference, with the
802
+ original ran_on_host, twice in a row."""
803
+
804
+ def __init__(self, failure: Failure, refs=None):
805
+ self.failure = failure
806
+ self.tc = TOOLCHAINS[failure.toolchain]
807
+ if isinstance(refs, str):
808
+ refs = [refs]
809
+ if not refs: # the first gfx942 toolchain of another family
810
+ from offload.engine.toolchains import GFX942_TOOLCHAINS
811
+ fam = TOOLCHAINS[failure.toolchain].family_id
812
+ refs = [next(t for t in GFX942_TOOLCHAINS
813
+ if TOOLCHAINS[t].family_id != fam)]
814
+ refs = list(refs)
815
+ if failure.kind != "ice":
816
+ same = [r for r in refs if r != ELISION_REF and
817
+ family(r) == family(failure.toolchain)]
818
+ if same:
819
+ raise ValueError(
820
+ f"reference {', '.join(same)} is in the compiler family "
821
+ f"of the failing {failure.toolchain}")
822
+ self.ref_names = refs
823
+ self.elision_ref = ELISION_REF in refs
824
+ self.refs = [TOOLCHAINS[r] for r in refs if r != ELISION_REF]
825
+ self.cache: dict[str, tuple[bool, str]] = {}
826
+ self.calls = 0
827
+
828
+ def __call__(self, source: str) -> tuple[bool, str]:
829
+ key = hashlib.sha256(source.encode()).hexdigest()
830
+ if key not in self.cache:
831
+ self.cache[key] = self._judge(source)
832
+ return self.cache[key]
833
+
834
+ def _judge(self, source: str) -> tuple[bool, str]:
835
+ self.calls += 1
836
+ chk = check(source)
837
+ if not chk.ok:
838
+ return False, f"illegal: {chk.stage}: {chk.detail[:120]}"
839
+ if self.failure.kind != "ice":
840
+ trap = overflow_trap(source)
841
+ if trap:
842
+ return False, trap
843
+ tmp = Path(tempfile.mkdtemp(prefix="fuzzmin_"))
844
+ try:
845
+ return self._run(source, tmp)
846
+ finally:
847
+ shutil.rmtree(tmp, ignore_errors=True)
848
+
849
+ def _host(self, tc, source: str, tmp: Path, own_exe: Path | None):
850
+ """The host run of `source` by `tc` (None if it does not
851
+ compile); the failing toolchain's binary is reused."""
852
+ if tc.name == self.tc.name and own_exe is not None:
853
+ return fe.execute(tc, own_exe, own_exe.parent, "disabled")
854
+ d = tmp / f"ref-{tc.name}"
855
+ d.mkdir()
856
+ src, exe = d / "m.f90", d / "m.out"
857
+ src.write_text(source)
858
+ cls, _, _, _ = fe.compile_program(tc, src, exe, d)
859
+ if cls is not None:
860
+ return None
861
+ return fe.execute(tc, exe, d, "disabled")
862
+
863
+ def _run(self, source: str, tmp: Path) -> tuple[bool, str]:
864
+ f = self.failure
865
+ src, exe = tmp / "m.f90", tmp / "m.out"
866
+ src.write_text(source)
867
+ cls, reason, _, out = fe.compile_program(self.tc, src, exe, tmp)
868
+ if f.kind == "ice":
869
+ ok = cls == "ice" and (not f.signature or
870
+ ice_signature(reason, out) == f.signature)
871
+ return ok, reason[:200]
872
+ if cls is not None:
873
+ return False, f"compile: {cls}: {reason[:120]}"
874
+ dev = fe.execute(self.tc, exe, tmp, "mandatory")
875
+ sums = {}
876
+ for rtc in self.refs:
877
+ ref = self._host(rtc, source, tmp, exe)
878
+ if ref is None:
879
+ return False, f"reference compile ({rtc.name}) failed"
880
+ if ref.kind != "ok":
881
+ return False, f"reference run ({rtc.name}): {ref.why}"
882
+ sums[rtc.name] = ref.checksum
883
+ if self.elision_ref:
884
+ from offload.engine import expected as E
885
+ el = E.elision_evidence(source)
886
+ if el.status != "value":
887
+ return False, f"elision reference: {el.status}: " \
888
+ f"{(el.detail or '')[:120]}"
889
+ sums[ELISION_REF] = int(el.value.split("=", 1)[1])
890
+ if len(set(sums.values())) > 1:
891
+ return False, f"host references disagree: {sums}"
892
+ refsum = next(iter(sums.values()))
893
+ names = "/".join(sums)
894
+ if f.kind == "run_error":
895
+ # "crash" keeps the class, "crash: SIGSEGV" the signal too, and
896
+ # a message after " | " must stay in the run's output
897
+ want, _, msg = f.signature.partition(" | ")
898
+ ok = dev.kind == "fail" and (
899
+ dev.why.split(":")[0] == want.split(":")[0]
900
+ if ":" not in want else
901
+ dev.why.split(";")[0].strip() == want.strip()) and \
902
+ msg.strip() in (dev.stdout or "") + (dev.stderr or "")
903
+ return ok, (f"device: {dev.kind} {dev.why}; host reference "
904
+ f"({names}) checksum={refsum}")
905
+ if dev.kind != "ok" or dev.host != f.host or dev.checksum == refsum:
906
+ return False, (f"device {dev.kind} {dev.checksum} host={dev.host}"
907
+ f" ref {refsum}")
908
+ again = fe.execute(self.tc, exe, tmp, "mandatory")
909
+ if again.kind != "ok" or again.checksum != dev.checksum:
910
+ return False, "unstable device result"
911
+ return True, (f"device checksum={dev.checksum} ran_on_host="
912
+ f"{dev.host}; host reference ({names}) "
913
+ f"checksum={refsum}")
914
+
915
+
916
+ def overflow_trap(source: str) -> str | None:
917
+ """None if the elided program (no OpenMP, offload.engine.expected's
918
+ sequential omp_lib) built by gfortran -O0 -ftrapv runs to a result;
919
+ else why not (a trap: a signed integer overflow, undefined in
920
+ Fortran). The generator keeps every value in range (its model raises
921
+ on overflow), so an original passes; a reduction step that drops a
922
+ bound may not."""
923
+ from offload.engine import expected as E
924
+ v, note = E.run_elided(source, "gfortran", ("-ftrapv",))
925
+ if v is not None:
926
+ return None
927
+ if re.search(r"rc=(-6|134)\b", note):
928
+ return f"integer overflow (elided gfortran -ftrapv: {note})"
929
+ return f"range guard did not run (elided gfortran -ftrapv: {note})"
930
+
931
+
932
+ def _host_checksum(name: str, source: str) -> int | None:
933
+ tc = TOOLCHAINS[name]
934
+ tmp = Path(tempfile.mkdtemp(prefix="fuzzref_"))
935
+ try:
936
+ src, exe = tmp / "m.f90", tmp / "m.out"
937
+ src.write_text(source)
938
+ if fe.compile_program(tc, src, exe, tmp)[0] is not None:
939
+ return None
940
+ run = fe.execute(tc, exe, tmp, "disabled")
941
+ return run.checksum if run.kind == "ok" else None
942
+ finally:
943
+ shutil.rmtree(tmp, ignore_errors=True)
944
+
945
+
946
+ def _elision_value(source: str) -> str | None:
947
+ from offload.engine import expected as E
948
+ el = E.elision_evidence(source)
949
+ return el.value if el.status == "value" else None
950
+
951
+
952
+ def trusted_refs(source: str, expected: int, prefer: str,
953
+ limit: int = 2, host=None, elision=None) -> list[str]:
954
+ """References for a failure of `prefer`: toolchains outside its
955
+ compiler family whose host run (OMP_TARGET_OFFLOAD=disabled) of
956
+ `source` prints the model's checksum (one per family, at most
957
+ `limit`), then ``ELISION_REF`` when sequential elision applies and
958
+ gives the model's checksum. Empty: no reference independent of the
959
+ failing compiler (the caller does not minimize). `host(name, source)`
960
+ and `elision(source)` replace the runs (tests)."""
961
+ host = host or _host_checksum
962
+ elision = elision or _elision_value
963
+ out, fams = [], set()
964
+ for name in fe.TOOLCHAIN_ORDER:
965
+ f = family(name)
966
+ if f == family(prefer) or f in fams or len(out) >= limit:
967
+ continue
968
+ if host(name, source) == expected:
969
+ out.append(name)
970
+ fams.add(f)
971
+ if elision(source) == f"checksum={expected}":
972
+ out.append(ELISION_REF)
973
+ return out
974
+
975
+
976
+ def refs_for(toolchain: str, refs) -> list[str] | None:
977
+ """`refs` without those in `toolchain`'s family (a reference recorded
978
+ for one failure, reused to judge another toolchain); None if none is
979
+ left."""
980
+ keep = [r for r in (refs or []) if r == ELISION_REF or
981
+ family(r) != family(toolchain)]
982
+ return keep or None
983
+
984
+
985
+ # --- the driver -------------------------------------------------------------------------
986
+
987
+ @dataclass
988
+ class MinResult:
989
+ source: str
990
+ lines_before: int
991
+ lines_after: int
992
+ steps: list = field(default_factory=list)
993
+ verdict: str = ""
994
+ oracle_calls: int = 0
995
+
996
+
997
+ def minimize(source: str, oracle: Oracle, workers: int = 6,
998
+ max_rounds: int = 60, log=lambda *_: None) -> MinResult:
999
+ """Greedy delta debugging over `candidates` then `cleanup_candidates`
1000
+ (see the module docstring)."""
1001
+ lines = join_lines(source)
1002
+ ok, verdict = oracle(render(lines))
1003
+ if not ok:
1004
+ raise ValueError(f"the failure does not reproduce: {verdict}")
1005
+ before = len(source.splitlines())
1006
+
1007
+ def wrap(gen):
1008
+ return lambda L: [(c.what, list(c.lines)) for c in gen(L)]
1009
+ # the greedy driver is offload.engine.reduce's (shared with the generic
1010
+ # reducer); the candidates, the oracle and the rendering stay here
1011
+ lines, steps, got = RD.greedy(
1012
+ lines, [wrap(candidates), wrap(file_candidates),
1013
+ wrap(cleanup_candidates)],
1014
+ lambda L: oracle(render(L)), workers, max_rounds * 10,
1015
+ lambda what, L: log(f" {what} -> {len(render(L).splitlines())} "
1016
+ "lines"))
1017
+ final = render(lines)
1018
+ return MinResult(final, before, len(final.splitlines()), steps,
1019
+ got or verdict, getattr(oracle, "calls", 0))
1020
+
1021
+
1022
+ def finding_header(seed: int, failure: Failure, expected: str,
1023
+ observed: str, gen_version: str) -> str:
1024
+ from offload.engine.hdrwrap import wrap_line
1025
+ lines = ([
1026
+ f"! Minimized by compliance.fuzz_min from fuzz seed {seed} "
1027
+ f"({gen_version}).",
1028
+ f"! toolchain: {failure.toolchain} (-O2, HSA_XNACK={fe.XNACK}, "
1029
+ "OMP_TARGET_OFFLOAD=mandatory)",
1030
+ f"! failure: {failure.kind}" + (f" ({failure.signature})"
1031
+ if failure.signature else ""),
1032
+ f"! expected: {expected}",
1033
+ f"! observed: {observed}",
1034
+ "! Legal OpenMP 5.2: passes offload.engine.rules, gfortran -std=f2008 "
1035
+ "and AFAR flang's frontend.",
1036
+ ])
1037
+ return "\n".join(w for ln in lines for w in wrap_line(ln)) + "\n"
1038
+
1039
+
1040
+ def strip_header(source: str) -> str:
1041
+ """The source without the generator's comment header lines (those
1042
+ describe the original program, not the minimized one); a bundle's
1043
+ first file marker stays."""
1044
+ lines = source.splitlines()
1045
+ k = 0
1046
+ while k < len(lines) and lines[k].startswith("!") and \
1047
+ not lines[k].startswith(FILE_MARK):
1048
+ k += 1
1049
+ return "\n".join(lines[k:]) + "\n"