Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
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);


      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