diff options
author | Jose E. Marchesi <jose.marchesi@oracle.com> | 2014-02-11 04:27:20 -0800 |
---|---|---|
committer | Jose E. Marchesi <jose.marchesi@oracle.com> | 2014-02-11 04:27:20 -0800 |
commit | 49caec94ae907290ae3fb849365b9b86ebb6f768 (patch) | |
tree | b23a8e174bef345615590a78ef75aeac26efd5cf | |
parent | e1402065ee37ec094d31ccf08fe32efc8df679f1 (diff) | |
download | gdb-49caec94ae907290ae3fb849365b9b86ebb6f768.zip gdb-49caec94ae907290ae3fb849365b9b86ebb6f768.tar.gz gdb-49caec94ae907290ae3fb849365b9b86ebb6f768.tar.bz2 |
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.
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/sparc64-tdep.c | 24 |
2 files changed, 26 insertions, 3 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 435a570..b2cd451 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -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 diff --git a/gdb/sparc64-tdep.c b/gdb/sparc64-tdep.c index 9e4db3a..5d32560 100644 --- a/gdb/sparc64-tdep.c +++ b/gdb/sparc64-tdep.c @@ -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) |