]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
* lto-cgraph.c (lto_symtab_encoder_new): New parameter FOR_INPUT.
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 7 Oct 2012 17:16:02 +0000 (17:16 +0000)
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 7 Oct 2012 17:16:02 +0000 (17:16 +0000)
(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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@192184 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/lto-cgraph.c
gcc/lto-streamer.h
gcc/lto/ChangeLog
gcc/lto/lto-partition.c
gcc/lto/lto.c
gcc/passes.c

index 204fed8e77692947e5ec2fc73e7122e8f4a19f60..9543444b460280b2ae710cc18af482b147fb7a22 100644 (file)
@@ -1,3 +1,12 @@
+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.
index f96ed3d36d3a56c01a95096d523ffa1d68706512..4f952f59bf9f8230a34b7bb968a71b722e9dcf89 100644 (file)
@@ -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);
index 6625b741bebc3bf28c0b6628b7137efc65318950..b2f8d30ff636011d871231d89562fdda5f89c4da 100644 (file)
@@ -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);
index 86acc2417d275cc91b0ac933521ce4f756ea53ce..7218f4873cd874779a6f0538a59b9ff46f490e31 100644 (file)
@@ -1,3 +1,9 @@
+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 
index b1310335a4a141cbd9dc2182f992f66391686ea6..32243fb83d3bfb130cee75741e52624a3808fbfe 100644 (file)
@@ -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);
index c6b882d6941696af4f8fa21f0e3b43bf6a1f2609..d880c8a2062a994ac5d05dc01cad1c805ddab15b 100644 (file)
@@ -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)
index c20f4782412ab8309b7da60e9bc5fb28c14ce45c..27bdb829417efbe1ab4a5c3ea84dd9821c5f0585 100644 (file)
@@ -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,