summaryrefslogtreecommitdiff
path: root/libcpp/pch.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2013-03-01 22:06:04 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2013-03-01 22:06:04 +0100
commit3b8af25b7ad47b31463046af1f244ad7af5900a9 (patch)
tree78997fd39595c6ea1728a0697ea35af66c6f87b7 /libcpp/pch.c
parent689eaba3227c8616894de845d38ef9c8e10de9a1 (diff)
re PR middle-end/56461 (GCC is leaking lots of memory)
PR middle-end/56461 * files.c (_cpp_save_file_entries): Free result at the end. * pch.c (cpp_string_free): New function. (cpp_save_state): Use it in htab_create call. (cpp_write_pch_deps): Free ss->defs. Destroy ss->definedhash. From-SVN: r196394
Diffstat (limited to 'libcpp/pch.c')
-rw-r--r--libcpp/pch.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/libcpp/pch.c b/libcpp/pch.c
index 94e5d21ab7a..6270bda53ed 100644
--- a/libcpp/pch.c
+++ b/libcpp/pch.c
@@ -187,6 +187,16 @@ cpp_string_eq (const void *a_p, const void *b_p)
&& memcmp (a->text, b->text, a->len) == 0);
}
+/* Free memory associated with cpp_string. */
+
+static void
+cpp_string_free (void *a_p)
+{
+ struct cpp_string *a = (struct cpp_string *) a_p;
+ free ((void *) a->text);
+ free (a);
+}
+
/* Save the current definitions of the cpp_reader for dependency
checking purposes. When writing a precompiled header, this should
be called at the same point in the compilation as cpp_valid_state
@@ -198,7 +208,7 @@ cpp_save_state (cpp_reader *r, FILE *f)
/* Save the list of non-void identifiers for the dependency checking. */
r->savedstate = XNEW (struct cpp_savedstate);
r->savedstate->definedhash = htab_create (100, cpp_string_hash,
- cpp_string_eq, NULL);
+ cpp_string_eq, cpp_string_free);
cpp_forall_identifiers (r, save_idents, r->savedstate);
/* Write out the list of defined identifiers. */
@@ -336,6 +346,8 @@ cpp_write_pch_deps (cpp_reader *r, FILE *f)
return -1;
}
free (ss->definedstrs);
+ free (ss->defs);
+ htab_delete (ss->definedhash);
/* Free the saved state. */
free (ss);