[11/11] Add SH_MAX_REGISTER_SIZE and SH64_MAX_REGISTER_SIZE

Message ID BA394ECE-9E01-40D3-91EB-BCBD89FE4EAE@arm.com
State New, archived
Headers

Commit Message

Alan Hayward April 4, 2017, 10:16 a.m. UTC
  Max size set to 96bits, which I determined using the various sh*register_type() functions.

Tested on a --enable-targets=all build using make check with board files
unix and native-gdbserver.

I do not have a SH machine to test on.

Ok to commit?

Alan.

2017-04-04  Alan Hayward  <alan.hayward@arm.com>

	* sh-tdep.c (sh_pseudo_register_read): Use SH_MAX_REGISTER_SIZE.
	(sh_pseudo_register_write): Likewise.
	* sh64-tdep.c (SH_MAX_REGISTER_SIZE): Add.
	(sh64_pseudo_register_read):  Use SH64_MAX_REGISTER_SIZE..
	(sh64_pseudo_register_write): Likewise.
	* sh-tdep.h (SH64_MAX_REGISTER_SIZE): Add.
  

Comments

Yao Qi April 11, 2017, 11:23 a.m. UTC | #1
Alan Hayward <Alan.Hayward@arm.com> writes:

> diff --git a/gdb/sh-tdep.c b/gdb/sh-tdep.c
> index 9b3692dc0c32ffcb53d99f0fc095303d2c221fcb..7e56864202fe9321edb7561c721ef912b3a4f8c5 100644
> --- a/gdb/sh-tdep.c
> +++ b/gdb/sh-tdep.c
> @@ -1648,7 +1648,7 @@ sh_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
>  			 int reg_nr, gdb_byte *buffer)
>  {
>    int base_regnum;
> -  gdb_byte temp_buffer[MAX_REGISTER_SIZE];
> +  gdb_byte temp_buffer[SH_MAX_REGISTER_SIZE];
>    enum register_status status;
>
>    if (reg_nr == PSEUDO_BANK_REGNUM)

temp_buffer is used for double float register, which is from two fp
registers,

  else if (reg_nr >= DR0_REGNUM && reg_nr <= DR_LAST_REGNUM)
    {
      base_regnum = dr_reg_base_num (gdbarch, reg_nr);

      /* Build the value in the provided buffer.  */
      /* Read the real regs for which this one is an alias.  */
      status = pseudo_register_read_portions (gdbarch, regcache,
					      2, base_regnum, temp_buffer);
      if (status == REG_VALID)
	{
	  /* We must pay attention to the endiannes. */
	  sh_register_convert_to_virtual (gdbarch, reg_nr,
					  register_type (gdbarch, reg_nr),
					  temp_buffer, buffer);
	}

Can you move "temp_buffer" into this block, and define it

gdb_byte temp_buffer[4 * 2] or temp_buffer[SH_FLOAT_REGISTER_SIZE * 2];
  

Patch

diff --git a/gdb/sh-tdep.h b/gdb/sh-tdep.h
index d15ef050e079aec93a8f2578bf6e94ace919061b..ca9bb25c947a7425e6160797ac05019b20fd4bff 100644
--- a/gdb/sh-tdep.h
+++ b/gdb/sh-tdep.h
@@ -82,6 +82,9 @@  enum
     FV_LAST_REGNUM = 79
   };

+/* Big enough to hold the size of the largest register in bytes.  */
+#define SH_MAX_REGISTER_SIZE	12
+
 /* This structure describes a register in a core-file.  */
 struct sh_corefile_regmap
 {
diff --git a/gdb/sh-tdep.c b/gdb/sh-tdep.c
index 9b3692dc0c32ffcb53d99f0fc095303d2c221fcb..7e56864202fe9321edb7561c721ef912b3a4f8c5 100644
--- a/gdb/sh-tdep.c
+++ b/gdb/sh-tdep.c
@@ -1648,7 +1648,7 @@  sh_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
 			 int reg_nr, gdb_byte *buffer)
 {
   int base_regnum;
-  gdb_byte temp_buffer[MAX_REGISTER_SIZE];
+  gdb_byte temp_buffer[SH_MAX_REGISTER_SIZE];
   enum register_status status;

   if (reg_nr == PSEUDO_BANK_REGNUM)
@@ -1687,7 +1687,7 @@  sh_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
 			  int reg_nr, const gdb_byte *buffer)
 {
   int base_regnum, portion;
-  gdb_byte temp_buffer[MAX_REGISTER_SIZE];
+  gdb_byte temp_buffer[SH_MAX_REGISTER_SIZE];

   if (reg_nr == PSEUDO_BANK_REGNUM)
     {
diff --git a/gdb/sh64-tdep.c b/gdb/sh64-tdep.c
index 23f5ade3b2e631eeb50cb918a4f36bb8cfbe6131..19fce4fef6aba859491304c171fe16cb41ca3d37 100644
--- a/gdb/sh64-tdep.c
+++ b/gdb/sh64-tdep.c
@@ -122,6 +122,9 @@  enum
     FP_LAST_REGNUM = SIM_SH64_FR0_REGNUM + SIM_SH64_NR_FP_REGS - 1
   };

+/* Big enough to hold the size of the largest register in bytes.  */
+#define SH64_MAX_REGISTER_SIZE	12
+
 static const char *
 sh64_register_name (struct gdbarch *gdbarch, int reg_nr)
 {
@@ -1528,7 +1531,7 @@  sh64_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   int base_regnum;
   int offset = 0;
-  gdb_byte temp_buffer[MAX_REGISTER_SIZE];
+  gdb_byte temp_buffer[SH64_MAX_REGISTER_SIZE];
   enum register_status status;

   if (reg_nr >= DR0_REGNUM
@@ -1704,7 +1707,7 @@  sh64_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   int base_regnum, portion;
   int offset;
-  gdb_byte temp_buffer[MAX_REGISTER_SIZE];
+  gdb_byte temp_buffer[SH64_MAX_REGISTER_SIZE];

   if (reg_nr >= DR0_REGNUM
       && reg_nr <= DR_LAST_REGNUM)