diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 204fed8e776..9543444b460 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2012-10-07 Jan Hubicka + + * lto-cgraph.c (lto_symtab_encoder_new): New parameter FOR_INPUT. + (lto_symtab_encoder_delete): Update. + (lto_symtab_encoder_encode): Update. + (compute_ltrans_boundary): Update. + (input_symtab): Update. + * lto-streamer.h (lto_symtab_encoder_new): Update. + 2012-10-07 Richard Sandiford * config/mips/mips-protos.h (mips_split_type): New enum. diff --git a/gcc/lto-cgraph.c b/gcc/lto-cgraph.c index f96ed3d36d3..4f952f59bf9 100644 --- a/gcc/lto-cgraph.c +++ b/gcc/lto-cgraph.c @@ -72,13 +72,17 @@ enum LTO_symtab_tags LTO_symtab_last_tag }; -/* Create a new symtab encoder. */ +/* Create a new symtab encoder. + if FOR_INPUT, the encoder allocate only datastructures needed + to read the symtab. */ lto_symtab_encoder_t -lto_symtab_encoder_new (void) +lto_symtab_encoder_new (bool for_input) { lto_symtab_encoder_t encoder = XCNEW (struct lto_symtab_encoder_d); - encoder->map = pointer_map_create (); + + if (!for_input) + encoder->map = pointer_map_create (); encoder->nodes = NULL; return encoder; } @@ -90,7 +94,8 @@ void lto_symtab_encoder_delete (lto_symtab_encoder_t encoder) { VEC_free (lto_encoder_entry, heap, encoder->nodes); - pointer_map_destroy (encoder->map); + if (encoder->map) + pointer_map_destroy (encoder->map); free (encoder); } @@ -106,6 +111,15 @@ lto_symtab_encoder_encode (lto_symtab_encoder_t encoder, int ref; void **slot; + if (!encoder->map) + { + lto_encoder_entry entry = {node, false, false, false}; + + ref = VEC_length (lto_encoder_entry, encoder->nodes); + VEC_safe_push (lto_encoder_entry, heap, encoder->nodes, entry); + return ref; + } + slot = pointer_map_contains (encoder->map, node); if (!slot || !*slot) { @@ -688,7 +702,7 @@ compute_ltrans_boundary (lto_symtab_encoder_t in_encoder) lto_symtab_encoder_t encoder; lto_symtab_encoder_iterator lsei; - encoder = lto_symtab_encoder_new (); + encoder = lto_symtab_encoder_new (false); /* Go over all entries in the IN_ENCODER and duplicate them to ENCODER. At the same time insert masters of clones so @@ -1316,7 +1330,7 @@ input_symtab (void) if (!ib) fatal_error ("cannot find LTO cgraph in %s", file_data->file_name); input_profile_summary (ib, file_data); - file_data->symtab_node_encoder = lto_symtab_encoder_new (); + file_data->symtab_node_encoder = lto_symtab_encoder_new (true); nodes = input_cgraph_1 (file_data, ib); lto_destroy_simple_input_block (file_data, LTO_section_symtab_nodes, ib, data, len); diff --git a/gcc/lto-streamer.h b/gcc/lto-streamer.h index 6625b741beb..b2f8d30ff63 100644 --- a/gcc/lto-streamer.h +++ b/gcc/lto-streamer.h @@ -833,7 +833,7 @@ void lto_output_location (struct output_block *, location_t); /* In lto-cgraph.c */ -lto_symtab_encoder_t lto_symtab_encoder_new (void); +lto_symtab_encoder_t lto_symtab_encoder_new (bool); int lto_symtab_encoder_encode (lto_symtab_encoder_t, symtab_node); void lto_symtab_encoder_delete (lto_symtab_encoder_t); bool lto_symtab_encoder_delete_node (lto_symtab_encoder_t, symtab_node); diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog index 86acc2417d2..7218f4873cd 100644 --- a/gcc/lto/ChangeLog +++ b/gcc/lto/ChangeLog @@ -1,3 +1,9 @@ +2012-10-07 Jan Hubicka + + * lto.c (read_cgraph_and_symbols): Release type merging hash early; + release input encoders. + * lto-partition.c (new_partition): Update for new lto_symtab_encoder_new. + 2012-10-06 Jan Hubicka PR lto/54790 diff --git a/gcc/lto/lto-partition.c b/gcc/lto/lto-partition.c index b1310335a4a..32243fb83d3 100644 --- a/gcc/lto/lto-partition.c +++ b/gcc/lto/lto-partition.c @@ -99,7 +99,7 @@ static ltrans_partition new_partition (const char *name) { ltrans_partition part = XCNEW (struct ltrans_partition_def); - part->encoder = lto_symtab_encoder_new (); + part->encoder = lto_symtab_encoder_new (false); part->name = name; part->insns = 0; VEC_safe_push (ltrans_partition, heap, ltrans_partitions, part); diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c index c6b882d6941..d880c8a2062 100644 --- a/gcc/lto/lto.c +++ b/gcc/lto/lto.c @@ -2946,6 +2946,17 @@ read_cgraph_and_symbols (unsigned nfiles, const char **fnames) if (resolution_file_name) fclose (resolution); + /* Free gimple type merging datastructures. */ + htab_delete (gimple_types); + gimple_types = NULL; + htab_delete (type_hash_cache); + type_hash_cache = NULL; + free (type_pair_cache); + type_pair_cache = NULL; + gimple_type_leader = NULL; + free_gimple_type_tables (); + ggc_collect (); + /* Set the hooks so that all of the ipa passes can read in their data. */ lto_set_in_hooks (all_file_decl_data, get_section_data, free_section_data); @@ -2989,18 +3000,10 @@ read_cgraph_and_symbols (unsigned nfiles, const char **fnames) if (seen_error ()) fatal_error ("errors during merging of translation units"); - /* Fixup all decls and types and free the type hash tables. */ + /* Fixup all decls. */ lto_fixup_decls (all_file_decl_data); htab_delete (tree_with_vars); tree_with_vars = NULL; - htab_delete (gimple_types); - gimple_types = NULL; - htab_delete (type_hash_cache); - type_hash_cache = NULL; - free (type_pair_cache); - type_pair_cache = NULL; - gimple_type_leader = NULL; - free_gimple_type_tables (); ggc_collect (); timevar_pop (TV_IPA_LTO_DECL_MERGE); @@ -3015,6 +3018,13 @@ read_cgraph_and_symbols (unsigned nfiles, const char **fnames) else ipa_read_summaries (); + for (i = 0; all_file_decl_data[i]; i++) + { + 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; + } + /* Finally merge the cgraph according to the decl merging decisions. */ timevar_push (TV_IPA_LTO_CGRAPH_MERGE); if (cgraph_dump_file) diff --git a/gcc/passes.c b/gcc/passes.c index c20f4782412..27bdb829417 100644 --- a/gcc/passes.c +++ b/gcc/passes.c @@ -2544,7 +2544,7 @@ ipa_write_summaries (void) if (!flag_generate_lto || seen_error ()) return; - encoder = lto_symtab_encoder_new (); + encoder = lto_symtab_encoder_new (false); /* Create the callgraph set in the same order used in cgraph_expand_all_functions. This mostly facilitates debugging,