aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gnat.dg/thunk1.adb
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2020-09-14 17:24:32 +0200
committerEric Botcazou <ebotcazou@adacore.com>2020-09-14 17:38:39 +0200
commita7d8dcdf2f3cf9a801e655f2eec3967a3a3ba666 (patch)
treec8845d0fd0b213f1143e93ca46b864115f920cfb /gcc/testsuite/gnat.dg/thunk1.adb
parent863e8d53eb2940e2c8850e632afe427e164f53cf (diff)
downloadgcc-a7d8dcdf2f3cf9a801e655f2eec3967a3a3ba666.zip
gcc-a7d8dcdf2f3cf9a801e655f2eec3967a3a3ba666.tar.gz
gcc-a7d8dcdf2f3cf9a801e655f2eec3967a3a3ba666.tar.bz2
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.
Diffstat (limited to 'gcc/testsuite/gnat.dg/thunk1.adb')
-rw-r--r--gcc/testsuite/gnat.dg/thunk1.adb9
1 files changed, 9 insertions, 0 deletions
diff --git a/gcc/testsuite/gnat.dg/thunk1.adb b/gcc/testsuite/gnat.dg/thunk1.adb
new file mode 100644
index 0000000..278e023
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/thunk1.adb
@@ -0,0 +1,9 @@
+-- { dg-do run }
+
+with Thunk1_Pkg1; use Thunk1_Pkg1;
+
+procedure Thunk1 is
+ D: Derived;
+begin
+ D.Op ("Message");
+end;