public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [PATCH 2/11] Add IA64_MAX_REGISTER_SIZE
@ 2017-04-04 10:12 Alan Hayward
  2017-04-05 10:00 ` Yao Qi
  0 siblings, 1 reply; 12+ messages in thread
From: Alan Hayward @ 2017-04-04 10:12 UTC (permalink / raw)
  To: gdb-patches; +Cc: nd

Max size set to 128bits, which I determined using regformats/reg-ia64.dat

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

I do not have an IA64 machine to test on.

Ok to commit?

Alan.


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

	* ia64-tdep.c (ia64_register_to_value): Use IA64_MAX_REGISTER_SIZE
	(ia64_value_to_register): Likewise.
	(examine_prologue): Likewise.
	(ia64_sigtramp_frame_prev_register): Likewise.
	(ia64_access_reg): Likewise.
	(ia64_access_rse_reg): Likewise.
	(ia64_libunwind_frame_prev_register): Likewise.
	(ia64_extract_return_value): Likewise.
	(ia64_store_return_value): Likewise.
	(ia64_push_dummy_call): Likewise.
	* ia64-tdep.h: Add IA64_MAX_REGISTER_SIZE


diff --git a/gdb/ia64-tdep.h b/gdb/ia64-tdep.h
index a9a55ab00f1030f1a081a8afa8fc6061f9fb1d12..18c03c5b3cb72cd20e1bb091f82763b3c351873b 100644
--- a/gdb/ia64-tdep.h
+++ b/gdb/ia64-tdep.h
@@ -199,6 +199,9 @@
 #define IA64_NAT32_REGNUM	(IA64_NAT0_REGNUM + 32)
 #define IA64_NAT127_REGNUM	(IA64_NAT0_REGNUM + 127)

+/* Big enough to hold the size of the largest register in bytes.  */
+#define IA64_MAX_REGISTER_SIZE	16
+
 struct frame_info;
 struct regcache;

diff --git a/gdb/ia64-tdep.c b/gdb/ia64-tdep.c
index 4c53bc6b05a011e4995c94b669b4f11108a12a38..031c4548968304bc749e6ca957d561a4af2256d5 100644
--- a/gdb/ia64-tdep.c
+++ b/gdb/ia64-tdep.c
@@ -1227,7 +1227,7 @@ ia64_register_to_value (struct frame_info *frame, int regnum,
 			int *optimizedp, int *unavailablep)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
-  gdb_byte in[MAX_REGISTER_SIZE];
+  gdb_byte in[IA64_MAX_REGISTER_SIZE];

   /* Convert to TYPE.  */
   if (!get_frame_register_bytes (frame, regnum, 0,
@@ -1245,7 +1245,7 @@ ia64_value_to_register (struct frame_info *frame, int regnum,
                          struct type *valtype, const gdb_byte *in)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
-  gdb_byte out[MAX_REGISTER_SIZE];
+  gdb_byte out[IA64_MAX_REGISTER_SIZE];
   convert_typed_floating (in, valtype, out, ia64_ext_type (gdbarch));
   put_frame_register (frame, regnum, out);
 }
@@ -1516,7 +1516,7 @@ examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc,
 	  else if (qp == 0 && rN == 2
 	        && ((rM == fp_reg && fp_reg != 0) || rM == 12))
 	    {
-	      gdb_byte buf[MAX_REGISTER_SIZE];
+	      gdb_byte buf[IA64_MAX_REGISTER_SIZE];
 	      CORE_ADDR saved_sp = 0;
 	      /* adds r2, spilloffset, rFramePointer
 	           or
@@ -2289,7 +2289,7 @@ static struct value *
 ia64_sigtramp_frame_prev_register (struct frame_info *this_frame,
 				   void **this_cache, int regnum)
 {
-  gdb_byte buf[MAX_REGISTER_SIZE];
+  gdb_byte buf[IA64_MAX_REGISTER_SIZE];

   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
@@ -2495,7 +2495,7 @@ ia64_access_reg (unw_addr_space_t as, unw_regnum_t uw_regnum, unw_word_t *val,
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   long new_sof, old_sof;
-  gdb_byte buf[MAX_REGISTER_SIZE];
+  gdb_byte buf[IA64_MAX_REGISTER_SIZE];

   /* We never call any libunwind routines that need to write registers.  */
   gdb_assert (!write);
@@ -2575,7 +2575,7 @@ ia64_access_rse_reg (unw_addr_space_t as, unw_regnum_t uw_regnum,
   struct gdbarch *gdbarch = get_regcache_arch (regcache);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   long new_sof, old_sof;
-  gdb_byte buf[MAX_REGISTER_SIZE];
+  gdb_byte buf[IA64_MAX_REGISTER_SIZE];

   /* We never call any libunwind routines that need to write registers.  */
   gdb_assert (!write);
@@ -2982,7 +2982,7 @@ ia64_libunwind_frame_prev_register (struct frame_info *this_frame,
 	{
 	  int rrb_pr = 0;
 	  ULONGEST cfm;
-	  gdb_byte buf[MAX_REGISTER_SIZE];
+	  gdb_byte buf[IA64_MAX_REGISTER_SIZE];

 	  /* Fetch predicate register rename base from current frame
 	     marker for this frame.  */
@@ -3229,7 +3229,7 @@ ia64_extract_return_value (struct type *type, struct regcache *regcache,
   float_elt_type = is_float_or_hfa_type (type);
   if (float_elt_type != NULL)
     {
-      gdb_byte from[MAX_REGISTER_SIZE];
+      gdb_byte from[IA64_MAX_REGISTER_SIZE];
       int offset = 0;
       int regnum = IA64_FR8_REGNUM;
       int n = TYPE_LENGTH (type) / TYPE_LENGTH (float_elt_type);
@@ -3294,7 +3294,7 @@ ia64_store_return_value (struct type *type, struct regcache *regcache,
   float_elt_type = is_float_or_hfa_type (type);
   if (float_elt_type != NULL)
     {
-      gdb_byte to[MAX_REGISTER_SIZE];
+      gdb_byte to[IA64_MAX_REGISTER_SIZE];
       int offset = 0;
       int regnum = IA64_FR8_REGNUM;
       int n = TYPE_LENGTH (type) / TYPE_LENGTH (float_elt_type);
@@ -3856,7 +3856,7 @@ ia64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 	  len = TYPE_LENGTH (type);
 	  while (len > 0 && floatreg < IA64_FR16_REGNUM)
 	    {
-	      gdb_byte to[MAX_REGISTER_SIZE];
+	      gdb_byte to[IA64_MAX_REGISTER_SIZE];
 	      convert_typed_floating (value_contents (arg) + argoffset,
 				      float_elt_type, to,
 				      ia64_ext_type (gdbarch));

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 2/11] Add IA64_MAX_REGISTER_SIZE
  2017-04-04 10:12 [PATCH 2/11] Add IA64_MAX_REGISTER_SIZE Alan Hayward
@ 2017-04-05 10:00 ` Yao Qi
  2017-04-11 12:47   ` Alan Hayward
  0 siblings, 1 reply; 12+ messages in thread
From: Yao Qi @ 2017-04-05 10:00 UTC (permalink / raw)
  To: Alan Hayward; +Cc: gdb-patches, nd

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

Hi Alan,
We have to define such macro if we have no other ways to remove
MAX_REGISTER_SIZE.  AFAIK, there are some ways to remove many usages of
MAX_REGISTER_SIZE.

> @@ -1516,7 +1516,7 @@ examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc,
>  	  else if (qp == 0 && rN == 2
>  	        && ((rM == fp_reg && fp_reg != 0) || rM == 12))
>  	    {
> -	      gdb_byte buf[MAX_REGISTER_SIZE];
> +	      gdb_byte buf[IA64_MAX_REGISTER_SIZE];
>  	      CORE_ADDR saved_sp = 0;
>  	      /* adds r2, spilloffset, rFramePointer
>  	           or

"buf" is used in the code below,

		  get_frame_register (this_frame, sp_regnum, buf);
		  saved_sp = extract_unsigned_integer (buf, 8, byte_order);

why don't we use get_frame_register_unsigned, so the "buf" can be
removed completely.

  saved_sp = get_frame_register_unsigned (this_frame, sp_regnum);

> @@ -2289,7 +2289,7 @@ static struct value *
>  ia64_sigtramp_frame_prev_register (struct frame_info *this_frame,
>  				   void **this_cache, int regnum)
>  {
> -  gdb_byte buf[MAX_REGISTER_SIZE];
> +  gdb_byte buf[IA64_MAX_REGISTER_SIZE];
>

"buf" is used in the code below,

	  read_memory (addr, buf, register_size (gdbarch, IA64_IP_REGNUM));
	  pc = extract_unsigned_integer (buf, 8, byte_order);

so it is for IP register.  Its size is 8-byte, so we can move "buf"
here,

          gdb_byte buf[8];

	  read_memory (addr, buf, register_size (gdbarch, IA64_IP_REGNUM));
	  pc = extract_unsigned_integer (buf, sizeof (buf), byte_order);


>    struct gdbarch *gdbarch = get_frame_arch (this_frame);
>    enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
> @@ -2495,7 +2495,7 @@ ia64_access_reg (unw_addr_space_t as, unw_regnum_t uw_regnum, unw_word_t *val,
>    struct gdbarch *gdbarch = get_frame_arch (this_frame);
>    enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>    long new_sof, old_sof;
> -  gdb_byte buf[MAX_REGISTER_SIZE];
> +  gdb_byte buf[IA64_MAX_REGISTER_SIZE];
>

Use get_frame_register_{,un}signed, so we can remove "buf" completely.

>    /* We never call any libunwind routines that need to write registers.  */
>    gdb_assert (!write);
> @@ -2575,7 +2575,7 @@ ia64_access_rse_reg (unw_addr_space_t as, unw_regnum_t uw_regnum,
>    struct gdbarch *gdbarch = get_regcache_arch (regcache);
>    enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>    long new_sof, old_sof;
> -  gdb_byte buf[MAX_REGISTER_SIZE];
> +  gdb_byte buf[IA64_MAX_REGISTER_SIZE];
>

"buf" is used

	regcache_cooked_read (regcache, IA64_IP_REGNUM, buf);
	ip = extract_unsigned_integer (buf, 8, byte_order);

so we can use regcache_cooked_read_unsigned,

	regcache_cooked_read_unsigned (regcache, IA64_IP_REGNUM, &ip);

>    /* We never call any libunwind routines that need to write registers.  */
>    gdb_assert (!write);
> @@ -2982,7 +2982,7 @@ ia64_libunwind_frame_prev_register (struct frame_info *this_frame,
>  	{
>  	  int rrb_pr = 0;
>  	  ULONGEST cfm;
> -	  gdb_byte buf[MAX_REGISTER_SIZE];
> +	  gdb_byte buf[IA64_MAX_REGISTER_SIZE];
>

Use get_frame_register_unsigned.

>  	  /* Fetch predicate register rename base from current frame
>  	     marker for this frame.  */

The only leftover of MAX_REGISTER_SIZE is about floating type
conversion, in ia64_register_to_value, ia64_push_dummy_call, etc.  Then,
we can define an macro for the size of floating types, and replace
MAX_REGISTER_SIZE with it.

-- 
Yao (齐尧)

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 2/11] Add IA64_MAX_REGISTER_SIZE
  2017-04-05 10:00 ` Yao Qi
@ 2017-04-11 12:47   ` Alan Hayward
  2017-04-11 17:17     ` Yao Qi
  0 siblings, 1 reply; 12+ messages in thread
From: Alan Hayward @ 2017-04-11 12:47 UTC (permalink / raw)
  To: Yao Qi; +Cc: gdb-patches, nd


