lto-symtab.c (lto_cgraph_replace_node): Free decl_in_state.
authorJan Hubicka <jh@suse.cz>
Fri, 30 Aug 2013 07:33:06 +0000 (09:33 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Fri, 30 Aug 2013 07:33:06 +0000 (07:33 +0000)
* lto-symtab.c (lto_cgraph_replace_node): Free decl_in_state.
* cgraph.c (cgraph_release_function_body): Free decl_in_state.
* lto-section-in.c (lto_free_function_in_decl_state): New function.
(lto_free_function_in_decl_state_for_node): New function.

* lto.c (read_cgraph_and_symbols): Remove ggc_collect;
clear section node; add comment why we do not collect.

From-SVN: r202093

gcc/cgraph.c
gcc/lto-section-in.c
gcc/lto-symtab.c
gcc/lto/ChangeLog
gcc/lto/lto.c

index 063c5245feff31c968f4f37f600515f017850fc8..feb17bb0dd93cb0c3c0fecf9b441c51d5610b8fe 100644 (file)
@@ -1663,6 +1663,8 @@ cgraph_release_function_body (struct cgraph_node *node)
   if (!node->used_as_abstract_origin && DECL_INITIAL (node->symbol.decl))
     DECL_INITIAL (node->symbol.decl) = error_mark_node;
   release_function_body (node->symbol.decl);
+  if (node->symbol.lto_file_data)
+    lto_free_function_in_decl_state_for_node ((symtab_node) node);
 }
 
 /* Remove the node from cgraph.  */
@@ -3107,10 +3109,11 @@ cgraph_get_body (struct cgraph_node *node)
 
   gcc_assert (DECL_STRUCT_FUNCTION (decl) == NULL);
 
-  lto_input_function_body (file_data, decl, data);
+  lto_input_function_body (file_data, node->symbol.decl, data);
   lto_stats.num_function_bodies++;
   lto_free_section_data (file_data, LTO_section_function_body, name,
                         data, len);
+  lto_free_function_in_decl_state_for_node ((symtab_node) node);
   return true;
 }
 
index 0ef421f6167db674a8d0ff13dcd6a3529e9f8a95..5821030d4cfb3c6599a3ae04e64b27df17e9cd7b 100644 (file)
@@ -414,6 +414,41 @@ lto_get_function_in_decl_state (struct lto_file_decl_data *file_data,
   return slot? ((struct lto_in_decl_state*) *slot) : NULL;
 }
 
+/* Free decl_states.  */
+
+void
+lto_free_function_in_decl_state (struct lto_in_decl_state *state)
+{
+  int i;
+  for (i = 0; i < LTO_N_DECL_STREAMS; i++)
+    ggc_free (state->streams[i].trees);
+  ggc_free (state);
+}
+
+/* Free decl_states associated with NODE.  This makes it possible to furhter
+   release trees needed by the NODE's body.  */
+
+void
+lto_free_function_in_decl_state_for_node (symtab_node node)
+{
+  struct lto_in_decl_state temp;
+  void **slot;
+
+  if (!node->symbol.lto_file_data)
+    return;
+
+  temp.fn_decl = node->symbol.decl;
+  slot = htab_find_slot (node->symbol.lto_file_data->function_decl_states,
+                        &temp, NO_INSERT);
+  if (slot && *slot)
+    {
+      lto_free_function_in_decl_state ((struct lto_in_decl_state*) *slot);
+      htab_clear_slot (node->symbol.lto_file_data->function_decl_states,
+                      slot);
+    }
+  node->symbol.lto_file_data = NULL;
+}
+
 
 /* Report read pass end of the section.  */
 
index 9bebd09c832da50e19f04304821b0aaac55612e0..7c2add7232aad9765b0ef4450e30af16665d6b56 100644 (file)
@@ -80,6 +80,8 @@ lto_cgraph_replace_node (struct cgraph_node *node,
   /* Redirect incomming references.  */
   ipa_clone_referring ((symtab_node)prevailing_node, &node->symbol.ref_list);
 
+  lto_free_function_in_decl_state_for_node ((symtab_node)node);
+
   if (node->symbol.decl != prevailing_node->symbol.decl)
     cgraph_release_function_body (node);
 
index ab81a7874a3255c92b7cd31e55afecebe0d72604..965a78ce5c80ce1ded618a6f86a53695252e66b0 100644 (file)
@@ -1,3 +1,7 @@
+2013-08-29  Jan Hubicka  <jh@suse.cz>
+
+       * lto.c (read_cgraph_and_symbols): Free decl states.
+
 2013-08-29  Jan Hubicka  <jh@suse.cz>
 
        * lto.c (compare_tree_sccs_1): Compare  DECL_FINAL_P,
index f6e1f970caa2f2553ccadacd4122dac7d35ef0f4..cc0ed69a5f285d0fc6d4f97aeee77f21ba9b98ff 100644 (file)
@@ -3502,6 +3502,9 @@ read_cgraph_and_symbols (unsigned nfiles, const char **fnames)
       gcc_assert (all_file_decl_data[i]->symtab_node_encoder);
       lto_symtab_encoder_delete (all_file_decl_data[i]->symtab_node_encoder);
       all_file_decl_data[i]->symtab_node_encoder = NULL;
+      lto_free_function_in_decl_state (all_file_decl_data[i]->global_decl_state);
+      all_file_decl_data[i]->global_decl_state = NULL;
+      all_file_decl_data[i]->current_decl_state = NULL; 
     }
 
   /* Finally merge the cgraph according to the decl merging decisions.  */