Commit 95e8dcba by Jason Merrill Committed by Jason Merrill

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
parent eaf407a5
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> Tue Nov 4 13:45:10 1997 Doug Evans <devans@canuck.cygnus.com>
* lex.c (MULTIBYTE_CHARS): #undef if cross compiling. * lex.c (MULTIBYTE_CHARS): #undef if cross compiling.
......
...@@ -306,13 +306,12 @@ init_exception_processing () ...@@ -306,13 +306,12 @@ init_exception_processing ()
protect_cleanup_actions_with_terminate = 1; protect_cleanup_actions_with_terminate = 1;
} }
/* Retrieve a pointer to the cp_eh_info node for the current exception /* Retrieve a pointer to the cp_eh_info node for the current exception. */
and save it in the current binding level. */
static void static tree
push_eh_info () call_eh_info ()
{ {
tree decl, fn; tree fn;
fn = get_identifier ("__cp_exception_info"); fn = get_identifier ("__cp_exception_info");
if (IDENTIFIER_GLOBAL_VALUE (fn)) if (IDENTIFIER_GLOBAL_VALUE (fn))
...@@ -358,7 +357,16 @@ push_eh_info () ...@@ -358,7 +357,16 @@ push_eh_info ()
assemble_external (fn); assemble_external (fn);
pop_obstacks (); 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 /* Remember the pointer to the current exception info; it won't change
during this catch block. */ during this catch block. */
...@@ -533,21 +541,6 @@ expand_start_catch_block (declspecs, declarator) ...@@ -533,21 +541,6 @@ expand_start_catch_block (declspecs, declarator)
push_eh_info (); 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) if (declspecs)
{ {
tree exp; tree exp;
...@@ -559,6 +552,12 @@ expand_start_catch_block (declspecs, declarator) ...@@ -559,6 +552,12 @@ expand_start_catch_block (declspecs, declarator)
if (decl == NULL_TREE) if (decl == NULL_TREE)
{ {
error ("invalid catch parameter"); error ("invalid catch parameter");
/* This is cheap, but we want to maintain the data
structures. */
expand_eh_region_start ();
return; return;
} }
...@@ -591,6 +590,8 @@ expand_start_catch_block (declspecs, declarator) ...@@ -591,6 +590,8 @@ expand_start_catch_block (declspecs, declarator)
/* if it returned FALSE, jump over the catch block, else fall into it */ /* if it returned FALSE, jump over the catch block, else fall into it */
emit_jump_insn (gen_beq (false_label_rtx)); emit_jump_insn (gen_beq (false_label_rtx));
push_eh_cleanup ();
init = convert_from_reference (save_expr (make_tree (init_type, call_rtx))); init = convert_from_reference (save_expr (make_tree (init_type, call_rtx)));
/* Do we need the below two lines? */ /* Do we need the below two lines? */
...@@ -599,10 +600,29 @@ expand_start_catch_block (declspecs, declarator) ...@@ -599,10 +600,29 @@ expand_start_catch_block (declspecs, declarator)
decl = pushdecl (decl); decl = pushdecl (decl);
cp_finish_decl (decl, init, NULL_TREE, 0, LOOKUP_ONLYCONVERTING); 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); init = build_modify_expr (get_eh_caught (), NOP_EXPR, integer_one_node);
expand_expr (init, const0_rtx, VOIDmode, EXPAND_NORMAL); 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); emit_line_note (input_filename, lineno);
} }
...@@ -814,8 +834,9 @@ expand_builtin_throw () ...@@ -814,8 +834,9 @@ expand_builtin_throw ()
/* These two can be frontend specific. If wanted, they can go in /* These two can be frontend specific. If wanted, they can go in
expand_throw. */ expand_throw. */
/* Do we have a valid object we are throwing? */ /* Do we have a valid object we are throwing? */
t = get_eh_type (); t = call_eh_info ();
emit_cmp_insn (DECL_RTL (t), const0_rtx, EQ, NULL_RTX, emit_cmp_insn (expand_expr (t, NULL_RTX, Pmode, 0),
const0_rtx, EQ, NULL_RTX,
GET_MODE (DECL_RTL (t)), 0, 0); GET_MODE (DECL_RTL (t)), 0, 0);
emit_jump_insn (gen_beq (gotta_call_terminate)); emit_jump_insn (gen_beq (gotta_call_terminate));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment