diff options
Diffstat (limited to 'gcc/tree-ssa-strlen.c')
-rw-r--r-- | gcc/tree-ssa-strlen.c | 148 |
1 files changed, 20 insertions, 128 deletions
diff --git a/gcc/tree-ssa-strlen.c b/gcc/tree-ssa-strlen.c index 7a89174..804905d 100644 --- a/gcc/tree-ssa-strlen.c +++ b/gcc/tree-ssa-strlen.c @@ -46,7 +46,6 @@ along with GCC; see the file COPYING3. If not see #include "tree-ssa-propagate.h" #include "tree-ssa-strlen.h" #include "params.h" -#include "ipa-chkp.h" #include "tree-hash-traits.h" #include "tree-object-size.h" #include "builtins.h" @@ -576,7 +575,6 @@ get_string_length (strinfo *si) if (si->stmt) { gimple *stmt = si->stmt, *lenstmt; - bool with_bounds = gimple_call_with_bounds_p (stmt); tree callee, lhs, fn, tem; location_t loc; gimple_stmt_iterator gsi; @@ -595,20 +593,11 @@ get_string_length (strinfo *si) { case BUILT_IN_STRCAT: case BUILT_IN_STRCAT_CHK: - case BUILT_IN_STRCAT_CHKP: - case BUILT_IN_STRCAT_CHK_CHKP: gsi = gsi_for_stmt (stmt); fn = builtin_decl_implicit (BUILT_IN_STRLEN); gcc_assert (lhs == NULL_TREE); tem = unshare_expr (gimple_call_arg (stmt, 0)); - if (with_bounds) - { - lenstmt = gimple_build_call (chkp_maybe_create_clone (fn)->decl, - 2, tem, gimple_call_arg (stmt, 1)); - gimple_call_set_with_bounds (lenstmt, true); - } - else - lenstmt = gimple_build_call (fn, 1, tem); + lenstmt = gimple_build_call (fn, 1, tem); lhs = make_ssa_name (TREE_TYPE (TREE_TYPE (fn)), lenstmt); gimple_call_set_lhs (lenstmt, lhs); gimple_set_vuse (lenstmt, gimple_vuse (stmt)); @@ -628,16 +617,8 @@ get_string_length (strinfo *si) lhs = NULL_TREE; /* FALLTHRU */ case BUILT_IN_STRCPY: - case BUILT_IN_STRCPY_CHK: - case BUILT_IN_STRCPY_CHKP: - case BUILT_IN_STRCPY_CHK_CHKP: gcc_assert (builtin_decl_implicit_p (BUILT_IN_STPCPY)); - if (gimple_call_num_args (stmt) == (with_bounds ? 4 : 2)) - fn = builtin_decl_implicit (BUILT_IN_STPCPY); - else - fn = builtin_decl_explicit (BUILT_IN_STPCPY_CHK); - if (with_bounds) - fn = chkp_maybe_create_clone (fn)->decl; + fn = builtin_decl_implicit (BUILT_IN_STPCPY); gcc_assert (lhs == NULL_TREE); if (dump_file && (dump_flags & TDF_DETAILS) != 0) { @@ -656,8 +637,6 @@ get_string_length (strinfo *si) /* FALLTHRU */ case BUILT_IN_STPCPY: case BUILT_IN_STPCPY_CHK: - case BUILT_IN_STPCPY_CHKP: - case BUILT_IN_STPCPY_CHK_CHKP: gcc_assert (lhs != NULL_TREE); loc = gimple_location (stmt); set_endptr_and_length (loc, si, lhs); @@ -1002,9 +981,7 @@ valid_builtin_call (gimple *stmt) case BUILT_IN_MEMCMP: case BUILT_IN_MEMCMP_EQ: case BUILT_IN_STRCHR: - case BUILT_IN_STRCHR_CHKP: case BUILT_IN_STRLEN: - case BUILT_IN_STRLEN_CHKP: /* The above functions should be pure. Punt if they aren't. */ if (gimple_vdef (stmt) || gimple_vuse (stmt) == NULL_TREE) return false; @@ -1014,25 +991,15 @@ valid_builtin_call (gimple *stmt) case BUILT_IN_MALLOC: case BUILT_IN_MEMCPY: case BUILT_IN_MEMCPY_CHK: - case BUILT_IN_MEMCPY_CHKP: - case BUILT_IN_MEMCPY_CHK_CHKP: case BUILT_IN_MEMPCPY: case BUILT_IN_MEMPCPY_CHK: - case BUILT_IN_MEMPCPY_CHKP: - case BUILT_IN_MEMPCPY_CHK_CHKP: case BUILT_IN_MEMSET: case BUILT_IN_STPCPY: case BUILT_IN_STPCPY_CHK: - case BUILT_IN_STPCPY_CHKP: - case BUILT_IN_STPCPY_CHK_CHKP: case BUILT_IN_STRCAT: case BUILT_IN_STRCAT_CHK: - case BUILT_IN_STRCAT_CHKP: - case BUILT_IN_STRCAT_CHK_CHKP: case BUILT_IN_STRCPY: case BUILT_IN_STRCPY_CHK: - case BUILT_IN_STRCPY_CHKP: - case BUILT_IN_STRCPY_CHK_CHKP: /* The above functions should be neither const nor pure. Punt if they aren't. */ if (gimple_vdef (stmt) == NULL_TREE || gimple_vuse (stmt) == NULL_TREE) @@ -1121,10 +1088,6 @@ adjust_last_stmt (strinfo *si, gimple *stmt, bool is_strcat) case BUILT_IN_MEMCPY: case BUILT_IN_MEMCPY_CHK: break; - case BUILT_IN_MEMCPY_CHKP: - case BUILT_IN_MEMCPY_CHK_CHKP: - len_arg_no = 4; - break; default: return; } @@ -1328,12 +1291,11 @@ handle_builtin_strchr (gimple_stmt_iterator *gsi) tree src; gimple *stmt = gsi_stmt (*gsi); tree lhs = gimple_call_lhs (stmt); - bool with_bounds = gimple_call_with_bounds_p (stmt); if (lhs == NULL_TREE) return; - if (!integer_zerop (gimple_call_arg (stmt, with_bounds ? 2 : 1))) + if (!integer_zerop (gimple_call_arg (stmt, 1))) return; src = gimple_call_arg (stmt, 0); @@ -1440,9 +1402,8 @@ handle_builtin_strcpy (enum built_in_function bcode, gimple_stmt_iterator *gsi) gimple *stmt = gsi_stmt (*gsi); strinfo *si, *dsi, *olddsi, *zsi; location_t loc; - bool with_bounds = gimple_call_with_bounds_p (stmt); - src = gimple_call_arg (stmt, with_bounds ? 2 : 1); + src = gimple_call_arg (stmt, 1); dst = gimple_call_arg (stmt, 0); lhs = gimple_call_lhs (stmt); idx = get_stridx (src); @@ -1473,15 +1434,11 @@ handle_builtin_strcpy (enum built_in_function bcode, gimple_stmt_iterator *gsi) { case BUILT_IN_STRCPY: case BUILT_IN_STRCPY_CHK: - case BUILT_IN_STRCPY_CHKP: - case BUILT_IN_STRCPY_CHK_CHKP: if (lhs != NULL_TREE || !builtin_decl_implicit_p (BUILT_IN_STPCPY)) return; break; case BUILT_IN_STPCPY: case BUILT_IN_STPCPY_CHK: - case BUILT_IN_STPCPY_CHKP: - case BUILT_IN_STPCPY_CHK_CHKP: if (lhs == NULL_TREE) return; else @@ -1599,19 +1556,16 @@ handle_builtin_strcpy (enum built_in_function bcode, gimple_stmt_iterator *gsi) switch (bcode) { case BUILT_IN_STRCPY: - case BUILT_IN_STRCPY_CHKP: fn = builtin_decl_implicit (BUILT_IN_MEMCPY); if (lhs) ssa_ver_to_stridx[SSA_NAME_VERSION (lhs)] = didx; break; case BUILT_IN_STRCPY_CHK: - case BUILT_IN_STRCPY_CHK_CHKP: fn = builtin_decl_explicit (BUILT_IN_MEMCPY_CHK); if (lhs) ssa_ver_to_stridx[SSA_NAME_VERSION (lhs)] = didx; break; case BUILT_IN_STPCPY: - case BUILT_IN_STPCPY_CHKP: /* This would need adjustment of the lhs (subtract one), or detection that the trailing '\0' doesn't need to be written, if it will be immediately overwritten. @@ -1623,7 +1577,6 @@ handle_builtin_strcpy (enum built_in_function bcode, gimple_stmt_iterator *gsi) } break; case BUILT_IN_STPCPY_CHK: - case BUILT_IN_STPCPY_CHK_CHKP: /* This would need adjustment of the lhs (subtract one), or detection that the trailing '\0' doesn't need to be written, if it will be immediately overwritten. @@ -1673,33 +1626,14 @@ handle_builtin_strcpy (enum built_in_function bcode, gimple_stmt_iterator *gsi) fprintf (dump_file, "Optimizing: "); print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM); } - if (with_bounds) - { - fn = chkp_maybe_create_clone (fn)->decl; - if (gimple_call_num_args (stmt) == 4) - success = update_gimple_call (gsi, fn, 5, dst, - gimple_call_arg (stmt, 1), - src, - gimple_call_arg (stmt, 3), - len); - else - success = update_gimple_call (gsi, fn, 6, dst, - gimple_call_arg (stmt, 1), - src, - gimple_call_arg (stmt, 3), - len, - gimple_call_arg (stmt, 4)); - } + if (gimple_call_num_args (stmt) == 2) + success = update_gimple_call (gsi, fn, 3, dst, src, len); else - if (gimple_call_num_args (stmt) == 2) - success = update_gimple_call (gsi, fn, 3, dst, src, len); - else - success = update_gimple_call (gsi, fn, 4, dst, src, len, - gimple_call_arg (stmt, 2)); + success = update_gimple_call (gsi, fn, 4, dst, src, len, + gimple_call_arg (stmt, 2)); if (success) { stmt = gsi_stmt (*gsi); - gimple_call_set_with_bounds (stmt, with_bounds); update_stmt (stmt); if (dump_file && (dump_flags & TDF_DETAILS) != 0) { @@ -2068,11 +2002,9 @@ handle_builtin_stxncpy (built_in_function, gimple_stmt_iterator *gsi) gimple *stmt = gsi_stmt (*gsi); - bool with_bounds = gimple_call_with_bounds_p (stmt); - - tree dst = gimple_call_arg (stmt, with_bounds ? 1 : 0); - tree src = gimple_call_arg (stmt, with_bounds ? 2 : 1); - tree len = gimple_call_arg (stmt, with_bounds ? 3 : 2); + tree dst = gimple_call_arg (stmt, 0); + tree src = gimple_call_arg (stmt, 1); + tree len = gimple_call_arg (stmt, 2); tree dstsize = NULL_TREE, srcsize = NULL_TREE; int didx = get_stridx (dst); @@ -2177,10 +2109,9 @@ handle_builtin_memcpy (enum built_in_function bcode, gimple_stmt_iterator *gsi) tree src, dst, len, lhs, oldlen, newlen; gimple *stmt = gsi_stmt (*gsi); strinfo *si, *dsi, *olddsi; - bool with_bounds = gimple_call_with_bounds_p (stmt); - len = gimple_call_arg (stmt, with_bounds ? 4 : 2); - src = gimple_call_arg (stmt, with_bounds ? 2 : 1); + len = gimple_call_arg (stmt, 2); + src = gimple_call_arg (stmt, 1); dst = gimple_call_arg (stmt, 0); idx = get_stridx (src); if (idx == 0) @@ -2315,8 +2246,6 @@ handle_builtin_memcpy (enum built_in_function bcode, gimple_stmt_iterator *gsi) { case BUILT_IN_MEMCPY: case BUILT_IN_MEMCPY_CHK: - case BUILT_IN_MEMCPY_CHKP: - case BUILT_IN_MEMCPY_CHK_CHKP: /* Allow adjust_last_stmt to decrease this memcpy's size. */ laststmt.stmt = stmt; laststmt.len = dsi->nonzero_chars; @@ -2326,8 +2255,6 @@ handle_builtin_memcpy (enum built_in_function bcode, gimple_stmt_iterator *gsi) break; case BUILT_IN_MEMPCPY: case BUILT_IN_MEMPCPY_CHK: - case BUILT_IN_MEMPCPY_CHKP: - case BUILT_IN_MEMPCPY_CHK_CHKP: break; default: gcc_unreachable (); @@ -2350,9 +2277,8 @@ handle_builtin_strcat (enum built_in_function bcode, gimple_stmt_iterator *gsi) gimple *stmt = gsi_stmt (*gsi); strinfo *si, *dsi; location_t loc = gimple_location (stmt); - bool with_bounds = gimple_call_with_bounds_p (stmt); - tree src = gimple_call_arg (stmt, with_bounds ? 2 : 1); + tree src = gimple_call_arg (stmt, 1); tree dst = gimple_call_arg (stmt, 0); /* Bail if the source is the same as destination. It will be diagnosed @@ -2483,19 +2409,17 @@ handle_builtin_strcat (enum built_in_function bcode, gimple_stmt_iterator *gsi) switch (bcode) { case BUILT_IN_STRCAT: - case BUILT_IN_STRCAT_CHKP: if (srclen != NULL_TREE) fn = builtin_decl_implicit (BUILT_IN_MEMCPY); else fn = builtin_decl_implicit (BUILT_IN_STRCPY); break; case BUILT_IN_STRCAT_CHK: - case BUILT_IN_STRCAT_CHK_CHKP: if (srclen != NULL_TREE) fn = builtin_decl_explicit (BUILT_IN_MEMCPY_CHK); else fn = builtin_decl_explicit (BUILT_IN_STRCPY_CHK); - objsz = gimple_call_arg (stmt, with_bounds ? 4 : 2); + objsz = gimple_call_arg (stmt, 2); break; default: gcc_unreachable (); @@ -2548,35 +2472,15 @@ handle_builtin_strcat (enum built_in_function bcode, gimple_stmt_iterator *gsi) fprintf (dump_file, "Optimizing: "); print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM); } - if (with_bounds) - { - fn = chkp_maybe_create_clone (fn)->decl; - if (srclen != NULL_TREE) - success = update_gimple_call (gsi, fn, 5 + (objsz != NULL_TREE), - dst, - gimple_call_arg (stmt, 1), - src, - gimple_call_arg (stmt, 3), - len, objsz); - else - success = update_gimple_call (gsi, fn, 4 + (objsz != NULL_TREE), - dst, - gimple_call_arg (stmt, 1), - src, - gimple_call_arg (stmt, 3), - objsz); - } + if (srclen != NULL_TREE) + success = update_gimple_call (gsi, fn, 3 + (objsz != NULL_TREE), + dst, src, len, objsz); else - if (srclen != NULL_TREE) - success = update_gimple_call (gsi, fn, 3 + (objsz != NULL_TREE), - dst, src, len, objsz); - else - success = update_gimple_call (gsi, fn, 2 + (objsz != NULL_TREE), - dst, src, objsz); + success = update_gimple_call (gsi, fn, 2 + (objsz != NULL_TREE), + dst, src, objsz); if (success) { stmt = gsi_stmt (*gsi); - gimple_call_set_with_bounds (stmt, with_bounds); update_stmt (stmt); if (dump_file && (dump_flags & TDF_DETAILS) != 0) { @@ -3423,21 +3327,15 @@ strlen_check_and_optimize_stmt (gimple_stmt_iterator *gsi, bool *cleanup_eh) switch (DECL_FUNCTION_CODE (callee)) { case BUILT_IN_STRLEN: - case BUILT_IN_STRLEN_CHKP: handle_builtin_strlen (gsi); break; case BUILT_IN_STRCHR: - case BUILT_IN_STRCHR_CHKP: handle_builtin_strchr (gsi); break; case BUILT_IN_STRCPY: case BUILT_IN_STRCPY_CHK: case BUILT_IN_STPCPY: case BUILT_IN_STPCPY_CHK: - case BUILT_IN_STRCPY_CHKP: - case BUILT_IN_STRCPY_CHK_CHKP: - case BUILT_IN_STPCPY_CHKP: - case BUILT_IN_STPCPY_CHK_CHKP: handle_builtin_strcpy (DECL_FUNCTION_CODE (callee), gsi); break; @@ -3457,16 +3355,10 @@ strlen_check_and_optimize_stmt (gimple_stmt_iterator *gsi, bool *cleanup_eh) case BUILT_IN_MEMCPY_CHK: case BUILT_IN_MEMPCPY: case BUILT_IN_MEMPCPY_CHK: - case BUILT_IN_MEMCPY_CHKP: - case BUILT_IN_MEMCPY_CHK_CHKP: - case BUILT_IN_MEMPCPY_CHKP: - case BUILT_IN_MEMPCPY_CHK_CHKP: handle_builtin_memcpy (DECL_FUNCTION_CODE (callee), gsi); break; case BUILT_IN_STRCAT: case BUILT_IN_STRCAT_CHK: - case BUILT_IN_STRCAT_CHKP: - case BUILT_IN_STRCAT_CHK_CHKP: handle_builtin_strcat (DECL_FUNCTION_CODE (callee), gsi); break; case BUILT_IN_MALLOC: |