Index: gdb/sparc64-tdep.c |
diff --git a/gdb/sparc64-tdep.c b/gdb/sparc64-tdep.c |
index 327eefe3bcad9a899043cc2898e76ba26adc2112..28c9ca4fec8b057b22c21aee9a21122e8d3b9188 100644 |
--- a/gdb/sparc64-tdep.c |
+++ b/gdb/sparc64-tdep.c |
@@ -785,7 +785,8 @@ sparc64_store_arguments (struct regcache *regcache, int nargs, |
struct type *type = value_type (args[i]); |
int len = TYPE_LENGTH (type); |
- if (sparc64_structure_or_union_p (type)) |
+ if (sparc64_structure_or_union_p (type) |
+ || (sparc64_complex_floating_p (type) && len == 32)) |
{ |
/* Structure or Union arguments. */ |
if (len <= 16) |
@@ -816,10 +817,9 @@ sparc64_store_arguments (struct regcache *regcache, int nargs, |
num_elements++; |
} |
} |
- else if (sparc64_floating_p (type)) |
+ else if (sparc64_floating_p (type) || sparc64_complex_floating_p (type)) |
{ |
/* Floating arguments. */ |
- |
if (len == 16) |
{ |
/* The psABI says that "Each quad-precision parameter |
@@ -887,7 +887,8 @@ sparc64_store_arguments (struct regcache *regcache, int nargs, |
int regnum = -1; |
gdb_byte buf[16]; |
- if (sparc64_structure_or_union_p (type)) |
+ if (sparc64_structure_or_union_p (type) |
+ || (sparc64_complex_floating_p (type) && len == 32)) |
{ |
/* Structure or Union arguments. */ |
gdb_assert (len <= 16); |
@@ -927,7 +928,7 @@ sparc64_store_arguments (struct regcache *regcache, int nargs, |
/* The psABI says "Each single-precision parameter value |
will be assigned to one extended word in the |
parameter array, and right-justified within that |
- word; the left half (even floatregister) is |
+ word; the left half (even float register) is |
undefined." Even though the psABI says that "the |
left half is undefined", set it to zero here. */ |
memset (buf, 0, 4); |
@@ -960,7 +961,7 @@ sparc64_store_arguments (struct regcache *regcache, int nargs, |
} |
else if (regnum >= SPARC64_Q0_REGNUM && regnum <= SPARC64_Q8_REGNUM) |
{ |
- gdb_assert (element < 6); |
+ gdb_assert (element < 5); |
regnum = SPARC_O0_REGNUM + element; |
regcache_cooked_write (regcache, regnum, valbuf); |
regcache_cooked_write (regcache, regnum + 1, valbuf + 8); |
@@ -1034,7 +1035,7 @@ sparc64_extract_return_value (struct type *type, struct regcache *regcache, |
sparc64_extract_floating_fields (regcache, type, buf, 0); |
memcpy (valbuf, buf, len); |
} |
- else if (sparc64_floating_p (type)) |
+ else if (sparc64_floating_p (type) || sparc64_complex_floating_p (type)) |
{ |
/* Floating return values. */ |
for (i = 0; i < len / 4; i++) |
@@ -1118,7 +1119,7 @@ sparc64_store_return_value (struct type *type, struct regcache *regcache, |
} |
static enum return_value_convention |
-sparc64_return_value (struct gdbarch *gdbarch, struct type *func_type, |
+sparc64_return_value (struct gdbarch *gdbarch, struct value *function, |
struct type *type, struct regcache *regcache, |
gdb_byte *readbuf, const gdb_byte *writebuf) |
{ |