Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Andy Wingo <wingo@igalia.com>
To: Alexander Smundak <asmundak@google.com>
Cc: Doug Evans <dje@google.com>,  gdb-patches <gdb-patches@sourceware.org>
Subject: Re: [RFC] [PATCH] Provide the ability to write the frame unwinder in Python
Date: Mon, 16 Mar 2015 11:29:00 -0000	[thread overview]
Message-ID: <87ioe1dvu2.fsf@igalia.com> (raw)
In-Reply-To: <CAHQ51u60nHp1a2DXZ4srvRefyTtge1BUw7-=JuYqChHN_wUGyQ@mail.gmail.com>	(Alexander Smundak's message of "Wed, 11 Mar 2015 11:48:21 -0700")

Hi :)

[-pmuldoon as he has already given an LGTM]

On Wed 11 Mar 2015 19:48, Alexander Smundak <asmundak@google.com> writes:

>> What do you think about merging the SnifferInfo and UnwindInfo objects
>> into an EphemeralFrame object?  It would be nice to use the same nouns
>> on the Guile and Python sides.
>
> I prefer the separation of the input (SnifferInfo) and output (UnwindInfo).
> I am surprised someone from Guile side is advocating stateful interface :-)

I know what you mean, but because there should be a link between them --
in that saved register set should be checked for validity against the
architecture of the incoming frame -- then given that, joining them
makes sense to me.  Otherwise you'd have to pass the SnifferInfo to the
UnwindInfo constructor, which would be fine but what if we could avoid
it by joining them...

And then there's the question of what do you call the two things --
SnifferInfo is a bad name, for starters.  It's a frame, albeit some
ephemeral kind of frame.  It's literally a struct frame_info* under the
hood.  Currently you can read a register, but you might want to do other
frame things on it -- get_next_frame, get_frame_arch,
frame_relative_level, etc.  WDYT about the name EphemeralFrame ?

> In fact, I'd rather avoid having modifiable UnwindInfo at all -- a sniffer can
> return a 2-tuple of (<previous frame registers>, <FrameId instance>),
> where FrameId instance can be created by a class method
> gdb.SnifferInfo.frame_id_build_xxx(). Can we agree on that?

Regarding the return value, I think returning a 2-tuple is a bad idea
for all of the reasons I have previously mentioned and which you have
not responded to :)

  * bad error reporting (e.g. gdb.Value width doesn't match register
    width, how to map that back to some source location or program
    state)

  * bad extensibility (e.g. what about stop_reason?  what about other
    register states?)

  * bad ergonomics (is the frame id first, or is it the saved
    registers?)

On the other hand to have to give a name the result object is painful
too -- "this is an UnwindInfo and it is composed of blah blah".  For
that reason I joined the result with the ephemeral frame object, to
avoid introducing another concept.  But checking "did this unwinder
succeed" via "did the unwinder set the frame ID on this ephemeral frame"
is not nice either.

How about let's meet somewhat halfway.

  * We rename SnifferInfo to EphemeralFrame.

  * Unwinders return UnwindInfo (better name welcome) on success or
    None/#f otherwise

    * UnwindInfo takes EphemeralFrame as constructor arg

      - the EphemeralFrame must be valid

      - in practice there is only ever one EphemeralFrame alive because
        unwinding is not recursive

    * UnwindInfo also takes frame ID as positional constructor args

      - setting frame_id is the only thing an unwinder *must* do, so
        this makes an invariant "if return value is an UnwindInfo, then
        it is valid and has all necessary info"

    * UnwindInfo has add_saved_register() API (see discussion with Pedro
      here: http://article.gmane.org/gmane.comp.gdb.patches/105538)

  * After accepting an UnwindInfo as an unwinder return result,
    py-unwinders.c / scm-frame-unwinders.c marks the UnwindInfo as
    frozen so that add_saved_register() etc can't alter the state

  * continuation of unwinder call also checks that the ephemeral frame
    on the unwindinfo is valid

Example of use:

   def unwind(frame):
       if we_can_handle(frame):
           var ret = UnwindInfo(frame, fp, pc)
           ret.add_saved_register(r0)
           return ret

I will rework the Guile patch along these lines, and then hopefully I am
done reworking :)

