Commit 282efe1c by Richard Henderson Committed by Richard Henderson

unwind-dw2.c (_Unwind_GetGR): Honor DWARF_ZERO_REG.

        * unwind-dw2.c (_Unwind_GetGR): Honor DWARF_ZERO_REG.
        * doc/tm.texi (DWARF_ZERO_REG): New.
        * config/alpha/alpha.c (alpha_sa_mask, alpha_expand_prologue,
        alpha_expand_epilogue): Revert 2003-09-30 change to store zero.
        * config/alpha/alpha.h (DWARF_ZERO_REG): New.

From-SVN: r88331
parent de399303
2004-09-29 Richard Henderson <rth@redhat.com>
* unwind-dw2.c (_Unwind_GetGR): Honor DWARF_ZERO_REG.
* doc/tm.texi (DWARF_ZERO_REG): New.
* config/alpha/alpha.c (alpha_sa_mask, alpha_expand_prologue,
alpha_expand_epilogue): Revert 2003-09-30 change to store zero.
* config/alpha/alpha.h (DWARF_ZERO_REG): New.
2004-09-29 Ulrich Weigand <uweigand@de.ibm.com> 2004-09-29 Ulrich Weigand <uweigand@de.ibm.com>
* builtins.c (expand_builtin_strlen): Do not call emit_move_insn * builtins.c (expand_builtin_strlen): Do not call emit_move_insn
......
...@@ -5924,11 +5924,6 @@ alpha_sa_mask (unsigned long *imaskP, unsigned long *fmaskP) ...@@ -5924,11 +5924,6 @@ alpha_sa_mask (unsigned long *imaskP, unsigned long *fmaskP)
break; break;
imask |= 1UL << regno; imask |= 1UL << regno;
} }
/* Glibc likes to use $31 as an unwind stopper for crt0. To
avoid hackery in unwind-dw2.c, we need to actively store a
zero in the prologue of _Unwind_RaiseException et al. */
imask |= 1UL << 31;
} }
/* If any register spilled, then spill the return address also. */ /* If any register spilled, then spill the return address also. */
...@@ -6451,14 +6446,6 @@ alpha_expand_prologue (void) ...@@ -6451,14 +6446,6 @@ alpha_expand_prologue (void)
reg_offset += 8; reg_offset += 8;
} }
/* Store a zero if requested for unwinding. */
if (imask & (1UL << 31))
{
emit_frame_store_1 (const0_rtx, sa_reg, sa_bias, reg_offset,
gen_rtx_REG (Pmode, 31));
reg_offset += 8;
}
for (i = 0; i < 31; i++) for (i = 0; i < 31; i++)
if (fmask & (1UL << i)) if (fmask & (1UL << i))
{ {
...@@ -6876,9 +6863,6 @@ alpha_expand_epilogue (void) ...@@ -6876,9 +6863,6 @@ alpha_expand_epilogue (void)
reg_offset += 8; reg_offset += 8;
} }
if (imask & (1UL << 31))
reg_offset += 8;
for (i = 0; i < 31; ++i) for (i = 0; i < 31; ++i)
if (fmask & (1UL << i)) if (fmask & (1UL << i))
{ {
......
...@@ -1183,6 +1183,7 @@ do { \ ...@@ -1183,6 +1183,7 @@ do { \
#define INCOMING_RETURN_ADDR_RTX gen_rtx_REG (Pmode, 26) #define INCOMING_RETURN_ADDR_RTX gen_rtx_REG (Pmode, 26)
#define DWARF_FRAME_RETURN_COLUMN DWARF_FRAME_REGNUM (26) #define DWARF_FRAME_RETURN_COLUMN DWARF_FRAME_REGNUM (26)
#define DWARF_ALT_FRAME_RETURN_COLUMN DWARF_FRAME_REGNUM (64) #define DWARF_ALT_FRAME_RETURN_COLUMN DWARF_FRAME_REGNUM (64)
#define DWARF_ZERO_REG 31
/* Describe how we implement __builtin_eh_return. */ /* Describe how we implement __builtin_eh_return. */
#define EH_RETURN_DATA_REGNO(N) ((N) < 4 ? (N) + 16 : INVALID_REGNUM) #define EH_RETURN_DATA_REGNO(N) ((N) < 4 ? (N) + 16 : INVALID_REGNUM)
......
...@@ -2974,6 +2974,14 @@ general register, but an alternate column needs to be used for ...@@ -2974,6 +2974,14 @@ general register, but an alternate column needs to be used for
signal frames. signal frames.
@end defmac @end defmac
@defmac DWARF_ZERO_REG
A C expression whose value is an integer giving a DWARF 2 register
number that is considered to always have the value zero. This should
only be defined if the target has an architected zero register, and
someone decided it was a good idea to use that register number to
terminate the stack backtrace. New ports should avoid this.
@end defmac
@defmac INCOMING_FRAME_SP_OFFSET @defmac INCOMING_FRAME_SP_OFFSET
A C expression whose value is an integer giving the offset, in bytes, A C expression whose value is an integer giving the offset, in bytes,
from the value of the stack pointer register to the top of the stack from the value of the stack pointer register to the top of the stack
......
...@@ -125,6 +125,11 @@ _Unwind_GetGR (struct _Unwind_Context *context, int index) ...@@ -125,6 +125,11 @@ _Unwind_GetGR (struct _Unwind_Context *context, int index)
int size; int size;
void *ptr; void *ptr;
#ifdef DWARF_ZERO_REG
if (index == DWARF_ZERO_REG)
return 0;
#endif
index = DWARF_REG_TO_UNWIND_COLUMN (index); index = DWARF_REG_TO_UNWIND_COLUMN (index);
if (index >= (int) sizeof(dwarf_reg_size_table)) if (index >= (int) sizeof(dwarf_reg_size_table))
abort (); abort ();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment