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

David Malcolm dmalcolm@redhat.com
Tue Jul 29 21:06:00 GMT 2014


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?

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

-------------- next part --------------
A non-text attachment was scrubbed...
Name: add-break-on-pass-command.patch
Type: text/x-patch
Size: 3077 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20140729/07a8b23a/attachment.bin>


More information about the Gcc-patches mailing list