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:
Richard Sandiford 2007-02-05 10:41:26 +00:00 committed by Richard Sandiford
parent 5cd0f9153d
commit 55d6f63112
2 changed files with 28 additions and 5 deletions

View File

@ -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

View File

@ -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;
}