Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Maxim Grigoriev <maxim@tensilica.com>
To: Markus Deuling <deuling@de.ibm.com>
Cc: GDB Patches <gdb-patches@sourceware.org>,
	  Maxim Grigoriev <maxim@tensilica.com>,
	 Ulrich Weigand <uweigand@de.ibm.com>
Subject: Re: [rfc] [05/05] Get rid of current_gdbarch in xtensa
Date: Fri, 09 Nov 2007 07:47:00 -0000	[thread overview]
Message-ID: <47341009.4090709@hq.tensilica.com> (raw)
In-Reply-To: <4733F6E2.90305@de.ibm.com>

Hi Markus,

 >> Ok to commit?

Xtensa testing looks fine on this update.
Unless there are any other issues, please, go ahead and check it in.

Thanks,
-- Maxim


Markus Deuling wrote:
> Maxim Grigoriev schrieb:
>> Ulrich Weigand wrote:
>>> Markus Deuling wrote:
>>>  
>>>> -#define AREG_NUMBER(r, wb) \
>>>> -  ((((r) - (gdbarch_tdep (current_gdbarch)->a0_base + 0) + (((wb) \
>>>> -  & ((gdbarch_tdep (current_gdbarch)->num_aregs - 1) >> 2)) << 
>>>> WB_SHIFT)) & \
>>>> -  (gdbarch_tdep (current_gdbarch)->num_aregs - 1)) \
>>>> -  + gdbarch_tdep (current_gdbarch)->ar_base)
>>>>     +/* Convert a live Ax register number to the corresponding Areg 
>>>> number.  */
>>>> +static int
>>>> +areg_number (struct gdbarch *gdbarch, int regnum, ULONGEST wb)
>>>> +{
>>>> +  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
>>>> +  int areg;
>>>> +
>>>> +  areg = regnum - tdep->a0_base + tdep->ar_base;
>>>> +  areg += (wb & ((tdep->num_aregs - 1) >> 2)) << WB_SHIFT;
>>>> +  areg &= tdep->num_aregs - 1;
>>>> +
>>>> +  return areg;
>>>> +}
>>>>     
>>>
>>> The function does not look equivalent to the macro, that should be
>>>
>>>   areg = regnum - tdep->a0_base;
>>>   areg += (wb & ((tdep->num_aregs - 1) >> 2)) << WB_SHIFT;
>>>   areg &= tdep->num_aregs - 1;
>>>
>>>   return areg + tdep->ar_base;
>>>   
>> Ulrich is right. The function should look like he suggested :
>>
>> static int
>> areg_number (struct gdbarch *gdbarch, int regnum, ULONGEST wb)
>> {
>>  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
>>  int areg;
>>
>>  areg = regnum - tdep->a0_base;
>>  areg += (wb & ((tdep->num_aregs - 1) >> 2)) << WB_SHIFT;
>>  areg &= tdep->num_aregs - 1;
>>
>>  return areg + tdep->ar_base;
>> }
>>
>> I applied Markus's patch, corrected areg_number(), and ran GDB 
>> dejagnu tests.
>> No regression has been detected.
>>
>> -- Maxim
>
> Uli,
> Maxim,
>
> thank you very much for your review and test. I changed areg_number 
> like suggested. Attached
> is the new version of the patch. ChangeLog stays the same.
>
> Ok to commit?
>
>
> ------------------------------------------------------------------------
>
> diff -urpN src/gdb/xtensa-tdep.c dev/gdb/xtensa-tdep.c
> --- src/gdb/xtensa-tdep.c	2007-11-07 07:33:01.000000000 +0100
> +++ dev/gdb/xtensa-tdep.c	2007-11-09 06:55:15.000000000 +0100
> @@ -78,7 +78,6 @@ static int xtensa_debug_level = 0;
>  
>  /* On Windowed ABI, we use a6 through a11 for passing arguments
>     to a function called by GDB because CALL4 is used.  */
> -#define ARGS_FIRST_REG		gdbarch_tdep (current_gdbarch)->a0_base + 6
>  #define ARGS_NUM_REGS		6
>  #define REGISTER_SIZE		4
>  
> @@ -89,21 +88,14 @@ static int xtensa_debug_level = 0;
>  #define CALLINC(ps)		(((ps) & PS_CALLINC_MASK) >> PS_CALLINC_SHIFT)
>  #define WINSIZE(ra)		(4 * (( (ra) >> 30) & 0x3))
>  
> -
> -/* Convert a live Ax register number to the corresponding Areg number.  */
> -#define AREG_NUMBER(r, wb) \
> -  ((((r) - (gdbarch_tdep (current_gdbarch)->a0_base + 0) + (((wb) \
> -  & ((gdbarch_tdep (current_gdbarch)->num_aregs - 1) >> 2)) << WB_SHIFT)) & \
> -  (gdbarch_tdep (current_gdbarch)->num_aregs - 1)) \
> -  + gdbarch_tdep (current_gdbarch)->ar_base)
> -
>  /* ABI-independent macros.  */
> -#define ARG_NOF	    (gdbarch_tdep (current_gdbarch)->call_abi \
> -		      == CallAbiCall0Only ? C0_NARGS : (ARGS_NUM_REGS))
> -#define ARG_1ST	    (gdbarch_tdep (current_gdbarch)->call_abi \
> -		      == CallAbiCall0Only \
> -		    ? (gdbarch_tdep (current_gdbarch)->a0_base + 0) + C0_ARGS \
> -		      : (ARGS_FIRST_REG))
> +#define ARG_NOF(gdbarch) \
> +  (gdbarch_tdep (gdbarch)->call_abi \
> +   == CallAbiCall0Only ? C0_NARGS : (ARGS_NUM_REGS))
> +#define ARG_1ST(gdbarch) \
> +  (gdbarch_tdep (gdbarch)->call_abi  == CallAbiCall0Only \
> +   ? (gdbarch_tdep (gdbarch)->a0_base + 0) + C0_ARGS \
> +   : (gdbarch_tdep (gdbarch)->a0_base + 6))
>  
>  extern struct gdbarch_tdep *xtensa_config_tdep (struct gdbarch_info *);
>  extern int xtensa_config_byte_order (struct gdbarch_info *);
> @@ -112,8 +104,8 @@ extern int xtensa_config_byte_order (str
>  /* XTENSA_IS_ENTRY tests whether the first byte of an instruction
>     indicates that the instruction is an ENTRY instruction.  */
>  
> -#define XTENSA_IS_ENTRY(op1) \
> -  ((gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG) \
> +#define XTENSA_IS_ENTRY(gdbarch, op1) \
> +  ((gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG) \
>     ? ((op1) == 0x6c) : ((op1) == 0x36))
>  
>  #define XTENSA_ENTRY_LENGTH	3
> @@ -125,6 +117,20 @@ extern int xtensa_config_byte_order (str
>  #define PS_WOE			(1<<18)
>  #define PS_EXC			(1<<4)
>  
> +/* Convert a live Ax register number to the corresponding Areg number.  */
> +static int
> +areg_number (struct gdbarch *gdbarch, int regnum, ULONGEST wb)
> +{
> +  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  int areg;
> +
> +  areg = regnum - tdep->a0_base;
> +  areg += (wb & ((tdep->num_aregs - 1) >> 2)) << WB_SHIFT;
> +  areg &= tdep->num_aregs - 1;
> +
> +  return areg + tdep->ar_base;
> +}
> +
>  static inline int
>  windowing_enabled (CORE_ADDR ps)
>  {
> @@ -143,7 +149,7 @@ windowing_enabled (CORE_ADDR ps)
>     method to call the inferior function.  */
>  
>  static int
> -extract_call_winsize (CORE_ADDR pc)
> +extract_call_winsize (struct gdbarch *gdbarch, CORE_ADDR pc)
>  {
>    int winsize = 4;
>    int insn;
> @@ -163,7 +169,7 @@ extract_call_winsize (CORE_ADDR pc)
>         call{0,4,8,12}   0101 || {00,01,10,11} || OFFSET
>         callx{0,4,8,12}  0000 || {00,01,10,11} || 11 || OFFSET.  */
>  
> -  if (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_LITTLE)
> +  if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_LITTLE)
>      {
>        if (((insn & 0xf) == 0x5) || ((insn & 0xcf) == 0xc0))
>  	winsize = (insn & 0x30) >> 2;   /* 0, 4, 8, 12.  */
> @@ -514,7 +520,7 @@ xtensa_pseudo_register_read (struct gdba
>        gdb_byte *buf = (gdb_byte *) alloca (MAX_REGISTER_SIZE);
>  
>        regcache_raw_read (regcache, gdbarch_tdep (gdbarch)->wb_regnum, buf);
> -      regnum = AREG_NUMBER (regnum, extract_unsigned_integer (buf, 4));
> +      regnum = areg_number (gdbarch, regnum, extract_unsigned_integer (buf, 4));
>      }
>  
>    /* We can always read non-pseudo registers.  */
> @@ -600,7 +606,7 @@ xtensa_pseudo_register_write (struct gdb
>  
>        regcache_raw_read (regcache,
>  			 gdbarch_tdep (gdbarch)->wb_regnum, buf);
> -      regnum = AREG_NUMBER (regnum, extract_unsigned_integer (buf, 4));
> +      regnum = areg_number (gdbarch, regnum, extract_unsigned_integer (buf, 4));
>      }
>  
>    /* We can always write 'core' registers.
> @@ -1061,7 +1067,7 @@ xtensa_frame_cache (struct frame_info *n
>        ps = frame_unwind_register_unsigned (next_frame, ps_regnum);
>  
>        op1 = read_memory_integer (pc, 1);
> -      if (XTENSA_IS_ENTRY (op1))
> +      if (XTENSA_IS_ENTRY (gdbarch, op1))
>  	{
>  	  int callinc = CALLINC (ps);
>  	  ra = frame_unwind_register_unsigned
> @@ -1135,8 +1141,8 @@ xtensa_frame_cache (struct frame_info *n
>  	  else
>  	    {
>  	      /* Read caller's frame SP directly from the previous window.  */
> -	      int regnum = AREG_NUMBER
> -			     (gdbarch_tdep (gdbarch)->a0_base + 1,
> +	      int regnum = areg_number
> +			     (gdbarch, gdbarch_tdep (gdbarch)->a0_base + 1,
>  			      cache->wd.wb);
>  
>  	      cache->prev_sp = xtensa_read_register (regnum);
> @@ -1290,7 +1296,7 @@ xtensa_frame_prev_register (struct frame
>        /* Convert A-register numbers to AR-register numbers.  */
>        if (regnum >= gdbarch_tdep (gdbarch)->a0_base + 0
>            && regnum <= gdbarch_tdep (gdbarch)->a0_base + 15)
> -	regnum = AREG_NUMBER (regnum, cache->wd.wb);
> +	regnum = areg_number (gdbarch, regnum, cache->wd.wb);
>  
>        /* Check if AR-register has been saved to stack.  */
>        if (regnum >= gdbarch_tdep (gdbarch)->ar_base
> @@ -1417,7 +1423,7 @@ xtensa_extract_return_value (struct type
>      {
>        /* First, we have to find the caller window in the register file.  */
>        regcache_raw_read_unsigned (regcache, gdbarch_pc_regnum (gdbarch), &pc);
> -      callsize = extract_call_winsize (pc);
> +      callsize = extract_call_winsize (gdbarch, pc);
>  
>        /* On Xtensa, we can return up to 4 words (or 2 for call12).  */
>        if (len > (callsize > 8 ? 8 : 16))
> @@ -1428,7 +1434,8 @@ xtensa_extract_return_value (struct type
>  	 register (A2) in the caller window.  */
>        regcache_raw_read_unsigned
>  	(regcache, gdbarch_tdep (gdbarch)->wb_regnum, &wb);
> -      areg = AREG_NUMBER(gdbarch_tdep (gdbarch)->a0_base + 2 + callsize, wb);
> +      areg = areg_number (gdbarch,
> +			  gdbarch_tdep (gdbarch)->a0_base + 2 + callsize, wb);
>      }
>    else
>      {
> @@ -1471,13 +1478,14 @@ xtensa_store_return_value (struct type *
>        regcache_raw_read_unsigned 
>  	(regcache, gdbarch_tdep (gdbarch)->wb_regnum, &wb);
>        regcache_raw_read_unsigned (regcache, gdbarch_pc_regnum (gdbarch), &pc);
> -      callsize = extract_call_winsize (pc);
> +      callsize = extract_call_winsize (gdbarch, pc);
>  
>        if (len > (callsize > 8 ? 8 : 16))
>  	internal_error (__FILE__, __LINE__,
>  			_("unimplemented for this length: %d"),
>  			TYPE_LENGTH (type));
> -      areg = AREG_NUMBER (gdbarch_tdep (gdbarch)->a0_base + 2 + callsize, wb);
> +      areg = areg_number (gdbarch,
> +			  gdbarch_tdep (gdbarch)->a0_base + 2 + callsize, wb);
>  
>        DEBUGTRACE ("[xtensa_store_return_value] callsize %d wb %d\n",
>                callsize, (int) wb);
> @@ -1658,7 +1666,7 @@ xtensa_push_dummy_call (struct gdbarch *
>        size = (size + info->align - 1) & ~(info->align - 1);
>        onstack_size = (onstack_size + info->align - 1) & ~(info->align - 1);
>  
> -      if (size + info->length > REGISTER_SIZE * ARG_NOF)
> +      if (size + info->length > REGISTER_SIZE * ARG_NOF (gdbarch))
>  	{
>  	  info->onstack = 1;
>  	  info->u.offset = onstack_size;
> @@ -1667,7 +1675,7 @@ xtensa_push_dummy_call (struct gdbarch *
>        else
>  	{
>  	  info->onstack = 0;
> -	  info->u.regno = ARG_1ST + size / REGISTER_SIZE;
> +	  info->u.regno = ARG_1ST (gdbarch) + size / REGISTER_SIZE;
>  	}
>        size += info->length;
>      }
> @@ -1688,7 +1696,7 @@ xtensa_push_dummy_call (struct gdbarch *
>    if (struct_return)
>      {
>        store_unsigned_integer (buf, REGISTER_SIZE, struct_addr);
> -      regcache_cooked_write (regcache, ARG_1ST, buf);
> +      regcache_cooked_write (regcache, ARG_1ST (gdbarch), buf);
>      }
>  
>    for (i = 0; i < nargs; i++)
>   


  reply	other threads:[~2007-11-09  7:47 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-11-07 11:13 Markus Deuling
2007-11-08 21:55 ` Ulrich Weigand
2007-11-08 22:18   ` Daniel Jacobowitz
2007-11-08 22:30     ` Maxim Grigoriev
2007-11-09  2:12   ` Maxim Grigoriev
2007-11-09  5:59     ` Markus Deuling
2007-11-09  7:47       ` Maxim Grigoriev [this message]
2007-11-09 13:13     ` Ulrich Weigand
2007-11-12  6:44       ` Markus Deuling

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=47341009.4090709@hq.tensilica.com \
    --to=maxim@tensilica.com \
    --cc=deuling@de.ibm.com \
    --cc=gdb-patches@sourceware.org \
    --cc=uweigand@de.ibm.com \
    /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