aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/s390/s390.c
diff options
context:
space:
mode:
authorkrebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4>2017-04-05 08:28:18 +0000
committerkrebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4>2017-04-05 08:28:18 +0000
commita8078ffb9cd3a03f819dd62cdb4f25ac15be9b90 (patch)
tree681050570a7afb224418ef45c293b79c3d1c5fc7 /gcc/config/s390/s390.c
parentd88c619ac9510a50e7acc57708d44c7bde471a65 (diff)
PR target/79890: S/390: Fix crash.
builtin_eh_return requires the return address to be saved on the stack. The patch prevents using an FPR for that. gcc/ChangeLog: 2017-04-05 Dominik Vogt <vogt@linux.vnet.ibm.com> PR target/79890 * config/s390/s390.c (s390_register_info_gprtofpr): Return if call_eh_return is true. gcc/testsuite/ChangeLog: 2017-04-05 Dominik Vogt <vogt@linux.vnet.ibm.com> PR target/79890 * gcc.target/s390/pr79890.c: New test case. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@246701 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/s390/s390.c')
-rw-r--r--gcc/config/s390/s390.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c
index 51b3d46924b..2cb8947e5a6 100644
--- a/gcc/config/s390/s390.c
+++ b/gcc/config/s390/s390.c
@@ -9512,6 +9512,12 @@ s390_register_info_gprtofpr ()
if (!TARGET_Z10 || !TARGET_HARD_FLOAT || !crtl->is_leaf)
return;
+ /* builtin_eh_return needs to be able to modify the return address
+ on the stack. It could also adjust the FPR save slot instead but
+ is it worth the trouble?! */
+ if (crtl->calls_eh_return)
+ return;
+
for (i = 15; i >= 6; i--)
{
if (cfun_gpr_save_slot (i) == SAVE_SLOT_NONE)