gdb/i387-tdep: make FXSAVE_ADDR a function

Message ID 20230905191403.225101-1-simon.marchi@efficios.com
State New
Headers
Series gdb/i387-tdep: make FXSAVE_ADDR a function |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gdb_build--master-aarch64 success Testing passed
linaro-tcwg-bot/tcwg_gdb_build--master-arm success Testing passed
linaro-tcwg-bot/tcwg_gdb_check--master-aarch64 success Testing passed
linaro-tcwg-bot/tcwg_gdb_check--master-arm success Testing passed

Commit Message

Simon Marchi Sept. 5, 2023, 7:13 p.m. UTC
  Debugging this file, I wish I could have stepped into FXSAVE_ADDR and
break on it to understand what it does and verify its behavior.  Make
this a function rather than a macro to make it easier.  Make it a
templated function, because we need a const and a non-const version.
Make the template verify that fxsave parameter is a pointer to (const or
non-const) gdb_byte (it would be wrong for fxsave to be a buffer of
something that has a sizeof greater than one).

Change-Id: Ic6aa1f71170be806a4168e14862a93ac3c7e6785
---
 gdb/i387-tdep.c | 64 +++++++++++++++++++++++++++----------------------
 1 file changed, 36 insertions(+), 28 deletions(-)


base-commit: a006bc9c37e95b4afaf85715cc54fe57b3300ccd
  

Patch

diff --git a/gdb/i387-tdep.c b/gdb/i387-tdep.c
index 47667da21c7d..7fa7d6a5ba78 100644
--- a/gdb/i387-tdep.c
+++ b/gdb/i387-tdep.c
@@ -568,8 +568,16 @@  static int fxsave_offset[] =
   160 + 15 * 16,		/* ... %xmm15 (128 bits each).  */
 };
 
-#define FXSAVE_ADDR(tdep, fxsave, regnum) \
-  (fxsave + fxsave_offset[regnum - I387_ST0_REGNUM (tdep)])
+/* Return a pointer of the value of register REGNUM inside the FXSAVE area.  */
+
+template <typename T,
+	  typename ElemType = typename std::remove_const<T>::type,
+	  typename = gdb::Requires<std::is_same<ElemType, gdb_byte>>>
+static T *
+fxsave_addr (const i386_gdbarch_tdep *tdep, T *fxsave, int regnum)
+{
+  return fxsave + fxsave_offset[regnum - I387_ST0_REGNUM (tdep)];
+}
 
 /* We made an unfortunate choice in putting %mxcsr after the SSE
    registers %xmm0-%xmm7 instead of before, since it makes supporting
@@ -612,7 +620,7 @@  i387_supply_fxsave (struct regcache *regcache, int regnum, const void *fxsave)
 	  {
 	    gdb_byte val[4];
 
-	    memcpy (val, FXSAVE_ADDR (tdep, regs, i), 2);
+	    memcpy (val, fxsave_addr (tdep, regs, i), 2);
 	    val[2] = val[3] = 0;
 	    if (i == I387_FOP_REGNUM (tdep))
 	      val[1] &= ((1 << 3) - 1);
@@ -626,7 +634,7 @@  i387_supply_fxsave (struct regcache *regcache, int regnum, const void *fxsave)
 		int fpreg;
 		int top;
 
-		top = ((FXSAVE_ADDR (tdep, regs,
+		top = ((fxsave_addr (tdep, regs,
 				     I387_FSTAT_REGNUM (tdep)))[1] >> 3);
 		top &= 0x7;
 
@@ -638,7 +646,7 @@  i387_supply_fxsave (struct regcache *regcache, int regnum, const void *fxsave)
 		      {
 			int thisreg = (fpreg + 8 - top) % 8 
 				       + I387_ST0_REGNUM (tdep);
-			tag = i387_tag (FXSAVE_ADDR (tdep, regs, thisreg));
+			tag = i387_tag (fxsave_addr (tdep, regs, thisreg));
 		      }
 		    else
 		      tag = 3;		/* Empty */
@@ -651,7 +659,7 @@  i387_supply_fxsave (struct regcache *regcache, int regnum, const void *fxsave)
 	    regcache->raw_supply (i, val);
 	  }
 	else
-	  regcache->raw_supply (i, FXSAVE_ADDR (tdep, regs, i));
+	  regcache->raw_supply (i, fxsave_addr (tdep, regs, i));
       }
 
   if (regnum == I387_MXCSR_REGNUM (tdep) || regnum == -1)
@@ -697,7 +705,7 @@  i387_collect_fxsave (const struct regcache *regcache, int regnum, void *fxsave)
 		/* The opcode occupies only 11 bits.  Make sure we
 		   don't touch the other bits.  */
 		buf[1] &= ((1 << 3) - 1);
