From a1d50f1d77fcda2c1a299477d44b12760e9c5398 Mon Sep 17 00:00:00 2001
From: rsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Mon, 5 Feb 2007 10:41:26 +0000
Subject: [PATCH] gcc/ 	* 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   |  5 +++++
 gcc/dwarf2out.c | 28 +++++++++++++++++++++++-----
 2 files changed, 28 insertions(+), 5 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ad824be9af5c..198dee3817b0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 6cbf9d3874d4..186c979abb55 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -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;
     }
 
-- 
GitLab