aboutsummaryrefslogtreecommitdiff
path: root/gcc/except.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/except.cc')
-rw-r--r--gcc/except.cc54
1 files changed, 34 insertions, 20 deletions
diff --git a/gcc/except.cc b/gcc/except.cc
index d5eb927..518095c 100644
--- a/gcc/except.cc
+++ b/gcc/except.cc
@@ -970,12 +970,26 @@ expand_dw2_landing_pad_for_region (eh_region region)
{ /* Nothing */ }
if (region->exc_ptr_reg)
- emit_move_insn (region->exc_ptr_reg,
- gen_rtx_REG (ptr_mode, EH_RETURN_DATA_REGNO (0)));
+ {
+ rtx exc_ptr_reg;
+ if (EH_RETURN_DATA_REGNO (0) != INVALID_REGNUM)
+ exc_ptr_reg = gen_rtx_REG (ptr_mode, EH_RETURN_DATA_REGNO (0));
+ else
+ /* The target must be doing something special. Submit a dummy. */
+ exc_ptr_reg = constm1_rtx;
+ emit_move_insn (region->exc_ptr_reg, exc_ptr_reg);
+ }
if (region->filter_reg)
- emit_move_insn (region->filter_reg,
- gen_rtx_REG (targetm.eh_return_filter_mode (),
- EH_RETURN_DATA_REGNO (1)));
+ {
+ rtx filter_reg;
+ if (EH_RETURN_DATA_REGNO (1) != INVALID_REGNUM)
+ filter_reg = gen_rtx_REG (targetm.eh_return_filter_mode (),
+ EH_RETURN_DATA_REGNO (1));
+ else
+ /* The target must be doing something special. Submit a dummy. */
+ filter_reg = constm1_rtx;
+ emit_move_insn (region->filter_reg, filter_reg);
+ }
}
/* Expand the extra code needed at landing pads for dwarf2 unwinding. */
@@ -1010,8 +1024,7 @@ dw2_build_landing_pads (void)
expand_dw2_landing_pad_for_region (lp->region);
- seq = get_insns ();
- end_sequence ();
+ seq = end_sequence ();
bb = emit_to_new_bb_before (seq, label_rtx (lp->post_landing_pad));
bb->count = bb->next_bb->count;
@@ -1106,8 +1119,7 @@ sjlj_mark_call_sites (void)
buf_addr = plus_constant (Pmode, XEXP (crtl->eh.sjlj_fc, 0),
sjlj_fc_jbuf_ofs);
expand_builtin_update_setjmp_buf (buf_addr);
- p = get_insns ();
- end_sequence ();
+ p = end_sequence ();
emit_insn_before (p, insn);
}
@@ -1147,8 +1159,7 @@ sjlj_mark_call_sites (void)
mem = adjust_address (crtl->eh.sjlj_fc, TYPE_MODE (integer_type_node),
sjlj_fc_call_site_ofs);
emit_move_insn (mem, gen_int_mode (this_call_site, GET_MODE (mem)));
- p = get_insns ();
- end_sequence ();
+ p = end_sequence ();
emit_insn_before (p, before);
last_call_site = this_call_site;
@@ -1214,8 +1225,7 @@ sjlj_emit_function_enter (rtx_code_label *dispatch_label)
emit_library_call (unwind_sjlj_register_libfunc, LCT_NORMAL, VOIDmode,
XEXP (fc, 0), Pmode);
- seq = get_insns ();
- end_sequence ();
+ seq = end_sequence ();
/* ??? Instead of doing this at the beginning of the function,
do this in a block that is at loop level 0 and dominates all
@@ -1282,8 +1292,7 @@ sjlj_emit_function_exit (void)
emit_library_call (unwind_sjlj_unregister_libfunc, LCT_NORMAL, VOIDmode,
XEXP (crtl->eh.sjlj_fc, 0), Pmode);
- seq = get_insns ();
- end_sequence ();
+ seq = end_sequence ();
/* ??? Really this can be done in any block at loop level 0 that
post-dominates all can_throw_internal instructions. This is
@@ -1388,8 +1397,7 @@ sjlj_emit_dispatch_table (rtx_code_label *dispatch_label, int num_dispatch)
if (r->filter_reg)
emit_move_insn (r->filter_reg, filter_reg);
- seq2 = get_insns ();
- end_sequence ();
+ seq2 = end_sequence ();
rtx_insn *before = label_rtx (lp->post_landing_pad);
bb = emit_to_new_bb_before (seq2, before);
@@ -1425,8 +1433,7 @@ sjlj_emit_dispatch_table (rtx_code_label *dispatch_label, int num_dispatch)
expand_sjlj_dispatch_table (disp, dispatch_labels);
}
- seq = get_insns ();
- end_sequence ();
+ seq = end_sequence ();
bb = emit_to_new_bb_before (seq, first_reachable_label);
if (num_dispatch == 1)
@@ -2935,7 +2942,14 @@ switch_to_exception_section (const char * ARG_UNUSED (fnname))
{
section *s;
- if (exception_section)
+ if (exception_section
+ /* Don't use the cached section for comdat if it will be different. */
+#ifdef HAVE_LD_EH_GC_SECTIONS
+ && !(targetm_common.have_named_sections
+ && DECL_COMDAT_GROUP (current_function_decl)
+ && HAVE_COMDAT_GROUP)
+#endif
+ )
s = exception_section;
else
{