dwarf2out.c (dwarf2out_begin_prologue): Use crtl->nothrow
* 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. From-SVN: r145202
This commit is contained in:
parent
b3bf8855c0
commit
fe89fbc56d
@ -1,3 +1,11 @@
|
||||
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
|
||||
|
@ -3231,7 +3231,7 @@ dwarf2out_begin_prologue (unsigned int line ATTRIBUTE_UNUSED,
|
||||
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;
|
||||
|
22
gcc/except.c
22
gcc/except.c
@ -2765,13 +2765,7 @@ set_nothrow_function_flags (void)
|
||||
{
|
||||
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
|
||||
@ -2781,13 +2775,19 @@ set_nothrow_function_flags (void)
|
||||
|
||||
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))
|
||||
{
|
||||
@ -2800,7 +2800,7 @@ set_nothrow_function_flags (void)
|
||||
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))
|
||||
{
|
||||
@ -2808,6 +2808,10 @@ set_nothrow_function_flags (void)
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
if (crtl->nothrow
|
||||
&& (cgraph_function_body_availability (cgraph_node (current_function_decl))
|
||||
>= AVAIL_AVAILABLE))
|
||||
TREE_NOTHROW (current_function_decl) = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -441,6 +441,11 @@ struct rtl_data GTY(())
|
||||
|
||||
/* 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)
|
||||
|
@ -2368,15 +2368,7 @@ stmt_could_throw_p (gimple stmt)
|
||||
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
|
||||
|
Loading…
x
Reference in New Issue
Block a user