diff options
author | Richard Biener <rguenther@suse.de> | 2014-10-16 12:25:52 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2014-10-16 12:25:52 +0000 |
commit | 745583f9539f78be7db1d8c51f15cae7a5f80f03 (patch) | |
tree | 3075787c7fa50bcb39399d99d978e00cb128d266 /gcc/builtins.c | |
parent | b7359edc20cae432bb68f5f897ba485f34de6f9a (diff) | |
download | gcc-745583f9539f78be7db1d8c51f15cae7a5f80f03.zip gcc-745583f9539f78be7db1d8c51f15cae7a5f80f03.tar.gz gcc-745583f9539f78be7db1d8c51f15cae7a5f80f03.tar.bz2 |
re PR c/63554 (ice in "execute_todo, at passes.c:1797" with -O3)
2014-10-16 Richard Biener <rguenther@suse.de>
PR middle-end/63554
* builtins.c (fold_builtin_4): Do not call fold_builtin_strncat_chk.
(fold_builtin_strncat_chk): Move ...
* gimple-fold.c (gimple_fold_builtin_strncat_chk): ... here.
(gimple_fold_builtin): Call gimple_fold_builtin_strncat_chk.
* gcc.dg/torture/pr63554.c: New testcase.
From-SVN: r216315
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r-- | gcc/builtins.c | 56 |
1 files changed, 0 insertions, 56 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c index 975f696..8d0288f 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -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_free_warning (tree); static tree fold_builtin_object_size (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_fprintf (location_t, tree, tree, tree, tree, bool, enum built_in_function); @@ -10366,9 +10365,6 @@ fold_builtin_4 (location_t loc, tree fndecl, switch (fcode) { - case BUILT_IN_STRNCAT_CHK: - return fold_builtin_strncat_chk (loc, fndecl, arg0, arg1, arg2, arg3); - case BUILT_IN_FPRINTF_CHK: case BUILT_IN_VFPRINTF_CHK: if (!validate_arg (arg1, INTEGER_TYPE) @@ -11584,58 +11580,6 @@ fold_builtin_object_size (tree ptr, tree ost) return NULL_TREE; } -/* Fold a call to the __strncat_chk builtin with arguments DEST, SRC, - LEN, and SIZE. */ - -static tree -fold_builtin_strncat_chk (location_t loc, tree fndecl, - tree dest, tree src, tree len, tree size) -{ - tree fn; - const char *p; - - if (!validate_arg (dest, POINTER_TYPE) - || !validate_arg (src, POINTER_TYPE) - || !validate_arg (size, INTEGER_TYPE) - || !validate_arg (size, INTEGER_TYPE)) - return NULL_TREE; - - p = c_getstr (src); - /* If the SRC parameter is "" or if LEN is 0, return DEST. */ - if (p && *p == '\0') - return omit_one_operand_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)), dest, len); - else if (integer_zerop (len)) - return omit_one_operand_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)), dest, src); - - if (! tree_fits_uhwi_p (size)) - return NULL_TREE; - - if (! integer_all_onesp (size)) - { - tree src_len = c_strlen (src, 1); - if (src_len - && tree_fits_uhwi_p (src_len) - && tree_fits_uhwi_p (len) - && ! tree_int_cst_lt (len, src_len)) - { - /* If LEN >= strlen (SRC), optimize into __strcat_chk. */ - fn = builtin_decl_explicit (BUILT_IN_STRCAT_CHK); - if (!fn) - return NULL_TREE; - - return build_call_expr_loc (loc, fn, 3, dest, src, size); - } - return NULL_TREE; - } - - /* If __builtin_strncat_chk is used, assume strncat is available. */ - fn = builtin_decl_explicit (BUILT_IN_STRNCAT); - if (!fn) - return NULL_TREE; - - return build_call_expr_loc (loc, fn, 3, dest, src, len); -} - /* Builtins with folding operations that operate on "..." arguments need special handling; we need to store the arguments in a convenient data structure before attempting any folding. Fortunately there are |