This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Making it easier to set breakpoints in gdb on pass->execute methods
- From: Richard Biener <richard dot guenther at gmail dot com>
- To: David Malcolm <dmalcolm at redhat dot com>
- Cc: "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>
- Date: Wed, 30 Jul 2014 10:07:52 +0200
- Subject: Re: [PATCH] Making it easier to set breakpoints in gdb on pass->execute methods
- Authentication-results: sourceware.org; auth=none
- References: <1406666669 dot 2134 dot 139 dot camel at surprise>
On Tue, Jul 29, 2014 at 10:44 PM, David Malcolm <dmalcolm@redhat.com> wrote:
> A complaint I heard at Cauldron with the C++ification of GCC passes is
> that it's become much more difficult to set breakpoints on the execute
> hooks of a pass, now that the passes are classes within anonymous
> namespaces.
>
> When this was first done, the execute methods were trivial
> implementations that called into the existing named functions, which are
> still easy to put a breakpoint on by name (assuming you know the name of
> the function), but some of these have now been converted so that the
> "execute" method is the body of the pass.
>
> I did some experimentation, on this box with
> gdb-7.6.50.20130731-19.fc20.x86_64 and gcc trunk r212913 (the latter
> from a week ago).
>
> You *can* set a breakpoint by name on such an execute method, but it's
> tedious to type:
> (gdb) break '(anonymous namespace)::pass_expand::execute'
> Breakpoint 7 at 0x655220: file ../../src/gcc/cfgexpand.c, line
>
> ...since tab-completion doesn't work well:
>
> (gdb) break '(a<TAB>
> does tab complete to:
> (gdb) break '(anonymous namespace)::
>
> but typing anything else then hitting tab returns back to:
> (gdb) break '(anonymous namespace)::
>
> Is anyone else seeing this?
Yes, I filed a gdb bug about this.
> I had a go at implementing a workaround, for the lack of tab completion
> (and the general verbosity) using gdbhooks.py.
>
> Attached is a patch to gdbhooks.py which adds a new command
> "break-on-pass" to gdb; in particular, it locates and parses passes.def,
> so that it can tab-complete on pass classnames:
>
> Example of use from the script: putting a breakpoint on "final", i.e.
> classname "pass_final":
>
> (gdb) break-on-pass
> Press <TAB>; it autocompletes to "pass_":
> (gdb) break-on-pass pass_
> Press <TAB>:
> Display all 219 possibilities? (y or n)
> Press "n"; then type "f":
> (gdb) break-on-pass pass_f
> Press <TAB> to autocomplete to pass classnames beginning with "pass_f":
> pass_fast_rtl_dce pass_fold_builtins
> pass_feedback_split_functions pass_forwprop
> pass_final pass_fre
> pass_fixup_cfg pass_free_cfg
> Type "in<TAB>" to complete to "pass_final":
> (gdb) break-on-pass pass_final
> ...and hit <RETURN>:
> Breakpoint 6 at 0x8396ba: file ../../src/gcc/final.c, line 4526.
> ...and we have a breakpoint set; continue execution:
> (gdb) cont
> Continuing.
> Breakpoint 6, (anonymous namespace)::pass_final::execute (this=0x17fb990) at ../../src/gcc/final.c:4526
> 4526 virtual unsigned int execute (function *) { return rest_of_handle_final (); }
>
> This assumes you've suitably enabled gdbhooks.py, as documented at the
> top of that file.
>
> Thoughts?
Works for me though I'm not able to review python ;)
Richard.
> Dave
>
> gcc/
> * gdbhooks.py (find_gcc_source_dir): New helper function.
> (class PassNames): New class, locating and parsing passes.def.
> (class BreakOnPass): New command "break-on-pass".
>