public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Andrew Burgess <aburgess@redhat.com>
To: Tiezhu Yang <yangtiezhu@loongson.cn>, gdb-patches@sourceware.org
Cc: Tom Tromey <tom@tromey.com>
Subject: Re: [PATCH] gdb: LoongArch: Fix code style issues
Date: Mon, 18 Jul 2022 15:04:54 +0100	[thread overview]
Message-ID: <87wncaqzy1.fsf@redhat.com> (raw)
In-Reply-To: <1657972545-28608-1-git-send-email-yangtiezhu@loongson.cn>

Tiezhu Yang <yangtiezhu@loongson.cn> writes:

> Fix some code style issues suggested by Tom Tromey, thank you.
>
> (1) Put an introductory comment to explain the purpose for some functions.
>
> (2) Modify the the attribute code to make it portable.
>
> (3) Remove globals and pass pointers to locals.
>
> (4) Remove "*" in the subsequent comment lines.
>
> Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn>
> ---
>  gdb/loongarch-tdep.c | 313 +++++++++++++++++++++++++++------------------------
>  1 file changed, 165 insertions(+), 148 deletions(-)
>
> diff --git a/gdb/loongarch-tdep.c b/gdb/loongarch-tdep.c
> index 41422f0..9fc426e 100644
> --- a/gdb/loongarch-tdep.c
> +++ b/gdb/loongarch-tdep.c
> @@ -452,6 +452,9 @@ static const struct frame_unwind loongarch_frame_unwind = {
>    /*.prev_arch	   =*/nullptr,
>  };
>  
> +/* Pass a value in a sequence of consecutive general-purpose argument registers.
> +   The caller is responsible for ensuring sufficient registers are available.  */
> +

Is the "... a sequence of ..." part correct?  I know there are some
parts of GDB that allow values to flow from one register to the next,
but I thought at the regcache level we dealt with individual registers,
and the code in this function doesn't seem to do any "... a sequence of
...." behaviour.

Also, the comments are an opportunity to explain the arguments,
especially anything that might not be immediately obvious.  In this case
there is (what I would consider) a non-obvious mapping between GAR and
which register is written to.  Your comment can explain this:

  /* Write the contents of buffer VAL into the general purpose argument
     register defined by GAR in REGCACHE.

     GAR should be a value in the range 0 to LOONGARCH_ARG_REGNUM, which
     correspond to registers A7 and A0 respectively.  */

Please feel free to improve the wording.

I think most of the new function comments added in this commit would
benefit from a similar rewrite.

Thanks,
Andrew

