aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimple-ssa-sprintf.c
AgeCommit message (Collapse)AuthorFilesLines
2017-01-16PR tree-optimization/78608 - gimple-ssa-sprintf.c:570:17: runtime error: ↵Martin Sebor1-10/+16
negation of -9223372036854775808 cannot be represented in type 'long int' gcc/ChangeLog: * gimple-ssa-sprintf.c (tree_digits): Avoid negating TYPE_MIN. From-SVN: r244511
2017-01-16gimple-ssa-sprintf.c (format_directive): Correct a typo in a warning message.Martin Sebor1-1/+2
gcc/ChangeLog: * gimple-ssa-sprintf.c (format_directive): Correct a typo in a warning message. From-SVN: r244500
2017-01-12(-Wformat-overflow): ...to this.Martin Sebor1-16/+16
gcc/c-family/ChangeLog: (-Wformat-overflow): ...to this. gcc/ChangeLog: to -Wformat-overflow. * gimple-ssa-sprintf.c (pass_sprintf_length::gate): Adjust. (min_bytes_remaining): Same. (get_string_length): Same. (format_string): Same. (format_directive): Same. (add_bytes): Same. (pass_sprintf_length::handle_gimple_call): Same. gcc/testsuite/ChangeLog: * gcc.dg/pr78138.c: Adjust. * gcc.dg/pr78768.c: Adjust. * gcc.dg/tree-ssa/builtin-sprintf-4.c: Adjust. * gcc.dg/tree-ssa/builtin-sprintf-warn-1.c: Adjust. * gcc.dg/tree-ssa/builtin-sprintf-warn-2.c: Adjust. * gcc.dg/tree-ssa/builtin-sprintf-warn-3.c: Adjust. * gcc.dg/tree-ssa/builtin-sprintf-warn-4.c: Adjust. * gcc.dg/tree-ssa/builtin-sprintf-warn-6.c: Adjust. * gcc.dg/tree-ssa/builtin-sprintf-warn-7.c: Adjust. * gcc.dg/tree-ssa/builtin-sprintf-warn-8.c: Adjust. * gcc.dg/tree-ssa/builtin-sprintf-warn-9.c: Adjust. * gcc.dg/tree-ssa/pr78605.c: Adjust. * gcc.dg/tree-ssa/pr78622.c: Adjust. From-SVN: r244385
2017-01-12gimple-ssa-sprintf.c (try_substitute_return_value): Remove info.nowrite ↵Jakub Jelinek1-20/+45
calls with no lhs that can't throw. * gimple-ssa-sprintf.c (try_substitute_return_value): Remove info.nowrite calls with no lhs that can't throw. Return bool whether gsi_remove has been called or not. (pass_sprintf_length::handle_gimple_call): Return bool whether try_substitute_return_value called gsi_remove. Formatting fix. (pass_sprintf_length::execute): Don't use gsi_remove if handle_gimple_call returned true. * gcc.dg/tree-ssa/builtin-snprintf-1.c: New test. From-SVN: r244384
2017-01-10PR middle-end/78245 - missing -Wformat-length on an overflow of a ↵Martin Sebor1-0/+5
dynamically allocated buffer gcc/testsuite/ChangeLog: PR middle-end/78245 * gcc.dg/tree-ssa/builtin-sprintf-warn-3.c: Add tests. gcc/ChangeLog: PR middle-end/78245 * gimple-ssa-sprintf.c (get_destination_size): Call {init,fini}object_sizes. * tree-object-size.c (addr_object_size): Adjust. (pass_through_call): Adjust. (pass_object_sizes::execute): Adjust. * tree-object-size.h (fini_object_sizes): Declare. From-SVN: r244293
2017-01-08PR tree-optimization/78913 - Probably misleading error reported by ↵Martin Sebor1-31/+50
-Wformat-length PR tree-optimization/78913 - Probably misleading error reported by -Wformat-length PR middle-end/77708 - -Wformat-length %s warns for snprintf gcc/ChangeLog: PR middle-end/77708 * doc/invoke.texi (Warning Options): Document -Wformat-truncation. * gimple-ssa-sprintf.c (call_info::reval_used, call_info::warnopt): New member functions. (format_directive): Used them. (add_bytes): Same. (pass_sprintf_length::handle_gimple_call): Same. * graphite-sese-to-poly.c (tree_int_to_gmp): Increase buffer size to avoid truncation for any argument. (extract_affine_mul): Same. * tree.c (get_file_function_name): Same. gcc/c-family/ChangeLog: PR middle-end/77708 * c.opt (-Wformat-truncation): New option. gcc/fortran/ChangeLog: PR tree-optimization/78913 PR middle-end/77708 * trans-common.c (build_equiv_decl): Increase buffer size to avoid truncation for any argument. * trans-types.c (gfc_build_logical_type): Same. gcc/testsuite/ChangeLog: PR middle-end/77708 * gcc.dg/tree-ssa/builtin-snprintf-warn-1.c: New test. * gcc.dg/tree-ssa/builtin-snprintf-warn-2.c: New test. * gcc.dg/tree-ssa/builtin-sprintf-warn-6.c: XFAIL test cases failing due to bug 78969. * gcc.dg/format/pr78569.c: Adjust. From-SVN: r244210
2017-01-05PR tree-optimization/78910 - Wrong print-return-value for a negative numberMartin Sebor1-13/+15
gcc/ChangeLog: PR tree-optimization/78910 * gimple-ssa-sprintf.c (tree_digits): Add an argument. (format_integer): Correct off-by-one error in the handling of precision with negative numbers in signed conversions.. gcc/testsuite/ChangeLog: PR tree-optimization/78910 * gcc.dg/tree-ssa/builtin-sprintf-warn-7.c: Adjust text of expected diagnostics. * gcc.dg/tree-ssa/builtin-sprintf.c: Add test cases. * gcc.dg/tree-ssa/pr78910.c: New test. From-SVN: r244116
2017-01-03PR tree-optimization/78696 - [7 Regression] -fprintf-return-value ↵Martin Sebor1-110/+138
misoptimizes %.Ng where N is greater than 10 gcc/ChangeLog: PR tree-optimization/78696 * gimple-ssa-sprintf.c (format_floating): Correct handling of precision. Use MPFR for %f for greater fidelity. Correct handling of %g. (pass_sprintf_length::compute_format_length): Set width and precision specified by asrerisk to void_node for vararg functions. (try_substitute_return_value): Adjust dump output. gcc/testsuite/ChangeLog: PR tree-optimization/78696 * gcc.dg/tree-ssa/builtin-sprintf-5.c: Remove incorrect test cases. * gcc.dg/tree-ssa/builtin-sprintf-warn-7.c: Correct off-by-1 errors. * gcc.dg/tree-ssa/builtin-sprintf-warn-9.c: New test. * gcc.dg/tree-ssa/builtin-sprintf.c: Add test cases. From-SVN: r244037
2017-01-03re PR tree-optimization/78965 (Invalid -fprintf-return-value optimization)Jakub Jelinek1-3/+7
PR tree-optimization/78965 * gimple-ssa-sprintf.c (pass_sprintf_length::compute_format_length): Change first argument from const call_info & to call_info &. For %n set info.nowrite to false. * gcc.dg/pr78965.c: New test. From-SVN: r244014
2017-01-03re PR middle-end/78901 (ICE: verify_gimple failed (error: statement marked ↵Jakub Jelinek1-2/+8
for throw in middle of block)) PR middle-end/78901 * gimple-ssa-sprintf.c (try_substitute_return_value): Don't change possibly throwing calls. * g++.dg/opt/pr78901.C: New test. From-SVN: r244013
2017-01-01Update copyright years.Jakub Jelinek1-1/+1
From-SVN: r243994
2016-12-14PR middle-end/78519 - missing warning for sprintf %s with null pointerMartin Sebor1-5/+50
gcc/ChangeLog: PR middle-end/78519 * gimple-ssa-sprintf.c (format_string): Handle null pointers. (format_directive): Diagnose null pointer arguments. (pass_sprintf_length::handle_gimple_call): Diagnose null destination pointers. Correct location of null format string in diagnostics. gcc/testsuite/ChangeLog: PR middle-end/78519 * gcc.dg/tree-ssa/builtin-sprintf-warn-7.c: New test. From-SVN: r243684
2016-12-14PR middle-end/78786 - GCC hangs/out of memory calling sprintf with large ↵Martin Sebor1-48/+97
precision gcc/ChangeLog: PR middle-end/78786 * gimple-ssa-sprintf.c (target_dir_max): New macro. (get_mpfr_format_length): New function. (format_integer): Use HOST_WIDE_INT instead of int. (format_floating_max): Same. (format_floating): Call get_mpfr_format_length. (format_directive): Use target_dir_max. gcc/testsuite/ChangeLog: PR middle-end/78786 * gcc.dg/tree-ssa/builtin-sprintf-warn-7.c: New test. From-SVN: r243672
2016-12-12PR middle-end/78622 - -Wformat-length/-fprintf-return-value incorrect with ↵Martin Sebor1-95/+175
overflow/wrapping gcc/ChangeLog: PR middle-end/78622 PR middle-end78606 * gimple-ssa-sprintf.c (min_bytes_remaining): Use res.knownrange rather than res.bounded. (get_width_and_precision): Set precision to -1 when negative. (adjust_range_for_overflow): New function. (format_integer): Correct the handling of the space, plus, and pound flags, and the special case of zero precision. Always set res.bounded to true unless either precision or width is specified and unknown. Call adjust_range_for_overflow. Avoid use zero as the shortest value when precision is specified but unknown. (format_directive): Remove vestigial quoting. Always inform of argument value or range when it's available. (add_bytes): Correct the computation of boundrange used to decide whether a warning is of a "maybe" or "defnitely" kind. gcc/testsuite/ChangeLog: PR middle-end/78622 PR middle-end78606 * gcc.c-torture/execute/pr78622.c: New test. * gcc.dg/tree-ssa/builtin-sprintf-2.c: Remove "benign" undefined behavior inadvertently introduced in a previous commit. Tighten up final checking. * gcc.dg/tree-ssa/builtin-sprintf-5.c: Rename macros for clarity. Add test cases. * gcc.dg/tree-ssa/builtin-sprintf-6.c: Add test cases. * gcc.dg/tree-ssa/builtin-sprintf-warn-1.c: Same. * gcc.dg/tree-ssa/builtin-sprintf-warn-2.c: Same. * gcc.dg/tree-ssa/builtin-sprintf-warn-3.c: Same. * gcc.dg/tree-ssa/builtin-sprintf-warn-5.c: Same. * gcc.dg/tree-ssa/builtin-sprintf-warn-6.c: Remove xfails and add a final optimization check. * gcc.dg/tree-ssa/builtin-sprintf.c: Add test cases. * gcc.dg/tree-ssa/pr78622.c: New test. From-SVN: r243582
2016-12-07PR c/53562 - Add -Werror= support for -D_FORTIFY_SOURCE / __builtin___memcpy_chkMartin Sebor1-16/+45
PR c/53562 - Add -Werror= support for -D_FORTIFY_SOURCE / __builtin___memcpy_chk PR middle-end/77784 - duplicate warning for snprintf when n > object size PR middle-end/78149 - missing warning on strncpy buffer overflow due to an excessive bound PR middle-end/78138 - missing warnings on buffer overflow with non-constant source length gcc/c-family/ChangeLog: PR c/53562 PR middle-end/77784 PR middle-end/78149 PR middle-end/78138 * c.opt (-Wstringop-overflow): New option. gcc/ChangeLog: PR middle-end/77784 PR middle-end/78149 PR middle-end/78138 * builtins.c (expand_builtin_strcat, expand_builtin_strncat): New functions. (compute_dest_size, get_size_range, check_sizes, check_strncat_sizes) (check_memop_sizes): Same. (expand_builtin_memcpy): Call check memop_sizes. (expand_builtin_mempcpy): Same. (expand_builtin_memset): Same, (expand_builtin_bzero): Same. (expand_builtin_memory_chk): Call check_sizes. (expand_builtin_strcpy): Same. (expand_builtin_strncpy): Same. (maybe_emit_sprintf_chk_warning): Same. (expand_builtin): Handle strcat and strncat. (fini_object_sizes): Reset pointers. (compute_object_size): New function. * gimple-ssa-sprintf.c (pass_sprintf_length::handle_gimple_call): Avoid issuing warnings also issued during built-in expansion. * doc/invoke.texi (Warning Options): Document -Wstringop-overflow. gcc/testsuite/ChangeLog: PR middle-end/77784 PR middle-end/78149 PR middle-end/78138 * c-c++-common/Wsizeof-pointer-memaccess2.c: Adjust expected diagnostic. * g++.dg/ext/builtin-object-size3.C (bar): Same. * g++.dg/ext/strncpy-chk1.C: Same. * g++.dg/opt/memcpy1.C: Same. * g++.dg/torture/Wsizeof-pointer-memaccess1.C: Same. * gcc.c-torture/compile/pr55569.c: Disable -Wstringop-overflow. * gcc.dg/Wobjsize-1.c: Adjust expected diagnostic. * gcc.dg/attr-alloc_size.c: Same. * gcc.dg/builtin-stringop-chk-1.c: Adjust expected diagnostic. * gcc.dg/builtin-stringop-chk-2.c: Same. * gcc.dg/builtin-stringop-chk-4.c: New test. * gcc.dg/builtin-strncat-chk-1.c: Adjust expected diagnostic. * gcc.dg/memcpy-2.c: Same. * gcc.dg/pr40340-1.c: Same. * gcc.dg/pr40340-2.c (main): Same. * gcc.dg/pr40340-5.c (main): Same. * gcc.dg/torture/Wsizeof-pointer-memaccess1.c: Same. * gcc.dg/torture/pr71132.c: Disable -Wstringop-overflow. * gcc.dg/tree-ssa/builtin-sprintf-warn-1.c: Adjust text of expected warning. * gfortran.dg/char_length_3.f90: Prune expected warnings. * gfortran.dg/pr38868.f: Add expected warnings. From-SVN: r243419
2016-12-02re PR tree-optimization/78586 (Wrong code caused by printf-return-value)Jakub Jelinek1-18/+12
PR tree-optimization/78586 * gimple-ssa-sprintf.c (format_integer): Don't handle NOP_EXPR, CONVERT_EXPR or COMPONENT_REF here. Formatting fix. For SSA_NAME_DEF_STMT with NOP_EXPR only change argtype if the rhs1's type is INTEGER_TYPE or POINTER_TYPE. From-SVN: r243145
2016-11-30re PR tree-optimization/78586 (Wrong code caused by printf-return-value)Jakub Jelinek1-15/+16
PR tree-optimization/78586 * gimple-ssa-sprintf.c (format_integer): Use TYPE_MAX_VALUE or TYPE_MIN_VALUE or build_all_ones_cst instead of folding LSHIFT_EXPR. Don't build_int_cst min/max twice. Formatting fix. * gcc.c-torture/execute/pr78586.c: New test. From-SVN: r242998
2016-11-29PR tree-optimization/78512 - [7 Regression] r242674 miscompiles Linux kernelMartin Sebor1-90/+29
gcc/ChangeLog: PR tree-optimization/78512 * config/linux.h (TARGET_PRINTF_POINTER_FORMAT): Remove. * config/rs6000/linux.h: Same. * config/rs6000/linux64.h: Same. * config/sol2.h: Same. * config/sol2.c (solaris_printf_pointer_format): Remove. * doc/tm.texi.in (TARGET_PRINTF_POINTER_FORMAT): Remove. * doc/tm.texi: Regenerate. * gimple-ssa-sprintf.c (format_pointer): Rempove. (pass_sprintf_length::compute_format_length): Return bool. (pass_sprintf_length::handle_gimple_call): Adjust. * target.def (printf_pointer_format): Remove. * targhooks.c (default_printf_pointer_format): Remove. (linux_printf_pointer_format): Same. * targhooks.h (default_printf_pointer_format): Remove. (linux_printf_pointer_format, solaris_printf_pointer_format): Same. gcc/testsuite/ChangeLog: PR tree-optimization/78512 * gcc.dg/tree-ssa/builtin-sprintf-6.c: Add test cases. * gcc.dg/tree-ssa/builtin-sprintf-warn-1.c: Remove test cases. From-SVN: r242975
2016-11-28PR middle-end/78521 - [7 Regression] incorrect byte count in -Wformat-length...Martin Sebor1-124/+229
PR middle-end/78521 - [7 Regression] incorrect byte count in -Wformat-length warning with non-constant width or precision PR middle-end/78520 - missing warning for snprintf with size greater than INT_MAX gcc/ChangeLog: PR middle-end/78520 * gimple-ssa-sprintf.c (target_max_value): Remove. (target_int_max, target_size_max): Use TYPE_MAX_VALUE. (get_width_and_precision): New function. (format_integer, format_floating, get_string_length, format_string): Correct handling of width and precision with unknown value. (format_directive): Add warning. (pass_sprintf_length::compute_format_length): Allow for precision to consist of a sole period with no asterisk or digits after it. gcc/testsuite/ChangeLog: PR middle-end/78520 * gcc.dg/tree-ssa/builtin-sprintf-5.c: Add test cases. * gcc.dg/tree-ssa/builtin-sprintf-6.c: New test. * gcc.dg/tree-ssa/builtin-sprintf-warn-1.c: Add test cases. * gcc.dg/tree-ssa/builtin-sprintf-warn-3.c: Add test cases. From-SVN: r242935
2016-11-28gimple-ssa-sprintf.c (build_intmax_type_nodes): Look at UINTMAX_TYPE rather ↵Jakub Jelinek1-18/+14
than SIZE_TYPE. * gimple-ssa-sprintf.c (build_intmax_type_nodes): Look at UINTMAX_TYPE rather than SIZE_TYPE. Add gcc_unreachable if intmax_t couldn't be determined. (format_integer): Make {,u}intmax_type_node no longer static, initialize them only when needed. For z and t use signed_or_unsigned_type_for instead of assuming size_t and ptrdiff_t have the same precision. From-SVN: r242911
2016-11-24PR tree-optimization/78476 - snprintf(0, 0, ...) with known arguments not ↵Martin Sebor1-13/+36
optimized away gcc/testsuite/ChangeLog: PR tree-optimization/78476 * gcc.dg/tree-ssa/builtin-sprintf-5.c: New test. gcc/ChangeLog: PR tree-optimization/78476 * gimple-ssa-sprintf.c (struct pass_sprintf_length::call_info): Add a member. (handle_gimple_call): Adjust signature. (try_substitute_return_value): Remove calls to bounded functions with zero buffer size whose result is known. (pass_sprintf_length::execute): Adjust call to handle_gimple_call. From-SVN: r242854
2016-11-23PR middle-end/78461 - [7 Regression] ICE: in operator+=Martin Sebor1-8/+5
gcc/testsuite/ChangeLog: PR middle-end/78461 * gcc.dg/tree-ssa/builtin-sprintf-4.c: New test. * gcc.dg/tree-ssa/builtin-sprintf-warn-2.c: Adjust warning text. gcc/ChangeLog: PR middle-end/78461 * gimple-ssa-sprintf.c (format_string): Correct the maxima and set the minimum number of bytes for an unknown string to zero. From-SVN: r242769
2016-10-24PR middle-end/77735 - FAIL: gcc.dg/tree-ssa/builtin-sprintf-warn-1.cMartin Sebor1-114/+221
gcc/ChangeLog: PR middle-end/77735 * builtins.c (string_length): New function. (c_strlen): Use string_length. Correctly handle wide strings. * gimple-ssa-sprintf.c (target_max_value, target_size_max): New functions. (target_int_max): Call target_max_value. (format_result::knownrange): New data member. (fmtresult::fmtresult): Define default constructor. (format_integer): Use it and set format_result::knownrange. Handle global constants. (format_floating_max): Add third argument. (format_floating): Recompute maximum value for %a for each argument. (get_string_length): Use fmtresult default ctor. (format_string): Set format_result::knownrange. (format_directive): Check format_result::knownrange. (add_bytes): Same. Correct caret placement in diagnostics. (pass_sprintf_length::compute_format_length): Set format_result::knownrange. (pass_sprintf_length::handle_gimple_call): Use target_size_max. gcc/testsuite/ChangeLog: PR middle-end/77735 * gcc.dg/tree-ssa/builtin-sprintf-2.c: Add test cases. * gcc.dg/tree-ssa/builtin-sprintf-warn-1.c: Same. * gcc.dg/tree-ssa/builtin-sprintf-warn-2.c: Same. * gcc.dg/tree-ssa/builtin-sprintf-warn-3.c: Adjust/relax. * gcc.dg/tree-ssa/builtin-sprintf-warn-4.c: Add test cases. * gcc.dg/tree-ssa/builtin-sprintf-warn-6.c: XFAIL for LP64 only. * gcc.dg/tree-ssa/builtin-sprintf.c: Add test cases. From-SVN: r241489
2016-09-28gimple-ssa-sprintf.c (pass_sprintf_length::gate): Use x > 0 instead of 0 < x.Jakub Jelinek1-8/+9
* gimple-ssa-sprintf.c (pass_sprintf_length::gate): Use x > 0 instead of 0 < x. (format_floating, format_string, format_directive, get_destination_size, pass_sprintf_length::handle_gimple_call): Likewise. From-SVN: r240600
2016-09-28gimple-ssa-sprintf.c: Fix comment formatting.Jakub Jelinek1-25/+17
* gimple-ssa-sprintf.c: Fix comment formatting. (format_integer): Use is_gimple_assign. (pass_sprintf_length::handle_gimple_call): Use gimple_call_builtin_p and gimple_call_fndecl. Reorder case BUILT_IN_SPRINTF_CHK. Fix up BUILT_IN_SNPRINTF_CHK comment. Replace "to to" with "to" in comment. (pass_sprintf_length::execute): Use is_gimple_call. From-SVN: r240594
2016-09-28PR c/77762 - Incorrect destination buffer length in -Wformat-length warningMartin Sebor1-2/+2
gcc/testsuite/ChangeLog: PR c/77762 * gcc.dg/tree-ssa/builtin-sprintf-warn-1.c (test_vsnprintf_chk_s): Call __builtin___vsnprintf_chk, not __builtin___snprintf_chk. (test_sprintf_p_const): Adjust line numbers to avoid failures introduced in r240503. gcc/ChangeLog: PR c/77762 * gimple-ssa-sprintf.c (pass_sprintf_length::handle_gimple_call): Fix typos. From-SVN: r240584
2016-09-28PR middle-end/77683 - ICE on %lf directive in format_floating inMartin Sebor1-3/+25
gcc/testsuite/ChangeLog: PR middle-end/77683 * gcc.dg/tree-ssa/builtin-sprintf-warn-1.c: Add test cases. gcc/ChangeLog: PR middle-end/77683 * gimple-ssa-sprintf.c (format_integer): Fail gracefully when length modifier is not expected. (format_floating): Ignore l length modifier and fail gracefuly when it isn't one of the other expected ones. From-SVN: r240583
2016-09-22PR target/77676 - powerpc64 and powerpc64le stage2 bootstrap failMartin Sebor1-12/+21
gcc/testsuite/ChangeLog: PR target/77676 * gcc.dg/tree-ssa/builtin-sprintf-1.c: Define and use wint_t. * gcc.dg/tree-ssa/builtin-sprintf-2.c: Fix typo. * gcc.dg/tree-ssa/builtin-sprintf-3.c: New test. * gcc.dg/tree-ssa/builtin-sprintf-warn-5.c: New test. gcc/ChangeLog: PR target/77676 * gimple-ssa-sprintf.c (target_int_min, target_int_max): Use HOST_BITS_PER_WIDE_INT, make a static local variable auto. (target_int_min): Correct computation. (format_integer): Use long long as the argument for the ll length modifier. (format_floating): Use target_int_max(). (get_string_length): Same. (format_string): Avoid setting the bounded flag for strings of unknown length. (try_substitute_return_value): Avoid setting range info when the result isn't bounded. * varasm.c (assemble_name): Increase buffer size. From-SVN: r240383
2016-09-22Use GMP_RNDN for portability to MPFR 2.4.2Rainer Orth1-2/+2
* gimple-ssa-sprintf.c (format_floating_max): Use GMP_RNDN instead of MPFR_RNDN. (format_floating): Likewise. From-SVN: r240350
2016-09-21gimple-ssa-sprintf.c (pass_sprintf_length::compute_format_length): Add falls ↵Marek Polacek1-0/+1
through comment. * gimple-ssa-sprintf.c (pass_sprintf_length::compute_format_length): Add falls through comment. From-SVN: r240311
2016-09-20PR middle-end/49905 - Better sanity checking on sprintf src & dest toMartin Sebor1-0/+2686
gcc/ChangeLog: PR middle-end/49905 * Makefile.in (OBJS): Add gimple-ssa-sprintf.o. * config/linux.h (TARGET_PRINTF_POINTER_FORMAT): Redefine. * config/linux.c (gnu_libc_printf_pointer_format): New function. * config/sol2.h (TARGET_PRINTF_POINTER_FORMAT): Same. * config/sol2.c (solaris_printf_pointer_format): New function. * doc/invoke.texi (-Wformat-length, -fprintf-return-value): New options. * doc/tm.texi.in (TARGET_PRINTF_POINTER_FORMAT): Document. * doc/tm.texi: Regenerate. * gimple-fold.h (get_range_strlen): New function. (get_maxval_strlen): Declare existing function. * gimple-fold.c (get_range_strlen): Add arguments and compute both maximum and minimum. (get_range_strlen): Define overload. (get_maxval_strlen): Adjust. * gimple-ssa-sprintf.c: New file and pass. * passes.def (pass_sprintf_length): Add new pass. * targhooks.h (default_printf_pointer_format): Declare new function. (gnu_libc_printf_pointer_format): Same. (solaris_libc_printf_pointer_format): Same. * targhooks.c (default_printf_pointer_format): Define new function. * tree-pass.h (make_pass_sprintf_length): Declare new function. * print-tree.c: Increase buffer size. gcc/c-family/ChangeLog: PR middle-end/49905 * c.opt: Add -Wformat-length and -fprintf-return-value. gcc/testsuite/ChangeLog: PR middle-end/49905 * gcc.dg/builtin-stringop-chk-1.c: Adjust. * gcc.dg/tree-ssa/builtin-sprintf-warn-1.c: New test. * gcc.dg/tree-ssa/builtin-sprintf-warn-2.c: New test. * gcc.dg/tree-ssa/builtin-sprintf-warn-3.c: New test. * gcc.dg/tree-ssa/builtin-sprintf-warn-4.c: New test. * gcc.dg/tree-ssa/builtin-sprintf.c: New test. * gcc.dg/tree-ssa/builtin-sprintf-2.c: New test. From-SVN: r240298