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
This was triggering in some of the bigger translation units that cause
a lot of GC activity.
2012-03-14 Diego Novillo <dnovi...@google.com>
* parser.c (the_lexer): Declare.
(c_parse_file): Set to NULL.
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 8c231c02..0d87b0f 100644
@@ -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
@@ -627,7 +635,7 @@ cp_lexer_new_main (void)
allocating any memory. */
- 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);
the_parser = NULL;
+ the_lexer = NULL;
if (pph_enabled_p ())
This patch is available for review at http://codereview.appspot.com/5822055