diff options
-rw-r--r-- | gdb/ChangeLog | 8 | ||||
-rw-r--r-- | gdb/config/i386/tm-i386.h | 21 | ||||
-rw-r--r-- | gdb/i386-tdep.c | 20 |
3 files changed, 36 insertions, 13 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 3caff33..790118a 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2000-06-12 Mark Kettenis <kettenis@gnu.org> + + * config/i386/tm-i386.h: Add forward declaration of `struct value'. + (FIX_CALL_DUMMY): Redefined to call i386_fix_call_dummy. + (i386_fix_call_dummy): Add prototype. + * i386-tdep.c (i386_fix_call_dummy): New function based on the + code from the old FIX_CALL_DUMMY macro. + 2000-06-12 Kevin Buettner <kevinb@redhat.com> * procfs.c, remote.c: Eliminate use of PARAMS from these files. diff --git a/gdb/config/i386/tm-i386.h b/gdb/config/i386/tm-i386.h index 918d62a..3507d82 100644 --- a/gdb/config/i386/tm-i386.h +++ b/gdb/config/i386/tm-i386.h @@ -21,9 +21,10 @@ #ifndef TM_I386_H #define TM_I386_H 1 -/* Forward decl's for prototypes */ +/* Forward declarations for prototypes. */ struct frame_info; struct frame_saved_regs; +struct value; struct type; #define TARGET_BYTE_ORDER LITTLE_ENDIAN @@ -408,19 +409,13 @@ extern void i386_pop_frame (void); /* Insert the specified number of args and function address into a call sequence of the above form stored at DUMMYNAME. */ -#define FIX_CALL_DUMMY(dummyname, pc, fun, nargs, args, type, gcc_p) \ -{ \ - int from, to, delta, loc; \ - loc = (int)(read_register (SP_REGNUM) - CALL_DUMMY_LENGTH); \ - from = loc + 5; \ - to = (int)(fun); \ - delta = to - from; \ - *((char *)(dummyname) + 1) = (delta & 0xff); \ - *((char *)(dummyname) + 2) = ((delta >> 8) & 0xff); \ - *((char *)(dummyname) + 3) = ((delta >> 16) & 0xff); \ - *((char *)(dummyname) + 4) = ((delta >> 24) & 0xff); \ -} +#define FIX_CALL_DUMMY(dummyname, pc, fun, nargs, args, type, gcc_p) \ + i386_fix_call_dummy (dummyname, pc, fun, nargs, args, type, gcc_p) +extern void i386_fix_call_dummy (char *dummy, CORE_ADDR pc, CORE_ADDR fun, + int nargs, struct value **args, + struct type *type, int gcc_p); +/* FIXME: kettenis/2000-06-12: These do not belong here. */ extern void print_387_control_word (unsigned int); extern void print_387_status_word (unsigned int); diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c index 4eddde5..728d012 100644 --- a/gdb/i386-tdep.c +++ b/gdb/i386-tdep.c @@ -638,6 +638,26 @@ i386_push_dummy_frame () write_register (SP_REGNUM, sp); } +/* Insert the (relative) function address into the call sequence + stored at DYMMY. */ + +void +i386_fix_call_dummy (char *dummy, CORE_ADDR pc, CORE_ADDR fun, int nargs, + value_ptr *args, struct type *type, int gcc_p) +{ + int from, to, delta, loc; + + loc = (int)(read_register (SP_REGNUM) - CALL_DUMMY_LENGTH); + from = loc + 5; + to = (int)(fun); + delta = to - from; + + *((char *)(dummy) + 1) = (delta & 0xff); + *((char *)(dummy) + 2) = ((delta >> 8) & 0xff); + *((char *)(dummy) + 3) = ((delta >> 16) & 0xff); + *((char *)(dummy) + 4) = ((delta >> 24) & 0xff); +} + void i386_pop_frame () { |