On Fri, Jun 7, 2019 at 11:11 PM Jason Merrill <ja...@redhat.com> wrote: > > A tree node that has been poisoned by ggc_free is easily recognizable by the > TREE_CODE 0xa5a5; let's look for that rather than access some random memory > off > the end of the array. > > OK for trunk?
OK. Richard. > * gdbhooks.py (TreePrinter.to_string): Recognize ggc_free'd memory. > * tree.c (get_tree_code_name): Likewise. > * print-tree.c (print_node): Only briefly print a node with an > invalid code. > --- > gcc/print-tree.c | 16 +++++++++------- > gcc/tree.c | 6 +++++- > gcc/gdbhooks.py | 3 +++ > gcc/ChangeLog | 7 +++++++ > 4 files changed, 24 insertions(+), 8 deletions(-) > > diff --git a/gcc/print-tree.c b/gcc/print-tree.c > index 81b66a1891b..f69a2c26679 100644 > --- a/gcc/print-tree.c > +++ b/gcc/print-tree.c > @@ -233,6 +233,15 @@ print_node (FILE *file, const char *prefix, tree node, > int indent, > return; > > code = TREE_CODE (node); > + > + /* It is unsafe to look at any other fields of a node with ERROR_MARK or > + invalid code. */ > + if (code == ERROR_MARK || code >= MAX_TREE_CODES) > + { > + print_node_brief (file, prefix, node, indent); > + return; > + } > + > tclass = TREE_CODE_CLASS (code); > > /* Don't get too deep in nesting. If the user wants to see deeper, > @@ -251,13 +260,6 @@ print_node (FILE *file, const char *prefix, tree node, > int indent, > return; > } > > - /* It is unsafe to look at any other fields of an ERROR_MARK node. */ > - if (code == ERROR_MARK) > - { > - print_node_brief (file, prefix, node, indent); > - return; > - } > - > /* Allow this function to be called if the table is not there. */ > if (table) > { > diff --git a/gcc/tree.c b/gcc/tree.c > index 43ce44fcee4..4ba0135dfbb 100644 > --- a/gcc/tree.c > +++ b/gcc/tree.c > @@ -13444,7 +13444,11 @@ get_tree_code_name (enum tree_code code) > const char *invalid = "<invalid tree code>"; > > if (code >= MAX_TREE_CODES) > - return invalid; > + { > + if (code == 0xa5a5) > + return "ggc_freed"; > + return invalid; > + } > > return tree_code_name[code]; > } > diff --git a/gcc/gdbhooks.py b/gcc/gdbhooks.py > index 39f5c4772f9..e08208e1533 100644 > --- a/gcc/gdbhooks.py > +++ b/gcc/gdbhooks.py > @@ -222,6 +222,9 @@ class TreePrinter: > # extern const enum tree_code_class tree_code_type[]; > # #define TREE_CODE_CLASS(CODE) tree_code_type[(int) (CODE)] > > + if val_TREE_CODE == 0xa5a5: > + return '<ggc_freed 0x%x>' % intptr(self.gdbval) > + > val_tree_code_type = gdb.parse_and_eval('tree_code_type') > val_tclass = val_tree_code_type[val_TREE_CODE] > > diff --git a/gcc/ChangeLog b/gcc/ChangeLog > index fa7a5adefb2..8a083599c99 100644 > --- a/gcc/ChangeLog > +++ b/gcc/ChangeLog > @@ -1,3 +1,10 @@ > +2019-06-07 Jason Merrill <ja...@redhat.com> > + > + * gdbhooks.py (TreePrinter.to_string): Recognize ggc_free'd memory. > + * tree.c (get_tree_code_name): Likewise. > + * print-tree.c (print_node): Only briefly print a node with an > + invalid code. > + > 2019-06-07 Jakub Jelinek <ja...@redhat.com> > > * Makefile.in (genprogerr): Add condmd. > > base-commit: 5f93e2e757ba1dfd0514b3661b6d737ea5492fa9 > -- > 2.20.1 >