aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorAndrew MacLeod <amacleod@cygnus.com>1998-09-15 11:20:52 +0000
committerAndrew Macleod <amacleod@gcc.gnu.org>1998-09-15 11:20:52 +0000
commitbf71cd2eaa2d7091cd02f429beeec279b6a5c52d (patch)
tree6b24980704695c7ec0f059391cfe4c686deb5c76 /gcc/cp
parent8a21007c9409ad2be041c05c304295ff449538b7 (diff)
downloadgcc-bf71cd2eaa2d7091cd02f429beeec279b6a5c52d.zip
gcc-bf71cd2eaa2d7091cd02f429beeec279b6a5c52d.tar.gz
gcc-bf71cd2eaa2d7091cd02f429beeec279b6a5c52d.tar.bz2
[multiple changes]
Tue Sep 15 14:10:54 EDT 1998 Andrew MacLeod <amacleod@cygnus.com> * except.h (struct eh_entry): Add false_label field. (end_catch_handler): Add prototype. * except.c (push_eh_entry): Set false_label field to NULL_RTX. (start_catch_handler): When using old style exceptions, issue runtime typematch code before continuing with the handler. (end_catch_handler): New function, generates label after handler if needed by older style exceptions. (expand_start_all_catch): No need to check for new style exceptions. (output_exception_table_entry): Only output the first handler label for old style exceptions. * libgcc2.c (__eh_rtime_match): New routine to lump runtime matching mechanism into one function, if a runtime matcher is provided. 1998-09-15 Andrew MacLeod <amacleod@cygnus.com> * cp/except.c (expand_start_catch_block): No need to check for new exception model. (process_start_catch_block_old): Deleted. (process_start_catch_block): Add call to start_decl_1(). (expand_end_catch_block): Add call to end_catch_handler(). * cp/exception.cc (__cplus_type_matcher): Only check the exception language if there is an exception table. From-SVN: r22425
Diffstat (limited to 'gcc/cp')
-rw-r--r--gcc/cp/ChangeLog10
-rw-r--r--gcc/cp/except.c131
-rw-r--r--gcc/cp/exception.cc4
3 files changed, 17 insertions, 128 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 6fd77b1..9ed5652 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,15 @@
1998-09-15 Andrew MacLeod <amacleod@cygnus.com>
+ * except.c (expand_start_catch_block): No need to check for new
+ exception model.
+ (process_start_catch_block_old): Deleted.
+ (process_start_catch_block): Add call to start_decl_1().
+ (expand_end_catch_block): Add call to end_catch_handler().
+ * exception.cc (__cplus_type_matcher): Only check the exception
+ language if there is an exception table.
+
+1998-09-15 Andrew MacLeod <amacleod@cygnus.com>
+
* search.c (expand_indirect_vtbls_init): Mark temporary stack slots
as used to prevent conflicts with virtual function tables.
diff --git a/gcc/cp/except.c b/gcc/cp/except.c
index 69315be..c3ae357 100644
--- a/gcc/cp/except.c
+++ b/gcc/cp/except.c
@@ -597,135 +597,14 @@ expand_start_catch_block (declspecs, declarator)
if (! doing_eh (1))
return;
- if (flag_new_exceptions)
- process_start_catch_block (declspecs, declarator);
- else
- process_start_catch_block_old (declspecs, declarator);
+ process_start_catch_block (declspecs, declarator);
}
/* This function performs the expand_start_catch_block functionality for
- exceptions implemented in the old style, where catch blocks were all
- called, and had to check the runtime information themselves. */
-
-static void
-process_start_catch_block_old (declspecs, declarator)
- tree declspecs, declarator;
-{
- rtx false_label_rtx;
- tree decl = NULL_TREE;
- tree init;
-
- /* Create a binding level for the eh_info and the exception object
- cleanup. */
- pushlevel (0);
- expand_start_bindings (0);
-
- false_label_rtx = gen_label_rtx ();
- push_label_entry (&false_label_stack, false_label_rtx, NULL_TREE);
-
- emit_line_note (input_filename, lineno);
-
- push_eh_info ();
-
- if (declspecs)
- {
- decl = grokdeclarator (declarator, declspecs, CATCHPARM, 1, NULL_TREE);
-
- if (decl == NULL_TREE)
- error ("invalid catch parameter");
- }
-
- if (decl)
- {
- tree exp;
- rtx call_rtx, return_value_rtx;
- tree init_type;
-
- /* Make sure we mark the catch param as used, otherwise we'll get
- a warning about an unused ((anonymous)). */
- TREE_USED (decl) = 1;
-
- /* Figure out the type that the initializer is. */
- init_type = TREE_TYPE (decl);
- if (TREE_CODE (init_type) != REFERENCE_TYPE
- && TREE_CODE (init_type) != POINTER_TYPE)
- init_type = build_reference_type (init_type);
-
- exp = get_eh_value ();
-
- /* Since pointers are passed by value, initialize a reference to
- pointer catch parm with the address of the value slot. */
- if (TREE_CODE (init_type) == REFERENCE_TYPE
- && TREE_CODE (TREE_TYPE (init_type)) == POINTER_TYPE)
- exp = build_unary_op (ADDR_EXPR, exp, 1);
-
- exp = expr_tree_cons (NULL_TREE,
- build_eh_type_type (TREE_TYPE (decl)),
- expr_tree_cons (NULL_TREE,
- get_eh_type (),
- expr_tree_cons (NULL_TREE, exp, NULL_TREE)));
- exp = build_function_call (CatchMatch, exp);
- call_rtx = expand_call (exp, NULL_RTX, 0);
-
- return_value_rtx = hard_function_value (ptr_type_node, exp);
-
- /* did the throw type match function return TRUE? */
- emit_cmp_insn (return_value_rtx, const0_rtx, EQ, NULL_RTX,
- GET_MODE (return_value_rtx), 0, 0);
-
- /* if it returned FALSE, jump over the catch block, else fall into it */
- emit_jump_insn (gen_beq (false_label_rtx));
-
- push_eh_cleanup ();
-
- /* Create a binding level for the parm. */
- pushlevel (0);
- expand_start_bindings (0);
-
- init = convert_from_reference (make_tree (init_type, call_rtx));
-
- /* If the constructor for the catch parm exits via an exception, we
- must call terminate. See eh23.C. */
- if (TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl)))
- {
- /* Generate the copy constructor call directly so we can wrap it.
- See also expand_default_init. */
- init = ocp_convert (TREE_TYPE (decl), init,
- CONV_IMPLICIT|CONV_FORCE_TEMP, 0);
- init = build (TRY_CATCH_EXPR, TREE_TYPE (init), init,
- build_terminate_handler ());
- }
-
- /* Let `cp_finish_decl' know that this initializer is ok. */
- DECL_INITIAL (decl) = init;
- decl = pushdecl (decl);
-
- start_decl_1 (decl);
- cp_finish_decl (decl, DECL_INITIAL (decl),
- NULL_TREE, 0, LOOKUP_ONLYCONVERTING);
- }
- else
- {
- push_eh_cleanup ();
-
- /* Create a binding level for the parm. */
- pushlevel (0);
- expand_start_bindings (0);
-
- /* Fall into the catch all section. */
- }
-
- init = build_modify_expr (get_eh_caught (), NOP_EXPR, integer_one_node);
- expand_expr (init, const0_rtx, VOIDmode, EXPAND_NORMAL);
-
- emit_line_note (input_filename, lineno);
-}
-
-/* This function performs the expand_start_catch_block functionality for
exceptions implemented in the new style. __throw determines whether
a handler needs to be called or not, so the handler itself has to do
- nothing additionaal. */
+ nothing additional. */
static void
process_start_catch_block (declspecs, declarator)
@@ -806,6 +685,7 @@ process_start_catch_block (declspecs, declarator)
DECL_INITIAL (decl) = init;
decl = pushdecl (decl);
+ start_decl_1 (decl);
cp_finish_decl (decl, init, NULL_TREE, 0, LOOKUP_ONLYCONVERTING);
}
else
@@ -849,10 +729,7 @@ expand_end_catch_block ()
documentation. */
expand_goto (top_label_entry (&caught_return_label_stack));
- /* label we emit to jump to if this catch block didn't match. */
- /* This the closing } in the `if (eq) {' of the documentation. */
- if (! flag_new_exceptions)
- emit_label (pop_label_entry (&false_label_stack));
+ end_catch_handler ();
}
/* An exception spec is implemented more or less like:
diff --git a/gcc/cp/exception.cc b/gcc/cp/exception.cc
index 4c10404..5fafd1f 100644
--- a/gcc/cp/exception.cc
+++ b/gcc/cp/exception.cc
@@ -157,7 +157,9 @@ __cplus_type_matcher (cp_eh_info *info, rtimetype match_info,
{
void *ret;
- if (exception_table->lang.language != EH_LANG_C_plus_plus)
+ /* No exception table implies the old style mechanism, so don't check. */
+ if (exception_table != NULL &&
+ exception_table->lang.language != EH_LANG_C_plus_plus)
return NULL;
if (match_info == CATCH_ALL_TYPE)