Commit d60e5448 by Mark Mitchell Committed by Mark Mitchell

regmove.c (record_stack_memrefs): Catch all references to the stack pointer.

	* 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
parent fea633fd
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> 2001-04-29 Toomas Rosin <toomas at ns dot tklabor dot ee>
* Makefile.in(stmp-fixinc): quote shell assignment values * Makefile.in(stmp-fixinc): quote shell assignment values
......
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> 2001-04-29 Joseph S. Myers <jsm28@cam.ac.uk>
* decl2.c (unsupported_options): Add new-abi. * decl2.c (unsupported_options): Add new-abi.
......
...@@ -99,6 +99,7 @@ static tree remap_decl PARAMS ((tree, inline_data *)); ...@@ -99,6 +99,7 @@ static tree remap_decl PARAMS ((tree, inline_data *));
static void remap_block PARAMS ((tree, tree, inline_data *)); static void remap_block PARAMS ((tree, tree, inline_data *));
static void copy_scope_stmt PARAMS ((tree *, int *, inline_data *)); static void copy_scope_stmt PARAMS ((tree *, int *, inline_data *));
static tree calls_setjmp_r PARAMS ((tree *, int *, void *)); 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 /* The approximate number of instructions per statement. This number
need not be particularly accurate; it is used only to make need not be particularly accurate; it is used only to make
...@@ -1009,6 +1010,25 @@ calls_setjmp_p (fn) ...@@ -1009,6 +1010,25 @@ calls_setjmp_p (fn)
NULL) != NULL_TREE; 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 /* 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 necessary. Returns non-zero if there's no longer any need to
process the main body. */ process the main body. */
...@@ -1057,6 +1077,10 @@ maybe_clone_body (fn) ...@@ -1057,6 +1077,10 @@ maybe_clone_body (fn)
/* Adjust the parameter names and locations. */ /* Adjust the parameter names and locations. */
parm = DECL_ARGUMENTS (fn); parm = DECL_ARGUMENTS (fn);
clone_parm = DECL_ARGUMENTS (clone); 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)) if (DECL_HAS_IN_CHARGE_PARM_P (fn))
parm = TREE_CHAIN (parm); parm = TREE_CHAIN (parm);
if (DECL_HAS_VTT_PARM_P (fn)) if (DECL_HAS_VTT_PARM_P (fn))
...@@ -1066,13 +1090,8 @@ maybe_clone_body (fn) ...@@ -1066,13 +1090,8 @@ maybe_clone_body (fn)
for (; parm; for (; parm;
parm = TREE_CHAIN (parm), clone_parm = TREE_CHAIN (clone_parm)) parm = TREE_CHAIN (parm), clone_parm = TREE_CHAIN (clone_parm))
{ {
DECL_ABSTRACT_ORIGIN (clone_parm) = parm; /* Update this paramter. */
update_cloned_parm (parm, clone_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);
/* We should only give unused information for one clone. */ /* We should only give unused information for one clone. */
if (!first) if (!first)
TREE_USED (clone_parm) = 1; TREE_USED (clone_parm) = 1;
......
@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 This is part of the GCC manual.
@c For copying conditions, see the file gcc.texi. @c For copying conditions, see the file gcc.texi.
...@@ -3059,7 +3059,7 @@ memory, you should write the @code{volatile} keyword to prevent future ...@@ -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 versions of GNU CC from moving the instruction around within a core
region. 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, style'' @code{asm}) will not be deleted or moved significantly,
regardless, unless it is unreachable, the same way as if you had regardless, unless it is unreachable, the same way as if you had
written a @code{volatile} keyword. written a @code{volatile} keyword.
......
...@@ -2303,11 +2303,16 @@ record_stack_memrefs (xp, data) ...@@ -2303,11 +2303,16 @@ record_stack_memrefs (xp, data)
} }
return 1; return 1;
case REG: case REG:
/* ??? We want be able to handle non-memory stack pointer references /* ??? We want be able to handle non-memory stack pointer
later. For now just discard all insns refering to stack pointer references later. For now just discard all insns refering to
outside mem expressions. We would probably want to teach stack pointer outside mem expressions. We would probably
validate_replace to simplify expressions first. */ want to teach validate_replace to simplify expressions first.
if (x == stack_pointer_rtx)
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; return 1;
break; break;
default: default:
......
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> 2001-04-29 Joseph S. Myers <jsm28@cam.ac.uk>
* g++.old-deja/g++.other/crash14.C: Remove -fnew-abi. * g++.old-deja/g++.other/crash14.C: Remove -fnew-abi.
......
...@@ -51,7 +51,7 @@ NT "ret" ...@@ -51,7 +51,7 @@ NT "ret"
extern inline void do_asm(struct s * x) 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) int foo(void)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment