diff options
Diffstat (limited to 'gcc/except.cc')
-rw-r--r-- | gcc/except.cc | 54 |
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 { |