>  static void
>  pass_in_gar (struct regcache *regcache, unsigned int gar, const gdb_byte *val)
>  {
> @@ -459,6 +462,9 @@ pass_in_gar (struct regcache *regcache, unsigned int gar, const gdb_byte *val)
>    regcache->cooked_write (regnum, val);
>  }
>  
> +/* Pass a value in a sequence of consecutive floating-point argument registers.
> +   The caller is responsible for ensuring sufficient registers are available.  */
> +
>  static void
>  pass_in_far (struct regcache *regcache, unsigned int far, const gdb_byte *val)
>  {
> @@ -466,29 +472,30 @@ pass_in_far (struct regcache *regcache, unsigned int far, const gdb_byte *val)
>    regcache->cooked_write (regnum, val);
>  }
>  
> -static __attribute__((aligned(16))) gdb_byte buf[1024] = { 0 };
> -static gdb_byte *addr = buf;
> +/* Pass a value on the stack.  */
>  
>  static void
> -pass_on_stack (struct regcache *regcache, const gdb_byte *val, size_t len, int align)
> +pass_on_stack (struct regcache *regcache, const gdb_byte *val,
> +	       size_t len, int align, gdb_byte **addr)
>  {
>    align = align_up (align, 8);
>    if (align > 16)
>      align = 16;
>  
> -  CORE_ADDR align_addr = (CORE_ADDR) addr;
> +  CORE_ADDR align_addr = (CORE_ADDR) (*addr);
>    align_addr = align_up (align_addr, align);
> -  addr = (gdb_byte *) align_addr;
> -  memcpy (addr, val, len);
> -  addr += len;
> +  *addr = (gdb_byte *) align_addr;
> +  memcpy (*addr, val, len);
> +  *addr += len;
>  }
>  
> -static unsigned int fixed_point_members = 0;
> -static unsigned int floating_point_members = 0;
> -static bool first_member_is_fixed_point = false;
> +/* Compute the numbers of struct member  */
>  
>  static void
> -compute_struct_member (struct type *type)
> +compute_struct_member (struct type *type,
> +		       unsigned int *fixed_point_members,
> +		       unsigned int *floating_point_members,
> +		       bool *first_member_is_fixed_point)
>  {
>    for (int i = 0; i < type->num_fields (); i++)
>      {
> @@ -501,17 +508,20 @@ compute_struct_member (struct type *type)
>  	  || field_type->code () == TYPE_CODE_ENUM
>  	  || field_type->code () == TYPE_CODE_PTR)
>        {
> -	fixed_point_members++;
> +	(*fixed_point_members)++;
>  
> -	if (floating_point_members == 0)
> -	  first_member_is_fixed_point = true;
> +	if (*floating_point_members == 0)
> +	  *first_member_is_fixed_point = true;
>        }
>        else if (field_type->code () == TYPE_CODE_FLT)
> -	floating_point_members++;
> +	(*floating_point_members)++;
>        else if (field_type->code () == TYPE_CODE_STRUCT)
> -	compute_struct_member (field_type);
> +	compute_struct_member (field_type,
> +			       fixed_point_members,
> +			       floating_point_members,
> +			       first_member_is_fixed_point);
>        else if (field_type->code () == TYPE_CODE_COMPLEX)
> -	floating_point_members += 2;
> +	(*floating_point_members) += 2;
>      }
>  }
>  
> @@ -531,11 +541,15 @@ loongarch_push_dummy_call (struct gdbarch *gdbarch,
>    int regsize = register_size (gdbarch, 0);
>    unsigned int gar = LOONGARCH_ARG_REGNUM;
>    unsigned int far = LOONGARCH_ARG_REGNUM;
> +  unsigned int fixed_point_members;
> +  unsigned int floating_point_members;
> +  bool first_member_is_fixed_point;
> +  gdb_byte buf[1024] = { 0 };
> +  gdb_byte *addr = buf;
>  
>    if (return_method != return_method_normal)
>      pass_in_gar (regcache, gar--, (gdb_byte *) &struct_addr);
>  
> -  addr = buf;
>    for (int i = 0; i < nargs; i++)
>      {
>        struct value *arg = args[i];
> @@ -555,17 +569,17 @@ loongarch_push_dummy_call (struct gdbarch *gdbarch,
>  	case TYPE_CODE_PTR:
>  	  {
>  	    /* integer or pointer type is passed in GAR.
> -	     * If no GAR is available, it's passed on the stack.
> -	     * When passed in registers or on the stack,
> -	     * the unsigned integer scalars are zero-extended to GRLEN bits,
> -	     * and the signed integer scalars are sign-extended.  */
> +	       If no GAR is available, it's passed on the stack.
> +	       When passed in registers or on the stack,
> +	       the unsigned integer scalars are zero-extended to GRLEN bits,
> +	       and the signed integer scalars are sign-extended.  */
>  	  if (type->is_unsigned ())
>  	    {
>                ULONGEST data = extract_unsigned_integer (val, len, BFD_ENDIAN_LITTLE);
>  	      if (gar > 0)
>  		pass_in_gar (regcache, gar--, (gdb_byte *) &data);
>  	      else
> -		pass_on_stack (regcache, (gdb_byte *) &data, len, align);
> +		pass_on_stack (regcache, (gdb_byte *) &data, len, align, &addr);
>              }
>  	  else
>  	    {
> @@ -573,7 +587,7 @@ loongarch_push_dummy_call (struct gdbarch *gdbarch,
>  	      if (gar > 0)
>  		pass_in_gar (regcache, gar--, (gdb_byte *) &data);
>  	      else
> -		pass_on_stack (regcache, (gdb_byte *) &data, len, align);
> +		pass_on_stack (regcache, (gdb_byte *) &data, len, align, &addr);
>              }
>  	  }
>  	  break;
> @@ -581,12 +595,12 @@ loongarch_push_dummy_call (struct gdbarch *gdbarch,
>  	  if (len == 2 * regsize)
>  	    {
>  	      /* long double type is passed in a pair of GAR,
> -	       * with the low-order GRLEN bits in the lower-numbered register
> -	       * and the high-order GRLEN bits in the higher-numbered register.
> -	       * If exactly one register is available,
> -	       * the low-order GRLEN bits are passed in the register
> -	       * and the high-order GRLEN bits are passed on the stack.
> -	       * If no GAR is available, it's passed on the stack.  */
> +	         with the low-order GRLEN bits in the lower-numbered register
> +	         and the high-order GRLEN bits in the higher-numbered register.
> +	         If exactly one register is available,
> +	         the low-order GRLEN bits are passed in the register
> +	         and the high-order GRLEN bits are passed on the stack.
> +	         If no GAR is available, it's passed on the stack.  */
>  	      if (gar >= 2)
>  		{
>  		  pass_in_gar (regcache, gar--, val);
> @@ -595,24 +609,24 @@ loongarch_push_dummy_call (struct gdbarch *gdbarch,
>  	      else if (gar == 1)
>  		{
>  		  pass_in_gar (regcache, gar--, val);
> -		  pass_on_stack (regcache, val + regsize, len - regsize, align);
> +		  pass_on_stack (regcache, val + regsize, len - regsize, align, &addr);
>  		}
>  	      else
>  		{
> -		  pass_on_stack (regcache, val, len, align);
> +		  pass_on_stack (regcache, val, len, align, &addr);
>  		}
>  	    }
>  	  else
>  	    {
>  	      /* The other floating-point type is passed in FAR.
> -	       * If no FAR is available, it's passed in GAR.
> -	       * If no GAR is available, it's passed on the stack.  */
> +	         If no FAR is available, it's passed in GAR.
> +	         If no GAR is available, it's passed on the stack.  */
>  	      if (far > 0)
>  		  pass_in_far (regcache, far--, val);
>  	      else if (gar > 0)
>  		  pass_in_gar (regcache, gar--, val);
>  	      else
> -		  pass_on_stack (regcache, val, len, align);
> +		  pass_on_stack (regcache, val, len, align, &addr);
>  	    }
>  	  break;
>  	case TYPE_CODE_STRUCT:
> @@ -620,7 +634,10 @@ loongarch_push_dummy_call (struct gdbarch *gdbarch,
>  	    fixed_point_members = 0;
>  	    floating_point_members = 0;
>  	    first_member_is_fixed_point = false;
> -	    compute_struct_member (type);
> +	    compute_struct_member (type,
> +				   &fixed_point_members,
> +				   &floating_point_members,
> +				   &first_member_is_fixed_point);
>  
>  	    if (len > 0 && len <= regsize)
>  	      {
> @@ -628,20 +645,20 @@ loongarch_push_dummy_call (struct gdbarch *gdbarch,
>  		if (fixed_point_members > 0 && floating_point_members == 0)
>  		  {
>  		    /* If there is an available GAR,
> -		     * the structure is passed through the GAR by value passing;
> -		     * If no GAR is available, it's passed on the stack.  */
> +		       the structure is passed through the GAR by value passing;
> +		       If no GAR is available, it's passed on the stack.  */
>  		    if (gar > 0)
>  		      pass_in_gar (regcache, gar--, val);
>  		    else
> -		      pass_on_stack (regcache, val, len, align);
> +		      pass_on_stack (regcache, val, len, align, &addr);
>  		  }
>  		/* The structure has only floating-point members.  */
>  		else if (fixed_point_members == 0 && floating_point_members > 0)
>  		  {
>  		    /* One floating-point member.
> -		     * The argument is passed in a FAR.
> -		     * If no FAR is available, the value is passed in a GAR.
> -		     * if no GAR is available, the value is passed on the stack.  */
> +		       The argument is passed in a FAR.
> +		       If no FAR is available, the value is passed in a GAR.
> +		       if no GAR is available, the value is passed on the stack.  */
>  		    if (floating_point_members == 1)
>  		      {
>  			if (far > 0)
> @@ -649,14 +666,14 @@ loongarch_push_dummy_call (struct gdbarch *gdbarch,
>  			else if (gar > 0)
>  			  pass_in_gar (regcache, gar--, val);
>  			else
> -			  pass_on_stack (regcache, val, len, align);
> +			  pass_on_stack (regcache, val, len, align, &addr);
>  		      }
>  		    /* Two floating-point members.
> -		     * The argument is passed in a pair of available FAR,
> -		     * with the low-order float member bits in the lower-numbered FAR
> -		     * and the high-order float member bits in the higher-numbered FAR.
> -		     * If the number of available FAR is less than 2, it's passed in a GAR,
> -		     * and passed on the stack if no GAR is available.  */
> +		       The argument is passed in a pair of available FAR,
> +		       with the low-order float member bits in the lower-numbered FAR
> +		       and the high-order float member bits in the higher-numbered FAR.
> +		       If the number of available FAR is less than 2, it's passed in a GAR,
> +		       and passed on the stack if no GAR is available.  */
>  		    else if (floating_point_members == 2)
>  		      {
>  			if (far >= 2)
> @@ -670,7 +687,7 @@ loongarch_push_dummy_call (struct gdbarch *gdbarch,
>  			  }
>  			else
>  			  {
> -			    pass_on_stack (regcache, val, len, align);
> +			    pass_on_stack (regcache, val, len, align, &addr);
>  			  }
>  		      }
>  		  }
> @@ -678,21 +695,21 @@ loongarch_push_dummy_call (struct gdbarch *gdbarch,
>  		else if (fixed_point_members > 0 && floating_point_members > 0)
>  		  {
>  		    /* One float member and multiple fixed-point members.
> -		     * If there are available GAR, the structure is passed in a GAR,
> -		     * and passed on the stack if no GAR is available.  */
> +		       If there are available GAR, the structure is passed in a GAR,
> +		       and passed on the stack if no GAR is available.  */
>  		    if (floating_point_members == 1 && fixed_point_members > 1)
>  		      {
>  			if (gar > 0)
>  			  pass_in_gar (regcache, gar--, val);
>  			else
> -			  pass_on_stack (regcache, val, len, align);
> +			  pass_on_stack (regcache, val, len, align, &addr);
>  		      }
>  		    /* One float member and only one fixed-point member.
> -		     * If one FAR and one GAR are available,
> -		     * the floating-point member of the structure is passed in the FAR,
> -		     * and the fixed-point member of the structure is passed in the GAR.
> -		     * If no floating-point register but one GAR is available, it's passed in GAR;
> -		     * If no GAR is available, it's passed on the stack.  */
> +		       If one FAR and one GAR are available,
> +		       the floating-point member of the structure is passed in the FAR,
> +		       and the fixed-point member of the structure is passed in the GAR.
> +		       If no floating-point register but one GAR is available, it's passed in GAR;
> +		       If no GAR is available, it's passed on the stack.  */
>  		    else if (floating_point_members == 1 && fixed_point_members == 1)
>  		      {
>  			if (far > 0 && gar > 0)
> @@ -713,7 +730,7 @@ loongarch_push_dummy_call (struct gdbarch *gdbarch,
>  			    if (gar > 0)
>  			      pass_in_gar (regcache, gar--, val);
>  			    else
> -			      pass_on_stack (regcache, val, len, align);
> +			      pass_on_stack (regcache, val, len, align, &addr);
>  			  }
>  		      }
>  		  }
> @@ -724,12 +741,12 @@ loongarch_push_dummy_call (struct gdbarch *gdbarch,
>  		if (fixed_point_members > 0 && floating_point_members == 0)
>  		  {
>  		    /* The argument is passed in a pair of available GAR,
> -		     * with the low-order bits in the lower-numbered GAR
> -		     * and the high-order bits in the higher-numbered GAR.
> -		     * If only one GAR is available,
> -		     * the low-order bits are in the GAR
> -		     * and the high-order bits are on the stack,
> -		     * and passed on the stack if no GAR is available.  */
> +		       with the low-order bits in the lower-numbered GAR
> +		       and the high-order bits in the higher-numbered GAR.
> +		       If only one GAR is available,
> +		       the low-order bits are in the GAR
> +		       and the high-order bits are on the stack,
> +		       and passed on the stack if no GAR is available.  */
>  		    if (gar >= 2)
>  		      {
>  			pass_in_gar (regcache, gar--, val);
> @@ -738,26 +755,26 @@ loongarch_push_dummy_call (struct gdbarch *gdbarch,
>  		    else if (gar == 1)
>  		      {
>  			pass_in_gar (regcache, gar--, val);
> -			pass_on_stack (regcache, val + regsize, len - regsize, align);
> +			pass_on_stack (regcache, val + regsize, len - regsize, align, &addr);
>  		      }
>  		    else
>  		      {
> -			pass_on_stack (regcache, val, len, align);
> +			pass_on_stack (regcache, val, len, align, &addr);
>  		      }
>  		  }
>  		/* Only floating-point members.  */
>  		else if (fixed_point_members == 0 && floating_point_members > 0)
>  		  {
>  		    /* The structure has one long double member
> -		     * or one double member and two adjacent float members
> -		     * or 3-4 float members.
> -		     * The argument is passed in a pair of available GAR,
> -		     * with the low-order bits in the lower-numbered GAR
> -		     * and the high-order bits in the higher-numbered GAR.
> -		     * If only one GAR is available,
> -		     * the low-order bits are in the GAR
> -		     * and the high-order bits are on the stack,
> -		     * and passed on the stack if no GAR is available.  */
> +		       or one double member and two adjacent float members
> +		       or 3-4 float members.
> +		       The argument is passed in a pair of available GAR,
> +		       with the low-order bits in the lower-numbered GAR
> +		       and the high-order bits in the higher-numbered GAR.
> +		       If only one GAR is available,
> +		       the low-order bits are in the GAR
> +		       and the high-order bits are on the stack,
> +		       and passed on the stack if no GAR is available.  */
>  		    if ((len == 16 && floating_point_members == 1)
>  			 || (len == 16 && floating_point_members == 3)
>  			 || (len == 12 && floating_point_members == 3)
> @@ -771,26 +788,26 @@ loongarch_push_dummy_call (struct gdbarch *gdbarch,
>  			else if (gar == 1)
>  			  {
>  			    pass_in_gar (regcache, gar--, val);
> -			    pass_on_stack (regcache, val + regsize, len - regsize, align);
> +			    pass_on_stack (regcache, val + regsize, len - regsize, align, &addr);
>  			  }
>  			else
>  			  {
> -			    pass_on_stack (regcache, val, len, align);
> +			    pass_on_stack (regcache, val, len, align, &addr);
>  			  }
>  		      }
>  		    /* The structure with two double members
> -		     * is passed in a pair of available FAR,
> -		     * with the low-order bits in the lower-numbered FAR
> -		     * and the high-order bits in the higher-numbered FAR.
> -		     * If no a pair of available FAR,
> -		     * it's passed in a pair of available GAR,
> -		     * with the low-order bits in the lower-numbered GAR
> -		     * and the high-order bits in the higher-numbered GAR.
> -		     * If only one GAR is available,
> -		     * the low-order bits are in the GAR
> -		     * and the high-order bits are on stack,
> -		     * and passed on the stack if no GAR is available.
> -		     * A structure with one double member and one float member is same.  */
> +		       is passed in a pair of available FAR,
> +		       with the low-order bits in the lower-numbered FAR
> +		       and the high-order bits in the higher-numbered FAR.
> +		       If no a pair of available FAR,
> +		       it's passed in a pair of available GAR,
> +		       with the low-order bits in the lower-numbered GAR
> +		       and the high-order bits in the higher-numbered GAR.
> +		       If only one GAR is available,
> +		       the low-order bits are in the GAR
> +		       and the high-order bits are on stack,
> +		       and passed on the stack if no GAR is available.
> +		       A structure with one double member and one float member is same.  */
>  		    else if ((len == 16 && floating_point_members == 2)
>  			     || (len == 12 && floating_point_members == 2))
>  		      {
> @@ -807,11 +824,11 @@ loongarch_push_dummy_call (struct gdbarch *gdbarch,
>  			else if (gar == 1)
>  			  {
>  			    pass_in_gar (regcache, gar--, val);
> -			    pass_on_stack (regcache, val + regsize, len - regsize, align);
> +			    pass_on_stack (regcache, val + regsize, len - regsize, align, &addr);
>  			  }
>  			else
>  			  {
> -			    pass_on_stack (regcache, val, len, align);
> +			    pass_on_stack (regcache, val, len, align, &addr);
>  			  }
>  		      }
>  		  }
> @@ -822,14 +839,14 @@ loongarch_push_dummy_call (struct gdbarch *gdbarch,
>  		    if (floating_point_members == 1 && fixed_point_members == 1)
>  		      {
>  			/* If one FAR and one GAR are available,
> -			 * the floating-point member of the structure is passed in the FAR,
> -			 * and the fixed-point member of the structure is passed in the GAR;
> -			 * If no floating-point registers but two GARs are available,
> -			 * it's passed in the two GARs;
> -			 * If only one GAR is available,
> -			 * the low-order bits are in the GAR
> -			 * and the high-order bits are on the stack;
> -			 * And it's passed on the stack if no GAR is available.  */
> +			   the floating-point member of the structure is passed in the FAR,
> +			   and the fixed-point member of the structure is passed in the GAR;
> +			   If no floating-point registers but two GARs are available,
> +			   it's passed in the two GARs;
> +			   If only one GAR is available,
> +			   the low-order bits are in the GAR
> +			   and the high-order bits are on the stack;
> +			   And it's passed on the stack if no GAR is available.  */
>  			if (far > 0 && gar > 0)
>  			  {
>  			    if (first_member_is_fixed_point == false)
> @@ -851,22 +868,22 @@ loongarch_push_dummy_call (struct gdbarch *gdbarch,
>  			else if (far == 0 && gar == 1)
>  			  {
>  			    pass_in_gar (regcache, gar--, val);
> -			    pass_on_stack (regcache, val + regsize, len - regsize, align);
> +			    pass_on_stack (regcache, val + regsize, len - regsize, align, &addr);
>  			  }
>  			else if (far == 0 && gar == 0)
>  			  {
> -			    pass_on_stack (regcache, val, len, align);
> +			    pass_on_stack (regcache, val, len, align, &addr);
>  			  }
>  		      }
>  		    else
>  		      {
>  			/* The argument is passed in a pair of available GAR,
> -			 * with the low-order bits in the lower-numbered GAR
> -			 * and the high-order bits in the higher-numbered GAR.
> -			 * If only one GAR is available,
> -			 * the low-order bits are in the GAR
> -			 * and the high-order bits are on the stack,
> -			 * and passed on the stack if no GAR is available.  */
> +			   with the low-order bits in the lower-numbered GAR
> +			   and the high-order bits in the higher-numbered GAR.
> +			   If only one GAR is available,
> +			   the low-order bits are in the GAR
> +			   and the high-order bits are on the stack,
> +			   and passed on the stack if no GAR is available.  */
>  			if (gar >= 2)
>  			  {
>  			    pass_in_gar (regcache, gar--, val);
> @@ -875,11 +892,11 @@ loongarch_push_dummy_call (struct gdbarch *gdbarch,
>  			else if (gar == 1)
>  			  {
>  			    pass_in_gar (regcache, gar--, val);
> -			    pass_on_stack (regcache, val + regsize, len - regsize, align);
> +			    pass_on_stack (regcache, val + regsize, len - regsize, align, &addr);
>  			  }
>  			else
>  			  {
> -			    pass_on_stack (regcache, val, len, align);
> +			    pass_on_stack (regcache, val, len, align, &addr);
>  			  }
>  		      }
>  		  }
> @@ -887,15 +904,15 @@ loongarch_push_dummy_call (struct gdbarch *gdbarch,
>  	    else if (len > 2 * regsize)
>  	      {
>  	        /* It's passed by reference and are replaced in the argument list with the address.
> -		 * If there is an available GAR, the reference is passed in the GAR,
> -		 * and passed on the stack if no GAR is available.  */
> +		   If there is an available GAR, the reference is passed in the GAR,
> +		   and passed on the stack if no GAR is available.  */
>  		sp = align_down (sp - len, 16);
>  		write_memory (sp, val, len);
>  
>  		if (gar > 0)
>  		  pass_in_gar (regcache, gar--, (const gdb_byte *) &sp);
>  		else
> -		  pass_on_stack (regcache, (const gdb_byte*) &sp, len, regsize);
> +		  pass_on_stack (regcache, (const gdb_byte*) &sp, len, regsize, &addr);
>  	      }
>  	  }
>  	  break;
> @@ -904,21 +921,21 @@ loongarch_push_dummy_call (struct gdbarch *gdbarch,
>  	  if (len > 0 && len <= regsize)
>  	    {
>  	      /* The argument is passed in a GAR,
> -	       * or on the stack by value if no GAR is available.  */
> +	         or on the stack by value if no GAR is available.  */
>  	      if (gar > 0)
>  		pass_in_gar (regcache, gar--, val);
>  	      else
> -		pass_on_stack (regcache, val, len, align);
> +		pass_on_stack (regcache, val, len, align, &addr);
>  	    }
>  	  else if (len > regsize && len <= 2 * regsize)
>  	    {
>  	      /* The argument is passed in a pair of available GAR,
> -	       * with the low-order bits in the lower-numbered GAR
> -	       * and the high-order bits in the higher-numbered GAR.
> -	       * If only one GAR is available,
> -	       * the low-order bits are in the GAR
> -	       * and the high-order bits are on the stack.
> -	       * The arguments are passed on the stack when no GAR is available.  */
> +	         with the low-order bits in the lower-numbered GAR
> +	         and the high-order bits in the higher-numbered GAR.
> +	         If only one GAR is available,
> +	         the low-order bits are in the GAR
> +	         and the high-order bits are on the stack.
> +	         The arguments are passed on the stack when no GAR is available.  */
>  	      if (gar >= 2)
>  		{
>  		  pass_in_gar (regcache, gar--, val);
> @@ -927,25 +944,25 @@ loongarch_push_dummy_call (struct gdbarch *gdbarch,
>  	      else if (gar == 1)
>  		{
>  		  pass_in_gar (regcache, gar--, val);
> -		  pass_on_stack (regcache, val + regsize, len - regsize, align);
> +		  pass_on_stack (regcache, val + regsize, len - regsize, align, &addr);
>  		}
>  	      else
>  		{
> -		  pass_on_stack (regcache, val, len, align);
> +		  pass_on_stack (regcache, val, len, align, &addr);
>  		}
>  	    }
>  	  else if (len > 2 * regsize)
>  	    {
>  	      /* It's passed by reference and are replaced in the argument list with the address.
> -	       * If there is an available GAR, the reference is passed in the GAR,
> -	       * and passed on the stack if no GAR is available.  */
> +	         If there is an available GAR, the reference is passed in the GAR,
> +	         and passed on the stack if no GAR is available.  */
>  	      sp = align_down (sp - len, 16);
>  	      write_memory (sp, val, len);
>  
>  	      if (gar > 0)
>  		pass_in_gar (regcache, gar--, (const gdb_byte *) &sp);
>  	      else
> -		pass_on_stack (regcache, (const gdb_byte*) &sp, len, regsize);
> +		pass_on_stack (regcache, (const gdb_byte*) &sp, len, regsize, &addr);
>  	    }
>  	  break;
>  	case TYPE_CODE_COMPLEX:
> @@ -956,11 +973,11 @@ loongarch_push_dummy_call (struct gdbarch *gdbarch,
>  	    if (target_len < regsize)
>  	      {
>  		/* The complex with two float members
> -		 * is passed in a pair of available FAR,
> -		 * with the low-order float member bits in the lower-numbered FAR
> -		 * and the high-order float member bits in the higher-numbered FAR.
> -		 * If the number of available FAR is less than 2, it's passed in a GAR,
> -		 * and passed on the stack if no GAR is available.  */
> +		   is passed in a pair of available FAR,
> +		   with the low-order float member bits in the lower-numbered FAR
> +		   and the high-order float member bits in the higher-numbered FAR.
> +		   If the number of available FAR is less than 2, it's passed in a GAR,
> +		   and passed on the stack if no GAR is available.  */
>  		if (far >= 2)
>  		  {
>  		    pass_in_far (regcache, far--, val);
> @@ -972,23 +989,23 @@ loongarch_push_dummy_call (struct gdbarch *gdbarch,
>  		  }
>  		else
>  		  {
> -		    pass_on_stack (regcache, val, len, align);
> +		    pass_on_stack (regcache, val, len, align, &addr);
>  		  }
>  	      }
>  	    else if (target_len == regsize)
>  	      {
>  		/* The complex with two double members
> -		 * is passed in a pair of available FAR,
> -		 * with the low-order bits in the lower-numbered FAR
> -		 * and the high-order bits in the higher-numbered FAR.
> -		 * If no a pair of available FAR,
> -		 * it's passed in a pair of available GAR,
> -		 * with the low-order bits in the lower-numbered GAR
> -		 * and the high-order bits in the higher-numbered GAR.
> -		 * If only one GAR is available,
> -		 * the low-order bits are in the GAR
> -		 * and the high-order bits are on stack,
> -		 * and passed on the stack if no GAR is available.  */
> +		   is passed in a pair of available FAR,
> +		   with the low-order bits in the lower-numbered FAR
> +		   and the high-order bits in the higher-numbered FAR.
> +		   If no a pair of available FAR,
> +		   it's passed in a pair of available GAR,
> +		   with the low-order bits in the lower-numbered GAR
> +		   and the high-order bits in the higher-numbered GAR.
> +		   If only one GAR is available,
> +		   the low-order bits are in the GAR
> +		   and the high-order bits are on stack,
> +		   and passed on the stack if no GAR is available.  */
>  		{
>  		  if (far >= 2)
>  		    {
> @@ -1003,27 +1020,27 @@ loongarch_push_dummy_call (struct gdbarch *gdbarch,
>  		  else if (gar == 1)
>  		    {
>  		      pass_in_gar (regcache, gar--, val);
> -		      pass_on_stack (regcache, val + align, len - align, align);
> +		      pass_on_stack (regcache, val + align, len - align, align, &addr);
>  		    }
>  		  else
>  		    {
> -		      pass_on_stack (regcache, val, len, align);
> +		      pass_on_stack (regcache, val, len, align, &addr);
>  		    }
>  		}
>  	      }
>  	    else if (target_len == 2 * regsize)
>  	      {
>  		/* The complex with two long double members
> -		 * is passed by reference and are replaced in the argument list with the address.
> -	         * If there is an available GAR, the reference is passed in the GAR,
> -	         * and passed on the stack if no GAR is available.  */
> +		   is passed by reference and are replaced in the argument list with the address.
> +	           If there is an available GAR, the reference is passed in the GAR,
> +	           and passed on the stack if no GAR is available.  */
>  		sp = align_down (sp - len, 16);
>  		write_memory (sp, val, len);
>  
>  		if (gar > 0)
>  		  pass_in_gar (regcache, gar--, (const gdb_byte *) &sp);
>  		else
> -		  pass_on_stack (regcache, (const gdb_byte*) &sp, regsize, regsize);
> +		  pass_on_stack (regcache, (const gdb_byte*) &sp, regsize, regsize, &addr);
>  	      }
>  	  }
>  	  break;
> -- 
> 2.1.0


      reply	other threads:[~2022-07-18 14:05 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-07-16 11:55 Tiezhu Yang
2022-07-18 14:04 ` Andrew Burgess [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87wncaqzy1.fsf@redhat.com \
    --to=aburgess@redhat.com \
    --cc=gdb-patches@sourceware.org \
    --cc=tom@tromey.com \
    --cc=yangtiezhu@loongson.cn \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).