diff options
author | krebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2017-04-05 08:28:18 +0000 |
---|---|---|
committer | krebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2017-04-05 08:28:18 +0000 |
commit | a8078ffb9cd3a03f819dd62cdb4f25ac15be9b90 (patch) | |
tree | 681050570a7afb224418ef45c293b79c3d1c5fc7 /gcc/config/s390/s390.c | |
parent | d88c619ac9510a50e7acc57708d44c7bde471a65 (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.c | 6 |
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) |