From 3ecce8a1ff83d1462ced908c44c8179aee4c2852 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Thu, 13 Dec 2012 11:13:13 +0000 Subject: [PATCH] re PR lto/55660 (ICE instead of some warning during lto build with supplied different options (-funsigned-char vs none)) 2012-12-13 Richard Biener PR lto/55660 * tree-streamer.c (record_common_node): Check that we are not recursively pre-loading nodes we want to skip. Handle char_type_node appearing as part of va_list_type_node. * gcc.dg/lto/pr55660_0.c: New testcase. * gcc.dg/lto/pr55660_1.c: Likewise. From-SVN: r194473 --- gcc/ChangeLog | 7 +++++++ gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/gcc.dg/lto/pr55660_0.c | 11 +++++++++++ gcc/testsuite/gcc.dg/lto/pr55660_1.c | 15 +++++++++++++++ gcc/tree-streamer.c | 10 ++++++++++ 5 files changed, 49 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/lto/pr55660_0.c create mode 100644 gcc/testsuite/gcc.dg/lto/pr55660_1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 02757fe44cf2..3643df597929 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2012-12-13 Richard Biener + + PR lto/55660 + * tree-streamer.c (record_common_node): Check that we are not + recursively pre-loading nodes we want to skip. Handle + char_type_node appearing as part of va_list_type_node. + 2012-12-13 Jakub Jelinek PR gcov-profile/55650 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f127b83b6555..a03406af0ad7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2012-12-13 Richard Biener + + PR lto/55660 + * gcc.dg/lto/pr55660_0.c: New testcase. + * gcc.dg/lto/pr55660_1.c: Likewise. + 2012-12-13 Jakub Jelinek PR gcov-profile/55650 diff --git a/gcc/testsuite/gcc.dg/lto/pr55660_0.c b/gcc/testsuite/gcc.dg/lto/pr55660_0.c new file mode 100644 index 000000000000..7e7bb2ffff8c --- /dev/null +++ b/gcc/testsuite/gcc.dg/lto/pr55660_0.c @@ -0,0 +1,11 @@ +/* { dg-lto-do run } */ +/* { dg-extra-ld-options { -funsigned-char } } */ + +char n[3] = {'a','b','c'}; +int foo(char *x) +{ + if (*x == 'b') + return (int)*x; + *x = 'y'; + return 0; +} diff --git a/gcc/testsuite/gcc.dg/lto/pr55660_1.c b/gcc/testsuite/gcc.dg/lto/pr55660_1.c new file mode 100644 index 000000000000..a8c368bb925f --- /dev/null +++ b/gcc/testsuite/gcc.dg/lto/pr55660_1.c @@ -0,0 +1,15 @@ +extern int foo (char*); +extern void abort (void); + +extern char n[3]; + +int main () +{ + int i, m = 0; + for (i = 0; i < 3; i++) + m += foo(&n[i]); + + if (m != 'b') + abort (); + return 0; +} diff --git a/gcc/tree-streamer.c b/gcc/tree-streamer.c index a6b731610851..259e36b76192 100644 --- a/gcc/tree-streamer.c +++ b/gcc/tree-streamer.c @@ -237,6 +237,16 @@ streamer_tree_cache_lookup (struct streamer_tree_cache_d *cache, tree t, static void record_common_node (struct streamer_tree_cache_d *cache, tree node) { + /* If we recursively end up at nodes we do not want to preload simply don't. + ??? We'd want to verify that this doesn't happen, or alternatively + do not recurse at all. */ + if (node == char_type_node) + return; + + gcc_checking_assert (node != boolean_type_node + && node != boolean_true_node + && node != boolean_false_node); + /* We have to make sure to fill exactly the same number of elements for all frontends. That can include NULL trees. As our hash table can't deal with zero entries we'll simply stream