OSDN Git Service

PR lto/44246
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 19 Sep 2010 21:49:28 +0000 (21:49 +0000)
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 19 Sep 2010 21:49:28 +0000 (21:49 +0000)
* lto-cgraph.c (input_cgraph_1, input_varpool_1): Avoid
processing same node twice.
* gcc.c-torture/compile/pr44246.c:New file.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@164425 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/lto-cgraph.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr44246.c [new file with mode: 0644]

index 7fafcf5..00504dd 100644 (file)
@@ -1,3 +1,9 @@
+2010-09-19  Jan Hubicka  <jh@suse.cz>
+
+       PR lto/44246
+       * lto-cgraph.c (input_cgraph_1, input_varpool_1): Avoid
+       processing same node twice.
+
 2010-09-19  Anatoly Sokolov  <aesok@post.ru>
 
        * config/bfin/bfin.h (CLASS_LIKELY_SPILLED_P): Remove.
index c81e3f9..22b35ee 100644 (file)
@@ -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;
 }
 
index 1ae06e4..bf28866 100644 (file)
@@ -1,3 +1,8 @@
+2010-09-19  Jan Hubicka  <jh@suse.cz>
+
+       PR lto/44246
+       * gcc.c-torture/compile/pr44246.c:New file.
+
 2010-09-19  Ira Rosen  <irar@il.ibm.com>
 
        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 (file)
index 0000000..6e47869
--- /dev/null
@@ -0,0 +1,5 @@
+int main(int argc, char *argv[])
+{
+  strcat(argv[0], "X");
+  return strlen(argv[0]);
+}