mirror of git://gcc.gnu.org/git/gcc.git
re PR middle-end/47401 (Support for must-not-throw regions with SJLJ exceptions broken)
PR middle-end/47401 * except.c (sjlj_assign_call_site_values): Move setting the crtl->uses_eh_lsda flag to ... (sjlj_mark_call_sites): ... here. (sjlj_emit_function_enter): Support NULL dispatch label. (sjlj_build_landing_pads): In a function with no landing pads that still has must-not-throw regions, generate code to register a personality function with empty LSDA. From-SVN: r169134
This commit is contained in:
parent
1b7ae0b722
commit
0cecee061e
|
@ -1,3 +1,14 @@
|
||||||
|
2011-01-22 Ulrich Weigand <Ulrich.Weigand@de.ibm.com>
|
||||||
|
|
||||||
|
PR middle-end/47401
|
||||||
|
* except.c (sjlj_assign_call_site_values): Move setting the
|
||||||
|
crtl->uses_eh_lsda flag to ...
|
||||||
|
(sjlj_mark_call_sites): ... here.
|
||||||
|
(sjlj_emit_function_enter): Support NULL dispatch label.
|
||||||
|
(sjlj_build_landing_pads): In a function with no landing pads
|
||||||
|
that still has must-not-throw regions, generate code to register
|
||||||
|
a personality function with empty LSDA.
|
||||||
|
|
||||||
2011-01-21 Richard Henderson <rth@redhat.com>
|
2011-01-21 Richard Henderson <rth@redhat.com>
|
||||||
|
|
||||||
* config/rx/rx.c (TARGET_FLAGS_REGNUM): New.
|
* config/rx/rx.c (TARGET_FLAGS_REGNUM): New.
|
||||||
|
|
59
gcc/except.c
59
gcc/except.c
|
@ -998,8 +998,6 @@ sjlj_assign_call_site_values (void)
|
||||||
|
|
||||||
/* First: build the action table. */
|
/* First: build the action table. */
|
||||||
action = collect_one_action_chain (ar_hash, lp->region);
|
action = collect_one_action_chain (ar_hash, lp->region);
|
||||||
if (action != -1)
|
|
||||||
crtl->uses_eh_lsda = 1;
|
|
||||||
|
|
||||||
/* Next: assign call-site values. If dwarf2 terms, this would be
|
/* Next: assign call-site values. If dwarf2 terms, this would be
|
||||||
the region number assigned by convert_to_eh_region_ranges, but
|
the region number assigned by convert_to_eh_region_ranges, but
|
||||||
|
@ -1065,6 +1063,9 @@ sjlj_mark_call_sites (void)
|
||||||
this_call_site = 0;
|
this_call_site = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this_call_site != -1)
|
||||||
|
crtl->uses_eh_lsda = 1;
|
||||||
|
|
||||||
if (this_call_site == last_call_site)
|
if (this_call_site == last_call_site)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -1119,27 +1120,30 @@ sjlj_emit_function_enter (rtx dispatch_label)
|
||||||
else
|
else
|
||||||
emit_move_insn (mem, const0_rtx);
|
emit_move_insn (mem, const0_rtx);
|
||||||
|
|
||||||
|
if (dispatch_label)
|
||||||
|
{
|
||||||
#ifdef DONT_USE_BUILTIN_SETJMP
|
#ifdef DONT_USE_BUILTIN_SETJMP
|
||||||
{
|
rtx x, last;
|
||||||
rtx x, last;
|
x = emit_library_call_value (setjmp_libfunc, NULL_RTX, LCT_RETURNS_TWICE,
|
||||||
x = emit_library_call_value (setjmp_libfunc, NULL_RTX, LCT_RETURNS_TWICE,
|
TYPE_MODE (integer_type_node), 1,
|
||||||
TYPE_MODE (integer_type_node), 1,
|
plus_constant (XEXP (fc, 0),
|
||||||
plus_constant (XEXP (fc, 0),
|
sjlj_fc_jbuf_ofs), Pmode);
|
||||||
sjlj_fc_jbuf_ofs), Pmode);
|
|
||||||
|
|
||||||
emit_cmp_and_jump_insns (x, const0_rtx, NE, 0,
|
emit_cmp_and_jump_insns (x, const0_rtx, NE, 0,
|
||||||
TYPE_MODE (integer_type_node), 0, dispatch_label);
|
TYPE_MODE (integer_type_node), 0,
|
||||||
last = get_last_insn ();
|
|
||||||
if (JUMP_P (last) && any_condjump_p (last))
|
|
||||||
{
|
|
||||||
gcc_assert (!find_reg_note (last, REG_BR_PROB, 0));
|
|
||||||
add_reg_note (last, REG_BR_PROB, GEN_INT (REG_BR_PROB_BASE / 100));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
expand_builtin_setjmp_setup (plus_constant (XEXP (fc, 0), sjlj_fc_jbuf_ofs),
|
|
||||||
dispatch_label);
|
dispatch_label);
|
||||||
|
last = get_last_insn ();
|
||||||
|
if (JUMP_P (last) && any_condjump_p (last))
|
||||||
|
{
|
||||||
|
gcc_assert (!find_reg_note (last, REG_BR_PROB, 0));
|
||||||
|
add_reg_note (last, REG_BR_PROB, GEN_INT (REG_BR_PROB_BASE / 100));
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
expand_builtin_setjmp_setup (plus_constant (XEXP (fc, 0),
|
||||||
|
sjlj_fc_jbuf_ofs),
|
||||||
|
dispatch_label);
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
emit_library_call (unwind_sjlj_register_libfunc, LCT_NORMAL, VOIDmode,
|
emit_library_call (unwind_sjlj_register_libfunc, LCT_NORMAL, VOIDmode,
|
||||||
1, XEXP (fc, 0), Pmode);
|
1, XEXP (fc, 0), Pmode);
|
||||||
|
@ -1363,6 +1367,23 @@ sjlj_build_landing_pads (void)
|
||||||
sjlj_emit_function_exit ();
|
sjlj_emit_function_exit ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If we do not have any landing pads, we may still need to register a
|
||||||
|
personality routine and (empty) LSDA to handle must-not-throw regions. */
|
||||||
|
else if (function_needs_eh_personality (cfun) != eh_personality_none)
|
||||||
|
{
|
||||||
|
int align = STACK_SLOT_ALIGNMENT (sjlj_fc_type_node,
|
||||||
|
TYPE_MODE (sjlj_fc_type_node),
|
||||||
|
TYPE_ALIGN (sjlj_fc_type_node));
|
||||||
|
crtl->eh.sjlj_fc
|
||||||
|
= assign_stack_local (TYPE_MODE (sjlj_fc_type_node),
|
||||||
|
int_size_in_bytes (sjlj_fc_type_node),
|
||||||
|
align);
|
||||||
|
|
||||||
|
sjlj_mark_call_sites ();
|
||||||
|
sjlj_emit_function_enter (NULL_RTX);
|
||||||
|
sjlj_emit_function_exit ();
|
||||||
|
}
|
||||||
|
|
||||||
VEC_free (int, heap, sjlj_lp_call_site_index);
|
VEC_free (int, heap, sjlj_lp_call_site_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue