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: Add obstack for canonical file name hash table


Hi,
here is updated patch. Now the hash is freed though it is not
extraordinarily large (for firefox about 20k entries which roughly
correspond to number of source files)

Bootstrapped/regtested x86_64-linux. OK?

	* lto-streamer-in.c: Include alloc-pool.h.
	(freeing_string_slot_hasher): Remove.
	(string_slot_allocator): New object allocator.
	(file_name_hash_table): Turn to hash_table<string_slot_hasher>.
	(file_name_obstack): New obstack.
	(canon_file_name): Allocate in obstack and allocator.
	(lto_reader_init): Initialize obstack and allocator.
	(lto_free_file_name_hash): New function.
	* lto-streamer.h (lto_free_file_name_hash): New.
	* lto.c (do_whole_program_analysis): Call lto_free_file_name_hash.
Index: lto-streamer-in.c
===================================================================
--- lto-streamer-in.c	(revision 277796)
+++ lto-streamer-in.c	(working copy)
@@ -42,21 +42,18 @@ along with GCC; see the file COPYING3.
 #include "cgraph.h"
 #include "cfgloop.h"
 #include "debug.h"
+#include "alloc-pool.h"
 
-
-struct freeing_string_slot_hasher : string_slot_hasher
-{
-  static inline void remove (value_type *);
-};
-
-inline void
-freeing_string_slot_hasher::remove (value_type *v)
-{
-  free (v);
-}
+/* Allocator used to hold string slot entries for line map streaming.  */
+static struct object_allocator<struct string_slot> *string_slot_allocator;
 
 /* The table to hold the file names.  */
-static hash_table<freeing_string_slot_hasher> *file_name_hash_table;
+static hash_table<string_slot_hasher> *file_name_hash_table;
+
+/* This obstack holds file names used in locators. Line map datastructures
+   points here and thus it needs to be kept allocated as long as linemaps
+   exists.  */
+static struct obstack file_name_obstack;
 
 
 /* Check that tag ACTUAL has one of the given values.  NUM_TAGS is the
@@ -113,8 +110,8 @@ canon_file_name (const char *string)
       char *saved_string;
       struct string_slot *new_slot;
 
-      saved_string = (char *) xmalloc (len + 1);
-      new_slot = XCNEW (struct string_slot);
+      saved_string = XOBNEWVEC (&file_name_obstack, char, len + 1);
+      new_slot = string_slot_allocator->allocate ();
       memcpy (saved_string, string, len + 1);
       new_slot->s = saved_string;
       new_slot->len = len;
@@ -1722,7 +1719,23 @@ lto_reader_init (void)
 {
   lto_streamer_init ();
   file_name_hash_table
-    = new hash_table<freeing_string_slot_hasher> (37);
+    = new hash_table<string_slot_hasher> (37);
+  string_slot_allocator = new object_allocator <struct string_slot>
+				("line map file name hash");
+  gcc_obstack_init (&file_name_obstack);
+}
+
+/* Free hash table used to stream in location file names.  */
+
+void
+lto_free_file_name_hash (void)
+{
+  delete file_name_hash_table;
+  file_name_hash_table = NULL;
+  delete string_slot_allocator;
+  string_slot_allocator = NULL;
+  /* file_name_obstack must stay allocated since it is referred to by
+     line map table.  */
 }
 
 
Index: lto-streamer.h
===================================================================
--- lto-streamer.h	(revision 277796)
+++ lto-streamer.h	(working copy)
@@ -874,6 +874,7 @@ extern void lto_streamer_hooks_init (voi
 /* In lto-streamer-in.c */
 extern void lto_input_cgraph (struct lto_file_decl_data *, const char *);
 extern void lto_reader_init (void);
+extern void lto_free_file_name_hash (void);
 extern void lto_input_function_body (struct lto_file_decl_data *,
 				     struct cgraph_node *,
Index: lto/lto.c
===================================================================
--- lto/lto.c	(revision 277796)
+++ lto/lto.c	(working copy)
@@ -475,6 +476,9 @@ do_whole_program_analysis (void)
   /* We are about to launch the final LTRANS phase, stop the WPA timer.  */
   timevar_pop (TV_WHOPR_WPA);
 
+  /* We are no longer going to stream in anything.  Free some memory.  */
+  lto_free_file_name_hash ();
+
   timevar_push (TV_WHOPR_PARTITIONING);
 
   gcc_assert (!dump_file);


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