dwarf2out.c (dwarf2out_frame_debug_expr): Record the register saves in a PARALLEL...
authorRichard Sandiford <richard@codesourcery.com>
Mon, 5 Feb 2007 10:41:26 +0000 (10:41 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Mon, 5 Feb 2007 10:41:26 +0000 (10:41 +0000)
gcc/
* dwarf2out.c (dwarf2out_frame_debug_expr): Record the register
saves in a PARALLEL before the register assignments.

From-SVN: r121594

gcc/ChangeLog
gcc/dwarf2out.c

index ad824be9af5cabc1106bb72000a5aac95b7d6ef7..198dee3817b01dd3089191e565aabbad46decfde 100644 (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
index 6cbf9d3874d4675c72de813a679b5772ebd33c21..186c979abb55c1a3bed5e572576d01f3621a54f2 100644 (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;
     }