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 <dnovi...@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