* ppc-sysv-tdep.c (ppc64_sysv_abi_push_dummy_call): Add support
	for the "generic" vector ABI used with GCC 4.3 and later.
	(ppc64_sysv_abi_return_value): Likewise.

gdb/testsuite:
	* gdb.arch/altivec-abi.exp: Skip "generic" tests on 64-bit when
	using a GCC 4.1 or 4.2 compiler.  Add an additional test variant
	"generic ABI, auto".
	(altivec_abi_tests): Accept vectors returned by reference.
This commit is contained in:
Ulrich Weigand
2011-03-15 14:42:34 +00:00
parent 81b4675a00
commit 24e9cda068
4 changed files with 82 additions and 16 deletions

View File

@ -1,4 +1,10 @@
2011-03-15 Ulrich Weigand <ulrich.weigand@linaro.org> 2011-03-15 Ulrich Weigand <uweigand@de.ibm.com>
* ppc-sysv-tdep.c (ppc64_sysv_abi_push_dummy_call): Add support
for the "generic" vector ABI used with GCC 4.3 and later.
(ppc64_sysv_abi_return_value): Likewise.
2011-03-15 Ulrich Weigand <uweigand@de.ibm.com>
* infcall.c (call_function_by_hand): Function return value is * infcall.c (call_function_by_hand): Function return value is
always a non_lval, even when using struct_return. always a non_lval, even when using struct_return.

View File

