[patch] Banish except.h from the front ends

Steven Bosscher stevenb.gcc@gmail.com
Sun Jun 27 21:59:00 GMT 2010


Hello,

The implementation of exception handling is a middle-end thing, so
front ends do not need to know about anything defined in except.h.

Well, almost nothing: init_eh and init_eh_for_function are called from
front ends (esp. init_eh for Ada and LTO) because not all front ends
let toplev initialize EH handling. This makes sense because a front
end may not know at the start of the compilation of a file whether EH
will be needed or not (and in Ada: what kind of EH).

Bootstrapped on x86_64-unknown-linux-gnu all languages except java,
which does not build for me, without the patch or with.
OK for trunk?

Ciao!
Steven


gcc/ChangeLog:
	* system.h: Poison GCC_EXCEPT_H for front-end files.

	* langhooks.h (struct lang_hooks): Add eh_protect_cleanup_actions
	langhook.
	* langhooks-def.h (LANG_HOOKS_EH_PROTECT_CLEANUP_ACTIONS) New.
	Define to NULL by default.
	* except.h: Define GCC_EXCEPT_H.
	(doing_eh): Remove prototype.
	(init_eh, init_eh_for_function): Move prototypes to toplev.h.
	(lang_protect_cleanup_actions): Remove.
	* except.c (lang_protect_cleanup_actions): Remove.
	(doing_eh): Remove.
	(gen_eh_region): Don't check doing_eh here.
	* toplev.h (init_eh, init_eh_for_function_): Moved from except.h.
	* tree-eh.c (honor_protect_cleanup_actions): Use new langhook
	instead of lang_protect_cleanup_actions.
	* omp-low.c (maybe_catch_exception): Likewise.

gcc/c-family/ChangeLog:
	* c-cppbuiltin.c: Do not include except.h.

gcc/objc/ChangeLog:
	* objc-act.c: Do not include except.h.

gcc/cp/ChangeLog:
	* init.c: Do not include except.h.
	* decl.c: Likewise.
	* expr.c: Likewise.
	* cp-lang.c: Likewise.
	* pt.c: Likewise.
	* semantics.c: Likewise.
	* decl2.c: Likewise.
	* except.c: Likewise.
	(init_exception_processing): Do not set the removed
	lang_protect_cleanup_actions here.
	(cp_protect_cleanup_actions): Make non-static and remove prototype.
	(doing_eh): New, moved from except.c but removed the do_warning flag.
	(expand_start_catch_block): Update doing_eh call.
	(expand_end_catch_block): Likewise.
	(build_throw): Likewise.
	* cp-tree.h: Prototype cp_protect_cleanup_actions.
	* cp-objcp-common.h: Set LANG_HOOKS_EH_PROTECT_CLEANUP_ACTIONS to
	cp_protect_cleanup_actions.

gcc/objcp/ChangeLog:
	* objcp-lang.c: Do not include except.h.

gcc/java/ChangeLog:
	* lang.c: Do not include except.h
	* except.c: Likewise.
	(doing_eh): New, moved from except.c (in gcc/) but removed the
	do_warning flag.
	(maybe_start_try): Update doing_eh call.

