be two byte aligned. Round argument sizes up to two byte boundary.
Write out args in two byte hunks.
(mn10200_push_return_address): Implement.
* config/mn10200/tm-mn10200.h (EXTRACT_RETURN_VALUE): Abort for
structures > 8 bytes (temporary).
(STORE_RETURN_VALUE): Likewise.
(CALL_DUMMY): No longer undefine.
(USE_STRUCT_CONVENTION): Use for args > 8 bytes.
(REG_STRUCT_HAS_ADDR): Define.
Inferior function calls for the mn10200.
+Tue Feb 11 12:28:09 1997 Jeffrey A Law (law@cygnus.com)
+
+ * mn10200-tdep.c (mn10200_push_arguments): Stack only needs to
+ be two byte aligned. Round argument sizes up to two byte boundary.
+ Write out args in two byte hunks.
+ (mn10200_push_return_address): Implement.
+ * config/mn10200/tm-mn10200.h (EXTRACT_RETURN_VALUE): Abort for
+ structures > 8 bytes (temporary).
+ (STORE_RETURN_VALUE): Likewise.
+ (CALL_DUMMY): No longer undefine.
+ (USE_STRUCT_CONVENTION): Use for args > 8 bytes.
+ (REG_STRUCT_HAS_ADDR): Define.
+
start-sanitize-r5900
Fri Feb 07 09:04:37 1997 Gavin Koch <gavin@cygnus.com>
#define EXTRACT_RETURN_VALUE(TYPE, REGBUF, VALBUF) \
{ \
- if (TYPE_LENGTH (TYPE) > 4) \
+ if (TYPE_LENGTH (TYPE) > 8) \
abort (); \
else if (TYPE_LENGTH (TYPE) > 2 && TYPE_CODE (TYPE) != TYPE_CODE_PTR) \
{ \
#define STORE_RETURN_VALUE(TYPE, VALBUF) \
{ \
- if (TYPE_LENGTH (TYPE) > 4) \
+ if (TYPE_LENGTH (TYPE) > 8) \
abort (); \
else if (TYPE_LENGTH (TYPE) > 2 && TYPE_CODE (TYPE) != TYPE_CODE_PTR) \
{ \
#define USE_GENERIC_DUMMY_FRAMES
#define CALL_DUMMY {0}
-#undef CALL_DUMMY /* for now, no function calls */
#define CALL_DUMMY_START_OFFSET (0)
#define CALL_DUMMY_BREAKPOINT_OFFSET (0)
#define CALL_DUMMY_LOCATION AT_ENTRY_POINT
#define PC_IN_CALL_DUMMY(PC, SP, FP) generic_pc_in_call_dummy (PC, SP)
+#define REG_STRUCT_HAS_ADDR(gcc_p,type) \
+ (TYPE_LENGTH (type) > 8)
+
#define USE_STRUCT_CONVENTION(GCC_P, TYPE) \
- (TYPE_NFIELDS (TYPE) > 1 || TYPE_LENGTH (TYPE) > 4)
+ (TYPE_NFIELDS (TYPE) > 1 || TYPE_LENGTH (TYPE) > 8)
/* Override the default get_saved_register function with
one that takes account of generic CALL_DUMMY frames. */
int stack_offset = 0;
/* This should be a nop, but align the stack just in case something
- went wrong. */
- sp &= ~3;
+ went wrong. Stacks are two byte aligned on the mn10200. */
+ sp &= ~1;
/* Now make space on the stack for the args.
XXX This doesn't appear to handle pass-by-invisible reference
arguments. */
for (argnum = 0; argnum < nargs; argnum++)
- len += ((TYPE_LENGTH (VALUE_TYPE (args[argnum])) + 3) & ~3);
+ len += ((TYPE_LENGTH (VALUE_TYPE (args[argnum])) + 1) & ~1);
/* Allocate stack space. */
sp -= len;
while (len > 0)
{
/* XXX This looks wrong; we can have one and two byte args. */
- write_memory (sp + stack_offset, val, 4);
+ write_memory (sp + stack_offset, val, 2);
- len -= 4;
- val += 4;
- stack_offset += 4;
+ len -= 2;
+ val += 2;
+ stack_offset += 2;
}
args++;
}
CORE_ADDR pc;
CORE_ADDR sp;
{
+ unsigned char buf[4];
- return sp;
+ store_unsigned_integer (buf, 4, CALL_DUMMY_ADDRESS ());
+ write_memory (sp - 4, buf, 4);
+ return sp - 4;
}
/* Function: frame_saved_pc