gcc/
authorrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 5 Feb 2007 10:41:26 +0000 (10:41 +0000)
committerrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 5 Feb 2007 10:41:26 +0000 (10:41 +0000)
* dwarf2out.c (dwarf2out_frame_debug_expr): Record the register
saves in a PARALLEL before the register assignments.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@121594 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/dwarf2out.c

index ad824be..198dee3 100644 (file)
@@ -1,5 +1,10 @@
 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
        DWARF_FRAME_RETURN_COLUMN to be a general register.
        * dwarf2out.c (init_return_column_size): New function, split from...
index 6cbf9d3..186c979 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;
     }