Fix dangling references in thunks at -O0
authorEric Botcazou <ebotcazou@adacore.com>
Mon, 14 Sep 2020 15:24:32 +0000 (17:24 +0200)
committerEric Botcazou <ebotcazou@adacore.com>
Mon, 14 Sep 2020 15:38:39 +0000 (17:38 +0200)
commita7d8dcdf2f3cf9a801e655f2eec3967a3a3ba666
treec8845d0fd0b213f1143e93ca46b864115f920cfb
parent863e8d53eb2940e2c8850e632afe427e164f53cf
Fix dangling references in thunks at -O0

When a thunk cannot be emitted in assembly directly, expand_thunk
generates regular GIMPLE code but unconditionally forces a tail
call to the target of the thunk.  That's theoretically OK because
the thunk essentially forwards its parameters to the target, but
in practice the RTL expander can spill parameters passed by reference
on the stack in assign_parm_setup_reg.

gcc/ChangeLog:
* cgraphunit.c (cgraph_node::expand_thunk): Make sure to set
cfun->tail_call_marked when forcing a tail call.
* function.c (assign_parm_setup_reg): Always use a register to
load a parameter passed by reference if cfun->tail_call_marked.

gcc/testsuite/ChangeLog:
* gnat.dg/thunk1.adb: New test.
* gnat.dg/thunk1_pkg1.ads: New helper.
* gnat.dg/thunk1_pkg2.ads: Likewise.
* gnat.dg/thunk1_pkg2.adb: Likewise.
gcc/cgraphunit.c
gcc/function.c
gcc/testsuite/gnat.dg/thunk1.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/thunk1_pkg1.ads [new file with mode: 0644]
gcc/testsuite/gnat.dg/thunk1_pkg2.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/thunk1_pkg2.ads [new file with mode: 0644]