aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Kenner <kenner@vlsi1.ultra.nyu.edu>2001-12-22 14:46:58 +0000
committerRichard Kenner <kenner@gcc.gnu.org>2001-12-22 09:46:58 -0500
commitb5cd4ed4c3eb1db3d47e390a4546e2e8463a9a0c (patch)
tree25d46e8d5e09f2c5788b455a9ac84fd305e096b4 /gcc
parentc470afad3c835b020cdd9c500f38f9d12713866a (diff)
downloadgcc-b5cd4ed4c3eb1db3d47e390a4546e2e8463a9a0c.zip
gcc-b5cd4ed4c3eb1db3d47e390a4546e2e8463a9a0c.tar.gz
gcc-b5cd4ed4c3eb1db3d47e390a4546e2e8463a9a0c.tar.bz2
calls.c (flags_from_decl_or_type): Move ECF_SP_DEPRESSED here.
* calls.c (flags_from_decl_or_type): Move ECF_SP_DEPRESSED here. (expand_call): Delete from here. Do pending stack adjustments if ECF_SP_DEPRESSED. From-SVN: r48267
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/calls.c32
2 files changed, 21 insertions, 15 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 69e5c51..0290fca 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,9 @@
Sat Dec 22 08:59:50 2001 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+ * calls.c (flags_from_decl_or_type): Move ECF_SP_DEPRESSED here.
+ (expand_call): Delete from here.
+ Do pending stack adjustments if ECF_SP_DEPRESSED.
+
* dwarf2out.c (save_rtx): Deleted.
(mem_loc_descriptor): Do equivalent operation.
(add_const_value_attribute, case CONST): Likewise.
diff --git a/gcc/calls.c b/gcc/calls.c
index afb9b39..5c4fd8d 100644
--- a/gcc/calls.c
+++ b/gcc/calls.c
@@ -789,17 +789,19 @@ setjmp_call_p (fndecl)
return special_function_p (fndecl, 0) & ECF_RETURNS_TWICE;
}
-/* Detect flags (function attributes) from the function type node. */
+/* Detect flags (function attributes) from the function decl or type node. */
static int
flags_from_decl_or_type (exp)
tree exp;
{
int flags = 0;
-
+ tree type = exp;
/* ??? We can't set IS_MALLOC for function types? */
if (DECL_P (exp))
{
+ type = TREE_TYPE (exp);
+
/* The function exp may have the `malloc' attribute. */
if (DECL_P (exp) && DECL_IS_MALLOC (exp))
flags |= ECF_MALLOC;
@@ -818,6 +820,14 @@ flags_from_decl_or_type (exp)
if (TREE_THIS_VOLATILE (exp))
flags |= ECF_NORETURN;
+ /* Mark if the function returns with the stack pointer depressed. We
+ cannot consider it pure or constant in that case. */
+ if (TREE_CODE (type) == FUNCTION_TYPE && TYPE_RETURNS_STACK_DEPRESSED (type))
+ {
+ flags |= ECF_SP_DEPRESSED;
+ flags &= ~(ECF_PURE | ECF_CONST);
+ }
+
return flags;
}
@@ -2206,14 +2216,6 @@ expand_call (exp, target, ignore)
else
flags |= flags_from_decl_or_type (TREE_TYPE (TREE_TYPE (p)));
- /* Mark if the function returns with the stack pointer depressed. */
- if (TREE_CODE (TREE_TYPE (TREE_TYPE (p))) == FUNCTION_TYPE
- && TYPE_RETURNS_STACK_DEPRESSED (TREE_TYPE (TREE_TYPE (p))))
- {
- flags |= ECF_SP_DEPRESSED;
- flags &= ~(ECF_PURE | ECF_CONST);
- }
-
#ifdef REG_PARM_STACK_SPACE
#ifdef MAYBE_REG_PARM_STACK_SPACE
reg_parm_stack_space = MAYBE_REG_PARM_STACK_SPACE;
@@ -2658,9 +2660,11 @@ expand_call (exp, target, ignore)
/* Don't let pending stack adjusts add up to too much.
Also, do all pending adjustments now if there is any chance
this might be a call to alloca or if we are expanding a sibling
- call sequence. */
+ call sequence or if we are calling a function that is to return
+ with stack pointer depressed. */
if (pending_stack_adjust >= 32
- || (pending_stack_adjust > 0 && (flags & ECF_MAY_BE_ALLOCA))
+ || (pending_stack_adjust > 0
+ && (flags & (ECF_MAY_BE_ALLOCA | ECF_SP_DEPRESSED)))
|| pass == 0)
do_pending_stack_adjust ();
@@ -3170,9 +3174,7 @@ expand_call (exp, target, ignore)
if (TYPE_MODE (TREE_TYPE (exp)) == VOIDmode
|| ignore)
- {
- target = const0_rtx;
- }
+ target = const0_rtx;
else if (structure_value_addr)
{
if (target == 0 || GET_CODE (target) != MEM)