]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
cpphash.c (_cpp_destroy_hashtable): Use ht_destroy.
authorNeil Booth <neil@daikokuya.demon.co.uk>
Sat, 11 Aug 2001 12:37:19 +0000 (12:37 +0000)
committerNeil Booth <neil@gcc.gnu.org>
Sat, 11 Aug 2001 12:37:19 +0000 (12:37 +0000)
* 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.

From-SVN: r44794

gcc/ChangeLog
gcc/cpphash.c
gcc/cpphash.h
gcc/cppinit.c
gcc/cpplex.c
gcc/cpplib.c
gcc/hashtable.c
gcc/hashtable.h

index 825bd12356688a9c2bbe69c368fa847286caf78a..6214570295151abec0375ad4f82079687eea96d1 100644 (file)
@@ -1,3 +1,17 @@
+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>
 
index 9e15ab48f03080192cdaa1f46ee21cfd74d384e9..def51715f43a0abadc5eb27c02686f5b864cc834 100644 (file)
@@ -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);
     }
 }
index cbca913f70a050e088667a7aca539cb73fb56435..27e221c6b58879786c29181b9f3a13c0f5c31fce 100644 (file)
@@ -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)
 
index 5a3873464fcbe01035182d177d588ce6d6bdd876..63bcfdd3735b5feb9a8c26611a81679c751321e2 100644 (file)
@@ -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;
index 5e0aa5a4f8549c848632240d4329af7bfbe2db39..9446aae592e1f2f46f68e78cbd147e2154f6b535 100644 (file)
@@ -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.  */
index 719daaa99dd54ca1bec15450b76f397dd8e2f585..9404a00ea8e8668c173ec3919b4338625c2551cc 100644 (file)
@@ -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;
index 82c3a9e51ae7f6282d632f66693c16bcad1d4248..7d0359a2c613b5e3636962bdc38a7be293858192 100644 (file)
@@ -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
index 5b08fde25b630f7fcf8810f817bbe89ca9a29a30..cd6c7f0be06284832a9e4b097f60b4feeec3d304 100644 (file)
@@ -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));