> On 5 Apr 2017, at 11:00, Yao Qi <qiyaoltc@gmail.com> wrote:
> 
> Alan Hayward <Alan.Hayward@arm.com> writes:
> 
> Hi Alan,
> We have to define such macro if we have no other ways to remove
> MAX_REGISTER_SIZE.  AFAIK, there are some ways to remove many usages of
> MAX_REGISTER_SIZE.
> 
>> @@ -1516,7 +1516,7 @@ examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc,
>> 	  else if (qp == 0 && rN == 2
>> 	        && ((rM == fp_reg && fp_reg != 0) || rM == 12))
>> 	    {
>> -	      gdb_byte buf[MAX_REGISTER_SIZE];
>> +	      gdb_byte buf[IA64_MAX_REGISTER_SIZE];
>> 	      CORE_ADDR saved_sp = 0;
>> 	      /* adds r2, spilloffset, rFramePointer
>> 	           or
> 
> "buf" is used in the code below,
> 
> 		  get_frame_register (this_frame, sp_regnum, buf);
> 		  saved_sp = extract_unsigned_integer (buf, 8, byte_order);
> 
> why don't we use get_frame_register_unsigned, so the "buf" can be
> removed completely.
> 
>  saved_sp = get_frame_register_unsigned (this_frame, sp_regnum);
> 
>> @@ -2289,7 +2289,7 @@ static struct value *
>> ia64_sigtramp_frame_prev_register (struct frame_info *this_frame,
>> 				   void **this_cache, int regnum)
>> {
>> -  gdb_byte buf[MAX_REGISTER_SIZE];
>> +  gdb_byte buf[IA64_MAX_REGISTER_SIZE];
>> 
> 
> "buf" is used in the code below,
> 
> 	  read_memory (addr, buf, register_size (gdbarch, IA64_IP_REGNUM));
> 	  pc = extract_unsigned_integer (buf, 8, byte_order);
> 
> so it is for IP register.  Its size is 8-byte, so we can move "buf"
> here,
> 
>          gdb_byte buf[8];
> 
> 	  read_memory (addr, buf, register_size (gdbarch, IA64_IP_REGNUM));
> 	  pc = extract_unsigned_integer (buf, sizeof (buf), byte_order);
> 
> 
>>   struct gdbarch *gdbarch = get_frame_arch (this_frame);
>>   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>> @@ -2495,7 +2495,7 @@ ia64_access_reg (unw_addr_space_t as, unw_regnum_t uw_regnum, unw_word_t *val,
>>   struct gdbarch *gdbarch = get_frame_arch (this_frame);
>>   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>>   long new_sof, old_sof;
>> -  gdb_byte buf[MAX_REGISTER_SIZE];
>> +  gdb_byte buf[IA64_MAX_REGISTER_SIZE];
>> 
> 
> Use get_frame_register_{,un}signed, so we can remove "buf" completely.
> 
>>   /* We never call any libunwind routines that need to write registers.  */
>>   gdb_assert (!write);
>> @@ -2575,7 +2575,7 @@ ia64_access_rse_reg (unw_addr_space_t as, unw_regnum_t uw_regnum,
>>   struct gdbarch *gdbarch = get_regcache_arch (regcache);
>>   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>>   long new_sof, old_sof;
>> -  gdb_byte buf[MAX_REGISTER_SIZE];
>> +  gdb_byte buf[IA64_MAX_REGISTER_SIZE];
>> 
> 
> "buf" is used
> 
> 	regcache_cooked_read (regcache, IA64_IP_REGNUM, buf);
> 	ip = extract_unsigned_integer (buf, 8, byte_order);
> 
> so we can use regcache_cooked_read_unsigned,
> 
> 	regcache_cooked_read_unsigned (regcache, IA64_IP_REGNUM, &ip);
> 
>>   /* We never call any libunwind routines that need to write registers.  */
>>   gdb_assert (!write);
>> @@ -2982,7 +2982,7 @@ ia64_libunwind_frame_prev_register (struct frame_info *this_frame,
>> 	{
>> 	  int rrb_pr = 0;
>> 	  ULONGEST cfm;
>> -	  gdb_byte buf[MAX_REGISTER_SIZE];
>> +	  gdb_byte buf[IA64_MAX_REGISTER_SIZE];
>> 
> 
> Use get_frame_register_unsigned.
> 
>> 	  /* Fetch predicate register rename base from current frame
>> 	     marker for this frame.  */
> 
> The only leftover of MAX_REGISTER_SIZE is about floating type
> conversion, in ia64_register_to_value, ia64_push_dummy_call, etc.  Then,
> we can define an macro for the size of floating types, and replace
> MAX_REGISTER_SIZE with it.
> 
> -- 
> Yao (齐尧)

Patch updated to match all the changes suggested above.

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

I do not have an IA64 machine to test on.
If there is any doubt of the validity of the changes then I'd suggest
applying the previous version of the patch (which just replaced a define).

Ok to commit?

Alan.

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

	* ia64-tdep.c (IA64_MAX_FP_REGISTER_SIZE) Add.
	(ia64_register_to_value): Use IA64_MAX_FP_REGISTER_SIZE.
	(ia64_value_to_register): Likewise.
	(examine_prologue): Use get_frame_register_unsigned.
	(ia64_sigtramp_frame_prev_register): Likewise.
	(ia64_access_reg): Likewise.
	(ia64_access_rse_reg): Likewise.
	(ia64_libunwind_frame_prev_register): Likewise.
	(ia64_extract_return_value): Use IA64_MAX_FP_REGISTER_SIZE.
	(ia64_store_return_value): Likewise.
	(ia64_push_dummy_call): Likewise.


diff --git a/gdb/ia64-tdep.c b/gdb/ia64-tdep.c
index 22e158866bbbf0d9457737ac973027521e2c1655..a0d33fea63dc0738bed2f73ba893d61bac770242 100644
--- a/gdb/ia64-tdep.c
+++ b/gdb/ia64-tdep.c
@@ -125,6 +125,9 @@ static CORE_ADDR ia64_find_global_pointer (struct gdbarch *gdbarch,

 #define NUM_IA64_RAW_REGS 462

+/* Big enough to hold the size of the largest FP register in bytes.  */
+#define IA64_MAX_FP_REGISTER_SIZE 16
+
 static int sp_regnum = IA64_GR12_REGNUM;

 /* NOTE: we treat the register stack registers r32-r127 as
@@ -1227,7 +1230,7 @@ ia64_register_to_value (struct frame_info *frame, int regnum,
 			int *optimizedp, int *unavailablep)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
-  gdb_byte in[MAX_REGISTER_SIZE];
+  gdb_byte in[IA64_MAX_FP_REGISTER_SIZE];

   /* Convert to TYPE.  */
   if (!get_frame_register_bytes (frame, regnum, 0,
@@ -1245,7 +1248,7 @@ ia64_value_to_register (struct frame_info *frame, int regnum,
                          struct type *valtype, const gdb_byte *in)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
-  gdb_byte out[MAX_REGISTER_SIZE];
+  gdb_byte out[IA64_MAX_FP_REGISTER_SIZE];
   convert_typed_floating (in, valtype, out, ia64_ext_type (gdbarch));
   put_frame_register (frame, regnum, out);
 }
@@ -1516,8 +1519,7 @@ examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc,
 	  else if (qp == 0 && rN == 2
 	        && ((rM == fp_reg && fp_reg != 0) || rM == 12))
 	    {
-	      gdb_byte buf[MAX_REGISTER_SIZE];
-	      CORE_ADDR saved_sp = 0;
+	      ULONGEST saved_sp = 0;
 	      /* adds r2, spilloffset, rFramePointer
 	           or
 		 adds r2, spilloffset, r12
@@ -1533,9 +1535,8 @@ examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc,
 	      if (this_frame)
 		{
 		  struct gdbarch *gdbarch = get_frame_arch (this_frame);
-		  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
-		  get_frame_register (this_frame, sp_regnum, buf);
-		  saved_sp = extract_unsigned_integer (buf, 8, byte_order);
+		  saved_sp = get_frame_register_unsigned (this_frame,
+							  sp_regnum);
 		}
 	      spill_addr  = saved_sp
 	                  + (rM == 12 ? 0 : mem_stack_frame_size)
@@ -2289,10 +2290,6 @@ static struct value *
 ia64_sigtramp_frame_prev_register (struct frame_info *this_frame,
 				   void **this_cache, int regnum)
 {
-  gdb_byte buf[MAX_REGISTER_SIZE];
-
-  struct gdbarch *gdbarch = get_frame_arch (this_frame);
-  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   struct ia64_frame_cache *cache =
     ia64_sigtramp_frame_cache (this_frame, this_cache);

@@ -2308,8 +2305,11 @@ ia64_sigtramp_frame_prev_register (struct frame_info *this_frame,

       if (addr != 0)
 	{
-	  read_memory (addr, buf, register_size (gdbarch, IA64_IP_REGNUM));
-	  pc = extract_unsigned_integer (buf, 8, byte_order);
+	  gdb_byte buf[8];
+	  struct gdbarch *gdbarch = get_frame_arch (this_frame);
+	  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
+	  read_memory (addr, buf, sizeof (buf));
+	  pc = extract_unsigned_integer (buf, sizeof (buf), byte_order);
 	}
       pc &= ~0xf;
       return frame_unwind_got_constant (this_frame, regnum, pc);
@@ -2490,12 +2490,11 @@ ia64_access_reg (unw_addr_space_t as, unw_regnum_t uw_regnum, unw_word_t *val,
 		 int write, void *arg)
 {
   int regnum = ia64_uw2gdb_regnum (uw_regnum);
-  unw_word_t bsp, sof, sol, cfm, psr, ip;
+  ULONGEST bsp, sof, cfm, psr, ip;
   struct frame_info *this_frame = (struct frame_info *) arg;
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   long new_sof, old_sof;
-  gdb_byte buf[MAX_REGISTER_SIZE];

   /* We never call any libunwind routines that need to write registers.  */
   gdb_assert (!write);
@@ -2505,10 +2504,8 @@ ia64_access_reg (unw_addr_space_t as, unw_regnum_t uw_regnum, unw_word_t *val,
       case UNW_REG_IP:
 	/* Libunwind expects to see the pc value which means the slot number
 	   from the psr must be merged with the ip word address.  */
-	get_frame_register (this_frame, IA64_IP_REGNUM, buf);
-	ip = extract_unsigned_integer (buf, 8, byte_order);
-	get_frame_register (this_frame, IA64_PSR_REGNUM, buf);
-	psr = extract_unsigned_integer (buf, 8, byte_order);
+	ip = get_frame_register_unsigned (this_frame, IA64_IP_REGNUM);
+	psr = get_frame_register_unsigned (this_frame, IA64_PSR_REGNUM);
 	*val = ip | ((psr >> 41) & 0x3);
 	break;

@@ -2517,10 +2514,8 @@ ia64_access_reg (unw_addr_space_t as, unw_regnum_t uw_regnum, unw_word_t *val,
 	   register frame so we must account for the fact that
 	   ptrace() will return a value for bsp that points *after*
 	   the current register frame.  */
-	get_frame_register (this_frame, IA64_BSP_REGNUM, buf);
-	bsp = extract_unsigned_integer (buf, 8, byte_order);
-	get_frame_register (this_frame, IA64_CFM_REGNUM, buf);
-	cfm = extract_unsigned_integer (buf, 8, byte_order);
+	bsp = get_frame_register_unsigned (this_frame, IA64_BSP_REGNUM);
+	cfm = get_frame_register_unsigned (this_frame, IA64_CFM_REGNUM);
 	sof = gdbarch_tdep (gdbarch)->size_of_register_frame (this_frame, cfm);
 	*val = ia64_rse_skip_regs (bsp, -sof);
 	break;
@@ -2528,14 +2523,12 @@ ia64_access_reg (unw_addr_space_t as, unw_regnum_t uw_regnum, unw_word_t *val,
       case UNW_IA64_AR_BSPSTORE:
 	/* Libunwind wants bspstore to be after the current register frame.
 	   This is what ptrace() and gdb treats as the regular bsp value.  */
-	get_frame_register (this_frame, IA64_BSP_REGNUM, buf);
-	*val = extract_unsigned_integer (buf, 8, byte_order);
+	*val = get_frame_register_unsigned (this_frame, IA64_BSP_REGNUM);
 	break;

       default:
 	/* For all other registers, just unwind the value directly.  */
-	get_frame_register (this_frame, regnum, buf);
-	*val = extract_unsigned_integer (buf, 8, byte_order);
+	*val = get_frame_register_unsigned (this_frame, regnum);
 	break;
     }

@@ -2570,12 +2563,11 @@ ia64_access_rse_reg (unw_addr_space_t as, unw_regnum_t uw_regnum,
 		     unw_word_t *val, int write, void *arg)
 {
   int regnum = ia64_uw2gdb_regnum (uw_regnum);
-  unw_word_t bsp, sof, sol, cfm, psr, ip;
+  ULONGEST bsp, sof, cfm, psr, ip;
   struct regcache *regcache = (struct regcache *) arg;
   struct gdbarch *gdbarch = get_regcache_arch (regcache);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   long new_sof, old_sof;
-  gdb_byte buf[MAX_REGISTER_SIZE];

   /* We never call any libunwind routines that need to write registers.  */
   gdb_assert (!write);
@@ -2585,10 +2577,8 @@ ia64_access_rse_reg (unw_addr_space_t as, unw_regnum_t uw_regnum,
       case UNW_REG_IP:
 	/* Libunwind expects to see the pc value which means the slot number
 	   from the psr must be merged with the ip word address.  */
-	regcache_cooked_read (regcache, IA64_IP_REGNUM, buf);
-	ip = extract_unsigned_integer (buf, 8, byte_order);
-	regcache_cooked_read (regcache, IA64_PSR_REGNUM, buf);
-	psr = extract_unsigned_integer (buf, 8, byte_order);
+	ip = get_frame_register_unsigned (this_frame, IA64_IP_REGNUM);
+	psr = get_frame_register_unsigned (this_frame, IA64_PSR_REGNUM);
 	*val = ip | ((psr >> 41) & 0x3);
 	break;

@@ -2597,10 +2587,8 @@ ia64_access_rse_reg (unw_addr_space_t as, unw_regnum_t uw_regnum,
 	   register frame so we must account for the fact that
 	   ptrace() will return a value for bsp that points *after*
 	   the current register frame.  */
-	regcache_cooked_read (regcache, IA64_BSP_REGNUM, buf);
-	bsp = extract_unsigned_integer (buf, 8, byte_order);
-	regcache_cooked_read (regcache, IA64_CFM_REGNUM, buf);
-	cfm = extract_unsigned_integer (buf, 8, byte_order);
+	bsp = get_frame_register_unsigned (this_frame, IA64_BSP_REGNUM);
+	cfm = get_frame_register_unsigned (this_frame, IA64_CFM_REGNUM);
 	sof = (cfm & 0x7f);
 	*val = ia64_rse_skip_regs (bsp, -sof);
 	break;
@@ -2608,14 +2596,12 @@ ia64_access_rse_reg (unw_addr_space_t as, unw_regnum_t uw_regnum,
       case UNW_IA64_AR_BSPSTORE:
 	/* Libunwind wants bspstore to be after the current register frame.
 	   This is what ptrace() and gdb treats as the regular bsp value.  */
-	regcache_cooked_read (regcache, IA64_BSP_REGNUM, buf);
-	*val = extract_unsigned_integer (buf, 8, byte_order);
+	*val = get_frame_register_unsigned (this_frame, IA64_BSP_REGNUM);
 	break;

       default:
         /* For all other registers, just unwind the value directly.  */
-	regcache_cooked_read (regcache, regnum, buf);
-	*val = extract_unsigned_integer (buf, 8, byte_order);
+	*val = get_frame_register_unsigned (this_frame, regnum);
 	break;
     }

@@ -2982,12 +2968,10 @@ ia64_libunwind_frame_prev_register (struct frame_info *this_frame,
 	{
 	  int rrb_pr = 0;
 	  ULONGEST cfm;
-	  gdb_byte buf[MAX_REGISTER_SIZE];

 	  /* Fetch predicate register rename base from current frame
 	     marker for this frame.  */
-	  get_frame_register (this_frame, IA64_CFM_REGNUM, buf);
-	  cfm = extract_unsigned_integer (buf, 8, byte_order);
+	  cfm = get_frame_register_unsigned (this_frame, IA64_CFM_REGNUM);
 	  rrb_pr = (cfm >> 32) & 0x3f;

 	  /* Adjust the register number to account for register rotation.  */
@@ -3229,7 +3213,7 @@ ia64_extract_return_value (struct type *type, struct regcache *regcache,
   float_elt_type = is_float_or_hfa_type (type);
   if (float_elt_type != NULL)
     {
-      gdb_byte from[MAX_REGISTER_SIZE];
+      gdb_byte from[IA64_MAX_FP_REGISTER_SIZE];
       int offset = 0;
       int regnum = IA64_FR8_REGNUM;
       int n = TYPE_LENGTH (type) / TYPE_LENGTH (float_elt_type);
@@ -3294,7 +3278,7 @@ ia64_store_return_value (struct type *type, struct regcache *regcache,
   float_elt_type = is_float_or_hfa_type (type);
   if (float_elt_type != NULL)
     {
-      gdb_byte to[MAX_REGISTER_SIZE];
+      gdb_byte to[IA64_MAX_FP_REGISTER_SIZE];
       int offset = 0;
       int regnum = IA64_FR8_REGNUM;
       int n = TYPE_LENGTH (type) / TYPE_LENGTH (float_elt_type);
@@ -3856,7 +3840,7 @@ ia64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 	  len = TYPE_LENGTH (type);
 	  while (len > 0 && floatreg < IA64_FR16_REGNUM)
 	    {
-	      gdb_byte to[MAX_REGISTER_SIZE];
+	      gdb_byte to[IA64_MAX_FP_REGISTER_SIZE];
 	      convert_typed_floating (value_contents (arg) + argoffset,
 				      float_elt_type, to,
 				      ia64_ext_type (gdbarch));


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 2/11] Add IA64_MAX_REGISTER_SIZE
  2017-04-11 12:47   ` Alan Hayward
@ 2017-04-11 17:17     ` Yao Qi
  2017-04-12 13:41       ` Alan Hayward
  0 siblings, 1 reply; 12+ messages in thread
From: Yao Qi @ 2017-04-11 17:17 UTC (permalink / raw)
  To: Alan Hayward; +Cc: gdb-patches

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

> @@ -2308,8 +2305,11 @@ ia64_sigtramp_frame_prev_register (struct frame_info *this_frame,
>
>        if (addr != 0)
>  	{
> -	  read_memory (addr, buf, register_size (gdbarch, IA64_IP_REGNUM));
> -	  pc = extract_unsigned_integer (buf, 8, byte_order);
> +	  gdb_byte buf[8];
> +	  struct gdbarch *gdbarch = get_frame_arch (this_frame);
> +	  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
> +	  read_memory (addr, buf, sizeof (buf));
> +	  pc = extract_unsigned_integer (buf, sizeof (buf), byte_order);

I just realize that we can use read_memory_unsigned_integer.

>  	}
>        pc &= ~0xf;
>        return frame_unwind_got_constant (this_frame, regnum, pc);

> @@ -2570,12 +2563,11 @@ ia64_access_rse_reg (unw_addr_space_t as, unw_regnum_t uw_regnum,
>  		     unw_word_t *val, int write, void *arg)
>  {
>    int regnum = ia64_uw2gdb_regnum (uw_regnum);
> -  unw_word_t bsp, sof, sol, cfm, psr, ip;
> +  ULONGEST bsp, sof, cfm, psr, ip;
>    struct regcache *regcache = (struct regcache *) arg;
>    struct gdbarch *gdbarch = get_regcache_arch (regcache);
>    enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>    long new_sof, old_sof;
> -  gdb_byte buf[MAX_REGISTER_SIZE];
>
>    /* We never call any libunwind routines that need to write registers.  */
>    gdb_assert (!write);
> @@ -2585,10 +2577,8 @@ ia64_access_rse_reg (unw_addr_space_t as, unw_regnum_t uw_regnum,
>        case UNW_REG_IP:
>  	/* Libunwind expects to see the pc value which means the slot number
>  	   from the psr must be merged with the ip word address.  */
> -	regcache_cooked_read (regcache, IA64_IP_REGNUM, buf);
> -	ip = extract_unsigned_integer (buf, 8, byte_order);
> -	regcache_cooked_read (regcache, IA64_PSR_REGNUM, buf);
> -	psr = extract_unsigned_integer (buf, 8, byte_order);
> +	ip = get_frame_register_unsigned (this_frame, IA64_IP_REGNUM);

In my last review, I suggested,

regcache_cooked_read_unsigned (regcache, IA64_IP_REGNUM, &ip);

but you still use get_frame_register_unsigned.  There is no variable
"this_frame" at all.

> +	psr = get_frame_register_unsigned (this_frame, IA64_PSR_REGNUM);
>  	*val = ip | ((psr >> 41) & 0x3);
>  	break;
>

-- 
Yao (齐尧)

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 2/11] Add IA64_MAX_REGISTER_SIZE
  2017-04-11 17:17     ` Yao Qi
@ 2017-04-12 13:41       ` Alan Hayward
  2017-04-25 16:08         ` Yao Qi
  0 siblings, 1 reply; 12+ messages in thread
From: Alan Hayward @ 2017-04-12 13:41 UTC (permalink / raw)
  To: Yao Qi; +Cc: gdb-patches, nd


> On 11 Apr 2017, at 18:17, Yao Qi <qiyaoltc@gmail.com> wrote:
> 
> Alan Hayward <Alan.Hayward@arm.com> writes:
> 
>> @@ -2308,8 +2305,11 @@ ia64_sigtramp_frame_prev_register (struct frame_info *this_frame,
>> 
>>       if (addr != 0)
>> 	{
>> -	  read_memory (addr, buf, register_size (gdbarch, IA64_IP_REGNUM));
>> -	  pc = extract_unsigned_integer (buf, 8, byte_order);
>> +	  gdb_byte buf[8];
>> +	  struct gdbarch *gdbarch = get_frame_arch (this_frame);
>> +	  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>> +	  read_memory (addr, buf, sizeof (buf));
>> +	  pc = extract_unsigned_integer (buf, sizeof (buf), byte_order);
> 
> I just realize that we can use read_memory_unsigned_integer.
> 
>> 	}
>>       pc &= ~0xf;
>>       return frame_unwind_got_constant (this_frame, regnum, pc);
> 
>> @@ -2570,12 +2563,11 @@ ia64_access_rse_reg (unw_addr_space_t as, unw_regnum_t uw_regnum,
>> 		     unw_word_t *val, int write, void *arg)
>> {
>>   int regnum = ia64_uw2gdb_regnum (uw_regnum);
>> -  unw_word_t bsp, sof, sol, cfm, psr, ip;
>> +  ULONGEST bsp, sof, cfm, psr, ip;
>>   struct regcache *regcache = (struct regcache *) arg;
>>   struct gdbarch *gdbarch = get_regcache_arch (regcache);
>>   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>>   long new_sof, old_sof;
>> -  gdb_byte buf[MAX_REGISTER_SIZE];
>> 
>>   /* We never call any libunwind routines that need to write registers.  */
>>   gdb_assert (!write);
>> @@ -2585,10 +2577,8 @@ ia64_access_rse_reg (unw_addr_space_t as, unw_regnum_t uw_regnum,
>>       case UNW_REG_IP:
>> 	/* Libunwind expects to see the pc value which means the slot number
>> 	   from the psr must be merged with the ip word address.  */
>> -	regcache_cooked_read (regcache, IA64_IP_REGNUM, buf);
>> -	ip = extract_unsigned_integer (buf, 8, byte_order);
>> -	regcache_cooked_read (regcache, IA64_PSR_REGNUM, buf);
>> -	psr = extract_unsigned_integer (buf, 8, byte_order);
>> +	ip = get_frame_register_unsigned (this_frame, IA64_IP_REGNUM);
> 
> In my last review, I suggested,
> 
> regcache_cooked_read_unsigned (regcache, IA64_IP_REGNUM, &ip);
> 
> but you still use get_frame_register_unsigned.  There is no variable
> "this_frame" at all.
> 

Didn't spot this because a large section of this file is wrapped in
ifdef HAVE_LIBUNWIND_IA64_H

I faked myself a libunwind setup (by adding the headers to my system
and building with --with-libunwind-ia64) and fixed the code.

It's worth noting that in order to build the existing head with libunwind,
I had to comment out an error in ia64-vms-tdep.c and add -Wno-write-strings
to gdb/configure. No idea if this happens on a real ia64 libunwind build,
but it might be worth raising as a bug.

Updated patch below.

Tested on a --enable-targets=all build using make check with board files
unix and native-gdbserver.
As mentioned previously, I do not have an IA64 machine to test on.
Ok to commit?

Alan.

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

	* ia64-tdep.c (IA64_MAX_FP_REGISTER_SIZE) Add.
	(ia64_register_to_value): Use IA64_MAX_FP_REGISTER_SIZE.
	(ia64_value_to_register): Likewise.
	(examine_prologue): Use get_frame_register_unsigned.
	(ia64_sigtramp_frame_prev_register): Use read_memory_unsigned_integer.
	(ia64_access_reg): Use get_frame_register_unsigned.
	(ia64_access_rse_reg): Use regcache_cooked_read_unsigned.
	(ia64_libunwind_frame_prev_register): Use get_frame_register_unsigned.
	(ia64_extract_return_value): Use IA64_MAX_FP_REGISTER_SIZE.
	(ia64_store_return_value): Likewise.
	(ia64_push_dummy_call): Likewise.


diff --git a/gdb/ia64-tdep.c b/gdb/ia64-tdep.c
index 22e158866bbbf0d9457737ac973027521e2c1655..4604aba8e99cb9933b4573ef82ce0ad8f6a26e8d 100644
--- a/gdb/ia64-tdep.c
+++ b/gdb/ia64-tdep.c
@@ -125,6 +125,9 @@ static CORE_ADDR ia64_find_global_pointer (struct gdbarch *gdbarch,

 #define NUM_IA64_RAW_REGS 462

+/* Big enough to hold a FP register in bytes.  */
+#define IA64_FP_REGISTER_SIZE 16
+
 static int sp_regnum = IA64_GR12_REGNUM;

 /* NOTE: we treat the register stack registers r32-r127 as
@@ -1227,7 +1230,7 @@ ia64_register_to_value (struct frame_info *frame, int regnum,
 			int *optimizedp, int *unavailablep)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
-  gdb_byte in[MAX_REGISTER_SIZE];
+  gdb_byte in[IA64_FP_REGISTER_SIZE];

   /* Convert to TYPE.  */
   if (!get_frame_register_bytes (frame, regnum, 0,
@@ -1245,7 +1248,7 @@ ia64_value_to_register (struct frame_info *frame, int regnum,
                          struct type *valtype, const gdb_byte *in)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
-  gdb_byte out[MAX_REGISTER_SIZE];
+  gdb_byte out[IA64_FP_REGISTER_SIZE];
   convert_typed_floating (in, valtype, out, ia64_ext_type (gdbarch));
   put_frame_register (frame, regnum, out);
 }
@@ -1516,8 +1519,7 @@ examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc,
 	  else if (qp == 0 && rN == 2
 	        && ((rM == fp_reg && fp_reg != 0) || rM == 12))
 	    {
-	      gdb_byte buf[MAX_REGISTER_SIZE];
-	      CORE_ADDR saved_sp = 0;
+	      ULONGEST saved_sp = 0;
 	      /* adds r2, spilloffset, rFramePointer
 	           or
 		 adds r2, spilloffset, r12
@@ -1533,9 +1535,8 @@ examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc,
 	      if (this_frame)
 		{
 		  struct gdbarch *gdbarch = get_frame_arch (this_frame);
-		  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
-		  get_frame_register (this_frame, sp_regnum, buf);
-		  saved_sp = extract_unsigned_integer (buf, 8, byte_order);
+		  saved_sp = get_frame_register_unsigned (this_frame,
+							  sp_regnum);
 		}
 	      spill_addr  = saved_sp
 	                  + (rM == 12 ? 0 : mem_stack_frame_size)
@@ -2289,10 +2290,6 @@ static struct value *
 ia64_sigtramp_frame_prev_register (struct frame_info *this_frame,
 				   void **this_cache, int regnum)
 {
-  gdb_byte buf[MAX_REGISTER_SIZE];
-
-  struct gdbarch *gdbarch = get_frame_arch (this_frame);
-  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   struct ia64_frame_cache *cache =
     ia64_sigtramp_frame_cache (this_frame, this_cache);

@@ -2308,8 +2305,9 @@ ia64_sigtramp_frame_prev_register (struct frame_info *this_frame,

       if (addr != 0)
 	{
-	  read_memory (addr, buf, register_size (gdbarch, IA64_IP_REGNUM));
-	  pc = extract_unsigned_integer (buf, 8, byte_order);
+	  struct gdbarch *gdbarch = get_frame_arch (this_frame);
+	  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
+	  pc = read_memory_unsigned_integer (addr, 8, byte_order);
 	}
       pc &= ~0xf;
       return frame_unwind_got_constant (this_frame, regnum, pc);
@@ -2490,12 +2488,11 @@ ia64_access_reg (unw_addr_space_t as, unw_regnum_t uw_regnum, unw_word_t *val,
 		 int write, void *arg)
 {
   int regnum = ia64_uw2gdb_regnum (uw_regnum);
-  unw_word_t bsp, sof, sol, cfm, psr, ip;
+  ULONGEST bsp, sof, cfm, psr, ip;
   struct frame_info *this_frame = (struct frame_info *) arg;
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   long new_sof, old_sof;
-  gdb_byte buf[MAX_REGISTER_SIZE];

   /* We never call any libunwind routines that need to write registers.  */
   gdb_assert (!write);
@@ -2505,10 +2502,8 @@ ia64_access_reg (unw_addr_space_t as, unw_regnum_t uw_regnum, unw_word_t *val,
       case UNW_REG_IP:
 	/* Libunwind expects to see the pc value which means the slot number
 	   from the psr must be merged with the ip word address.  */
-	get_frame_register (this_frame, IA64_IP_REGNUM, buf);
-	ip = extract_unsigned_integer (buf, 8, byte_order);
-	get_frame_register (this_frame, IA64_PSR_REGNUM, buf);
-	psr = extract_unsigned_integer (buf, 8, byte_order);
+	ip = get_frame_register_unsigned (this_frame, IA64_IP_REGNUM);
+	psr = get_frame_register_unsigned (this_frame, IA64_PSR_REGNUM);
 	*val = ip | ((psr >> 41) & 0x3);
 	break;

@@ -2517,10 +2512,8 @@ ia64_access_reg (unw_addr_space_t as, unw_regnum_t uw_regnum, unw_word_t *val,
 	   register frame so we must account for the fact that
 	   ptrace() will return a value for bsp that points *after*
 	   the current register frame.  */
-	get_frame_register (this_frame, IA64_BSP_REGNUM, buf);
-	bsp = extract_unsigned_integer (buf, 8, byte_order);
-	get_frame_register (this_frame, IA64_CFM_REGNUM, buf);
-	cfm = extract_unsigned_integer (buf, 8, byte_order);
+	bsp = get_frame_register_unsigned (this_frame, IA64_BSP_REGNUM);
+	cfm = get_frame_register_unsigned (this_frame, IA64_CFM_REGNUM);
 	sof = gdbarch_tdep (gdbarch)->size_of_register_frame (this_frame, cfm);
 	*val = ia64_rse_skip_regs (bsp, -sof);
 	break;
@@ -2528,14 +2521,12 @@ ia64_access_reg (unw_addr_space_t as, unw_regnum_t uw_regnum, unw_word_t *val,
       case UNW_IA64_AR_BSPSTORE:
 	/* Libunwind wants bspstore to be after the current register frame.
 	   This is what ptrace() and gdb treats as the regular bsp value.  */
-	get_frame_register (this_frame, IA64_BSP_REGNUM, buf);
-	*val = extract_unsigned_integer (buf, 8, byte_order);
+	*val = get_frame_register_unsigned (this_frame, IA64_BSP_REGNUM);
 	break;

       default:
 	/* For all other registers, just unwind the value directly.  */
-	get_frame_register (this_frame, regnum, buf);
-	*val = extract_unsigned_integer (buf, 8, byte_order);
+	*val = get_frame_register_unsigned (this_frame, regnum);
 	break;
     }

@@ -2570,12 +2561,11 @@ ia64_access_rse_reg (unw_addr_space_t as, unw_regnum_t uw_regnum,
 		     unw_word_t *val, int write, void *arg)
 {
   int regnum = ia64_uw2gdb_regnum (uw_regnum);
-  unw_word_t bsp, sof, sol, cfm, psr, ip;
+  ULONGEST bsp, sof, cfm, psr, ip;
   struct regcache *regcache = (struct regcache *) arg;
   struct gdbarch *gdbarch = get_regcache_arch (regcache);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   long new_sof, old_sof;
-  gdb_byte buf[MAX_REGISTER_SIZE];

   /* We never call any libunwind routines that need to write registers.  */
   gdb_assert (!write);
@@ -2585,10 +2575,8 @@ ia64_access_rse_reg (unw_addr_space_t as, unw_regnum_t uw_regnum,
       case UNW_REG_IP:
 	/* Libunwind expects to see the pc value which means the slot number
 	   from the psr must be merged with the ip word address.  */
-	regcache_cooked_read (regcache, IA64_IP_REGNUM, buf);
-	ip = extract_unsigned_integer (buf, 8, byte_order);
-	regcache_cooked_read (regcache, IA64_PSR_REGNUM, buf);
-	psr = extract_unsigned_integer (buf, 8, byte_order);
+	regcache_cooked_read_unsigned (regcache, IA64_IP_REGNUM, &ip);
+	regcache_cooked_read_unsigned (regcache, IA64_PSR_REGNUM, &psr);
 	*val = ip | ((psr >> 41) & 0x3);
 	break;

@@ -2597,10 +2585,8 @@ ia64_access_rse_reg (unw_addr_space_t as, unw_regnum_t uw_regnum,
 	   register frame so we must account for the fact that
 	   ptrace() will return a value for bsp that points *after*
 	   the current register frame.  */
-	regcache_cooked_read (regcache, IA64_BSP_REGNUM, buf);
-	bsp = extract_unsigned_integer (buf, 8, byte_order);
-	regcache_cooked_read (regcache, IA64_CFM_REGNUM, buf);
-	cfm = extract_unsigned_integer (buf, 8, byte_order);
+	regcache_cooked_read_unsigned (regcache, IA64_BSP_REGNUM, &bsp);
+	regcache_cooked_read_unsigned (regcache, IA64_CFM_REGNUM, &cfm);
 	sof = (cfm & 0x7f);
 	*val = ia64_rse_skip_regs (bsp, -sof);
 	break;
@@ -2608,14 +2594,12 @@ ia64_access_rse_reg (unw_addr_space_t as, unw_regnum_t uw_regnum,
       case UNW_IA64_AR_BSPSTORE:
 	/* Libunwind wants bspstore to be after the current register frame.
 	   This is what ptrace() and gdb treats as the regular bsp value.  */
-	regcache_cooked_read (regcache, IA64_BSP_REGNUM, buf);
-	*val = extract_unsigned_integer (buf, 8, byte_order);
+	regcache_cooked_read_unsigned (regcache, IA64_BSP_REGNUM, val);
 	break;

       default:
         /* For all other registers, just unwind the value directly.  */
-	regcache_cooked_read (regcache, regnum, buf);
-	*val = extract_unsigned_integer (buf, 8, byte_order);
+	regcache_cooked_read_unsigned (regcache, regnum, val);
 	break;
     }

@@ -2982,12 +2966,10 @@ ia64_libunwind_frame_prev_register (struct frame_info *this_frame,
 	{
 	  int rrb_pr = 0;
 	  ULONGEST cfm;
-	  gdb_byte buf[MAX_REGISTER_SIZE];

 	  /* Fetch predicate register rename base from current frame
 	     marker for this frame.  */
-	  get_frame_register (this_frame, IA64_CFM_REGNUM, buf);
-	  cfm = extract_unsigned_integer (buf, 8, byte_order);
+	  cfm = get_frame_register_unsigned (this_frame, IA64_CFM_REGNUM);
 	  rrb_pr = (cfm >> 32) & 0x3f;

 	  /* Adjust the register number to account for register rotation.  */
@@ -3229,7 +3211,7 @@ ia64_extract_return_value (struct type *type, struct regcache *regcache,
   float_elt_type = is_float_or_hfa_type (type);
   if (float_elt_type != NULL)
     {
-      gdb_byte from[MAX_REGISTER_SIZE];
+      gdb_byte from[IA64_FP_REGISTER_SIZE];
       int offset = 0;
       int regnum = IA64_FR8_REGNUM;
       int n = TYPE_LENGTH (type) / TYPE_LENGTH (float_elt_type);
@@ -3294,7 +3276,7 @@ ia64_store_return_value (struct type *type, struct regcache *regcache,
   float_elt_type = is_float_or_hfa_type (type);
   if (float_elt_type != NULL)
     {
-      gdb_byte to[MAX_REGISTER_SIZE];
+      gdb_byte to[IA64_FP_REGISTER_SIZE];
       int offset = 0;
       int regnum = IA64_FR8_REGNUM;
       int n = TYPE_LENGTH (type) / TYPE_LENGTH (float_elt_type);
@@ -3856,7 +3838,7 @@ ia64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 	  len = TYPE_LENGTH (type);
 	  while (len > 0 && floatreg < IA64_FR16_REGNUM)
 	    {
-	      gdb_byte to[MAX_REGISTER_SIZE];
+	      gdb_byte to[IA64_FP_REGISTER_SIZE];
 	      convert_typed_floating (value_contents (arg) + argoffset,
 				      float_elt_type, to,
 				      ia64_ext_type (gdbarch));

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 2/11] Add IA64_MAX_REGISTER_SIZE
  2017-04-12 13:41       ` Alan Hayward
@ 2017-04-25 16:08         ` Yao Qi
  2017-04-26 10:38           ` Alan Hayward
  0 siblings, 1 reply; 12+ messages in thread
From: Yao Qi @ 2017-04-25 16:08 UTC (permalink / raw)
  To: Alan Hayward; +Cc: gdb-patches

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

> @@ -1516,8 +1519,7 @@ examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc,
>  	  else if (qp == 0 && rN == 2
>  	        && ((rM == fp_reg && fp_reg != 0) || rM == 12))
>  	    {
> -	      gdb_byte buf[MAX_REGISTER_SIZE];
> -	      CORE_ADDR saved_sp = 0;
> +	      ULONGEST saved_sp = 0;

Is it necessary to change the type of "saved_sp"?

> @@ -2490,12 +2488,11 @@ ia64_access_reg (unw_addr_space_t as, unw_regnum_t uw_regnum, unw_word_t *val,
>  		 int write, void *arg)
>  {
>    int regnum = ia64_uw2gdb_regnum (uw_regnum);
> -  unw_word_t bsp, sof, sol, cfm, psr, ip;
> +  ULONGEST bsp, sof, cfm, psr, ip;

Why do you change the type?

>    struct frame_info *this_frame = (struct frame_info *) arg;
>    struct gdbarch *gdbarch = get_frame_arch (this_frame);
>    enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>    long new_sof, old_sof;
> -  gdb_byte buf[MAX_REGISTER_SIZE];
>
>    /* We never call any libunwind routines that need to write registers.  */
>    gdb_assert (!write);

> @@ -2570,12 +2561,11 @@ ia64_access_rse_reg (unw_addr_space_t as, unw_regnum_t uw_regnum,
>  		     unw_word_t *val, int write, void *arg)
>  {
>    int regnum = ia64_uw2gdb_regnum (uw_regnum);
> -  unw_word_t bsp, sof, sol, cfm, psr, ip;
> +  ULONGEST bsp, sof, cfm, psr, ip;

Likewise.

-- 
Yao (齐尧)

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 2/11] Add IA64_MAX_REGISTER_SIZE
  2017-04-25 16:08         ` Yao Qi
@ 2017-04-26 10:38           ` Alan Hayward
  2017-04-27 10:17             ` Yao Qi
  0 siblings, 1 reply; 12+ messages in thread
From: Alan Hayward @ 2017-04-26 10:38 UTC (permalink / raw)
  To: Yao Qi; +Cc: gdb-patches, nd


> On 25 Apr 2017, at 17:08, Yao Qi <qiyaoltc@gmail.com> wrote:
> 
> Alan Hayward <Alan.Hayward@arm.com> writes:
> 
>> @@ -1516,8 +1519,7 @@ examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc,
>> 	  else if (qp == 0 && rN == 2
>> 	        && ((rM == fp_reg && fp_reg != 0) || rM == 12))
>> 	    {
>> -	      gdb_byte buf[MAX_REGISTER_SIZE];
>> -	      CORE_ADDR saved_sp = 0;
>> +	      ULONGEST saved_sp = 0;
> 
> Is it necessary to change the type of "saved_sp"?
> 
>> @@ -2490,12 +2488,11 @@ ia64_access_reg (unw_addr_space_t as, unw_regnum_t uw_regnum, unw_word_t *val,
>> 		 int write, void *arg)
>> {
>>   int regnum = ia64_uw2gdb_regnum (uw_regnum);
>> -  unw_word_t bsp, sof, sol, cfm, psr, ip;
>> +  ULONGEST bsp, sof, cfm, psr, ip;
> 
> Why do you change the type?
> 
>>   struct frame_info *this_frame = (struct frame_info *) arg;
>>   struct gdbarch *gdbarch = get_frame_arch (this_frame);
>>   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>>   long new_sof, old_sof;
>> -  gdb_byte buf[MAX_REGISTER_SIZE];
>> 
>>   /* We never call any libunwind routines that need to write registers.  */
>>   gdb_assert (!write);
> 
>> @@ -2570,12 +2561,11 @@ ia64_access_rse_reg (unw_addr_space_t as, unw_regnum_t uw_regnum,
>> 		     unw_word_t *val, int write, void *arg)
>> {
>>   int regnum = ia64_uw2gdb_regnum (uw_regnum);
>> -  unw_word_t bsp, sof, sol, cfm, psr, ip;
>> +  ULONGEST bsp, sof, cfm, psr, ip;
> 
> Likewise.
> 

I thought it would be better for the type to match the read type.

Reverted the types back to what they were.
Updated patch below.

Tested on a --enable-targets=all build with a faked libunwind setup
using make check with board files unix and native-gdbserver.
As mentioned previously, I do not have an IA64 machine to test on.
Ok to commit?

Alan.

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

	* ia64-tdep.c (IA64_MAX_FP_REGISTER_SIZE) Add.
	(ia64_register_to_value): Use IA64_MAX_FP_REGISTER_SIZE.
	(ia64_value_to_register): Likewise.
	(examine_prologue): Use get_frame_register_unsigned.
	(ia64_sigtramp_frame_prev_register): Use extract_unsigned_integer.
	(ia64_access_reg): Likewise.
	(ia64_access_rse_reg): Likewise.
	(ia64_libunwind_frame_prev_register): Likewise.
	(ia64_extract_return_value): Use IA64_MAX_FP_REGISTER_SIZE.
	(ia64_store_return_value): Likewise.
	(ia64_push_dummy_call): Likewise.


diff --git a/gdb/ia64-tdep.c b/gdb/ia64-tdep.c
index 22e158866bbbf0d9457737ac973027521e2c1655..4f19e15acdcf34816c10bcab6884659c6688f6bf 100644
--- a/gdb/ia64-tdep.c
+++ b/gdb/ia64-tdep.c
@@ -125,6 +125,9 @@ static CORE_ADDR ia64_find_global_pointer (struct gdbarch *gdbarch,

 #define NUM_IA64_RAW_REGS 462

+/* Big enough to hold a FP register in bytes.  */
+#define IA64_FP_REGISTER_SIZE 16
+
 static int sp_regnum = IA64_GR12_REGNUM;

 /* NOTE: we treat the register stack registers r32-r127 as
@@ -1227,7 +1230,7 @@ ia64_register_to_value (struct frame_info *frame, int regnum,
 			int *optimizedp, int *unavailablep)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
-  gdb_byte in[MAX_REGISTER_SIZE];
+  gdb_byte in[IA64_FP_REGISTER_SIZE];

   /* Convert to TYPE.  */
   if (!get_frame_register_bytes (frame, regnum, 0,
@@ -1245,7 +1248,7 @@ ia64_value_to_register (struct frame_info *frame, int regnum,
                          struct type *valtype, const gdb_byte *in)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
-  gdb_byte out[MAX_REGISTER_SIZE];
+  gdb_byte out[IA64_FP_REGISTER_SIZE];
   convert_typed_floating (in, valtype, out, ia64_ext_type (gdbarch));
   put_frame_register (frame, regnum, out);
 }
@@ -1516,7 +1519,6 @@ examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc,
 	  else if (qp == 0 && rN == 2
 	        && ((rM == fp_reg && fp_reg != 0) || rM == 12))
 	    {
-	      gdb_byte buf[MAX_REGISTER_SIZE];
 	      CORE_ADDR saved_sp = 0;
 	      /* adds r2, spilloffset, rFramePointer
 	           or
@@ -1533,9 +1535,8 @@ examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc,
 	      if (this_frame)
 		{
 		  struct gdbarch *gdbarch = get_frame_arch (this_frame);
-		  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
-		  get_frame_register (this_frame, sp_regnum, buf);
-		  saved_sp = extract_unsigned_integer (buf, 8, byte_order);
+		  saved_sp = get_frame_register_unsigned (this_frame,
+							  sp_regnum);
 		}
 	      spill_addr  = saved_sp
 	                  + (rM == 12 ? 0 : mem_stack_frame_size)
@@ -2289,10 +2290,6 @@ static struct value *
 ia64_sigtramp_frame_prev_register (struct frame_info *this_frame,
 				   void **this_cache, int regnum)
 {
-  gdb_byte buf[MAX_REGISTER_SIZE];
-
-  struct gdbarch *gdbarch = get_frame_arch (this_frame);
-  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   struct ia64_frame_cache *cache =
     ia64_sigtramp_frame_cache (this_frame, this_cache);

@@ -2308,8 +2305,9 @@ ia64_sigtramp_frame_prev_register (struct frame_info *this_frame,

       if (addr != 0)
 	{
-	  read_memory (addr, buf, register_size (gdbarch, IA64_IP_REGNUM));
-	  pc = extract_unsigned_integer (buf, 8, byte_order);
+	  struct gdbarch *gdbarch = get_frame_arch (this_frame);
+	  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
+	  pc = read_memory_unsigned_integer (addr, 8, byte_order);
 	}
       pc &= ~0xf;
       return frame_unwind_got_constant (this_frame, regnum, pc);
@@ -2490,12 +2488,11 @@ ia64_access_reg (unw_addr_space_t as, unw_regnum_t uw_regnum, unw_word_t *val,
 		 int write, void *arg)
 {
   int regnum = ia64_uw2gdb_regnum (uw_regnum);
-  unw_word_t bsp, sof, sol, cfm, psr, ip;
+  unw_word_t bsp, sof, cfm, psr, ip;
   struct frame_info *this_frame = (struct frame_info *) arg;
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   long new_sof, old_sof;
-  gdb_byte buf[MAX_REGISTER_SIZE];

   /* We never call any libunwind routines that need to write registers.  */
   gdb_assert (!write);
@@ -2505,10 +2502,8 @@ ia64_access_reg (unw_addr_space_t as, unw_regnum_t uw_regnum, unw_word_t *val,
       case UNW_REG_IP:
 	/* Libunwind expects to see the pc value which means the slot number
 	   from the psr must be merged with the ip word address.  */
-	get_frame_register (this_frame, IA64_IP_REGNUM, buf);
-	ip = extract_unsigned_integer (buf, 8, byte_order);
-	get_frame_register (this_frame, IA64_PSR_REGNUM, buf);
-	psr = extract_unsigned_integer (buf, 8, byte_order);
+	ip = get_frame_register_unsigned (this_frame, IA64_IP_REGNUM);
+	psr = get_frame_register_unsigned (this_frame, IA64_PSR_REGNUM);
 	*val = ip | ((psr >> 41) & 0x3);
 	break;

@@ -2517,10 +2512,8 @@ ia64_access_reg (unw_addr_space_t as, unw_regnum_t uw_regnum, unw_word_t *val,
 	   register frame so we must account for the fact that
 	   ptrace() will return a value for bsp that points *after*
 	   the current register frame.  */
-	get_frame_register (this_frame, IA64_BSP_REGNUM, buf);
-	bsp = extract_unsigned_integer (buf, 8, byte_order);
-	get_frame_register (this_frame, IA64_CFM_REGNUM, buf);
-	cfm = extract_unsigned_integer (buf, 8, byte_order);
+	bsp = get_frame_register_unsigned (this_frame, IA64_BSP_REGNUM);
+	cfm = get_frame_register_unsigned (this_frame, IA64_CFM_REGNUM);
 	sof = gdbarch_tdep (gdbarch)->size_of_register_frame (this_frame, cfm);
 	*val = ia64_rse_skip_regs (bsp, -sof);
 	break;
@@ -2528,14 +2521,12 @@ ia64_access_reg (unw_addr_space_t as, unw_regnum_t uw_regnum, unw_word_t *val,
       case UNW_IA64_AR_BSPSTORE:
 	/* Libunwind wants bspstore to be after the current register frame.
 	   This is what ptrace() and gdb treats as the regular bsp value.  */
-	get_frame_register (this_frame, IA64_BSP_REGNUM, buf);
-	*val = extract_unsigned_integer (buf, 8, byte_order);
+	*val = get_frame_register_unsigned (this_frame, IA64_BSP_REGNUM);
 	break;

       default:
 	/* For all other registers, just unwind the value directly.  */
-	get_frame_register (this_frame, regnum, buf);
-	*val = extract_unsigned_integer (buf, 8, byte_order);
+	*val = get_frame_register_unsigned (this_frame, regnum);
 	break;
     }

@@ -2570,12 +2561,11 @@ ia64_access_rse_reg (unw_addr_space_t as, unw_regnum_t uw_regnum,
 		     unw_word_t *val, int write, void *arg)
 {
   int regnum = ia64_uw2gdb_regnum (uw_regnum);
-  unw_word_t bsp, sof, sol, cfm, psr, ip;
+  unw_word_t bsp, sof, cfm, psr, ip;
   struct regcache *regcache = (struct regcache *) arg;
   struct gdbarch *gdbarch = get_regcache_arch (regcache);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   long new_sof, old_sof;
-  gdb_byte buf[MAX_REGISTER_SIZE];

   /* We never call any libunwind routines that need to write registers.  */
   gdb_assert (!write);
@@ -2585,10 +2575,8 @@ ia64_access_rse_reg (unw_addr_space_t as, unw_regnum_t uw_regnum,
       case UNW_REG_IP:
 	/* Libunwind expects to see the pc value which means the slot number
 	   from the psr must be merged with the ip word address.  */
-	regcache_cooked_read (regcache, IA64_IP_REGNUM, buf);
-	ip = extract_unsigned_integer (buf, 8, byte_order);
-	regcache_cooked_read (regcache, IA64_PSR_REGNUM, buf);
-	psr = extract_unsigned_integer (buf, 8, byte_order);
+	regcache_cooked_read_unsigned (regcache, IA64_IP_REGNUM, &ip);
+	regcache_cooked_read_unsigned (regcache, IA64_PSR_REGNUM, &psr);
 	*val = ip | ((psr >> 41) & 0x3);
 	break;

@@ -2597,10 +2585,8 @@ ia64_access_rse_reg (unw_addr_space_t as, unw_regnum_t uw_regnum,
 	   register frame so we must account for the fact that
 	   ptrace() will return a value for bsp that points *after*
 	   the current register frame.  */
-	regcache_cooked_read (regcache, IA64_BSP_REGNUM, buf);
-	bsp = extract_unsigned_integer (buf, 8, byte_order);
-	regcache_cooked_read (regcache, IA64_CFM_REGNUM, buf);
-	cfm = extract_unsigned_integer (buf, 8, byte_order);
+	regcache_cooked_read_unsigned (regcache, IA64_BSP_REGNUM, &bsp);
+	regcache_cooked_read_unsigned (regcache, IA64_CFM_REGNUM, &cfm);
 	sof = (cfm & 0x7f);
 	*val = ia64_rse_skip_regs (bsp, -sof);
 	break;
@@ -2608,14 +2594,12 @@ ia64_access_rse_reg (unw_addr_space_t as, unw_regnum_t uw_regnum,
       case UNW_IA64_AR_BSPSTORE:
 	/* Libunwind wants bspstore to be after the current register frame.
 	   This is what ptrace() and gdb treats as the regular bsp value.  */
-	regcache_cooked_read (regcache, IA64_BSP_REGNUM, buf);
-	*val = extract_unsigned_integer (buf, 8, byte_order);
+	regcache_cooked_read_unsigned (regcache, IA64_BSP_REGNUM, val);
 	break;

       default:
         /* For all other registers, just unwind the value directly.  */
-	regcache_cooked_read (regcache, regnum, buf);
-	*val = extract_unsigned_integer (buf, 8, byte_order);
+	regcache_cooked_read_unsigned (regcache, regnum, val);
 	break;
     }

@@ -2982,12 +2966,10 @@ ia64_libunwind_frame_prev_register (struct frame_info *this_frame,
 	{
 	  int rrb_pr = 0;
 	  ULONGEST cfm;
-	  gdb_byte buf[MAX_REGISTER_SIZE];

 	  /* Fetch predicate register rename base from current frame
 	     marker for this frame.  */
-	  get_frame_register (this_frame, IA64_CFM_REGNUM, buf);
-	  cfm = extract_unsigned_integer (buf, 8, byte_order);
+	  cfm = get_frame_register_unsigned (this_frame, IA64_CFM_REGNUM);
 	  rrb_pr = (cfm >> 32) & 0x3f;

 	  /* Adjust the register number to account for register rotation.  */
@@ -3229,7 +3211,7 @@ ia64_extract_return_value (struct type *type, struct regcache *regcache,
   float_elt_type = is_float_or_hfa_type (type);
   if (float_elt_type != NULL)
     {
-      gdb_byte from[MAX_REGISTER_SIZE];
+      gdb_byte from[IA64_FP_REGISTER_SIZE];
       int offset = 0;
       int regnum = IA64_FR8_REGNUM;
       int n = TYPE_LENGTH (type) / TYPE_LENGTH (float_elt_type);
@@ -3294,7 +3276,7 @@ ia64_store_return_value (struct type *type, struct regcache *regcache,
   float_elt_type = is_float_or_hfa_type (type);
   if (float_elt_type != NULL)
     {
-      gdb_byte to[MAX_REGISTER_SIZE];
+      gdb_byte to[IA64_FP_REGISTER_SIZE];
       int offset = 0;
       int regnum = IA64_FR8_REGNUM;
       int n = TYPE_LENGTH (type) / TYPE_LENGTH (float_elt_type);
@@ -3856,7 +3838,7 @@ ia64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 	  len = TYPE_LENGTH (type);
 	  while (len > 0 && floatreg < IA64_FR16_REGNUM)
 	    {
-	      gdb_byte to[MAX_REGISTER_SIZE];
+	      gdb_byte to[IA64_FP_REGISTER_SIZE];
 	      convert_typed_floating (value_contents (arg) + argoffset,
 				      float_elt_type, to,
 				      ia64_ext_type (gdbarch));


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 2/11] Add IA64_MAX_REGISTER_SIZE
  2017-04-26 10:38           ` Alan Hayward
@ 2017-04-27 10:17             ` Yao Qi
  2017-04-27 10:48               ` Alan Hayward
  0 siblings, 1 reply; 12+ messages in thread
From: Yao Qi @ 2017-04-27 10:17 UTC (permalink / raw)
  To: Alan Hayward; +Cc: gdb-patches, nd

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

Hi Alan,
As I keep saying, please split your patch.  You have two complete
different approaches in this patch to remove MAX_FP_REGISTER_SIZE, and
each of them is independent of the other.  One looks very correct to me
but I am not sure the other one.  This leads to that part of the patch
can go in.

> 2017-04-26  Alan Hayward  <alan.hayward@arm.com>
>
> 	* ia64-tdep.c (IA64_MAX_FP_REGISTER_SIZE) Add.
> 	(ia64_register_to_value): Use IA64_MAX_FP_REGISTER_SIZE.
> 	(ia64_value_to_register): Likewise.
> 	(examine_prologue): Use get_frame_register_unsigned.
> 	(ia64_sigtramp_frame_prev_register): Use extract_unsigned_integer.

Use read_memory_unsigned_integer.

> 	(ia64_access_reg): Likewise.

Use get_frame_register_unsigned.

> 	(ia64_access_rse_reg): Likewise.
> 	(ia64_libunwind_frame_prev_register): Likewise.
> 	(ia64_extract_return_value): Use IA64_MAX_FP_REGISTER_SIZE.
> 	(ia64_store_return_value): Likewise.
> 	(ia64_push_dummy_call): Likewise.
>
>
> diff --git a/gdb/ia64-tdep.c b/gdb/ia64-tdep.c
> index 22e158866bbbf0d9457737ac973027521e2c1655..4f19e15acdcf34816c10bcab6884659c6688f6bf 100644
> --- a/gdb/ia64-tdep.c
> +++ b/gdb/ia64-tdep.c
> @@ -1516,7 +1519,6 @@ examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc,
>  	  else if (qp == 0 && rN == 2
>  	        && ((rM == fp_reg && fp_reg != 0) || rM == 12))
>  	    {
> -	      gdb_byte buf[MAX_REGISTER_SIZE];
>  	      CORE_ADDR saved_sp = 0;
>  	      /* adds r2, spilloffset, rFramePointer
>  	           or
> @@ -1533,9 +1535,8 @@ examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc,
>  	      if (this_frame)
>  		{
>  		  struct gdbarch *gdbarch = get_frame_arch (this_frame);
> -		  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
> -		  get_frame_register (this_frame, sp_regnum, buf);
> -		  saved_sp = extract_unsigned_integer (buf, 8, byte_order);
> +		  saved_sp = get_frame_register_unsigned (this_frame,
> +							  sp_regnum);
>  		}
>  	      spill_addr  = saved_sp
>  	                  + (rM == 12 ? 0 : mem_stack_frame_size)
> @@ -2289,10 +2290,6 @@ static struct value *
>  ia64_sigtramp_frame_prev_register (struct frame_info *this_frame,
>  				   void **this_cache, int regnum)
>  {
> -  gdb_byte buf[MAX_REGISTER_SIZE];
> -
> -  struct gdbarch *gdbarch = get_frame_arch (this_frame);
> -  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>    struct ia64_frame_cache *cache =
>      ia64_sigtramp_frame_cache (this_frame, this_cache);
>
> @@ -2308,8 +2305,9 @@ ia64_sigtramp_frame_prev_register (struct frame_info *this_frame,
>
>        if (addr != 0)
>  	{
> -	  read_memory (addr, buf, register_size (gdbarch, IA64_IP_REGNUM));
> -	  pc = extract_unsigned_integer (buf, 8, byte_order);
> +	  struct gdbarch *gdbarch = get_frame_arch (this_frame);
> +	  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
> +	  pc = read_memory_unsigned_integer (addr, 8, byte_order);
>  	}
>        pc &= ~0xf;
>        return frame_unwind_got_constant (this_frame, regnum, pc);
> @@ -2490,12 +2488,11 @@ ia64_access_reg (unw_addr_space_t as, unw_regnum_t uw_regnum, unw_word_t *val,
>  		 int write, void *arg)
>  {
>    int regnum = ia64_uw2gdb_regnum (uw_regnum);
> -  unw_word_t bsp, sof, sol, cfm, psr, ip;
> +  unw_word_t bsp, sof, cfm, psr, ip;
>    struct frame_info *this_frame = (struct frame_info *) arg;
>    struct gdbarch *gdbarch = get_frame_arch (this_frame);
>    enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>    long new_sof, old_sof;
> -  gdb_byte buf[MAX_REGISTER_SIZE];
>
>    /* We never call any libunwind routines that need to write registers.  */
>    gdb_assert (!write);
> @@ -2505,10 +2502,8 @@ ia64_access_reg (unw_addr_space_t as, unw_regnum_t uw_regnum, unw_word_t *val,
>        case UNW_REG_IP:
>  	/* Libunwind expects to see the pc value which means the slot number
>  	   from the psr must be merged with the ip word address.  */
> -	get_frame_register (this_frame, IA64_IP_REGNUM, buf);
> -	ip = extract_unsigned_integer (buf, 8, byte_order);
> -	get_frame_register (this_frame, IA64_PSR_REGNUM, buf);
> -	psr = extract_unsigned_integer (buf, 8, byte_order);
> +	ip = get_frame_register_unsigned (this_frame, IA64_IP_REGNUM);
> +	psr = get_frame_register_unsigned (this_frame, IA64_PSR_REGNUM);
>  	*val = ip | ((psr >> 41) & 0x3);
>  	break;
>
> @@ -2517,10 +2512,8 @@ ia64_access_reg (unw_addr_space_t as, unw_regnum_t uw_regnum, unw_word_t *val,
>  	   register frame so we must account for the fact that
>  	   ptrace() will return a value for bsp that points *after*
>  	   the current register frame.  */
> -	get_frame_register (this_frame, IA64_BSP_REGNUM, buf);
> -	bsp = extract_unsigned_integer (buf, 8, byte_order);
> -	get_frame_register (this_frame, IA64_CFM_REGNUM, buf);
> -	cfm = extract_unsigned_integer (buf, 8, byte_order);
> +	bsp = get_frame_register_unsigned (this_frame, IA64_BSP_REGNUM);
> +	cfm = get_frame_register_unsigned (this_frame, IA64_CFM_REGNUM);
>  	sof = gdbarch_tdep (gdbarch)->size_of_register_frame (this_frame, cfm);
>  	*val = ia64_rse_skip_regs (bsp, -sof);
>  	break;
> @@ -2528,14 +2521,12 @@ ia64_access_reg (unw_addr_space_t as, unw_regnum_t uw_regnum, unw_word_t *val,
>        case UNW_IA64_AR_BSPSTORE:
>  	/* Libunwind wants bspstore to be after the current register frame.
>  	   This is what ptrace() and gdb treats as the regular bsp value.  */
> -	get_frame_register (this_frame, IA64_BSP_REGNUM, buf);
> -	*val = extract_unsigned_integer (buf, 8, byte_order);
> +	*val = get_frame_register_unsigned (this_frame, IA64_BSP_REGNUM);
>  	break;
>
>        default:
>  	/* For all other registers, just unwind the value directly.  */
> -	get_frame_register (this_frame, regnum, buf);
> -	*val = extract_unsigned_integer (buf, 8, byte_order);
> +	*val = get_frame_register_unsigned (this_frame, regnum);
>  	break;
>      }
>
> @@ -2570,12 +2561,11 @@ ia64_access_rse_reg (unw_addr_space_t as, unw_regnum_t uw_regnum,
>  		     unw_word_t *val, int write, void *arg)
>  {
>    int regnum = ia64_uw2gdb_regnum (uw_regnum);
> -  unw_word_t bsp, sof, sol, cfm, psr, ip;
> +  unw_word_t bsp, sof, cfm, psr, ip;
>    struct regcache *regcache = (struct regcache *) arg;
>    struct gdbarch *gdbarch = get_regcache_arch (regcache);
>    enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
>    long new_sof, old_sof;
> -  gdb_byte buf[MAX_REGISTER_SIZE];
>
>    /* We never call any libunwind routines that need to write registers.  */
>    gdb_assert (!write);
> @@ -2585,10 +2575,8 @@ ia64_access_rse_reg (unw_addr_space_t as, unw_regnum_t uw_regnum,
>        case UNW_REG_IP:
>  	/* Libunwind expects to see the pc value which means the slot number
>  	   from the psr must be merged with the ip word address.  */
> -	regcache_cooked_read (regcache, IA64_IP_REGNUM, buf);
> -	ip = extract_unsigned_integer (buf, 8, byte_order);
> -	regcache_cooked_read (regcache, IA64_PSR_REGNUM, buf);
> -	psr = extract_unsigned_integer (buf, 8, byte_order);
> +	regcache_cooked_read_unsigned (regcache, IA64_IP_REGNUM, &ip);
> +	regcache_cooked_read_unsigned (regcache, IA64_PSR_REGNUM, &psr);
>  	*val = ip | ((psr >> 41) & 0x3);
>  	break;
>
> @@ -2597,10 +2585,8 @@ ia64_access_rse_reg (unw_addr_space_t as, unw_regnum_t uw_regnum,
>  	   register frame so we must account for the fact that
>  	   ptrace() will return a value for bsp that points *after*
>  	   the current register frame.  */
> -	regcache_cooked_read (regcache, IA64_BSP_REGNUM, buf);
> -	bsp = extract_unsigned_integer (buf, 8, byte_order);
> -	regcache_cooked_read (regcache, IA64_CFM_REGNUM, buf);
> -	cfm = extract_unsigned_integer (buf, 8, byte_order);
> +	regcache_cooked_read_unsigned (regcache, IA64_BSP_REGNUM, &bsp);
> +	regcache_cooked_read_unsigned (regcache, IA64_CFM_REGNUM, &cfm);
>  	sof = (cfm & 0x7f);
>  	*val = ia64_rse_skip_regs (bsp, -sof);
>  	break;
> @@ -2608,14 +2594,12 @@ ia64_access_rse_reg (unw_addr_space_t as, unw_regnum_t uw_regnum,
>        case UNW_IA64_AR_BSPSTORE:
>  	/* Libunwind wants bspstore to be after the current register frame.
>  	   This is what ptrace() and gdb treats as the regular bsp value.  */
> -	regcache_cooked_read (regcache, IA64_BSP_REGNUM, buf);
> -	*val = extract_unsigned_integer (buf, 8, byte_order);
> +	regcache_cooked_read_unsigned (regcache, IA64_BSP_REGNUM, val);
>  	break;
>
>        default:
>          /* For all other registers, just unwind the value directly.  */
> -	regcache_cooked_read (regcache, regnum, buf);
> -	*val = extract_unsigned_integer (buf, 8, byte_order);
> +	regcache_cooked_read_unsigned (regcache, regnum, val);
>  	break;
>      }
>
> @@ -2982,12 +2966,10 @@ ia64_libunwind_frame_prev_register (struct frame_info *this_frame,
>  	{
>  	  int rrb_pr = 0;
>  	  ULONGEST cfm;
> -	  gdb_byte buf[MAX_REGISTER_SIZE];
>
>  	  /* Fetch predicate register rename base from current frame
>  	     marker for this frame.  */
> -	  get_frame_register (this_frame, IA64_CFM_REGNUM, buf);
> -	  cfm = extract_unsigned_integer (buf, 8, byte_order);
> +	  cfm = get_frame_register_unsigned (this_frame, IA64_CFM_REGNUM);
>  	  rrb_pr = (cfm >> 32) & 0x3f;
>
>  	  /* Adjust the register number to account for register rotation.  */

This part of the patch (not using IA64_MAX_FP_REGISTER_SIZE) is good
to me.

-- 
Yao (齐尧)

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 2/11] Add IA64_MAX_REGISTER_SIZE
  2017-04-27 10:17             ` Yao Qi
@ 2017-04-27 10:48               ` Alan Hayward
  2017-06-05 16:27                 ` Alan Hayward
  0 siblings, 1 reply; 12+ messages in thread
From: Alan Hayward @ 2017-04-27 10:48 UTC (permalink / raw)
  To: Yao Qi; +Cc: gdb-patches, nd


> On 27 Apr 2017, at 11:17, Yao Qi <qiyaoltc@gmail.com> wrote:
> 
> Alan Hayward <Alan.Hayward@arm.com> writes:
> 
> Hi Alan,
> As I keep saying, please split your patch.  You have two complete
> different approaches in this patch to remove MAX_FP_REGISTER_SIZE, and
> each of them is independent of the other.  One looks very correct to me
> but I am not sure the other one.  This leads to that part of the patch
> can go in.
> 
>> 2017-04-26  Alan Hayward  <alan.hayward@arm.com>
>> 
>> 	* ia64-tdep.c (IA64_MAX_FP_REGISTER_SIZE) Add.
>> 	(ia64_register_to_value): Use IA64_MAX_FP_REGISTER_SIZE.
>> 	(ia64_value_to_register): Likewise.
>> 	(examine_prologue): Use get_frame_register_unsigned.
>> 	(ia64_sigtramp_frame_prev_register): Use extract_unsigned_integer.
> 
> Use read_memory_unsigned_integer.
> 
>> 	(ia64_access_reg): Likewise.
> 
> Use get_frame_register_unsigned.
> 
>> 	(ia64_access_rse_reg): Likewise.
>> 	(ia64_libunwind_frame_prev_register): Likewise.
>> 	(ia64_extract_return_value): Use IA64_MAX_FP_REGISTER_SIZE.
>> 	(ia64_store_return_value): Likewise.
>> 	(ia64_push_dummy_call): Likewise.
>> 
>> 
>> diff --git a/gdb/ia64-tdep.c b/gdb/ia64-tdep.c
>> index 22e158866bbbf0d9457737ac973027521e2c1655..4f19e15acdcf34816c10bcab6884659c6688f6bf 100644
> 

<snip>

> This part of the patch (not using IA64_MAX_FP_REGISTER_SIZE) is good
> to me.
> 

Above patch pushed.
That leaves this patch to be reviewed:


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

	* ia64-tdep.c (IA64_MAX_FP_REGISTER_SIZE) Add.
	(ia64_register_to_value): Use IA64_MAX_FP_REGISTER_SIZE.
	(ia64_value_to_register): Likewise.
	(ia64_extract_return_value): Likewise.
	(ia64_store_return_value): Likewise.
	(ia64_push_dummy_call): Likewise.


diff --git a/gdb/ia64-tdep.c b/gdb/ia64-tdep.c
index 8583450fee89e4f0cb6a779efde95c692e097199..4f19e15acdcf34816c10bcab6884659c6688f6bf 100644
--- a/gdb/ia64-tdep.c
+++ b/gdb/ia64-tdep.c
@@ -125,6 +125,9 @@ static CORE_ADDR ia64_find_global_pointer (struct gdbarch *gdbarch,

 #define NUM_IA64_RAW_REGS 462

+/* Big enough to hold a FP register in bytes.  */
+#define IA64_FP_REGISTER_SIZE 16
+
 static int sp_regnum = IA64_GR12_REGNUM;

 /* NOTE: we treat the register stack registers r32-r127 as
@@ -1227,7 +1230,7 @@ ia64_register_to_value (struct frame_info *frame, int regnum,
 			int *optimizedp, int *unavailablep)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
-  gdb_byte in[MAX_REGISTER_SIZE];
+  gdb_byte in[IA64_FP_REGISTER_SIZE];

   /* Convert to TYPE.  */
   if (!get_frame_register_bytes (frame, regnum, 0,
@@ -1245,7 +1248,7 @@ ia64_value_to_register (struct frame_info *frame, int regnum,
                          struct type *valtype, const gdb_byte *in)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
-  gdb_byte out[MAX_REGISTER_SIZE];
+  gdb_byte out[IA64_FP_REGISTER_SIZE];
   convert_typed_floating (in, valtype, out, ia64_ext_type (gdbarch));
   put_frame_register (frame, regnum, out);
 }
@@ -3208,7 +3211,7 @@ ia64_extract_return_value (struct type *type, struct regcache *regcache,
   float_elt_type = is_float_or_hfa_type (type);
   if (float_elt_type != NULL)
     {
-      gdb_byte from[MAX_REGISTER_SIZE];
+      gdb_byte from[IA64_FP_REGISTER_SIZE];
       int offset = 0;
       int regnum = IA64_FR8_REGNUM;
       int n = TYPE_LENGTH (type) / TYPE_LENGTH (float_elt_type);
@@ -3273,7 +3276,7 @@ ia64_store_return_value (struct type *type, struct regcache *regcache,
   float_elt_type = is_float_or_hfa_type (type);
   if (float_elt_type != NULL)
     {
-      gdb_byte to[MAX_REGISTER_SIZE];
+      gdb_byte to[IA64_FP_REGISTER_SIZE];
       int offset = 0;
       int regnum = IA64_FR8_REGNUM;
       int n = TYPE_LENGTH (type) / TYPE_LENGTH (float_elt_type);
@@ -3835,7 +3838,7 @@ ia64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 	  len = TYPE_LENGTH (type);
 	  while (len > 0 && floatreg < IA64_FR16_REGNUM)
 	    {
-	      gdb_byte to[MAX_REGISTER_SIZE];
+	      gdb_byte to[IA64_FP_REGISTER_SIZE];
 	      convert_typed_floating (value_contents (arg) + argoffset,
 				      float_elt_type, to,
 				      ia64_ext_type (gdbarch));


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 2/11] Add IA64_MAX_REGISTER_SIZE
  2017-04-27 10:48               ` Alan Hayward
@ 2017-06-05 16:27                 ` Alan Hayward
  2017-06-06 10:04                   ` Yao Qi
  0 siblings, 1 reply; 12+ messages in thread
From: Alan Hayward @ 2017-06-05 16:27 UTC (permalink / raw)
  To: Yao Qi; +Cc: gdb-patches, nd


> On 27 Apr 2017, at 11:48, Alan Hayward <Alan.Hayward@arm.com> wrote:
> 
>> 
>> On 27 Apr 2017, at 11:17, Yao Qi <qiyaoltc@gmail.com> wrote:
>> 
>> Alan Hayward <Alan.Hayward@arm.com> writes:
>> 

I’ve rebased this patch due to Yao’s unit test changes.


I don't have an IA64 machine to test on.
Faked up a libunwind in order to build libunwind code.
Tested on a --enable-targets=all and --enable-libsanitizer build using
make check with board files unix and native-gdbserver.

Ok to commit?

Alan.


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

	* ia64-tdep.c (IA64_MAX_FP_REGISTER_SIZE) Add.
	(ia64_register_to_value): Use IA64_MAX_FP_REGISTER_SIZE.
	(ia64_value_to_register): Likewise.
	(ia64_extract_return_value): Likewise.
	(ia64_store_return_value): Likewise.
	(ia64_push_dummy_call): Likewise.



diff --git a/gdb/ia64-tdep.c b/gdb/ia64-tdep.c
index 7282acb20ac2c25e7f2c48fec3106300c385679f..d396fb81a62b0c2522900fd9cb0980aa2a5fb767 100644
--- a/gdb/ia64-tdep.c
+++ b/gdb/ia64-tdep.c
@@ -125,6 +125,9 @@ static CORE_ADDR ia64_find_global_pointer (struct gdbarch *gdbarch,

 #define NUM_IA64_RAW_REGS 462

+/* Big enough to hold a FP register in bytes.  */
+#define IA64_FP_REGISTER_SIZE 16
+
 static int sp_regnum = IA64_GR12_REGNUM;

 /* NOTE: we treat the register stack registers r32-r127 as
@@ -1228,7 +1231,7 @@ ia64_register_to_value (struct frame_info *frame, int regnum,
 			int *optimizedp, int *unavailablep)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
-  gdb_byte in[MAX_REGISTER_SIZE];
+  gdb_byte in[IA64_FP_REGISTER_SIZE];

   /* Convert to TYPE.  */
   if (!get_frame_register_bytes (frame, regnum, 0,
@@ -1246,7 +1249,7 @@ ia64_value_to_register (struct frame_info *frame, int regnum,
                          struct type *valtype, const gdb_byte *in)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
-  gdb_byte out[MAX_REGISTER_SIZE];
+  gdb_byte out[IA64_FP_REGISTER_SIZE];
   convert_typed_floating (in, valtype, out, ia64_ext_type (gdbarch));
   put_frame_register (frame, regnum, out);
 }
@@ -3209,7 +3212,7 @@ ia64_extract_return_value (struct type *type, struct regcache *regcache,
   float_elt_type = is_float_or_hfa_type (type);
   if (float_elt_type != NULL)
     {
-      gdb_byte from[MAX_REGISTER_SIZE];
+      gdb_byte from[IA64_FP_REGISTER_SIZE];
       int offset = 0;
       int regnum = IA64_FR8_REGNUM;
       int n = TYPE_LENGTH (type) / TYPE_LENGTH (float_elt_type);
@@ -3274,7 +3277,7 @@ ia64_store_return_value (struct type *type, struct regcache *regcache,
   float_elt_type = is_float_or_hfa_type (type);
   if (float_elt_type != NULL)
     {
-      gdb_byte to[MAX_REGISTER_SIZE];
+      gdb_byte to[IA64_FP_REGISTER_SIZE];
       int offset = 0;
       int regnum = IA64_FR8_REGNUM;
       int n = TYPE_LENGTH (type) / TYPE_LENGTH (float_elt_type);
@@ -3836,7 +3839,7 @@ ia64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 	  len = TYPE_LENGTH (type);
 	  while (len > 0 && floatreg < IA64_FR16_REGNUM)
 	    {
-	      gdb_byte to[MAX_REGISTER_SIZE];
+	      gdb_byte to[IA64_FP_REGISTER_SIZE];
 	      convert_typed_floating (value_contents (arg) + argoffset,
 				      float_elt_type, to,
 				      ia64_ext_type (gdbarch));


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 2/11] Add IA64_MAX_REGISTER_SIZE
  2017-06-05 16:27                 ` Alan Hayward
@ 2017-06-06 10:04                   ` Yao Qi
  2017-06-06 12:57                     ` Alan Hayward
  0 siblings, 1 reply; 12+ messages in thread
From: Yao Qi @ 2017-06-06 10:04 UTC (permalink / raw)
  To: Alan Hayward; +Cc: gdb-patches, nd

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

> Tested on a --enable-targets=all and --enable-libsanitizer build using

Beside --enable-targets=all, do you configure with --enable-64-bit-bfd?

Why do you configure with --enable-libsanitizer?  It is a top-level
configure option which enables to build libsanitizer.  What we need here
is to build GDB with ASAN like this,

 $ make CXXFLAGS='-fsanitize=address' gdb

and run gdb.gdb/unittest.exp.

>
>
> diff --git a/gdb/ia64-tdep.c b/gdb/ia64-tdep.c
> index 7282acb20ac2c25e7f2c48fec3106300c385679f..d396fb81a62b0c2522900fd9cb0980aa2a5fb767 100644
> --- a/gdb/ia64-tdep.c
> +++ b/gdb/ia64-tdep.c
> @@ -125,6 +125,9 @@ static CORE_ADDR ia64_find_global_pointer (struct gdbarch *gdbarch,
>
>  #define NUM_IA64_RAW_REGS 462
>
> +/* Big enough to hold a FP register in bytes.  */
> +#define IA64_FP_REGISTER_SIZE 16

Nit, we can replace one magic number 128 with this macro in ia64_ext_type,

  if (!tdep->ia64_ext_type)
    tdep->ia64_ext_type
      = arch_float_type (gdbarch, 128, "builtin_type_ia64_ext",
			 floatformats_ia64_ext);

Patch is OK if there is no fail in gdb.gdb/unittest.exp.

-- 
Yao (齐尧)

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 2/11] Add IA64_MAX_REGISTER_SIZE
  2017-06-06 10:04                   ` Yao Qi
@ 2017-06-06 12:57                     ` Alan Hayward
  0 siblings, 0 replies; 12+ messages in thread
From: Alan Hayward @ 2017-06-06 12:57 UTC (permalink / raw)
  To: Yao Qi; +Cc: gdb-patches, nd


> On 6 Jun 2017, at 11:04, Yao Qi <qiyaoltc@gmail.com> wrote:
> 
> Alan Hayward <Alan.Hayward@arm.com> writes:
> 
>> Tested on a --enable-targets=all and --enable-libsanitizer build using
> 
> Beside --enable-targets=all, do you configure with --enable-64-bit-bfd?
> 

Yes.

> Why do you configure with --enable-libsanitizer?  It is a top-level
> configure option which enables to build libsanitizer.  What we need here
> is to build GDB with ASAN like this,
> 
> $ make CXXFLAGS='-fsanitize=address' gdb
> 
> and run gdb.gdb/unittest.exp.

Sorry, my mistake. 
I’ve rebuild using the above, and unittest.exp passes.

This also applies to my other 3 patches I’ve posted. My git log includes
all of those patches.

> 
>> 
>> 
>> diff --git a/gdb/ia64-tdep.c b/gdb/ia64-tdep.c
>> index 7282acb20ac2c25e7f2c48fec3106300c385679f..d396fb81a62b0c2522900fd9cb0980aa2a5fb767 100644
>> --- a/gdb/ia64-tdep.c
>> +++ b/gdb/ia64-tdep.c
>> @@ -125,6 +125,9 @@ static CORE_ADDR ia64_find_global_pointer (struct gdbarch *gdbarch,
>> 
>> #define NUM_IA64_RAW_REGS 462
>> 
>> +/* Big enough to hold a FP register in bytes.  */
>> +#define IA64_FP_REGISTER_SIZE 16
> 
> Nit, we can replace one magic number 128 with this macro in ia64_ext_type,
> 
>  if (!tdep->ia64_ext_type)
>    tdep->ia64_ext_type
>      = arch_float_type (gdbarch, 128, "builtin_type_ia64_ext",
> 			 floatformats_ia64_ext);

I’m not sure about this. Other files in gdb use things like 
gdbarch_long_double_bit (gdbarch) instead of 128, which sounds a better solution.
Therefore, I’ve left it as it is for now.

> 
> Patch is OK if there is no fail in gdb.gdb/unittest.exp.
> 

Committed as originally posted.



Alan.


^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2017-06-06 12:57 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-04-04 10:12 [PATCH 2/11] Add IA64_MAX_REGISTER_SIZE Alan Hayward
2017-04-05 10:00 ` Yao Qi
2017-04-11 12:47   ` Alan Hayward
2017-04-11 17:17     ` Yao Qi
2017-04-12 13:41       ` Alan Hayward
2017-04-25 16:08         ` Yao Qi
2017-04-26 10:38           ` Alan Hayward
2017-04-27 10:17             ` Yao Qi
2017-04-27 10:48               ` Alan Hayward
2017-06-05 16:27                 ` Alan Hayward
2017-06-06 10:04                   ` Yao Qi
2017-06-06 12:57                     ` Alan Hayward

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).