Summary
PERRY_GC_TRACE=1 crashes the program it is supposed to be observing. Under the evacuating arms, test_gap_repsel_scalar_replaced_locals SIGSEGVs with the flag set and passes without it.
This matters more than an ordinary flag bug: PERRY_GC_TRACE=1 is the tool this whole campaign relies on to prove a GC arm was live. PERRY_GC_DIAG under-reports (it only prints on some paths), so GC_TRACE's one-marker-per-completed-cycle output is the primary evidence that a green cell means anything. A green cell from an inert arm is exactly the false confidence that invalidated months of this project's earlier results (#6942, #6946, #6950).
So the instrument crashes on the case that most needs instrumenting.
Reproduction
PERRY_GC_HEAP_LIMIT=8 PERRY_GC_INCREMENTAL=0 PERRY_CONSERVATIVE_STACK_SCAN=off \
PERRY_GC_TRACE=1 ./test_gap_repsel_scalar_replaced_locals
- with
PERRY_GC_TRACE=1 → SIGSEGV
- without it → passes, byte-identical to the pinned Node 26.5.0 oracle, with
copied_objects in the 261 251 – 379 072 range
Not a regression from the hoist
Confirmed pre-existing: reproduced identically on a rebuilt main without PR #7013, same arms, same failure. Reported during #7013's validation and deliberately not folded into that PR.
Status of this report
Measured by the agent that landed #7013; I have not independently re-verified it. First step for whoever picks this up is to reproduce both arms above before doing anything else.
Why it is plausible
The tracer runs inside a collection, walking structures the collector is mid-way through mutating — during an evacuating cycle, objects are being copied and forwarded while the trace reads them. A tracer that dereferences a forwarded-but-not-yet-rewritten pointer, or reads a header on an object already evacuated, would fault exactly here. That is a hypothesis, not a diagnosis; the stack will say.
Note the interaction with #6998 and #6995: both concern root words that are not what the decoder expects, and is_plausible_heap_addr is the shared predicate. If the tracer classifies raw words the same way, it may share their root cause.
Why it should be fixed rather than worked around
Every liveness claim in this campaign — "the arm moved N objects", "no green cell came from an inert arm" — is downstream of this flag. If it cannot run on the evacuating arms for some corpus files, then for those files we have no liveness evidence at all, and cells we currently call verified are only presumed verified.
Summary
PERRY_GC_TRACE=1crashes the program it is supposed to be observing. Under the evacuating arms,test_gap_repsel_scalar_replaced_localsSIGSEGVs with the flag set and passes without it.This matters more than an ordinary flag bug:
PERRY_GC_TRACE=1is the tool this whole campaign relies on to prove a GC arm was live.PERRY_GC_DIAGunder-reports (it only prints on some paths), soGC_TRACE's one-marker-per-completed-cycle output is the primary evidence that a green cell means anything. A green cell from an inert arm is exactly the false confidence that invalidated months of this project's earlier results (#6942, #6946, #6950).So the instrument crashes on the case that most needs instrumenting.
Reproduction
PERRY_GC_TRACE=1→ SIGSEGVcopied_objectsin the 261 251 – 379 072 rangeNot a regression from the hoist
Confirmed pre-existing: reproduced identically on a rebuilt
mainwithout PR #7013, same arms, same failure. Reported during #7013's validation and deliberately not folded into that PR.Status of this report
Measured by the agent that landed #7013; I have not independently re-verified it. First step for whoever picks this up is to reproduce both arms above before doing anything else.
Why it is plausible
The tracer runs inside a collection, walking structures the collector is mid-way through mutating — during an evacuating cycle, objects are being copied and forwarded while the trace reads them. A tracer that dereferences a forwarded-but-not-yet-rewritten pointer, or reads a header on an object already evacuated, would fault exactly here. That is a hypothesis, not a diagnosis; the stack will say.
Note the interaction with #6998 and #6995: both concern root words that are not what the decoder expects, and
is_plausible_heap_addris the shared predicate. If the tracer classifies raw words the same way, it may share their root cause.Why it should be fixed rather than worked around
Every liveness claim in this campaign — "the arm moved N objects", "no green cell came from an inert arm" — is downstream of this flag. If it cannot run on the evacuating arms for some corpus files, then for those files we have no liveness evidence at all, and cells we currently call verified are only presumed verified.