[RFA]: gdbarch FETCH_POINTER_ARGUMENT
Andrew Cagney
ac131313@redhat.com
Fri May 30 19:26:00 GMT 2003
> Here's an updated patch. The more I looked at the "struct type *type" argument, the less I understood about how it should be used. I assume it would only be used, so far, on i386, but I'm easily confused by stacks and registers (and how things are stored there), so any pointers would be appreciated.
The patch is almost fine. Change it to `F' instead of `f' - so that a
predicate is also available.
For some background, see: Pointers Are Not Always Addresses
http://sources.redhat.com/gdb/current/onlinedocs/gdbint_9.html#SEC71
The d10v is an example.
Andrew
> 2003-05-18 Adam Fedor <fedor@gnu.org>
>
> * gdbarch.sh (function_list): Add FETCH_POINTER_ARGUMENT.
> * gdbarch.[ch]: Regenerate.
> * hppa-tdep.c (hppa_fetch_pointer_argument): New function.
> (hppa_gdbarch_init): Set it in the gdbarch vector.
> * i386-tdep.c (i386_fetch_pointer_argument): New
> (i386_gdbarch_init): Set it into gdbarch.
> * rs6000-tdep.c (rs6000_fetch_pointer_argument): New.
> (rs6000_gdbarch_init): Set it in gdbarch.
> * sparc-tdep.c (sparc_fetch_pointer_argument): New
> (sparc_gdbarch_init): Set it in gdbarch.
>
> Index: gdbarch.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/gdbarch.c,v
> retrieving revision 1.216
> diff -u -p -r1.216 gdbarch.c
> --- gdbarch.c 17 May 2003 05:59:58 -0000 1.216
> +++ gdbarch.c 30 May 2003 02:59:43 -0000
> @@ -280,6 +280,7 @@ struct gdbarch
> gdbarch_address_class_type_flags_to_name_ftype *address_class_type_flags_to_name;
> gdbarch_address_class_name_to_type_flags_ftype *address_class_name_to_type_flags;
> gdbarch_register_reggroup_p_ftype *register_reggroup_p;
> + gdbarch_fetch_pointer_argument_ftype *fetch_pointer_argument;
> };
>
>
> @@ -446,6 +447,7 @@ struct gdbarch startup_gdbarch =
> 0,
> 0,
> default_register_reggroup_p,
> + 0,
> /* startup_gdbarch() */
> };
>
> @@ -1693,6 +1695,17 @@ gdbarch_dump (struct gdbarch *gdbarch, s
> (long) current_gdbarch->extract_struct_value_address
> /*EXTRACT_STRUCT_VALUE_ADDRESS ()*/);
> #endif
> +#ifdef FETCH_POINTER_ARGUMENT
> + fprintf_unfiltered (file,
> + "gdbarch_dump: %s # %s\n",
> + "FETCH_POINTER_ARGUMENT(frame, argi, type)",
> + XSTRING (FETCH_POINTER_ARGUMENT (frame, argi, type)));
> + if (GDB_MULTI_ARCH)
> + fprintf_unfiltered (file,
> + "gdbarch_dump: FETCH_POINTER_ARGUMENT = <0x%08lx>\n",
> + (long) current_gdbarch->fetch_pointer_argument
> + /*FETCH_POINTER_ARGUMENT ()*/);
> +#endif
> #ifdef FP0_REGNUM
> fprintf_unfiltered (file,
> "gdbarch_dump: FP0_REGNUM # %s\n",
> @@ -5689,6 +5702,25 @@ set_gdbarch_register_reggroup_p (struct
> gdbarch_register_reggroup_p_ftype register_reggroup_p)
> {
> gdbarch->register_reggroup_p = register_reggroup_p;
> +}
> +
> +CORE_ADDR
> +gdbarch_fetch_pointer_argument (struct gdbarch *gdbarch, struct frame_info *frame, int argi, struct type *type)
> +{
> + gdb_assert (gdbarch != NULL);
> + if (gdbarch->fetch_pointer_argument == 0)
> + internal_error (__FILE__, __LINE__,
> + "gdbarch: gdbarch_fetch_pointer_argument invalid");
> + if (gdbarch_debug >= 2)
> + fprintf_unfiltered (gdb_stdlog, "gdbarch_fetch_pointer_argument called\n");
> + return gdbarch->fetch_pointer_argument (frame, argi, type);
> +}
> +
> +void
> +set_gdbarch_fetch_pointer_argument (struct gdbarch *gdbarch,
> + gdbarch_fetch_pointer_argument_ftype fetch_pointer_argument)
> +{
> + gdbarch->fetch_pointer_argument = fetch_pointer_argument;
> }
>
>
> Index: gdbarch.h
> ===================================================================
> RCS file: /cvs/src/src/gdb/gdbarch.h,v
> retrieving revision 1.185
> diff -u -p -r1.185 gdbarch.h
> --- gdbarch.h 17 May 2003 05:59:58 -0000 1.185
> +++ gdbarch.h 30 May 2003 02:59:44 -0000
> @@ -3184,6 +3184,20 @@ typedef int (gdbarch_register_reggroup_p
> extern int gdbarch_register_reggroup_p (struct gdbarch *gdbarch, int regnum, struct reggroup *reggroup);
> extern void set_gdbarch_register_reggroup_p (struct gdbarch *gdbarch, gdbarch_register_reggroup_p_ftype *register_reggroup_p);
>
> +/* Fetch the pointer to the ith function argument. */
> +
> +typedef CORE_ADDR (gdbarch_fetch_pointer_argument_ftype) (struct frame_info *frame, int argi, struct type *type);
> +extern CORE_ADDR gdbarch_fetch_pointer_argument (struct gdbarch *gdbarch, struct frame_info *frame, int argi, struct type *type);
> +extern void set_gdbarch_fetch_pointer_argument (struct gdbarch *gdbarch, gdbarch_fetch_pointer_argument_ftype *fetch_pointer_argument);
> +#if (GDB_MULTI_ARCH > GDB_MULTI_ARCH_PARTIAL) && defined (FETCH_POINTER_ARGUMENT)
> +#error "Non multi-arch definition of FETCH_POINTER_ARGUMENT"
> +#endif
> +#if GDB_MULTI_ARCH
> +#if (GDB_MULTI_ARCH > GDB_MULTI_ARCH_PARTIAL) || !defined (FETCH_POINTER_ARGUMENT)
> +#define FETCH_POINTER_ARGUMENT(frame, argi, type) (gdbarch_fetch_pointer_argument (current_gdbarch, frame, argi, type))
> +#endif
> +#endif
> +
> extern struct gdbarch_tdep *gdbarch_tdep (struct gdbarch *gdbarch);
>
>
> Index: gdbarch.sh
> ===================================================================
> RCS file: /cvs/src/src/gdb/gdbarch.sh,v
> retrieving revision 1.237
> diff -u -p -r1.237 gdbarch.sh
> --- gdbarch.sh 17 May 2003 05:59:58 -0000 1.237
> +++ gdbarch.sh 30 May 2003 02:59:45 -0000
> @@ -716,6 +716,8 @@ M:2:ADDRESS_CLASS_TYPE_FLAGS_TO_NAME:con
> M:2:ADDRESS_CLASS_NAME_TO_TYPE_FLAGS:int:address_class_name_to_type_flags:const char *name, int *type_flags_ptr:name, type_flags_ptr
> # Is a register in a group
> m:::int:register_reggroup_p:int regnum, struct reggroup *reggroup:regnum, reggroup:::default_register_reggroup_p::0
> +# Fetch the pointer to the ith function argument.
> +f::FETCH_POINTER_ARGUMENT:CORE_ADDR:fetch_pointer_argument:struct frame_info *frame, int argi, struct type *type:frame, argi, type:::::::::
> EOF
> }
>
> Index: hppa-tdep.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/hppa-tdep.c,v
> retrieving revision 1.79
> diff -u -p -r1.79 hppa-tdep.c
> --- hppa-tdep.c 22 May 2003 02:04:05 -0000 1.79
> +++ hppa-tdep.c 30 May 2003 02:59:48 -0000
> @@ -4993,6 +4993,16 @@ hppa_smash_text_address (CORE_ADDR addr)
> return (addr &= ~0x3);
> }
>
> +/* Get the ith function argument for the current function. */
> +CORE_ADDR
> +hppa_fetch_pointer_argument (struct frame_info *frame, int argi,
> + struct type *type)
> +{
> + CORE_ADDR addr;
> + frame_read_register (frame, R0_REGNUM + 26 - argi, &addr);
> + return addr;
> +}
> +
> static struct gdbarch *
> hppa_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
> {
> @@ -5070,6 +5080,9 @@ hppa_gdbarch_init (struct gdbarch_info i
> set_gdbarch_read_pc (gdbarch, hppa_target_read_pc);
> set_gdbarch_write_pc (gdbarch, hppa_target_write_pc);
> set_gdbarch_deprecated_target_read_fp (gdbarch, hppa_target_read_fp);
> +
> + /* Helper for function argument information. */
> + set_gdbarch_fetch_pointer_argument (gdbarch, hppa_fetch_pointer_argument);
>
> return gdbarch;
> }
> Index: i386-tdep.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/i386-tdep.c,v
> retrieving revision 1.144
> diff -u -p -r1.144 i386-tdep.c
> --- i386-tdep.c 17 May 2003 05:59:58 -0000 1.144
> +++ i386-tdep.c 30 May 2003 02:59:48 -0000
> @@ -1420,6 +1420,16 @@ i386_register_reggroup_p (struct gdbarch
> return default_register_reggroup_p (gdbarch, regnum, group);
> }
>
> +/* Get the ith function argument for the current function. */
> +CORE_ADDR
> +i386_fetch_pointer_argument (struct frame_info *frame, int argi,
> + struct type *type)
> +{
> + CORE_ADDR stack;
> + frame_read_register (frame, SP_REGNUM, &stack);
> + return read_memory_unsigned_integer (stack + (4 * (argi + 1)), 4);
> +}
> +
>
> static struct gdbarch *
> i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
> @@ -1551,6 +1561,9 @@ i386_gdbarch_init (struct gdbarch_info i
> /* Add the i386 register groups. */
> i386_add_reggroups (gdbarch);
> set_gdbarch_register_reggroup_p (gdbarch, i386_register_reggroup_p);
> +
> + /* Helper for function argument information. */
> + set_gdbarch_fetch_pointer_argument (gdbarch, i386_fetch_pointer_argument);
>
> /* Should be using push_dummy_call. */
> set_gdbarch_deprecated_dummy_write_sp (gdbarch, generic_target_write_sp);
> Index: rs6000-tdep.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/rs6000-tdep.c,v
> retrieving revision 1.135
> diff -u -p -r1.135 rs6000-tdep.c
> --- rs6000-tdep.c 29 May 2003 19:47:14 -0000 1.135
> +++ rs6000-tdep.c 30 May 2003 02:59:56 -0000
> @@ -230,6 +230,16 @@ rs6000_saved_pc_after_call (struct frame
> return read_register (gdbarch_tdep (current_gdbarch)->ppc_lr_regnum);
> }
>
> +/* Get the ith function argument for the current function. */
> +CORE_ADDR
> +rs6000_fetch_pointer_argument (struct frame_info *frame, int argi,
> + struct type *type)
> +{
> + CORE_ADDR addr;
> + frame_read_register (frame, 3 + argi, &addr);
> + return addr;
> +}
> +
> /* Calculate the destination of a branch/jump. Return -1 if not a branch. */
>
> static CORE_ADDR
> @@ -2990,6 +3000,9 @@ rs6000_gdbarch_init (struct gdbarch_info
> set_gdbarch_frame_args_address (gdbarch, rs6000_frame_args_address);
> set_gdbarch_frame_locals_address (gdbarch, rs6000_frame_args_address);
> set_gdbarch_deprecated_saved_pc_after_call (gdbarch, rs6000_saved_pc_after_call);
> +
> + /* Helpers for function argument information. */
> + set_gdbarch_fetch_pointer_argument (gdbarch, rs6000_fetch_pointer_argument);
>
> /* We can't tell how many args there are
> now that the C compiler delays popping them. */
> Index: sparc-tdep.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/sparc-tdep.c,v
> retrieving revision 1.103
> diff -u -p -r1.103 sparc-tdep.c
> --- sparc-tdep.c 25 May 2003 15:47:26 -0000 1.103
> +++ sparc-tdep.c 30 May 2003 03:00:00 -0000
> @@ -3243,6 +3243,15 @@ sparc_return_value_on_stack (struct type
> return 0;
> }
>
> +/* Get the ith function argument for the current function. */
> +CORE_ADDR
> +sparc_fetch_pointer_argument (struct frame_info *frame, int argi, struct type *type)
> +{
> + CORE_ADDR addr;
> + frame_read_register (frame, O0_REGNUM + argi, &addr);
> + return addr;
> +}
> +
> /*
> * Gdbarch "constructor" function.
> */
> @@ -3353,6 +3362,9 @@ sparc_gdbarch_init (struct gdbarch_info
> set_gdbarch_sp_regnum (gdbarch, SPARC_SP_REGNUM);
> set_gdbarch_deprecated_use_generic_dummy_frames (gdbarch, 0);
> set_gdbarch_write_pc (gdbarch, generic_target_write_pc);
> +
> + /* Helper for function argument information. */
> + set_gdbarch_fetch_pointer_argument (gdbarch, sparc_fetch_pointer_argument);
>
> /*
> * Settings that depend only on 32/64 bit word size
More information about the Gdb-patches
mailing list