+Thu May 29 13:02:06 1997 Mike Stump <mrs@cygnus.com>
+
+ * except.c (expand_exception_blocks): Simplify and fix and make
+ sure we don't end a region in a sequence, as expand_end_bindings
+ doesn't like it.
+
+Wed May 28 17:08:03 1997 Mike Stump <mrs@cygnus.com>
+
+ * except.c (init_exception_processing): Mark terminate as not
+ returning so that the optimizer can optimize better.
+
Tue May 27 19:49:19 1997 Mike Stump <mrs@cygnus.com>
* cvt.c (convert): Don't do any extra work, if we can avoid it
vtype, NOT_BUILT_IN);
terminate_fndecl = auto_function (get_identifier ("terminate"),
vtype, NOT_BUILT_IN);
+ TREE_THIS_VOLATILE (terminate_fndecl) = 1;
push_lang_context (lang_name_c);
void
expand_exception_blocks ()
{
- rtx funcend;
- rtx insns;
-
- start_sequence ();
-
- funcend = gen_label_rtx ();
-
- start_sequence ();
-
- /* Add all the catch clauses here. */
- emit_insns (catch_clauses);
- catch_clauses = NULL_RTX;
-
+ push_to_sequence (catch_clauses);
expand_leftover_cleanups ();
-
- insns = get_insns ();
+ catch_clauses = get_insns ();
end_sequence ();
-#if 1
/* Do this after we expand leftover cleanups, so that the
expand_eh_region_end that expand_end_eh_spec does will match the
right expand_eh_region_start, and make sure it comes out before
if (TYPE_RAISES_EXCEPTIONS (TREE_TYPE (current_function_decl)))
{
expand_end_eh_spec (TYPE_RAISES_EXCEPTIONS (TREE_TYPE (current_function_decl)));
- push_to_sequence (insns);
-
- /* Now expand any new ones. */
+ push_to_sequence (catch_clauses);
expand_leftover_cleanups ();
-
- insns = get_insns ();
+ catch_clauses = get_insns ();
end_sequence ();
}
-#endif
-
- emit_jump (funcend);
- if (insns)
+ if (catch_clauses)
{
+ rtx funcend = gen_label_rtx ();
+ emit_jump (funcend);
+
/* We cannot protect n regions this way if we must flow into the
EH region through the top of the region, as we have to with
the setjmp/longjmp approach. */
expand_eh_region_start ();
}
- emit_insns (insns);
+ emit_insns (catch_clauses);
+ catch_clauses = NULL_RTX;
if (exceptions_via_longjmp == 0)
expand_eh_region_end (TerminateFunctionCall);
expand_leftover_cleanups ();
- }
- emit_label (funcend);
-
- /* Only if we had previous insns do we want to emit the jump around
- them. If there weren't any, then insns will remain NULL_RTX. */
- if (insns)
- insns = get_insns ();
- end_sequence ();
-
- emit_insns (insns);
+ emit_label (funcend);
+ }
}
tree