This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[3.1 PATCH] Serious regression on s390
- From: Ulrich Weigand <weigand at immd1 dot informatik dot uni-erlangen dot de>
- To: gcc-patches at gcc dot gnu dot org
- Cc: ulrich dot weigand at de dot ibm dot com
- Date: Thu, 25 Apr 2002 17:11:50 +0200 (MET DST)
- Subject: [3.1 PATCH] Serious regression on s390
[Re-sent from different address due to mail blocklist problems ...]
Hello Mark,
this patch fixes a serious regression introduced by a recent patch
to correctly handle global register variables: if a fixed register
(e.g. the stack pointer) is defined as global register, it must be
restored in the epilog code anyway, otherwise we will crash.
I'm aware that it is questionable whether using a fixed register as
global register variable is allowed in the first place, but
unfortunately existing code, in particular the libpthread library,
uses this trick to read the current value of the stack pointer.
To avoid breaking this, I'd like to add the following fix to 3.1.
(Otherwise all programs linked against a libpthread compiled with
3.1 will immediately crash.)
Mark, is this OK at this point?
Bye,
Ulrich
ChangeLog:
* config/s390/s390.c (s390_emit_epilogue): Always restore fixed
registers, even if they are used as global regs.
Index: gcc/config/s390/s390.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/s390/s390.c,v
retrieving revision 1.27.2.6
diff -c -p -r1.27.2.6 s390.c
*** gcc/config/s390/s390.c 17 Apr 2002 15:59:45 -0000 1.27.2.6
--- gcc/config/s390/s390.c 25 Apr 2002 14:35:05 -0000
*************** s390_emit_epilogue ()
*** 3255,3261 ****
i <= frame.last_save_gpr;
i++)
{
! if (global_regs[i])
{
addr = plus_constant (frame_pointer,
offset + i * UNITS_PER_WORD);
--- 3255,3261 ----
i <= frame.last_save_gpr;
i++)
{
! if (global_regs[i] && !fixed_regs[i])
{
addr = plus_constant (frame_pointer,
offset + i * UNITS_PER_WORD);
--
Dr. Ulrich Weigand
weigand@informatik.uni-erlangen.de