[PATCH 3/11] Add MIPS_MAX_REGISTER_SIZE

Yao Qi qiyaoltc@gmail.com
Tue Apr 11 15:37:00 GMT 2017


Alan Hayward <Alan.Hayward@arm.com> writes:

Hi Alan,
There are different ways of getting rid of MAX_REGISTER_SIZE, let us try
some simple approaches first.  Some uses of MAX_REGISTER_SIZE still
can't be removed, but let us start from easy part.

> diff --git a/gdb/mips-linux-tdep.c b/gdb/mips-linux-tdep.c
> index 57e75b5343e1b927e9fe28dea16759f769cf4506..ce2f378854f4b66c426fd9d6683831e8795c58a6 100644
> --- a/gdb/mips-linux-tdep.c
> +++ b/gdb/mips-linux-tdep.c
> @@ -118,7 +118,7 @@ supply_32bit_reg (struct regcache *regcache, int regnum, const void *addr)
>  {
>    struct gdbarch *gdbarch = get_regcache_arch (regcache);
>    enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
> -  gdb_byte buf[MAX_REGISTER_SIZE];
> +  gdb_byte buf[MIPS_MAX_REGISTER_SIZE];

Given the function name supply_32bit_reg, all registers are 32-bit here,
so we can do "buf[4]"?

> @@ -470,7 +470,7 @@ mips64_fill_gregset (const struct regcache *regcache,
>
>    if (regaddr != -1)
>      {
> -      gdb_byte buf[MAX_REGISTER_SIZE];
> +      gdb_byte buf[MIPS_MAX_REGISTER_SIZE];
>        LONGEST val;
>
>        regcache_raw_collect (regcache, regno, buf);

The "buf" is used by regcache_raw_collect + extract_signed_integer,

      regcache_raw_collect (regcache, regno, buf);
      val = extract_signed_integer (buf, register_size (gdbarch, regno),
				    byte_order);

this pattern exists in some places, so can we add a new regcache api,

LONGEST
regcache_raw_collect_signed (const struct regcache *regcache, int regnum)
{
  struct gdbarch *gdbarch = get_regcache_arch (regcache);
  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);

  return extract_signed_integer (register_buffer (regcache, regnum),
                                 register_size (gdbarch, regnum),
                                 byte_order);
}

this will remove one memory copy, as well as the local buffer "buf".

> diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c
> index 41cb9d82c6ef473c1fbbf86601914f9a4f462411..51a22ba29a520639bdeb95c235c00c74ad40435b 100644
> --- a/gdb/mips-tdep.c
> +++ b/gdb/mips-tdep.c
> @@ -4527,7 +4527,7 @@ mips_eabi_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
>    for (argnum = 0; argnum < nargs; argnum++)
>      {
>        const gdb_byte *val;
> -      gdb_byte valbuf[MAX_REGISTER_SIZE];
> +      gdb_byte valbuf[MIPS_MAX_REGISTER_SIZE];
>        struct value *arg = args[argnum];
>        struct type *arg_type = check_typedef (value_type (arg));
>        int len = TYPE_LENGTH (arg_type);
> @@ -5758,7 +5758,7 @@ mips_o32_return_value (struct gdbarch *gdbarch, struct value *function,
>        /* A struct that contains one or two floats.  Each value is part
>           in the least significant part of their floating point
>           register..  */
> -      gdb_byte reg[MAX_REGISTER_SIZE];
> +      gdb_byte reg[MIPS_MAX_REGISTER_SIZE];

"reg" is not used at all, we can remove it.

>        int regnum;
>        int field;
>        for (field = 0, regnum = mips_regnum (gdbarch)->fp0;
> @@ -6473,7 +6473,7 @@ print_gp_register_row (struct ui_file *file, struct frame_info *frame,
>  {
>    struct gdbarch *gdbarch = get_frame_arch (frame);
>    /* Do values for GP (int) regs.  */
> -  gdb_byte raw_buffer[MAX_REGISTER_SIZE];
> +  gdb_byte raw_buffer[MIPS_MAX_REGISTER_SIZE];
>    int ncols = (mips_abi_regsize (gdbarch) == 8 ? 4 : 8);    /* display cols
>  							       per row.  */

"raw_buffer" is used in deprecated_frame_register_read, so can we use
get_frame_register_value instead? so that "raw_buffer" is not needed.

-- 
Yao (齐尧)



More information about the Gdb-patches mailing list