From: Michael Snyder <msnyder@redhat.com>
To: "David S. Miller" <davem@redhat.com>
Cc: gdb-patches@sources.redhat.com
Subject: Re: [RFA] Improve Sparc epilogue analysis
Date: Thu, 25 Apr 2002 14:25:00 -0000 [thread overview]
Message-ID: <3CC87185.11B95364@redhat.com> (raw)
In-Reply-To: <20020424.190051.45060038.davem@redhat.com>
"David S. Miller" wrote:
>
> Ok, broken apart. He is a smaller chunk this time.
>
> We use line debugging information, if possible, to determine
> the end of the instructions that compose the prologue of a
> function on Sparc. examine_prologue is used as a backup in
> this case, if we cannot fetch the necessary debugging information.
>
> Here is how I modified sparc_skip_prologue:
>
> It is only called every with it's frameless_p
> argument set to zero, so this argument is removed.
>
> We check for a symtab_and_line, if it does not compose
> the whole function and the start_pc given to us is
> within the range, we return the end of the symtab_and_line
> which should be the end of the prologue.
>
> Else we fall back to the current behavior, which is to
> interrogate the instructions by hand to determine the
> bounds of the prologue.
>
> Also, we had two functions doing the same thing, one for multi-arch
> and one for the non-multiarch case of the same exact interface.
> So I killed one of them.
>
> Finally, I call examine_prologue directly from
> sparc_prologue_frameless_p() instead of going through
> sparc_skip_prologue(). This way there doesn't need to be an
> "if (frameless_p)" test guarding the symbol table prologue stuff. We
> can tackle trying to use symbol table information in
> sparc_prologue_frameless_p() in a future patch.
This patch is approved. Thank you.
> 2002-04-24 David S. Miller <davem@redhat.com>
>
> * sparc-tdep.c (sparc_gdbarch_skip_prologue): Kill, duplicates
> sparc_skip_prologue.
> (sparc_skip_prologue): Kill frameless_p arg, and use line number
> information to find prologue when possible.
> (sparc_prologue_frameless_p): Call examine_prologue directly.
> (sparc_gdbarch_init): Update set_gdbarch_skip_prologue call.
> * config/sparc/tm-sparc.h (sparc_skip_prologue): Update for killed
> second argument.
> (SKIP_PROLOGUE): Likewise.
>
> --- ./config/sparc/tm-sparc.h.~1~ Sun Apr 21 19:18:59 2002
> +++ ./config/sparc/tm-sparc.h Wed Apr 24 17:54:53 2002
> @@ -250,8 +250,8 @@ extern int sparc_intreg_size (void);
> /* Advance PC across any function entry prologue instructions
> to reach some "real" code. */
>
> -extern CORE_ADDR sparc_skip_prologue (CORE_ADDR, int);
> -#define SKIP_PROLOGUE(PC) sparc_skip_prologue (PC, 0)
> +extern CORE_ADDR sparc_skip_prologue (CORE_ADDR);
> +#define SKIP_PROLOGUE(PC) sparc_skip_prologue (PC)
>
> /* Immediately after a function call, return the saved pc.
> Can't go through the frames for this because on some machines
> --- ./sparc-tdep.c.~1~ Wed Apr 24 17:52:27 2002
> +++ ./sparc-tdep.c Wed Apr 24 19:04:51 2002
> @@ -685,10 +685,28 @@ examine_prologue (CORE_ADDR start_pc, in
> return pc;
> }
>
> +/* Advance PC across any function entry prologue instructions to reach
> + some "real" code. */
> +
> CORE_ADDR
> -sparc_skip_prologue (CORE_ADDR start_pc, int frameless_p)
> +sparc_skip_prologue (CORE_ADDR start_pc)
> {
> - return examine_prologue (start_pc, frameless_p, NULL, NULL);
> + struct symtab_and_line sal;
> + CORE_ADDR func_start, func_end;
> +
> + /* This is the preferred method, find the end of the prologue by
> + using the debugging information. */
> + if (find_pc_partial_function (start_pc, NULL, &func_start, &func_end))
> + {
> + sal = find_pc_line (func_start, 0);
> +
> + if (sal.end < func_end
> + && start_pc <= sal.end)
> + return sal.end;
> + }
> +
> + /* Oh well, examine the code by hand. */
> + return examine_prologue (start_pc, 0, NULL, NULL);
> }
>
> /* Is the prologue at IP frameless? */
> @@ -696,7 +714,7 @@ sparc_skip_prologue (CORE_ADDR start_pc,
> int
> sparc_prologue_frameless_p (CORE_ADDR ip)
> {
> - return ip == sparc_skip_prologue (ip, 1);
> + return ip == examine_prologue (ip, 1, NULL, NULL);
> }
>
> /* Check instruction at ADDR to see if it is a branch.
> @@ -2784,15 +2802,6 @@ sparc64_register_byte (int regno)
> return 64 * 8 + (regno - 80) * 8;
> }
>
> -/* Advance PC across any function entry prologue instructions to reach
> - some "real" code. */
> -
> -static CORE_ADDR
> -sparc_gdbarch_skip_prologue (CORE_ADDR ip)
> -{
> - return examine_prologue (ip, 0, NULL, NULL);
> -}
> -
> /* Immediately after a function call, return the saved pc.
> Can't go through the frames for this because on some machines
> the new frame is not set up until the new function executes
> @@ -2993,7 +3002,7 @@ sparc_gdbarch_init (struct gdbarch_info
> set_gdbarch_saved_pc_after_call (gdbarch, sparc_saved_pc_after_call);
> set_gdbarch_prologue_frameless_p (gdbarch, sparc_prologue_frameless_p);
> set_gdbarch_short_bit (gdbarch, 2 * TARGET_CHAR_BIT);
> - set_gdbarch_skip_prologue (gdbarch, sparc_gdbarch_skip_prologue);
> + set_gdbarch_skip_prologue (gdbarch, sparc_skip_prologue);
> set_gdbarch_sp_regnum (gdbarch, SPARC_SP_REGNUM);
> set_gdbarch_use_generic_dummy_frames (gdbarch, 0);
> set_gdbarch_write_pc (gdbarch, generic_target_write_pc);
prev parent reply other threads:[~2002-04-25 21:25 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-04-20 0:31 David S. Miller
2002-04-23 12:32 ` Michael Snyder
2002-04-24 0:09 ` David S. Miller
2002-04-24 16:27 ` Michael Snyder
2002-04-24 17:15 ` David S. Miller
2002-04-24 17:48 ` Michael Snyder
2002-04-24 17:54 ` David S. Miller
2002-04-24 18:02 ` David S. Miller
2002-04-25 14:11 ` Michael Snyder
2002-04-25 18:33 ` David S. Miller
2002-04-24 18:15 ` David S. Miller
2002-04-24 22:10 ` Eli Zaretskii
2002-04-25 11:44 ` Michael Snyder
2002-04-25 14:16 ` Michael Snyder
2002-04-25 18:38 ` David S. Miller
2002-04-24 19:10 ` David S. Miller
2002-04-25 14:25 ` Michael Snyder [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=3CC87185.11B95364@redhat.com \
--to=msnyder@redhat.com \
--cc=davem@redhat.com \
--cc=gdb-patches@sources.redhat.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