tree.h (save_eptr, save_filt): Now file scoped statics.
authorJeff Law <law@redhat.com>
Thu, 2 Dec 2004 04:56:42 +0000 (21:56 -0700)
committerJeff Law <law@gcc.gnu.org>
Thu, 2 Dec 2004 04:56:42 +0000 (21:56 -0700)
        * tree.h (save_eptr, save_filt): Now file scoped statics.
        (honor_protect_cleanup_actions): Only create save_eptr and
        save_filt if they do not already exist.
        (lower_eh_constructs): Wipe all knowledge of save_eptr and
        save_filt before returning.

From-SVN: r91613

gcc/ChangeLog
gcc/tree-eh.c

index d6cfd717c7d1d609b802d6b388dca9b6f16512ee..6c7d2a062c37f53e8350aaac4654486917a7139e 100644 (file)
@@ -1,3 +1,11 @@
+2004-12-01  Jeff Law  <law@redhat.com>
+
+        * tree.h (save_eptr, save_filt): Now file scoped statics.
+        (honor_protect_cleanup_actions): Only create save_eptr and
+        save_filt if they do not already exist.
+        (lower_eh_constructs): Wipe all knowledge of save_eptr and
+        save_filt before returning.
+
 2004-12-02  Kazu Hirata  <kazu@cs.umass.edu>
 
        * tree-phinodes.c (remove_phi_arg_num): Fix a comment.
index b7ed2edc38797f9605bbeb6cde4c32ce41a2ab5d..08a8a0f19cb5774c6070d20d17fa625b25b4ff01 100644 (file)
@@ -37,6 +37,21 @@ Boston, MA 02111-1307, USA.  */
 #include "langhooks.h"
 #include "ggc.h"
 
+/* In some circumstances we have to save EH data around a nested
+   exception.  The EXC_PTR_EXPR and FILTER_EXPR values are saved
+   into these _DECL nodes.
+
+   We lazily create this pair of _DECL nodes once per function rather
+   than creating a new pair of _DECLs each time we need to save the
+   EXEC_PTR and FILTER.  This can save us literally thousands of _DECL
+   nodes when we have many inline destructors with an embedded try block.  
+
+   This is safe as we know the lifetime of the values in these _DECL nodes.
+   Their lifetimes also ensure that globbing these uses into a single
+   pair of _DECL nodes requires no additional PHI_NODEs or SSA_NAMEs when
+   compared to having a pair of _DECL nodes per inline destructor with
+   an embedded try block.  */
+static tree save_eptr, save_filt;
 \f
 /* Nonzero if we are using EH to handle cleanups.  */
 static int using_eh_for_cleanups_p = 0;
@@ -807,10 +822,13 @@ honor_protect_cleanup_actions (struct leh_state *outer_state,
      we never fallthru from this copy of the finally block.  */
   if (finally_may_fallthru)
     {
-      tree save_eptr, save_filt;
-
-      save_eptr = create_tmp_var (ptr_type_node, "save_eptr");
-      save_filt = create_tmp_var (integer_type_node, "save_filt");
+      /* If we have not created _DECLs for saving the EXC_PTR
+        and FILTER_EXPR, create them now.  */
+      if (!save_eptr)
+       {
+         save_eptr = create_tmp_var (ptr_type_node, "save_eptr");
+         save_filt = create_tmp_var (integer_type_node, "save_filt");
+       }
 
       i = tsi_start (finally);
       x = build (EXC_PTR_EXPR, ptr_type_node);
@@ -1644,6 +1662,11 @@ lower_eh_constructs (void)
   htab_delete (finally_tree);
 
   collect_eh_region_array ();
+
+  /* Wipe the DECLs we use for saving the EXC_PTR and FILTER_EXPR
+     to ensure we create new ones for the next function.  */
+  save_eptr = NULL;
+  save_filt = NULL;
 }
 
 struct tree_opt_pass pass_lower_eh =