@ -1119,6 +1119,9 @@ ppc64_sysv_abi_push_dummy_call (struct gdbarch *gdbarch,
ULONGEST back_chain; ULONGEST back_chain;
/* See for-loop comment below. */ /* See for-loop comment below. */
int write_pass; int write_pass;
/* Size of the by-reference parameter copy region, the final value is
computed in the for-loop below. */
LONGEST refparam_size = 0;
/* Size of the general parameter region, the final value is computed /* Size of the general parameter region, the final value is computed
in the for-loop below. */ in the for-loop below. */
LONGEST gparam_size = 0; LONGEST gparam_size = 0;
@ -1171,19 +1174,26 @@ ppc64_sysv_abi_push_dummy_call (struct gdbarch *gdbarch,
/* The address, at which the next general purpose parameter /* The address, at which the next general purpose parameter
(integer, struct, float, vector, ...) should be saved. */ (integer, struct, float, vector, ...) should be saved. */
CORE_ADDR gparam; CORE_ADDR gparam;
/* The address, at which the next by-reference parameter
(non-Altivec vector, variably-sized type) should be saved. */
CORE_ADDR refparam;
if (!write_pass) if (!write_pass)
{ {
/* During the first pass, GPARAM is more like an offset /* During the first pass, GPARAM and REFPARAM are more like
(start address zero) than an address. That way it offsets (start address zero) than addresses. That way
accumulates the total stack space required. */ they accumulate the total stack space each region
requires. */
gparam = 0; gparam = 0;
refparam = 0;
} }
else else
{ {
/* Decrement the stack pointer making space for the on-stack /* Decrement the stack pointer making space for the Altivec
stack parameters. Set gparam to that region. */ and general on-stack parameters. Set refparam and gparam
gparam = align_down (sp - gparam_size, 16); to their corresponding regions. */
refparam = align_down (sp - refparam_size, 16);
gparam = align_down (refparam - gparam_size, 16);
/* Add in space for the TOC, link editor double word, /* Add in space for the TOC, link editor double word,
compiler double word, LR save area, CR save area. */ compiler double word, LR save area, CR save area. */
sp = align_down (gparam - 48, 16); sp = align_down (gparam - 48, 16);
@ -1462,7 +1472,7 @@ ppc64_sysv_abi_push_dummy_call (struct gdbarch *gdbarch,
} }
else if (TYPE_LENGTH (type) == 16 && TYPE_VECTOR (type) else if (TYPE_LENGTH (type) == 16 && TYPE_VECTOR (type)
&& TYPE_CODE (type) == TYPE_CODE_ARRAY && TYPE_CODE (type) == TYPE_CODE_ARRAY
&& tdep->ppc_vr0_regnum >= 0) && tdep->vector_abi == POWERPC_VEC_ALTIVEC)
{ {
/* In the Altivec ABI, vectors go in the vector registers /* In the Altivec ABI, vectors go in the vector registers
v2 .. v13, as well as the parameter area -- always at v2 .. v13, as well as the parameter area -- always at
@ -1484,6 +1494,30 @@ ppc64_sysv_abi_push_dummy_call (struct gdbarch *gdbarch,
vreg++; vreg++;
gparam += 16; gparam += 16;
} }
else if (TYPE_LENGTH (type) >= 16 && TYPE_VECTOR (type)
&& TYPE_CODE (type) == TYPE_CODE_ARRAY)
{
/* Non-Altivec vectors are passed by reference. */
/* Copy value onto the stack ... */
refparam = align_up (refparam, 16);
if (write_pass)
write_memory (refparam, val, TYPE_LENGTH (type));
/* ... and pass a pointer to the copy as parameter. */
if (write_pass)
{
if (greg <= 10)
regcache_cooked_write_unsigned (regcache,
tdep->ppc_gp0_regnum +
greg, refparam);
write_memory_unsigned_integer (gparam, tdep->wordsize,
byte_order, refparam);
}
greg++;
gparam = align_up (gparam + tdep->wordsize, tdep->wordsize);
refparam = align_up (refparam + TYPE_LENGTH (type), tdep->wordsize);
}
else if ((TYPE_CODE (type) == TYPE_CODE_INT else if ((TYPE_CODE (type) == TYPE_CODE_INT
|| TYPE_CODE (type) == TYPE_CODE_ENUM || TYPE_CODE (type) == TYPE_CODE_ENUM
|| TYPE_CODE (type) == TYPE_CODE_BOOL || TYPE_CODE (type) == TYPE_CODE_BOOL
@ -1625,8 +1659,9 @@ ppc64_sysv_abi_push_dummy_call (struct gdbarch *gdbarch,
if (!write_pass) if (!write_pass)
{ {
/* Save the true region sizes ready for the second pass. /* Save the true region sizes ready for the second pass. */
Make certain that the general parameter save area is at refparam_size = refparam;
/* Make certain that the general parameter save area is at
least the minimum 8 registers (or doublewords) in size. */ least the minimum 8 registers (or doublewords) in size. */
if (greg < 8) if (greg < 8)
gparam_size = 8 * tdep->wordsize; gparam_size = 8 * tdep->wordsize;
@ -1849,7 +1884,8 @@ ppc64_sysv_abi_return_value (struct gdbarch *gdbarch, struct type *func_type,
} }
/* A VMX vector is returned in v2. */ /* A VMX vector is returned in v2. */
if (TYPE_CODE (valtype) == TYPE_CODE_ARRAY if (TYPE_CODE (valtype) == TYPE_CODE_ARRAY
&& TYPE_VECTOR (valtype) && tdep->ppc_vr0_regnum >= 0) && TYPE_VECTOR (valtype)
&& tdep->vector_abi == POWERPC_VEC_ALTIVEC)
{ {
if (readbuf) if (readbuf)
regcache_cooked_read (regcache, tdep->ppc_vr0_regnum + 2, readbuf); regcache_cooked_read (regcache, tdep->ppc_vr0_regnum + 2, readbuf);

View File

@ -1,3 +1,10 @@
2011-03-15 Ulrich Weigand <uweigand@de.ibm.com>
* gdb.arch/altivec-abi.exp: Skip "generic" tests on 64-bit when
using a GCC 4.1 or 4.2 compiler. Add an additional test variant
"generic ABI, auto".
(altivec_abi_tests): Accept vectors returned by reference.
2010-03-14 Phil Muldoon <pmuldoon@redhat.com> 2010-03-14 Phil Muldoon <pmuldoon@redhat.com>
* gdb.python/py-breakpoint.exp: Add Python stop operations tests. * gdb.python/py-breakpoint.exp: Add Python stop operations tests.

View File

@ -118,8 +118,17 @@ proc altivec_abi_tests { extra_flags force_abi } {
append pattern2 " at.*altivec-abi.c.*main.*result = vec_func .vshort,.*goes in v2.*Value returned is.*= .14, 36, 58, 80." append pattern2 " at.*altivec-abi.c.*main.*result = vec_func .vshort,.*goes in v2.*Value returned is.*= .14, 36, 58, 80."
# Let's see if the result is returned correctly. # Let's see if the result is returned correctly.
gdb_test "finish" "Run till exit from .0.*$pattern2" \ set message "vector value returned correctly"
"vector value returned correctly" gdb_test_multiple "finish" $message {
-re "Run till exit from .0.*$pattern2.*$gdb_prompt $" {
pass $message
}
-re "Run till exit from .0.*Cannot determine contents.*$gdb_prompt $" {
# This happens in those cases where the vector is returned by
# reference (generic vectors on 64-bit GNU/Linux).
pass $message
}
}
# can we print the args correctly for this function? # can we print the args correctly for this function?
gdb_test "break struct_of_vector_func" "" "" gdb_test "break struct_of_vector_func" "" ""
@ -150,9 +159,17 @@ if [test_compiler_info gcc*] {
# On GNU/Linux, we can mix -mabi=no-altivec and -mabi=altivec. # On GNU/Linux, we can mix -mabi=no-altivec and -mabi=altivec.
# So test some combinations. # So test some combinations.
if { [istarget "powerpc*-linux*"] } { if { [istarget "powerpc*-linux*"] } {
set binfile ${objdir}/${subdir}/${testfile}-ge-ge # On 64-bit GNU/Linux with GCC 4.1 and 4.2, -mabi=no-altivec
set pf_prefix "${saved_prefix} generic ABI, forced:" # was broken, so skip those tests there.
altivec_abi_tests "additional_flags=-maltivec additional_flags=-mabi=no-altivec" "generic" if { ![is_lp64_target] || ![test_compiler_info "gcc-4-\[12\]-*"] } {
set binfile ${objdir}/${subdir}/${testfile}-ge-ge
set pf_prefix "${saved_prefix} generic ABI, forced:"
altivec_abi_tests "additional_flags=-maltivec additional_flags=-mabi=no-altivec" "generic"
set binfile ${objdir}/${subdir}/${testfile}-ge-auto
set pf_prefix "${saved_prefix} generic ABI, auto:"
altivec_abi_tests "additional_flags=-maltivec additional_flags=-mabi=no-altivec" "auto"
}
set binfile ${objdir}/${subdir}/${testfile}-av-av set binfile ${objdir}/${subdir}/${testfile}-av-av
set pf_prefix "${saved_prefix} AltiVec ABI, forced:" set pf_prefix "${saved_prefix} AltiVec ABI, forced:"