Andy


  reply	other threads:[~2015-03-16 11:29 UTC|newest]

Thread overview: 60+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-12-15 18:14 Alexander Smundak
2014-12-22 19:24 ` Alexander Smundak
2014-12-29 18:02   ` Alexander Smundak
2015-01-05 17:53     ` Alexander Smundak
2015-01-12 20:03       ` Alexander Smundak
2015-01-22  3:31         ` Alexander Smundak
2015-01-29  1:36           ` Alexander Smundak
2015-01-12 21:00 ` Simon Marchi
2015-01-12 21:22   ` Doug Evans
2015-02-04 22:36 ` Doug Evans
2015-02-12 17:58   ` Alexander Smundak
2015-02-19  2:32     ` Alexander Smundak
2015-02-20 11:12     ` Phil Muldoon
2015-02-26  3:09       ` Alexander Smundak
2015-03-02 22:56         ` Alexander Smundak
2015-03-03  8:46           ` Andy Wingo
2015-03-04  2:36             ` Alexander Smundak
2015-03-04  7:49               ` Andy Wingo
2015-03-09 11:02                 ` Phil Muldoon
2015-03-11  2:22                   ` Alexander Smundak
2015-03-11  8:49                     ` Andy Wingo
2015-03-11 17:34                       ` Doug Evans
2015-03-11 18:48                       ` Alexander Smundak
2015-03-16 11:29                         ` Andy Wingo [this message]
2015-03-16 12:01                           ` Andy Wingo
2015-03-16 17:25                           ` Alexander Smundak
2015-03-17  8:57                             ` Andy Wingo
2015-03-17 19:48                               ` Alexander Smundak
2015-03-17 21:37                                 ` Alexander Smundak
2015-03-18  8:54                                   ` Andy Wingo
2015-03-18 22:57                                     ` Alexander Smundak
2015-03-23 19:58                                       ` Doug Evans
2015-03-24  9:06                                         ` Andy Wingo
2015-03-26  3:31                                         ` Alexander Smundak
2015-03-26 18:53                                           ` Eli Zaretskii
2015-03-27 22:29                                           ` Doug Evans
2015-03-28  1:10                                             ` Alexander Smundak
2015-03-30 17:45                                               ` Doug Evans
2015-03-30 19:49                                                 ` Alexander Smundak
2015-03-31 22:36                                                   ` Doug Evans
2015-04-01  0:09                                                     ` Alexander Smundak
2015-04-01  0:28                                                       ` Doug Evans
2015-03-18 23:25                                 ` Doug Evans
2015-03-19  0:36                                   ` Alexander Smundak
2015-03-19  8:12                                     ` Andy Wingo
2015-03-20  0:15                                       ` Doug Evans
2015-03-20  2:27                                         ` Alexander Smundak
2015-03-20 17:48                                           ` Doug Evans
2015-03-20  8:26                                         ` Andy Wingo
2015-03-20 18:32                                           ` Doug Evans
2015-03-17 22:21                               ` Doug Evans
2015-03-18  8:57                                 ` Andy Wingo
2015-03-18 16:48                                   ` Doug Evans
2015-03-19  8:04                                     ` Andy Wingo
2015-03-09  9:42           ` Andy Wingo
2015-03-03  0:49         ` Alexander Smundak
2015-03-03 14:38           ` Andy Wingo
2015-03-04  2:52             ` Alexander Smundak
2015-02-20  9:42 ` Phil Muldoon
2015-02-20  9:59   ` Phil Muldoon

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=87ioe1dvu2.fsf@igalia.com \
    --to=wingo@igalia.com \
    --cc=asmundak@google.com \
    --cc=dje@google.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