re PR target/6420 (libstdc++ failures on sparc-linux-gnu)

2002-04-24  David S. Miller  <davem@redhat.com>

	PR target/6420
	* config/sparc/sparc.h (FUNCTION_OK_FOR_SIBCALL): Return false if
	32-bit Sparc and current_function_returns_struct is true.

From-SVN: r52720
This commit is contained in:
David S. Miller 2002-04-24 09:58:12 -07:00 committed by David S. Miller
parent e879eb2f79
commit e732178cb8
2 changed files with 23 additions and 2 deletions

View File

@ -1,3 +1,9 @@
2002-04-24 David S. Miller <davem@redhat.com>
PR target/6420
* config/sparc/sparc.h (FUNCTION_OK_FOR_SIBCALL): Return false if
32-bit Sparc and current_function_returns_struct is true.
Wed Apr 24 13:48:25 CEST 2002 Jan Hubicka <jh@suse.cz>
* loop.c (canonicalize_condition): Use gen_int_mode.

View File

@ -1902,8 +1902,23 @@ do { \
#define STRICT_ARGUMENT_NAMING TARGET_V9
/* We do not allow sibling calls if -mflat, nor
we do not allow indirect calls to be optimized into sibling calls. */
#define FUNCTION_OK_FOR_SIBCALL(DECL) (DECL && ! TARGET_FLAT)
we do not allow indirect calls to be optimized into sibling calls.
Also, on sparc 32-bit we cannot emit a sibling call when the
current function returns a structure. This is because the "unimp
after call" convention would cause the callee to return to the
wrong place. The generic code already disallows cases where the
function being called returns a structure.
It may seem strange how this last case could occur. Usually there
is code after the call which jumps to epilogue code which dumps the
return value into the struct return area. That ought to invalidate
the sibling call right? Well, in the c++ case we can end up passing
the pointer to the struct return area to a constructor (which returns
void) and then nothing else happens. Such a sibling call would look
valid without the added check here. */
#define FUNCTION_OK_FOR_SIBCALL(DECL) \
(! TARGET_FLAT && (TARGET_ARCH64 || ! current_function_returns_struct))
/* Generate RTL to flush the register windows so as to make arbitrary frames
available. */