Skip to main content

comes_back

Function comes_back 

Source
pub fn comes_back(func: &Func, names: &Interner, elsewhere: &Elsewhere) -> bool
Expand description

Whether control can come back into this function a second time from one call, through a __builtin_setjmp or a call to one of TWICE or to a function declared returns_twice.

The frame of such a function is laid out with nothing sharing anything. A value computed before the setjmp and read after the longjmp is live across the call on the arm that reads it, and dead on the arm that ran first, so liveness lets that arm reuse its spill slot. Registers are safe, since the jump puts back the callee saved registers the setjmp wrote down, but a spill slot is only memory and comes back holding whatever the first arm left in it. 7.13.2.1p3 only lets a local that changed after the setjmp come back indeterminate, and this one did not. Postgres’s PG_TRY is sigsetjmp with exactly this shape, and gcc answers the same way by giving nothing live across such a call a slot it shares.