X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fexcept.c;h=d7efa93c8b39f1b5a9b064d40261c060ec1a6051;hb=7752dc00034c8bb17532247759de04f1c5c0ead3;hp=bb26bf4dc6f6f7db781825a77046f6a09bc27e5e;hpb=471eff3649c0d9383213b2dfef646d0496d43e28;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/except.c b/gcc/except.c index bb26bf4dc6f..d7efa93c8b3 100644 --- a/gcc/except.c +++ b/gcc/except.c @@ -1,6 +1,6 @@ /* Implements exception handling. Copyright (C) 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, - 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 + 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. Contributed by Mike Stump . @@ -48,7 +48,7 @@ along with GCC; see the file COPYING3. If not see a given statement does throw. During this lowering process, we create an EH_LANDING_PAD node for each EH_REGION that has some code within the function that needs to be executed if a - throw does happen. We also create RESX statements that are + throw does happen. We also create RESX statements that are used to transfer control from an inner EH_REGION to an outer EH_REGION. We also create EH_DISPATCH statements as placeholders for a runtime type comparison that should be made in order to @@ -75,7 +75,7 @@ along with GCC; see the file COPYING3. If not see handler for the exception must be within a function somewhere up the call chain, so we call back into the exception runtime (__builtin_unwind_resume). - + During pass_expand (cfgexpand.c), we generate REG_EH_REGION notes that create an rtl to eh_region mapping that corresponds to the gimple to eh_region mapping that had been recorded in the @@ -93,7 +93,7 @@ along with GCC; see the file COPYING3. If not see frame are emitted at this time. During pass_convert_to_eh_region_ranges (except.c), we transform - the REG_EH_REGION notes attached to individual insns into + the REG_EH_REGION notes attached to individual insns into non-overlapping ranges of insns bounded by NOTE_INSN_EH_REGION_BEG and NOTE_INSN_EH_REGION_END. Each insn within such ranges has the same associated action within the exception region tree, meaning @@ -139,6 +139,7 @@ along with GCC; see the file COPYING3. If not see #include "langhooks.h" #include "cgraph.h" #include "diagnostic.h" +#include "tree-pretty-print.h" #include "tree-pass.h" #include "timevar.h" #include "tree-flow.h" @@ -153,9 +154,6 @@ along with GCC; see the file COPYING3. If not see to the given failure handler. */ tree (*lang_protect_cleanup_actions) (void); -/* Return true if type A catches type B. */ -int (*lang_eh_type_covers) (tree a, tree b); - static GTY(()) int call_site_base; static GTY ((param_is (union tree_node))) htab_t type_to_runtime_map; @@ -552,8 +550,11 @@ duplicate_eh_regions_1 (struct duplicate_eh_regions_data *data, case ERT_ALLOWED_EXCEPTIONS: new_r->u.allowed.type_list = old_r->u.allowed.type_list; - new_r->u.allowed.label - = data->label_map (old_r->u.allowed.label, data->label_map_data); + if (old_r->u.allowed.label) + new_r->u.allowed.label + = data->label_map (old_r->u.allowed.label, data->label_map_data); + else + new_r->u.allowed.label = NULL_TREE; break; case ERT_MUST_NOT_THROW: @@ -608,7 +609,7 @@ duplicate_eh_regions (struct function *ifun, data.eh_map = pointer_map_create (); outer_region = get_eh_region_from_lp_number (outer_lp); - + /* Copy all the regions in the subtree. */ if (copy_region) duplicate_eh_regions_1 (&data, copy_region, outer_region); @@ -971,6 +972,7 @@ dw2_build_landing_pads (void) lp->landing_pad = gen_label_rtx (); emit_label (lp->landing_pad); + LABEL_PRESERVE_P (lp->landing_pad) = 1; #ifdef HAVE_exception_receiver if (HAVE_exception_receiver) @@ -1151,7 +1153,7 @@ sjlj_emit_function_enter (rtx dispatch_label) #ifdef DONT_USE_BUILTIN_SETJMP { - rtx x; + rtx x, last; x = emit_library_call_value (setjmp_libfunc, NULL_RTX, LCT_RETURNS_TWICE, TYPE_MODE (integer_type_node), 1, plus_constant (XEXP (fc, 0), @@ -1159,7 +1161,12 @@ sjlj_emit_function_enter (rtx dispatch_label) emit_cmp_and_jump_insns (x, const0_rtx, NE, 0, TYPE_MODE (integer_type_node), 0, dispatch_label); - add_reg_br_prob_note (get_insns (), REG_BR_PROB_BASE/100); + 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), @@ -1462,7 +1469,7 @@ struct rtl_opt_pass pass_rtl_eh = { { RTL_PASS, - "eh", /* name */ + "rtl eh", /* name */ gate_handle_eh, /* gate */ rest_of_handle_eh, /* execute */ NULL, /* sub */ @@ -1487,7 +1494,7 @@ remove_eh_landing_pad (eh_landing_pad lp) for (pp = &lp->region->landing_pads; *pp != lp; pp = &(*pp)->next_lp) continue; *pp = lp->next_lp; - + if (lp->post_landing_pad) EH_LANDING_PAD_NR (lp->post_landing_pad) = 0; VEC_replace (eh_landing_pad, cfun->eh->lp_array, lp->index, NULL); @@ -1552,7 +1559,7 @@ for_each_eh_label (void (*callback) (rtx)) } /* Create the REG_EH_REGION note for INSN, given its ECF_FLAGS for a - call insn. + call insn. At the gimple level, we use LP_NR > 0 : The statement transfers to landing pad LP_NR @@ -1832,7 +1839,7 @@ can_nonlocal_goto (const_rtx insn) /* Set TREE_NOTHROW and crtl->all_throwers_are_sibcalls. */ -unsigned int +static unsigned int set_nothrow_function_flags (void) { rtx insn; @@ -1889,7 +1896,7 @@ set_nothrow_function_flags (void) struct cgraph_edge *e; for (e = node->callers; e; e = e->next_caller) e->can_throw_external = false; - TREE_NOTHROW (current_function_decl) = 1; + cgraph_set_nothrow_flag (node, true); if (dump_file) fprintf (dump_file, "Marking function nothrow: %s\n\n", @@ -2886,7 +2893,14 @@ output_ttype (tree type, int tt_format, int tt_format_size) { struct varpool_node *node; - type = lookup_type_for_runtime (type); + /* FIXME lto. pass_ipa_free_lang_data changes all types to + runtime types so TYPE should already be a runtime type + reference. When pass_ipa_free_lang data is made a default + pass, we can then remove the call to lookup_type_for_runtime + below. */ + if (TYPE_P (type)) + type = lookup_type_for_runtime (type); + value = expand_expr (type, NULL_RTX, VOIDmode, EXPAND_INITIALIZER); /* Let cgraph know that the rtti decl is used. Not all of the