From 92812757648109dc6cd35a52374ab3f6e9f44f78 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Tue, 11 Jun 2019 08:40:08 -0400 Subject: [PATCH] gdbhooks.py (TreePrinter.to_string): Recognize ggc_free'd memory. * 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. From-SVN: r272150 --- gcc/ChangeLog | 7 +++++++ gcc/gdbhooks.py | 3 +++ gcc/print-tree.c | 16 +++++++++------- gcc/tree.c | 6 +++++- 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 66e4539..f115982 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2019-06-11 Jason Merrill + + * 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-11 Jakub Jelinek PR bootstrap/90819 diff --git a/gcc/gdbhooks.py b/gcc/gdbhooks.py index 39f5c47..e08208e 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 '' % 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/print-tree.c b/gcc/print-tree.c index 81b66a1..f69a2c2 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 5d95553..e879f15 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -13450,7 +13450,11 @@ get_tree_code_name (enum tree_code code) const char *invalid = ""; if (code >= MAX_TREE_CODES) - return invalid; + { + if (code == 0xa5a5) + return "ggc_freed"; + return invalid; + } return tree_code_name[code]; } -- 2.7.4