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.
- offload/__init__.py +10 -0
- offload/__main__.py +5 -0
- offload/_bundle.py +74 -0
- offload/_root/catalog/acc/claims.yaml +197 -0
- offload/_root/catalog/acc/clauses.yaml +391 -0
- offload/_root/catalog/acc/no_oracle.yaml +89 -0
- offload/_root/catalog/acc/out_of_scope.yaml +17 -0
- offload/_root/catalog/acc/rules.yaml +433 -0
- offload/_root/catalog/acc/semantic_atoms.yaml +27 -0
- offload/_root/catalog/acc/skeleton.yaml +1567 -0
- offload/_root/catalog/acc/spec_overrides.yaml +72 -0
- offload/_root/catalog/later_forms.yaml +76 -0
- offload/_root/catalog/machines.yaml +218 -0
- offload/_root/catalog/omp/claims.yaml +2047 -0
- offload/_root/catalog/omp/clauses.yaml +914 -0
- offload/_root/catalog/omp/derivations.yaml +177 -0
- offload/_root/catalog/omp/memory_modes.yaml +40 -0
- offload/_root/catalog/omp/no_oracle.yaml +373 -0
- offload/_root/catalog/omp/omp50_delta.yaml +377 -0
- offload/_root/catalog/omp/out_of_scope.yaml +64 -0
- offload/_root/catalog/omp/port_equivalence.yaml +352 -0
- offload/_root/catalog/omp/rules.yaml +3131 -0
- offload/_root/catalog/omp/rules_coverage.yaml +9939 -0
- offload/_root/catalog/omp/semantic_atoms.yaml +34 -0
- offload/_root/catalog/omp/skeleton.yaml +9181 -0
- offload/_root/catalog/omp/spec_overrides.yaml +932 -0
- offload/_root/catalog/toolchains.yaml +472 -0
- offload/_root/catalog/vendor_claims_generic.yaml +40925 -0
- offload/_root/data/canuse/b.json +1 -0
- offload/_root/data/canuse/c.json +1 -0
- offload/_root/data/canuse/columns.json +1 -0
- offload/_root/data/canuse/d.json +1 -0
- offload/_root/data/canuse/f.json +1 -0
- offload/_root/data/canuse/index.json +1 -0
- offload/_root/data/canuse/p.json +1 -0
- offload/_root/data/compilers/afar.json +1 -0
- offload/_root/data/compilers/cce19.json +1 -0
- offload/_root/data/compilers/cce20.json +1 -0
- offload/_root/data/compilers/cce21.json +1 -0
- offload/_root/data/compilers/cce21_4.json +1 -0
- offload/_root/data/compilers/gcc.json +1 -0
- offload/_root/data/compilers/gcc_sm80.json +1 -0
- offload/_root/data/compilers/nvhpc.json +1 -0
- offload/_root/data/compilers/nvhpc269.json +1 -0
- offload/_root/data/findings/AUTHORING.md +107 -0
- offload/_root/data/findings/README.md +33 -0
- offload/_root/data/findings/afar-c-error-directive-in-target-link.c +37 -0
- offload/_root/data/findings/afar-c-lastprivate-distribute-parallel-for-small-type.c +56 -0
- offload/_root/data/findings/afar-c-teams-distribute-reduction-first-team.c +59 -0
- offload/_root/data/findings/afar-c-update-iterator-copy-mode.c +45 -0
- offload/_root/data/findings/afar-c-xnack1-target-is-present.c +31 -0
- offload/_root/data/findings/afar-cce19-character-defaultmap.f90 +27 -0
- offload/_root/data/findings/afar-cce19-task-in-target-ice.f90 +23 -0
- offload/_root/data/findings/afar-clang-requires-device-safesync-hang.c +24 -0
- offload/_root/data/findings/afar-flang-firstprivate-map-two-targets.f90 +34 -0
- offload/_root/data/findings/afar-flang-loop-bind-teams-reduction.f90 +27 -0
- offload/_root/data/findings/afar-flang-task-reduction-max.f90 +31 -0
- offload/_root/data/findings/afar-flang-thread-limit-target-parallel-do.f90 +22 -0
- offload/_root/data/findings/afar-linear-ref-omp50.f90 +29 -0
- offload/_root/data/findings/afar-loop-bind-thread-in-teams.f90 +44 -0
- offload/_root/data/findings/afar-nontemporal-assumed-shape-ice.f90 +38 -0
- offload/_root/data/findings/afar-udr-derived-type-link.f90 +41 -0
- offload/_root/data/findings/afar-xnack1-atomic-min-nested-parallel.f90 +53 -0
- offload/_root/data/findings/afar-xnack1-present-not-enforced.f90 +36 -0
- offload/_root/data/findings/afar-xnack1-target-is-present.f90 +47 -0
- offload/_root/data/findings/apps/afar-cce-teams-private-array-nested-parallel-wrong.f90 +100 -0
- offload/_root/data/findings/apps/cce20-device-link-infer-address-spaces-crash.f90 +159 -0
- offload/_root/data/findings/apps/cce21-device-link-agpr-copy-mfma-assert.f90 +343 -0
- offload/_root/data/findings/apps/cce21-private-array-loaded-subscript-wrong.f90 +113 -0
- offload/_root/data/findings/apps/controls/bubble-simple-rddot.f90 +284 -0
- offload/_root/data/findings/apps/controls/bubble-two-substeps.f90 +287 -0
- offload/_root/data/findings/apps/controls/cbc-inline.f90 +97 -0
- offload/_root/data/findings/apps/controls/cbc-integers.f90 +91 -0
- offload/_root/data/findings/apps/controls/cbc-only-density.f90 +97 -0
- offload/_root/data/findings/apps/controls/cbc-only-velocity.f90 +97 -0
- offload/_root/data/findings/apps/controls/gcc-acc-c-tile-control.c +26 -0
- offload/_root/data/findings/apps/controls/gcc-acc-tile-control.f90 +29 -0
- offload/_root/data/findings/apps/controls/private-array-subscript-probes.f90 +45 -0
- offload/_root/data/findings/apps/controls/teams-private-array-read-par.f90 +31 -0
- offload/_root/data/findings/apps/controls/teams-private-array-seq.f90 +30 -0
- offload/_root/data/findings/apps/controls/teams-private-array-shared.f90 +34 -0
- offload/_root/data/findings/apps/controls/teams-private-array-split.f90 +36 -0
- offload/_root/data/findings/apps/controls/teams-private-array-write-par.f90 +31 -0
- offload/_root/data/findings/apps/gcc-acc-c-tile-partial-tiles-wrong.c +60 -0
- offload/_root/data/findings/apps/gcc-acc-tile-partial-tiles-wrong.f90 +64 -0
- offload/_root/data/findings/catalog/afar-c-complex-reduction-link.c +66 -0
- offload/_root/data/findings/catalog/afar-c-critical-hint-link.c +68 -0
- offload/_root/data/findings/catalog/afar-c-ordered-doacross-link.c +62 -0
- offload/_root/data/findings/catalog/afar-c-reduction-task-link.c +81 -0
- offload/_root/data/findings/catalog/afar-flang-absent-optional-target-crash.f90 +76 -0
- offload/_root/data/findings/catalog/afar-flang-critical-target-parallel-wrong.f90 +74 -0
- offload/_root/data/findings/catalog/afar-flang-dist-schedule-chunk.f90 +80 -0
- offload/_root/data/findings/catalog/afar-flang-linear-parallel-ice.f90 +68 -0
- offload/_root/data/findings/catalog/afar-flang-named-critical-link.f90 +67 -0
- offload/_root/data/findings/catalog/afar-flang-ordered-wrong.f90 +78 -0
- offload/_root/data/findings/catalog/afar-flang-reduction-minus-rejected.f90 +77 -0
- offload/_root/data/findings/catalog/afar-flang-reduction-task-ice.f90 +68 -0
- offload/_root/data/findings/catalog/afar-flang-sections-in-target-ice.f90 +67 -0
- offload/_root/data/findings/catalog/afar-flang-workdistribute-ice.f90 +71 -0
- offload/_root/data/findings/catalog/c-allocate-const-mem-firstprivate-wrong.c +79 -0
- offload/_root/data/findings/catalog/cce-acc-allocate-in-compute-crash.f90 +65 -0
- offload/_root/data/findings/catalog/cce-acc-character-dummy-routine-ice.f90 +81 -0
- offload/_root/data/findings/catalog/cce-acc-loop-seq-in-routine-wrong.f90 +81 -0
- offload/_root/data/findings/catalog/cce-acc-stop-in-compute-crash.f90 +62 -0
- offload/_root/data/findings/catalog/cce-allocators-stack-ice.f90 +81 -0
- offload/_root/data/findings/catalog/cce-atomic-default-mem-order-acquire-release-rejected.f90 +61 -0
- offload/_root/data/findings/catalog/cce-c-allocate-align-link.c +83 -0
- offload/_root/data/findings/catalog/cce-c-allocate-allocator-modifier-rejected.c +77 -0
- offload/_root/data/findings/catalog/cce-c-device-type-directive-name-ice.c +70 -0
- offload/_root/data/findings/catalog/cce-c-dist-schedule-chunk.c +81 -0
- offload/_root/data/findings/catalog/cce-c-f-pointer-device-link.f90 +70 -0
- offload/_root/data/findings/catalog/cce-c-lastprivate-parallel-in-seq-loop-wrong.c +64 -0
- offload/_root/data/findings/catalog/cce-c-long-double-ice.c +61 -0
- offload/_root/data/findings/catalog/cce-c-map-iterator-ice.c +92 -0
- offload/_root/data/findings/catalog/cce-c-motion-iterator-rejected.c +68 -0
- offload/_root/data/findings/catalog/cce-c-ordered-doacross-link.c +64 -0
- offload/_root/data/findings/catalog/cce-c-ordered-link.c +77 -0
- offload/_root/data/findings/catalog/cce-c-recursive-function-ice.c +62 -0
- offload/_root/data/findings/catalog/cce-c-reduction-inscan-ice.c +67 -0
- offload/_root/data/findings/catalog/cce-c-reduction-task-link.c +73 -0
- offload/_root/data/findings/catalog/cce-c-sections-in-target-wrong.c +70 -0
- offload/_root/data/findings/catalog/cce-c-single-masked-task-link.c +66 -0
- offload/_root/data/findings/catalog/cce-c-task-in-target-link.c +75 -0
- offload/_root/data/findings/catalog/cce-c-uses-allocators-traits-rejected.c +71 -0
- offload/_root/data/findings/catalog/cce-flang-allocate-const-mem-ice.f90 +67 -0
- offload/_root/data/findings/catalog/cce-flang-allocate-in-target-crash.f90 +68 -0
- offload/_root/data/findings/catalog/cce-flang-lastprivate-parallel-in-seq-loop-wrong.f90 +83 -0
- offload/_root/data/findings/catalog/cce-flang-stop-in-target-crash.f90 +64 -0
- offload/_root/data/findings/catalog/cce-iterator-link.f90 +67 -0
- offload/_root/data/findings/catalog/cce-linear-lastprivate-ice.f90 +69 -0
- offload/_root/data/findings/catalog/cce-nohost-link.f90 +90 -0
- offload/_root/data/findings/catalog/cce-reduction-inscan-ice.f90 +66 -0
- offload/_root/data/findings/catalog/cce-reduction-task-link.f90 +76 -0
- offload/_root/data/findings/catalog/cce19-reduction-task-addrspacecast-ice.f90 +77 -0
- offload/_root/data/findings/catalog/cce20-c-defaultmap-private-storage-rejected.c +85 -0
- offload/_root/data/findings/catalog/cce20-map-self-rejected.f90 +64 -0
- offload/_root/data/findings/catalog/cce21-c-declare-target-local-rejected.c +73 -0
- offload/_root/data/findings/catalog/cce21-c-target-loop-ice.c +77 -0
- offload/_root/data/findings/catalog/defaultmap-present-private-array-abort.f90 +73 -0
- offload/_root/data/findings/catalog/nvhpc-acc-associate-illegal-address.f90 +66 -0
- offload/_root/data/findings/catalog/nvhpc-c-function-pointer-kernel-missing.c +68 -0
- offload/_root/data/findings/catalog/nvhpc-c-long-double-kernel-missing.c +64 -0
- offload/_root/data/findings/catalog/nvhpc-c-static-local-kernel-missing.c +73 -0
- offload/_root/data/findings/catalog/nvhpc-c-vla-kernel-missing.c +63 -0
- offload/_root/data/findings/catalog/nvhpc-flang-type-bound-kernel-missing.f90 +86 -0
- offload/_root/data/findings/cce-acc-init-set-runtime-assert.f90 +35 -0
- offload/_root/data/findings/cce-acc-reduction-200-int8-scalars-wrong.f90 +1278 -0
- offload/_root/data/findings/cce-acc-routine-bind-module-ice.f90 +35 -0
- offload/_root/data/findings/cce-acc-self-condition-ignored.f90 +17 -0
- offload/_root/data/findings/cce-c-dist-schedule-segv.c +34 -0
- offload/_root/data/findings/cce-c-map-delete-refcount.c +47 -0
- offload/_root/data/findings/cce-c-map-present-assert.c +45 -0
- offload/_root/data/findings/cce-c-openmp45-device-link.c +34 -0
- offload/_root/data/findings/cce-c-parallel-for-in-target.c +73 -0
- offload/_root/data/findings/cce-defaultmap-tofrom-explicit-map.f90 +92 -0
- offload/_root/data/findings/cce-mapper-next-map-copy-back.f90 +48 -0
- offload/_root/data/findings/cce-trim-merge-output-one-character.f90 +40 -0
- offload/_root/data/findings/cce-uses-allocators-traits-omp50.f90 +28 -0
- offload/_root/data/findings/cce19-acc-if-false-link.f90 +17 -0
- offload/_root/data/findings/cce19-c-reduction-63-scalars-one-wrong.c +235 -0
- offload/_root/data/findings/cce19-target-parallel-guarded-loop.f90 +35 -0
- offload/_root/data/findings/cce19-target-parallel-single-ice.f90 +38 -0
- offload/_root/data/findings/cce21-alloc-2e32-sum-wrong.f90 +68 -0
- offload/_root/data/findings/cce21-defaultmap-aggregate-flag.f90 +52 -0
- offload/_root/data/findings/cce21-in-reduction-assumed-shape-write-lost.f90 +61 -0
- offload/_root/data/findings/cce21-in-reduction-taskwait-link.f90 +59 -0
- offload/_root/data/findings/cce21-linear-modifier-default-none.f90 +59 -0
- offload/_root/data/findings/clang-c-declare-target-to-omp52.c +50 -0
- offload/_root/data/findings/clang-c-linear-directive-name-hang.c +30 -0
- offload/_root/data/findings/clang-c-map-iterator-omp51.c +51 -0
- offload/_root/data/findings/clang-c-shared-declare-target-combined.c +58 -0
- offload/_root/data/findings/dataenv/cce-value-dummy-target-write-visible.f90 +74 -0
- offload/_root/data/findings/defaultmap-none-loop-variable.f90 +69 -0
- offload/_root/data/findings/fortran-loop-bind-thread-in-parallel.f90 +53 -0
- offload/_root/data/findings/fortran-schedule-static-in-target.f90 +55 -0
- offload/_root/data/findings/fresh/cce-common-block-name-in-map-rejected.f90 +47 -0
- offload/_root/data/findings/fresh/cce-if-stop-in-target-ice-one-condition.f90 +38 -0
- offload/_root/data/findings/fresh/cce-if-stop-in-target-ice.f90 +43 -0
- offload/_root/data/findings/fresh/cce-list-directed-print-in-target-copy-crash.f90 +40 -0
- offload/_root/data/findings/fresh/cce19-acc-automatic-array-copyout-copy-crash.f90 +56 -0
- offload/_root/data/findings/fresh/cce21-combined-if-runtime-expr-loop-skipped.f90 +57 -0
- offload/_root/data/findings/fresh/nvhpc-acc-gang-worker-collapse-nested-vector-reduction-lost.f90 +67 -0
- offload/_root/data/findings/fresh/nvhpc-teams-loop-module-allocatable-assign-fort2-crash.f90 +73 -0
- offload/_root/data/findings/fuzz/1131-afar.f90 +48 -0
- offload/_root/data/findings/fuzz/1391-cce20.f90 +40 -0
- offload/_root/data/findings/fuzz/14-cce20.f90 +36 -0
- offload/_root/data/findings/fuzz/1505-cce20.f90 +88 -0
- offload/_root/data/findings/fuzz/1540-afar.f90 +44 -0
- offload/_root/data/findings/fuzz/158-afar.f90 +63 -0
- offload/_root/data/findings/fuzz/16-cce20.f90 +39 -0
- offload/_root/data/findings/fuzz/1644-cce21.f90 +31 -0
- offload/_root/data/findings/fuzz/165-cce19.f90 +52 -0
- offload/_root/data/findings/fuzz/1749-cce20.f90 +34 -0
- offload/_root/data/findings/fuzz/1936-afar.f90 +61 -0
- offload/_root/data/findings/fuzz/1978-cce19.f90 +41 -0
- offload/_root/data/findings/fuzz/2014-cce19.f90 +46 -0
- offload/_root/data/findings/fuzz/2224-cce19.f90 +30 -0
- offload/_root/data/findings/fuzz/2334-cce19.f90 +57 -0
- offload/_root/data/findings/fuzz/536-cce19.f90 +38 -0
- offload/_root/data/findings/fuzz/591-cce19.f90 +54 -0
- offload/_root/data/findings/fuzz/650-afar.f90 +58 -0
- offload/_root/data/findings/fuzz/698-afar.f90 +68 -0
- offload/_root/data/findings/fuzz/700-afar.f90 +46 -0
- offload/_root/data/findings/fuzz/775-cce21.f90 +33 -0
- offload/_root/data/findings/fuzz/87-afar.f90 +47 -0
- offload/_root/data/findings/fuzz/916-afar.f90 +67 -0
- offload/_root/data/findings/fuzz/958-cce20.f90 +44 -0
- offload/_root/data/findings/fuzz/98-cce19.f90 +40 -0
- offload/_root/data/findings/fuzz/README.md +236 -0
- offload/_root/data/findings/fuzz/b1-121-afar.f90 +47 -0
- offload/_root/data/findings/fuzz/b1-183-afar.f90 +55 -0
- offload/_root/data/findings/fuzz/b1-22-cce20.f90 +38 -0
- offload/_root/data/findings/fuzz/b1-231-afar.f90 +56 -0
- offload/_root/data/findings/fuzz/b1-268-afar.f90 +46 -0
- offload/_root/data/findings/fuzz/b2-183-afar.f90 +57 -0
- offload/_root/data/findings/fuzz/b2-209-cce19.f90 +51 -0
- offload/_root/data/findings/fuzz/b2-213-afar.f90 +63 -0
- offload/_root/data/findings/fuzz/b2-52-afar.f90 +56 -0
- offload/_root/data/findings/fuzz/b2-68-afar.f90 +54 -0
- offload/_root/data/findings/fuzz/b2-85-cce20.f90 +55 -0
- offload/_root/data/findings/fuzz/b3-188-cce19.f90 +90 -0
- offload/_root/data/findings/fuzz/b3-190-cce21.f90 +88 -0
- offload/_root/data/findings/fuzz/b3-197-cce19.f90 +77 -0
- offload/_root/data/findings/fuzz/b3-250-cce20.f90 +89 -0
- offload/_root/data/findings/fuzz/b3-278-cce19.f90 +70 -0
- offload/_root/data/findings/fuzz/b3-45-cce21.f90 +83 -0
- offload/_root/data/findings/fuzz/b3-54-afar.f90 +67 -0
- offload/_root/data/findings/fuzz/b3-61-cce20.f90 +100 -0
- offload/_root/data/findings/fuzz/b3-9-afar.f90 +100 -0
- offload/_root/data/findings/fuzz/b3-9-cce21.f90 +103 -0
- offload/_root/data/findings/fuzz/b3-94-afar.f90 +80 -0
- offload/_root/data/findings/fuzz/b4-39-afar.f90 +141 -0
- offload/_root/data/findings/fuzz/b4-86-cce19.f90 +71 -0
- offload/_root/data/findings/fuzz/controls/gcc-complex-pointer-store-control.f90 +28 -0
- offload/_root/data/findings/fuzz/controls/gcc-declare-reduction-module-control.f90 +29 -0
- offload/_root/data/findings/fuzz/controls/gcc-target-simd-map-nontemporal-control.f90 +21 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-allocatable-component-mapped-control.f90 +22 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-allocatable-component-unreferenced-control.f90 +22 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-default-none-removed-control.f90 +18 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-default-shared-control.f90 +18 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-defaultmap-firstprivate-removed-control.f90 +15 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-defaultmap-to-scalar-reduction-mapped-control.f90 +17 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-defaultmap-to-scalar-removed-control.f90 +17 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-defaultmap-tofrom-lastprivate-control.f90 +15 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-depend-explicit-map-control.f90 +22 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-depend-removed-control.f90 +22 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-distribute-end-distribute-control.f90 +16 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-distribute-parallel-num-threads-removed-control.f90 +26 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-distribute-parallel-removed-control.f90 +22 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-distribute-simd-no-end-directive-control.f90 +15 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-explicit-length-character-dummy-control.f90 +18 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-loop-character-array-value-control.f90 +23 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-loop-character-distribute-control.f90 +20 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-map-always-first-control.f90 +15 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-map-always-removed-control.f90 +15 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-num-threads-removed-control.f90 +12 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-target-parallel-firstprivate-dropped-control.f90 +15 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-target-parallel-single-nowait-control.f90 +13 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-target-parallel-split-control.f90 +15 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-target-simd-collapse-split-control.f90 +21 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-target-simd-end-directive-control.f90 +14 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-target-simd-no-collapse-control.f90 +19 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-target-simd-split-no-end-directive-control.f90 +15 -0
- offload/_root/data/findings/fuzz/gcc-declare-reduction-module-not-found.f90 +66 -0
- offload/_root/data/findings/fuzz/gcc-strided-target-update-rejected.f90 +58 -0
- offload/_root/data/findings/fuzz/gcc-target-simd-map-nontemporal-rejected.f90 +54 -0
- offload/_root/data/findings/fuzz/nvhpc-allocatable-component-implicit-map-illegal-address.f90 +84 -0
- offload/_root/data/findings/fuzz/nvhpc-assumed-length-character-dummy-map-ice.f90 +69 -0
- offload/_root/data/findings/fuzz/nvhpc-default-none-reduction-lastprivate-fort1-crash.f90 +70 -0
- offload/_root/data/findings/fuzz/nvhpc-defaultmap-firstprivate-lastprivate-ice.f90 +71 -0
- offload/_root/data/findings/fuzz/nvhpc-defaultmap-to-scalar-reduction-lost.f90 +82 -0
- offload/_root/data/findings/fuzz/nvhpc-depend-implicit-map-illegal-address.f90 +81 -0
- offload/_root/data/findings/fuzz/nvhpc-distribute-parallel-num-threads-writes-lost.f90 +79 -0
- offload/_root/data/findings/fuzz/nvhpc-end-distribute-simd-rejected.f90 +70 -0
- offload/_root/data/findings/fuzz/nvhpc-loop-character-achar-unsupported.f90 +75 -0
- offload/_root/data/findings/fuzz/nvhpc-map-always-after-map-to-not-copied-back.f90 +70 -0
- offload/_root/data/findings/fuzz/nvhpc-num-threads-reduction-identity-lost.f90 +54 -0
- offload/_root/data/findings/fuzz/nvhpc-target-parallel-firstprivate-translate-failure.f90 +66 -0
- offload/_root/data/findings/fuzz/nvhpc-target-parallel-single-hang.f90 +68 -0
- offload/_root/data/findings/fuzz/nvhpc-target-simd-collapse-translate-failure.f90 +73 -0
- offload/_root/data/findings/fuzz/nvhpc-target-simd-no-end-directive-rejected.f90 +68 -0
- offload/_root/data/findings/fuzz/par-s1-2082-gcc_g90.f90 +71 -0
- offload/_root/data/findings/fuzz/s1-2370-cce21.f90 +67 -0
- offload/_root/data/findings/fuzz/s1-2592-cce21.f90 +56 -0
- offload/_root/data/findings/fuzz/s1-3463-cce21.f90 +92 -0
- offload/_root/data/findings/fuzz/s1-4339-afar.f90 +79 -0
- offload/_root/data/findings/fuzz/s1-6085-cce21.f90 +96 -0
- offload/_root/data/findings/fuzz/s1-6760-cce20.f90 +65 -0
- offload/_root/data/findings/fuzz/s1-6888-cce21.f90 +76 -0
- offload/_root/data/findings/fuzz/s1-7882-cce20.f90 +63 -0
- offload/_root/data/findings/fuzz/s1-8634-cce21.f90 +45 -0
- offload/_root/data/findings/fuzz/s1-91-cce21.f90 +92 -0
- offload/_root/data/findings/fuzz/s1-9443-afar.f90 +59 -0
- offload/_root/data/findings/fuzz/s1-9914-cce19.f90 +78 -0
- offload/_root/data/findings/gcc/controls/gcc-acc-c-detach-control.c +34 -0
- offload/_root/data/findings/gcc/controls/gcc-acc-detach-control.f90 +26 -0
- offload/_root/data/findings/gcc/controls/gcc-defaultmap-to-pointer-control.f90 +31 -0
- offload/_root/data/findings/gcc/controls/gcc-target-in-task-control.c +26 -0
- offload/_root/data/findings/gcc/controls/gcc-target-in-task-control.f90 +21 -0
- offload/_root/data/findings/gcc/gcc-acc-bind-device-type-rejected.f90 +71 -0
- offload/_root/data/findings/gcc/gcc-acc-c-bind-device-type-rejected.c +76 -0
- offload/_root/data/findings/gcc/gcc-acc-c-detach-delete-attach-underflow.c +74 -0
- offload/_root/data/findings/gcc/gcc-acc-c-gang-dim-rejected.c +79 -0
- offload/_root/data/findings/gcc/gcc-acc-c-link-in-routine-rejected.c +82 -0
- offload/_root/data/findings/gcc/gcc-acc-detach-delete-attach-underflow.f90 +66 -0
- offload/_root/data/findings/gcc/gcc-acc-gang-dim-collapse-force-rejected.f90 +69 -0
- offload/_root/data/findings/gcc/gcc-acc-init-set-shutdown-rejected.f90 +70 -0
- offload/_root/data/findings/gcc/gcc-acc-link-in-routine-rejected.f90 +82 -0
- offload/_root/data/findings/gcc/gcc-acc-use-device-allocatable-rejected.f90 +88 -0
- offload/_root/data/findings/gcc/gcc-c-motion-mapper-rejected.c +110 -0
- offload/_root/data/findings/gcc/gcc-c-omp60-undocumented-rejected.c +76 -0
- offload/_root/data/findings/gcc/gcc-c-omp60-unimplemented-rejected.c +119 -0
- offload/_root/data/findings/gcc/gcc-c-target-in-task-mandatory-device-not-found.c +87 -0
- offload/_root/data/findings/gcc/gcc-c-uses-allocators-traits-unimplemented.c +85 -0
- offload/_root/data/findings/gcc/gcc-declare-mapper-rejected.f90 +85 -0
- offload/_root/data/findings/gcc/gcc-defaultmap-to-pointer-copy-back.f90 +66 -0
- offload/_root/data/findings/gcc/gcc-loop-bind-default-none-rejected.f90 +93 -0
- offload/_root/data/findings/gcc/gcc-omp60-undocumented-rejected.f90 +72 -0
- offload/_root/data/findings/gcc/gcc-omp60-unimplemented-rejected.f90 +112 -0
- offload/_root/data/findings/gcc/gcc-target-in-task-mandatory-device-not-found.f90 +83 -0
- offload/_root/data/findings/gcc/gcc-uses-allocators-traits-unimplemented.f90 +78 -0
- offload/_root/data/findings/harvest/afar-flang-strided-target-update.f90 +96 -0
- offload/_root/data/findings/harvest/cce-acc-declare-create-module-allocatable-xnack1-fault.f90 +58 -0
- offload/_root/data/findings/harvest/cce-c-implicit-struct-map-partly-present.c +100 -0
- offload/_root/data/findings/harvest/cce-c-strided-target-update.c +74 -0
- offload/_root/data/findings/harvest/cce-ftn-target-parallel-thread-query-ice.f90 +67 -0
- offload/_root/data/findings/harvest/cce-named-constant-array-declare-target-routine-rejected.f90 +69 -0
- offload/_root/data/findings/harvest/cce-use-device-ptr-c-ptr-not-converted.f90 +64 -0
- offload/_root/data/findings/harvest/cce21-declare-target-link-module-variable-write-lost.f90 +63 -0
- offload/_root/data/findings/harvest/cce21-internal-procedure-calls-internal-in-target-fault.f90 +71 -0
- offload/_root/data/findings/harvest/controls/cce-c-implicit-struct-map-partly-present-target-only-control.c +22 -0
- offload/_root/data/findings/harvest/controls/cce-c-implicit-struct-map-partly-present-whole-control.c +23 -0
- offload/_root/data/findings/harvest/controls/gcc-acc-declare-create-allocatable-control.f90 +34 -0
- offload/_root/data/findings/harvest/controls/gcc-c-same-item-two-maps-control.c +17 -0
- offload/_root/data/findings/harvest/controls/gcc-c-target-data-struct-pointer-section-control.c +27 -0
- offload/_root/data/findings/harvest/controls/gcc-c-target-data-two-maps-control.c +20 -0
- offload/_root/data/findings/harvest/controls/gcc-same-item-two-maps-control.f90 +16 -0
- offload/_root/data/findings/harvest/controls/gcc-teams-simd-matmul-allocatable-control.f90 +27 -0
- offload/_root/data/findings/harvest/gcc-acc-declare-create-allocatable-not-mapped.f90 +66 -0
- offload/_root/data/findings/harvest/gcc-c-same-item-two-maps-rejected.c +45 -0
- offload/_root/data/findings/harvest/gcc-c-strided-section-rejected.c +70 -0
- offload/_root/data/findings/harvest/gcc-c-target-data-struct-pointer-section-ice.c +78 -0
- offload/_root/data/findings/harvest/gcc-c-target-data-two-maps-ice.c +49 -0
- offload/_root/data/findings/harvest/gcc-same-item-two-maps-rejected.f90 +46 -0
- offload/_root/data/findings/harvest/gcc-teams-simd-matmul-allocatable-ice.f90 +53 -0
- offload/_root/data/findings/harvest/nvhpc-c-target-data-if-false-use-device-ptr-garbage.c +49 -0
- offload/_root/data/findings/harvest/nvhpc-named-constant-array-declare-target-routine-rejected.f90 +65 -0
- offload/_root/data/findings/harvest/nvhpc-use-device-ptr-c-ptr-not-found.f90 +60 -0
- offload/_root/data/findings/harvest/nvhpc2511-target-nowait-in-parallel-for-ice.c +59 -0
- offload/_root/data/findings/hecbench/controls/f16-ctl-float-array.c +28 -0
- offload/_root/data/findings/hecbench/controls/pc-ctl-builtin-popcount.c +37 -0
- offload/_root/data/findings/hecbench/controls/pc-ctl-shift-sum.c +43 -0
- offload/_root/data/findings/hecbench/gcc-c-float16-array-in-target-lto-ice.c +65 -0
- offload/_root/data/findings/hecbench/gcc-c-swar-popcount-assembler-error.c +80 -0
- offload/_root/data/findings/index.yaml +2453 -0
- offload/_root/data/findings/malloc/afar-device-malloc-in-kernel-corrupts-records.c +371 -0
- offload/_root/data/findings/malloc/controls/afar-first-use-malloc-direct.c +52 -0
- offload/_root/data/findings/malloc/controls/afar-first-use-malloc-fence.c +57 -0
- offload/_root/data/findings/malloc/controls/afar-first-use-malloc-flush.c +57 -0
- offload/_root/data/findings/malloc/controls/afar-first-use-malloc-stack.c +52 -0
- offload/_root/data/findings/multithread-allocatable-section-maps.f90 +91 -0
- offload/_root/data/findings/nested/afar-cce-c-call-result-member-in-target-rejected.c +69 -0
- offload/_root/data/findings/nested/afar-cce-c-update-struct-and-member-rejected.c +92 -0
- offload/_root/data/findings/nested/afar-flang-pointer-root-allocatable-component-enter-data-fault.f90 +121 -0
- offload/_root/data/findings/nested/cce-c-struct-and-nested-pointee-sections-ice.c +79 -0
- offload/_root/data/findings/nested/cce-fortran-nested-allocatable-component-copy-fault.f90 +64 -0
- offload/_root/data/findings/nested/cce-fortran-pointer-to-type-with-allocatable-scalar-component-typed-transfer.f90 +93 -0
- offload/_root/data/findings/nested/cce-fortran-update-to-pointer-root-allocatable-scalar-component-no-accelerator-object.f90 +80 -0
- offload/_root/data/findings/nested/controls/c3-ctl-nested-data.c +27 -0
- offload/_root/data/findings/nested/controls/c5-acc-serial-struct-and-array.c +26 -0
- offload/_root/data/findings/nested/controls/e2-ctl-two-directives.c +42 -0
- offload/_root/data/findings/nested/controls/e3-ctl-attach-clause.c +42 -0
- offload/_root/data/findings/nested/controls/f3-pointer-array-only.c +33 -0
- offload/_root/data/findings/nested/controls/f5-ctl-copyout-exit.c +33 -0
- offload/_root/data/findings/nested/controls/f6-ctl-pointer-to-struct-array.c +28 -0
- offload/_root/data/findings/nested/controls/g2-ctl-allocatable.f90 +34 -0
- offload/_root/data/findings/nested/controls/g2-ctl-entered-to.f90 +34 -0
- offload/_root/data/findings/nested/controls/g3-ctl-from-struct-no-element.c +27 -0
- offload/_root/data/findings/nested/controls/g3-ptrs-two-elements-to.c +27 -0
- offload/_root/data/findings/nested/controls/g3-ptrs-two-elements-tofrom.c +27 -0
- offload/_root/data/findings/nested/controls/g5-ctl-element-pointers-only.f90 +36 -0
- offload/_root/data/findings/nested/controls/g5-ctl-root-pointer-only.f90 +36 -0
- offload/_root/data/findings/nested/controls/gp2-ctl-no-mapper-explicit-maps.c +24 -0
- offload/_root/data/findings/nested/controls/gt2-ctl-no-always.c +26 -0
- offload/_root/data/findings/nested/controls/gt3-ctl-always-on-structure-only.c +26 -0
- offload/_root/data/findings/nested/controls/j1-embedded-struct-pointer-to-struct.c +24 -0
- offload/_root/data/findings/nested/controls/j2-ctl-pointer-instead-of-embedded.c +24 -0
- offload/_root/data/findings/nested/controls/j6-ctl-struct-and-one-pointee-level.c +23 -0
- offload/_root/data/findings/nested/controls/j7-ctl-struct-and-embedded-pointee.c +24 -0
- offload/_root/data/findings/nested/controls/m2-ctl-variable-root.f90 +32 -0
- offload/_root/data/findings/nested/controls/m3-ctl-fixed-array-component.f90 +32 -0
- offload/_root/data/findings/nested/controls/m5-ctl-no-enter-data.f90 +33 -0
- offload/_root/data/findings/nested/controls/n8-ctl-fixed-array-in-component.f90 +33 -0
- offload/_root/data/findings/nested/controls/n9-ctl-allocatable-in-the-variable.f90 +33 -0
- offload/_root/data/findings/nested/controls/ns4-ctl-two-directives-struct-then-pointee.c +27 -0
- offload/_root/data/findings/nested/controls/ns8-ctl-enter-together-exit-split.c +26 -0
- offload/_root/data/findings/nested/controls/nu3-ctl-update-pointee-only.c +28 -0
- offload/_root/data/findings/nested/controls/p2-ctl-pointer-variable.c +27 -0
- offload/_root/data/findings/nested/controls/p3-ctl-direct-member.c +26 -0
- offload/_root/data/findings/nested/controls/q2-ctl-fixed-array.f90 +37 -0
- offload/_root/data/findings/nested/controls/q3-ctl-allocatable-component-of-the-variable.f90 +38 -0
- offload/_root/data/findings/nested/controls/ta2-ctl-no-allocatable-component.f90 +42 -0
- offload/_root/data/findings/nested/controls/ta3-ctl-allocatable-scalar-in-the-variable.f90 +38 -0
- offload/_root/data/findings/nested/controls/ta4-ctl-pointer-component-only.f90 +42 -0
- offload/_root/data/findings/nested/controls/u3-ctl-update-member-only.c +24 -0
- offload/_root/data/findings/nested/controls/u4-ctl-two-updates.c +25 -0
- offload/_root/data/findings/nested/controls/u5-ctl-same-list-in-map.c +25 -0
- offload/_root/data/findings/nested/controls/ua2-ctl-variable-root.f90 +37 -0
- offload/_root/data/findings/nested/controls/ua4-ctl-to-in-place-of-alloc-and-update.f90 +37 -0
- offload/_root/data/findings/nested/controls/v2-ctl-parent-first.c +25 -0
- offload/_root/data/findings/nested/controls/v4-ctl-embedded-member.c +24 -0
- offload/_root/data/findings/nested/gcc-acc-c-exit-data-of-a-pointer-array-element-target-hangs.c +83 -0
- offload/_root/data/findings/nested/gcc-acc-c-parent-and-shared-pointee-one-directive.c +88 -0
- offload/_root/data/findings/nested/gcc-acc-c-struct-and-member-array-one-directive.c +84 -0
- offload/_root/data/findings/nested/gcc-c-always-on-pointer-member-section-ice.c +75 -0
- offload/_root/data/findings/nested/gcc-c-declare-mapper-pointer-member-section-gpu-fault.c +93 -0
- offload/_root/data/findings/nested/gcc-c-from-struct-and-pointee-section-rejected.c +83 -0
- offload/_root/data/findings/nested/gcc-fortran-pointer-component-alloc-bounds-lost.f90 +62 -0
- offload/_root/data/findings/nested/gcc-fortran-root-and-element-pointer-components-ice.f90 +77 -0
- offload/_root/data/findings/nested/nvhpc-c-pointee-before-parent-in-one-map-list-copy-fault.c +55 -0
- offload/_root/data/findings/nested/nvhpc-c-update-from-structure-overwrites-attached-pointer-segv.c +86 -0
- offload/_root/data/findings/nvhpc-acc-atomic-update-sum-fort2-crash.f90 +53 -0
- offload/_root/data/findings/nvhpc-c-acc-atomic-update-sum-ice.c +43 -0
- offload/_root/data/findings/nvhpc-c-dist-schedule-chunk-compile-hang.c +41 -0
- offload/_root/data/findings/nvhpc-c-map-present-ignored.c +42 -0
- offload/_root/data/findings/nvhpc-c-ordered-in-target-nvcpfe-crash.c +92 -0
- offload/_root/data/findings/nvhpc-c-parallel-for-firstprivate-in-target.c +62 -0
- offload/_root/data/findings/nvhpc-c-parallel-if-in-target-nvvm-ice.c +56 -0
- offload/_root/data/findings/nvhpc-defaultmap-firstprivate-explicit-map.f90 +45 -0
- offload/_root/data/findings/nvhpc-defaultmap-from-allocatable-indexing.f90 +60 -0
- offload/_root/data/findings/nvhpc-depend-inoutset-ignored.f90 +64 -0
- offload/_root/data/findings/nvhpc-dist-schedule-chunk-illegal-address.f90 +52 -0
- offload/_root/data/findings/nvhpc-managed-acc-shutdown-host-access.f90 +42 -0
- offload/_root/data/findings/nvhpc-parallel-if-in-target-nvvm-ice.f90 +60 -0
- offload/_root/data/findings/oop/afar-final-dealloc-device-link.f90 +85 -0
- offload/_root/data/findings/oop/afar-pdt-length-parameter-not-implemented.f90 +65 -0
- offload/_root/data/findings/oop/cce-class-is-device-link.f90 +86 -0
- offload/_root/data/findings/oop/cce-copy-alloc-component-section-fault.f90 +73 -0
- offload/_root/data/findings/oop/cce-copy-parent-to-component-tofrom-lost.f90 +65 -0
- offload/_root/data/findings/oop/cce-copy-second-member-section-lost.f90 +65 -0
- offload/_root/data/findings/oop/cce-element-component-map-lost.f90 +64 -0
- offload/_root/data/findings/oop/cce-final-dealloc-device-abort.f90 +85 -0
- offload/_root/data/findings/oop/cce-pdt-default-mapper-rejected.f90 +71 -0
- offload/_root/data/findings/oop/cce-polymorphic-dispatch-device-link.f90 +100 -0
- offload/_root/data/findings/oop/cce-section-of-element-component-overlap.f90 +76 -0
- offload/_root/data/findings/oop/cce-select-type-guard-not-taken.f90 +91 -0
- offload/_root/data/findings/oop/cce-udr-derived-type-unsupported.f90 +69 -0
- offload/_root/data/findings/oop/cce21-element-component-map-lost.f90 +62 -0
- offload/_root/data/findings/oop/controls/alloccomp-comp-only.f90 +44 -0
- offload/_root/data/findings/oop/controls/alloccomp-whole-explicit-component.f90 +50 -0
- offload/_root/data/findings/oop/controls/alloccomp-whole.f90 +49 -0
- offload/_root/data/findings/oop/controls/elemsec-element.f90 +47 -0
- offload/_root/data/findings/oop/controls/final-local.f90 +64 -0
- offload/_root/data/findings/oop/controls/host-class-star-select-type.f90 +58 -0
- offload/_root/data/findings/oop/controls/host-firstprivate-defined-assignment.f90 +54 -0
- offload/_root/data/findings/oop/controls/host-lastprivate-defined-assignment.f90 +58 -0
- offload/_root/data/findings/oop/controls/host-private-finalization.f90 +51 -0
- offload/_root/data/findings/oop/controls/host-select-type.f90 +65 -0
- offload/_root/data/findings/oop/controls/parent-and-comp-component-only.f90 +45 -0
- offload/_root/data/findings/oop/controls/pdt-kind.f90 +46 -0
- offload/_root/data/findings/oop/controls/pdt-len-host.f90 +43 -0
- offload/_root/data/findings/oop/controls/pdt-len-unparameterized.f90 +46 -0
- offload/_root/data/findings/oop/controls/poly-dispatch-static.f90 +75 -0
- offload/_root/data/findings/oop/controls/section-alloc-whole-component.f90 +49 -0
- offload/_root/data/findings/oop/controls/section-element-whole-array.f90 +50 -0
- offload/_root/data/findings/oop/controls/section-element-whole-component.f90 +50 -0
- offload/_root/data/findings/oop/controls/section-fixed.f90 +43 -0
- offload/_root/data/findings/oop/controls/tbp-override.f90 +64 -0
- offload/_root/data/findings/oop/gcc-acc-parent-and-member-data-rejected.f90 +63 -0
- offload/_root/data/findings/oop/gcc-pdt-length-parameter-abort.f90 +68 -0
- offload/_root/data/findings/oop/gcc-polymorphic-dispatch-abort.f90 +97 -0
- offload/_root/data/findings/oop/gcc-vtab-not-marked-for-offload.f90 +94 -0
- offload/_root/data/findings/oop/nvhpc-copy-alloc-component-illegal-address.f90 +76 -0
- offload/_root/data/findings/oop/nvhpc-copy-pdt-length-parameter-illegal-address.f90 +69 -0
- offload/_root/data/findings/oop/nvhpc-named-mapper-rejected.f90 +65 -0
- offload/_root/data/findings/oop/nvhpc-polymorphic-dispatch-translate-failure.f90 +90 -0
- offload/_root/data/findings/oop/nvhpc-polymorphism-runtime-unsupported.f90 +94 -0
- offload/_root/data/findings/oop/nvhpc-type-bound-call-rejected.f90 +89 -0
- offload/_root/data/findings/oop/nvhpc-udr-derived-type-rejected.f90 +67 -0
- offload/_root/data/findings/reviews/afar-c-error-directive-in-target-link.json +217 -0
- offload/_root/data/findings/reviews/afar-c-lastprivate-distribute-parallel-for-small-type.json +113 -0
- offload/_root/data/findings/reviews/afar-c-teams-distribute-reduction-first-team.json +130 -0
- offload/_root/data/findings/reviews/afar-c-update-iterator-copy-mode.json +113 -0
- offload/_root/data/findings/reviews/afar-cce19-character-defaultmap.json +292 -0
- offload/_root/data/findings/reviews/afar-clang-requires-device-safesync-hang.json +191 -0
- offload/_root/data/findings/reviews/afar-flang-firstprivate-map-two-targets.json +130 -0
- offload/_root/data/findings/reviews/afar-flang-loop-bind-teams-reduction.json +126 -0
- offload/_root/data/findings/reviews/afar-flang-task-reduction-max.json +113 -0
- offload/_root/data/findings/reviews/afar-flang-thread-limit-target-parallel-do.json +113 -0
- offload/_root/data/findings/reviews/afar-loop-bind-thread-in-teams.json +191 -0
- offload/_root/data/findings/reviews/afar-nontemporal-assumed-shape-ice.json +113 -0
- offload/_root/data/findings/reviews/afar-udr-derived-type-link.json +113 -0
- offload/_root/data/findings/reviews/afar-xnack1-atomic-min-nested-parallel.json +113 -0
- offload/_root/data/findings/reviews/afar-xnack1-target-is-present.json +113 -0
- offload/_root/data/findings/reviews/apps--afar-cce-teams-private-array-nested-parallel-wrong.json +113 -0
- offload/_root/data/findings/reviews/apps--cce20-device-link-infer-address-spaces-crash.json +113 -0
- offload/_root/data/findings/reviews/apps--cce21-device-link-agpr-copy-mfma-assert.json +113 -0
- offload/_root/data/findings/reviews/apps--cce21-private-array-loaded-subscript-wrong.json +113 -0
- offload/_root/data/findings/reviews/apps--gcc-acc-c-tile-partial-tiles-wrong.json +113 -0
- offload/_root/data/findings/reviews/catalog--afar-c-ordered-doacross-link.json +113 -0
- offload/_root/data/findings/reviews/catalog--afar-c-reduction-task-link.json +113 -0
- offload/_root/data/findings/reviews/catalog--afar-flang-absent-optional-target-crash.json +113 -0
- offload/_root/data/findings/reviews/catalog--afar-flang-critical-target-parallel-wrong.json +113 -0
- offload/_root/data/findings/reviews/catalog--afar-flang-dist-schedule-chunk.json +113 -0
- offload/_root/data/findings/reviews/catalog--afar-flang-linear-parallel-ice.json +113 -0
- offload/_root/data/findings/reviews/catalog--afar-flang-named-critical-link.json +126 -0
- offload/_root/data/findings/reviews/catalog--afar-flang-ordered-wrong.json +113 -0
- offload/_root/data/findings/reviews/catalog--afar-flang-reduction-minus-rejected.json +113 -0
- offload/_root/data/findings/reviews/catalog--afar-flang-sections-in-target-ice.json +113 -0
- offload/_root/data/findings/reviews/catalog--afar-flang-workdistribute-ice.json +113 -0
- offload/_root/data/findings/reviews/catalog--c-allocate-const-mem-firstprivate-wrong.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-acc-character-dummy-routine-ice.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-acc-loop-seq-in-routine-wrong.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-allocators-stack-ice.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-c-allocate-align-link.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-c-allocate-allocator-modifier-rejected.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-c-dist-schedule-chunk.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-c-f-pointer-device-link.json +130 -0
- offload/_root/data/findings/reviews/catalog--cce-c-long-double-ice.json +217 -0
- offload/_root/data/findings/reviews/catalog--cce-c-map-iterator-ice.json +217 -0
- offload/_root/data/findings/reviews/catalog--cce-c-recursive-function-ice.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-c-sections-in-target-wrong.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-flang-allocate-in-target-crash.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-flang-lastprivate-parallel-in-seq-loop-wrong.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-flang-stop-in-target-crash.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-iterator-link.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-linear-lastprivate-ice.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-reduction-inscan-ice.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-reduction-task-link.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce19-reduction-task-addrspacecast-ice.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce20-c-defaultmap-private-storage-rejected.json +217 -0
- offload/_root/data/findings/reviews/catalog--cce20-map-self-rejected.json +204 -0
- offload/_root/data/findings/reviews/catalog--cce21-c-target-loop-ice.json +126 -0
- offload/_root/data/findings/reviews/catalog--defaultmap-present-private-array-abort.json +236 -0
- offload/_root/data/findings/reviews/catalog--nvhpc-acc-associate-illegal-address.json +113 -0
- offload/_root/data/findings/reviews/catalog--nvhpc-c-function-pointer-kernel-missing.json +268 -0
- offload/_root/data/findings/reviews/cce-acc-init-set-runtime-assert.json +113 -0
- offload/_root/data/findings/reviews/cce-acc-reduction-200-int8-scalars-wrong.json +113 -0
- offload/_root/data/findings/reviews/cce-acc-routine-bind-module-ice.json +113 -0
- offload/_root/data/findings/reviews/cce-c-dist-schedule-segv.json +113 -0
- offload/_root/data/findings/reviews/cce-c-map-delete-refcount.json +149 -0
- offload/_root/data/findings/reviews/cce-c-map-present-assert.json +126 -0
- offload/_root/data/findings/reviews/cce-c-openmp45-device-link.json +113 -0
- offload/_root/data/findings/reviews/cce-c-parallel-for-in-target.json +141 -0
- offload/_root/data/findings/reviews/cce-mapper-next-map-copy-back.json +208 -0
- offload/_root/data/findings/reviews/cce-uses-allocators-traits-omp50.json +191 -0
- offload/_root/data/findings/reviews/cce19-c-reduction-63-scalars-one-wrong.json +113 -0
- offload/_root/data/findings/reviews/cce19-target-parallel-guarded-loop.json +113 -0
- offload/_root/data/findings/reviews/cce19-target-parallel-single-ice.json +113 -0
- offload/_root/data/findings/reviews/cce21-alloc-2e32-sum-wrong.json +113 -0
- offload/_root/data/findings/reviews/cce21-defaultmap-aggregate-flag.json +210 -0
- offload/_root/data/findings/reviews/cce21-in-reduction-assumed-shape-write-lost.json +113 -0
- offload/_root/data/findings/reviews/cce21-in-reduction-taskwait-link.json +113 -0
- offload/_root/data/findings/reviews/clang-c-declare-target-to-omp52.json +113 -0
- offload/_root/data/findings/reviews/clang-c-linear-directive-name-hang.json +113 -0
- offload/_root/data/findings/reviews/clang-c-shared-declare-target-combined.json +132 -0
- offload/_root/data/findings/reviews/dataenv--cce-value-dummy-target-write-visible.json +113 -0
- offload/_root/data/findings/reviews/defaultmap-none-loop-variable.json +113 -0
- offload/_root/data/findings/reviews/fortran-schedule-static-in-target.json +113 -0
- offload/_root/data/findings/reviews/fresh--cce-common-block-name-in-map-rejected.json +113 -0
- offload/_root/data/findings/reviews/fresh--cce-list-directed-print-in-target-copy-crash.json +217 -0
- offload/_root/data/findings/reviews/fresh--cce19-acc-automatic-array-copyout-copy-crash.json +113 -0
- offload/_root/data/findings/reviews/fresh--cce21-combined-if-runtime-expr-loop-skipped.json +113 -0
- offload/_root/data/findings/reviews/fresh--nvhpc-acc-gang-worker-collapse-nested-vector-reduction-lost.json +113 -0
- offload/_root/data/findings/reviews/fresh--nvhpc-teams-loop-module-allocatable-assign-fort2-crash.json +113 -0
- offload/_root/data/findings/reviews/fuzz--1505-cce20.json +113 -0
- offload/_root/data/findings/reviews/fuzz--1540-afar.json +113 -0
- offload/_root/data/findings/reviews/fuzz--1978-cce19.json +130 -0
- offload/_root/data/findings/reviews/fuzz--2334-cce19.json +113 -0
- offload/_root/data/findings/reviews/fuzz--591-cce19.json +147 -0
- offload/_root/data/findings/reviews/fuzz--650-afar.json +113 -0
- offload/_root/data/findings/reviews/fuzz--916-afar.json +130 -0
- offload/_root/data/findings/reviews/fuzz--98-cce19.json +113 -0
- offload/_root/data/findings/reviews/fuzz--b1-121-afar.json +160 -0
- offload/_root/data/findings/reviews/fuzz--b2-209-cce19.json +141 -0
- offload/_root/data/findings/reviews/fuzz--b2-68-afar.json +113 -0
- offload/_root/data/findings/reviews/fuzz--b2-85-cce20.json +217 -0
- offload/_root/data/findings/reviews/fuzz--b3-188-cce19.json +113 -0
- offload/_root/data/findings/reviews/fuzz--b3-278-cce19.json +212 -0
- offload/_root/data/findings/reviews/fuzz--b3-54-afar.json +113 -0
- offload/_root/data/findings/reviews/fuzz--b3-61-cce20.json +191 -0
- offload/_root/data/findings/reviews/fuzz--b4-86-cce19.json +113 -0
- offload/_root/data/findings/reviews/fuzz--gcc-declare-reduction-module-not-found.json +113 -0
- offload/_root/data/findings/reviews/fuzz--gcc-target-simd-map-nontemporal-rejected.json +113 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-allocatable-component-implicit-map-illegal-address.json +141 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-assumed-length-character-dummy-map-ice.json +113 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-default-none-reduction-lastprivate-fort1-crash.json +113 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-defaultmap-firstprivate-lastprivate-ice.json +113 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-defaultmap-to-scalar-reduction-lost.json +113 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-depend-implicit-map-illegal-address.json +113 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-distribute-parallel-num-threads-writes-lost.json +113 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-end-distribute-simd-rejected.json +113 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-loop-character-achar-unsupported.json +113 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-map-always-after-map-to-not-copied-back.json +113 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-num-threads-reduction-identity-lost.json +113 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-target-parallel-firstprivate-translate-failure.json +191 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-target-parallel-single-hang.json +113 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-target-simd-collapse-translate-failure.json +113 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-target-simd-no-end-directive-rejected.json +113 -0
- offload/_root/data/findings/reviews/fuzz--par-s1-2082-gcc_g90.json +126 -0
- offload/_root/data/findings/reviews/fuzz--s1-2370-cce21.json +113 -0
- offload/_root/data/findings/reviews/fuzz--s1-2592-cce21.json +113 -0
- offload/_root/data/findings/reviews/fuzz--s1-3463-cce21.json +113 -0
- offload/_root/data/findings/reviews/fuzz--s1-6760-cce20.json +130 -0
- offload/_root/data/findings/reviews/fuzz--s1-6888-cce21.json +113 -0
- offload/_root/data/findings/reviews/fuzz--s1-7882-cce20.json +113 -0
- offload/_root/data/findings/reviews/fuzz--s1-8634-cce21.json +113 -0
- offload/_root/data/findings/reviews/fuzz--s1-91-cce21.json +113 -0
- offload/_root/data/findings/reviews/fuzz--s1-9443-afar.json +113 -0
- offload/_root/data/findings/reviews/fuzz--s1-9914-cce19.json +141 -0
- offload/_root/data/findings/reviews/gcc--gcc-acc-bind-device-type-rejected.json +113 -0
- offload/_root/data/findings/reviews/gcc--gcc-acc-detach-delete-attach-underflow.json +314 -0
- offload/_root/data/findings/reviews/gcc--gcc-acc-gang-dim-collapse-force-rejected.json +113 -0
- offload/_root/data/findings/reviews/gcc--gcc-acc-init-set-shutdown-rejected.json +113 -0
- offload/_root/data/findings/reviews/gcc--gcc-acc-link-in-routine-rejected.json +113 -0
- offload/_root/data/findings/reviews/gcc--gcc-acc-use-device-allocatable-rejected.json +113 -0
- offload/_root/data/findings/reviews/gcc--gcc-c-motion-mapper-rejected.json +113 -0
- offload/_root/data/findings/reviews/gcc--gcc-c-omp60-undocumented-rejected.json +217 -0
- offload/_root/data/findings/reviews/gcc--gcc-c-omp60-unimplemented-rejected.json +236 -0
- offload/_root/data/findings/reviews/gcc--gcc-c-target-in-task-mandatory-device-not-found.json +236 -0
- offload/_root/data/findings/reviews/gcc--gcc-c-uses-allocators-traits-unimplemented.json +113 -0
- offload/_root/data/findings/reviews/gcc--gcc-declare-mapper-rejected.json +113 -0
- offload/_root/data/findings/reviews/gcc--gcc-defaultmap-to-pointer-copy-back.json +217 -0
- offload/_root/data/findings/reviews/gcc--gcc-loop-bind-default-none-rejected.json +113 -0
- offload/_root/data/findings/reviews/harvest--afar-flang-strided-target-update.json +141 -0
- offload/_root/data/findings/reviews/harvest--cce-acc-declare-create-module-allocatable-xnack1-fault.json +113 -0
- offload/_root/data/findings/reviews/harvest--cce-c-implicit-struct-map-partly-present.json +217 -0
- offload/_root/data/findings/reviews/harvest--cce-c-strided-target-update.json +141 -0
- offload/_root/data/findings/reviews/harvest--cce-ftn-target-parallel-thread-query-ice.json +130 -0
- offload/_root/data/findings/reviews/harvest--cce-named-constant-array-declare-target-routine-rejected.json +113 -0
- offload/_root/data/findings/reviews/harvest--cce-use-device-ptr-c-ptr-not-converted.json +113 -0
- offload/_root/data/findings/reviews/harvest--cce21-declare-target-link-module-variable-write-lost.json +113 -0
- offload/_root/data/findings/reviews/harvest--cce21-internal-procedure-calls-internal-in-target-fault.json +158 -0
- offload/_root/data/findings/reviews/harvest--gcc-acc-declare-create-allocatable-not-mapped.json +204 -0
- offload/_root/data/findings/reviews/harvest--gcc-c-same-item-two-maps-rejected.json +143 -0
- offload/_root/data/findings/reviews/harvest--gcc-c-strided-section-rejected.json +164 -0
- offload/_root/data/findings/reviews/harvest--gcc-c-target-data-struct-pointer-section-ice.json +113 -0
- offload/_root/data/findings/reviews/harvest--gcc-c-target-data-two-maps-ice.json +113 -0
- offload/_root/data/findings/reviews/harvest--gcc-teams-simd-matmul-allocatable-ice.json +113 -0
- offload/_root/data/findings/reviews/harvest--nvhpc-c-target-data-if-false-use-device-ptr-garbage.json +113 -0
- offload/_root/data/findings/reviews/harvest--nvhpc-named-constant-array-declare-target-routine-rejected.json +126 -0
- offload/_root/data/findings/reviews/harvest--nvhpc-use-device-ptr-c-ptr-not-found.json +113 -0
- offload/_root/data/findings/reviews/harvest--nvhpc2511-target-nowait-in-parallel-for-ice.json +130 -0
- offload/_root/data/findings/reviews/hecbench--gcc-c-float16-array-in-target-lto-ice.json +217 -0
- offload/_root/data/findings/reviews/hecbench--gcc-c-swar-popcount-assembler-error.json +126 -0
- offload/_root/data/findings/reviews/malloc--afar-device-malloc-in-kernel-corrupts-records.json +270 -0
- offload/_root/data/findings/reviews/multithread-allocatable-section-maps.json +191 -0
- offload/_root/data/findings/reviews/nested--afar-cce-c-call-result-member-in-target-rejected.json +113 -0
- offload/_root/data/findings/reviews/nested--afar-cce-c-update-struct-and-member-rejected.json +126 -0
- offload/_root/data/findings/reviews/nested--afar-flang-pointer-root-allocatable-component-enter-data-fault.json +191 -0
- offload/_root/data/findings/reviews/nested--cce-c-struct-and-nested-pointee-sections-ice.json +113 -0
- offload/_root/data/findings/reviews/nested--cce-fortran-nested-allocatable-component-copy-fault.json +214 -0
- offload/_root/data/findings/reviews/nested--cce-fortran-pointer-to-type-with-allocatable-scalar-component-typed-transfer.json +191 -0
- offload/_root/data/findings/reviews/nested--cce-fortran-update-to-pointer-root-allocatable-scalar-component-no-accelerator-object.json +297 -0
- offload/_root/data/findings/reviews/nested--gcc-acc-c-exit-data-of-a-pointer-array-element-target-hangs.json +204 -0
- offload/_root/data/findings/reviews/nested--gcc-acc-c-parent-and-shared-pointee-one-directive.json +130 -0
- offload/_root/data/findings/reviews/nested--gcc-acc-c-struct-and-member-array-one-directive.json +141 -0
- offload/_root/data/findings/reviews/nested--gcc-c-always-on-pointer-member-section-ice.json +113 -0
- offload/_root/data/findings/reviews/nested--gcc-c-declare-mapper-pointer-member-section-gpu-fault.json +113 -0
- offload/_root/data/findings/reviews/nested--gcc-c-from-struct-and-pointee-section-rejected.json +113 -0
- offload/_root/data/findings/reviews/nested--gcc-fortran-pointer-component-alloc-bounds-lost.json +217 -0
- offload/_root/data/findings/reviews/nested--gcc-fortran-root-and-element-pointer-components-ice.json +217 -0
- offload/_root/data/findings/reviews/nested--nvhpc-c-pointee-before-parent-in-one-map-list-copy-fault.json +204 -0
- offload/_root/data/findings/reviews/nested--nvhpc-c-update-from-structure-overwrites-attached-pointer-segv.json +191 -0
- offload/_root/data/findings/reviews/nvhpc-c-acc-atomic-update-sum-ice.json +277 -0
- offload/_root/data/findings/reviews/nvhpc-c-dist-schedule-chunk-compile-hang.json +113 -0
- offload/_root/data/findings/reviews/nvhpc-c-map-present-ignored.json +113 -0
- offload/_root/data/findings/reviews/nvhpc-c-ordered-in-target-nvcpfe-crash.json +113 -0
- offload/_root/data/findings/reviews/nvhpc-c-parallel-for-firstprivate-in-target.json +113 -0
- offload/_root/data/findings/reviews/nvhpc-defaultmap-firstprivate-explicit-map.json +113 -0
- offload/_root/data/findings/reviews/nvhpc-defaultmap-from-allocatable-indexing.json +132 -0
- offload/_root/data/findings/reviews/nvhpc-depend-inoutset-ignored.json +113 -0
- offload/_root/data/findings/reviews/nvhpc-dist-schedule-chunk-illegal-address.json +113 -0
- offload/_root/data/findings/reviews/nvhpc-managed-acc-shutdown-host-access.json +113 -0
- offload/_root/data/findings/reviews/nvhpc-parallel-if-in-target-nvvm-ice.json +113 -0
- offload/_root/data/findings/reviews/oop--afar-final-dealloc-device-link.json +132 -0
- offload/_root/data/findings/reviews/oop--afar-pdt-length-parameter-not-implemented.json +113 -0
- offload/_root/data/findings/reviews/oop--cce-class-is-device-link.json +130 -0
- offload/_root/data/findings/reviews/oop--cce-copy-alloc-component-section-fault.json +217 -0
- offload/_root/data/findings/reviews/oop--cce-copy-parent-to-component-tofrom-lost.json +217 -0
- offload/_root/data/findings/reviews/oop--cce-copy-second-member-section-lost.json +113 -0
- offload/_root/data/findings/reviews/oop--cce-element-component-map-lost.json +113 -0
- offload/_root/data/findings/reviews/oop--cce-final-dealloc-device-abort.json +208 -0
- offload/_root/data/findings/reviews/oop--cce-pdt-default-mapper-rejected.json +191 -0
- offload/_root/data/findings/reviews/oop--cce-polymorphic-dispatch-device-link.json +247 -0
- offload/_root/data/findings/reviews/oop--cce-section-of-element-component-overlap.json +113 -0
- offload/_root/data/findings/reviews/oop--cce-select-type-guard-not-taken.json +191 -0
- offload/_root/data/findings/reviews/oop--cce-udr-derived-type-unsupported.json +132 -0
- offload/_root/data/findings/reviews/oop--gcc-acc-parent-and-member-data-rejected.json +141 -0
- offload/_root/data/findings/reviews/oop--gcc-pdt-length-parameter-abort.json +141 -0
- offload/_root/data/findings/reviews/oop--gcc-polymorphic-dispatch-abort.json +217 -0
- offload/_root/data/findings/reviews/oop--gcc-vtab-not-marked-for-offload.json +113 -0
- offload/_root/data/findings/reviews/oop--nvhpc-copy-alloc-component-illegal-address.json +113 -0
- offload/_root/data/findings/reviews/oop--nvhpc-copy-pdt-length-parameter-illegal-address.json +236 -0
- offload/_root/data/findings/reviews/oop--nvhpc-named-mapper-rejected.json +113 -0
- offload/_root/data/findings/reviews/oop--nvhpc-polymorphic-dispatch-translate-failure.json +223 -0
- offload/_root/data/findings/reviews/oop--nvhpc-polymorphism-runtime-unsupported.json +126 -0
- offload/_root/data/findings/reviews/oop--nvhpc-type-bound-call-rejected.json +113 -0
- offload/_root/data/findings/reviews/oop--nvhpc-udr-derived-type-rejected.json +113 -0
- offload/_root/data/findings/reviews/stress--afar-c-lastprivate-combined-target-not-mapped.json +113 -0
- offload/_root/data/findings/reviews/stress--afar-target-scalar-implicit-firstprivate.json +175 -0
- offload/_root/data/findings/reviews/stress--cce-acc-declare-create-scalar-serial-firstprivate.json +113 -0
- offload/_root/data/findings/reviews/stress--cce-c-distribute-lastprivate-lost.json +113 -0
- offload/_root/data/findings/reviews/stress--cce-c-flto-offload-dropped.json +204 -0
- offload/_root/data/findings/reviews/stress--cce-ftn-cif-record-split-abort.json +113 -0
- offload/_root/data/findings/reviews/stress--cce-lastprivate-num-threads-collapse-simd.json +113 -0
- offload/_root/data/findings/reviews/stress--cce-teams-reduction-many-teams-wrap.json +113 -0
- offload/_root/data/findings/reviews/stress--cce21-declare-target-scalar-map-write-lost.json +113 -0
- offload/_root/data/findings/reviews/stress--gcc-declare-target-allocatable-component-ice.json +191 -0
- offload/_root/data/findings/reviews/stress--nvhpc-acc-derived-type-component-not-copied.json +126 -0
- offload/_root/data/findings/reviews/stress--nvhpc-c-lastprivate-teams-distribute-parallel-for-lost.json +113 -0
- offload/_root/data/findings/reviews/stress--nvhpc-declare-target-scalar-write-lost.json +113 -0
- offload/_root/data/findings/reviews/stress--nvhpc-lastprivate-combined-target-not-mapped.json +113 -0
- offload/_root/data/findings/reviews/stress--nvhpc-target-scalar-implicit-firstprivate.json +130 -0
- offload/_root/data/findings/reviews/target-update-sections-in-parallel.json +113 -0
- offload/_root/data/findings/stress/afar-c-lastprivate-combined-target-not-mapped.c +72 -0
- offload/_root/data/findings/stress/afar-target-scalar-implicit-firstprivate.f90 +47 -0
- offload/_root/data/findings/stress/cce-acc-declare-create-scalar-serial-firstprivate.f90 +43 -0
- offload/_root/data/findings/stress/cce-c-distribute-lastprivate-lost.c +52 -0
- offload/_root/data/findings/stress/cce-c-flto-offload-dropped.c +73 -0
- offload/_root/data/findings/stress/cce-ftn-cif-record-split-abort.f90 +109 -0
- offload/_root/data/findings/stress/cce-lastprivate-num-threads-collapse-simd.f90 +66 -0
- offload/_root/data/findings/stress/cce-teams-reduction-many-teams-wrap.f90 +55 -0
- offload/_root/data/findings/stress/cce21-declare-target-scalar-map-write-lost.f90 +58 -0
- offload/_root/data/findings/stress/controls/gcc-declare-target-allocatable-component-control.f90 +29 -0
- offload/_root/data/findings/stress/gcc-declare-target-allocatable-component-ice.f90 +61 -0
- offload/_root/data/findings/stress/nvhpc-acc-derived-type-component-not-copied.f90 +33 -0
- offload/_root/data/findings/stress/nvhpc-c-lastprivate-teams-distribute-parallel-for-lost.c +62 -0
- offload/_root/data/findings/stress/nvhpc-declare-target-scalar-write-lost.f90 +43 -0
- offload/_root/data/findings/stress/nvhpc-lastprivate-combined-target-not-mapped.f90 +60 -0
- offload/_root/data/findings/stress/nvhpc-target-scalar-implicit-firstprivate.f90 +41 -0
- offload/_root/data/findings/target-update-sections-in-parallel.f90 +53 -0
- offload/_root/data/issues.json +1 -0
- offload/_root/data/search.json +1 -0
- offload/_root/data/vendor/checks/build.py +288 -0
- offload/_version.py +24 -0
- offload/canuse.py +88 -0
- offload/cli.py +52 -0
- offload/data.py +85 -0
- offload/engine/__init__.py +0 -0
- offload/engine/acc_c_gen.py +415 -0
- offload/engine/acc_gen.py +1104 -0
- offload/engine/acc_rules.py +656 -0
- offload/engine/apps.py +804 -0
- offload/engine/baseline.py +324 -0
- offload/engine/c_gen.py +883 -0
- offload/engine/c_program.py +913 -0
- offload/engine/c_rules.py +503 -0
- offload/engine/campaign.py +1180 -0
- offload/engine/campaigns/__init__.py +2 -0
- offload/engine/campaigns/hecbench.py +153 -0
- offload/engine/campaigns/nested.py +76 -0
- offload/engine/campaigns/oop.py +61 -0
- offload/engine/canary.py +275 -0
- offload/engine/catalog.py +860 -0
- offload/engine/citations.py +532 -0
- offload/engine/clang_oracle.py +208 -0
- offload/engine/combos.py +234 -0
- offload/engine/confirm/__init__.py +2 -0
- offload/engine/confirm/backlog.py +159 -0
- offload/engine/confirm/claims.py +423 -0
- offload/engine/confirm/collectors.py +665 -0
- offload/engine/confirm/decisions.py +202 -0
- offload/engine/confirm/draft.py +195 -0
- offload/engine/confirm/engine.py +157 -0
- offload/engine/confirm/execute.py +382 -0
- offload/engine/confirm/facts.py +467 -0
- offload/engine/confirm/findings.py +617 -0
- offload/engine/confirm/forms.py +145 -0
- offload/engine/confirm/ingest.py +372 -0
- offload/engine/confirm/jobs.py +215 -0
- offload/engine/confirm/legality.py +323 -0
- offload/engine/confirm/machines.py +254 -0
- offload/engine/confirm/minimize.py +268 -0
- offload/engine/confirm/model.py +249 -0
- offload/engine/confirm/ports.py +107 -0
- offload/engine/confirm/programs.py +222 -0
- offload/engine/confirm/registry.py +151 -0
- offload/engine/confirm/regress.py +278 -0
- offload/engine/confirm/rules.py +565 -0
- offload/engine/confirm/store.py +63 -0
- offload/engine/confirm/triage.py +838 -0
- offload/engine/confirm/validate.py +607 -0
- offload/engine/confirm/witness.py +355 -0
- offload/engine/corpus_check.py +388 -0
- offload/engine/coverage.py +318 -0
- offload/engine/dataenv_gen.py +1318 -0
- offload/engine/dataenv_rules.py +278 -0
- offload/engine/devtemps.py +146 -0
- offload/engine/expected.py +2559 -0
- offload/engine/f2c.py +1783 -0
- offload/engine/finding_claims.py +330 -0
- offload/engine/finding_header.py +229 -0
- offload/engine/finding_rows.py +382 -0
- offload/engine/flang_oracle.py +299 -0
- offload/engine/fsource.py +620 -0
- offload/engine/fuzz.py +2455 -0
- offload/engine/fuzz_base.py +2016 -0
- offload/engine/fuzz_campaign.py +592 -0
- offload/engine/fuzz_exec.py +798 -0
- offload/engine/fuzz_min.py +1049 -0
- offload/engine/fuzz_profile.py +340 -0
- offload/engine/fuzz_report.py +1270 -0
- offload/engine/fuzz_steer.py +181 -0
- offload/engine/gate.py +1013 -0
- offload/engine/gate_report.py +711 -0
- offload/engine/gate_run.py +118 -0
- offload/engine/gate_stored.py +466 -0
- offload/engine/gen.py +1114 -0
- offload/engine/gen_templates.py +2583 -0
- offload/engine/grammar.py +695 -0
- offload/engine/harness.py +1472 -0
- offload/engine/harvest/__init__.py +3 -0
- offload/engine/harvest/c_runtime.py +465 -0
- offload/engine/harvest/checks.py +534 -0
- offload/engine/harvest/convert.py +784 -0
- offload/engine/harvest/f_runtime.py +668 -0
- offload/engine/harvest/filters.py +338 -0
- offload/engine/harvest/history.py +122 -0
- offload/engine/harvest/inventory.py +399 -0
- offload/engine/harvest2/__init__.py +5 -0
- offload/engine/harvest2/aomp.py +119 -0
- offload/engine/harvest2/examples.py +116 -0
- offload/engine/harvest2/gomp.py +679 -0
- offload/engine/harvest2/hand.py +150 -0
- offload/engine/harvest2/split.py +78 -0
- offload/engine/harvest_known/__init__.py +2 -0
- offload/engine/harvest_known/apps.py +65 -0
- offload/engine/harvest_known/cases.py +128 -0
- offload/engine/harvest_known/centres.py +184 -0
- offload/engine/harvest_known/forum.py +180 -0
- offload/engine/harvest_known/relnotes.py +42 -0
- offload/engine/harvest_known/textscan.py +107 -0
- offload/engine/hdrwrap.py +42 -0
- offload/engine/hecbench.py +568 -0
- offload/engine/hecbench_report.py +265 -0
- offload/engine/hecbench_run.py +483 -0
- offload/engine/idioms.py +1427 -0
- offload/engine/kbody_cites.py +81 -0
- offload/engine/kbody_emit.py +949 -0
- offload/engine/kbody_gen.py +795 -0
- offload/engine/legality_review.py +236 -0
- offload/engine/localcfg.py +58 -0
- offload/engine/malloc_dd.py +267 -0
- offload/engine/mutate.py +1933 -0
- offload/engine/nested_cites.py +196 -0
- offload/engine/nested_emit.py +789 -0
- offload/engine/nested_gen.py +1721 -0
- offload/engine/offload_scope.py +197 -0
- offload/engine/ompvv.py +624 -0
- offload/engine/oop_gen.py +2249 -0
- offload/engine/prerun.py +1435 -0
- offload/engine/program_source.py +739 -0
- offload/engine/provenance.py +103 -0
- offload/engine/reduce.py +2098 -0
- offload/engine/report.py +3374 -0
- offload/engine/root.py +33 -0
- offload/engine/rules.py +4256 -0
- offload/engine/run_matrix.py +325 -0
- offload/engine/site/__init__.py +1 -0
- offload/engine/site/columns.py +53 -0
- offload/engine/site/data.py +648 -0
- offload/engine/site/header.py +228 -0
- offload/engine/site/inputs.py +115 -0
- offload/engine/site/matrix.py +434 -0
- offload/engine/site/scrub.py +294 -0
- offload/engine/skeleton.py +121 -0
- offload/engine/spec_text.py +242 -0
- offload/engine/stress.py +4122 -0
- offload/engine/stress_c.py +1000 -0
- offload/engine/stress_exec.py +805 -0
- offload/engine/stress_min.py +248 -0
- offload/engine/stress_report.py +552 -0
- offload/engine/textclean.py +97 -0
- offload/engine/toolchains.py +1070 -0
- offload/engine/transforms.py +511 -0
- offload/engine/usage.py +1252 -0
- offload/engine/widen.py +673 -0
- offload/engine/widen_progs.py +2396 -0
- offload/issues.py +146 -0
- offtarget-0.1.0.dist-info/METADATA +86 -0
- offtarget-0.1.0.dist-info/RECORD +886 -0
- offtarget-0.1.0.dist-info/WHEEL +4 -0
- offtarget-0.1.0.dist-info/entry_points.txt +2 -0
- offtarget-0.1.0.dist-info/licenses/LICENSE +21 -0
- 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]}
|