diff options
author | Sverker Eriksson <[email protected]> | 2014-10-10 17:42:13 +0200 |
---|---|---|
committer | Sverker Eriksson <[email protected]> | 2014-10-21 17:03:21 +0200 |
commit | bc59e9a04bf446b3a73f20ca0e91c122de7aa571 (patch) | |
tree | ad59f272c6995a0dc85222ea473c674285fce503 /erts/emulator/hipe/hipe_risc_glue.h | |
parent | 5a87432bf4273e6e7619f24de1781c51bf6dbd95 (diff) | |
download | otp-bc59e9a04bf446b3a73f20ca0e91c122de7aa571.tar.gz otp-bc59e9a04bf446b3a73f20ca0e91c122de7aa571.tar.bz2 otp-bc59e9a04bf446b3a73f20ca0e91c122de7aa571.zip |
erts: Fix bug when hipe tailcalls trapping BIF that disables GC
Symptom: base64_SUITE:roundtrip crashes with hipe compiled stdlib.
Problem: HIPE_WRAPPER_BIF_DISABLE_GC pushed a "trap frame", but the frame
was only popped if the call was recursive.
Solution: Only reserve "trap frame" if BIF call is recursive.
Diffstat (limited to 'erts/emulator/hipe/hipe_risc_glue.h')
-rw-r--r-- | erts/emulator/hipe/hipe_risc_glue.h | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/erts/emulator/hipe/hipe_risc_glue.h b/erts/emulator/hipe/hipe_risc_glue.h index cc2671c016..dbb7086dae 100644 --- a/erts/emulator/hipe/hipe_risc_glue.h +++ b/erts/emulator/hipe/hipe_risc_glue.h @@ -214,6 +214,14 @@ hipe_trap_from_native_is_recursive(Process *p) return 0; } +/* Native called BIF. Is it a recursive call? + i.e should we return back to native when BIF is done? */ +static __inline__ int +hipe_bifcall_from_native_is_recursive(Process *p) +{ + return (p->hipe.nra != (void(*)(void))&nbif_return); +} + /* Native makes a call which needs to unload the parameters. This differs from hipe_call_from_native_is_recursive() in |