summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog14
-rw-r--r--gcc/cpphash.c2
-rw-r--r--gcc/cpphash.h4
-rw-r--r--gcc/cppinit.c14
-rw-r--r--gcc/cpplex.c7
-rw-r--r--gcc/cpplib.c6
-rw-r--r--gcc/hashtable.c11
-rw-r--r--gcc/hashtable.h5
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));