Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/7452-gc-root-dominance-corpus.md
Original file line number Diff line number Diff line change
@@ -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)
18 changes: 17 additions & 1 deletion scripts/gc_root_dominance_corpus.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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 \
Expand Down
Loading