diff mbox

[pph] Add a GC root for the lexer (issue5822055)

Message ID 20120314235605.2B5D8AE1E4@tobiano.tor.corp.google.com
State New
Headers show

Commit Message

Diego Novillo March 14, 2012, 11:56 p.m. UTC
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.


--
This patch is available for review at http://codereview.appspot.com/5822055
diff mbox

Patch

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 ();