Add obstack for canonical file name hash table
Richard Biener
rguenther@suse.de
Tue Nov 5 10:55:00 GMT 2019
On Tue, 5 Nov 2019, Jan Hubicka wrote:
> Hi,
> looking into malloc overhead I noticed that we do a lot of small
> allocations to hold file names comming from location info. This patch
> puts it into an obstack so it interleaves memory allocated by scc_hash
> less frequently.
> (Still we end up interleaving 64k pages which are permanent - in fact
> this table seems to leak from WPA and temporary during stream in)
>
> Bootstrapped/regtested x86_64-linux. OK?
I think the obstack deserves a big fat comment that it cannot be
reclaimed since the linemap retains permanent pointers into it.
That also suggests to put the string_slot into a separate obstack
or better, make the hasher (and other string_slot hashers)
embed the string_slot struct in the hash? We'd save an allocation
everywhere.
Richard.
> Honza
>
> * lto-streamer-in.c (file_name_obstack): New obstack.
> (canon_file_name): Use it.
> (lto_reader_init): Initialize it.
> Index: lto-streamer-in.c
> ===================================================================
> --- lto-streamer-in.c (revision 277796)
> +++ lto-streamer-in.c (working copy)
> @@ -57,6 +57,7 @@ freeing_string_slot_hasher::remove (valu
>
> /* The table to hold the file names. */
> static hash_table<freeing_string_slot_hasher> *file_name_hash_table;
> +static struct obstack file_name_obstack;
>
>
> /* Check that tag ACTUAL has one of the given values. NUM_TAGS is the
> @@ -113,8 +114,9 @@ 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 = XOBNEWVAR (&file_name_obstack,
> + struct string_slot, sizeof (struct string_slot));
> memcpy (saved_string, string, len + 1);
> new_slot->s = saved_string;
> new_slot->len = len;
> @@ -1723,6 +1725,7 @@ lto_reader_init (void)
> lto_streamer_init ();
> file_name_hash_table
> = new hash_table<freeing_string_slot_hasher> (37);
> + gcc_obstack_init (&file_name_obstack);
> }
>
>
>
--
Richard Biener <rguenther@suse.de>
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)
More information about the Gcc-patches
mailing list