On Tue, 2019-07-02 at 14:29 +0300, Vladislav Ivanishin wrote:
> David Malcolm <dmalc...@redhat.com> writes:
> 
> > On Mon, 2019-07-01 at 12:50 +0300, Vladislav Ivanishin wrote:
> > > Hi!
> > > 
> > > GDB's Python API provides strip_typedefs method that can be
> > > instrumental
> > > for writing DRY code.  Using it at least partially obviates the
> > > need
> > > for
> > > the add_printer_for_types method we have in gdbhooks.py (it takes
> > > a
> > > list
> > > of typenames to match and is usually used to deal with typedefs).
> > > 
> > > I think, the code can be simplified further (there's still
> > > ['tree_node *', 'const tree_node *'], which is a little awkward)
> > > if
> > > we
> > > deal with pointer types in a uniform fashion (I'll touch on this
> > > in
> > > the
> > > description of the second patch).  But that can be improved
> > > separately.
> > > 
> > > The gimple_statement_cond, etc. part has been dysfunctional for a
> > > while
> > > (namely since gimple-classes-v2-option-3 branch was merged).  I
> > > updated
> > > it to use the new classes' names.  That seems to work (though it
> > > doesn't
> > > output much info anyway: pretty
> > >        <gimple_phi 0x7ffff78c0200> vs. 
> > >        (gphi *) 0x7ffff78c0200
> > > in the raw version).
> > > 
> > > I changed the name passed to pp.add_printer_for_types() for
> > > scalar_mode
> > > and friends -- so they all share the same name now -- but I don't
> > > believe the name is used in any context where it would matter.
> > 
> > IIRC there's a gdb command to tell you what the registered pretty-
> > printers are;
> 
> Yeah, it's (gdb) info pretty-printer
> 
> > I think the name is only ever used in that context (or maybe for
> > fine-grained control of pretty-printing) -
> 
> From the gdb info manual:
> 'disable pretty-printer [OBJECT-REGEXP [NAME-REGEXP]]'
>      Disable pretty-printers matching OBJECT-REGEXP and NAME-REGEXP.
> 
> In our case, this is how to do it:
>     (gdb) disable pretty-printer global gcc;scalar.*
> 
> So, that would be a regression, if different modes were given
> different
> names on purpose (starts with r251467).  Looks unintentional though,
> and
> the subprinter is very simple.
> 
> I think, these scenarios exhaust the uses for the name attribute of a
> pretty printer.
> 
> > and I don't know of anyone who uses that.  I don't think changing
> > the
> > name matters.
> 
> Good.  Neither do I :) Except after writing this I started using this
> feature myself.  It provides a convenient way to isolate a faulty
> pretty-printer, or continue debugging without it.  The manual says
> that
> "The consequences of a broken pretty-printer are severe enough that
> GDB
> provides support for enabling and disabling individual
> printers".  Oh,
> were they right ...  (see below).

In any case, I have no objection to the change-of-names part of the
patch.

> > > This is just a clean up of gdbhooks.py.  OK to commit?
> > 
> > The only area I wasn't sure about were the removal hunks relating
> > to
> > machine modes: is that all covered now by the looking-through-
> > typedefs?
> 
> Yes, I checked (using debug output) that all the modes for which I
> removed explicit handling are correctly expanded to either
> opt_mode<>,
> or pod_mode<>.
> 
> > Otherwise, looks good to me.  I assume you've tested the patch by
> > debugging with it.
> 
> Yeah, I thought my debugging with the patch should have given it
> reasonable coverage.
> 
> However, I had not previously actually tested debugging code
> involving
> modes, so I went ahead and did it.  And I am seeing a segfault with
> RtxPrinter now (-ex "b reg_nonzero_bits_for_combine" -ex "r" -ex
> "bt").
> Delving in...
> 
> The rtx type (for which the unqualified form is also 'rtx') was not
> being matched by any of the printers.  The typedef-stripped form is
> 'rtx_def *'. It matches now and uncovers a bug in the subprinter(?)
> 
> I dug into it and the impression I have so far is that the
> print_inline_rtx call upsets gdb's frame unwinders... Upon the "bt"
> command, GDB itself produces more than 157000 frames before hitting
> the
> segfault.

Sounds like an infinite recursion (possibly a mutual recursion
involving gdb repeatedly injecting new frames into the inferior cc1, or
could just be an infinite recursion in the inferior).

> Have you seen anything like that before?  It would be nice to
> understand
> the root cause of this bug.  I am going to spend some more time on
> it,
> but I've no prior experience in debugging gdb internals.
> 
> As a workaround, I'd propose perhaps removing the kludge, but the
> output
> looks nice, while the alternative implementation (after return) is
> not
> as informative.

Yeah, the rtx-printing is a kludge.

The gdbhooks.py code isn't well tested.  I wonder if what you're seeing
is a regression, or you're simply uncovering an existing bug.

Maybe have the stripping-of-typedefs special-case rtx, and not strip
typedefs for the specific case of rtx? (or for that printer, given that
RtxPrinter is a kludge).

Dave

Reply via email to