From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jim Blandy To: gdb-patches@sources.redhat.com Subject: Re: [RFA]: Use gdbarch for mn10300 Date: Fri, 04 May 2001 18:39:00 -0000 Message-id: References: <20010504230002.33BBF5E9D5@zwingli.cygnus.com> X-SW-Source: 2001-05/msg00056.html Oops. This does have an effect on GDB's behavior: it changes PC_IN_CALL_DUMMY to use pc_in_call_dummy_at_entry_point instead of generic_pc_in_call_dummy. I meant to remove that and re-submit it as a separate change, but lost track of it. Using pc_in_call_dummy_at_entry_point is a bug fix, getting rid of around 200 test suite failures. I'm happy to re-segregate things if you like. However, I'm under some time pressure, so it would be a kindness to me to approve the patch as is. Jim Blandy writes: > This should have no effect on GDB's behavior. May I commit this? > > 2001-05-04 Jim Blandy > > Use gdbarch for most target parameters for the MN10300, rather > than the tm-*.h file. > * config/mn10300/tm-mn10300.h (MAX_REGISTER_VIRTUAL_SIZE, > REGISTER_BYTES, FP_REGNUM, BREAKPOINT_FROM_PC, > FUNCTION_START_OFFSET, DECR_PC_AFTER_BREAK, INNER_THAN, > SAVED_PC_AFTER_CALL, INIT_EXTRA_FRAME_INFO, FRAME_INIT_SAVED_REGS, > FRAME_CHAIN, FRAME_CHAIN_VALID, FRAME_SAVED_PC, > EXTRACT_RETURN_VALUE, EXTRACT_STRUCT_VALUE_ADDRESS, > STORE_RETURN_VALUE, STORE_STRUCT_RETURN, SKIP_PROLOGUE, > FRAME_ARGS_SKIP, FRAME_ARGS_ADDRESS, FRAME_LOCALS_ADDRESS, > FRAME_NUM_ARGS, POP_FRAME, USE_GENERIC_DUMMY_FRAMES, CALL_DUMMY, > CALL_DUMMY_START_OFFSET, CALL_DUMMY_BREAKPOINT_OFFSET, > CALL_DUMMY_LOCATION, FIX_CALL_DUMMY, CALL_DUMMY_ADDRESS, > TARGET_READ_FP, PUSH_RETURN_ADDRESS, PUSH_DUMMY_FRAME, > SAVE_DUMMY_FRAME_TOS, PUSH_ARGUMENTS, PC_IN_CALL_DUMMY, > REG_STRUCT_HAS_ADDR, USE_STRUCT_CONVENTION, GET_SAVED_REGISTER): > Delete definitions. We register gdbarch methods for these now. > (struct frame_info, struct type, struct value): Delete forward > declarations of these types; they're no longer necessary, since we > don't have function declarations here any more. > * mn10300-tdep.c: #include "arch-utils.h", to get declarations for > some default gdbarch methods. > (mn10300_store_struct_return): Return void, as expected by > gdbarch. > (mn10300_init_extra_frame_info): Take initial `fromleaf' argument, > as expected by gdbarch. > (mn10300_frame_init_saved_regs): Provide dummy definition for > this, as required by gdbarch. > (mn10300_gdbarch_init): Add mn10300_call_dummy_words, as expected > by gdbarch. Register gdbarch methods or values for all the stuff > removed from tm-10300.h, listed above. > > Index: gdb/mn10300-tdep.c > =================================================================== > RCS file: /cvs/src/src/gdb/mn10300-tdep.c,v > retrieving revision 1.8 > diff -c -r1.8 mn10300-tdep.c > *** gdb/mn10300-tdep.c 2001/03/06 08:21:10 1.8 > --- gdb/mn10300-tdep.c 2001/05/04 22:56:27 > *************** > *** 30,35 **** > --- 30,36 ---- > #include "gdbcore.h" > #include "symfile.h" > #include "regcache.h" > + #include "arch-utils.h" > > extern void _initialize_mn10300_tdep (void); > static CORE_ADDR mn10300_analyze_prologue (struct frame_info *fi, > *************** > *** 727,738 **** > Store the structure value return address for an inferior function > call. */ > > ! CORE_ADDR > mn10300_store_struct_return (CORE_ADDR addr, CORE_ADDR sp) > { > /* The structure return address is passed as the first argument. */ > write_register (0, addr); > - return sp; > } > > /* Function: frame_saved_pc > --- 728,738 ---- > Store the structure value return address for an inferior function > call. */ > > ! void > mn10300_store_struct_return (CORE_ADDR addr, CORE_ADDR sp) > { > /* The structure return address is passed as the first argument. */ > write_register (0, addr); > } > > /* Function: frame_saved_pc > *************** > *** 777,783 **** > pointer just prior to calling the target function (see run_stack_dummy). */ > > void > ! mn10300_init_extra_frame_info (struct frame_info *fi) > { > if (fi->next) > fi->pc = FRAME_SAVED_PC (fi->next); > --- 777,783 ---- > pointer just prior to calling the target function (see run_stack_dummy). */ > > void > ! mn10300_init_extra_frame_info (int fromleaf, struct frame_info *fi) > { > if (fi->next) > fi->pc = FRAME_SAVED_PC (fi->next); > *************** > *** 792,797 **** > --- 792,805 ---- > mn10300_analyze_prologue (fi, 0); > } > > + > + /* This function's job is handled by init_extra_frame_info. */ > + void > + mn10300_frame_init_saved_regs (struct frame_info *frame) > + { > + } > + > + > /* Function: mn10300_virtual_frame_pointer > Return the register that the function uses for a frame pointer, > plus any necessary offset to be applied to the register before > *************** > *** 944,949 **** > --- 952,958 ---- > mn10300_gdbarch_init (struct gdbarch_info info, > struct gdbarch_list *arches) > { > + static LONGEST mn10300_call_dummy_words[] = { 0 }; > struct gdbarch *gdbarch; > struct gdbarch_tdep *tdep = NULL; > int am33_mode; > *************** > *** 1000,1005 **** > --- 1009,1052 ---- > set_gdbarch_save_dummy_frame_tos (gdbarch, generic_save_dummy_frame_tos); > set_gdbarch_num_regs (gdbarch, num_regs); > set_gdbarch_do_registers_info (gdbarch, mn10300_do_registers_info); > + > + set_gdbarch_fp_regnum (gdbarch, 31); > + set_gdbarch_max_register_virtual_size (gdbarch, 4); > + set_gdbarch_register_bytes (gdbarch, > + num_regs * gdbarch_register_size (gdbarch)); > + set_gdbarch_breakpoint_from_pc (gdbarch, mn10300_breakpoint_from_pc); > + set_gdbarch_function_start_offset (gdbarch, 0); > + set_gdbarch_decr_pc_after_break (gdbarch, 0); > + set_gdbarch_inner_than (gdbarch, core_addr_lessthan); > + set_gdbarch_frame_chain_valid (gdbarch, generic_file_frame_chain_valid); > + set_gdbarch_saved_pc_after_call (gdbarch, mn10300_saved_pc_after_call); > + set_gdbarch_init_extra_frame_info (gdbarch, mn10300_init_extra_frame_info); > + set_gdbarch_frame_init_saved_regs (gdbarch, mn10300_frame_init_saved_regs); > + set_gdbarch_frame_chain (gdbarch, mn10300_frame_chain); > + set_gdbarch_frame_saved_pc (gdbarch, mn10300_frame_saved_pc); > + set_gdbarch_extract_return_value (gdbarch, mn10300_extract_return_value); > + set_gdbarch_extract_struct_value_address > + (gdbarch, mn10300_extract_struct_value_address); > + set_gdbarch_store_return_value (gdbarch, mn10300_store_return_value); > + set_gdbarch_store_struct_return (gdbarch, mn10300_store_struct_return); > + set_gdbarch_skip_prologue (gdbarch, mn10300_skip_prologue); > + set_gdbarch_frame_args_skip (gdbarch, 0); > + set_gdbarch_frame_args_address (gdbarch, default_frame_address); > + set_gdbarch_frame_locals_address (gdbarch, default_frame_address); > + set_gdbarch_frame_num_args (gdbarch, frame_num_args_unknown); > + /* That's right, we're using the stack pointer as our frame pointer. */ > + set_gdbarch_read_fp (gdbarch, generic_target_read_sp); > + set_gdbarch_call_dummy_location (gdbarch, AT_ENTRY_POINT); > + set_gdbarch_call_dummy_address (gdbarch, entry_point_address); > + set_gdbarch_call_dummy_words (gdbarch, mn10300_call_dummy_words); > + set_gdbarch_sizeof_call_dummy_words (gdbarch, > + sizeof (mn10300_call_dummy_words)); > + set_gdbarch_call_dummy_length (gdbarch, 0); > + set_gdbarch_fix_call_dummy (gdbarch, generic_fix_call_dummy); > + set_gdbarch_call_dummy_start_offset (gdbarch, 0); > + set_gdbarch_pc_in_call_dummy (gdbarch, pc_in_call_dummy_at_entry_point); > + set_gdbarch_push_dummy_frame (gdbarch, generic_push_dummy_frame); > + set_gdbarch_use_struct_convention (gdbarch, mn10300_use_struct_convention); > > tdep->am33_mode = am33_mode; > > Index: gdb/config/mn10300/tm-mn10300.h > =================================================================== > RCS file: /cvs/src/src/gdb/config/mn10300/tm-mn10300.h,v > retrieving revision 1.6 > diff -c -r1.6 tm-mn10300.h > *** gdb/config/mn10300/tm-mn10300.h 2001/03/06 08:21:32 1.6 > --- gdb/config/mn10300/tm-mn10300.h 2001/05/04 22:56:27 > *************** > *** 43,52 **** > #define REGISTER_RAW_SIZE(REG) 4 > #endif > > - #define MAX_REGISTER_VIRTUAL_SIZE 4 > - > - #define REGISTER_BYTES (NUM_REGS * REGISTER_SIZE) > - > #define D2_REGNUM 2 > #define D3_REGNUM 3 > #define A2_REGNUM 6 > --- 43,48 ---- > *************** > *** 59,168 **** > #define LAR_REGNUM 13 > #define E0_REGNUM 15 > > - /* Pseudo register that contains true address of executing stack frame */ > - #define FP_REGNUM 31 > - > - /* BREAKPOINT_FROM_PC uses the program counter value to determine the > - breakpoint that should be used */ > - extern breakpoint_from_pc_fn mn10300_breakpoint_from_pc; > - #define BREAKPOINT_FROM_PC(pcptr, lenptr) mn10300_breakpoint_from_pc (pcptr, lenptr) > - > - #define FUNCTION_START_OFFSET 0 > - > - #define DECR_PC_AFTER_BREAK 0 > - > - #define INNER_THAN(lhs,rhs) ((lhs) < (rhs)) > - > - extern CORE_ADDR mn10300_saved_pc_after_call (struct frame_info *frame); > - #define SAVED_PC_AFTER_CALL(frame) \ > - mn10300_saved_pc_after_call (frame) > - > - struct frame_info; > - struct type; > - struct value; > - > - extern void mn10300_init_extra_frame_info (struct frame_info *); > - #define INIT_EXTRA_FRAME_INFO(fromleaf, fi) mn10300_init_extra_frame_info (fi) > #define INIT_FRAME_PC /* Not necessary */ > > - #define FRAME_INIT_SAVED_REGS(fi) /* handled by init_extra_frame_info */ > - > - extern CORE_ADDR mn10300_frame_chain (struct frame_info *); > - #define FRAME_CHAIN(fi) mn10300_frame_chain (fi) > - #define FRAME_CHAIN_VALID(FP, FI) generic_file_frame_chain_valid (FP, FI) > - > extern CORE_ADDR mn10300_find_callers_reg (struct frame_info *, int); > - extern CORE_ADDR mn10300_frame_saved_pc (struct frame_info *); > - #define FRAME_SAVED_PC(FI) (mn10300_frame_saved_pc (FI)) > - > - /* Extract from an array REGBUF containing the (raw) register state > - a function return value of type TYPE, and copy that, in virtual format, > - into VALBUF. */ > - > - extern void mn10300_extract_return_value (struct type *type, char *regbuf, > - char *valbuf); > - #define EXTRACT_RETURN_VALUE(TYPE, REGBUF, VALBUF) \ > - mn10300_extract_return_value (TYPE, REGBUF, VALBUF) > - > - CORE_ADDR mn10300_extract_struct_value_address (char *regbuf); > - #define EXTRACT_STRUCT_VALUE_ADDRESS(REGBUF) \ > - mn10300_extract_struct_value_address (REGBUF) > - > - void mn10300_store_return_value (struct type *type, char *valbuf); > - #define STORE_RETURN_VALUE(TYPE, VALBUF) \ > - mn10300_store_return_value (TYPE, VALBUF) > > - > - extern CORE_ADDR mn10300_store_struct_return (CORE_ADDR addr, CORE_ADDR sp); > - #define STORE_STRUCT_RETURN(STRUCT_ADDR, SP) \ > - (mn10300_store_struct_return (STRUCT_ADDR, SP)) > - > - extern CORE_ADDR mn10300_skip_prologue (CORE_ADDR); > - #define SKIP_PROLOGUE(pc) (mn10300_skip_prologue (pc)) > - > - #define FRAME_ARGS_SKIP 0 > - > - #define FRAME_ARGS_ADDRESS(fi) ((fi)->frame) > - #define FRAME_LOCALS_ADDRESS(fi) ((fi)->frame) > - #define FRAME_NUM_ARGS(fi) (-1) > - > extern void mn10300_pop_frame (struct frame_info *); > #define POP_FRAME mn10300_pop_frame (get_current_frame ()) > - > - #define USE_GENERIC_DUMMY_FRAMES 1 > - #define CALL_DUMMY {0} > - #define CALL_DUMMY_START_OFFSET (0) > - #define CALL_DUMMY_BREAKPOINT_OFFSET (0) > - #define CALL_DUMMY_LOCATION AT_ENTRY_POINT > - #define FIX_CALL_DUMMY(DUMMY, START, FUNADDR, NARGS, ARGS, TYPE, GCCP) > - #define CALL_DUMMY_ADDRESS() entry_point_address () > - > - #define TARGET_READ_FP() read_sp () > - > - extern CORE_ADDR mn10300_push_return_address (CORE_ADDR, CORE_ADDR); > - #define PUSH_RETURN_ADDRESS(PC, SP) mn10300_push_return_address (PC, SP) > - > - #define PUSH_DUMMY_FRAME generic_push_dummy_frame () > - #define SAVE_DUMMY_FRAME_TOS(SP) generic_save_dummy_frame_tos (SP) > - > - extern CORE_ADDR > - mn10300_push_arguments (int, struct value **, CORE_ADDR, > - int, CORE_ADDR); > - #define PUSH_ARGUMENTS(NARGS, ARGS, SP, STRUCT_RETURN, STRUCT_ADDR) \ > - (mn10300_push_arguments (NARGS, ARGS, SP, STRUCT_RETURN, STRUCT_ADDR)) > - > - #define PC_IN_CALL_DUMMY(PC, SP, FP) generic_pc_in_call_dummy (PC, SP, FP) > - > - #define REG_STRUCT_HAS_ADDR(gcc_p,TYPE) \ > - (TYPE_LENGTH (TYPE) > 8) > - > - extern use_struct_convention_fn mn10300_use_struct_convention; > - #define USE_STRUCT_CONVENTION(GCC_P, TYPE) mn10300_use_struct_convention (GCC_P, TYPE) > - > - /* override the default get_saved_register function with > - one that takes account of generic CALL_DUMMY frames */ > - #define GET_SAVED_REGISTER(raw_buffer, optimized, addrp, frame, regnum, lval) \ > - generic_get_saved_register (raw_buffer, optimized, addrp, frame, regnum, lval) > > /* Cons up virtual frame pointer for trace */ > extern void mn10300_virtual_frame_pointer (CORE_ADDR, long *, long *); > --- 55,66 ---- >