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++)
>
next prev parent 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