From d1f6261f39b061c2c65d51deb6ac12831a3b5f1e Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Sun, 19 Sep 2010 23:49:28 +0200 Subject: [PATCH] re PR lto/44246 (ICE with -fwhopr/-flto when using strlen and strcat without previous declaration) PR lto/44246 * lto-cgraph.c (input_cgraph_1, input_varpool_1): Avoid processing same node twice. * gcc.c-torture/compile/pr44246.c:New file. From-SVN: r164425 --- gcc/ChangeLog | 6 +++++ gcc/lto-cgraph.c | 23 ++++++++++++++++++- gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gcc.c-torture/compile/pr44246.c | 5 ++++ 4 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr44246.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7fafcf5608b..00504ddc6c2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-09-19 Jan Hubicka + + PR lto/44246 + * lto-cgraph.c (input_cgraph_1, input_varpool_1): Avoid + processing same node twice. + 2010-09-19 Anatoly Sokolov * config/bfin/bfin.h (CLASS_LIKELY_SPILLED_P): Remove. diff --git a/gcc/lto-cgraph.c b/gcc/lto-cgraph.c index c81e3f90ee5..22b35ee27ab 100644 --- a/gcc/lto-cgraph.c +++ b/gcc/lto-cgraph.c @@ -1292,11 +1292,20 @@ input_cgraph_1 (struct lto_file_decl_data *file_data, len = lto_input_uleb128 (ib); } - + /* AUX pointers should be all non-zero for nodes read from the stream. */ +#ifdef ENABLE_CHECKING + FOR_EACH_VEC_ELT (cgraph_node_ptr, nodes, i, node) + gcc_assert (node->aux); +#endif FOR_EACH_VEC_ELT (cgraph_node_ptr, nodes, i, node) { int ref = (int) (intptr_t) node->global.inlined_to; + /* We share declaration of builtins, so we may read same node twice. */ + if (!node->aux) + continue; + node->aux = NULL; + /* Fixup inlined_to from reference to pointer. */ if (ref != LCC_NOT_FOUND) node->global.inlined_to = VEC_index (cgraph_node_ptr, nodes, ref); @@ -1311,6 +1320,8 @@ input_cgraph_1 (struct lto_file_decl_data *file_data, else node->same_comdat_group = NULL; } + FOR_EACH_VEC_ELT (cgraph_node_ptr, nodes, i, node) + node->aux = (void *)1; return nodes; } @@ -1332,9 +1343,17 @@ input_varpool_1 (struct lto_file_decl_data *file_data, input_varpool_node (file_data, ib)); len--; } +#ifdef ENABLE_CHECKING + FOR_EACH_VEC_ELT (varpool_node_ptr, varpool, i, node) + gcc_assert (!node->aux); +#endif FOR_EACH_VEC_ELT (varpool_node_ptr, varpool, i, node) { int ref = (int) (intptr_t) node->same_comdat_group; + /* We share declaration of builtins, so we may read same node twice. */ + if (node->aux) + continue; + node->aux = (void *)1; /* Fixup same_comdat_group from reference to pointer. */ if (ref != LCC_NOT_FOUND) @@ -1342,6 +1361,8 @@ input_varpool_1 (struct lto_file_decl_data *file_data, else node->same_comdat_group = NULL; } + FOR_EACH_VEC_ELT (varpool_node_ptr, varpool, i, node) + node->aux = NULL; return varpool; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1ae06e45005..bf288668993 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-09-19 Jan Hubicka + + PR lto/44246 + * gcc.c-torture/compile/pr44246.c:New file. + 2010-09-19 Ira Rosen PR tree-optimization/45714 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr44246.c b/gcc/testsuite/gcc.c-torture/compile/pr44246.c new file mode 100644 index 00000000000..6e478690351 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr44246.c @@ -0,0 +1,5 @@ +int main(int argc, char *argv[]) +{ + strcat(argv[0], "X"); + return strlen(argv[0]); +} -- 2.30.2