]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Reuse the saved_scope structures allocated by push_to_top_level
authorPatrick Palka <ppalka@gcc.gnu.org>
Thu, 21 Apr 2016 21:55:35 +0000 (21:55 +0000)
committerPatrick Palka <ppalka@gcc.gnu.org>
Thu, 21 Apr 2016 21:55:35 +0000 (21:55 +0000)
gcc/cp/ChangeLog:

* name-lookup.c (free_saved_scope): New free list of saved_scope
structures.
(push_to_top_level): Attempt to reuse a saved_scope struct
from free_saved_scope instead of allocating a new one each time.
(pop_from_top_level_1): Chain the now-unused saved_scope structure
onto free_saved_scope.

From-SVN: r235351

gcc/cp/ChangeLog
gcc/cp/name-lookup.c

index 5a9ad978d8341eefe6c9ab6d3e7a9cba0e959d39..ecfad0fe5fec4756cfc70b90cbf83aac56d1bdb1 100644 (file)
@@ -1,3 +1,12 @@
+2016-04-21  Patrick Palka  <ppalka@gcc.gnu.org>
+
+       * name-lookup.c (free_saved_scope): New free list of saved_scope
+       structures.
+       (push_to_top_level): Attempt to reuse a saved_scope struct
+       from free_saved_scope instead of allocating a new one each time.
+       (pop_from_top_level_1): Chain the now-unused saved_scope structure
+       onto free_saved_scope.
+
 2016-04-21  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/70540
index b3828c0956b4bfb35c4204f334eb22e8a9c743d5..86d260c83c100085d0f92bff8a74f9accb5db1ff 100644 (file)
@@ -6135,6 +6135,10 @@ store_class_bindings (vec<cp_class_binding, va_gc> *names,
   timevar_cond_stop (TV_NAME_LOOKUP, subtime);
 }
 
+/* A chain of saved_scope structures awaiting reuse.  */
+
+static GTY((deletable)) struct saved_scope *free_saved_scope;
+
 void
 push_to_top_level (void)
 {
@@ -6145,7 +6149,21 @@ push_to_top_level (void)
   bool need_pop;
 
   bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
-  s = ggc_cleared_alloc<saved_scope> ();
+
+  /* Reuse or create a new structure for this saved scope.  */
+  if (free_saved_scope != NULL)
+    {
+      s = free_saved_scope;
+      free_saved_scope = s->prev;
+
+      vec<cxx_saved_binding, va_gc> *old_bindings = s->old_bindings;
+      memset (s, 0, sizeof (*s));
+      /* Also reuse the structure's old_bindings vector.  */
+      vec_safe_truncate (old_bindings, 0);
+      s->old_bindings = old_bindings;
+    }
+  else
+    s = ggc_cleared_alloc<saved_scope> ();
 
   b = scope_chain ? current_binding_level : 0;
 
@@ -6238,6 +6256,11 @@ pop_from_top_level_1 (void)
   current_function_decl = s->function_decl;
   cp_unevaluated_operand = s->unevaluated_operand;
   c_inhibit_evaluation_warnings = s->inhibit_evaluation_warnings;
+
+  /* Make this saved_scope structure available for reuse by
+     push_to_top_level.  */
+  s->prev = free_saved_scope;
+  free_saved_scope = s;
 }
 
 /* Wrapper for pop_from_top_level_1.  */