This is the mail archive of the gdb-patches@sources.redhat.com 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]

Re: [RFA]: Use gdbarch for mn10300



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 <jimb@cygnus.com> writes:
> This should have no effect on GDB's behavior.  May I commit this?
> 
> 2001-05-04  Jim Blandy  <jimb@redhat.com>
> 
> 	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 ----
> 


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