This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[pph] Add a GC root for the lexer (issue5822055)
- From: dnovillo at google dot com (Diego Novillo)
- To: reply at codereview dot appspotmail dot com,crowl at google dot com,gcc-patches at gcc dot gnu dot org
- Date: Wed, 14 Mar 2012 19:56:05 -0400 (EDT)
- Subject: [pph] Add a GC root for the lexer (issue5822055)
Add a GC root for the lexer.
This GC root is required to support running the garbage collector
during lexing. This happens when the lexer loads pre-parsed headers.
Loading these headers calls into the middle-end, which may run the
garbage collector.
This was triggering in some of the bigger translation units that cause
a lot of GC activity.
2012-03-14 Diego Novillo <dnovillo@google.com>
* parser.c (the_lexer): Declare.
(cp_lexer_new_main): Initialize.
(c_parse_file): Set to NULL.
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 8c231c02..0d87b0f 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -613,6 +613,14 @@ cp_lexer_alloc (void)
}
+/* The lexer. This GC root is required to support running the
+ garbage collector during lexing. This happens when the lexer loads
+ pre-parsed headers. Loading these headers calls into the
+ middle-end, which may run the garbage collector. */
+
+static GTY (()) cp_lexer *the_lexer;
+
+
/* Create a new main C++ lexer, the lexer that gets tokens from the
preprocessor. */
@@ -627,7 +635,7 @@ cp_lexer_new_main (void)
allocating any memory. */
cp_parser_initial_pragma (&token);
- lexer = cp_lexer_alloc ();
+ the_lexer = lexer = cp_lexer_alloc ();
/* Put the first token in the buffer. */
VEC_quick_push (cp_token, lexer->buffer, &token);
@@ -27497,6 +27505,7 @@ c_parse_file (void)
? dk_no_deferred : dk_no_check);
cp_parser_translation_unit (the_parser);
the_parser = NULL;
+ the_lexer = NULL;
if (pph_enabled_p ())
pph_finish ();
--
This patch is available for review at http://codereview.appspot.com/5822055