dwarf2out.c (dwarf2out_frame_debug_expr): Record the register saves in a PARALLEL before the register assignments.
gcc/ * dwarf2out.c (dwarf2out_frame_debug_expr): Record the register saves in a PARALLEL before the register assignments. From-SVN: r121594
This commit is contained in:
parent
5cd0f9153d
commit
55d6f63112
@ -1,3 +1,8 @@
|
||||
2007-02-05 Richard Sandiford <richard@codesourcery.com>
|
||||
|
||||
* dwarf2out.c (dwarf2out_frame_debug_expr): Record the register
|
||||
saves in a PARALLEL before the register assignments.
|
||||
|
||||
2007-02-05 Richard Sandiford <richard@codesourcery.com>
|
||||
|
||||
* doc/tm.texi (DWARF_ALT_FRAME_RETURN_COLUMN): Do not require
|
||||
|
@ -1524,13 +1524,31 @@ dwarf2out_frame_debug_expr (rtx expr, const char *label)
|
||||
{
|
||||
int par_index;
|
||||
int limit = XVECLEN (expr, 0);
|
||||
rtx elem;
|
||||
|
||||
/* PARALLELs have strict read-modify-write semantics, so we
|
||||
ought to evaluate every rvalue before changing any lvalue.
|
||||
It's cumbersome to do that in general, but there's an
|
||||
easy approximation that is enough for all current users:
|
||||
handle register saves before register assignments. */
|
||||
if (GET_CODE (expr) == PARALLEL)
|
||||
for (par_index = 0; par_index < limit; par_index++)
|
||||
{
|
||||
elem = XVECEXP (expr, 0, par_index);
|
||||
if (GET_CODE (elem) == SET
|
||||
&& MEM_P (SET_DEST (elem))
|
||||
&& (RTX_FRAME_RELATED_P (elem) || par_index == 0))
|
||||
dwarf2out_frame_debug_expr (elem, label);
|
||||
}
|
||||
|
||||
for (par_index = 0; par_index < limit; par_index++)
|
||||
if (GET_CODE (XVECEXP (expr, 0, par_index)) == SET
|
||||
&& (RTX_FRAME_RELATED_P (XVECEXP (expr, 0, par_index))
|
||||
|| par_index == 0))
|
||||
dwarf2out_frame_debug_expr (XVECEXP (expr, 0, par_index), label);
|
||||
|
||||
{
|
||||
elem = XVECEXP (expr, 0, par_index);
|
||||
if (GET_CODE (elem) == SET
|
||||
&& (!MEM_P (SET_DEST (elem)) || GET_CODE (expr) == SEQUENCE)
|
||||
&& (RTX_FRAME_RELATED_P (elem) || par_index == 0))
|
||||
dwarf2out_frame_debug_expr (elem, label);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user