* 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.
* 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.
From-SVN: r192184
+2012-10-07 Jan Hubicka <jh@suse.cz>
+
+ * 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 <rdsandiford@googlemail.com>
* config/mips/mips-protos.h (mips_split_type): New enum.
2012-10-07 Richard Sandiford <rdsandiford@googlemail.com>
* config/mips/mips-protos.h (mips_split_type): New enum.
-/* 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_new (void)
+lto_symtab_encoder_new (bool for_input)
{
lto_symtab_encoder_t encoder = XCNEW (struct lto_symtab_encoder_d);
{
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;
}
encoder->nodes = NULL;
return encoder;
}
lto_symtab_encoder_delete (lto_symtab_encoder_t encoder)
{
VEC_free (lto_encoder_entry, heap, encoder->nodes);
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);
+ 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)
{
slot = pointer_map_contains (encoder->map, node);
if (!slot || !*slot)
{
lto_symtab_encoder_t encoder;
lto_symtab_encoder_iterator lsei;
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
/* Go over all entries in the IN_ENCODER and duplicate them to
ENCODER. At the same time insert masters of clones so
if (!ib)
fatal_error ("cannot find LTO cgraph in %s", file_data->file_name);
input_profile_summary (ib, file_data);
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);
nodes = input_cgraph_1 (file_data, ib);
lto_destroy_simple_input_block (file_data, LTO_section_symtab_nodes,
ib, data, len);
-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);
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);
+2012-10-07 Jan Hubicka <jh@suse.cz>
+
+ * 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 <jh@suse.cz>
PR lto/54790
2012-10-06 Jan Hubicka <jh@suse.cz>
PR lto/54790
new_partition (const char *name)
{
ltrans_partition part = XCNEW (struct ltrans_partition_def);
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);
part->name = name;
part->insns = 0;
VEC_safe_push (ltrans_partition, heap, ltrans_partitions, part);
if (resolution_file_name)
fclose (resolution);
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);
/* 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);
if (seen_error ())
fatal_error ("errors during merging of translation units");
if (seen_error ())
fatal_error ("errors during merging of translation units");
- /* Fixup all decls and types and free the type hash tables. */
lto_fixup_decls (all_file_decl_data);
htab_delete (tree_with_vars);
tree_with_vars = NULL;
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);
ggc_collect ();
timevar_pop (TV_IPA_LTO_DECL_MERGE);
else
ipa_read_summaries ();
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)
/* Finally merge the cgraph according to the decl merging decisions. */
timevar_push (TV_IPA_LTO_CGRAPH_MERGE);
if (cgraph_dump_file)
if (!flag_generate_lto || seen_error ())
return;
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,
/* Create the callgraph set in the same order used in
cgraph_expand_all_functions. This mostly facilitates debugging,