re PR target/25731 (Complex values passed in wrong registers)

PR target/25731
	* config.gcc (hppa*-*-linux*, hppa[12]*-*-hpux10*, hppa*64*-*-hpux11*,
	hppa[12]*-*-hpux11*): Override default shared libgcc version for both
	sjlj and dwarf2 exception handling.
	* pa/t-hpux-shlib (SHLIB_SOVERSION): New make variable.
	Rework to allow overriding SHLIB_EXT and SHLIB_SOVERSION.
	* pa/pa.c (function_value): Treat complex and vector types as
	aggregates.
	(function_arg): Likewise.  Only pass scalar floats in the floating
	point argument registers.
	* pa/t-slibgcc-dwarf-ver: New file.
	* pa/t-slibgcc-sjlj-ver: New file.
	* pa/t-slibgcc-elf-ver: Delete file.

From-SVN: r109894
This commit is contained in:
John David Anglin 2006-01-18 15:44:57 +00:00 committed by John David Anglin
parent 4325ca904b
commit 4720d5ca9c
7 changed files with 65 additions and 27 deletions

View File

@ -1,3 +1,19 @@
2006-01-18 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
PR target/25731
* config.gcc (hppa*-*-linux*, hppa[12]*-*-hpux10*, hppa*64*-*-hpux11*,
hppa[12]*-*-hpux11*): Override default shared libgcc version for both
sjlj and dwarf2 exception handling.
* pa/t-hpux-shlib (SHLIB_SOVERSION): New make variable.
Rework to allow overriding SHLIB_EXT and SHLIB_SOVERSION.
* pa/pa.c (function_value): Treat complex and vector types as
aggregates.
(function_arg): Likewise. Only pass scalar floats in the floating
point argument registers.
* pa/t-slibgcc-dwarf-ver: New file.
* pa/t-slibgcc-sjlj-ver: New file.
* pa/t-slibgcc-elf-ver: Delete file.
2006-01-19 Alan Modra <amodra@bigpond.net.au>
* config/rs6000/rs6000.c (rs6000_assemble_integer): Correct

View File

@ -846,10 +846,11 @@ hppa*-*-linux* | parisc*-*-linux*)
tm_file="${tm_file} dbxelf.h elfos.h svr4.h linux.h pa/pa-linux.h \
pa/pa32-regs.h pa/pa32-linux.h"
tmake_file="${tmake_file} pa/t-linux"
# if not configured with --enable-sjlj-exceptions, bump the
# libgcc version number
if test x$sjlj != x1; then
tmake_file="$tmake_file pa/t-slibgcc-elf-ver"
# Set the libgcc version number
if test x$sjlj = x1; then
tmake_file="$tmake_file pa/t-slibgcc-sjlj-ver"
else
tmake_file="$tmake_file pa/t-slibgcc-dwarf-ver"
fi
;;
# port not yet contributed.
@ -900,8 +901,11 @@ hppa[12]*-*-hpux10*)
tmake_file="${tmake_file} pa/t-dce-thr"
;;
esac
if test x$sjlj != x1; then
tmake_file="$tmake_file pa/t-slibgcc-elf-ver"
# Set the libgcc version number
if test x$sjlj = x1; then
tmake_file="$tmake_file pa/t-slibgcc-sjlj-ver"
else
tmake_file="$tmake_file pa/t-slibgcc-dwarf-ver"
fi
use_collect2=yes
use_fixproto=yes
@ -935,8 +939,11 @@ hppa*64*-*-hpux11*)
pa/pa-hpux1010.opt pa/pa64-hpux.opt"
need_64bit_hwint=yes
tmake_file="pa/t-pa64 pa/t-pa-hpux pa/t-hpux-shlib"
if test x$sjlj != x1; then
tmake_file="$tmake_file pa/t-slibgcc-elf-ver"
# Set the libgcc version number
if test x$sjlj = x1; then
tmake_file="$tmake_file pa/t-slibgcc-sjlj-ver"
else
tmake_file="$tmake_file pa/t-slibgcc-dwarf-ver"
fi
extra_parts="crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o"
case x${enable_threads} in
@ -961,8 +968,11 @@ hppa[12]*-*-hpux11*)
;;
esac
tmake_file="pa/t-pa pa/t-pa-hpux pa/t-hpux-shlib"
if test x$sjlj != x1; then
tmake_file="$tmake_file pa/t-slibgcc-elf-ver"
# Set the libgcc version number
if test x$sjlj = x1; then
tmake_file="$tmake_file pa/t-slibgcc-sjlj-ver"
else
tmake_file="$tmake_file pa/t-slibgcc-dwarf-ver"
fi
case x${enable_threads} in
xyes | xposix )

View File

