[RFC/TileGX 5/6]show registers in columns

Joel Brobecker brobecker@adacore.com
Fri Jan 18 13:50:00 GMT 2013


> tilegx has 64 registers, to show them in row will be not very
> convinent to explore,
> so we improve this by showing them in columns.
> 
> (gdb) info registers
> r0   0x0000000000000001    r19  0x0000000000000000    r38 0x0000000000000040
> r1   0x000001ffffc7f458         r20  0x000001ffffc7f278         r39
> 0x0000000000000000
> r2   0x000001ffffc7f468         r21  0x000001ffffc7f298         r40
> 0x000000000015b3e8
> r3   0x0000000000010720    r22  0x000001ffffc7f280         r41
> 0x000000000015882c

Forgive me, but the above doesn't look easier to read... Was it
because of wrap-around by your mailer or your MTA?

> gdb/ChangeLog:
> 
>        * tilegx-tdep.c (tilegx_print_registers_info): New function.
>        show registers in columns.

I am not a big specialist of formatting this type of information.
To me the first 2 obvious remarks is that:

  - The number of columns should be dynamic, depending on the width
    of the terminal; and if the width is unset, then default to
    80 characters. We may also have to make a decision if the width
    is unlimited.

  - This will need confirmation from the other Global Maintainers
    but I think it would be better if you used the ui-out routines
    to print the registers.

One additional remark is that, with 64 registers, it might be good
enough to print them in two columns always, and not deal with
complexity of the terminal width. It even looks like you might be
able to fit in 3 columns within 80 chars, if you prefer...


> 
> please review.
> 
> ---
> Regards,
> Jiong
> Tilera Corporation.
> 

> ---
>  gdb/tilegx-tdep.c |   63 +++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 63 insertions(+)
> 
> diff --git a/gdb/tilegx-tdep.c b/gdb/tilegx-tdep.c
> index 7f36bed..c19bdf9 100644
> --- a/gdb/tilegx-tdep.c
> +++ b/gdb/tilegx-tdep.c
> @@ -940,6 +940,66 @@ tilegx_cannot_reference_register (struct gdbarch *gdbarch, int regno)
>      return 1;
>  }
>  
> +
> +/* Tilera private register printer.  */
> +#define MAX_COLUMNS 3
> +static void
> +tilegx_print_registers_info (struct gdbarch *gdbarch, struct ui_file *file,
> +                             struct frame_info *frame,
> +                             int regnum, int print_all)
> +{
> +  int i;
> +  int j;
> +  int k;
> +  gdb_byte buffer[MAX_REGISTER_SIZE];
> +
> +  if (regnum != -1)
> +    {
> +      default_print_registers_info (gdbarch, file, frame, regnum, print_all);
> +      return;
> +    }
> +
> +  for (i = 0; i < TILEGX_NUM_EASY_REGS / MAX_COLUMNS + 1; ++i)
> +    {
> +      for (j = i;
> +           j < TILEGX_NUM_EASY_REGS + 1;
> +           j += TILEGX_NUM_EASY_REGS / MAX_COLUMNS + 1)
> +        {
> +	  /* Some registers are never available. Skip them and print PC.  */
> +	  if (j > TILEGX_LR_REGNUM)
> +	    j = TILEGX_PC_REGNUM;
> +
> +	  if (j > i)
> +	    fprintf_filtered (file, "    ");
> +
> +	  fputs_filtered (gdbarch_register_name (gdbarch, j), file);
> +	  print_spaces_filtered (5 - strlen (gdbarch_register_name
> +					     (gdbarch, j)), file);
> +
> +	  /* Get the data in raw format.  */
> +	  if (! deprecated_frame_register_read (frame, j, buffer))
> +	    {
> +	      fprintf_filtered (file, " *** no value *** ");
> +	    }
> +	  else
> +	    {
> +	      fprintf_filtered (file, "0x");
> +	      for (k = 0; k < tilegx_reg_size; k++)
> +		{
> +		  int idx;
> +		  if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
> +		    idx = k;
> +		  else
> +		    idx = tilegx_reg_size - 1 - k;
> +		  fprintf_filtered (file, "%02x", (unsigned char) buffer[idx]);
> +		}
> +	    }
> +        }
> +
> +      fprintf_filtered (file, "\n");
> +    }
> +}
> +
>  static struct gdbarch *
>  tilegx_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  {
> @@ -1000,6 +1060,9 @@ tilegx_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>    /* Stack grows down.  */
>    set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
>  
> +  /* Tilera private register printer */
> +  set_gdbarch_print_registers_info (gdbarch, tilegx_print_registers_info);
> +
>    /* Frame Info.  */
>    set_gdbarch_unwind_sp (gdbarch, tilegx_unwind_sp);
>    set_gdbarch_unwind_pc (gdbarch, tilegx_unwind_pc);
> -- 
> 1.7.10.3
> 
> 


-- 
Joel



More information about the Gdb-patches mailing list