re PR lto/62239 (ICE: in execute_todo, at passes.c:1795 with LTO)
2014-08-27 Richard Biener <rguenther@suse.de> PR middle-end/62239 * builtins.c (fold_builtin_strcat_chk): Move to gimple-fold.c. (fold_builtin_3): Do not fold strcat_chk here. * gimple-fold.c (gimple_fold_builtin_strcat_chk): Move here from builtins.c. (gimple_fold_builtin): Fold strcat_chk here. From-SVN: r214564
This commit is contained in:
parent
53fa2d27a0
commit
07f1cf564b
|
@ -1,3 +1,12 @@
|
||||||
|
2014-08-27 Richard Biener <rguenther@suse.de>
|
||||||
|
|
||||||
|
PR middle-end/62239
|
||||||
|
* builtins.c (fold_builtin_strcat_chk): Move to gimple-fold.c.
|
||||||
|
(fold_builtin_3): Do not fold strcat_chk here.
|
||||||
|
* gimple-fold.c (gimple_fold_builtin_strcat_chk): Move here
|
||||||
|
from builtins.c.
|
||||||
|
(gimple_fold_builtin): Fold strcat_chk here.
|
||||||
|
|
||||||
2014-08-26 Aldy Hernandez <aldyh@redhat.com>
|
2014-08-26 Aldy Hernandez <aldyh@redhat.com>
|
||||||
|
|
||||||
* dwarf2out.h (dwarf2out_decl): Remove prototype.
|
* dwarf2out.h (dwarf2out_decl): Remove prototype.
|
||||||
|
|
|
@ -198,7 +198,6 @@ static void maybe_emit_chk_warning (tree, enum built_in_function);
|
||||||
static void maybe_emit_sprintf_chk_warning (tree, enum built_in_function);
|
static void maybe_emit_sprintf_chk_warning (tree, enum built_in_function);
|
||||||
static void maybe_emit_free_warning (tree);
|
static void maybe_emit_free_warning (tree);
|
||||||
static tree fold_builtin_object_size (tree, tree);
|
static tree fold_builtin_object_size (tree, tree);
|
||||||
static tree fold_builtin_strcat_chk (location_t, tree, tree, tree, tree);
|
|
||||||
static tree fold_builtin_strncat_chk (location_t, tree, tree, tree, tree, tree);
|
static tree fold_builtin_strncat_chk (location_t, tree, tree, tree, tree, tree);
|
||||||
static tree fold_builtin_printf (location_t, tree, tree, tree, bool, enum built_in_function);
|
static tree fold_builtin_printf (location_t, tree, tree, tree, bool, enum built_in_function);
|
||||||
static tree fold_builtin_fprintf (location_t, tree, tree, tree, tree, bool,
|
static tree fold_builtin_fprintf (location_t, tree, tree, tree, tree, bool,
|
||||||
|
@ -10321,9 +10320,6 @@ fold_builtin_3 (location_t loc, tree fndecl,
|
||||||
case BUILT_IN_MEMCMP:
|
case BUILT_IN_MEMCMP:
|
||||||
return fold_builtin_memcmp (loc, arg0, arg1, arg2);;
|
return fold_builtin_memcmp (loc, arg0, arg1, arg2);;
|
||||||
|
|
||||||
case BUILT_IN_STRCAT_CHK:
|
|
||||||
return fold_builtin_strcat_chk (loc, fndecl, arg0, arg1, arg2);
|
|
||||||
|
|
||||||
case BUILT_IN_PRINTF_CHK:
|
case BUILT_IN_PRINTF_CHK:
|
||||||
case BUILT_IN_VPRINTF_CHK:
|
case BUILT_IN_VPRINTF_CHK:
|
||||||
if (!validate_arg (arg0, INTEGER_TYPE)
|
if (!validate_arg (arg0, INTEGER_TYPE)
|
||||||
|
@ -11588,37 +11584,6 @@ fold_builtin_object_size (tree ptr, tree ost)
|
||||||
return NULL_TREE;
|
return NULL_TREE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Fold a call to the __strcat_chk builtin FNDECL. DEST, SRC, and SIZE
|
|
||||||
are the arguments to the call. */
|
|
||||||
|
|
||||||
static tree
|
|
||||||
fold_builtin_strcat_chk (location_t loc, tree fndecl, tree dest,
|
|
||||||
tree src, tree size)
|
|
||||||
{
|
|
||||||
tree fn;
|
|
||||||
const char *p;
|
|
||||||
|
|
||||||
if (!validate_arg (dest, POINTER_TYPE)
|
|
||||||
|| !validate_arg (src, POINTER_TYPE)
|
|
||||||
|| !validate_arg (size, INTEGER_TYPE))
|
|
||||||
return NULL_TREE;
|
|
||||||
|
|
||||||
p = c_getstr (src);
|
|
||||||
/* If the SRC parameter is "", return DEST. */
|
|
||||||
if (p && *p == '\0')
|
|
||||||
return omit_one_operand_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)), dest, src);
|
|
||||||
|
|
||||||
if (! tree_fits_uhwi_p (size) || ! integer_all_onesp (size))
|
|
||||||
return NULL_TREE;
|
|
||||||
|
|
||||||
/* If __builtin_strcat_chk is used, assume strcat is available. */
|
|
||||||
fn = builtin_decl_explicit (BUILT_IN_STRCAT);
|
|
||||||
if (!fn)
|
|
||||||
return NULL_TREE;
|
|
||||||
|
|
||||||
return build_call_expr_loc (loc, fn, 2, dest, src);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Fold a call to the __strncat_chk builtin with arguments DEST, SRC,
|
/* Fold a call to the __strncat_chk builtin with arguments DEST, SRC,
|
||||||
LEN, and SIZE. */
|
LEN, and SIZE. */
|
||||||
|
|
||||||
|
|
|
@ -1587,6 +1587,41 @@ gimple_fold_builtin_strcat (gimple_stmt_iterator *gsi,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Fold a call to the __strcat_chk builtin FNDECL. DEST, SRC, and SIZE
|
||||||
|
are the arguments to the call. */
|
||||||
|
|
||||||
|
static bool
|
||||||
|
gimple_fold_builtin_strcat_chk (gimple_stmt_iterator *gsi)
|
||||||
|
{
|
||||||
|
gimple stmt = gsi_stmt (*gsi);
|
||||||
|
tree dest = gimple_call_arg (stmt, 0);
|
||||||
|
tree src = gimple_call_arg (stmt, 1);
|
||||||
|
tree size = gimple_call_arg (stmt, 2);
|
||||||
|
tree fn;
|
||||||
|
const char *p;
|
||||||
|
|
||||||
|
|
||||||
|
p = c_getstr (src);
|
||||||
|
/* If the SRC parameter is "", return DEST. */
|
||||||
|
if (p && *p == '\0')
|
||||||
|
{
|
||||||
|
replace_call_with_value (gsi, dest);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! tree_fits_uhwi_p (size) || ! integer_all_onesp (size))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
/* If __builtin_strcat_chk is used, assume strcat is available. */
|
||||||
|
fn = builtin_decl_explicit (BUILT_IN_STRCAT);
|
||||||
|
if (!fn)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
gimple repl = gimple_build_call (fn, 2, dest, src);
|
||||||
|
replace_call_with_call_and_fold (gsi, repl);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/* Fold a call to the fputs builtin. ARG0 and ARG1 are the arguments
|
/* Fold a call to the fputs builtin. ARG0 and ARG1 are the arguments
|
||||||
to the call. IGNORE is true if the value returned
|
to the call. IGNORE is true if the value returned
|
||||||
by the builtin will be ignored. UNLOCKED is true is true if this
|
by the builtin will be ignored. UNLOCKED is true is true if this
|
||||||
|
@ -2569,6 +2604,8 @@ gimple_fold_builtin (gimple_stmt_iterator *gsi)
|
||||||
case BUILT_IN_SPRINTF_CHK:
|
case BUILT_IN_SPRINTF_CHK:
|
||||||
case BUILT_IN_VSPRINTF_CHK:
|
case BUILT_IN_VSPRINTF_CHK:
|
||||||
return gimple_fold_builtin_sprintf_chk (gsi, DECL_FUNCTION_CODE (callee));
|
return gimple_fold_builtin_sprintf_chk (gsi, DECL_FUNCTION_CODE (callee));
|
||||||
|
case BUILT_IN_STRCAT_CHK:
|
||||||
|
return gimple_fold_builtin_strcat_chk (gsi);
|
||||||
default:;
|
default:;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue