From 5638e30837cb3464b072f3546d51588b302c1950 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralph=20K=C3=BCpper?= Date: Wed, 5 Aug 2026 07:25:32 +0200 Subject: [PATCH 1/2] fix(ci): pin the root-dominance corpus to the shadow-stack lowering The GC Root Dominance gate has been unable to return a verdict since #7370 made statepoints the default. The checker's entire vocabulary is `call void @js_shadow_slot_bind(...)`. Under the stack-map lowering the final IR pass resolves those indices to native allocas and REMOVES the calls (FunctionCodegen::stack_map_slot_count), so the corpus compiled 144 modules containing zero root stores. The gate reported violations: 0 and then refused to pass, because its --min-binds floor caught that its own subject never ran. That is CLAUDE.md's fourth hazard working exactly as designed. Pinning PERRY_RS4GC=0 is sound rather than a dodge: #7340 split the root-set analysis from its lowering, this gate is about the analysis, and both backends share it. The shadow stack is also still the production lowering wherever the runtime cannot walk frames. Measured, same binary and source, only the knob differing: arm=default js_shadow_slot_bind calls = 0 arm=rs4gc0 js_shadow_slot_bind calls = 9 #7370 already fixed this for the unit tests -- helpers.rs records that eight broke when the default flipped and were given NativeRootsPin::shadow(). The corpus shell scripts were the same breakage in another idiom, missed. --- changelog.d/PLACEHOLDER-dominance-corpus.md | 27 +++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 changelog.d/PLACEHOLDER-dominance-corpus.md diff --git a/changelog.d/PLACEHOLDER-dominance-corpus.md b/changelog.d/PLACEHOLDER-dominance-corpus.md new file mode 100644 index 0000000000..500887f85f --- /dev/null +++ b/changelog.d/PLACEHOLDER-dominance-corpus.md @@ -0,0 +1,27 @@ +**Fixed** the `GC Root Dominance` gate has been unable to return a verdict since +#7370 made statepoints the default. + +The checker's entire vocabulary is `call void @js_shadow_slot_bind(...)`. Under +the stack-map lowering the final IR pass resolves those indices to native allocas +and **removes the calls** (`FunctionCodegen::stack_map_slot_count`), so the corpus +compiled 144 modules containing **zero** root stores. The gate reported +`violations: 0` and then correctly refused to pass, because its `--min-binds` +liveness floor caught that its own subject never ran — CLAUDE.md's fourth hazard, +working as designed. + +Both corpus scripts now pin `PERRY_RS4GC=0`. That is sound rather than a dodge: +#7340 split the root-set *analysis* from its lowering, and this gate is about the +analysis, which both backends share. The shadow stack also remains the production +lowering wherever the runtime cannot walk frames. + +Measured, same binary and source, only the knob differing: + +``` +arm=default js_shadow_slot_bind calls = 0 ← reproduces the CI signature +arm=rs4gc0 js_shadow_slot_bind calls = 9 +``` + +#7370 already fixed the equivalent breakage in the unit tests — `helpers.rs` +records that eight tests broke when the default flipped and were given +`NativeRootsPin::shadow()`. The corpus shell scripts were the same breakage in a +different idiom, and were missed. From 39de4d1ca9de181f6bb42c8d8cfb7dfab42a3096 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralph=20K=C3=BCpper?= Date: Wed, 5 Aug 2026 07:25:35 +0200 Subject: [PATCH 2/2] docs: name the fragment for its real PR (#7415) --- .../{PLACEHOLDER-dominance-corpus.md => 7415-dominance-corpus.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename changelog.d/{PLACEHOLDER-dominance-corpus.md => 7415-dominance-corpus.md} (100%) diff --git a/changelog.d/PLACEHOLDER-dominance-corpus.md b/changelog.d/7415-dominance-corpus.md similarity index 100% rename from changelog.d/PLACEHOLDER-dominance-corpus.md rename to changelog.d/7415-dominance-corpus.md