]> gcc.gnu.org Git - gcc.git/commitdiff
regmove.c (record_stack_memrefs): Catch all references to the stack pointer.
authorMark Mitchell <mark@codesourcery.com>
Mon, 30 Apr 2001 15:09:51 +0000 (15:09 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Mon, 30 Apr 2001 15:09:51 +0000 (15:09 +0000)
* regmove.c (record_stack_memrefs): Catch all references to the
stack pointer.

* optimize.c (update_cloned_parm): New function.
(maybe_clone_body): Use it.  Update the `this' parameter too.

* gcc.dg/20000724-1.c: Add a clobber of `esp'.

From-SVN: r41687

gcc/ChangeLog
gcc/cp/ChangeLog
gcc/cp/optimize.c
gcc/extend.texi
gcc/regmove.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/20000724-1.c

index 6293ff54c1b465dd50197d468090cac1f340291c..78c48762d136ac8aae6c96a2e3ed10304c5e898e 100644 (file)
@@ -1,3 +1,8 @@
+2001-04-30  Mark Mitchell  <mark@codesourcery.com>
+
+       * regmove.c (record_stack_memrefs): Catch all references to the
+       stack pointer.
+
 2001-04-29  Toomas Rosin <toomas at ns dot tklabor dot ee>
 
        * Makefile.in(stmp-fixinc): quote shell assignment values
index a2e13ec08206104463bb3fa04798c0d17c0d63cd..b3e4d39e8dc929a3e2ac29fb18613046d73d2f58 100644 (file)
@@ -1,3 +1,8 @@
+2001-04-30  Mark Mitchell  <mark@codesourcery.com>
+
+       * optimize.c (update_cloned_parm): New function.
+       (maybe_clone_body): Use it.  Update the `this' parameter too.
+
 2001-04-29  Joseph S. Myers  <jsm28@cam.ac.uk>
 
        * decl2.c (unsupported_options): Add new-abi.
index ae5a1ff3c403a7f3264cb466054eec3c2d995097..5b0298779b73d64a5a339df58994f8d9cc2682e2 100644 (file)
@@ -99,6 +99,7 @@ static tree remap_decl PARAMS ((tree, inline_data *));
 static void remap_block PARAMS ((tree, tree, inline_data *));
 static void copy_scope_stmt PARAMS ((tree *, int *, inline_data *));
 static tree calls_setjmp_r PARAMS ((tree *, int *, void *));
+static void update_cloned_parm PARAMS ((tree, tree));
 
 /* The approximate number of instructions per statement.  This number
    need not be particularly accurate; it is used only to make
@@ -1009,6 +1010,25 @@ calls_setjmp_p (fn)
                                       NULL) != NULL_TREE;
 }
 
+/* CLONED_PARM is a copy of CLONE, generated for a cloned constructor
+   or destructor.  Update it to ensure that the source-position for
+   the cloned parameter matches that for the original, and that the
+   debugging generation code will be able to find the original PARM.  */
+
+static void
+update_cloned_parm (parm, cloned_parm)
+     tree parm;
+     tree cloned_parm;
+{
+  DECL_ABSTRACT_ORIGIN (cloned_parm) = parm;
+  
+  /* The name may have changed from the declaration. */
+  DECL_NAME (cloned_parm) = DECL_NAME (parm);
+  DECL_SOURCE_FILE (cloned_parm) = DECL_SOURCE_FILE (parm);
+  DECL_SOURCE_LINE (cloned_parm) = DECL_SOURCE_LINE (parm);
+  
+}
+
 /* FN is a function that has a complete body.  Clone the body as
    necessary.  Returns non-zero if there's no longer any need to
    process the main body.  */
@@ -1057,6 +1077,10 @@ maybe_clone_body (fn)
       /* Adjust the parameter names and locations. */
       parm = DECL_ARGUMENTS (fn);
       clone_parm = DECL_ARGUMENTS (clone);
+      /* Update the `this' parameter, which is always first.
+        Sometimes, we end update the `this' parameter twice because
+        we process it again in the loop below.  That is harmless.  */
+      update_cloned_parm (parm, clone_parm);
       if (DECL_HAS_IN_CHARGE_PARM_P (fn))
        parm = TREE_CHAIN (parm);
       if (DECL_HAS_VTT_PARM_P (fn))
@@ -1066,13 +1090,8 @@ maybe_clone_body (fn)
       for (; parm;
           parm = TREE_CHAIN (parm), clone_parm = TREE_CHAIN (clone_parm))
        {
-         DECL_ABSTRACT_ORIGIN (clone_parm) = parm;
-
-         /* The name may have changed from the declaration. */
-         DECL_NAME (clone_parm) = DECL_NAME (parm);
-         DECL_SOURCE_FILE (clone_parm) = DECL_SOURCE_FILE (parm);
-         DECL_SOURCE_LINE (clone_parm) = DECL_SOURCE_LINE (parm);
+         /* Update this paramter.  */
+         update_cloned_parm (parm, clone_parm);
          /* We should only give unused information for one clone. */
          if (!first)
            TREE_USED (clone_parm) = 1;
index 7bcba9d63750ce1d4ed8ad11c15356818b3fea03..89c60185d8b0838d11f584485e7609401f783a1e 100644 (file)
@@ -1,4 +1,4 @@
-@c Copyright (C) 1988,89,92,93,94,96,98,99,2000,01 Free Software Foundation, Inc.
+@c Copyright (C) 1988,1989,1992,1993,1994,1996,1998,1999,2000,2001 Free Software Foundation, Inc.
 @c This is part of the GCC manual.
 @c For copying conditions, see the file gcc.texi.
 
@@ -3059,7 +3059,7 @@ memory, you should write the @code{volatile} keyword to prevent future
 versions of GNU CC from moving the instruction around within a core
 region.
 
-An @code{asm} instruction without any operands or clobbers (and ``old
+An @code{asm} instruction without any operands or clobbers (an ``old
 style'' @code{asm}) will not be deleted or moved significantly,
 regardless, unless it is unreachable, the same way as if you had
 written a @code{volatile} keyword.
index 2e0fa9ed5fe14f893f6043397595a5bb429d2c55..bb227006ebd34f37475f98640e606ff06976f2ac 100644 (file)
@@ -2303,11 +2303,16 @@ record_stack_memrefs (xp, data)
        }
       return 1;
     case REG:
-      /* ??? We want be able to handle non-memory stack pointer references
-         later.  For now just discard all insns refering to stack pointer
-         outside mem expressions.  We would probably want to teach
-        validate_replace to simplify expressions first.  */
-      if (x == stack_pointer_rtx)
+      /* ??? We want be able to handle non-memory stack pointer
+        references later.  For now just discard all insns refering to
+        stack pointer outside mem expressions.  We would probably
+        want to teach validate_replace to simplify expressions first.
+
+        We can't just compare with STACK_POINTER_RTX because the
+        reference to the stack pointer might be in some other mode.
+        In particular, an explict clobber in an asm statement will
+        result in a QImode clober.  */
+      if (REGNO (x) == STACK_POINTER_REGNUM)
        return 1;
       break;
     default:
index bc5066725d934ac83afdcc0f791c26acf7e7a6ed..45fe556efe2745d3d87c9381cf593163915d15ba 100644 (file)
@@ -1,3 +1,7 @@
+2001-04-30  Mark Mitchell  <mark@codesourcery.com>
+
+       * gcc.dg/20000724-1.c: Add a clobber of `esp'.
+
 2001-04-29  Joseph S. Myers  <jsm28@cam.ac.uk>
 
        * g++.old-deja/g++.other/crash14.C: Remove -fnew-abi.
index 5027d6e97463d968f5c28b38e54d0d41571ad6da..fecf9e795900ca1b83cdced8d7805fb2d753c3bc 100644 (file)
@@ -51,7 +51,7 @@ NT    "ret"
 
 extern inline void do_asm(struct s * x)
 {
-  asm volatile("call ___checkme" : : "c" (x) : "memory");
+  asm volatile("call ___checkme" : : "c" (x) : "esp", "memory");
 }
 
 int foo(void)
This page took 0.093278 seconds and 5 git commands to generate.