From: Kevin Buettner <kevinb@redhat.com>
To: gdb-patches@sourceware.org
Subject: Re: [PATCH, FT32] Correctly interpret function prologs
Date: Thu, 01 Oct 2015 00:35:00 -0000 [thread overview]
Message-ID: <20150930173548.1be446d4@pinnacle.lan> (raw)
In-Reply-To: <CA9BBF0458F83C4F9051448B941B57D11A265D31@glaexch1>
Hi James,
See my comments inline with your patch below.
On Tue, 29 Sep 2015 16:38:57 +0000
James Bowman <james.bowman@ftdichip.com> wrote:
> The stack unwinder did not understand the function prologs
> generated by gcc with -Os. Add code to recognize and interpret the
> prolog calls.
>
> OK to apply?
>
>
> 2015-09-29 James Bowman <james.bowman@ftdichip.com>
>
> * ft32-tdep.c (ft32_analyze_prologue): Add function prolog
> subroutine handling.
>
> diff --git a/gdb/ft32-tdep.c b/gdb/ft32-tdep.c
> index 00cf847..0b51af3 100644
> --- a/gdb/ft32-tdep.c
> +++ b/gdb/ft32-tdep.c
> @@ -164,33 +164,66 @@ ft32_analyze_prologue (CORE_ADDR start_addr, CORE_ADDR end_addr,
> CORE_ADDR next_addr;
> ULONGEST inst, inst2;
> LONGEST offset;
> - int regnum;
> + int regnum, pushreg;
> + struct bound_minimal_symbol msymbol;
> + unsigned prologs[32];
I think that the type of prologs[] should be CORE_ADDR instead of `unsigned'.
>
> cache->saved_regs[FT32_PC_REGNUM] = 0;
> cache->framesize = 0;
>
I think it'd be useful to have a brief comment somewhere in here
describing what a call to __prolog_$rN does. I'm guessing that
these functions push a number of registers. It'd be useful to know,
for a given N, which registers are pushed and the order in which they're
pushed.
> + for (regnum = 0; regnum < 32; regnum++)
> + {
> + char prolog_symbol[32];
> +
> + snprintf (prolog_symbol, sizeof (prolog_symbol), "__prolog_$r%02d",
> + regnum);
> + msymbol = lookup_minimal_symbol (prolog_symbol, NULL, NULL);
> + if (msymbol.minsym)
> + prologs[regnum] = BMSYMBOL_VALUE_ADDRESS (msymbol);
> + else
> + prologs[regnum] = 0;
> + }
> +
> if (start_addr >= end_addr)
> - return end_addr;
> + return end_addr;
>
> cache->established = 0;
> - for (next_addr = start_addr; next_addr < end_addr; )
> + for (next_addr = start_addr; next_addr < end_addr;)
> {
> inst = read_memory_unsigned_integer (next_addr, 4, byte_order);
>
> if (FT32_IS_PUSH (inst))
> {
> - regnum = FT32_R0_REGNUM + FT32_PUSH_REG (inst);
> + pushreg = FT32_PUSH_REG (inst);
> cache->framesize += 4;
> - cache->saved_regs[regnum] = cache->framesize;
> + cache->saved_regs[FT32_R0_REGNUM + pushreg] = cache->framesize;
> next_addr += 4;
> }
> + else if (FT32_IS_CALL (inst))
> + {
> + for (regnum = 0; regnum < 32; regnum++)
> + {
> + if ((4 * (inst & 0x3ffff)) == prologs[regnum])
> + {
> + for (pushreg = 13; pushreg <= regnum; pushreg++)
This looks strange to me. The outer loop has regnum ranging from 0
thru 31. But this inner loop won't be executed for regnum values
between 0 thru 12 due to pushreg starting at 13.
Is that really what you want?
If so, it seems to me that calls to __prolog_$r01 thru __prolog_$r12
don't contribute anything to the frame. Please add a comment
about this if that's truly the case.
> + {
> + cache->framesize += 4;
> + cache->saved_regs[FT32_R0_REGNUM + pushreg] =
> + cache->framesize;
> + }
> + next_addr += 4;
> + }
> + }
> + break;
> + }
> else
> break;
> }
> for (regnum = FT32_R0_REGNUM; regnum < FT32_PC_REGNUM; regnum++)
> {
> if (cache->saved_regs[regnum] != REG_UNAVAIL)
> - cache->saved_regs[regnum] = cache->framesize - cache->saved_regs[regnum];
> + cache->saved_regs[regnum] =
> + cache->framesize - cache->saved_regs[regnum];
> }
> cache->saved_regs[FT32_PC_REGNUM] = cache->framesize;
>
next prev parent reply other threads:[~2015-10-01 0:35 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-29 16:40 James Bowman
2015-10-01 0:35 ` Kevin Buettner [this message]
2015-10-02 18:36 ` James Bowman
2015-10-02 19:26 ` Kevin Buettner
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=20150930173548.1be446d4@pinnacle.lan \
--to=kevinb@redhat.com \
--cc=gdb-patches@sourceware.org \
/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