Skip to content

Statepoint bridge emits no statepoint on invoke — every call inside a try is unrooted #7327

Description

@proggeramlug

The explicit statepoint bridge emits no statepoint on invoke, so every call inside a try is unrooted under PERRY_STATEPOINTS=1.

Evidence

In the emitted IR: 58 invokes, 0 carrying gc.statepoint. Invoked callees include allocating runtime helpers — js_object_alloc_class_inline_keys, js_array_push_f64, js_native_call_method_by_id.

Isolation, same program and runtime, PERRY_STACKMAP_WALKER=unwind:

backend result
explicit bridge 0/3 clean
RS4GC 3/3
shadow stack 3/3

So this is bridge-specific; RS4GC covers invoke correctly.

The reporting is silent about it

--statepoint-report counts "310 textual calls" and never sees these. "0 parser fallbacks" therefore says nothing about any call inside a try — the report's clean bill of health has a hole exactly where exceptions are.

This matters because #7302 moved exception lowering to invoke/landingpad precisely so that try-carrying functions could take statepoints like any other, and #7314 added 09_try_catch_roots.ts because nothing in the suite contained a try at all (0 of 8 probes). The probe passes; the bridge still does not root invoked calls.

Reproducer: wt-spsoak/gc-soak/try_root_probe.ts. Found during the statepoint adoption soak.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions