diff --git a/changelog.d/7452-gc-root-dominance-corpus.md b/changelog.d/7452-gc-root-dominance-corpus.md new file mode 100644 index 0000000000..28abb4ddb3 --- /dev/null +++ b/changelog.d/7452-gc-root-dominance-corpus.md @@ -0,0 +1 @@ +- **`gc-root-dominance` is a gate again.** The job had been red on `main` since #7370 made statepoints the default root lowering: the checker anchors on `@js_shadow_slot_bind` call sites, statepoints express roots as `gc.statepoint` relocation bundles instead, and the corpus consequently carried 1251 statepoints and zero binds. The checker's own vacuity floor failed the job rather than reporting a false green ("0 root store(s) in the corpus, need at least 1500 — the subject of this check never ran"), but because the context is required, every merge in that window bypassed it. The corpus now compiles with `PERRY_RS4GC=0` so the checker's subject exists: 0 → 3151 root stores, both gated arms exit 0, and the adversarial arm reports 40 planted / 40 caught / 0 missed. This gates the shadow-stack lowering only — the statepoint lowering has no equivalent static check yet, and that gap is named at the call site rather than hidden by lowering the floor. (#7452) diff --git a/scripts/gc_root_dominance_corpus.sh b/scripts/gc_root_dominance_corpus.sh index e06ba84714..cb8fcc8a76 100755 --- a/scripts/gc_root_dominance_corpus.sh +++ b/scripts/gc_root_dominance_corpus.sh @@ -107,7 +107,23 @@ for src in "${sources[@]}"; do # (#7161), so without it this corpus cannot express the bug at all. # PERRY_INLINE_SHADOW_SLOT=0 makes every root store the @js_shadow_slot_bind # call form; the #7088 inline diamond is equivalent but harder to anchor on. - if ! env PERRY_GC_MOVING_LOOP_POLLS=1 \ + # PERRY_RS4GC=0 selects the SHADOW-STACK root lowering. Statepoints became + # the default in #7370, and they express roots as `gc.statepoint` relocation + # bundles rather than `@js_shadow_slot_bind` calls -- so without this the + # corpus contains 1251 statepoints and ZERO binds, the checker's subject + # does not appear at all, and the `--min-binds` floor fails the job. That is + # exactly what has been happening: `gc-root-dominance` has been red on main + # since the default flipped, reporting + # "0 root store(s) in the corpus, need at least 1500". + # + # KNOWN GAP, deliberately not papered over: this gates the shadow-stack + # lowering, which is no longer the default on targets whose frames the + # runtime can walk. The statepoint lowering is currently protected by no + # equivalent static check -- teaching the checker to read relocation bundles + # is a separate change, and pretending otherwise by deleting the floor would + # restore a green tick over an unexamined corpus. + if ! env PERRY_RS4GC=0 \ + PERRY_GC_MOVING_LOOP_POLLS=1 \ PERRY_INLINE_SHADOW_SLOT=0 \ PERRY_NO_AUTO_OPTIMIZE=1 \ "$PERRY_BIN" compile "$src" -o "$scratch/$name" --trace llvm \