[4/11] Add PPC_MAX_REGISTER_SIZE

Message ID 1051BD9C-DE4B-4554-A0D8-4818C738B669@arm.com
State New, archived
Headers

Commit Message

Alan Hayward April 4, 2017, 10:13 a.m. UTC
  Max size set to 128bits, which I determined using regformats/rs6000/powerpc*.dat

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

I do not have a PPC machine to test on.

Ok to commit?

Alan.

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

	* ppc-linux-nat.c (fetch_register): Use PPC_MAX_REGISTER_SIZE.
	(store_register): Likewise.
	* ppc-sysv-tdep.c (ppc_sysv_abi_push_dummy_call): Likewise.
	(get_decimal_float_return_value): Likewise.
	(do_ppc_sysv_return_value): Likewise.
	(ppc64_sysv_abi_push_integer): Likewise.
	(ppc64_sysv_abi_push_freg): Likewise.
	(ppc64_sysv_abi_return_value_base): Likewise.
	(ppc64_sysv_abi_return_value): Likewise.
	* rs6000-aix-tdep.c (rs6000_push_dummy_call): Likewise.
	* grs6000-lynx178-tdep.c (rs6000_lynx178_push_dummy_call): Likewise.
	* grs6000-nat.c: Likewise.
	* grs6000-tdep.c (rs6000_register_to_value): Likewise.
	(rs6000_value_to_register): Likewise.
	* ppc-tdep.h (PPC_MAX_REGISTER_SIZE): Add.
  

Comments

Yao Qi April 25, 2017, 3:58 p.m. UTC | #1
Alan Hayward <Alan.Hayward@arm.com> writes:

> Max size set to 128bits, which I determined using regformats/rs6000/powerpc*.dat
>
> Tested on a --enable-targets=all build using make check with board files
> unix and native-gdbserver.
>
> I do not have a PPC machine to test on.

Note that some files you changed are not built, like *-nat.c.  Could you
test your patch on gcc compile farm?  There are some POWER machine you
can use.

https://gcc.gnu.org/wiki/CompileFarm

>
> Ok to commit?
>
> Alan.
>
> 2017-04-04  Alan Hayward  <alan.hayward@arm.com>
>
> 	* ppc-linux-nat.c (fetch_register): Use PPC_MAX_REGISTER_SIZE.
> 	(store_register): Likewise.
> 	* ppc-sysv-tdep.c (ppc_sysv_abi_push_dummy_call): Likewise.
> 	(get_decimal_float_return_value): Likewise.
> 	(do_ppc_sysv_return_value): Likewise.
> 	(ppc64_sysv_abi_push_integer): Likewise.
> 	(ppc64_sysv_abi_push_freg): Likewise.
> 	(ppc64_sysv_abi_return_value_base): Likewise.
> 	(ppc64_sysv_abi_return_value): Likewise.
> 	* rs6000-aix-tdep.c (rs6000_push_dummy_call): Likewise.
> 	* grs6000-lynx178-tdep.c (rs6000_lynx178_push_dummy_call): Likewise.

s/grs6000/rs6000/

> 	* grs6000-nat.c: Likewise.
> 	* grs6000-tdep.c (rs6000_register_to_value): Likewise.
> 	(rs6000_value_to_register): Likewise.
> 	* ppc-tdep.h (PPC_MAX_REGISTER_SIZE): Add.
>
>

> diff --git a/gdb/ppc-tdep.h b/gdb/ppc-tdep.h
> index 875ad93b184dfb7d8076f6108453833d88b64e47..83e12abacd333bb5bcfd4d2dff28dc342494ad9a 100644
> --- a/gdb/ppc-tdep.h
> +++ b/gdb/ppc-tdep.h
> @@ -304,6 +304,9 @@ enum {
>    PPC_NUM_REGS
>  };
>
> +/* Big enough to hold the size of the largest register in bytes.  */
> +#define PPC_MAX_REGISTER_SIZE	16
> +
>  /* An instruction to match.  */

PPC has so many variants that it is hard to claim the max register size
is 16 byte.  A conservative approach is still keep using 64.  It is not
very smart, but at least won't break anything, IMO.
  

