From: Guinevere Larsen <guinevere@redhat.com>
To: Thiago Jung Bauermann <thiago.bauermann@linaro.org>
Cc: gdb-patches@sourceware.org
Subject: Re: [PATCH v5 3/5] gdb: Migrate frame unwinders to use C++ classes
Date: Wed, 9 Oct 2024 15:16:39 -0300 [thread overview]
Message-ID: <e5d8dc35-9eda-427c-9d92-74f8404cc04a@redhat.com> (raw)
In-Reply-To: <87wmiq9gr5.fsf@linaro.org>
On 10/2/24 9:23 PM, Thiago Jung Bauermann wrote:
> This looks great, thank you for considering and incorporating my
> suggestions. I agree that a number of them would make the diff harder to
> review and can be considered future improvements. But there are two
> changes which IMHO don't change the diff very much and are important
> when converting to C++. More below.
>
> Also a couple of formatting nits.
Hi Thiago,
I was apparently over-complicating the changes. You're right, they are
simple enough to add to this patch. I fixed everything you mentioned here.
--
Cheers,
Guinevere Larsen
She/Her/Hers
>
> Guinevere Larsen <guinevere@redhat.com> writes:
>
>> diff --git a/gdb/frame-unwind.c b/gdb/frame-unwind.c
>> index afc1258c6a9..7be01ec2203 100644
>> --- a/gdb/frame-unwind.c
>> +++ b/gdb/frame-unwind.c
>> @@ -332,6 +332,59 @@ frame_unwind_got_address (const frame_info_ptr &frame, int regnum,
>> return reg_val;
>> }
>>
>> +/* This method just passes the parameters to the callback pointer. */
>> +enum unwind_stop_reason
>> +frame_unwind_legacy::stop_reason (const frame_info_ptr &this_frame,
>> + void **this_prologue_cache) const
>> +{
>> + return stop_reason_p (this_frame, this_prologue_cache);
>> +}
>> +
>> +/* This method just passes the parameters to the callback pointer. */
>> +void
>> +frame_unwind_legacy::this_id (const frame_info_ptr &this_frame,
>> + void **this_prologue_cache,
>> + struct frame_id *id) const
>> +{
>> + return this_id_p (this_frame, this_prologue_cache, id);
>> +}
>> +
>> +/* This method just passes the parameters to the callback pointer. */
>> +struct value *
>> +frame_unwind_legacy::prev_register (const frame_info_ptr &this_frame,
>> + void **this_prologue_cache,
>> + int regnum) const
>> +{
>> + return prev_register_p (this_frame, this_prologue_cache, regnum);
>> +}
>> +
>> +/* This method just passes the parameters to the callback pointer. */
>> +int
>> +frame_unwind_legacy::sniffer (const struct frame_unwind *self,
>> + const frame_info_ptr &this_frame,
>> + void **this_prologue_cache) const
>> +{
>> + return sniffer_p (self, this_frame, this_prologue_cache);
>> +}
>> +
>> +/* This method just passes the parameters to the callback pointer. */
>> +void
>> +frame_unwind_legacy::dealloc_cache (frame_info *self, void *this_cache) const
>> +{
>> + if (dealloc_cache_p != nullptr)
>> + dealloc_cache_p (self, this_cache);
>> +}
>> +
>> +/* This method just passes the parameters to the callback pointer. */
>> +struct gdbarch *
>> +frame_unwind_legacy::prev_arch (const frame_info_ptr &this_frame,
>> + void **this_prologue_cache) const
>> +{
>> + if (prev_arch_p == nullptr)
>> + error (_("No prev_arch callback installed"));
>> + return prev_arch_p (this_frame, this_prologue_cache);
>> +}
> As I mentioned before, changing this to:
>
> struct gdbarch *
> frame_unwind_legacy::prev_arch (const frame_info_ptr &this_frame,
> void **this_prologue_cache) const
> {
> if (prev_arch_p == nullptr)
> return frame_unwind::prev_arch (this_frame, this_prologue_cache);
> return prev_arch_p (this_frame, this_prologue_cache);
> }
>
> and frame_unwind::prev_arch () to:
>
> virtual struct gdbarch *prev_arch (const frame_info_ptr &this_frame,
> void **this_prologue_cache) const
> {
> return get_frame_arch (this_frame);
> }
>
> Allows calling this method without the try/catch in frame_unwind_arch
> (). When class inheritance provides an adequate solution to method
> dispatch, I don't see a reason to throw and catch an exception to
> accomplish the same task.
>
> Also, the diff is simple:
>
> https://git.linaro.org/people/thiago.bauermann/binutils-gdb.git/commit/?h=review/modernize-frame-unwinders&id=88db6b3f96c3afe7b3f45525b7f786d14a89bbc5
>
> And (I could be wrong of course but) I don't see a risk for regressions,
> so I don't see a need to leave this change for a future patch.
>
>> diff --git a/gdb/frame-unwind.h b/gdb/frame-unwind.h
>> index deab4f7dbfb..b078945a200 100644
>> --- a/gdb/frame-unwind.h
>> +++ b/gdb/frame-unwind.h
>> @@ -169,25 +169,148 @@ enum frame_unwind_class
>> FRAME_UNWIND_ARCH,
>> };
>>
>> -struct frame_unwind
>> +class frame_unwind
>> {
>> - const char *name;
>> + const char *m_name;
>> /* The frame's type. Should this instead be a collection of
>> predicates that test the frame for various attributes? */
>> - enum frame_type type;
>> + enum frame_type m_type;
>> /* What kind of unwinder is this. It generally follows from where
>> the unwinder was added or where it looks for information to do the
>> unwinding. */
>> - enum frame_unwind_class unwinder_class;
>> + enum frame_unwind_class m_unwinder_class;
>> + const struct frame_data *m_unwind_data;
>> +public:
>> + frame_unwind (const char *name, frame_type type, frame_unwind_class uclass,
>> + const struct frame_data *data)
>> + : m_name (name), m_type (type), m_unwinder_class (uclass),
>> + m_unwind_data (data)
>> + { }
>> +
>> + const char *name () const
>> + {
>> + return m_name;
>> + }
>> +
>> + enum frame_type type () const
>> + {
>> + return m_type;
>> + }
>> +
>> + enum frame_unwind_class unwinder_class () const
>> + {
>> + return m_unwinder_class;
>> + }
>> +
>> + const struct frame_data *unwind_data () const
>> + {
>> + return m_unwind_data;
>> + }
>> +
>> + /* Default stop_reason function. It reports NO_REASON, unless the
>> + frame is the outermost. */
>> + virtual enum unwind_stop_reason stop_reason (const frame_info_ptr &this_frame,
>> + void **this_prologue_cache) const
>> + {
>> + return default_frame_unwind_stop_reason (this_frame, this_prologue_cache);
>> + }
>> +
>> + /* Default frame sniffer. Will always return that the unwinder
>> + is able to unwind the frame. */
>> + virtual int sniffer (const frame_unwind *self,
>> + const frame_info_ptr &this_frame,
>> + void **this_prologue_cache) const
>> + {
>> + return 1;
>> + }
> The other thing I believe should be addressed in a C++ conversion is to
> avoid having a method argument which duplicates the implicit 'this'
> argument, as is the case of the 'self' argument in the sniffer ()
> method.
>
> Fortunately the diff is also small:
>
> https://git.linaro.org/people/thiago.bauermann/binutils-gdb.git/commit/?h=review/modernize-frame-unwinders&id=9555b3ae4feea0f4ff15028257716ff2c3c42732
>
> So IMHO it can be done in this patch.
>
> Also, a nit: the lines starting with "const ..." and "void ..." above
> are unaligned.
>
>> diff --git a/gdb/tramp-frame.c b/gdb/tramp-frame.c
>> index 6368f67a2e7..b1f3be66bc1 100644
>> --- a/gdb/tramp-frame.c
>> +++ b/gdb/tramp-frame.c
>> @@ -57,10 +57,45 @@ tramp_frame_cache (const frame_info_ptr &this_frame,
>> return tramp_cache->trad_cache;
>> }
>>
>> -static void
>> -tramp_frame_this_id (const frame_info_ptr &this_frame,
>> - void **this_cache,
>> - struct frame_id *this_id)
>> +class frame_unwind_trampoline : public frame_unwind
>> +{
>> +private:
>> + frame_prev_arch_ftype *prev_arch_p;
>> +public:
>> + frame_unwind_trampoline (enum frame_type t, const struct frame_data *d,
>> + frame_prev_arch_ftype *pa)
>> + : frame_unwind ("trampoline", t, FRAME_UNWIND_GDB, d), prev_arch_p (pa)
>> + { }
>> +
>> + int sniffer(const frame_unwind *self, const frame_info_ptr &this_frame,
>> + void **this_prologue_cache) const override;
> Space before '('.
>
>> +
>> + void this_id (const frame_info_ptr &this_frame, void **this_prologue_cache,
>> + struct frame_id *id) const override;
>> +
>> + struct value *prev_register (const frame_info_ptr &this_frame,
>> + void **this_prologue_cache,
>> + int regnum) const override;
>> +
>> + struct gdbarch *prev_arch (const frame_info_ptr &this_frame,
>> + void **this_prologue_cache) const override
>> + {
>> + if (prev_arch_p == nullptr)
>> + error (_("No prev_arch callback installed"));
>> + return prev_arch_p (this_frame, this_prologue_cache);
>> + }
> With the prev_arch () changes I'm suggesting, this error () can be
> changed to internal_error ().
>
>> +
>> + /* FIXME: This should have a proper algorithm to deallocate the cache,
>> + otherwise memory is leaked. This method is empty here just so the
>> + migration to c++ classes doesn't add regressions. */
>> + void dealloc_cache (frame_info *self, void *this_cache) const override
>> + { }
>> +};
next prev parent reply other threads:[~2024-10-09 18:17 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-01 18:42 [PATCH v5 0/5] Modernize frame unwinders and add disable feature Guinevere Larsen
2024-10-01 18:42 ` [PATCH v5 1/5] gdb: make gdbarch store a vector of frame unwinders Guinevere Larsen
2024-10-02 21:49 ` Thiago Jung Bauermann
2024-10-08 17:01 ` Guinevere Larsen
2024-10-03 18:33 ` Simon Marchi
2024-10-04 18:37 ` Tom Tromey
2024-10-12 1:34 ` Thiago Jung Bauermann
2024-10-14 18:18 ` Guinevere Larsen
2024-10-17 22:53 ` Tom Tromey
2024-10-18 17:40 ` Guinevere Larsen
2024-10-17 23:41 ` Tom Tromey
2024-10-01 18:42 ` [PATCH v5 2/5] gdb: add "unwinder class" to " Guinevere Larsen
2024-10-02 22:08 ` Thiago Jung Bauermann
2024-10-03 18:46 ` Simon Marchi
2024-10-08 18:22 ` Guinevere Larsen
2024-10-08 18:37 ` Simon Marchi
2024-10-01 18:42 ` [PATCH v5 3/5] gdb: Migrate frame unwinders to use C++ classes Guinevere Larsen
2024-10-03 0:23 ` Thiago Jung Bauermann
2024-10-09 18:16 ` Guinevere Larsen [this message]
2024-10-03 20:06 ` Simon Marchi
2024-10-04 5:21 ` Simon Marchi
2024-10-10 14:10 ` Guinevere Larsen
2024-10-10 16:28 ` Simon Marchi
2024-10-09 20:00 ` Guinevere Larsen
2024-10-01 18:42 ` [PATCH v5 4/5] gdb: introduce ability to disable frame unwinders Guinevere Larsen
2024-10-02 6:10 ` Eli Zaretskii
2024-10-04 17:57 ` Guinevere Larsen
2024-10-03 2:45 ` Thiago Jung Bauermann
2024-10-08 19:23 ` Guinevere Larsen
2024-10-06 2:51 ` Simon Marchi
2024-10-09 13:32 ` Guinevere Larsen
2024-10-09 15:38 ` Simon Marchi
2024-10-01 18:42 ` [PATCH v5 5/5] gdb/testsuite: Test for a backtrace through object without debuginfo Guinevere Larsen
2024-10-03 2:47 ` Thiago Jung Bauermann
2024-10-03 6:58 ` Gerlicher, Klaus
2024-10-09 14:56 ` Guinevere Larsen
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=e5d8dc35-9eda-427c-9d92-74f8404cc04a@redhat.com \
--to=guinevere@redhat.com \
--cc=gdb-patches@sourceware.org \
--cc=thiago.bauermann@linaro.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