diff options
author | geoffk <geoffk@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-01-10 02:22:34 +0000 |
---|---|---|
committer | geoffk <geoffk@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-01-10 02:22:34 +0000 |
commit | 573aba856d39e5b11d72261a6ccb6004dcb923cd (patch) | |
tree | a3ff2e89f1924fd7ea1d99358736bc8491352747 /gcc/stringpool.c | |
parent | 4e844289dc2d6aca17add7956465217079eccdb6 (diff) | |
download | gcc-573aba856d39e5b11d72261a6ccb6004dcb923cd.tar.gz |
Merge from pch-branch.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@61136 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/stringpool.c')
-rw-r--r-- | gcc/stringpool.c | 93 |
1 files changed, 85 insertions, 8 deletions
diff --git a/gcc/stringpool.c b/gcc/stringpool.c index f3b34b139cf..1edb46f66a6 100644 --- a/gcc/stringpool.c +++ b/gcc/stringpool.c @@ -1,5 +1,5 @@ /* String pool for GCC. - Copyright (C) 2000, 2001 Free Software Foundation, Inc. + Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. This file is part of GCC. @@ -50,7 +50,6 @@ static struct obstack string_stack; static hashnode alloc_node PARAMS ((hash_table *)); static int mark_ident PARAMS ((struct cpp_reader *, hashnode, const PTR)); -static void mark_ident_hash PARAMS ((void *)); /* Initialize the string pool. */ void @@ -60,7 +59,6 @@ init_stringpool () ident_hash = ht_create (14); ident_hash->alloc_node = alloc_node; gcc_obstack_init (&string_stack); - ggc_add_root (&ident_hash, 1, sizeof ident_hash, mark_ident_hash); } /* Allocate a hash node. */ @@ -160,15 +158,94 @@ mark_ident (pfile, h, v) hashnode h; const PTR v ATTRIBUTE_UNUSED; { - ggc_mark_tree (HT_IDENT_TO_GCC_IDENT (h)); + gt_ggc_m_9tree_node (HT_IDENT_TO_GCC_IDENT (h)); return 1; } -/* Mark all identifiers for GC. */ +/* Mark the trees hanging off the identifier node for GGC. These are + handled specially (not using gengtype) because of the special + treatment for strings. */ -static void -mark_ident_hash (arg) - PTR arg ATTRIBUTE_UNUSED; +void +ggc_mark_stringpool () { ht_forall (ident_hash, mark_ident, NULL); } + +/* Strings are _not_ GCed, but this routine exists so that a separate + roots table isn't needed for the few global variables that refer + to strings. */ + +void +gt_ggc_m_S (x) + void *x ATTRIBUTE_UNUSED; +{ +} + +/* Pointer-walking routine for strings (not very interesting, since + strings don't contain pointers). */ + +void +gt_pch_p_S (obj, x, op, cookie) + void *obj ATTRIBUTE_UNUSED; + void *x ATTRIBUTE_UNUSED; + gt_pointer_operator op ATTRIBUTE_UNUSED; + void *cookie ATTRIBUTE_UNUSED; +{ +} + +/* PCH pointer-walking routine for strings. */ + +void +gt_pch_n_S (x) + const void *x; +{ + gt_pch_note_object ((void *)x, (void *)x, >_pch_p_S); +} + +/* Handle saving and restoring the string pool for PCH. */ + +struct string_pool_data GTY(()) +{ + tree * GTY((length ("%h.nslots"))) entries; + unsigned int nslots; + unsigned int nelements; +}; + +static GTY(()) struct string_pool_data * spd; + +void +gt_pch_save_stringpool () +{ + unsigned int i; + + spd = ggc_alloc (sizeof (*spd)); + spd->nslots = ident_hash->nslots; + spd->nelements = ident_hash->nelements; + spd->entries = ggc_alloc (sizeof (tree *) * spd->nslots); + for (i = 0; i < spd->nslots; i++) + if (ident_hash->entries[i] != NULL) + spd->entries[i] = HT_IDENT_TO_GCC_IDENT (ident_hash->entries[i]); + else + spd->entries[i] = NULL; +} + +void +gt_pch_restore_stringpool () +{ + unsigned int i; + + ident_hash->nslots = spd->nslots; + ident_hash->nelements = spd->nelements; + ident_hash->entries = xrealloc (ident_hash->entries, + sizeof (hashnode) * spd->nslots); + for (i = 0; i < spd->nslots; i++) + if (spd->entries[i] != NULL) + ident_hash->entries[i] = GCC_IDENT_TO_HT_IDENT (spd->entries[i]); + else + ident_hash->entries[i] = NULL; + + spd = NULL; +} + +#include "gt-stringpool.h" |