-		buf[1] |= ((FXSAVE_ADDR (tdep, regs, i))[1] & ~((1 << 3) - 1));
+		buf[1] |= ((fxsave_addr (tdep, regs, i))[1] & ~((1 << 3) - 1));
 	      }
 	    else if (i == I387_FTAG_REGNUM (tdep))
 	      {
@@ -718,10 +726,10 @@  i387_collect_fxsave (const struct regcache *regcache, int regnum, void *fxsave)
 		      buf[0] |= (1 << fpreg);
 		  }
 	      }
-	    memcpy (FXSAVE_ADDR (tdep, regs, i), buf, 2);
+	    memcpy (fxsave_addr (tdep, regs, i), buf, 2);
 	  }
 	else
-	  regcache->raw_collect (i, FXSAVE_ADDR (tdep, regs, i));
+	  regcache->raw_collect (i, fxsave_addr (tdep, regs, i));
       }
 
   if (regnum == I387_MXCSR_REGNUM (tdep) || regnum == -1)
@@ -1173,14 +1181,14 @@  i387_supply_xsave (struct regcache *regcache, int regnum,
       if ((clear_bv & X86_XSTATE_SSE))
 	regcache->raw_supply (regnum, zero);
       else
-	regcache->raw_supply (regnum, FXSAVE_ADDR (tdep, regs, regnum));
+	regcache->raw_supply (regnum, fxsave_addr (tdep, regs, regnum));
       return;
 
     case x87:
       if ((clear_bv & X86_XSTATE_X87))
 	regcache->raw_supply (regnum, zero);
       else
-	regcache->raw_supply (regnum, FXSAVE_ADDR (tdep, regs, regnum));
+	regcache->raw_supply (regnum, fxsave_addr (tdep, regs, regnum));
       return;
 
     case all:
@@ -1338,7 +1346,7 @@  i387_supply_xsave (struct regcache *regcache, int regnum,
 	    {
 	      for (i = I387_XMM0_REGNUM (tdep);
 		   i < I387_MXCSR_REGNUM (tdep); i++)
-		regcache->raw_supply (i, FXSAVE_ADDR (tdep, regs, i));
+		regcache->raw_supply (i, fxsave_addr (tdep, regs, i));
 	    }
 	}
 
@@ -1357,7 +1365,7 @@  i387_supply_xsave (struct regcache *regcache, int regnum,
 	      for (i = I387_ST0_REGNUM (tdep);
 		   i < I387_FCTRL_REGNUM (tdep);
 		   i++)
-		regcache->raw_supply (i, FXSAVE_ADDR (tdep, regs, i));
+		regcache->raw_supply (i, fxsave_addr (tdep, regs, i));
 	    }
 	}
       break;
