Index: vax-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/vax-tdep.c,v retrieving revision 1.7 diff -u -r1.7 vax-tdep.c --- vax-tdep.c 22 Apr 2002 19:44:04 -0000 1.7 +++ vax-tdep.c 22 Apr 2002 20:32:02 -0000 @@ -126,6 +126,57 @@ frame->saved_regs[AP_REGNUM] = frame->frame + 8; frame->saved_regs[PS_REGNUM] = frame->frame + 4; } + +CORE_ADDR +vax_frame_saved_pc (struct frame_info *frame) +{ + if (frame->signal_handler_caller) + return (sigtramp_saved_pc (frame)); /* XXXJRT */ + + return (read_memory_integer (frame->frame + 16, 4)); +} + +CORE_ADDR +vax_frame_args_address_correct (struct frame_info *frame) +{ + /* Cannot find the AP register value directly from the FP value. Must + find it saved in the frame called by this one, or in the AP register + for the innermost frame. However, there is no way to tell the + difference between the innermost frame and a frame for which we + just don't know the frame that it called (e.g. "info frame 0x7ffec789"). + For the sake of argument, suppose that the stack is somewhat trashed + (which is one reason that "info frame" exists). So, return 0 (indicating + we don't know the address of the arglist) if we don't know what frame + this frame calls. */ + if (frame->next) + return (read_memory_integer (frame->next->frame + 8, 4)); + + return (0); +} + +CORE_ADDR +vax_frame_args_address (struct frame_info *frame) +{ + /* In most of GDB, getting the args address is too important to + just say "I don't know". This is sometimes wrong for functions + that aren't on top of the stack, but c'est la vie. */ + if (frame->next) + return (read_memory_integer (frame->next->frame + 8, 4)); + + return (read_register (AP_REGNUM)); +} + +CORE_ADDR +vax_frame_locals_address (struct frame_info *frame) +{ + return (frame->frame); +} + +int +vax_frame_num_args (struct frame_info *fi) +{ + return (0xff & read_memory_integer (FRAME_ARGS_ADDRESS (fi), 1)); +} /* Advance PC across any function entry prologue instructions to reach some "real" code. */ @@ -155,16 +206,6 @@ pc += 7; /* skip movab */ return pc; } - -/* Return number of args passed to a frame. - Can return -1, meaning no way to tell. */ - -int -vax_frame_num_args (struct frame_info *fi) -{ - return (0xff & read_memory_integer (FRAME_ARGS_ADDRESS (fi), 1)); -} - /* Print the vax instruction at address MEMADDR in debugged memory, Index: config/vax/tm-vax.h =================================================================== RCS file: /cvs/src/src/gdb/config/vax/tm-vax.h,v retrieving revision 1.9 diff -u -r1.9 tm-vax.h --- config/vax/tm-vax.h 22 Apr 2002 19:44:05 -0000 1.9 +++ config/vax/tm-vax.h 22 Apr 2002 20:32:02 -0000 @@ -51,7 +51,7 @@ /* Stack grows downward. */ -#define INNER_THAN(lhs,rhs) ((lhs) < (rhs)) +#define INNER_THAN(lhs,rhs) core_addr_lessthan ((lhs), (rhs)) /* Sequence of bytes for breakpoint instruction. */ @@ -173,37 +173,21 @@ /* Saved Pc. Get it from sigcontext if within sigtramp. */ /* Offset to saved PC in sigcontext, from . */ +/* XXXJRT should go away */ #define SIGCONTEXT_PC_OFFSET 12 -#define FRAME_SAVED_PC(FRAME) \ - (((FRAME)->signal_handler_caller \ - ? sigtramp_saved_pc (FRAME) \ - : read_memory_integer ((FRAME)->frame + 16, 4)) \ - ) - -/* Cannot find the AP register value directly from the FP value. Must - find it saved in the frame called by this one, or in the AP - register for the innermost frame. However, there is no way to tell - the difference between the innermost frame and a frame for which we - just don't know the frame that it called (e.g. "info frame - 0x7ffec789"). For the sake of argument suppose that the stack is - somewhat trashed (which is one reason that "info frame" exists). - So return 0 (indicating we don't know the address of - the arglist) if we don't know what frame this frame calls. */ -#define FRAME_ARGS_ADDRESS_CORRECT(fi) \ - (((fi)->next \ - ? read_memory_integer ((fi)->next->frame + 8, 4) \ - : /* read_register (AP_REGNUM) */ 0)) - -/* In most of GDB, getting the args address is too important to - just say "I don't know". This is sometimes wrong for functions - that aren't on top of the stack, but c'est la vie. */ -#define FRAME_ARGS_ADDRESS(fi) \ - (((fi)->next \ - ? read_memory_integer ((fi)->next->frame + 8, 4) \ - : read_register (AP_REGNUM) /* 0 */)) +#define FRAME_SAVED_PC(FRAME) vax_frame_saved_pc ((FRAME)) +extern CORE_ADDR vax_frame_saved_pc (struct frame_info *); -#define FRAME_LOCALS_ADDRESS(fi) ((fi)->frame) +/* XXXJRT not yet under gdbarch control */ +#define FRAME_ARGS_ADDRESS_CORRECT(fi) vax_frame_args_address ((fi)) +extern CORE_ADDR vax_frame_args_address (struct frame_info *); + +#define FRAME_ARGS_ADDRESS(fi) vax_frame_args_address ((fi)) +extern CORE_ADDR vax_frame_args_address (struct frame_info *); + +#define FRAME_LOCALS_ADDRESS(fi) vax_frame_locals_address ((fi)) +extern CORE_ADDR vax_frame_locals_address (struct frame_info *); /* Return number of args passed to a frame. Can return -1, meaning no way to tell. */