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,1270 @@
1
+ """Triage of a fuzz campaign.
2
+
3
+ ``summarize(run_dir)`` reads ``results/fuzz/<run id>/programs.jsonl`` (and
4
+ ``minimized.json`` after ``minimize_run``) and returns the summary written
5
+ to ``summary.json``: counts per class per toolchain, generator rejects with
6
+ causes, distinct failures (ICEs by compiler message, wrong code by the
7
+ minimized source's hash), compile rejections by message, the feature pairs
8
+ most associated with failures, known findings rediscovered, and timing.
9
+ ``write_report`` also renders ``data/reports/fuzz-<run id>.md``.
10
+
11
+ A program whose host reference run failed (``host_ref_failed``) or
12
+ disagreed with the model (``host_mismatch``) is ``valid`` when another host
13
+ build or the sequential elision prints the model's checksum
14
+ (offload.engine.fuzz_exec.host_verdict). Otherwise it is ``noncompliant`` and is
15
+ left out of all tallies, failure lists and minimization."""
16
+ from __future__ import annotations
17
+
18
+ import hashlib
19
+ import json
20
+ import re
21
+ import time
22
+ from collections import Counter, defaultdict
23
+ from itertools import combinations
24
+ from pathlib import Path
25
+
26
+ from offload.engine import fuzz_exec as fe
27
+
28
+ # The toolchains a report reads (the campaigns run fe.TOOLCHAIN_ORDER;
29
+ # the n0x0/n1x0 samples also the other toolchains of the merged result tables,
30
+ # NVHPC 25.11 and 26.9, joined in: catalog/toolchains.yaml merged_key; GCC, under
31
+ # test only, is no fuzz target)
32
+ from offload.engine.toolchains import registry as _registry # noqa: E402
33
+ REPORT_ORDER = fe.TOOLCHAIN_ORDER + tuple(
34
+ t for t in _registry().merged() if t not in fe.TOOLCHAIN_ORDER
35
+ and _registry().toolchains[t].family_id not in _registry().under_test_only())
36
+ from offload.engine.fuzz import generate
37
+
38
+ ROOT = Path(__file__).resolve().parent.parent.parent
39
+ FINDINGS = ROOT / "data" / "findings" / "fuzz"
40
+ FAILS = ("wrong_code", "ice", "run_error", "timeout", "host_fallback")
41
+
42
+
43
+ def _norm(text: str) -> str:
44
+ """A message key: no paths, numbers of lines/columns, hashes or
45
+ addresses."""
46
+ t = re.sub(r"version [0-9a-f]{8,}", "version <v>", text)
47
+ t = re.sub(r"<tmpdir>\S*|\.\./\S+|(?<![\w])/\S+", "<path>", t)
48
+ t = re.sub(r"(File|Line|Column) = [^,|]+,?", "", t)
49
+ t = re.sub(r":\d+:\d+", ":L:C", t)
50
+ t = re.sub(r"0x[0-9a-fA-F]+", "0x", t)
51
+ t = re.sub(r"\bline \d+", "line N", t)
52
+ t = re.sub(r"\b(FUZZ_PROG|fuzz_prog)\b", "", t)
53
+ return " ".join(t.split())[:200]
54
+
55
+
56
+ def reject_cause(stage: str, detail: str) -> str:
57
+ """The generator-reject cause: rule ids, or the checker's message
58
+ without positions and names."""
59
+ if stage == "rules":
60
+ return "rules: " + detail
61
+ if stage == "prerun":
62
+ # The kind of a pre-run refusal;
63
+ # a front-end-only refusal is a candidate AFAR front-end defect
64
+ from offload.engine.prerun import refusal_kind
65
+ k = refusal_kind(detail)
66
+ if k == "frontend_only":
67
+ return ("prerun: front end alone refuses (candidate AFAR "
68
+ "front-end defect)")
69
+ return f"prerun: {k}"
70
+ d = re.sub(r"t\.f90:\d+:\d+: ", "", detail)
71
+ d = re.sub(r"'(p\d|lp\d|r\d[ab]|o\d|hf\d|t\d)'", "'<var>'", d)
72
+ d = re.sub(r"\b(r\d[ab]|lp\d|o\d|hf\d)\b", "<var>", d)
73
+ return f"{stage}: {_norm(d)}"
74
+
75
+
76
+ def load(run_dir: Path):
77
+ return fe.load(run_dir)
78
+
79
+
80
+ def _minimized(run_dir: Path) -> list[dict]:
81
+ p = Path(run_dir) / "minimized.json"
82
+ return json.loads(p.read_text()) if p.exists() else []
83
+
84
+
85
+ def feature_pairs(progs, tc: str, cls: tuple = FAILS, top: int = 12,
86
+ min_n: int = 15) -> list:
87
+ """Feature pairs whose programs end in `cls` on `tc` most often,
88
+ relative to the toolchain's rate among programs it did not reject
89
+ (lift), with at least `min_n` programs and 3 hits per pair. A pair is
90
+ listed only if it beats both of its features alone by 25% (otherwise
91
+ one feature explains it; those are in ``single_features``)."""
92
+ rows = [(set(f for f in p.features if not f.startswith("swarm:")),
93
+ p.results[tc].cls in cls)
94
+ for p in progs if tc in p.results
95
+ and p.results[tc].cls not in ("compile_reject", "harness_error")]
96
+ if not rows:
97
+ return []
98
+ base = sum(f for _, f in rows) / len(rows)
99
+ if base == 0:
100
+ return []
101
+ n1, k1, n, k = Counter(), Counter(), Counter(), Counter()
102
+ for feats, hit in rows:
103
+ for f in feats:
104
+ n1[f] += 1
105
+ k1[f] += hit
106
+ for pair in combinations(sorted(feats), 2):
107
+ n[pair] += 1
108
+ k[pair] += hit
109
+ out = []
110
+ for pair, cnt in n.items():
111
+ if cnt < min_n or k[pair] < 3:
112
+ continue
113
+ rate = k[pair] / cnt
114
+ alone = max(k1[f] / n1[f] for f in pair)
115
+ if rate < 1.25 * alone:
116
+ continue
117
+ out.append({"pair": list(pair), "programs": cnt,
118
+ "failures": k[pair], "rate": round(rate, 3),
119
+ "lift": round(rate / base, 2),
120
+ "best_single_rate": round(alone, 3)})
121
+ out.sort(key=lambda r: (-r["lift"], -r["failures"], r["pair"]))
122
+ return out[:top]
123
+
124
+
125
+ def single_features(progs, tc: str, cls, top: int = 12,
126
+ min_n: int = 15, among_compiled: bool = False) -> list:
127
+ """Features whose programs end in class `cls` (a name or a tuple) on
128
+ `tc` most often relative to the toolchain's rate (lift)."""
129
+ cls = (cls,) if isinstance(cls, str) else tuple(cls)
130
+ skip = ("harness_error",) + (("compile_reject",) if among_compiled
131
+ else ())
132
+ rows = [(set(f for f in p.features if not f.startswith("swarm:")),
133
+ p.results[tc].cls in cls) for p in progs if tc in p.results
134
+ and p.results[tc].cls not in skip]
135
+ if not rows:
136
+ return []
137
+ base = sum(f for _, f in rows) / len(rows)
138
+ n, k = Counter(), Counter()
139
+ for feats, hit in rows:
140
+ for f in feats:
141
+ n[f] += 1
142
+ k[f] += hit
143
+ out = [{"feature": f, "programs": n[f], "hits": k[f],
144
+ "rate": round(k[f] / n[f], 3),
145
+ "lift": round((k[f] / n[f]) / base, 2) if base else 0}
146
+ for f in n if n[f] >= min_n and k[f] >= 3]
147
+ out.sort(key=lambda r: (-r["lift"], -r["hits"], r["feature"]))
148
+ return out[:top]
149
+
150
+
151
+ def base_feature_rates(progs) -> dict:
152
+ """Base-language features (fuzz-3, offload.engine.fuzz_base) of the
153
+ judged programs: for each feature and toolchain the programs that have
154
+ it and their classes (counts)."""
155
+ out: dict = {}
156
+ for p in progs:
157
+ for f in p.features:
158
+ if not f.startswith("base:") or f.startswith("base:group:"):
159
+ continue
160
+ row = out.setdefault(f, {"programs": 0, "classes": {}})
161
+ row["programs"] += 1
162
+ for t, r in p.results.items():
163
+ c = row["classes"].setdefault(t, {})
164
+ c[r.cls] = c.get(r.cls, 0) + 1
165
+ return dict(sorted(out.items()))
166
+
167
+
168
+ def known_findings(progs) -> dict:
169
+ """The campaign's evidence for the known findings of data/findings/."""
170
+ def count(pred):
171
+ seeds = [p.seed for p in progs if pred(p)]
172
+ return {"programs": len(seeds), "seeds": seeds[:12]}
173
+ feats = lambda p: set(p.features) # noqa: E731
174
+ return {
175
+ "cce19-target-parallel-guarded-loop (wrong code on cce19 in a "
176
+ "program with a thread-0-guarded sequential loop in target "
177
+ "parallel)": count(lambda p: "cce19" in p.results
178
+ and p.results["cce19"].cls == "wrong_code"
179
+ and feats(p) & {"guard:par_thread0",
180
+ "guard:split_par_thread0"}),
181
+ "cce21-defaultmap-aggregate-flag (wrong code or host fallback on "
182
+ "cce21 where cce20 agrees, in a program with a defaultmap clause; "
183
+ "the finding's symptom: a map(tofrom) scalar is not copied back)": count(
184
+ lambda p: "cce21" in p.results and "cce20" in p.results
185
+ and p.results["cce21"].cls in ("wrong_code", "host_fallback")
186
+ and p.results["cce20"].cls == "agree"
187
+ and any(f.startswith("defaultmap:") for f in feats(p))),
188
+ "(control for the line above: the same without a defaultmap "
189
+ "clause)": count(
190
+ lambda p: "cce21" in p.results and "cce20" in p.results
191
+ and p.results["cce21"].cls in ("wrong_code", "host_fallback")
192
+ and p.results["cce20"].cls == "agree"
193
+ and not any(f.startswith("defaultmap:") for f in feats(p))),
194
+ "cce21-in-reduction-taskwait-link (cce21 link failure on "
195
+ "_cray$mt_taskwait)": count(
196
+ lambda p: "cce21" in p.results
197
+ and "_cray$mt_taskwait" in p.results["cce21"].reason),
198
+ "cce19-target-parallel-single-ice / task ICE (CCE 'unhandled "
199
+ "construct type')": count(
200
+ lambda p: any(r.cls == "ice" and "unhandled" in r.reason
201
+ for r in p.results.values())),
202
+ }
203
+
204
+
205
+ def summarize(run_dir: Path) -> dict:
206
+ run_dir = Path(run_dir)
207
+ progs, crashes = load(run_dir)
208
+ meta = json.loads((run_dir / "meta.json").read_text()) \
209
+ if (run_dir / "meta.json").exists() else {}
210
+ legal = [p for p in progs if p.check == "ok"]
211
+ noncompliant = [p for p in legal if p.validity == "noncompliant"]
212
+ ran = [p for p in legal if p.validity != "noncompliant"]
213
+ # a checker that could not run (stage "error") is an environment
214
+ # failure, not a generator reject
215
+ rejects = [p for p in progs if p.check not in ("ok", "error")]
216
+ checker_errors = [p.seed for p in progs if p.check == "error"]
217
+ tcs = [t for t in REPORT_ORDER if any(t in p.results for p in ran)]
218
+ counts = {t: Counter() for t in tcs}
219
+ flaky = {t: Counter() for t in tcs}
220
+ for p in ran:
221
+ for t, r in p.results.items():
222
+ counts[t][r.cls] += 1
223
+ if r.flaky:
224
+ flaky[t][r.cls] += 1
225
+ causes = Counter(reject_cause(p.check, p.check_detail) for p in rejects)
226
+ by_cause = defaultdict(list)
227
+ for p in rejects:
228
+ by_cause[reject_cause(p.check, p.check_detail)].append(p.seed)
229
+ # distinct failures
230
+ from offload.engine.fuzz_min import ice_signature
231
+ ices = defaultdict(list)
232
+ others = defaultdict(list)
233
+ rejected_msgs = {t: Counter() for t in tcs}
234
+ for p in ran:
235
+ for t, r in p.results.items():
236
+ if r.cls == "ice":
237
+ ices[(t, ice_signature(r.reason, r.output))].append(p.seed)
238
+ elif r.cls in ("run_error", "timeout", "host_fallback"):
239
+ key = re.sub(r"checksum=-?\d+|expected=-?\d+", "", r.reason)
240
+ others[(t, r.cls, _norm(key.split("; repeats")[0]))].append(
241
+ p.seed)
242
+ elif r.cls == "compile_reject":
243
+ rejected_msgs[t][_norm(r.reason)] += 1
244
+ wrong = {t: [p.seed for p in ran if t in p.results
245
+ and p.results[t].cls == "wrong_code"] for t in tcs}
246
+ all_mins = _minimized(run_dir)
247
+ nc_seeds = {p.seed for p in noncompliant}
248
+ mins = [m for m in all_mins if m["seed"] not in nc_seeds]
249
+ sessions = meta.get("sessions", [])
250
+ seconds = sum(s.get("seconds", 0) for s in sessions)
251
+ per_prog = [p.seconds for p in progs]
252
+ summary = {
253
+ "run_id": run_dir.name,
254
+ "generated": len(progs) + len(crashes),
255
+ "worker_crashes": [{"seed": c["seed"], "crash": c["crash"]}
256
+ for c in crashes],
257
+ "legal_and_run": len(legal),
258
+ "judged": len(ran),
259
+ "generator_rejects": {"total": len(rejects),
260
+ "by_stage": dict(Counter(p.check
261
+ for p in rejects)),
262
+ "by_cause": {c: {"count": n,
263
+ "seeds": by_cause[c][:8]}
264
+ for c, n in causes.most_common()}},
265
+ "checker_errors": {"total": len(checker_errors),
266
+ "seeds": checker_errors},
267
+ "classes": {t: dict(counts[t]) for t in tcs},
268
+ "flaky": {t: dict(flaky[t]) for t in tcs},
269
+ "flaky_programs": [{"seed": p.seed, "toolchain": t,
270
+ "runs": r.runs} for p in ran
271
+ for t, r in p.results.items() if r.flaky],
272
+ "all_agree": sum(p.all_agree for p in ran),
273
+ "host_mismatch": [_host_row(p) for p in legal if p.host_mismatch],
274
+ "host_ref_failed": [_host_row(p) for p in legal
275
+ if p.host_ref_failed],
276
+ "host_path_failure": {t: {"programs": len(s), "seeds": s}
277
+ for t, s in _host_path_failures(ran).items()},
278
+ "noncompliant": [dict(_host_row(p), classes={
279
+ t: r.cls for t, r in p.results.items()},
280
+ minimized=[m["file"] for m in all_mins if m["seed"] == p.seed
281
+ and m.get("status") == "minimized"])
282
+ for p in noncompliant],
283
+ "ice": [{"toolchain": t, "signature": sig, "programs": len(s),
284
+ "seeds": s[:10]} for (t, sig), s in
285
+ sorted(ices.items(), key=lambda kv: (-len(kv[1]), kv[0]))],
286
+ "wrong_code": {t: {"programs": len(s), "seeds": s[:40]}
287
+ for t, s in wrong.items()},
288
+ "other_failures": [{"toolchain": t, "class": c, "reason": why,
289
+ "programs": len(s), "seeds": s[:10]}
290
+ for (t, c, why), s in sorted(
291
+ others.items(), key=lambda kv: -len(kv[1]))],
292
+ "compile_reject_messages": {t: [{"message": m, "programs": n}
293
+ for m, n in c.most_common(25)]
294
+ for t, c in rejected_msgs.items()},
295
+ "minimized": mins,
296
+ "distinct_failures": _distinct(mins),
297
+ "feature_pairs": {t: {c: feature_pairs(ran, t, (c,))
298
+ for c in ("wrong_code", "ice", "run_error")}
299
+ for t in tcs},
300
+ "failure_features": {t: {c: single_features(ran, t, c, top=8,
301
+ among_compiled=True)
302
+ for c in ("wrong_code", "ice",
303
+ "run_error")}
304
+ for t in tcs},
305
+ "compile_reject_features": {t: single_features(ran, t,
306
+ "compile_reject")
307
+ for t in tcs},
308
+ "known_findings": known_findings(ran),
309
+ "base": sorted({g for p in progs for g in (p.base or [])}),
310
+ "base_features": base_feature_rates(ran),
311
+ "timing": {"campaign_seconds": seconds,
312
+ "programs_per_hour": round(len(progs) / seconds * 3600)
313
+ if seconds else None,
314
+ "mean_program_seconds": round(sum(per_prog) /
315
+ len(per_prog), 1)
316
+ if per_prog else None,
317
+ "workers": sessions[-1]["workers"] if sessions else None,
318
+ "sessions": sessions},
319
+ }
320
+ return summary
321
+
322
+
323
+ def base_table(rates: dict, tcs: list) -> list[str]:
324
+ rows = []
325
+ for f, v in rates.items():
326
+ cells = []
327
+ for t in tcs:
328
+ c = v["classes"].get(t, {})
329
+ main = [c.get(k, 0) for k in ("agree", "compile_reject", "ice",
330
+ "wrong_code", "run_error")]
331
+ rest = sum(c.values()) - sum(main)
332
+ cells.append("/".join(map(str, main))
333
+ + (f" ({rest})" if rest else ""))
334
+ rows.append([f[5:], v["programs"]] + cells)
335
+ return _table(["feature", "programs"] + tcs, rows)
336
+
337
+
338
+ def _host_row(p) -> dict:
339
+ """A program's host reference check: the reference toolchain and
340
+ value, every host build's checksum (or why it has none), the
341
+ elision, and the validity verdict."""
342
+ return {"seed": p.seed, "expected": p.expected, "tc": p.host_ref_tc,
343
+ "host_ref": p.host_ref,
344
+ "reference": "host_ref_failed" if p.host_ref_failed else
345
+ "host_mismatch" if p.host_mismatch else "agree",
346
+ "host": {t: r.host_checksum if r.host_checksum is not None
347
+ else (r.host_why or "-")
348
+ for t, r in p.results.items()},
349
+ "elision": p.elision, "validity": p.validity,
350
+ "witnesses": p.host_witnesses,
351
+ "host_path_failure": p.host_path_failure,
352
+ "rechecked": p.host_rechecked}
353
+
354
+
355
+ def _host_path_failures(progs) -> dict:
356
+ """toolchain -> seeds of valid programs whose host build on it failed
357
+ or printed another checksum than the model (finding class
358
+ host_path_failure)."""
359
+ out = {t: [] for t in REPORT_ORDER}
360
+ for p in progs:
361
+ for t in p.host_path_failure:
362
+ out.setdefault(t, []).append(p.seed)
363
+ return {t: s for t, s in out.items() if s}
364
+
365
+
366
+ def _distinct(mins: list[dict]) -> list[dict]:
367
+ """Minimized failures deduplicated: ICEs by (toolchain family,
368
+ signature), wrong code and run errors by minimized-source hash."""
369
+ seen, out = set(), []
370
+ for m in mins:
371
+ if m.get("status") != "minimized":
372
+ continue
373
+ key = (m["kind"], m["signature"]) if m["kind"] == "ice" else \
374
+ (m["kind"], m["sha"])
375
+ if key in seen:
376
+ continue
377
+ seen.add(key)
378
+ out.append({k: m[k] for k in ("seed", "toolchain", "kind",
379
+ "signature", "file", "lines_before",
380
+ "lines_after", "also_fails_on",
381
+ "expected", "observed") if k in m})
382
+ return out
383
+
384
+
385
+ # --- minimization of a campaign ------------------------------------------------------------
386
+
387
+ def _ice_key(sig: str) -> str:
388
+ """An ICE message without its source location (CCE releases report the
389
+ same message at different lines of v_openmp.c)."""
390
+ return re.sub(r"\s*\([^()]*line \d+[^()]*\)", "", sig).strip()
391
+
392
+
393
+ # fuzz-1 programs whose result rests on the defaultmap Ruling of
394
+ # offload.engine.fuzz (fixed in fuzz-2): not minimized, reported apart
395
+ AMBIGUOUS_FUZZ1 = re.compile(r"defaultmap:(present|alloc|from|none):"
396
+ r"(scalar|all)$")
397
+
398
+
399
+ def ambiguous(p) -> bool:
400
+ return p.gen_version == "fuzz-1" and any(
401
+ AMBIGUOUS_FUZZ1.match(f) for f in p.features)
402
+
403
+
404
+ def representatives(progs, limit: int) -> list[tuple]:
405
+ """(seed, toolchain, kind, signature, host) to minimize: for each ICE
406
+ message (without its location) the smallest program, on the first
407
+ toolchain that shows it; for wrong code and run errors on each
408
+ toolchain up to `limit` non-flaky programs with different kernel
409
+ lists, fewest kernels and shortest first (so one bug that dominates
410
+ the counts does not take every slot). Duplicates are removed after
411
+ minimization, by source hash."""
412
+ from offload.engine.fuzz_min import ice_signature
413
+ ran = sorted((p for p in progs if p.check == "ok"
414
+ and p.validity != "noncompliant"),
415
+ key=lambda p: (len(p.kernels), p.lines))
416
+ out, seen = [], set()
417
+ for p in ran:
418
+ for t in REPORT_ORDER:
419
+ r = p.results.get(t)
420
+ if r is None or r.cls != "ice":
421
+ continue
422
+ sig = ice_signature(r.reason, r.output)
423
+ if _ice_key(sig) not in seen:
424
+ seen.add(_ice_key(sig))
425
+ out.append((p.seed, t, "ice", sig, 0))
426
+ for kind in ("wrong_code", "run_error"):
427
+ for t in REPORT_ORDER:
428
+ keys = set()
429
+ for p in ran:
430
+ r = p.results.get(t)
431
+ if r is None or r.cls != kind or r.flaky or ambiguous(p):
432
+ continue
433
+ key = tuple(re.sub(r" \(\dD\)", "", k) for k in p.kernels)
434
+ if key in keys or len(keys) >= limit:
435
+ continue
436
+ keys.add(key)
437
+ sig = r.reason.split(";")[0] if kind == "run_error" else ""
438
+ out.append((p.seed, t, kind, sig, r.ran_on_host or 0))
439
+ return out
440
+
441
+
442
+ def also_candidates(tc: str, also=None) -> list[str]:
443
+ """The toolchains a minimized failure is tried on ("also fails on"):
444
+ REPORT_ORDER, or (another machine: coverage parity on Tioga) the given
445
+ ones, never the failing toolchain itself."""
446
+ return [t for t in (also or REPORT_ORDER) if t != tc]
447
+
448
+
449
+ def minimize_run(run_dir: Path, workers: int = 6, limit: int = 4,
450
+ log=print, only=None, also=None) -> list[dict]:
451
+ """Minimize the representatives of a campaign; results go to
452
+ minimized.json (incremental: entries already there are kept) and
453
+ data/findings/fuzz/<seed>-<toolchain>.f90."""
454
+ from offload.engine import fuzz_min as fm
455
+ run_dir = Path(run_dir)
456
+ progs, _ = load(run_dir)
457
+ by_seed = {p.seed: p for p in progs}
458
+ state_path = run_dir / "minimized.json"
459
+ state = _minimized(run_dir)
460
+ done = {(m["seed"], m["toolchain"], m["kind"]) for m in state}
461
+ FINDINGS.mkdir(parents=True, exist_ok=True)
462
+ if only:
463
+ # given (seed, toolchain, kind) triples instead of the
464
+ # representatives (a triage of a small campaign)
465
+ reps = []
466
+ for seed, tc, kind in only:
467
+ r = by_seed[seed].results[tc]
468
+ sig = ""
469
+ if kind == "ice":
470
+ from offload.engine.fuzz_min import ice_signature
471
+ sig = ice_signature(r.reason, r.output)
472
+ elif kind == "run_error":
473
+ sig = r.reason.split(";")[0]
474
+ reps.append((seed, tc, kind, sig, r.ran_on_host or 0))
475
+ else:
476
+ reps = representatives(progs, limit)
477
+ log(f"{len(reps)} representatives ({len(done)} done)")
478
+ for seed, tc, kind, sig, host in reps:
479
+ if (seed, tc, kind) in done:
480
+ continue
481
+ prog = fe.regenerate(by_seed[seed])
482
+ entry = {"seed": seed, "toolchain": tc, "kind": kind,
483
+ "signature": sig, "expected": "", "observed": ""}
484
+ r = by_seed[seed].results[tc]
485
+ # the same program minimized for another toolchain already fails
486
+ # on this one: nothing new to minimize
487
+ same = next((m for m in state if m["seed"] == seed and m["kind"]
488
+ == kind and tc in m.get("also_fails_on", [])), None)
489
+ if same:
490
+ entry.update(status="covered_by", covered_by=same["file"])
491
+ state.append(entry)
492
+ state_path.write_text(json.dumps(state, indent=1) + "\n")
493
+ log(f"seed {seed} on {tc}: covered by {same['file']}")
494
+ continue
495
+ t0 = time.time()
496
+ failure = fm.Failure(tc, kind, sig, host)
497
+ log(f"minimize seed {seed} on {tc} ({kind}) ...")
498
+ try:
499
+ refs = fm.trusted_refs(prog.source, prog.expected, tc) \
500
+ if kind != "ice" else None
501
+ if kind != "ice" and not refs:
502
+ raise ValueError("no reference outside the failing "
503
+ "compiler family (another family's host "
504
+ "run, or sequential elision) matches the "
505
+ "model")
506
+ entry["references"] = refs
507
+ res = fm.minimize(prog.source, fm.Oracle(failure, refs),
508
+ workers=workers, log=log)
509
+ except ValueError as e:
510
+ entry.update(status="not_reproduced", why=str(e)[:300])
511
+ state.append(entry)
512
+ state_path.write_text(json.dumps(state, indent=1) + "\n")
513
+ log(f" not reproduced: {e}")
514
+ continue
515
+ body = fm.strip_header(res.source)
516
+ sha = hashlib.sha256(body.encode()).hexdigest()[:16]
517
+ exp, obs = expected_observed(kind, res.verdict, r.reason)
518
+ also = []
519
+ for other in also_candidates(tc, also):
520
+ # another toolchain: any ICE counts (messages differ by release);
521
+ # its references must come from outside its own family
522
+ orefs = fm.refs_for(other, entry.get("references"))
523
+ if kind != "ice" and orefs is None:
524
+ continue
525
+ ok, why = fm.Oracle(fm.Failure(
526
+ other, kind, "" if kind == "ice" else sig, host),
527
+ orefs)(body)
528
+ if ok:
529
+ also.append(other)
530
+ # c1 files keep their names; later campaigns prefix the
531
+ # run id (seeds repeat across campaigns)
532
+ name = f"{seed}-{tc}.f90" if run_dir.name == "c1" else \
533
+ f"{run_dir.name}-{seed}-{tc}.f90"
534
+ (FINDINGS / name).write_text(finding_text(
535
+ seed, failure, prog.gen_version, res.source, res.verdict,
536
+ r.reason, also))
537
+ entry.update(status="minimized", file=f"data/findings/fuzz/{name}",
538
+ sha=sha, lines_before=res.lines_before,
539
+ lines_after=len(body.splitlines()),
540
+ oracle_calls=res.oracle_calls, steps=len(res.steps),
541
+ seconds=round(time.time() - t0), also_fails_on=also,
542
+ expected=exp, observed=obs, verdict=res.verdict)
543
+ state.append(entry)
544
+ state_path.write_text(json.dumps(state, indent=1) + "\n")
545
+ log(f" {res.lines_before} -> {entry['lines_after']} lines in "
546
+ f"{entry['seconds']} s; also fails on {also}")
547
+ return state
548
+
549
+
550
+ # --- the review document --------------------------------------------------------------------
551
+
552
+ def _table(head: list[str], rows: list[list]) -> list[str]:
553
+ out = ["| " + " | ".join(head) + " |",
554
+ "|" + "|".join("---" for _ in head) + "|"]
555
+ out += ["| " + " | ".join(str(c).replace("|", "\\|") for c in r) + " |"
556
+ for r in rows]
557
+ return out
558
+
559
+
560
+ CAMPAIGNS = Path(__file__).resolve().parent.parent.parent / "catalog" / \
561
+ "fuzz_campaigns.yaml"
562
+
563
+
564
+ def _run_notes(run_id: str) -> list[str]:
565
+ """The notes catalog/fuzz_campaigns.yaml keeps for a run (a campaign's
566
+ run_notes: {run id: text or [texts]})."""
567
+ import yaml
568
+ if not CAMPAIGNS.is_file():
569
+ return []
570
+ d = yaml.safe_load(CAMPAIGNS.read_text()) or {}
571
+ for c in (d.get("campaigns") or {}).values():
572
+ got = (c.get("run_notes") or {}).get(run_id)
573
+ if got:
574
+ return [got] if isinstance(got, str) else list(got)
575
+ return []
576
+
577
+
578
+ def _mode_text(s: dict) -> str:
579
+ """The memory mode of a campaign's runs: its sessions' HSA_XNACK
580
+ (1 when not recorded), and NVHPC's separate memory when a session ran
581
+ an NVHPC toolchain (the x0 campaigns said
582
+ HSA_XNACK=1)."""
583
+ ses = s["timing"]["sessions"] or [{}]
584
+ xs = sorted({x.get("xnack", 1) for x in ses
585
+ if not any(t.startswith("nvhpc")
586
+ for t in x.get("toolchains", ()))} or {1})
587
+ text = "HSA_XNACK=" + "/".join(map(str, xs))
588
+ if any(t.startswith("nvhpc") for x in ses
589
+ for t in x.get("toolchains", ())):
590
+ text += " (AMD) and separate memory (NVHPC)"
591
+ return text
592
+
593
+
594
+ def _timing_text(t: dict) -> str:
595
+ """The campaign's time: one session as before; several (concurrent
596
+ chunks, joined toolchain runs) each with its own time and workers
597
+ (their sum read as one session with the last
598
+ session's workers)."""
599
+ ses = t["sessions"] or []
600
+ if len(ses) <= 1:
601
+ return (f"- campaign wall time: {t['campaign_seconds']} s with "
602
+ f"{t['workers']} workers ({t['programs_per_hour']} "
603
+ f"programs/hour; {t['mean_program_seconds']} s per program "
604
+ "and worker, all toolchains and repeats included)")
605
+ parts = ", ".join(
606
+ f"{x.get('run_id', '?')}: {x.get('seconds', 0)} s with "
607
+ f"{x.get('workers', '?')} worker"
608
+ + ("s" if x.get("workers") != 1 else "") for x in ses)
609
+ return (f"- sessions ({len(ses)}, some concurrent; the times are not a "
610
+ f"wall time): {parts}; {t['mean_program_seconds']} s per program "
611
+ "and worker, all toolchains and repeats included")
612
+
613
+
614
+ def _campaign_rows(run_dir: Path) -> list[dict]:
615
+ """(toolchain, mode key, provenance) of a campaign's results, for the
616
+ canary coverage check."""
617
+ if not (run_dir / "programs.jsonl").is_file():
618
+ return []
619
+ meta = run_dir / "meta.json"
620
+ x = 1
621
+ if meta.is_file():
622
+ d = json.loads(meta.read_text())
623
+ x = (d.get("sessions") or [d])[0].get("xnack", 1)
624
+ out = []
625
+ for ln in (run_dir / "programs.jsonl").read_text().splitlines():
626
+ if not ln.strip():
627
+ continue
628
+ rec = json.loads(ln)
629
+ for tc, r in (rec.get("results") or {}).items():
630
+ out.append({"toolchain": tc, "xnack": x,
631
+ "git_rev": r.get("git_rev"), "gate": r.get("gate")})
632
+ return out
633
+
634
+
635
+ def write_report(run_dir: Path, md_path: Path) -> dict:
636
+ # A changed canary of the campaign stops the report
637
+ from offload.engine import canary
638
+ canary.require_unchanged(canary.files_for(Path(run_dir)),
639
+ f"fuzz campaign {Path(run_dir).name}",
640
+ campaign_rows=_campaign_rows(Path(run_dir)))
641
+ s = summarize(run_dir)
642
+ Path(run_dir, "summary.json").write_text(json.dumps(s, indent=1) + "\n")
643
+ gv = (s['timing']['sessions'] or [{}])[-1].get('gen_version', '?')
644
+ L = [f"# Fuzz campaign `{s['run_id']}`"
645
+ + ("" if gv in ("fuzz-1", "fuzz-2") else
646
+ ""), "",
647
+ "Csmith-style random OpenMP 5.2 Fortran offload programs "
648
+ f"(offload.engine.fuzz, generator `{gv}`"
649
+ + (f", base-language groups: {', '.join(s['base'])} "
650
+ "(offload.engine.fuzz_base)" if s.get("base") else "") + ")"
651
+ ", run on every toolchain at -O2, " + _mode_text(s) + ", "
652
+ "OMP_TARGET_OFFLOAD=mandatory; reference: the Python model of "
653
+ "each program, checked against a host run "
654
+ "(OMP_TARGET_OFFLOAD=disabled, a reference only; see the "
655
+ "appendix 'Host reference checks' for the programs whose host run "
656
+ "failed or disagreed). "
657
+ "Machine-readable: "
658
+ f"results/fuzz/{s['run_id']}/summary.json.", ""]
659
+ t = s["timing"]
660
+ L += ["## Size and timing", "",
661
+ f"- programs generated: {s['generated']}; legal and run: "
662
+ f"{s['legal_and_run']} (judged: {s['judged']}; noncompliant, "
663
+ f"excluded from every count below: {len(s['noncompliant'])}); "
664
+ "generator rejects: "
665
+ f"{s['generator_rejects']['total']}; worker crashes: "
666
+ f"{len(s['worker_crashes'])}"
667
+ + (f"; checker errors (a checker could not run): "
668
+ f"{s['checker_errors']['total']} (seeds "
669
+ f"{', '.join(map(str, s['checker_errors']['seeds'][:8]))}; "
670
+ "not run, not generator rejects)"
671
+ if s.get("checker_errors", {}).get("total") else ""),
672
+ _timing_text(t),
673
+ f"- programs whose device results agree with the model on every "
674
+ f"toolchain: {s['all_agree']}", ""]
675
+ notes = _run_notes(s["run_id"])
676
+ if notes:
677
+ L += ["## Notes", ""] + [f"- {n}" for n in notes] + [""]
678
+ L += ["## Classes per toolchain", "",
679
+ "Rejections (compile_reject) are features a toolchain does not "
680
+ "support, not failures. Flaky = the repeats differed (counted "
681
+ "in the worst class).", ""]
682
+ tcs = list(s["classes"])
683
+ L += _table(["class"] + tcs,
684
+ [[c] + [f"{s['classes'][tc].get(c, 0)}"
685
+ + (f" ({s['flaky'][tc][c]} flaky)"
686
+ if s["flaky"][tc].get(c) else "")
687
+ for tc in tcs] for c in fe.CLASSES])
688
+ if s.get("base_features"):
689
+ L += ["", "## Base-language features", "",
690
+ "Per base-language feature (offload.engine.fuzz_base): the "
691
+ "programs that have it, and per toolchain agree / "
692
+ "compile_reject / ice / wrong_code / run_error (other classes "
693
+ "in parentheses when present).", ""]
694
+ L += base_table(s["base_features"], tcs)
695
+ L += ["", "## Known findings rediscovered", ""]
696
+ for k, v in s["known_findings"].items():
697
+ L.append(f"- {k}: {v['programs']} programs "
698
+ f"(seeds {', '.join(map(str, v['seeds']))})")
699
+ L += ["", "## Distinct minimized failures", ""]
700
+ if s["distinct_failures"]:
701
+ L += _table(["file", "toolchain", "kind", "also fails on",
702
+ "lines", "expected", "observed"],
703
+ [[f"`{d['file']}`", d["toolchain"], d["kind"],
704
+ ", ".join(d.get("also_fails_on") or []) or "-",
705
+ f"{d['lines_before']} -> {d['lines_after']}",
706
+ d.get("expected", ""), d.get("observed", "")[:160]]
707
+ for d in s["distinct_failures"]])
708
+ else:
709
+ L.append("(none minimized yet)")
710
+ others = [m for m in s["minimized"] if m.get("status") != "minimized"]
711
+ if others:
712
+ L += ["", "Not minimized:", ""]
713
+ L += [f"- seed {m['seed']} {m['toolchain']} {m['kind']}: "
714
+ f"{m['status']} {m.get('why', m.get('covered_by', ''))}"
715
+ for m in others]
716
+ L += ["", "## Wrong code (all programs)", ""]
717
+ for tc, w in s["wrong_code"].items():
718
+ L.append(f"- {tc}: {w['programs']} programs"
719
+ + (f" (seeds {', '.join(map(str, w['seeds'][:20]))})"
720
+ if w["seeds"] else ""))
721
+ L += ["", "## Internal compiler errors (deduplicated by message)", ""]
722
+ L += _table(["toolchain", "programs", "message", "seeds"],
723
+ [[i["toolchain"], i["programs"], i["signature"][:150],
724
+ ", ".join(map(str, i["seeds"][:5]))] for i in s["ice"]])
725
+ L += ["", "## Run errors, timeouts, host fallbacks", ""]
726
+ L += _table(["toolchain", "class", "programs", "reason", "seeds"],
727
+ [[o["toolchain"], o["class"], o["programs"],
728
+ o["reason"][:150], ", ".join(map(str, o["seeds"][:5]))]
729
+ for o in s["other_failures"]])
730
+ L += ["", "## Features and feature pairs most associated with failures",
731
+ "", "Among programs the toolchain compiled (or crashed on). Lift = "
732
+ "the rate of the class among programs with the feature (pair) "
733
+ "over the toolchain's overall rate; a pair is listed only when it "
734
+ "beats both of its features alone by 25%.", ""]
735
+ for tc in tcs:
736
+ for c in ("wrong_code", "ice", "run_error"):
737
+ singles = s["failure_features"][tc][c]
738
+ pairs = s["feature_pairs"][tc][c]
739
+ if not singles and not pairs:
740
+ continue
741
+ L += [f"### {tc}: {c}", ""]
742
+ if singles:
743
+ L.append("Single features: " + "; ".join(
744
+ f"{f['feature']} ({f['hits']}/{f['programs']}, lift "
745
+ f"{f['lift']})" for f in singles))
746
+ L.append("")
747
+ if pairs:
748
+ L += _table(["feature pair", "programs", c, "rate",
749
+ "best single rate", "lift"],
750
+ [[" + ".join(r["pair"]), r["programs"],
751
+ r["failures"], r["rate"],
752
+ r["best_single_rate"], r["lift"]]
753
+ for r in pairs[:8]])
754
+ L.append("")
755
+ L += ["## Compile rejections (features not supported)", ""]
756
+ for tc in tcs:
757
+ msgs = s["compile_reject_messages"][tc][:12]
758
+ if not msgs:
759
+ continue
760
+ L += [f"### {tc}", ""]
761
+ L += _table(["programs", "message"],
762
+ [[m["programs"], m["message"][:170]] for m in msgs])
763
+ feats = s["compile_reject_features"][tc][:8]
764
+ if feats:
765
+ L += ["", "Features most associated with rejection: " + "; ".join(
766
+ f"{f['feature']} ({f['hits']}/{f['programs']})"
767
+ for f in feats)]
768
+ L.append("")
769
+ g = s["generator_rejects"]
770
+ L += ["## Generator rejects", "",
771
+ "Programs failing a legality check are never run. Causes "
772
+ "(`rules`: a 5.2 rule of offload.engine.rules fired, a generator or "
773
+ "rule bug; `flang`: AFAR flang's frontend refused a program the "
774
+ "rules and gfortran accept; see the report for which of these "
775
+ "are flang's errors):", ""]
776
+ L += _table(["count", "cause", "seeds"],
777
+ [[v["count"], c[:170], ", ".join(map(str, v["seeds"][:5]))]
778
+ for c, v in g["by_cause"].items()])
779
+ if s["flaky_programs"]:
780
+ L += ["", "## Flaky results", ""]
781
+ L += [f"- seed {f['seed']} {f['toolchain']}: "
782
+ + " | ".join(f["runs"])[:300] for f in s["flaky_programs"]]
783
+ L += _host_section(s)
784
+ Path(md_path).parent.mkdir(parents=True, exist_ok=True)
785
+ Path(md_path).write_text("\n".join(L) + "\n")
786
+ return s
787
+
788
+
789
+ def _host_section(s: dict) -> list[str]:
790
+ checks = sorted(s["host_ref_failed"] + s["host_mismatch"],
791
+ key=lambda h: h["seed"])
792
+ if not checks:
793
+ return []
794
+ tcs = list(s["classes"]) or list(REPORT_ORDER)
795
+ nf = len(s["host_ref_failed"])
796
+ L = ["", "## Appendix: host reference checks (not offload findings)",
797
+ "",
798
+ "Device offload only: host runs (OMP_TARGET_OFFLOAD="
799
+ "disabled) and the sequential elision are references for the "
800
+ "expected value, never measurements of a toolchain. A "
801
+ "host_path_failure below is recorded data (results/fuzz/<run>/"
802
+ "summary.json), not an offload finding, and it counts nowhere "
803
+ "in the tables above.", "",
804
+ f"The reference host run (OMP_TARGET_OFFLOAD=disabled, the first "
805
+ f"toolchain that compiled) failed for {nf} programs "
806
+ f"(host_ref_failed) and printed another checksum than the model "
807
+ f"for {len(s['host_mismatch'])} (host_mismatch). For each, every "
808
+ "toolchain whose build compiled ran it on the host"
809
+ + (" (rebuilt and run twice: results/fuzz/"
810
+ f"{s['run_id']}/{fe.HOSTCHECK})"
811
+ if any(h["rechecked"] for h in checks) else "")
812
+ + ", and the sequential elision (offload.engine.expected) ran where "
813
+ "it applies. Rule: **valid** when at least one of them "
814
+ "prints the model's checksum; the host builds that ran and did "
815
+ "not are `host_path_failure` records (a host-path compiler or "
816
+ "runtime bug: out of scope, not an offload finding). "
817
+ "**noncompliant** when none does (a generator or "
818
+ "model defect): excluded from the findings and the tallies above. "
819
+ "A toolchain whose build does not compile has no host build "
820
+ "('no host build'). Values are host checksums. Scope: only these "
821
+ "programs had every toolchain's host build run; for the others "
822
+ "only the reference toolchain's host run exists, so "
823
+ "host_path_failure counts are a lower bound.", ""]
824
+ rows = []
825
+ for h in checks:
826
+ cells = []
827
+ for t in tcs:
828
+ v = h["host"].get(t, "-")
829
+ if isinstance(v, int):
830
+ cells.append(f"**{v}**" if v == h["expected"] else str(v))
831
+ else:
832
+ cells.append(re.sub(r"^no host build: ", "no build: ",
833
+ str(v))[:40])
834
+ el = h["elision"] or "-"
835
+ if el == f"checksum={h['expected']}":
836
+ el = f"**{el}**"
837
+ rows.append([h["seed"], h["reference"], h["tc"] or "-",
838
+ h["expected"]] + cells +
839
+ [el[:60], h["validity"],
840
+ ", ".join(h["host_path_failure"]) or "-"])
841
+ L += _table(["seed", "reference", "ref tc", "model"] +
842
+ [f"{t} host" for t in tcs] +
843
+ ["elision", "validity", "host_path_failure"], rows)
844
+ L += ["", "### host_path_failure (valid programs; host-path "
845
+ "failures, out of scope)", ""]
846
+ hp = s["host_path_failure"]
847
+ if hp:
848
+ L += [f"- {t}: {v['programs']} programs (seeds "
849
+ f"{', '.join(map(str, v['seeds']))})" for t, v in hp.items()]
850
+ else:
851
+ L.append("(none)")
852
+ L += ["", "### Noncompliant programs (generator/model investigation)",
853
+ ""]
854
+ if s["noncompliant"]:
855
+ L += ["No available host build prints the model's checksum. "
856
+ "Their device classes (not counted anywhere above):", ""]
857
+ L += [f"- seed {n['seed']}: model {n['expected']}; host "
858
+ + ", ".join(f"{t} {v}" for t, v in n["host"].items())
859
+ + f"; elision {n['elision'] or '-'}; device "
860
+ + ", ".join(f"{t} {c}" for t, c in n["classes"].items())
861
+ + (f"; minimized (withdrawn): {', '.join(n['minimized'])}"
862
+ if n["minimized"] else "")
863
+ for n in s["noncompliant"]]
864
+ else:
865
+ L.append("(none)")
866
+ return L
867
+
868
+
869
+ def finding_text(seed: int, failure, gen_version: str, source: str,
870
+ verdict: str, reason: str = "", also=()) -> str:
871
+ """A minimized reproducer's file: the finding header (the failure, and
872
+ the expected and observed values of the minimized program from the
873
+ oracle's verdict) and the minimized source without the generator's
874
+ header, which describes the original program."""
875
+ from offload.engine import fuzz_min as fm
876
+ from offload.engine.hdrwrap import wrap_line
877
+ exp, obs = expected_observed(failure.kind, verdict, reason)
878
+ return (fm.finding_header(seed, failure, exp, obs, gen_version) +
879
+ ("\n".join(wrap_line(f"! also fails on: {', '.join(also)}")) +
880
+ "\n" if also else "") +
881
+ fm.strip_header(source))
882
+
883
+
884
+ def expected_observed(kind: str, verdict: str, reason: str = ""
885
+ ) -> tuple[str, str]:
886
+ """The finding header's expected and observed lines from the
887
+ oracle's verdict."""
888
+ if kind == "wrong_code":
889
+ return (f"the host reference checksum "
890
+ f"({verdict.split(';')[-1].strip()})",
891
+ verdict.split(";")[0])
892
+ if kind == "ice":
893
+ return "compiles", f"internal compiler error: {reason[:160]}"
894
+ return "runs to completion (the host run does)", verdict
895
+
896
+
897
+ _KEYED = ("! failure:", "! expected:", "! observed:", "! also fails on:")
898
+
899
+
900
+ def _unfold_keys(lines: list) -> list:
901
+ """Header lines with the `! ` continuations of the keyed lines
902
+ joined back (the caller wraps again); other lines stay as they are."""
903
+ out = []
904
+ for ln in lines:
905
+ if ln.startswith("! ") and ln[4:5] != " " and out and \
906
+ out[-1].startswith(_KEYED):
907
+ out[-1] += " " + ln[4:]
908
+ else:
909
+ out.append(ln)
910
+ return out
911
+
912
+
913
+ def refine_run(run_dir: Path, workers: int = 6, log=print,
914
+ kinds=("ice", "wrong_code", "run_error")) -> list[dict]:
915
+ """Minimize every minimized finding once more (a later fix of the
916
+ minimizer, or a second pass, may shrink it further); the file, its
917
+ hash and line count are updated in place, with the header's expected
918
+ and observed lines; an "also fails on" line was measured on the old
919
+ body and is kept only as "before refinement". A stored reference in
920
+ the failing compiler's family is dropped (sequential elision when
921
+ none is left)."""
922
+ from offload.engine import fuzz_min as fm
923
+ run_dir = Path(run_dir)
924
+ state = _minimized(run_dir)
925
+ for m in state:
926
+ if m.get("status") != "minimized" or m["kind"] not in kinds:
927
+ continue
928
+ path = ROOT / m["file"]
929
+ text = path.read_text()
930
+ k = 0
931
+ lines = text.splitlines()
932
+ while k < len(lines) and lines[k].startswith("!") and \
933
+ not lines[k].startswith("!$"):
934
+ k += 1
935
+ body = "\n".join(lines[k:]) + "\n"
936
+ failure = fm.Failure(m["toolchain"], m["kind"], m["signature"],
937
+ 0 if "ran_on_host=1" not in m.get("verdict", "")
938
+ else 1)
939
+ refs = None
940
+ if m["kind"] != "ice":
941
+ refs = fm.refs_for(m["toolchain"], m.get("references")) or \
942
+ [fm.ELISION_REF]
943
+ m["references"] = refs
944
+ try:
945
+ res = fm.minimize(body, fm.Oracle(failure, refs),
946
+ workers=workers)
947
+ except ValueError as e:
948
+ log(f"{m['file']}: no longer reproduces: {e}")
949
+ m["refine"] = f"not reproduced: {str(e)[:200]}"
950
+ continue
951
+ new = fm.strip_header(res.source)
952
+ if len(new.splitlines()) < len(body.splitlines()):
953
+ exp, obs = expected_observed(m["kind"], res.verdict,
954
+ m.get("observed", ""))
955
+ from offload.engine.hdrwrap import wrap_line
956
+ head = []
957
+ for ln in _unfold_keys(lines[:k]):
958
+ if ln.startswith("! expected:") and m["kind"] != "ice":
959
+ ln = f"! expected: {exp}"
960
+ elif ln.startswith("! observed:") and m["kind"] != "ice":
961
+ ln = f"! observed: {obs}"
962
+ elif ln.startswith("! also fails on:"):
963
+ ln = ln.replace("! also fails on:", "! also failed on "
964
+ "(before refinement):", 1)
965
+ head.extend(wrap_line(ln))
966
+ path.write_text("\n".join(head) + "\n" + new)
967
+ if m["kind"] != "ice":
968
+ m.update(expected=exp, observed=obs, verdict=res.verdict)
969
+ if m.get("also_fails_on"):
970
+ m["also_failed_before_refinement"] = m.pop("also_fails_on")
971
+ m["lines_after"] = len(new.splitlines())
972
+ m["sha"] = hashlib.sha256(new.encode()).hexdigest()[:16]
973
+ log(f"{m['file']}: {len(body.splitlines())} -> "
974
+ f"{m['lines_after']} lines")
975
+ (run_dir / "minimized.json").write_text(json.dumps(state, indent=1)
976
+ + "\n")
977
+ return state
978
+
979
+
980
+ # --- the base-language review --------------------------------------------------
981
+
982
+ STAGES = {"types": "1: element types and kinds",
983
+ "derived": "2: derived types",
984
+ "alloc": "3: allocatable, pointer, target, sections, procedures",
985
+ "declare": "4: declare target, mapper, user reduction, modules",
986
+ "multitu": "5: multiple translation units"}
987
+
988
+
989
+ def _pct(k: int, n: int) -> str:
990
+ return f"{100 * k / n:.0f}%" if n else "-"
991
+
992
+
993
+ def _copy_mode_section(run_dirs: list, sums: list, tcs: list) -> list:
994
+ """The copy-mode comparison of the base-language review: for each stage
995
+ run with a sibling ``x0-<group>`` campaign (the same seeds at
996
+ HSA_XNACK=0, in a flux allocation with THP on), the per-toolchain class
997
+ changes among the seeds judged in both; and, from ``thp_split.json``
998
+ next to the runs, the verdicts of the reruns that separate THP from the
999
+ memory mode. Empty when no stage has an x0 run."""
1000
+ rows, changes = [], []
1001
+ for d, s in zip(run_dirs, sums):
1002
+ g = ", ".join(s.get("base") or [])
1003
+ x0 = Path(d).parent / f"x0-{g}"
1004
+ if not g or not (x0 / "summary.json").exists():
1005
+ continue
1006
+ xs = json.loads((x0 / "summary.json").read_text())
1007
+ ok = {p.seed: p for p in fe.load(d)[0]
1008
+ if p.check == "ok" and p.validity != "noncompliant"}
1009
+ okx = {p.seed: p for p in fe.load(x0)[0]
1010
+ if p.check == "ok" and p.validity != "noncompliant"}
1011
+ both = sorted(set(ok) & set(okx))
1012
+ moved = Counter()
1013
+ for seed in both:
1014
+ for t in tcs:
1015
+ a, b = ok[seed].results.get(t), okx[seed].results.get(t)
1016
+ if a and b and a.cls != b.cls:
1017
+ moved[(t, a.cls, b.cls)] += 1
1018
+ rows.append([f"`{s['run_id']}`", f"`{xs['run_id']}`", len(both),
1019
+ len(xs["noncompliant"]),
1020
+ f"{xs['all_agree']} ({s['all_agree']})",
1021
+ sum(moved.values())])
1022
+ if moved:
1023
+ changes.append(f"`{s['run_id']}`: " + "; ".join(
1024
+ f"{t}: {a} -> {b} {n}"
1025
+ for (t, a, b), n in sorted(moved.items())))
1026
+ if not rows:
1027
+ return []
1028
+ L = ["## Copy mode (HSA_XNACK=0)", "",
1029
+ "Each stage campaign run again on the same seeds at HSA_XNACK=0 "
1030
+ "(copy mode) in a flux allocation with THP on. The stage runs above "
1031
+ "used HSA_XNACK=1 on the interactive node with THP off, so a change "
1032
+ "here mixes the memory mode with THP (see the split below when "
1033
+ "present). Per run: seeds judged in both, noncompliant at "
1034
+ "HSA_XNACK=0, programs that agree on every toolchain at "
1035
+ "HSA_XNACK=0 (at HSA_XNACK=1 in parentheses), and the toolchain "
1036
+ "cells whose class changed.", ""]
1037
+ L += _table(["run", "copy-mode run", "seeds in both",
1038
+ "noncompliant", "agree on all", "cells changed"], rows)
1039
+ L += [""] + [f"- {c}" for c in changes] + [""]
1040
+ split = Path(run_dirs[0]).parent / "thp_split.json"
1041
+ if split.exists():
1042
+ sp = json.loads(split.read_text())
1043
+ n = Counter(e["verdict"] for e in sp["seeds"])
1044
+ L += ["### THP or memory mode", "",
1045
+ sp.get("note", "Seeds that crashed at HSA_XNACK=1 and agree at "
1046
+ "HSA_XNACK=0, run again at HSA_XNACK=1 in two flux "
1047
+ "allocations, THP on and THP off."), ""]
1048
+ L += _table(["verdict", "seeds"], [[v, c] for v, c in
1049
+ sorted(n.items())])
1050
+ L += [""] + [f"- {v}: " + ", ".join(
1051
+ f"{e['group']} {e['seed']}" for e in sp["seeds"]
1052
+ if e["verdict"] == v) for v in sorted(n)] + [""]
1053
+ sigs = defaultdict(list)
1054
+ for e in sp["seeds"]:
1055
+ if e["verdict"] == "xnack1" and e.get("signature"):
1056
+ sigs[e["signature"]].append(f"{e['group']} {e['seed']}")
1057
+ if sigs:
1058
+ fam = sp.get("families", {})
1059
+ L += ["Runtime failure of the xnack1 seeds:", ""]
1060
+ L += _table(["failure", "seeds", "which", "family"],
1061
+ [[f"`{s}`", len(v), ", ".join(v), fam.get(s, "")]
1062
+ for s, v in sorted(sigs.items(),
1063
+ key=lambda x: -len(x[1]))])
1064
+ L += [""]
1065
+ return L
1066
+
1067
+
1068
+ def _elision_section(run_dirs: list, sums: list) -> list:
1069
+ """The sequential elision of each run's programs (``elision.jsonl``,
1070
+ written by ``tools/campaigns/fuzz.py elide``): programs, how many it applies to
1071
+ (offload.engine.expected.elision_applicability), how many of those print
1072
+ the model's checksum, differ from it, or gave no value, and the most
1073
+ frequent reasons it does not apply. Empty when no run has the file."""
1074
+ rows, odd = [], []
1075
+ for d, s in zip(run_dirs, sums):
1076
+ path = Path(d) / fe.ELISION_FILE
1077
+ if not path.exists():
1078
+ continue
1079
+ recs = [json.loads(ln) for ln in path.read_text().splitlines()
1080
+ if ln.strip()]
1081
+ app = [r for r in recs if r["applicable"]]
1082
+ same = [r for r in app if r.get("value") == r["expected"]]
1083
+ diff = [r for r in app if r.get("value") is not None and
1084
+ r["value"] != r["expected"]]
1085
+ none = [r for r in app if r.get("value") is None]
1086
+ why = Counter()
1087
+ for r in recs:
1088
+ if not r["applicable"]:
1089
+ for x in r.get("why", "").split("; "):
1090
+ why[re.sub(r"\s*\[.*?\]", "",
1091
+ re.sub(r"line \d+", "line N", x))[:120]] += 1
1092
+ rows.append([f"`{s['run_id']}`", len(recs), len(app), len(same),
1093
+ len(diff), len(none),
1094
+ "; ".join(f"{k} ({n})" for k, n in why.most_common(4))
1095
+ or "-"])
1096
+ odd += [f"`{s['run_id']}` seed {r['seed']}: elision "
1097
+ f"{r['value']}, model {r['expected']}" for r in diff]
1098
+ odd += [f"`{s['run_id']}` seed {r['seed']}: {r.get('why', '')[:120]}"
1099
+ for r in none]
1100
+ if not rows:
1101
+ return []
1102
+ L = ["## Sequential elision", "",
1103
+ "The programs built without OpenMP (gfortran and amdflang) against "
1104
+ "a sequential omp_lib and run on the host, where "
1105
+ "offload.engine.expected.elision_applicability proves that sequential "
1106
+ "execution gives the OpenMP result (ELISION_RULE; structures are "
1107
+ "tracked component by component, pointers as aliases of their "
1108
+ "targets, internal subroutines inlined). Elision is the model's "
1109
+ "independent partner: a value different from the model's is a "
1110
+ "model bug or an analysis bug until shown otherwise.", ""]
1111
+ L += _table(["run", "programs", "elision applies", "= model",
1112
+ "differs", "no value", "most frequent reasons it does not "
1113
+ "apply"], rows)
1114
+ L += [""] + ([f"- {x}" for x in odd] + [""] if odd else [])
1115
+ return L
1116
+
1117
+
1118
+ def write_base_review(run_dirs: list, md_path: Path) -> dict:
1119
+ """data/reports/fuzz-base-language.md from the stage campaigns
1120
+ (summary.json of each, written by write_report)."""
1121
+ from offload.engine.fuzz_base import EXCLUSIONS, GROUP_SWARM
1122
+ sums = []
1123
+ for d in run_dirs:
1124
+ d = Path(d)
1125
+ sums.append(json.loads((d / "summary.json").read_text()))
1126
+ tcs = list(fe.TOOLCHAIN_ORDER) # the stage campaigns ran these
1127
+ L = ["# Base-language axis of the fuzz generator", "",
1128
+ "Generator `fuzz-3` (offload.engine.fuzz, offload.engine.fuzz_base) adds "
1129
+ "base-language groups to the Csmith-style OpenMP 5.2 offload "
1130
+ "generator, one group per stage, switchable per campaign "
1131
+ "(`tools/campaigns/fuzz.py run --base-features <group>`); without a group a "
1132
+ "fuzz-3 program is the fuzz-2 program of its seed, and fuzz-1/fuzz-2 "
1133
+ "seeds replay unchanged. Every program passes offload.engine.rules, "
1134
+ "gfortran -std=f2008 -fsyntax-only, AFAR flang's frontend, and the "
1135
+ "definedness check (the program without OpenMP built by gfortran "
1136
+ "with -fcheck=all, twice with different fills of uninitialised "
1137
+ "storage, must print the model's checksum both times); each "
1138
+ "parallel loop of the model is checked for races. The maintainer's "
1139
+ "host-run rule applies (a program that no host build or sequential "
1140
+ "elision prints the model's value for is noncompliant and left out). "
1141
+ "Campaigns: 300 programs each, toolchains afar, cce19, cce20, cce21, "
1142
+ "-O2, HSA_XNACK=1, OMP_TARGET_OFFLOAD=mandatory; per-campaign "
1143
+ "reports data/reports/fuzz-<run>.md, minimized reproducers "
1144
+ "data/findings/fuzz/<run>-<seed>-<toolchain>.f90 (triage: "
1145
+ "data/findings/fuzz/README.md).", ""]
1146
+ L += ["## Campaigns", ""]
1147
+ rows = []
1148
+ for s in sums:
1149
+ g = ", ".join(s.get("base") or [])
1150
+ t = s["timing"]
1151
+ rows.append([f"`{s['run_id']}`", STAGES.get(g, g) if g else
1152
+ "control: no base group (the fuzz-2 programs)",
1153
+ s["generated"],
1154
+ s["judged"], len(s["noncompliant"]),
1155
+ s["generator_rejects"]["total"], s["all_agree"],
1156
+ t["campaign_seconds"]])
1157
+ L += _table(["run", "stage", "programs", "judged", "noncompliant",
1158
+ "generator rejects", "agree on all", "wall s"], rows)
1159
+ L += ["", "## Classes per stage and toolchain", "",
1160
+ "Counts among the judged programs (rate of the judged in "
1161
+ "parentheses).", ""]
1162
+ for c in ("agree", "compile_reject", "ice", "wrong_code", "run_error",
1163
+ "timeout", "host_fallback", "harness_error"):
1164
+ rows = []
1165
+ for s in sums:
1166
+ n = s["judged"]
1167
+ rows.append([f"`{s['run_id']}`"] + [
1168
+ f"{s['classes'].get(t, {}).get(c, 0)} "
1169
+ f"({_pct(s['classes'].get(t, {}).get(c, 0), n)})"
1170
+ for t in tcs])
1171
+ if any(any(not x.startswith("0 ") for x in r[1:]) for r in rows):
1172
+ L += [f"### {c}", ""] + _table(["run"] + tcs, rows) + [""]
1173
+ ctrl = next((x for x in sums if not x.get("base")), None)
1174
+ if ctrl is not None:
1175
+ L += ["## Against the control", "",
1176
+ f"The control `{ctrl['run_id']}` runs the same seeds without a "
1177
+ "base-language group (the fuzz-2 programs), so a stage's "
1178
+ "excess over it is what its group adds. Per toolchain: the "
1179
+ "stage's failure rate (wrong_code + run_error + timeout + "
1180
+ "host_fallback, among the judged programs the toolchain "
1181
+ "compiled) and, in parentheses, the control's.", ""]
1182
+
1183
+ def frate(x, t):
1184
+ c = x["classes"].get(t, {})
1185
+ comp = sum(c.values()) - c.get("compile_reject", 0) - \
1186
+ c.get("harness_error", 0) - c.get("ice", 0)
1187
+ bad = sum(c.get(k, 0) for k in ("wrong_code", "run_error",
1188
+ "timeout", "host_fallback"))
1189
+ return bad, comp
1190
+ rows = []
1191
+ for x in sums:
1192
+ if x is ctrl:
1193
+ continue
1194
+ cells = []
1195
+ for t in tcs:
1196
+ b, c = frate(x, t)
1197
+ b0, c0 = frate(ctrl, t)
1198
+ cells.append(f"{b}/{c} = {_pct(b, c)} ({_pct(b0, c0)})")
1199
+ rows.append([f"`{x['run_id']}`"] + cells)
1200
+ L += _table(["run"] + tcs, rows) + [""]
1201
+ L += _copy_mode_section(run_dirs, sums, tcs)
1202
+ L += _elision_section(run_dirs, sums)
1203
+ L += ["## Coverage and rates by base-language feature", "",
1204
+ "Per feature: programs with it; per toolchain the agree rate among "
1205
+ "those it compiled, then wrong_code / ice / run_error counts "
1206
+ "(compile rejections are features not supported, not failures). "
1207
+ "Features in fewer than 10 programs are listed by name only.", ""]
1208
+ for s in sums:
1209
+ rates = s.get("base_features", {})
1210
+ g = ", ".join(s["base"])
1211
+ L += [f"### `{s['run_id']}` ({STAGES.get(g, g) if g else 'control'})",
1212
+ ""]
1213
+ rows, few = [], []
1214
+ for f, v in rates.items():
1215
+ if v["programs"] < 10:
1216
+ few.append(f"{f[5:]} ({v['programs']})")
1217
+ continue
1218
+ cells = []
1219
+ for t in tcs:
1220
+ c = v["classes"].get(t, {})
1221
+ compiled = sum(c.values()) - c.get("compile_reject", 0) - \
1222
+ c.get("harness_error", 0)
1223
+ cells.append(f"{_pct(c.get('agree', 0), compiled)} "
1224
+ f"{c.get('wrong_code', 0)}/{c.get('ice', 0)}/"
1225
+ f"{c.get('run_error', 0)}")
1226
+ rows.append([f[5:], v["programs"]] + cells)
1227
+ L += _table(["feature", "programs"] + [f"{t} agree w/i/r"
1228
+ for t in tcs], rows)
1229
+ if few:
1230
+ L += ["", "Fewer than 10 programs: " + "; ".join(few)]
1231
+ lifts = []
1232
+ for t in tcs:
1233
+ for c in ("wrong_code", "ice", "run_error"):
1234
+ for f in s.get("failure_features", {}).get(t, {}).get(c, []):
1235
+ if f["feature"].startswith("base:"):
1236
+ lifts.append(f"{t} {c}: {f['feature'][5:]} "
1237
+ f"({f['hits']}/{f['programs']}, lift "
1238
+ f"{f['lift']})")
1239
+ if lifts:
1240
+ L += ["", "Base-language features among the most associated "
1241
+ "with a failure class (lift over the toolchain's rate): "
1242
+ + "; ".join(lifts)]
1243
+ L.append("")
1244
+ L += ["## Minimized reproducers", ""]
1245
+ rows = []
1246
+ for s in sums:
1247
+ for d in s.get("distinct_failures", []):
1248
+ rows.append([f"`{s['run_id']}`", f"`{d['file']}`",
1249
+ d["toolchain"], d["kind"],
1250
+ ", ".join(d.get("also_fails_on") or []) or "-",
1251
+ f"{d['lines_before']} -> {d['lines_after']}"])
1252
+ for m in s.get("minimized", []):
1253
+ if m.get("status") != "minimized":
1254
+ rows.append([f"`{s['run_id']}`", f"seed {m['seed']}",
1255
+ m["toolchain"], m["kind"], "-",
1256
+ f"{m['status']}: "
1257
+ f"{(m.get('why') or m.get('covered_by') or '')[:80]}"])
1258
+ L += _table(["run", "file", "toolchain", "kind", "also fails on",
1259
+ "lines"], rows) if rows else ["(none)"]
1260
+ L += ["", "## Exclusions", "",
1261
+ "What each group does not generate, because the model could not "
1262
+ "predict it or the spec leaves it open (offload.engine.fuzz_base "
1263
+ "EXCLUSIONS):", ""]
1264
+ for g, items in EXCLUSIONS.items():
1265
+ if g not in STAGES: # a later group (fuzz-5 oop): not in this review
1266
+ continue
1267
+ L += [f"### {g} (stage {STAGES[g]})", ""] + [f"- {x}" for x in items]
1268
+ L += ["", "Sub-features (swarm): " + ", ".join(GROUP_SWARM[g]), ""]
1269
+ Path(md_path).write_text("\n".join(L) + "\n")
1270
+ return {"runs": [s["run_id"] for s in sums]}