@@ -1394,7 +1402,7 @@  i387_supply_xsave (struct regcache *regcache, int regnum,
 	  {
 	    gdb_byte val[4];
 
-	    memcpy (val, FXSAVE_ADDR (tdep, regs, i), 2);
+	    memcpy (val, fxsave_addr (tdep, regs, i), 2);
 	    val[2] = val[3] = 0;
 	    if (i == I387_FOP_REGNUM (tdep))
 	      val[1] &= ((1 << 3) - 1);
@@ -1408,7 +1416,7 @@  i387_supply_xsave (struct regcache *regcache, int regnum,
 		int fpreg;
 		int top;
 
-		top = ((FXSAVE_ADDR (tdep, regs,
+		top = ((fxsave_addr (tdep, regs,
 				     I387_FSTAT_REGNUM (tdep)))[1] >> 3);
 		top &= 0x7;
 
@@ -1420,7 +1428,7 @@  i387_supply_xsave (struct regcache *regcache, int regnum,
 		      {
 			int thisreg = (fpreg + 8 - top) % 8 
 				       + I387_ST0_REGNUM (tdep);
-			tag = i387_tag (FXSAVE_ADDR (tdep, regs, thisreg));
+			tag = i387_tag (fxsave_addr (tdep, regs, thisreg));
 		      }
 		    else
 		      tag = 3;		/* Empty */
@@ -1433,7 +1441,7 @@  i387_supply_xsave (struct regcache *regcache, int regnum,
 	    regcache->raw_supply (i, val);
 	  }
 	else
-	  regcache->raw_supply (i, FXSAVE_ADDR (tdep, regs, i));
+	  regcache->raw_supply (i, fxsave_addr (tdep, regs, i));
       }
 
   if (regnum == I387_MXCSR_REGNUM (tdep) || regnum == -1)
@@ -1608,7 +1616,7 @@  i387_collect_xsave (const struct regcache *regcache, int regnum,
       if ((clear_bv & X86_XSTATE_SSE))
 	for (i = I387_XMM0_REGNUM (tdep);
 	     i < I387_MXCSR_REGNUM (tdep); i++)
-	  memset (FXSAVE_ADDR (tdep, regs, i), 0, 16);
+	  memset (fxsave_addr (tdep, regs, i), 0, 16);
 
       /* The mxcsr register is written into the xsave buffer if either AVX
 	 or SSE is enabled, so only clear it if both of those features
@@ -1622,16 +1630,16 @@  i387_collect_xsave (const struct regcache *regcache, int regnum,
 	{
 	  for (i = I387_ST0_REGNUM (tdep);
 	       i < I387_FCTRL_REGNUM (tdep); i++)
-	    memset (FXSAVE_ADDR (tdep, regs, i), 0, 10);
+	    memset (fxsave_addr (tdep, regs, i), 0, 10);
 
 	  for (i = I387_FCTRL_REGNUM (tdep);
 	       i < I387_XMM0_REGNUM (tdep); i++)
 	    {
 	      if (i == I387_FCTRL_REGNUM (tdep))
-		store_unsigned_integer (FXSAVE_ADDR (tdep, regs, i), 2,
+		store_unsigned_integer (fxsave_addr (tdep, regs, i), 2,
 					byte_order, I387_FCTRL_INIT_VAL);
 	      else
-		memset (FXSAVE_ADDR (tdep, regs, i), 0,
+		memset (fxsave_addr (tdep, regs, i), 0,
 			regcache_register_size (regcache, i));
 	    }
 	}
@@ -1768,7 +1776,7 @@  i387_collect_xsave (const struct regcache *regcache, int regnum,
 	     i < I387_MXCSR_REGNUM (tdep); i++)
 	  {
 	    regcache->raw_collect (i, raw);
-	    p = FXSAVE_ADDR (tdep, regs, i);
+	    p = fxsave_addr (tdep, regs, i);
 	    if (memcmp (raw, p, 16))
 	      {
 		xstate_bv |= X86_XSTATE_SSE;
@@ -1801,7 +1809,7 @@  i387_collect_xsave (const struct regcache *regcache, int regnum,
 	     i < I387_FCTRL_REGNUM (tdep); i++)
 	  {
 	    regcache->raw_collect (i, raw);
-	    p = FXSAVE_ADDR (tdep, regs, i);
+	    p = fxsave_addr (tdep, regs, i);
 	    if (memcmp (raw, p, 10))
 	      {
 		xstate_bv |= X86_XSTATE_X87;
@@ -1907,7 +1915,7 @@  i387_collect_xsave (const struct regcache *regcache, int regnum,
 
 	case sse:
 	  /* This is an SSE register.  */
-	  p = FXSAVE_ADDR (tdep, regs, regnum);
+	  p = fxsave_addr (tdep, regs, regnum);
 	  if (memcmp (raw, p, 16))
 	    {
 	      xstate_bv |= X86_XSTATE_SSE;
@@ -1917,7 +1925,7 @@  i387_collect_xsave (const struct regcache *regcache, int regnum,
 
 	case x87:
 	  /* This is an x87 register.  */
-	  p = FXSAVE_ADDR (tdep, regs, regnum);
+	  p = fxsave_addr (tdep, regs, regnum);
 	  if (memcmp (raw, p, 10))
 	    {
 	      xstate_bv |= X86_XSTATE_X87;
@@ -1966,7 +1974,7 @@  i387_collect_xsave (const struct regcache *regcache, int regnum,
 		/* The opcode occupies only 11 bits.  Make sure we
 		   don't touch the other bits.  */
 		buf[1] &= ((1 << 3) - 1);
-		buf[1] |= ((FXSAVE_ADDR (tdep, regs, i))[1] & ~((1 << 3) - 1));
+		buf[1] |= ((fxsave_addr (tdep, regs, i))[1] & ~((1 << 3) - 1));
 	      }
 	    else if (i == I387_FTAG_REGNUM (tdep))
 	      {
@@ -1987,7 +1995,7 @@  i387_collect_xsave (const struct regcache *regcache, int regnum,
 		      buf[0] |= (1 << fpreg);
 		  }
 	      }
-	    p = FXSAVE_ADDR (tdep, regs, i);
+	    p = fxsave_addr (tdep, regs, i);
 	    if (memcmp (p, buf, 2))
 	      {
 		xstate_bv |= X86_XSTATE_X87;
@@ -2000,7 +2008,7 @@  i387_collect_xsave (const struct regcache *regcache, int regnum,
 
 	    regcache->raw_collect (i, raw);
 	    regsize = regcache_register_size (regcache, i);
-	    p = FXSAVE_ADDR (tdep, regs, i);
+	    p = fxsave_addr (tdep, regs, i);
 	    if (memcmp (raw, p, regsize))
 	      {
 		xstate_bv |= X86_XSTATE_X87;