This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Making it easier to set breakpoints in gdb on pass->execute methods


On Tue, Aug 05, 2014 at 05:02:57PM -0400, David Malcolm wrote:
> On Wed, 2014-07-30 at 10:07 +0200, Richard Biener wrote:
> > 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 ;)
> 
> I've gone ahead and committed it to trunk as r213646; hope this reduces
> the pain somewhat.

So, I was thinking about this more at some point.  iirc the reason to
put the classes in the anon namespace was to get stuff devirtualized.
However I think we can just use __final if building with gcc to
acomplish the same thing, and then remove the namespace {}s.  It needs
to be tested, but if it works it would be even better :-)

Trev

> 
> > 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".
> > >
> 
> 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]