@ -8791,7 +8791,9 @@ function_value (tree valtype, tree func ATTRIBUTE_UNUSED)
{
enum machine_mode valmode;
if (AGGREGATE_TYPE_P (valtype))
if (AGGREGATE_TYPE_P (valtype)
|| TREE_CODE (valtype) == COMPLEX_TYPE
|| TREE_CODE (valtype) == VECTOR_TYPE)
{
if (TARGET_64BIT)
{
@ -8871,7 +8873,7 @@ function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode, tree type,
this routine should return zero. pa_arg_partial_bytes will
handle arguments which are split between regs and stack slots if
the ABI mandates split arguments. */
if (! TARGET_64BIT)
if (!TARGET_64BIT)
{
/* The 32-bit ABI does not split arguments. */
if (cum->words + arg_size > max_arg_words)
@ -8906,7 +8908,9 @@ function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode, tree type,
treatment. */
if (arg_size > 1
|| mode == BLKmode
|| (type && AGGREGATE_TYPE_P (type)))
|| (type && (AGGREGATE_TYPE_P (type)
|| TREE_CODE (type) == COMPLEX_TYPE
|| TREE_CODE (type) == VECTOR_TYPE)))
{
/* Double-extended precision (80-bit), quad-precision (128-bit)
and aggregates including complex numbers are aligned on
@ -8960,8 +8964,13 @@ function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode, tree type,
objects. The data is right-justified and zero-extended
to 64 bits. This is opposite to the normal justification
used on big endian targets and requires special treatment.
We now define BLOCK_REG_PADDING to pad these objects. */
if (mode == BLKmode || (type && AGGREGATE_TYPE_P (type)))
We now define BLOCK_REG_PADDING to pad these objects.
Aggregates, complex and vector types are passed in the same
manner as structures. */
if (mode == BLKmode
|| (type && (AGGREGATE_TYPE_P (type)
|| TREE_CODE (type) == COMPLEX_TYPE
|| TREE_CODE (type) == VECTOR_TYPE)))
{
rtx loc = gen_rtx_EXPR_LIST (VOIDmode,
gen_rtx_REG (DImode, gpr_reg_base),
@ -8984,9 +8993,9 @@ function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode, tree type,
/* If we are doing soft-float with portable runtime, then there
is no need to worry about FP regs. */
&& !TARGET_SOFT_FLOAT
/* The parameter must be some kind of float, else we can just
/* The parameter must be some kind of scalar float, else we just
pass it in integer registers. */
&& FLOAT_MODE_P (mode)
&& GET_MODE_CLASS (mode) == MODE_FLOAT
/* The target function must not have a prototype. */
&& cum->nargs_prototype <= 0
/* libcalls do not need to pass items in both FP and general
@ -9002,7 +9011,7 @@ function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode, tree type,
&& !TARGET_GAS
&& !cum->incoming
&& cum->indirect
&& FLOAT_MODE_P (mode)))
&& GET_MODE_CLASS (mode) == MODE_FLOAT))
{
retval
= gen_rtx_PARALLEL
@ -9025,9 +9034,9 @@ function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode, tree type,
&& !TARGET_64BIT
&& !TARGET_ELF32
&& cum->indirect)
/* If the parameter is not a floating point parameter, then
it belongs in GPRs. */
|| !FLOAT_MODE_P (mode)
/* If the parameter is not a scalar floating-point parameter,
then it belongs in GPRs. */
|| GET_MODE_CLASS (mode) != MODE_FLOAT
/* Structure with single SFmode field belongs in GPR. */
|| (type && AGGREGATE_TYPE_P (type)))
retval = gen_rtx_REG (mode, gpr_reg_base);

View File

@ -1,7 +1,8 @@
# Build a shared libgcc library.
SHLIB_EXT = .sl
SHLIB_NAME = @shlib_base_name@.sl
SHLIB_SONAME = @shlib_base_name@.1
SHLIB_NAME = @shlib_base_name@$(SHLIB_EXT)
SHLIB_SOVERSION = 1
SHLIB_SONAME = @shlib_base_name@.$(SHLIB_SOVERSION)
SHLIB_OBJS = @shlib_objs@
SHLIB_DIR = @multilib_dir@
SHLIB_SLIBDIR_QUAL = @shlib_slibdir_qual@
@ -16,7 +17,6 @@ SHLIB_LINK = $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) -shared -nodefaultlibs \
mv $(SHLIB_DIR)/$(SHLIB_NAME).tmp $(SHLIB_DIR)/$(SHLIB_NAME) && \
$(LN_S) $(SHLIB_NAME) $(SHLIB_DIR)/$(SHLIB_SONAME)
# $(slibdir) double quoted to protect it from expansion while building
# libgcc.mk. We want this delayed until actual install time.
SHLIB_INSTALL = \

View File

@ -0,0 +1,3 @@
# Set the version number of the shared libgcc library (DWARF2 EH).
SHLIB_SOVERSION = 4

View File

@ -1,3 +0,0 @@
# Bump the version number of the shared libgcc library
SHLIB_SOVERSION = 2

View File

@ -0,0 +1,3 @@
# Set the version number of the shared libgcc library (SJLJ EH).
SHLIB_SOVERSION = 3