Fix c/2728
authorBernd Schmidt <bernds@redhat.com>
Thu, 17 May 2001 11:26:04 +0000 (11:26 +0000)
committerBernd Schmidt <bernds@gcc.gnu.org>
Thu, 17 May 2001 11:26:04 +0000 (11:26 +0000)
From-SVN: r42195

gcc/ChangeLog
gcc/stmt.c

index 922449992f49d2e15f9756f0684303793587edc2..72ea1fd02c2c0fbffe322b1d276018dfef7eddc5 100644 (file)
@@ -1,3 +1,8 @@
+2001-05-17  Bernd Schmidt  <bernds@redhat.com>
+
+       * stmt.c (expand_asm_operands): For inout operands, make sure
+       the substitution of '=' for '+' makes it into the rtl.
+
 2001-05-17  Gerald Pfeifer  <pfeifer@dbai.tuwien.ac.at>
 
        * gcc.texi (gccbug): Refer to the web pages for detailed information
index 917f46ba609c74b5e217e78dd0332a456b2af42f..433908aa02421274891070f29a364ef0fb2881a8 100644 (file)
@@ -1328,6 +1328,8 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
   rtx *real_output_rtx = (rtx *) alloca (noutputs * sizeof (rtx));
   enum machine_mode *inout_mode
     = (enum machine_mode *) alloca (noutputs * sizeof (enum machine_mode));
+  const char **output_constraints
+    = alloca (noutputs * sizeof (const char *));
   /* The insn we have emitted.  */
   rtx insn;
   int old_generating_concat_p = generating_concat_p;
@@ -1426,6 +1428,7 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
         message.  */
 
       constraint = TREE_STRING_POINTER (TREE_PURPOSE (tail));
+      output_constraints[i] = constraint;
       c_len = strlen (constraint);
 
       /* Allow the `=' or `+' to not be at the beginning of the string,
@@ -1455,6 +1458,7 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
            memcpy (buf + 1, constraint, j);
          memcpy (buf + 1 + j, p + 1, c_len - j);  /* not -j-1 - copy null */
          constraint = ggc_alloc_string (buf, c_len);
+         output_constraints[i] = constraint;
 
          if (j)
            warning (
@@ -1824,7 +1828,7 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
   if (noutputs == 1 && nclobbers == 0)
     {
       ASM_OPERANDS_OUTPUT_CONSTRAINT (body)
-       = TREE_STRING_POINTER (TREE_PURPOSE (outputs));
+       = output_constraints[0];
       insn = emit_insn (gen_rtx_SET (VOIDmode, output_rtx[0], body));
     }
 
@@ -1853,7 +1857,7 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
                           gen_rtx_ASM_OPERANDS
                           (GET_MODE (output_rtx[i]),
                            TREE_STRING_POINTER (string),
-                           TREE_STRING_POINTER (TREE_PURPOSE (tail)),
+                           output_constraints[i],
                            i, argvec, constraints,
                            filename, line));