>>>>> "David" == David Malcolm <dmalc...@redhat.com> writes:

David> GDB 7.0 onwards supports hooks written in Python to improve the
David> quality-of-life within the debugger.  The best known are the
David> pretty-printing hooks [1], which we already use within libstdc++ for
David> printing better representations of STL containers.

Nice!

A few suggestions.

David>   (note how the rtx_def* is printed inline.  This last one is actually a
David> kludge; all the other pretty-printers work inside gdb, whereas this one
David> injects a call into print-rtl.c into the inferior).

Naughty.

David>   * it hardcoded values in a few places rather than correctly looking up
David> enums

If you have a new-enough gdb (I don't recall the exact version -- I can
look if you want, but recall that gcc changes mean that gcc developers
generally have to use a very recent gdb) you can use
gdb.types.make_enum_dict to get this very easily.

David> You may see a message from gdb of the form:
David>   cc1-gdb.py auto-loading has been declined by your `auto-load safe-path'
David> as a protection against untrustworthy python scripts.  See
David>   
http://sourceware.org/gdb/onlinedocs/gdb/Auto_002dloading-safe-path.html

I think you could set up the safe-path in the gcc .gdbinit.

David> Note that you can suppress pretty-printers using /r (for "raw"):
David>   (gdb) p /r pass
David>   $3 = (opt_pass *) 0x188b600
David> and dereference the pointer in the normal way:
David>   (gdb) p *pass
David>   $4 = {type = RTL_PASS, name = 0x120a312 "expand",
David>   [etc, ...snipped...]

I just wanted to clarify here that you can "p *pass" *without* first
using "p/r".  Pretty-printing applies just to printing -- it does not
affect what is in the value history.  The values there still have the
correct type and such.

David> def pretty_printer_lookup(gdbval):
[...]

David> def register (obj):
David>     if obj is None:
David>         obj = gdb

David>     # Wire up the pretty-printer
David>     obj.pretty_printers.append(pretty_printer_lookup)

It's better to use the gdb.printing facilities now.  These let user
disable pretty-printers if they prefer.  The libstdc++ printers go out
of their way to use gdb.printing only if available; but you can probably
just assume it exists.

David> print('Successfully loaded GDB hooks for GCC')

I wonder whether gdb ought to do this.

Tom

Reply via email to