aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2012-12-13 11:13:13 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2012-12-13 11:13:13 +0000
commit3ecce8a1ff83d1462ced908c44c8179aee4c2852 (patch)
tree1a13d418fc3a703db9fbeb1004c23cdd2df5d5c5 /gcc
parentaf50fec7f5470d177cbfa6158208097d178e099e (diff)
downloadgcc-3ecce8a1ff83d1462ced908c44c8179aee4c2852.zip
gcc-3ecce8a1ff83d1462ced908c44c8179aee4c2852.tar.gz
gcc-3ecce8a1ff83d1462ced908c44c8179aee4c2852.tar.bz2
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 <rguenther@suse.de> 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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/lto/pr55660_0.c11
-rw-r--r--gcc/testsuite/gcc.dg/lto/pr55660_1.c15
-rw-r--r--gcc/tree-streamer.c10
5 files changed, 49 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 02757fe..3643df5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2012-12-13 Richard Biener <rguenther@suse.de>
+
+ 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 <jakub@redhat.com>
PR gcov-profile/55650
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f127b83..a03406a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2012-12-13 Richard Biener <rguenther@suse.de>
+
+ PR lto/55660
+ * gcc.dg/lto/pr55660_0.c: New testcase.
+ * gcc.dg/lto/pr55660_1.c: Likewise.
+
2012-12-13 Jakub Jelinek <jakub@redhat.com>
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 0000000..7e7bb2f
--- /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 0000000..a8c368b
--- /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 a6b7316..259e36b 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