Plug some LTO memory leaks

Jan Hubicka hubicka@ucw.cz
Fri May 7 00:38:00 GMT 2010


Hi,
we leak memory of streamer cache that is fixed by adding a alloc pool that is
freed at the end (and should be also more effective).
Other problem is that we leak a lot of varpool/cgraph encoders.  WHile streaming
out we unnecesarily allocate one for each function being dumped.
Fixed by moving the allocation to passes.c where main streamer is produced
and also by freeing the decl out states.

Bootstrapped/regtested x86_64-linux, OK?

	* passes.c (ipa_write_summaries_1, ipa_write_optimization_summaries): Allocate
	encoders.
	* lto-section-out.c (lto_new_out_decl_state): Do not allocate it here.
	* lto-streamer.c (lto_streamer_cache_insert_1): Use alloc pool.
	(lto_streamer_cache_create): Init alloc pool.
	(lto_streamer_cache_delete): Free alloc pool.
	* lto-streamer.h: Include alloc pool.
	(lto_streamer_cache_d): Use alloc pool.
	* lto-stramer-out.c (produce_asm_for_decls): Delete fn_out_states.
Index: passes.c
===================================================================
--- passes.c	(revision 159107)
+++ passes.c	(working copy)
@@ -1694,6 +1694,9 @@ static void
 ipa_write_summaries_1 (cgraph_node_set set, varpool_node_set vset)
 {
   struct lto_out_decl_state *state = lto_new_out_decl_state ();
+  state->cgraph_node_encoder = lto_cgraph_encoder_new ();
+  state->varpool_node_encoder = lto_varpool_encoder_new ();
+
   lto_push_out_decl_state (state);
 
   gcc_assert (!flag_wpa);
@@ -1805,6 +1808,8 @@ void
 ipa_write_optimization_summaries (cgraph_node_set set, varpool_node_set vset)
 {
   struct lto_out_decl_state *state = lto_new_out_decl_state ();
+  state->cgraph_node_encoder = lto_cgraph_encoder_new ();
+  state->varpool_node_encoder = lto_varpool_encoder_new ();
   lto_push_out_decl_state (state);
 
   gcc_assert (flag_wpa);
Index: lto-section-out.c
===================================================================
--- lto-section-out.c	(revision 159107)
+++ lto-section-out.c	(working copy)
@@ -542,9 +542,6 @@ lto_new_out_decl_state (void)
       lto_init_tree_ref_encoder (&state->streams[i], hash_fn, eq_fn);
     }
 
-  state->cgraph_node_encoder = lto_cgraph_encoder_new ();
-  state->varpool_node_encoder = lto_varpool_encoder_new ();
-
   return state;
 }
 
Index: lto-streamer.c
===================================================================
--- lto-streamer.c	(revision 159107)
+++ lto-streamer.c	(working copy)
@@ -500,7 +500,7 @@ lto_streamer_cache_insert_1 (struct lto_
       else
 	ix = *ix_p;
 
-      entry = XCNEW (struct tree_int_map);
+      entry = (struct tree_int_map *)pool_alloc (cache->node_map_entries);
       entry->base.from = t;
       entry->to = (unsigned) ix;
       *slot = entry;
@@ -762,6 +762,10 @@ lto_streamer_cache_create (void)
 
   cache->node_map = htab_create (101, tree_int_map_hash, tree_int_map_eq, NULL);
 
+  cache->node_map_entries = create_alloc_pool ("node map",
+					       sizeof (struct tree_int_map),
+					       100);
+
   /* Load all the well-known tree nodes that are always created by
      the compiler on startup.  This prevents writing them out
      unnecessarily.  */
@@ -785,6 +789,7 @@ lto_streamer_cache_delete (struct lto_st
     return;
 
   htab_delete (c->node_map);
+  free_alloc_pool (c->node_map_entries);
   VEC_free (tree, gc, c->nodes);
   VEC_free (unsigned, heap, c->offsets);
   free (c);
Index: lto-streamer.h
===================================================================
--- lto-streamer.h	(revision 159107)
+++ lto-streamer.h	(working copy)
@@ -30,6 +30,7 @@ along with GCC; see the file COPYING3.  
 #include "cgraph.h"
 #include "vec.h"
 #include "vecprim.h"
+#include "alloc-pool.h"
 
 /* Define when debugging the LTO streamer.  This causes the writer
    to output the numeric value for the memory address of the tree node
@@ -346,6 +347,9 @@ struct lto_streamer_cache_d
   /* The mapping between tree nodes and slots into the nodes array.  */
   htab_t node_map;
 
+  /* Node map to store entries into.  */
+  alloc_pool node_map_entries;
+
   /* Next available slot in the nodes and offsets arrays.  */
   unsigned next_slot;
 
Index: lto-streamer-out.c
===================================================================
--- lto-streamer-out.c	(revision 159107)
+++ lto-streamer-out.c	(working copy)
@@ -2505,6 +2505,7 @@ produce_asm_for_decls (cgraph_node_set s
       fn_out_state =
 	VEC_index (lto_out_decl_state_ptr, lto_function_decl_states, idx);
       lto_output_decl_state_refs (ob, decl_state_stream, fn_out_state);
+      lto_delete_out_decl_state (fn_out_state);
     }
   lto_write_stream (decl_state_stream);
   free(decl_state_stream);



More information about the Gcc-patches mailing list