* tree-eh.c (stmt_could_throw_p): Remove check for WEAK decls.
* function.h (rtl_data): Add nothrow flag.
* except.c (set_nothrow_function_flags): Use crtl->nothrow;
set DECL_NOTHROW for AVAILABLE functions.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@145202
138bc75d-0d04-0410-961f-
82ee72b054a4
+2009-03-28 Jan Hubicka <jh@suse.cz>
+
+ * dwarf2out.c (dwarf2out_begin_prologue): Use crtl->nothrow
+ * tree-eh.c (stmt_could_throw_p): Remove check for WEAK decls.
+ * function.h (rtl_data): Add nothrow flag.
+ * except.c (set_nothrow_function_flags): Use crtl->nothrow;
+ set DECL_NOTHROW for AVAILABLE functions.
+
2009-03-28 Jakub Jelinek <jakub@redhat.com>
* config/rs6000/rs6000-c.c (rs6000_macro_to_expand): If macro
fde->dw_fde_end = NULL;
fde->dw_fde_cfi = NULL;
fde->funcdef_number = current_function_funcdef_no;
- fde->nothrow = TREE_NOTHROW (current_function_decl);
+ fde->nothrow = crtl->nothrow;
fde->uses_eh_lsda = crtl->uses_eh_lsda;
fde->all_throwers_are_sibcalls = crtl->all_throwers_are_sibcalls;
fde->drap_reg = INVALID_REGNUM;
{
rtx insn;
- /* If we don't know that this implementation of the function will
- actually be used, then we must not set TREE_NOTHROW, since
- callers must not assume that this function does not throw. */
- if (DECL_REPLACEABLE_P (current_function_decl))
- return 0;
-
- TREE_NOTHROW (current_function_decl) = 1;
+ crtl->nothrow = 1;
/* Assume crtl->all_throwers_are_sibcalls until we encounter
something that can throw an exception. We specifically exempt
crtl->all_throwers_are_sibcalls = 1;
+ /* If we don't know that this implementation of the function will
+ actually be used, then we must not set TREE_NOTHROW, since
+ callers must not assume that this function does not throw. */
+ if (TREE_NOTHROW (current_function_decl))
+ return 0;
+
if (! flag_exceptions)
return 0;
for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
if (can_throw_external (insn))
{
- TREE_NOTHROW (current_function_decl) = 0;
+ crtl->nothrow = 0;
if (!CALL_P (insn) || !SIBLING_CALL_P (insn))
{
insn = XEXP (insn, 1))
if (can_throw_external (insn))
{
- TREE_NOTHROW (current_function_decl) = 0;
+ crtl->nothrow = 0;
if (!CALL_P (insn) || !SIBLING_CALL_P (insn))
{
return 0;
}
}
+ if (crtl->nothrow
+ && (cgraph_function_body_availability (cgraph_node (current_function_decl))
+ >= AVAIL_AVAILABLE))
+ TREE_NOTHROW (current_function_decl) = 1;
return 0;
}
/* True if dbr_schedule has already been called for this function. */
bool dbr_scheduled_p;
+
+ /* True if current function can not throw. Unlike
+ TREE_NOTHROW (current_function_decl) it is set even for overwritable
+ function where currently compiled version of it is nothrow. */
+ bool nothrow;
};
#define return_label (crtl->x_return_label)
if (code == GIMPLE_ASSIGN || code == GIMPLE_COND)
return stmt_could_throw_1_p (stmt);
else if (is_gimple_call (stmt))
- {
- tree t = gimple_call_fndecl (stmt);
-
- /* Assume that calls to weak functions may trap. */
- if (!t || !DECL_P (t) || DECL_WEAK (t))
- return true;
-
- return (gimple_call_flags (stmt) & ECF_NOTHROW) == 0;
- }
+ return (gimple_call_flags (stmt) & ECF_NOTHROW) == 0;
else if (gimple_code (stmt) == GIMPLE_ASM)
return (gimple_asm_volatile_p (stmt));
else