Index: system.h
===================================================================
--- system.h	(revision 161470)
+++ system.h	(working copy)
@@ -799,7 +799,7 @@ extern void fancy_abort (const char *, int, const
 /* Front ends should never have to include middle-end headers.  Enforce
    this by poisoning the header double-include protection defines.  */
 #ifdef IN_GCC_FRONTEND
-#pragma GCC poison GCC_RTL_H
+#pragma GCC poison GCC_RTL_H GCC_EXCEPT_H
 #endif

 /* Note: not all uses of the `index' token (e.g. variable names and
Index: langhooks.h
===================================================================
--- langhooks.h	(revision 161470)
+++ langhooks.h	(working copy)
@@ -446,6 +446,14 @@ struct lang_hooks
   /* Map a type to a runtime object to match type.  */
   tree (*eh_runtime_type) (tree);

+  /* If non-NULL, this is a function that returns a function decl to be
+     executed if an unhandled exception is propagated out of a cleanup
+     region.  For example, in C++, an exception thrown by a destructor
+     during stack unwinding is required to result in a call to
+     `std::terminate', so the C++ version of this function returns a
+     FUNCTION_DECL for `std::terminate'.  */
+  tree (*eh_protect_cleanup_actions) (void);
+
   /* True if this language uses __cxa_end_cleanup when the ARM EABI
      is enabled.  */
   bool eh_use_cxa_end_cleanup;
Index: langhooks-def.h
===================================================================
--- langhooks-def.h	(revision 161470)
+++ langhooks-def.h	(working copy)
@@ -110,6 +110,7 @@ extern void lhd_omp_firstprivatize_type_sizes (str
 #define LANG_HOOKS_INIT_TS		lhd_do_nothing
 #define LANG_HOOKS_EH_PERSONALITY	lhd_gcc_personality
 #define LANG_HOOKS_EH_RUNTIME_TYPE	lhd_pass_through_t
+#define LANG_HOOKS_EH_PROTECT_CLEANUP_ACTIONS	NULL
 #define LANG_HOOKS_EH_USE_CXA_END_CLEANUP	false
 #define LANG_HOOKS_DEEP_UNSHARING	false

@@ -299,6 +300,7 @@ extern void lhd_end_section (void);
   LANG_HOOKS_EXPR_TO_DECL, \
   LANG_HOOKS_EH_PERSONALITY, \
   LANG_HOOKS_EH_RUNTIME_TYPE, \
+  LANG_HOOKS_EH_PROTECT_CLEANUP_ACTIONS, \
   LANG_HOOKS_EH_USE_CXA_END_CLEANUP, \
   LANG_HOOKS_DEEP_UNSHARING \
 }
Index: except.h
===================================================================
--- except.h	(revision 161470)
+++ except.h	(working copy)
@@ -19,6 +19,13 @@ You should have received a copy of the GNU General
 along with GCC; see the file COPYING3.  If not see
 <http://www.gnu.org/licenses/>.  */

+/* No include guards here, but define an include file marker anyway, so
+   that the compiler can keep track of where this file is included.  This
+   is e.g. used to avoid including this file in front-end specific files.  */
+#ifndef GCC_EXCEPT_H
+#  define GCC_EXCEPT_H
+#endif
+
 #include "hashtab.h"
 #include "vecprim.h"
 #include "vecir.h"
@@ -222,16 +229,10 @@ struct GTY(()) eh_status
 };


-/* Test: is exception handling turned on?  */
-extern int doing_eh (int);
-
 /* Invokes CALLBACK for every exception handler label.  Only used by old
    loop hackery; should not be used by new code.  */
 extern void for_each_eh_label (void (*) (rtx));

-extern void init_eh (void);
-extern void init_eh_for_function (void);
-
 extern void remove_eh_landing_pad (eh_landing_pad);
 extern void remove_eh_handler (eh_region);

@@ -287,14 +288,6 @@ extern void assign_filter_values (void);
 extern eh_region get_eh_region_from_rtx (const_rtx);
 extern eh_landing_pad get_eh_landing_pad_from_rtx (const_rtx);

