diff options
author | DJ Delorie <dj@redhat.com> | 2001-04-05 16:13:53 -0400 |
---|---|---|
committer | DJ Delorie <dj@gcc.gnu.org> | 2001-04-05 16:13:53 -0400 |
commit | c39ada0455f7a4037f98ac221f770742d85d8144 (patch) | |
tree | 221512a33199a7175b67e219e51648c193b287dc /gcc/calls.c | |
parent | 93a6eb7802d2a1e71430635a220df4663c4dd2ad (diff) | |
download | gcc-c39ada0455f7a4037f98ac221f770742d85d8144.zip gcc-c39ada0455f7a4037f98ac221f770742d85d8144.tar.gz gcc-c39ada0455f7a4037f98ac221f770742d85d8144.tar.bz2 |
function.h (virtuals_instantiated): Declare.
* 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.
From-SVN: r41127
Diffstat (limited to 'gcc/calls.c')
-rw-r--r-- | gcc/calls.c | 16 |
1 files changed, 12 insertions, 4 deletions
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 { |