except.c (call_eh_info): Split out...

* except.c (call_eh_info): Split out...
	(push_eh_info): From here.
	(expand_builtin_throw): Use it.
	(expand_start_catch_block): Move region start back.

From-SVN: r16349
This commit is contained in:
Jason Merrill 1997-11-06 08:02:08 +00:00 committed by Jason Merrill
parent eaf407a54e
commit 95e8dcbaa0
2 changed files with 51 additions and 23 deletions

View File

@ -1,3 +1,10 @@
Wed Nov 5 23:52:50 1997 Jason Merrill <jason@yorick.cygnus.com>
* except.c (call_eh_info): Split out...
(push_eh_info): From here.
(expand_builtin_throw): Use it.
(expand_start_catch_block): Move region start back.
Tue Nov 4 13:45:10 1997 Doug Evans <devans@canuck.cygnus.com>
* lex.c (MULTIBYTE_CHARS): #undef if cross compiling.

View File

@ -306,13 +306,12 @@ init_exception_processing ()
protect_cleanup_actions_with_terminate = 1;
}
/* Retrieve a pointer to the cp_eh_info node for the current exception
and save it in the current binding level. */
/* Retrieve a pointer to the cp_eh_info node for the current exception. */
static void
push_eh_info ()
static tree
call_eh_info ()
{
tree decl, fn;
tree fn;
fn = get_identifier ("__cp_exception_info");
if (IDENTIFIER_GLOBAL_VALUE (fn))
@ -358,7 +357,16 @@ push_eh_info ()
assemble_external (fn);
pop_obstacks ();
}
fn = build_function_call (fn, NULL_TREE);
return build_function_call (fn, NULL_TREE);
}
/* Retrieve a pointer to the cp_eh_info node for the current exception
and save it in the current binding level. */
static void
push_eh_info ()
{
tree decl, fn = call_eh_info ();
/* Remember the pointer to the current exception info; it won't change
during this catch block. */
@ -533,21 +541,6 @@ expand_start_catch_block (declspecs, declarator)
push_eh_info ();
/* If we are not doing setjmp/longjmp EH, because we are reordered
out of line, we arrange to rethrow in the outer context so as to
skip through the terminate region we are nested in, should we
encounter an exception in the catch handler.
If we are doing setjmp/longjmp EH, we need to skip through the EH
object cleanup region. This isn't quite right, as we really need
to clean the object up, but we cannot do that until we track
multiple EH objects.
Matches the end in expand_end_catch_block. */
expand_eh_region_start ();
push_eh_cleanup ();
if (declspecs)
{
tree exp;
@ -559,6 +552,12 @@ expand_start_catch_block (declspecs, declarator)
if (decl == NULL_TREE)
{
error ("invalid catch parameter");
/* This is cheap, but we want to maintain the data
structures. */
expand_eh_region_start ();
return;
}
@ -591,6 +590,8 @@ expand_start_catch_block (declspecs, declarator)
/* if it returned FALSE, jump over the catch block, else fall into it */
emit_jump_insn (gen_beq (false_label_rtx));
push_eh_cleanup ();
init = convert_from_reference (save_expr (make_tree (init_type, call_rtx)));
/* Do we need the below two lines? */
@ -599,10 +600,29 @@ expand_start_catch_block (declspecs, declarator)
decl = pushdecl (decl);
cp_finish_decl (decl, init, NULL_TREE, 0, LOOKUP_ONLYCONVERTING);
}
else
{
push_eh_cleanup ();
/* 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);
/* If we are not doing setjmp/longjmp EH, because we are reordered
out of line, we arrange to rethrow in the outer context so as to
skip through the terminate region we are nested in, should we
encounter an exception in the catch handler.
If we are doing setjmp/longjmp EH, we need to skip through the EH
object cleanup region. This isn't quite right, as we really need
to clean the object up, but we cannot do that until we track
multiple EH objects.
Matches the end in expand_end_catch_block. */
expand_eh_region_start ();
emit_line_note (input_filename, lineno);
}
@ -814,8 +834,9 @@ expand_builtin_throw ()
/* These two can be frontend specific. If wanted, they can go in
expand_throw. */
/* Do we have a valid object we are throwing? */
t = get_eh_type ();
emit_cmp_insn (DECL_RTL (t), const0_rtx, EQ, NULL_RTX,
t = call_eh_info ();
emit_cmp_insn (expand_expr (t, NULL_RTX, Pmode, 0),
const0_rtx, EQ, NULL_RTX,
GET_MODE (DECL_RTL (t)), 0, 0);
emit_jump_insn (gen_beq (gotta_call_terminate));