diff options
-rw-r--r-- | gcc/ChangeLog | 14 | ||||
-rw-r--r-- | gcc/cpphash.c | 2 | ||||
-rw-r--r-- | gcc/cpphash.h | 4 | ||||
-rw-r--r-- | gcc/cppinit.c | 14 | ||||
-rw-r--r-- | gcc/cpplex.c | 7 | ||||
-rw-r--r-- | gcc/cpplib.c | 6 | ||||
-rw-r--r-- | gcc/hashtable.c | 11 | ||||
-rw-r--r-- | gcc/hashtable.h | 5 |
8 files changed, 51 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 825bd123566..62145702951 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,4 +1,18 @@ 2001-08-11 Neil Booth <neil@daikokuya.demon.co.uk> + + * cpphash.c (_cpp_destroy_hashtable): Use ht_destroy. + * cpphash.h (CPP_IN_SYSTEM_HEADER): Fix. + (struct cpp_pool): New member first. + * cppinit.c (append_include_chain): Plug memory leaks. + * cpplib.c (cpp_register_pragma, cpp_register_pragma_space): + Allocate pragma structures from the (aligned) macro pool to + avoid leaking memory. + * cpplex.c (_cpp_init_pool, _cpp_free_pool): Use pool->first + so we don't leak memory. + * hashtable.c (ht_destroy): New. + * hashtable.h (ht_destroy): New. + +2001-08-11 Neil Booth <neil@daikokuya.demon.co.uk> Franz Sirl <Franz.Sirl-kernel@lauterbach.com> * c-lex.c (map): Make const. diff --git a/gcc/cpphash.c b/gcc/cpphash.c index 9e15ab48f03..def51715f43 100644 --- a/gcc/cpphash.c +++ b/gcc/cpphash.c @@ -73,7 +73,7 @@ _cpp_destroy_hashtable (pfile) { if (pfile->our_hashtable) { - free (pfile->hash_table); + ht_destroy (pfile->hash_table); obstack_free (&pfile->hash_ob, 0); } } diff --git a/gcc/cpphash.h b/gcc/cpphash.h index cbca913f70a..27e221c6b58 100644 --- a/gcc/cpphash.h +++ b/gcc/cpphash.h @@ -66,7 +66,7 @@ struct cpp_chunk typedef struct cpp_pool cpp_pool; struct cpp_pool { - struct cpp_chunk *cur, *locked; + struct cpp_chunk *cur, *locked, *first; unsigned char *pos; /* Current position. */ unsigned int align; unsigned int locks; @@ -368,7 +368,7 @@ extern unsigned char _cpp_trigraph_map[UCHAR_MAX + 1]; /* Macros. */ #define CPP_PRINT_DEPS(PFILE) CPP_OPTION (PFILE, print_deps) -#define CPP_IN_SYSTEM_HEADER(PFILE) (pfile->map && pfile->map->sysp) +#define CPP_IN_SYSTEM_HEADER(PFILE) ((PFILE)->map && (PFILE)->map->sysp) #define CPP_PEDANTIC(PF) CPP_OPTION (PF, pedantic) #define CPP_WTRADITIONAL(PF) CPP_OPTION (PF, warn_traditional) diff --git a/gcc/cppinit.c b/gcc/cppinit.c index 5a3873464fc..63bcfdd3735 100644 --- a/gcc/cppinit.c +++ b/gcc/cppinit.c @@ -197,8 +197,8 @@ path_include (pfile, list, path) while (1); } -/* Append DIR to include path PATH. DIR must be permanently allocated - and writable. */ +/* Append DIR to include path PATH. DIR must be allocated on the + heap; this routine takes responsibility for freeing it. */ static void append_include_chain (pfile, dir, path, cxx_aware) cpp_reader *pfile; @@ -212,8 +212,12 @@ append_include_chain (pfile, dir, path, cxx_aware) unsigned int len; if (*dir == '\0') - dir = xstrdup ("."); + { + free (dir); + dir = xstrdup ("."); + } _cpp_simplify_pathname (dir); + if (stat (dir, &st)) { /* Dirs that don't exist are silently ignored. */ @@ -221,12 +225,14 @@ append_include_chain (pfile, dir, path, cxx_aware) cpp_notice_from_errno (pfile, dir); else if (CPP_OPTION (pfile, verbose)) fprintf (stderr, _("ignoring nonexistent directory \"%s\"\n"), dir); + free (dir); return; } if (!S_ISDIR (st.st_mode)) { cpp_notice (pfile, "%s: Not a directory", dir); + free (dir); return; } @@ -375,7 +381,7 @@ merge_include_chains (pfile) brack = remove_dup_dir (pfile, qtail); } else - quote = brack; + quote = brack; CPP_OPTION (pfile, quote_include) = quote; CPP_OPTION (pfile, bracket_include) = brack; diff --git a/gcc/cpplex.c b/gcc/cpplex.c index 5e0aa5a4f85..9446aae592e 100644 --- a/gcc/cpplex.c +++ b/gcc/cpplex.c @@ -2109,7 +2109,8 @@ _cpp_init_pool (pool, size, align, temp) if (align & (align - 1)) abort (); pool->align = align; - pool->cur = new_chunk (size); + pool->first = new_chunk (size); + pool->cur = pool->first; pool->locked = 0; pool->locks = 0; if (temp) @@ -2136,7 +2137,7 @@ void _cpp_free_pool (pool) cpp_pool *pool; { - cpp_chunk *chunk = pool->cur, *next; + cpp_chunk *chunk = pool->first, *next; do { @@ -2144,7 +2145,7 @@ _cpp_free_pool (pool) free (chunk->base); chunk = next; } - while (chunk && chunk != pool->cur); + while (chunk && chunk != pool->first); } /* Reserve LEN bytes from a memory pool. */ diff --git a/gcc/cpplib.c b/gcc/cpplib.c index 719daaa99dd..9404a00ea8e 100644 --- a/gcc/cpplib.c +++ b/gcc/cpplib.c @@ -901,7 +901,8 @@ cpp_register_pragma (pfile, space, name, handler) } found: - new = xnew (struct pragma_entry); + new = (struct pragma_entry *) + _cpp_pool_alloc (&pfile->macro_pool, sizeof (struct pragma_entry)); new->name = name; new->len = strlen (name); new->isnspace = 0; @@ -929,7 +930,8 @@ cpp_register_pragma_space (pfile, space) p = p->next; } - new = xnew (struct pragma_entry); + new = (struct pragma_entry *) + _cpp_pool_alloc (&pfile->macro_pool, sizeof (struct pragma_entry)); new->name = space; new->len = len; new->isnspace = 1; diff --git a/gcc/hashtable.c b/gcc/hashtable.c index 82c3a9e51ae..7d0359a2c61 100644 --- a/gcc/hashtable.c +++ b/gcc/hashtable.c @@ -94,6 +94,17 @@ ht_create (order) return table; } +/* Frees all memory associated with a hash table. */ + +void +ht_destroy (table) + hash_table *table; +{ + obstack_free (&table->stack, NULL); + free (table->entries); + free (table); +} + /* Returns the hash entry for the a STR of length LEN. If that string already exists in the table, returns the existing entry, and, if INSERT is CPP_ALLOCED, frees the last obstack object. If the diff --git a/gcc/hashtable.h b/gcc/hashtable.h index 5b08fde25b6..cd6c7f0be06 100644 --- a/gcc/hashtable.h +++ b/gcc/hashtable.h @@ -64,8 +64,13 @@ struct ht }; extern void gcc_obstack_init PARAMS ((struct obstack *)); + /* Initialise the hashtable with 2 ^ order entries. */ extern hash_table *ht_create PARAMS ((unsigned int order)); + +/* Frees all memory associated with a hash table. */ +extern void ht_destroy PARAMS ((hash_table *)); + extern hashnode ht_lookup PARAMS ((hash_table *, const unsigned char *, unsigned int, enum ht_lookup_option)); |