Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Daniel Jacobowitz <drow@false.org>
To: "Nathan J. Williams" <nathanw@wasabisystems.com>
Cc: Jim Blandy <jimb@redhat.com>, gdb-patches@sourceware.org
Subject: Re: RFA: general prologue analysis framework
Date: Fri, 07 Oct 2005 21:30:00 -0000	[thread overview]
Message-ID: <20051007213028.GA2371@nevyn.them.org> (raw)
In-Reply-To: <mtu8xx5rped.fsf@scrubbing-bubbles.mit.edu>

On Fri, Oct 07, 2005 at 05:24:58PM -0400, Nathan J. Williams wrote:
> Short form: "What about branches?"

Short answer: You're out of luck.  Prologue analysis can't do this.

> Long form: I recently did a port for a target CPU whose compiler
> didn't provide any debug information about the stack frame. I dug out
> their sizes at any given point by examining the code from the function
> entry point to the current PC, and tracking the values added or
> subtracted to the SP (said compiler also did not believe in adjusting
> the SP once on function entry, and didn't gave a frame
> pointer). However, I was tripped up by code kind of like:
> 
>    ; function entry
>    add sp,-64
> 
>    ...
>    ...
>    beq 1f
> 
>    add sp, 64
>    ret
> 
> 1: ...
> 
>    ...
>    add sp, 64
>    ret
> 
> When my analyzer linearly plowed through the code, it would have
> computed the net frame size as 0 at point 1, which was wrong. I worked
> around this by ignoring sp adjustments right before a return
> instruction, but it was clunky. I wanted to implement a computation of
> the stack offset at each point in the function, but didn't have
> time. Would this framework be amenable to maintaining such a mapping?

Longer answer:

This trivial example, sure, we could extend GDB to handle.  But in fact
I don't think it's a very useful example.  Basic blocks can have more
than one incoming edge, and more than one outgoing edge; reconstructing
the control flow useful is not practical.

If you're guaranteed that the compiler only adjusts the stack pointer
by constant amounts, either in the prologue or down and then up again
within a basic block, maybe it would be useful.  But very few compilers
behave that way.

Did your compiler really give you that guarantee?

-- 
Daniel Jacobowitz
CodeSourcery, LLC


  reply	other threads:[~2005-10-07 21:30 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-10-07 20:39 Jim Blandy
2005-10-07 21:25 ` Nathan J. Williams
2005-10-07 21:30   ` Daniel Jacobowitz [this message]
2005-10-07 21:41     ` Nathan J. Williams
2005-10-08  7:02       ` Jim Blandy
2005-10-08  7:01   ` Jim Blandy
2005-10-08 16:00     ` Daniel Jacobowitz
2005-10-09 20:27 ` Daniel Jacobowitz
2005-10-13  0:20   ` Jim Blandy
2005-10-13  1:04     ` Daniel Jacobowitz
2005-10-13 13:50     ` Ulrich Weigand
2005-10-13 17:17       ` Jim Blandy
2005-10-13 17:48         ` Ulrich Weigand
2005-10-13 18:03           ` Daniel Jacobowitz
2005-10-14 18:13           ` Jim Blandy
2005-10-17 18:52             ` Ulrich Weigand
2005-10-17 20:28               ` Jim Blandy
2005-11-23  2:56                 ` Ulrich Weigand
2005-10-15 12:12 ` Eli Zaretskii
2005-10-17 20:32   ` Jim Blandy
2005-10-19  8:55     ` Eli Zaretskii

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=20051007213028.GA2371@nevyn.them.org \
    --to=drow@false.org \
    --cc=gdb-patches@sourceware.org \
    --cc=jimb@redhat.com \
    --cc=nathanw@wasabisystems.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