Minimize clone counter memory usage in LTO.
authorMichael Ploujnikov <michael.ploujnikov@oracle.com>
Fri, 30 Nov 2018 22:31:02 +0000 (22:31 +0000)
committerMichael Ploujnikov <plouj@gcc.gnu.org>
Fri, 30 Nov 2018 22:31:02 +0000 (22:31 +0000)
gcc/lto:

* lto-partition.c (privatize_symbol_name_1): Keep track of
non-unique symbol counters in the lto_clone_numbers hash
map.
(lto_promote_cross_file_statics): Allocate and free the
lto_clone_numbers hash map.
(lto_promote_statics_nonwpa): Free the lto_clone_numbers hash
map.

From-SVN: r266693

gcc/lto/ChangeLog
gcc/lto/lto-partition.c

index ca998df..7b9846c 100644 (file)
@@ -1,3 +1,14 @@
+2018-11-30  Michael Ploujnikov  <michael.ploujnikov@oracle.com>
+
+       Minimize clone counter memory usage in LTO.
+       * lto-partition.c (privatize_symbol_name_1): Keep track of
+       non-unique symbol counters in the lto_clone_numbers hash
+       map.
+       (lto_promote_cross_file_statics): Allocate and free the
+       lto_clone_numbers hash map.
+       (lto_promote_statics_nonwpa): Free the lto_clone_numbers hash
+       map.
+
 2018-11-28  Jan Hubicka  <jh@suse.cz>
 
        * lto.c (lto_read_decls): Fix handling of INTEGER_CST.
index 24e7c23..867f075 100644 (file)
@@ -951,6 +951,9 @@ validize_symbol_for_target (symtab_node *node)
     }
 }
 
+/* Maps symbol names to unique lto clone counters.  */
+static hash_map<const char *, unsigned> *lto_clone_numbers;
+
 /* Helper for privatize_symbol_name.  Mangle NODE symbol name
    represented by DECL.  */
 
@@ -963,9 +966,11 @@ privatize_symbol_name_1 (symtab_node *node, tree decl)
     return false;
 
   name = maybe_rewrite_identifier (name);
+  unsigned &clone_number = lto_clone_numbers->get_or_insert (name);
   symtab->change_decl_assembler_name (decl,
-                                     clone_function_name_numbered (
-                                         name, "lto_priv"));
+                                     clone_function_name (
+                                         name, "lto_priv", clone_number));
+  clone_number++;
 
   if (node->lto_file_data)
     lto_record_renamed_decl (node->lto_file_data, name,
@@ -1157,6 +1162,8 @@ lto_promote_cross_file_statics (void)
       part->encoder = compute_ltrans_boundary (part->encoder);
     }
 
+  lto_clone_numbers = new hash_map<const char *, unsigned>;
+
   /* Look at boundaries and promote symbols as needed.  */
   for (i = 0; i < n_sets; i++)
     {
@@ -1187,6 +1194,7 @@ lto_promote_cross_file_statics (void)
           promote_symbol (node);
         }
     }
+  delete lto_clone_numbers;
 }
 
 /* Rename statics in the whole unit in the case that 
@@ -1196,9 +1204,12 @@ void
 lto_promote_statics_nonwpa (void)
 {
   symtab_node *node;
+
+  lto_clone_numbers = new hash_map<const char *, unsigned>;
   FOR_EACH_SYMBOL (node)
     {
       rename_statics (NULL, node);
       validize_symbol_for_target (node);
     }
+  delete lto_clone_numbers;
 }