aboutsummaryrefslogtreecommitdiff
path: root/gcc/lto-streamer-in.c
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@gcc.gnu.org>2019-11-07 17:06:04 +0000
committerJan Hubicka <hubicka@gcc.gnu.org>2019-11-07 17:06:04 +0000
commitc38ee9a2e87ea6d23580c364b3997acfce4a125c (patch)
tree4e7df7e181a2561c419bfaf86691f41d43e95adc /gcc/lto-streamer-in.c
parent095f78c62157124ad479a3f98b6995ced090b807 (diff)
downloadgcc-c38ee9a2e87ea6d23580c364b3997acfce4a125c.zip
gcc-c38ee9a2e87ea6d23580c364b3997acfce4a125c.tar.gz
gcc-c38ee9a2e87ea6d23580c364b3997acfce4a125c.tar.bz2
lto-streamer-in.c: Include alloc-pool.h.
* 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. From-SVN: r277924
Diffstat (limited to 'gcc/lto-streamer-in.c')
-rw-r--r--gcc/lto-streamer-in.c43
1 files changed, 28 insertions, 15 deletions
diff --git a/gcc/lto-streamer-in.c b/gcc/lto-streamer-in.c
index 76a005e..93ec8be 100644
--- a/gcc/lto-streamer-in.c
+++ b/gcc/lto-streamer-in.c
@@ -42,21 +42,18 @@ along with GCC; see the file COPYING3. If not see
#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. */
}