This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Plug some LTO memory leaks


On Fri, May 7, 2010 at 2:38 AM, Jan Hubicka <hubicka@ucw.cz> wrote:
> 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?

Ok.

Thanks,
Richard.

> ? ? ? ?* 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);
>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]