[commit, spu] Do not use generic_push_dummy_code

Ulrich Weigand
2008-09-05T16:19:29Z

Mark Kettenis wrote:

> Now you mention it, it would be nice if we could change the SPU code
> such that it doesn't use generic_push_dummy_code(). This function
> abuses frame_align(), and it would be nice if we could eliminate it.
>
> Something like i386_dicos_push_dummy_code() is needed. I can roll you
> a diff if you want, but I won't be able to test it.

No problem. The following patch adds a spu_push_dummy_code function.
If you want to eliminate generic_push_dummy_code now, that would
certainly be fine with me ...

Tested with no regressions on spu-elf.
Committed to mainline.

Bye,
Ulrich

ChangeLog:

* spu-tdep.c (spu_push_dummy_code): New function.
(spu_gdbarch_init): Install it.

Index: gdb/spu-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/spu-tdep.c,v
retrieving revision 1.39
diff -c -p -r1.39 spu-tdep.c
*** gdb/spu-tdep.c 5 Sep 2008 11:37:17 -0000 1.39
--- gdb/spu-tdep.c 5 Sep 2008 15:06:47 -0000
*************** spu_frame_align (struct gdbarch *gdbarch
*** 1032,1037 ****
--- 1032,1053 ----
return sp & ~15;
}

+ static CORE_ADDR
+ spu_push_dummy_code (struct gdbarch *gdbarch, CORE_ADDR sp, CORE_ADDR funaddr,
+ struct value **args, int nargs, struct type *value_type,
+ CORE_ADDR *real_pc, CORE_ADDR *bp_addr,
+ struct regcache *regcache)
+ {
+ /* Allocate space sufficient for a breakpoint, keeping the stack aligned. */
+ sp = (sp - 4) & ~15;
+ /* Store the address of that breakpoint */
+ *bp_addr = sp;
+ /* The call starts at the callee's entry point. */
+ *real_pc = funaddr;
+
+ return sp;
+ }
+
static int
spu_scalar_value_p (struct type *type)
{
*************** spu_gdbarch_init (struct gdbarch_info in
*** 2108,2113 ****
--- 2124,2130 ----
set_gdbarch_call_dummy_location (gdbarch, ON_STACK);
set_gdbarch_frame_align (gdbarch, spu_frame_align);
set_gdbarch_frame_red_zone_size (gdbarch, 2000);
+ set_gdbarch_push_dummy_code (gdbarch, spu_push_dummy_code);
set_gdbarch_push_dummy_call (gdbarch, spu_push_dummy_call);
set_gdbarch_dummy_id (gdbarch, spu_dummy_id);
set_gdbarch_return_value (gdbarch, spu_return_value);