re PR lto/55660 (ICE instead of some warning during lto build with supplied different...
authorRichard Biener <rguenther@suse.de>
Thu, 13 Dec 2012 11:13:13 +0000 (11:13 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 13 Dec 2012 11:13:13 +0000 (11:13 +0000)
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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/lto/pr55660_0.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/lto/pr55660_1.c [new file with mode: 0644]
gcc/tree-streamer.c

index 02757fe44cf2fb8414226301dd4d267b81951dd9..3643df597929a5babe197ab2d534488ab22d9753 100644 (file)
@@ -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
index f127b83b65553884756aca8b0265caf9c0f1c0e9..a03406af0ad7502973d9f09c784f16f6c1a8590b 100644 (file)
@@ -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 (file)
index 0000000..7e7bb2f
--- /dev/null
@@ -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 (file)
index 0000000..a8c368b
--- /dev/null
@@ -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;
+}
index a6b731610851be1f873239342ebc9b3b6e607ac7..259e36b7619274906c617affe8570d69928ce9e4 100644 (file)
@@ -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