aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Snyder <msnyder@vmware.com>1997-06-28 04:07:56 +0000
committerMichael Snyder <msnyder@vmware.com>1997-06-28 04:07:56 +0000
commit08d8f99560920cb059d1d670649b93d9ab384f0d (patch)
treed616b7f1adb3b28d9c46bbbc1d51056b4f3bcc91
parent0af60e0326d6263693fcad779e7f41cdcaf012f7 (diff)
downloadgdb-08d8f99560920cb059d1d670649b93d9ab384f0d.zip
gdb-08d8f99560920cb059d1d670649b93d9ab384f0d.tar.gz
gdb-08d8f99560920cb059d1d670649b93d9ab384f0d.tar.bz2
Fri Jun 27 21:05:45 1997 Michael Snyder (msnyder@cleaver.cygnus.com)
* mips-tdep.c (mips_push_arguments): handle alignment of integer and struct args on stack for mips64 big-endian.
-rw-r--r--gdb/ChangeLog5
-rw-r--r--gdb/mips-tdep.c18
2 files changed, 22 insertions, 1 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 0530076..de31698 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,8 @@
+Fri Jun 27 21:05:45 1997 Michael Snyder (msnyder@cleaver.cygnus.com)
+
+ * mips-tdep.c (mips_push_arguments): handle alignment of
+ integer and struct args on stack for mips64 big-endian.
+
Fri Jun 27 19:19:12 1997 Michael Snyder (msnyder@cleaver.cygnus.com)
* config/mips/tm-mips.h (USE_STRUCT_CONVENTION): MIPS_EABI returns
diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c
index 285d379..dfca27a 100644
--- a/gdb/mips-tdep.c
+++ b/gdb/mips-tdep.c
@@ -1276,6 +1276,7 @@ mips_push_arguments(nargs, args, sp, struct_return, struct_addr)
if (typecode == TYPE_CODE_STRUCT && MIPS_EABI && len > MIPS_REGSIZE)
{
store_address (valbuf, MIPS_REGSIZE, VALUE_ADDRESS (arg));
+ typecode = TYPE_CODE_PTR;
len = MIPS_REGSIZE;
val = valbuf;
}
@@ -1369,8 +1370,23 @@ mips_push_arguments(nargs, args, sp, struct_return, struct_addr)
else
{
/* Write this portion of the argument to the stack. */
+ int longword_offset;
+
partial_len = len;
- write_memory (sp + stack_offset, val, partial_len);
+ longword_offset = 0;
+ if (TARGET_BYTE_ORDER == BIG_ENDIAN)
+ if (MIPS_REGSIZE == 8 &&
+ (typecode == TYPE_CODE_INT ||
+ typecode == TYPE_CODE_PTR ||
+ typecode == TYPE_CODE_FLT) && len <= 4)
+ longword_offset = 4;
+ else if ((typecode == TYPE_CODE_STRUCT ||
+ typecode == TYPE_CODE_UNION) &&
+ len < MIPS_REGSIZE)
+ longword_offset = MIPS_REGSIZE - len;
+
+ write_memory (sp + stack_offset + longword_offset,
+ val, partial_len);
stack_offset += ROUND_UP (partial_len, MIPS_REGSIZE);
}