aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/calls.c16
-rw-r--r--gcc/function.c6
-rw-r--r--gcc/function.h3
4 files changed, 27 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f40281a..25682a3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2001-04-05 DJ Delorie <dj@redhat.com>
+
+ * function.h (virtuals_instantiated): Declare.
+ * function.c: (virtuals_instantiated): Make global.
+ * calls.c (emit_library_call_value_1): Use
+ virtual_outgoing_args_rtx only if it hasn't been instantiated.
+ Otherwise, use the stack pointer directly.
+
Thu Apr 5 19:13:33 CEST 2001 Jan Hubicka <jh@suse.cz>
* i386.c (x86_initialize_trampoline): New global function.
diff --git a/gcc/calls.c b/gcc/calls.c
index eb54aee..d0f3a14 100644
--- a/gcc/calls.c
+++ b/gcc/calls.c
@@ -59,6 +59,10 @@ Boston, MA 02111-1307, USA. */
#define PUSH_ARGS_REVERSED 0
#endif
+#ifndef STACK_POINTER_OFFSET
+#define STACK_POINTER_OFFSET 0
+#endif
+
/* Like PREFERRED_STACK_BOUNDARY but in units of bytes, not bits. */
#define STACK_BYTES (PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT)
@@ -3820,11 +3824,15 @@ emit_library_call_value_1 (retval, orgfun, value, fn_type, outmode, nargs, p)
highest_outgoing_arg_in_use - initial_highest_arg_in_use);
needed = 0;
- /* The address of the outgoing argument list must not be copied to a
- register here, because argblock would be left pointing to the
- wrong place after the call to allocate_dynamic_stack_space below. */
+ /* We must be careful to use virtual regs before they're instantiated,
+ and real regs afterwards. Loop optimization, for example, can create
+ new libcalls after we've instantiated the virtual regs, and if we
+ use virtuals anyway, they won't match the rtl patterns. */
- argblock = virtual_outgoing_args_rtx;
+ if (virtuals_instantiated)
+ argblock = plus_constant (stack_pointer_rtx, STACK_POINTER_OFFSET);
+ else
+ argblock = virtual_outgoing_args_rtx;
}
else
{
diff --git a/gcc/function.c b/gcc/function.c
index c31029b..ee18258 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -120,8 +120,10 @@ int current_function_sp_is_unchanging;
int current_function_uses_only_leaf_regs;
/* Nonzero once virtual register instantiation has been done.
- assign_stack_local uses frame_pointer_rtx when this is nonzero. */
-static int virtuals_instantiated;
+ assign_stack_local uses frame_pointer_rtx when this is nonzero.
+ calls.c:emit_library_call_value_1 uses it to set up
+ post-instantiation libcalls. */
+int virtuals_instantiated;
/* These variables hold pointers to functions to create and destroy
target specific, per-function data structures. */
diff --git a/gcc/function.h b/gcc/function.h
index 5621c6b..f27c2b0 100644
--- a/gcc/function.h
+++ b/gcc/function.h
@@ -481,6 +481,9 @@ extern struct function *cfun;
/* A list of all functions we have compiled so far. */
extern struct function *all_functions;
+/* Nonzero if we've already converted virtual regs to hard regs. */
+extern int virtuals_instantiated;
+
/* For backward compatibility... eventually these should all go away. */
#define current_function_name (cfun->name)
#define current_function_pops_args (cfun->pops_args)