unwind-ia64.c (UNW_REG_B0): New.
* config/ia64/unwind-ia64.c (UNW_REG_B0): New. (struct _Unwind_Context): Expand br_loc to hold it. (uw_frame_state_for): Handle leaf functions better. (uw_update_reg_address): Update for br_loc change. From-SVN: r45024
This commit is contained in:
parent
3dff7ed031
commit
443621af25
@ -1,3 +1,10 @@
|
||||
2001-08-18 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* config/ia64/unwind-ia64.c (UNW_REG_B0): New.
|
||||
(struct _Unwind_Context): Expand br_loc to hold it.
|
||||
(uw_frame_state_for): Handle leaf functions better.
|
||||
(uw_update_reg_address): Update for br_loc change.
|
||||
|
||||
2001-08-18 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* crtstuff.c: Move list heads before code that uses them.
|
||||
|
@ -93,7 +93,7 @@ enum unw_register_index
|
||||
UNW_REG_F31 = UNW_REG_F2 + 29,
|
||||
|
||||
/* Branch registers. */
|
||||
UNW_REG_B1,
|
||||
UNW_REG_B0, UNW_REG_B1,
|
||||
UNW_REG_B5 = UNW_REG_B1 + 4,
|
||||
|
||||
UNW_NUM_REGS
|
||||
@ -205,7 +205,7 @@ struct _Unwind_Context
|
||||
} nat;
|
||||
} ireg[32 - 2];
|
||||
|
||||
unsigned long *br_loc[6 - 1];
|
||||
unsigned long *br_loc[7];
|
||||
void *fr_loc[32 - 2];
|
||||
};
|
||||
|
||||
@ -1471,6 +1471,21 @@ uw_frame_state_for (struct _Unwind_Context *context, _Unwind_FrameState *fs)
|
||||
not profide a personality routine or LSDA. */
|
||||
#ifdef MD_FALLBACK_FRAME_STATE_FOR
|
||||
MD_FALLBACK_FRAME_STATE_FOR (context, fs, success);
|
||||
|
||||
/* [SCRA 11.4.1] A leaf function with no memory stack, no exception
|
||||
handlers, and which keeps the return value in B0 does not need
|
||||
an unwind table entry.
|
||||
|
||||
This can only happen in the frame after unwinding through a signal
|
||||
handler. Avoid infinite looping by requiring that B0 != RP. */
|
||||
if (context->br_loc[0] && *context->br_loc[0] != context->rp)
|
||||
{
|
||||
fs->curr.reg[UNW_REG_RP].where = UNW_WHERE_BR;
|
||||
fs->curr.reg[UNW_REG_RP].when = -1;
|
||||
fs->curr.reg[UNW_REG_RP].val = 0;
|
||||
goto success;
|
||||
}
|
||||
|
||||
return _URC_END_OF_STACK;
|
||||
success:
|
||||
return _URC_NO_REASON;
|
||||
@ -1557,8 +1572,11 @@ uw_update_reg_address (struct _Unwind_Context *context,
|
||||
break;
|
||||
|
||||
case UNW_WHERE_BR:
|
||||
if (rval >= 1 && rval <= 5)
|
||||
addr = context->br_loc[rval - 1];
|
||||
/* Note that while RVAL can only be 1-5 from normal descriptors,
|
||||
we can want to look at B0 due to having manually unwound a
|
||||
signal frame. */
|
||||
if (rval >= 0 && rval <= 5)
|
||||
addr = context->br_loc[rval];
|
||||
else
|
||||
abort ();
|
||||
break;
|
||||
@ -1624,7 +1642,7 @@ uw_update_reg_address (struct _Unwind_Context *context,
|
||||
break;
|
||||
|
||||
case UNW_REG_B1 ... UNW_REG_B5:
|
||||
context->br_loc[regno - UNW_REG_B1] = addr;
|
||||
context->br_loc[regno - UNW_REG_B0] = addr;
|
||||
break;
|
||||
|
||||
case UNW_REG_BSP:
|
||||
|
Loading…
Reference in New Issue
Block a user