Fix passing double float complex arguments in sparc64.

Double float complex objects are not 16-byte aligned in either
gcc or solaris studio.  This patch makes gdb to not align double
float complex arguments in the dummy frame when calling a
function.

2014-02-11  Jose E. Marchesi  <jose.marchesi@oracle.com>

        * sparc64-tdep.c (sparc64_store_arguments): Do not align complex
        double float arguments to 16-byte in the argument slots.
This commit is contained in:
Jose E. Marchesi 2014-02-11 04:27:20 -08:00
parent e1402065ee
commit 49caec94ae
2 changed files with 26 additions and 3 deletions

View File

@ -1,3 +1,8 @@
2014-02-11 Jose E. Marchesi <jose.marchesi@oracle.com>
* sparc64-tdep.c (sparc64_store_arguments): Do not align complex
double float arguments to 16-byte in the argument slots.
2014-02-11 Doug Evans <xdje42@gmail.com>
* configure.ac: Don't crash if pkg-config is not found and guile

View File

@ -831,7 +831,7 @@ sparc64_store_arguments (struct regcache *regcache, int nargs,
quad-aligned, and thus a hole might be introduced
into the parameter array to force alignment." Skip
an element if necessary. */
if (num_elements % 2)
if ((num_elements % 2) && sparc64_16_byte_align_p (type))
num_elements++;
}
else
@ -890,7 +890,7 @@ sparc64_store_arguments (struct regcache *regcache, int nargs,
if (sparc64_structure_or_union_p (type)
|| (sparc64_complex_floating_p (type) && len == 32))
{
/* Structure or Union arguments. */
/* Structure, Union or long double Complex arguments. */
gdb_assert (len <= 16);
memset (buf, 0, sizeof (buf));
valbuf = memcpy (buf, valbuf, len);
@ -908,7 +908,25 @@ sparc64_store_arguments (struct regcache *regcache, int nargs,
if (element < 16)
sparc64_store_floating_fields (regcache, type, valbuf, element, 0);
}
else if (sparc64_floating_p (type) || sparc64_complex_floating_p (type))
else if (sparc64_complex_floating_p (type))
{
/* Float Complex or double Complex arguments. */
if (element < 16)
{
regnum = SPARC64_D0_REGNUM + element;
if (len == 16)
{
if (regnum < SPARC64_D30_REGNUM)
regcache_cooked_write (regcache, regnum + 1, valbuf + 8);
if (regnum < SPARC64_D10_REGNUM)
regcache_cooked_write (regcache,
SPARC_O0_REGNUM + element + 1,
valbuf + 8);
}
}
}
else if (sparc64_floating_p (type))
{
/* Floating arguments. */
if (len == 16)