-/* If non-NULL, this is a function that returns a function decl to be
-   executed if an unhandled exception is propagated out of a cleanup
-   region.  For example, in C++, an exception thrown by a destructor
-   during stack unwinding is required to result in a call to
-   `std::terminate', so the C++ version of this function returns a
-   FUNCTION_DECL for `std::terminate'.  */
-extern tree (*lang_protect_cleanup_actions) (void);
-
 struct GTY(()) throw_stmt_node {
   gimple stmt;
   int lp_nr;
Index: except.c
===================================================================
--- except.c	(revision 161470)
+++ except.c	(working copy)
@@ -40,7 +40,7 @@ along with GCC; see the file COPYING3.  If not see

    During pass_lower_eh (tree-eh.c) we record the nested structure
    of the TRY nodes in EH_REGION nodes in CFUN->EH->REGION_TREE.
-   We expand the lang_protect_cleanup_actions hook into MUST_NOT_THROW
+   We expand the eh_protect_cleanup_actions langhook into MUST_NOT_THROW
    regions at this time.  We can then flatten the statements within
    the TRY nodes to straight-line code.  Statements that had been within
    TRY nodes that can throw are recorded within CFUN->EH->THROW_STMT_TABLE,
@@ -150,10 +150,6 @@ along with GCC; see the file COPYING3.  If not see
 #define EH_RETURN_DATA_REGNO(N) INVALID_REGNUM
 #endif

-/* Protect cleanup actions with must-not-throw regions, with a call
-   to the given failure handler.  */
-tree (*lang_protect_cleanup_actions) (void);
-
 static GTY(()) int call_site_base;
 static GTY ((param_is (union tree_node)))
   htab_t type_to_runtime_map;
@@ -203,30 +199,6 @@ static void dw2_output_call_site_table (int, int);
 static void sjlj_output_call_site_table (void);



-/* Routine to see if exception handling is turned on.
-   DO_WARN is nonzero if we want to inform the user that exception
-   handling is turned off.
-
-   This is used to ensure that -fexceptions has been specified if the
-   compiler tries to use any exception-specific functions.  */
-
-int
-doing_eh (int do_warn)
-{
-  if (! flag_exceptions)
-    {
-      static int warned = 0;
-      if (! warned && do_warn)
-	{
-	  error ("exception handling disabled, use -fexceptions to enable");
-	  warned = 1;
-	}
-      return 0;
-    }
-  return 1;
-}
-
-

 void
 init_eh (void)
 {
@@ -345,10 +317,6 @@ gen_eh_region (enum eh_region_type type, eh_region
 {
   eh_region new_eh;

-#ifdef ENABLE_CHECKING
-  gcc_assert (doing_eh (0));
-#endif
-
   /* Insert a new blank region as a leaf in the tree.  */
   new_eh = ggc_alloc_cleared_eh_region_d ();
   new_eh->type = type;
Index: toplev.h
===================================================================
--- toplev.h	(revision 161470)
+++ toplev.h	(working copy)
@@ -49,6 +49,9 @@ extern void init_optimization_passes (void);
 extern void finish_optimization_passes (void);
 extern bool enable_rtl_dump_file (void);

+extern void init_eh (void);
+extern void init_eh_for_function (void);
+
 extern void announce_function (tree);

 extern void error_for_asm (const_rtx, const char *, ...)
ATTRIBUTE_GCC_DIAG(2,3);
Index: tree-eh.c
===================================================================
--- tree-eh.c	(revision 161470)
+++ tree-eh.c	(working copy)
@@ -951,12 +951,12 @@ lower_try_finally_fallthru_label (struct leh_tf_st
   return label;
 }

-/* A subroutine of lower_try_finally.  If lang_protect_cleanup_actions
-   returns non-null, then the language requires that the exception path out
-   of a try_finally be treated specially.  To wit: the code within the
-   finally block may not itself throw an exception.  We have two choices here.
-   First we can duplicate the finally block and wrap it in a must_not_throw
-   region.  Second, we can generate code like
+/* A subroutine of lower_try_finally.  If the eh_protect_cleanup_actions
+   langhook returns non-null, then the language requires that the exception
+   path out of a try_finally be treated specially.  To wit: the code within
+   the finally block may not itself throw an exception.  We have two choices
+   here. First we can duplicate the finally block and wrap it in a
+   must_not_throw region.  Second, we can generate code like

 	try {
 	  finally_block;
@@ -983,9 +983,9 @@ honor_protect_cleanup_actions (struct leh_state *o
   gimple x;

   /* First check for nothing to do.  */
-  if (lang_protect_cleanup_actions == NULL)
+  if (lang_hooks.eh_protect_cleanup_actions == NULL)
     return;
-  protect_cleanup_actions = lang_protect_cleanup_actions ();
+  protect_cleanup_actions = lang_hooks.eh_protect_cleanup_actions ();
   if (protect_cleanup_actions == NULL)
     return;

Index: omp-low.c
===================================================================
--- omp-low.c	(revision 161470)
+++ omp-low.c	(working copy)
@@ -3112,8 +3112,8 @@ maybe_catch_exception (gimple_seq body)
   if (!flag_exceptions)
     return body;

-  if (lang_protect_cleanup_actions)
-    decl = lang_protect_cleanup_actions ();
+  if (lang_hooks.eh_protect_cleanup_actions != NULL)
+    decl = lang_hooks.eh_protect_cleanup_actions ();
   else
     decl = built_in_decls[BUILT_IN_TRAP];

Index: c-family/c-cppbuiltin.c
===================================================================
--- c-family/c-cppbuiltin.c	(revision 161470)
+++ c-family/c-cppbuiltin.c	(working copy)
@@ -28,7 +28,6 @@ along with GCC; see the file COPYING3.  If not see
 #include "c-common.h"
 #include "c-pragma.h"
 #include "output.h"
-#include "except.h"		/* For USING_SJLJ_EXCEPTIONS.  */
 #include "debug.h"		/* For dwarf2out_do_cfi_asm.  */
 #include "toplev.h"
 #include "tm_p.h"		/* For TARGET_CPU_CPP_BUILTINS & friends.  */
Index: objc/objc-act.c
===================================================================
--- objc/objc-act.c	(revision 161470)
+++ objc/objc-act.c	(working copy)
@@ -59,7 +59,6 @@ along with GCC; see the file COPYING3.  If not see
 #include "langhooks.h"
 #include "objc-act.h"
 #include "input.h"
-#include "except.h"	/* For USING_SJLJ_EXCEPTIONS.  */
 #include "function.h"
 #include "output.h"
 #include "toplev.h"
Index: cp/init.c
===================================================================
--- cp/init.c	(revision 161470)
+++ cp/init.c	(working copy)
@@ -30,7 +30,6 @@ along with GCC; see the file COPYING3.  If not see
 #include "cp-tree.h"
 #include "flags.h"
 #include "output.h"
-#include "except.h"
 #include "toplev.h"
 #include "target.h"

Index: cp/decl.c
===================================================================
--- cp/decl.c	(revision 161470)
+++ cp/decl.c	(working copy)
@@ -40,7 +40,6 @@ along with GCC; see the file COPYING3.  If not see
 #include "decl.h"
 #include "intl.h"
 #include "output.h"
-#include "except.h"
 #include "toplev.h"
 #include "hashtab.h"
 #include "tm_p.h"
Index: cp/expr.c
===================================================================
--- cp/expr.c	(revision 161470)
+++ cp/expr.c	(working copy)
@@ -28,7 +28,6 @@ along with GCC; see the file COPYING3.  If not see
 #include "flags.h"
 #include "cp-tree.h"
 #include "toplev.h"
-#include "except.h"
 #include "tm_p.h"

 /* Expand C++-specific constants.  Currently, this means PTRMEM_CST.  */
Index: cp/cp-lang.c
===================================================================
--- cp/cp-lang.c	(revision 161470)
+++ cp/cp-lang.c	(working copy)
@@ -32,7 +32,6 @@ along with GCC; see the file COPYING3.  If not see
 #include "debug.h"
 #include "cp-objcp-common.h"
 #include "hashtab.h"
-#include "except.h"

 enum c_language_kind c_language = clk_cxx;
 static void cp_init_ts (void);
Index: cp/pt.c
===================================================================
--- cp/pt.c	(revision 161470)
+++ cp/pt.c	(working copy)
@@ -40,7 +40,6 @@ along with GCC; see the file COPYING3.  If not see
 #include "tree-inline.h"
 #include "decl.h"
 #include "output.h"
-#include "except.h"
 #include "toplev.h"
 #include "timevar.h"
 #include "tree-iterator.h"
Index: cp/semantics.c
===================================================================
--- cp/semantics.c	(revision 161470)
+++ cp/semantics.c	(working copy)
@@ -33,7 +33,6 @@ along with GCC; see the file COPYING3.  If not see
 #include "c-family/c-common.h"
 #include "tree-inline.h"
 #include "tree-mudflap.h"
-#include "except.h"
 #include "toplev.h"
 #include "flags.h"
 #include "output.h"
Index: cp/decl2.c
===================================================================
--- cp/decl2.c	(revision 161470)
+++ cp/decl2.c	(working copy)
@@ -37,7 +37,6 @@ along with GCC; see the file COPYING3.  If not see
 #include "cp-tree.h"
 #include "decl.h"
 #include "output.h"
-#include "except.h"
 #include "toplev.h"
 #include "timevar.h"
 #include "cpplib.h"
Index: cp/except.c
===================================================================
--- cp/except.c	(revision 161470)
+++ cp/except.c	(working copy)
@@ -31,7 +31,6 @@ along with GCC; see the file COPYING3.  If not see
 #include "cp-tree.h"
 #include "flags.h"
 #include "output.h"
-#include "except.h"
 #include "toplev.h"
 #include "tree-inline.h"
 #include "tree-iterator.h"
@@ -50,7 +49,6 @@ static tree wrap_cleanups_r (tree *, int *, void *
 static int complete_ptr_ref_or_void_ptr_p (tree, tree);
 static bool is_admissible_throw_operand (tree);
 static int can_convert_eh (tree, tree);
-static tree cp_protect_cleanup_actions (void);

 /* Sets up all the global eh stuff that needs to be initialized at the
    start of compilation.  */
@@ -72,14 +70,12 @@ init_exception_processing (void)
   tmp = build_function_type_list (void_type_node, ptr_type_node, NULL_TREE);
   call_unexpected_node
     = push_throw_library_fn (get_identifier ("__cxa_call_unexpected"), tmp);
-
-  lang_protect_cleanup_actions = &cp_protect_cleanup_actions;
 }

 /* Returns an expression to be executed if an unhandled exception is
    propagated out of a cleanup region.  */

-static tree
+tree
 cp_protect_cleanup_actions (void)
 {
   /* [except.terminate]
@@ -407,6 +403,30 @@ initialize_handler_parm (tree decl, tree exp)
 		  LOOKUP_ONLYCONVERTING|DIRECT_BIND);
 }

+

+/* Routine to see if exception handling is turned on.
+   DO_WARN is nonzero if we want to inform the user that exception
+   handling is turned off.
+
+   This is used to ensure that -fexceptions has been specified if the
+   compiler tries to use any exception-specific functions.  */
+
+static inline int
+doing_eh (void)
+{
+  if (! flag_exceptions)
+    {
+      static int warned = 0;
+      if (! warned)
+	{
+	  error ("exception handling disabled, use -fexceptions to enable");
+	  warned = 1;
+	}
+      return 0;
+    }
+  return 1;
+}
+
 /* Call this to start a catch block.  DECL is the catch parameter.  */

 tree
@@ -415,7 +435,7 @@ expand_start_catch_block (tree decl)
   tree exp;
   tree type, init;

-  if (! doing_eh (1))
+  if (! doing_eh ())
     return NULL_TREE;

   /* Make sure this declaration is reasonable.  */
@@ -494,7 +514,7 @@ expand_start_catch_block (tree decl)
 void
 expand_end_catch_block (void)
 {
-  if (! doing_eh (1))
+  if (! doing_eh ())
     return;

   /* The exception being handled is rethrown if control reaches the end of
@@ -641,7 +661,7 @@ build_throw (tree exp)
 	return error_mark_node;
     }

-  if (! doing_eh (1))
+  if (! doing_eh ())
     return error_mark_node;

   if (exp && decl_is_java_type (TREE_TYPE (exp), 1))
Index: cp/cp-tree.h
===================================================================
--- cp/cp-tree.h	(revision 161470)
+++ cp/cp-tree.h	(working copy)
@@ -4855,6 +4855,7 @@ extern tree eh_type_info			(tree);
 extern tree begin_eh_spec_block			(void);
 extern void finish_eh_spec_block		(tree, tree);
 extern tree build_eh_type_type			(tree);
+extern tree cp_protect_cleanup_actions		(void);

 /* in expr.c */
 extern tree cplus_expand_constant		(tree);
Index: cp/cp-objcp-common.h
===================================================================
--- cp/cp-objcp-common.h	(revision 161470)
+++ cp/cp-objcp-common.h	(working copy)
@@ -143,4 +143,7 @@ extern bool cp_function_decl_explicit_p (tree decl
 #undef LANG_HOOKS_EH_USE_CXA_END_CLEANUP
 #define LANG_HOOKS_EH_USE_CXA_END_CLEANUP true

+#undef LANG_HOOKS_EH_PROTECT_CLEANUP_ACTIONS
+#define LANG_HOOKS_EH_PROTECT_CLEANUP_ACTIONS cp_protect_cleanup_actions
+
 #endif /* GCC_CP_OBJCP_COMMON */
Index: objcp/objcp-lang.c
===================================================================
--- objcp/objcp-lang.c	(revision 161470)
+++ objcp/objcp-lang.c	(working copy)
@@ -30,7 +30,6 @@ along with GCC; see the file COPYING3.  If not see
 #include "langhooks.h"
 #include "langhooks-def.h"
 #include "cp-objcp-common.h"
-#include "except.h"	/* For USING_SJLJ_EXCEPTIONS.  */

 enum c_language_kind c_language = clk_objcxx;
 static void objcxx_init_ts (void);
Index: java/lang.c
===================================================================
--- java/lang.c	(revision 161470)
+++ java/lang.c	(working copy)
@@ -43,7 +43,6 @@ The Free Software Foundation is independent of Sun
 #include "tree-dump.h"
 #include "opts.h"
 #include "options.h"
-#include "except.h"	/* For USING_SJLJ_EXCEPTIONS.  */

 static bool java_init (void);
 static void java_finish (void);
Index: java/except.c
===================================================================
--- java/except.c	(revision 161470)
+++ java/except.c	(working copy)
@@ -31,7 +31,6 @@ The Free Software Foundation is independent of Sun
 #include "javaop.h"
 #include "java-opcodes.h"
 #include "jcf.h"
-#include "except.h"	/* for doing_eh.  */
 #include "java-except.h"
 #include "toplev.h"
 #include "tree-iterator.h"
@@ -565,6 +564,29 @@ check_start_handlers (struct eh_range *range, int
 }


+/* Routine to see if exception handling is turned on.
+   DO_WARN is nonzero if we want to inform the user that exception
+   handling is turned off.
+
+   This is used to ensure that -fexceptions has been specified if the
+   compiler tries to use any exception-specific functions.  */
+
+static inline int
+doing_eh (void)
+{
+  if (! flag_exceptions)
+    {
+      static int warned = 0;
+      if (! warned)
+	{
+	  error ("exception handling disabled, use -fexceptions to enable");
+	  warned = 1;
+	}
+      return 0;
+    }
+  return 1;
+}
+
 static struct eh_range *current_range;

 /* Emit any start-of-try-range starting at start_pc and ending after
@@ -574,7 +596,7 @@ void
 maybe_start_try (int start_pc, int end_pc)
 {
   struct eh_range *range;
-  if (! doing_eh (1))
+  if (! doing_eh ())
     return;

   range = find_handler (start_pc);
Index: ada/gcc-interface/misc.c
===================================================================
--- ada/gcc-interface/misc.c	(revision 161470)
+++ ada/gcc-interface/misc.c	(working copy)
@@ -25,7 +25,7 @@

 /* This file contains parts of the compiler that are required for interfacing
    with GCC but otherwise do nothing and parts of Gigi that need to know
-   about RTL.  */
+   about GIMPLE.  */

 #include "config.h"
 #include "system.h"



More information about the Gcc-patches mailing list