You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
RS4GC: 02_survivor_promotion segfaults under forced evacuation on aarch64-ELF #7392
The native-roots-rs4gc (ubuntu-24.04-arm, aarch64, ELF) arm now gets much further:
Wrote executable: /tmp/rs4gc-01_nursery_churn ← compiles AND runs
#gcmetric heap_used_bytes=9728392 ← collector reported
Wrote executable: /tmp/rs4gc-02_survivor_promotion ← compiles AND links
Segmentation fault (core dumped) PERRY_RS4GC=1 PERRY_GC_FORCE_EVAC…
Before #7390 the arm could not compile a single module, so this crash had never been reachable. It is not a toolchain gap — it is a GC correctness bug in statepoint lowering, in exactly the mode the arm exists to test.
Why 02_survivor_promotion specifically
The probe exercises the promotion path under PERRY_GC_FORCE_EVACUATE, so the likely shape is a root the statepoint lowering fails to relocate across a promoting collection — as opposed to the plain nursery evacuation that 01_nursery_churn survives.
The question worth answering first
macOS aarch64 uses the same statepoint lowering. If this were lowering-generic it should fail there too. So either:
it is ELF-specific (different frame layout, different register allocation), or
the macOS arm has never actually run this probe
Given this repo's recent record of arms that queue and never execute (three of the four RS4GC arms have sat pending on every run I checked today), the second possibility needs ruling out by evidence rather than assumption. That check is cheap and should come before any lowering investigation.
This issue is not answerable as filed — the comparison it rests on doesn't exist.
I checked whether the macOS arm disagrees with the ELF arm, since both use the same statepoint lowering. Across ten consecutive gc-native-roots runs the macos-14 arm was queued every single time — never executed, not once. ubuntu-latest (x86-64 ELF) and windows-latest (PE) likewise. Only the aarch64 arm has ever reached a runner.
Cause was a missing concurrency group, fixed in #7393. Until that has landed and the other arms have actually run at least once, "the segfault is ELF-specific" and "the macOS arm has never run the probe" are indistinguishable.
Sequencing: let #7393 land, confirm the macOS / x86-64 / PE arms execute, then re-read this. If macOS also segfaults, this is a lowering bug and not an ELF one, and the title is wrong.
Activity
ci(gc): give gc-native-roots a concurrency group (#7393)
proggeramlug commentedon Aug 4, 2026
This issue is not answerable as filed — the comparison it rests on doesn't exist.
I checked whether the macOS arm disagrees with the ELF arm, since both use the same statepoint lowering. Across ten consecutive
gc-native-rootsruns themacos-14arm wasqueuedevery single time — never executed, not once.ubuntu-latest(x86-64 ELF) andwindows-latest(PE) likewise. Only the aarch64 arm has ever reached a runner.Cause was a missing
concurrencygroup, fixed in #7393. Until that has landed and the other arms have actually run at least once, "the segfault is ELF-specific" and "the macOS arm has never run the probe" are indistinguishable.Sequencing: let #7393 land, confirm the macOS / x86-64 / PE arms execute, then re-read this. If macOS also segfaults, this is a lowering bug and not an ELF one, and the title is wrong.
ci(gc): assert each non-default walker actually ran
fix(gc): walk legal 8-mod-16 frame records, and stop moving unwinder …