Patch

diff --git a/gdb/ppc-linux-nat.c b/gdb/ppc-linux-nat.c
index a56d154d3126c69431eff0717d6b4bcbe15f9d96..7af07d5ff83dd923c810a4322d906f085ff1bff4 100644
--- a/gdb/ppc-linux-nat.c
+++ b/gdb/ppc-linux-nat.c
@@ -496,7 +496,7 @@  fetch_register (struct regcache *regcache, int tid, int regno)
   CORE_ADDR regaddr = ppc_register_u_addr (gdbarch, regno);
   int bytes_transferred;
   unsigned int offset;         /* Offset of registers within the u area.  */
-  gdb_byte buf[MAX_REGISTER_SIZE];
+  gdb_byte buf[PPC_MAX_REGISTER_SIZE];

   if (altivec_register_p (gdbarch, regno))
     {
@@ -983,7 +983,7 @@  store_register (const struct regcache *regcache, int tid, int regno)
   CORE_ADDR regaddr = ppc_register_u_addr (gdbarch, regno);
   int i;
   size_t bytes_to_transfer;
-  gdb_byte buf[MAX_REGISTER_SIZE];
+  gdb_byte buf[PPC_MAX_REGISTER_SIZE];

   if (altivec_register_p (gdbarch, regno))
     {
diff --git a/gdb/ppc-sysv-tdep.c b/gdb/ppc-sysv-tdep.c
index ecae6363e3ae0a388bc5294aade5590c4b432d18..9a5cd7fab7b71e26648720bad1b7dbd3dcc46676 100644
--- a/gdb/ppc-sysv-tdep.c
+++ b/gdb/ppc-sysv-tdep.c
@@ -134,7 +134,7 @@  ppc_sysv_abi_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 		    {
 		      /* Always store the floating point value using
 		         the register's floating-point format.  */
-		      gdb_byte regval[MAX_REGISTER_SIZE];
+		      gdb_byte regval[PPC_MAX_REGISTER_SIZE];
 		      struct type *regtype
 			= register_type (gdbarch, tdep->ppc_fp0_regnum + freg);
 		      convert_typed_floating (val, type, regval, regtype);
@@ -278,7 +278,7 @@  ppc_sysv_abi_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 		{
 		  if (write_pass)
 		    {
-		      gdb_byte regval[MAX_REGISTER_SIZE];
+		      gdb_byte regval[PPC_MAX_REGISTER_SIZE];
 		      const gdb_byte *p;

 		      /* 32-bit decimal floats are right aligned in the
@@ -364,7 +364,7 @@  ppc_sysv_abi_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 			  if (write_pass)
 			    {
 			      int regnum = tdep->ppc_fp0_regnum + freg;
-			      gdb_byte regval[MAX_REGISTER_SIZE];
+			      gdb_byte regval[PPC_MAX_REGISTER_SIZE];
 			      struct type *regtype
 				= register_type (gdbarch, regnum);
 			      convert_typed_floating (elval, eltype,
@@ -411,7 +411,7 @@  ppc_sysv_abi_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 		    }
 		  else
 		    {
-		      gdb_byte word[MAX_REGISTER_SIZE];
+		      gdb_byte word[PPC_MAX_REGISTER_SIZE];
 		      store_unsigned_integer (word, tdep->wordsize, byte_order,
 					      unpack_long (eltype, elval));

@@ -516,8 +516,8 @@  ppc_sysv_abi_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 	    {
 	      /* Reduce the parameter down to something that fits in a
 	         "word".  */
-	      gdb_byte word[MAX_REGISTER_SIZE];
-	      memset (word, 0, MAX_REGISTER_SIZE);
+	      gdb_byte word[PPC_MAX_REGISTER_SIZE];
+	      memset (word, 0, PPC_MAX_REGISTER_SIZE);
 	      if (len > tdep->wordsize
 		  || TYPE_CODE (type) == TYPE_CODE_STRUCT
 		  || TYPE_CODE (type) == TYPE_CODE_UNION)
@@ -623,7 +623,7 @@  get_decimal_float_return_value (struct gdbarch *gdbarch, struct type *valtype,
     {
       if (writebuf != NULL)
 	{
-	  gdb_byte regval[MAX_REGISTER_SIZE];
+	  gdb_byte regval[PPC_MAX_REGISTER_SIZE];
 	  const gdb_byte *p;

 	  /* 32-bit decimal float is right aligned in the doubleword.  */
@@ -706,7 +706,7 @@  do_ppc_sysv_return_value (struct gdbarch *gdbarch, struct type *func_type,
 	{
 	  /* Floats and doubles stored in "f1".  Convert the value to
 	     the required type.  */
-	  gdb_byte regval[MAX_REGISTER_SIZE];
+	  gdb_byte regval[PPC_MAX_REGISTER_SIZE];
 	  struct type *regtype = register_type (gdbarch,
                                                 tdep->ppc_fp0_regnum + 1);
 	  regcache_cooked_read (regcache, tdep->ppc_fp0_regnum + 1, regval);
@@ -716,7 +716,7 @@  do_ppc_sysv_return_value (struct gdbarch *gdbarch, struct type *func_type,
 	{
 	  /* Floats and doubles stored in "f1".  Convert the value to
 	     the register's "double" type.  */
-	  gdb_byte regval[MAX_REGISTER_SIZE];
+	  gdb_byte regval[PPC_MAX_REGISTER_SIZE];
 	  struct type *regtype = register_type (gdbarch, tdep->ppc_fp0_regnum);
 	  convert_typed_floating (writebuf, type, regval, regtype);
 	  regcache_cooked_write (regcache, tdep->ppc_fp0_regnum + 1, regval);
@@ -847,7 +847,7 @@  do_ppc_sysv_return_value (struct gdbarch *gdbarch, struct type *func_type,
 	  if (TYPE_CODE (eltype) == TYPE_CODE_FLT)
 	    {
 	      int regnum = tdep->ppc_fp0_regnum + 1 + i;
-	      gdb_byte regval[MAX_REGISTER_SIZE];
+	      gdb_byte regval[PPC_MAX_REGISTER_SIZE];
 	      struct type *regtype = register_type (gdbarch, regnum);

 	      if (writebuf != NULL)
@@ -977,7 +977,7 @@  do_ppc_sysv_return_value (struct gdbarch *gdbarch, struct type *func_type,
       /* GCC screwed up for structures or unions whose size is less
 	 than or equal to 8 bytes..  Instead of left-aligning, it
 	 right-aligns the data into the buffer formed by r3, r4.  */
-      gdb_byte regvals[MAX_REGISTER_SIZE * 2];
+      gdb_byte regvals[PPC_MAX_REGISTER_SIZE * 2];
       int len = TYPE_LENGTH (type);
       int offset = (2 * tdep->wordsize - len) % tdep->wordsize;

@@ -1010,7 +1010,7 @@  do_ppc_sysv_return_value (struct gdbarch *gdbarch, struct type *func_type,
 	  /* This matches SVr4 PPC, it does not match GCC.  */
 	  /* The value is right-padded to 8 bytes and then loaded, as
 	     two "words", into r3/r4.  */
-	  gdb_byte regvals[MAX_REGISTER_SIZE * 2];
+	  gdb_byte regvals[PPC_MAX_REGISTER_SIZE * 2];
 	  regcache_cooked_read (regcache, tdep->ppc_gp0_regnum + 3,
 				regvals + 0 * tdep->wordsize);
 	  if (TYPE_LENGTH (type) > tdep->wordsize)
@@ -1023,7 +1023,7 @@  do_ppc_sysv_return_value (struct gdbarch *gdbarch, struct type *func_type,
 	  /* This matches SVr4 PPC, it does not match GCC.  */
 	  /* The value is padded out to 8 bytes and then loaded, as
 	     two "words" into r3/r4.  */
-	  gdb_byte regvals[MAX_REGISTER_SIZE * 2];
+	  gdb_byte regvals[PPC_MAX_REGISTER_SIZE * 2];
 	  memset (regvals, 0, sizeof regvals);
 	  memcpy (regvals, writebuf, TYPE_LENGTH (type));
 	  regcache_cooked_write (regcache, tdep->ppc_gp0_regnum + 3,
@@ -1340,7 +1340,7 @@  ppc64_sysv_abi_push_integer (struct gdbarch *gdbarch, ULONGEST val,
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
-  gdb_byte buf[MAX_REGISTER_SIZE];
+  gdb_byte buf[PPC_MAX_REGISTER_SIZE];

   if (argpos->regcache)
     store_unsigned_integer (buf, tdep->wordsize, byte_order, val);
@@ -1369,7 +1369,7 @@  ppc64_sysv_abi_push_freg (struct gdbarch *gdbarch,
 	{
 	  int regnum = tdep->ppc_fp0_regnum + argpos->freg;
 	  struct type *regtype = register_type (gdbarch, regnum);
-	  gdb_byte regval[MAX_REGISTER_SIZE];
+	  gdb_byte regval[PPC_MAX_REGISTER_SIZE];

 	  convert_typed_floating (val, type, regval, regtype);
 	  regcache_cooked_write (argpos->regcache, regnum, regval);
@@ -1814,7 +1814,7 @@  ppc64_sysv_abi_return_value_base (struct gdbarch *gdbarch, struct type *valtype,
     {
       int regnum = tdep->ppc_fp0_regnum + 1 + index;
       struct type *regtype = register_type (gdbarch, regnum);
-      gdb_byte regval[MAX_REGISTER_SIZE];
+      gdb_byte regval[PPC_MAX_REGISTER_SIZE];

       if (writebuf != NULL)
 	{
@@ -2072,7 +2072,7 @@  ppc64_sysv_abi_return_value (struct gdbarch *gdbarch, struct value *function,

       for (i = 0; i < n_regs; i++)
 	{
-	  gdb_byte regval[MAX_REGISTER_SIZE];
+	  gdb_byte regval[PPC_MAX_REGISTER_SIZE];
 	  int regnum = tdep->ppc_gp0_regnum + 3 + i;
 	  int offset = i * tdep->wordsize;
 	  int len = TYPE_LENGTH (valtype) - offset;
diff --git a/gdb/ppc-tdep.h b/gdb/ppc-tdep.h
index 875ad93b184dfb7d8076f6108453833d88b64e47..83e12abacd333bb5bcfd4d2dff28dc342494ad9a 100644
--- a/gdb/ppc-tdep.h
+++ b/gdb/ppc-tdep.h
@@ -304,6 +304,9 @@  enum {
   PPC_NUM_REGS
 };

+/* Big enough to hold the size of the largest register in bytes.  */
+#define PPC_MAX_REGISTER_SIZE	16
+
 /* An instruction to match.  */

 struct ppc_insn_pattern
diff --git a/gdb/rs6000-aix-tdep.c b/gdb/rs6000-aix-tdep.c
index 9841a60eafb0381cd2343dd3a8d5745571f5460e..7e69e992a39bda386b84823afda8ee8a7674a9f7 100644
--- a/gdb/rs6000-aix-tdep.c
+++ b/gdb/rs6000-aix-tdep.c
@@ -253,7 +253,7 @@  rs6000_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 	     Always store the floating point value using the register's
 	     floating-point format.  */
 	  const int fp_regnum = tdep->ppc_fp0_regnum + 1 + f_argno;
-	  gdb_byte reg_val[MAX_REGISTER_SIZE];
+	  gdb_byte reg_val[PPC_MAX_REGISTER_SIZE];
 	  struct type *reg_type = register_type (gdbarch, fp_regnum);

 	  gdb_assert (len <= 8);
@@ -270,7 +270,7 @@  rs6000_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 	  /* Argument takes more than one register.  */
 	  while (argbytes < len)
 	    {
-	      gdb_byte word[MAX_REGISTER_SIZE];
+	      gdb_byte word[PPC_MAX_REGISTER_SIZE];
 	      memset (word, 0, reg_size);
 	      memcpy (word,
 		      ((char *) value_contents (arg)) + argbytes,
@@ -290,7 +290,7 @@  rs6000_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
       else
 	{
 	  /* Argument can fit in one register.  No problem.  */
-	  gdb_byte word[MAX_REGISTER_SIZE];
+	  gdb_byte word[PPC_MAX_REGISTER_SIZE];

 	  memset (word, 0, reg_size);
 	  memcpy (word, value_contents (arg), len);
diff --git a/gdb/rs6000-lynx178-tdep.c b/gdb/rs6000-lynx178-tdep.c
index f2aa1f8448cf487b1522df89ef42a3937799d95f..d72a61958e3ffc19e6f39ef5d30427ace2877edc 100644
--- a/gdb/rs6000-lynx178-tdep.c
+++ b/gdb/rs6000-lynx178-tdep.c
@@ -105,7 +105,7 @@  rs6000_lynx178_push_dummy_call (struct gdbarch *gdbarch,
 	     Always store the floating point value using the register's
 	     floating-point format.  */
 	  const int fp_regnum = tdep->ppc_fp0_regnum + 1 + f_argno;
-	  gdb_byte reg_val[MAX_REGISTER_SIZE];
+	  gdb_byte reg_val[PPC_MAX_REGISTER_SIZE];
 	  struct type *reg_type = register_type (gdbarch, fp_regnum);

 	  gdb_assert (len <= 8);
@@ -122,7 +122,7 @@  rs6000_lynx178_push_dummy_call (struct gdbarch *gdbarch,
 	  /* Argument takes more than one register.  */
 	  while (argbytes < len)
 	    {
-	      gdb_byte word[MAX_REGISTER_SIZE];
+	      gdb_byte word[PPC_MAX_REGISTER_SIZE];
 	      memset (word, 0, reg_size);
 	      memcpy (word,
 		      ((char *) value_contents (arg)) + argbytes,
@@ -142,7 +142,7 @@  rs6000_lynx178_push_dummy_call (struct gdbarch *gdbarch,
       else
 	{
 	  /* Argument can fit in one register.  No problem.  */
-	  gdb_byte word[MAX_REGISTER_SIZE];
+	  gdb_byte word[PPC_MAX_REGISTER_SIZE];

 	  memset (word, 0, reg_size);
 	  memcpy (word, value_contents (arg), len);
diff --git a/gdb/rs6000-nat.c b/gdb/rs6000-nat.c
index f42847bfeab8ad6d03c96a161238283a262f98d1..dda5f6f4c65a9d75fb4de59a3c6acd95e8208f97 100644
--- a/gdb/rs6000-nat.c
+++ b/gdb/rs6000-nat.c
@@ -162,7 +162,7 @@  static void
 fetch_register (struct regcache *regcache, int regno)
 {
   struct gdbarch *gdbarch = get_regcache_arch (regcache);
-  int addr[MAX_REGISTER_SIZE];
+  int addr[PPC_MAX_REGISTER_SIZE];
   int nr, isfloat;

   /* Retrieved values may be -1, so infer errors from errno.  */
@@ -222,7 +222,7 @@  static void
 store_register (struct regcache *regcache, int regno)
 {
   struct gdbarch *gdbarch = get_regcache_arch (regcache);
-  int addr[MAX_REGISTER_SIZE];
+  int addr[PPC_MAX_REGISTER_SIZE];
   int nr, isfloat;

   /* Fetch the register's value from the register cache.  */
diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c
index 527f643b7be833b4bf7a2386940f9764f8b81514..a7a013c66b445a0abd29400d4f481ae82264cc63 100644
--- a/gdb/rs6000-tdep.c
+++ b/gdb/rs6000-tdep.c
@@ -2590,7 +2590,7 @@  rs6000_register_to_value (struct frame_info *frame,
 			  int *optimizedp, int *unavailablep)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
-  gdb_byte from[MAX_REGISTER_SIZE];
+  gdb_byte from[PPC_MAX_REGISTER_SIZE];

   gdb_assert (TYPE_CODE (type) == TYPE_CODE_FLT);

@@ -2612,7 +2612,7 @@  rs6000_value_to_register (struct frame_info *frame,
                           const gdb_byte *from)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
-  gdb_byte to[MAX_REGISTER_SIZE];
+  gdb_byte to[PPC_MAX_REGISTER_SIZE];

   gdb_assert (TYPE_CODE (type) == TYPE_CODE_FLT);