This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Fix Ericsson DICOS inferior function calls


Hi Mark,

On Monday 07 July 2008 23:56:21, Mark Kettenis wrote:

> I think we should get rid of generic_push_dummy_code(), and instead
> require that each target that puts the dummy breakpoint on the stack
> provides its own push_dummy_code() function.  Could you provide one
> for DICOS?

Something like this?

It looks like the only other target that uses ON_STACK and doesn't
define a push_dummy_code is spu-tdep.c.

-- 
Pedro Alves
2008-07-09  Pedro Alves  <pedro@codesourcery.com>

	* i386-dicos-tdep.c (i386_dicos_frame_align): Delete.
	(i386_dicos_push_dummy_code): New.
	(i386_dicos_init_abi): Don't register i386_dicos_frame_align.
	Register i386_dicos_push_dummy_code.

---
 gdb/i386-dicos-tdep.c |   23 +++++++++++++++--------
 1 file changed, 15 insertions(+), 8 deletions(-)

Index: src/gdb/i386-dicos-tdep.c
===================================================================
--- src.orig/gdb/i386-dicos-tdep.c	2008-07-09 00:33:38.000000000 +0100
+++ src/gdb/i386-dicos-tdep.c	2008-07-09 00:41:36.000000000 +0100
@@ -25,14 +25,21 @@
 #include "inferior.h"
 
 static CORE_ADDR
-i386_dicos_frame_align (struct gdbarch *gdbarch, CORE_ADDR sp)
+i386_dicos_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)
 {
-  /* Having a call dummy on the stack requires a gdbarch_frame_align
-     method to align the breakpoint instruction in the stack.
-     Strictly speaking, we could just return SP pristine on x86.  But,
-     as long as we're providing a frame align method, might as well
-     align for efficiency.  */
-  return sp & -(CORE_ADDR)16;
+  int bplen;
+  CORE_ADDR bppc = sp;
+
+  gdbarch_breakpoint_from_pc (gdbarch, &bppc, &bplen);
+  *bp_addr = sp - bplen;
+  *real_pc = funaddr;
+
+  return *bp_addr;
 }
 
 static void
@@ -46,7 +53,7 @@ i386_dicos_init_abi (struct gdbarch_info
      text location we could find with a symbol where to place the call
      dummy, so we put it on the stack.  */
   set_gdbarch_call_dummy_location (gdbarch, ON_STACK);
-  set_gdbarch_frame_align (gdbarch, i386_dicos_frame_align);
+  set_gdbarch_push_dummy_code (gdbarch, i386_dicos_push_dummy_code);
 }
 
 /* Look in the elf symbol table of ABFD for a symbol named WANTED.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]