diff options
Diffstat (limited to 'gcc/except.c')
-rw-r--r-- | gcc/except.c | 48 |
1 files changed, 9 insertions, 39 deletions
diff --git a/gcc/except.c b/gcc/except.c index d166a9a1527..419936a4838 100644 --- a/gcc/except.c +++ b/gcc/except.c @@ -40,7 +40,7 @@ along with GCC; see the file COPYING3. If not see During pass_lower_eh (tree-eh.c) we record the nested structure of the TRY nodes in EH_REGION nodes in CFUN->EH->REGION_TREE. - We expand the lang_protect_cleanup_actions hook into MUST_NOT_THROW + We expand the eh_protect_cleanup_actions langhook into MUST_NOT_THROW regions at this time. We can then flatten the statements within the TRY nodes to straight-line code. Statements that had been within TRY nodes that can throw are recorded within CFUN->EH->THROW_STMT_TABLE, @@ -150,10 +150,6 @@ along with GCC; see the file COPYING3. If not see #define EH_RETURN_DATA_REGNO(N) INVALID_REGNUM #endif -/* Protect cleanup actions with must-not-throw regions, with a call - to the given failure handler. */ -tree (*lang_protect_cleanup_actions) (void); - static GTY(()) int call_site_base; static GTY ((param_is (union tree_node))) htab_t type_to_runtime_map; @@ -203,30 +199,6 @@ static void dw2_output_call_site_table (int, int); static void sjlj_output_call_site_table (void); -/* Routine to see if exception handling is turned on. - DO_WARN is nonzero if we want to inform the user that exception - handling is turned off. - - This is used to ensure that -fexceptions has been specified if the - compiler tries to use any exception-specific functions. */ - -int -doing_eh (int do_warn) -{ - if (! flag_exceptions) - { - static int warned = 0; - if (! warned && do_warn) - { - error ("exception handling disabled, use -fexceptions to enable"); - warned = 1; - } - return 0; - } - return 1; -} - - void init_eh (void) { @@ -329,7 +301,7 @@ init_eh (void) void init_eh_for_function (void) { - cfun->eh = GGC_CNEW (struct eh_status); + cfun->eh = ggc_alloc_cleared_eh_status (); /* Make sure zero'th entries are used. */ VEC_safe_push (eh_region, gc, cfun->eh->region_array, NULL); @@ -345,12 +317,8 @@ gen_eh_region (enum eh_region_type type, eh_region outer) { eh_region new_eh; -#ifdef ENABLE_CHECKING - gcc_assert (doing_eh (0)); -#endif - /* Insert a new blank region as a leaf in the tree. */ - new_eh = GGC_CNEW (struct eh_region_d); + new_eh = ggc_alloc_cleared_eh_region_d (); new_eh->type = type; new_eh->outer = outer; if (outer) @@ -407,7 +375,7 @@ gen_eh_region_catch (eh_region t, tree type_or_list) add_type_for_runtime (TREE_VALUE (type_node)); } - c = GGC_CNEW (struct eh_catch_d); + c = ggc_alloc_cleared_eh_catch_d (); c->type_list = type_list; l = t->u.eh_try.last_catch; c->prev_catch = l; @@ -441,7 +409,7 @@ gen_eh_region_must_not_throw (eh_region outer) eh_landing_pad gen_eh_landing_pad (eh_region region) { - eh_landing_pad lp = GGC_CNEW (struct eh_landing_pad_d); + eh_landing_pad lp = ggc_alloc_cleared_eh_landing_pad_d (); lp->next_lp = region->landing_pads; lp->region = region; @@ -1617,6 +1585,8 @@ make_reg_eh_region_note_nothrow_nononlocal (rtx insn) bool insn_could_throw_p (const_rtx insn) { + if (!flag_exceptions) + return false; if (CALL_P (insn)) return true; if (INSN_P (insn) && cfun->can_throw_non_call_exceptions) @@ -2368,7 +2338,7 @@ add_call_site (rtx landing_pad, int action, int section) { call_site_record record; - record = GGC_NEW (struct call_site_record_d); + record = ggc_alloc_call_site_record_d (); record->landing_pad = landing_pad; record->action = action; @@ -2960,7 +2930,7 @@ output_one_function_exception_table (const char * ARG_UNUSED (fnname), #endif /* If the target wants a label to begin the table, emit it here. */ - targetm.asm_out.except_table_label (asm_out_file); + targetm.asm_out.emit_except_table_label (asm_out_file); have_tt_data = (VEC_length (tree, cfun->eh->ttype_data) || (targetm.arm_eabi_unwinder |