aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimple-ssa-sprintf.c
AgeCommit message (Collapse)AuthorFilesLines
2018-08-16builtins.c (c_strlen): Add new parameter eltsize.Bernd Edlinger1-5/+6
* builtins.c (c_strlen): Add new parameter eltsize. Use it for determining how to count the elements. * builtins.h (c_strlen): Adjust prototype. * expr.c (string_constant): Add new parameter mem_size. Set *mem_size appropriately. * expr.h (string_constant): Adjust protoype. * gimple-fold.c (get_range_strlen): Add new parameter eltsize. * gimple-fold.h (get_range_strlen): Adjust prototype. * gimple-ssa-sprintf.c (get_string_length): Add new parameter eltsize. (format_string): Call get_string_length with eltsize. From-SVN: r263607
2018-08-15diagnostics: add labeling of source rangesDavid Malcolm1-3/+4
This patch adds the ability to label source ranges within a rich_location, to be printed by diagnostic_show_locus. For example: pr69554-1.c:11:18: error: invalid operands to binary + (have 'const char *' and 'const char *') 11 | return (p + 1) + (q + 1); | ~~~~~~~ ^ ~~~~~~~ | | | | | const char * | const char * The patch implements labels for various type mismatch errors in the C and C++ frontends, and in -Wformat. I implemented it wherever accurate location information was guaranteed (there are other places that could benefit, but we need better location information in those places). The labels can be disabled via -fno-diagnostics-show-labels. Similarly: param-type-mismatch.C: In function 'int test_1(int, int, float)': param-type-mismatch.C:11:27: error: invalid conversion from 'int' to 'const char*' [-fpermissive] 11 | return callee_1 (first, second, third); | ^~~~~~ | | | int param-type-mismatch.C:7:43: note: initializing argument 2 of 'int callee_1(int, const char*, float)' 7 | extern int callee_1 (int one, const char *two, float three); | ~~~~~~~~~~~~^~~ where the first "error" describing the bad argument gets a label describing the type inline (since it's non-obvious from "second"). The "note" describing the type of the param of the callee *doesn't* get a label, since that information is explicit there in the source ("const char *two"). The idea is that in any diagnostic where two aspects of the source aren't in sync it ought to be easier for the user if we directly show them the mismatching aspects inline (e.g. types). As well as type mismatch errors, perhaps labels could also be used for buffer overflow warnings, for describing the capacity of the destination buffer vs the size of what's being written: sprintf (buf, "filename: %s\n", file); ^~~ ~~~~~~~~~~~^~~ | | capacity: 32 10 + strlen(file) + 2 or somesuch. Another idea might be for macro expansion warnings: warning: repeated side effects in macro expansion... x = MIN (p++, q++); ~~~~^~~~~~~~~~ note: ...expanded here as #define MIN(X,Y) (X<Y?X:Y) ^~~ ~ ~ ~ ~ ~ ~ | | | | | | | | | | | q++ | | | | p++ | | | q++ | q++ p++ p++ The patch removes some logic from multiline.exp which special-cased lines ending with a '|' character (thus complicating testing of this patch). I believe that this was a vestige from experiments I did to support strippng dg directives from the output; it was present in the earliest version of multiline.exp I posted: "[RFC, stage1] Richer source location information for gcc 6 (location ranges etc)" https://gcc.gnu.org/ml/gcc-patches/2015-03/msg00837.html and I believe was neved used. gcc/c-family/ChangeLog: * c-format.c: Include "selftest-diagnostic.h" and "gcc-rich-location.h". (format_warning_at_char): Pass NULL for new label params of format_warning_va. (class indirection_suffix): New class. (class range_label_for_format_type_mismatch): New class. (format_type_warning): Move logic for generating "*" suffix to class indirection_suffix. Create "fmt_label" and "param_label" to show their types, and pass them to the format_warning_at_substring calls. (selftest::test_type_mismatch_range_labels): New test. (selftest::c_format_c_tests): Call it. gcc/c/ChangeLog: * c-objc-common.c: Include "gcc-rich-location.h". (c_tree_printer): Move implemenation of '%T' to... (print_type): ...this new function. (range_label_for_type_mismatch::get_text): New function. * c-typeck.c (convert_for_assignment): Add type labels to the rhs range for the various ic_argpass cases. (class maybe_range_label_for_tree_type_mismatch): New class. (build_binary_op): Use it when calling binary_op_error. gcc/cp/ChangeLog: * call.c: Include "gcc-rich-location.h". (convert_like_real): Add range label for "invalid conversion" diagnostic. (perform_implicit_conversion_flags): Add type label to the "could not convert" error. * error.c: Include "gcc-rich-location.h". (range_label_for_type_mismatch::get_text): New function. * typeck.c (convert_for_assignment): Add type label to the "cannot convert" error if a location is available. gcc/ChangeLog: * common.opt (fdiagnostics-show-labels): New option. * diagnostic-show-locus.c (class layout_range): Add field "m_label". (class layout): Add field "m_show_labels_p". (layout_range::layout_range): Add param "label" and use it to initialize m_label. (make_range): Pass in NULL for new "label" param of layout_range's ctor. (layout::layout): Initialize m_show_labels_p. (layout::maybe_add_location_range): Pass in loc_range->m_label when constructing layout_range instances. (struct line_label): New struct. (layout::print_any_labels): New member function. (layout::print_line): Call it if label-printing is enabled. (selftest::test_one_liner_labels): New test. (selftest::test_diagnostic_show_locus_one_liner): Call it. * diagnostic.c (diagnostic_initialize): Initialize context->show_labels_p. * diagnostic.h (struct diagnostic_context): Add field "show_labels_p". * doc/invoke.texi (Diagnostic Message Formatting Options): Add -fno-diagnostics-show-labels. * dwarf2out.c (gen_producer_string): Add OPT_fdiagnostics_show_labels to the ignored options. * gcc-rich-location.c (gcc_rich_location::add_expr): Add "label" param. (gcc_rich_location::maybe_add_expr): Likewise. * gcc-rich-location.h (gcc_rich_location::gcc_rich_location): Add label" param, defaulting to NULL. (gcc_rich_location::add_expr): Add "label" param. (gcc_rich_location::maybe_add_expr): Likewise. (class text_range_label): New class. (class range_label_for_type_mismatch): New class. * gimple-ssa-sprintf.c (fmtwarn): Pass NULL for new label params of format_warning_va. (fmtwarn_n): Likewise for new params of format_warning_n_va. * lto-wrapper.c (merge_and_complain): Add OPT_fdiagnostics_show_labels to the "pick one setting" options. (append_compiler_options): Likewise to the dropped options. (append_diag_options): Likewise to the passed-on options. * opts.c (common_handle_option): Handle the new option. * selftest-diagnostic.c (test_diagnostic_context::test_diagnostic_context): Enable show_labels_p. * substring-locations.c: Include "gcc-rich-location.h". (format_warning_n_va): Add "fmt_label" and "param_label" params and use them as appropriate. (format_warning_va): Add "fmt_label" and "param_label" params, passing them on to format_warning_n_va. (format_warning_at_substring): Likewise. (format_warning_at_substring_n): Likewise. * substring-locations.h (format_warning_va): Add "fmt_label" and "param_label" params. (format_warning_n_va): Likewise. (format_warning_at_substring): Likewise. (format_warning_at_substring_n): Likewise. * toplev.c (general_init): Initialize global_dc->show_labels_p. gcc/testsuite/ChangeLog: * g++.dg/diagnostic/aka3.C: New test. * g++.dg/diagnostic/param-type-mismatch-2.C: Update expected output to show range labels. * g++.dg/diagnostic/param-type-mismatch.C: Likewise. * g++.dg/plugin/plugin.exp (plugin_test_list): Add... * g++.dg/plugin/show-template-tree-color-labels.C: New test. * gcc.dg/bad-binary-ops.c: Update expected output to show range labels. Add an "aka" example. * gcc.dg/cpp/pr66415-1.c: Update expected output to show range labels. * gcc.dg/format/diagnostic-ranges.c: Likewise. * gcc.dg/format/pr72858.c: Likewise. * gcc.dg/format/pr78498.c: Likewise. * gcc.dg/param-type-mismatch.c: Add "-Wpointer-sign" to options. Update expected output to show range labels. Add examples of -Wincompatible-pointer-types and -Wpointer-sign for parameters. * gcc.dg/plugin/diagnostic-test-show-locus-bw-line-numbers.c: Update expected output to show range labels. * gcc.dg/plugin/diagnostic-test-show-locus-bw.c: Likewise. (test_very_wide_line): Adjust so that label is at left-clipping boundary. (test_very_wide_line_2): New test. * gcc.dg/plugin/diagnostic-test-show-locus-color-line-numbers.c: Update expected output to show range labels. * gcc.dg/plugin/diagnostic-test-show-locus-color.c: Likewise. * gcc.dg/plugin/diagnostic-test-show-locus-no-labels.c: New test. * gcc.dg/plugin/diagnostic_plugin_show_trees.c (show_tree): Update for new param to gcc_rich_location::add_expr. * gcc.dg/plugin/diagnostic_plugin_test_show_locus.c (add_range): Add "label" param. (test_show_locus): Add examples of labels to various tests. Tweak the "very wide_line" test case and duplicate it, to cover the boundary values for clipping of labels against the left-margin. * gcc.dg/plugin/plugin.exp (plugin_test_list): Add diagnostic-test-show-locus-no-labels.c. * gcc.dg/pr69554-1.c: Update expected output to show range labels. Update line numbers of dg-locus directives. * gcc.dg/pr69627.c: Update expected output to show range labels. * lib/multiline.exp (proc _build_multiline_regex): Remove special-case handling of lines with trailing '|'. libcpp/ChangeLog: * include/line-map.h (struct location_range): Add "m_label" field. (class rich_location): Add description of labels to leading comment. (rich_location::rich_location): Add "label" param, defaulting to NULL. (rich_location::add_range): Likewise. (struct label_text): New struct. (class range_label): New abstract base class. * line-map.c (rich_location::rich_location): Add "label" param; use it. (rich_location::add_range): Likewise. From-SVN: r263564
2018-08-04PR tree-optimization/86571 - AIX NaNQ and NaNS output format conflicts with ↵Martin Sebor1-2/+9
__builtin_sprintf gcc/ChangeLog: PR tree-optimization/86571 * gimple-ssa-sprintf.c (format_floating): Extend upper bound of NaN output to 4. From-SVN: r263312
2018-07-03PR tree-optimization/86274 - SEGFAULT when logging std::to_string(NAN)Martin Sebor1-28/+66
gcc/ChangeLog: PR tree-optimization/86274 * gimple-ssa-sprintf.c (fmtresult::type_max_digits): Verify precondition. (format_floating): Correct handling of infinities and NaNs. gcc/testsuite/ChangeLog: PR tree-optimization/86274 * gcc.dg/tree-ssa/builtin-sprintf-9.c: New test. * gcc.dg/tree-ssa/builtin-sprintf-warn-1.c: Adjust. * gcc.dg/tree-ssa/builtin-sprintf-warn-10.c: Same. * gcc.dg/tree-ssa/builtin-sprintf-warn-15.c: Same. * gcc.dg/tree-ssa/builtin-sprintf-warn-7.c: Same. * gcc.dg/tree-ssa/builtin-sprintf.c: Same. * gcc.dg/tree-ssa/pr83198.c: Same. From-SVN: r262368
2018-05-17Fix GNU coding style for G_.Martin Liska1-6/+6
2018-05-17 Martin Liska <mliska@suse.cz> * gimple-ssa-sprintf.c (format_directive): Do not use space in between 'G_' and '('. 2018-05-17 Martin Liska <mliska@suse.cz> * c-warn.c (overflow_warning): Do not use space in between 'G_' and '('. 2018-05-17 Martin Liska <mliska@suse.cz> * gcc.dg/plugin/ggcplug.c (plugin_init): Do not use space in between 'G_' and '('. From-SVN: r260314
2018-03-02substring-locations.h (format_warning_va): Formatting fix for ↵Jakub Jelinek1-250/+241
ATTRIBUTE_GCC_DIAG. * substring-locations.h (format_warning_va): Formatting fix for ATTRIBUTE_GCC_DIAG. (format_warning_at_substring): Fix up ATTRIBUTE_GCC_DIAG second argument. (format_warning_n_va, format_warning_at_substring_n): New prototypes. * substring-locations.c: Include intl.h. (format_warning_va): Turned into small wrapper around format_warning_n_va, renamed to ... (format_warning_n_va): ... this, add N and PLURAL_GMSGID arguments, rename GMSGID to SINGULAR_GMSGID, if SINGULAR_GMSGID != PLURAL_GMSGID, use ngettext. (format_warning_at_substring_n): New function. * gimple-ssa-sprintf.c: Remove GCC diagnostic ignored pragma. (fmtwarn): Add ATTRIBUTE_GCC_DIAG. Turn into a copy of format_warning_at_substring with just a shorter name instead of const function pointer. (fmtwarn_n): New function. (maybe_warn, format_directive, parse_directive): Use fmtwarn_n where appropriate, get rid of all the fmtstr temporaries, move conditionals with G_() wrapped string literals directly into fmtwarn arguments, cast dir.len to (int), formatting fixes. From-SVN: r258154
2018-02-27PR translation/84207 - Hard coded plural in gimple-fold.cMartin Sebor1-4/+1
gcc/ChangeLog: PR translation/84207 * diagnostic-core.h (warning_n, error_n, inform_n): Change n argument to unsigned HOST_WIDE_INT. * diagnostic.c (warning_n, error_n, inform_n): Ditto. (diagnostic_n_impl): Ditto. Handle arguments in excess of LONG_MAX. * gimple-ssa-sprintf.c (format_directive): Simplify inform_n call. * tree-ssa-strlen.c (maybe_diag_stxncpy_trunc): Use warning_n. From-SVN: r258044
2018-02-20re PR middle-end/82123 (spurious -Wformat-overflow warning for converted vars)Jeff Law1-7/+9
PR middle-end/82123 PR tree-optimization/81592 PR middle-end/79257 * gimple-ssa-sprintf.c (format_integer): Query EVRP range analyzer for range data rather than using global data. * gcc.dg/pr81592.c: New test. * gcc.dg/pr82123.c: New test. From-SVN: r257857
2018-02-20re PR middle-end/82123 (spurious -Wformat-overflow warning for converted vars)Jeff Law1-5/+6
PR middle-end/82123 PR tree-optimization/81592 PR middle-end/79257 * gimple-ssa-sprintf.c (get_int_range): Query EVRP range analyzer for range data rather than using global data. From-SVN: r257855
2018-02-20re PR middle-end/82123 (spurious -Wformat-overflow warning for converted vars)Jeff Law1-31/+41
PR middle-end/82123 PR tree-optimization/81592 PR middle-end/79257 * gimple-ssa-sprintf.c (get_int_range): Accept vr_values parameter pass it to children as needed. (struct directive::fmtresult): Similarly. (struct directive::set_width): Similarly. (struct directive::set_precision): Similarly. (format_integer, format_directive, parse_directive): Similarly. (format_none): Accept unnamed vr_values parameter. (format_percent, format_floating, format_character): Similarly. (format_string, format_plain): Similarly. From-SVN: r257854
2018-02-20re PR middle-end/82123 (spurious -Wformat-overflow warning for converted vars)Jeff Law1-10/+7
PR middle-end/82123 PR tree-optimization/81592 PR middle-end/79257 * gimple-ssa-sprintf.c (sprintf_dom_walker::handle_gimple_call): Query the EVRP range analyzer for range data rather than using global data. From-SVN: r257853
2018-02-20re PR middle-end/82123 (spurious -Wformat-overflow warning for converted vars)Jeff Law1-1/+16
PR middle-end/82123 PR tree-optimization/81592 PR middle-end/79257 * gimple-ssa-sprintf.c: Include alloc-pool.h, vr-values.h and gimple-ssa-evrp-analyze.h (class sprintf_dom_walker): Add after_dom_children member function. Add evrp_range_analyzer member. (sprintf_dom_walker::before_dom_children): Call into the EVRP range analyzer as needed. (sprintf_dom_walker::after_dom_children): New member function. * gcc.dg/builtin-unreachable-6.c: Turn off VRP. From-SVN: r257852
2018-01-04* gimple-ssa-sprintf.c (parse_directive): Cast second dir.len to uhwi.Jakub Jelinek1-1/+1
From-SVN: r256219
2018-01-03gimple-ssa-warn-restrict.c (builtin_memref::builtin_memref): Use ↵Martin Sebor1-30/+43
offset_int::from instead of wide_int::to_shwi. gcc/ChangeLog: * gimple-ssa-warn-restrict.c (builtin_memref::builtin_memref): Use offset_int::from instead of wide_int::to_shwi. (maybe_diag_overlap): Remove assertion. Use HOST_WIDE_INT_PRINT_DEC instead of %lli. * gimple-ssa-sprintf.c (format_directive): Same. (parse_directive): Same. (sprintf_dom_walker::compute_format_length): Same. (try_substitute_return_value): Same. gcc/testsuite/ChangeLog: * gcc.dg/Wrestrict-3.c: New test. From-SVN: r256187
2018-01-03Update copyright years.Jakub Jelinek1-1/+1
From-SVN: r256169
2017-12-22re PR c/83448 (ice in get_source_location_for_substring, at input.c:1507)Jakub Jelinek1-2/+4
PR c/83448 * gimple-ssa-sprintf.c (maybe_warn): Don't call set_caret_index if navail is >= dir.len. * gcc.c-torture/compile/pr83448.c: New test. * gcc.dg/tree-ssa/builtin-snprintf-warn-4.c: New test. From-SVN: r255960
2017-12-19gimple-ssa-sprintf.c (format_directive): Use inform_n instead of inform with ↵Jakub Jelinek1-6/+8
hardcoded english plural handling. * gimple-ssa-sprintf.c (format_directive): Use inform_n instead of inform with hardcoded english plural handling. From-SVN: r255840
2017-12-19read-rtl.c (parse_reg_note_name): Replace Yoda conditions with typical order ↵Jakub Jelinek1-2/+2
conditions. * read-rtl.c (parse_reg_note_name): Replace Yoda conditions with typical order conditions. * sel-sched.c (extract_new_fences_from): Likewise. * config/visium/constraints.md (J, K, L): Likewise. * config/visium/predicates.md (const_shift_operand): Likewise. * config/visium/visium.c (visium_legitimize_address, visium_legitimize_reload_address): Likewise. * config/m68k/m68k.c (output_reg_adjust, emit_reg_adjust): Likewise. * config/arm/arm.c (arm_block_move_unaligned_straight): Likewise. * config/avr/constraints.md (Y01, Ym1, Y02, Ym2): Likewise. * config/avr/avr-log.c (avr_vdump, avr_log_set_avr_log, SET_DUMP_DETAIL): Likewise. * config/avr/predicates.md (const_8_16_24_operand): Likewise. * config/avr/avr.c (STR_PREFIX_P, avr_popcount_each_byte, avr_is_casesi_sequence, avr_casei_sequence_check_operands, avr_set_core_architecture, avr_set_current_function, avr_legitimize_reload_address, avr_asm_len, avr_print_operand, output_movqi, output_movsisf, avr_out_plus, avr_out_bitop, avr_out_fract, avr_adjust_insn_length, avr_encode_section_info, avr_2word_insn_p, output_reload_in_const, avr_has_nibble_0xf, avr_map_decompose, avr_fold_builtin): Likewise. * config/avr/driver-avr.c (avr_devicespecs_file): Likewise. * config/avr/gen-avr-mmcu-specs.c (str_prefix_p, print_mcu): Likewise. * config/i386/i386.c (ix86_parse_stringop_strategy_string): Likewise. * config/m32c/m32c-pragma.c (m32c_pragma_memregs): Likewise. * config/m32c/m32c.c (m32c_conditional_register_usage, m32c_address_cost): Likewise. * config/m32c/predicates.md (shiftcount_operand, longshiftcount_operand): Likewise. * config/iq2000/iq2000.c (iq2000_expand_prologue): Likewise. * config/nios2/nios2.c (nios2_handle_custom_fpu_insn_option, can_use_cdx_ldstw): Likewise. * config/nios2/nios2.h (CDX_REG_P): Likewise. * config/cr16/cr16.h (RETURN_ADDR_RTX, REGNO_MODE_OK_FOR_BASE_P): Likewise. * config/cr16/cr16.md (*mov<mode>_double): Likewise. * config/cr16/cr16.c (cr16_create_dwarf_for_multi_push): Likewise. * config/h8300/h8300.c (h8300_rtx_costs, get_shift_alg): Likewise. * config/vax/constraints.md (U06, U08, U16, CN6, S08, S16): Likewise. * config/vax/vax.c (adjacent_operands_p): Likewise. * config/ft32/constraints.md (L, b, KA): Likewise. * config/ft32/ft32.c (ft32_load_immediate, ft32_expand_prologue): Likewise. * cfgexpand.c (expand_stack_alignment): Likewise. * gcse.c (insert_expr_in_table): Likewise. * print-rtl.c (rtx_writer::print_rtx_operand_codes_E_and_V): Likewise. * cgraphunit.c (cgraph_node::expand): Likewise. * ira-build.c (setup_min_max_allocno_live_range_point): Likewise. * emit-rtl.c (add_insn): Likewise. * input.c (dump_location_info): Likewise. * passes.c (NEXT_PASS): Likewise. * read-rtl-function.c (parse_note_insn_name, function_reader::read_rtx_operand_r, function_reader::parse_mem_expr): Likewise. * sched-rgn.c (sched_rgn_init): Likewise. * diagnostic-show-locus.c (layout::show_ruler): Likewise. * combine.c (find_split_point, simplify_if_then_else, force_to_mode, if_then_else_cond, simplify_shift_const_1, simplify_comparison): Likewise. * explow.c (eliminate_constant_term): Likewise. * final.c (leaf_renumber_regs_insn): Likewise. * cfgrtl.c (print_rtl_with_bb): Likewise. * genhooks.c (emit_init_macros): Likewise. * poly-int.h (maybe_ne, maybe_le, maybe_lt): Likewise. * tree-data-ref.c (conflict_fn): Likewise. * selftest.c (assert_streq): Likewise. * expr.c (store_constructor_field, expand_expr_real_1): Likewise. * fold-const.c (fold_range_test, extract_muldiv_1, fold_truth_andor, fold_binary_loc, multiple_of_p): Likewise. * reload.c (push_reload, find_equiv_reg): Likewise. * et-forest.c (et_nca, et_below): Likewise. * dbxout.c (dbxout_symbol_location): Likewise. * reorg.c (relax_delay_slots): Likewise. * dojump.c (do_compare_rtx_and_jump): Likewise. * gengtype-parse.c (type): Likewise. * simplify-rtx.c (simplify_gen_ternary, simplify_gen_relational, simplify_const_relational_operation): Likewise. * reload1.c (do_output_reload): Likewise. * dumpfile.c (get_dump_file_info_by_switch): Likewise. * gengtype.c (type_for_name): Likewise. * gimple-ssa-sprintf.c (format_directive): Likewise. ada/ * gcc-interface/trans.c (Loop_Statement_to_gnu): Replace Yoda conditions with typical order conditions. * gcc-interface/misc.c (gnat_get_array_descr_info, default_pass_by_ref): Likewise. * gcc-interface/decl.c (gnat_to_gnu_entity): Likewise. * adaint.c (__gnat_tmp_name): Likewise. c-family/ * known-headers.cc (get_stdlib_header_for_name): Replace Yoda conditions with typical order conditions. c/ * c-typeck.c (comptypes_internal, function_types_compatible_p, perform_integral_promotions, digest_init): Replace Yoda conditions with typical order conditions. * c-decl.c (check_bitfield_type_and_width): Likewise. cp/ * name-lookup.c (get_std_name_hint): Replace Yoda conditions with typical order conditions. * class.c (check_bitfield_decl): Likewise. * pt.c (convert_template_argument): Likewise. * decl.c (duplicate_decls): Likewise. * typeck.c (commonparms): Likewise. fortran/ * scanner.c (preprocessor_line): Replace Yoda conditions with typical order conditions. * dependency.c (check_section_vs_section): Likewise. * trans-array.c (gfc_conv_expr_descriptor): Likewise. jit/ * jit-playback.c (get_type, playback::compile_to_file::copy_file, playback::context::acquire_mutex): Replace Yoda conditions with typical order conditions. * libgccjit.c (gcc_jit_context_new_struct_type, gcc_jit_struct_set_fields, gcc_jit_context_new_union_type, gcc_jit_context_new_function, gcc_jit_timer_pop): Likewise. * jit-builtins.c (matches_builtin): Likewise. * jit-recording.c (recording::compound_type::set_fields, recording::fields::write_reproducer, recording::rvalue::set_scope, recording::function::validate): Likewise. * jit-logging.c (logger::decref): Likewise. From-SVN: r255831
2017-12-14re PR tree-optimization/83198 (ICE in format_floating, at ↵Jakub Jelinek1-5/+5
gimple-ssa-sprintf.c:1900) PR tree-optimization/83198 * gimple-ssa-sprintf.c (format_floating): Set type solely based on dir.modifier, regardless of TREE_TYPE (arg). Assume non-REAL_CST value if arg is a REAL_CST with incompatible type. * gcc.dg/pr83198.c: New test. * gcc.dg/tree-ssa/pr83198.c: New test. From-SVN: r255626
2017-11-02gimple-ssa-sprintf.c (sprintf_dom_walker): Remove virtual keyword on FINAL ↵Jeff Law1-1/+1
OVERRIDE members. * gimple-ssa-sprintf.c (sprintf_dom_walker): Remove virtual keyword on FINAL OVERRIDE members. * tree-ssa-propagate.h (ssa_propagation_engine): Group virtuals together. Add virtual destructor. (substitute_and_fold_engine): Similarly. From-SVN: r254345
2017-10-27gimple-ssa-sprintf.c: Include domwalk.h.Jeff Law1-30/+45
* gimple-ssa-sprintf.c: Include domwalk.h. (class sprintf_dom_walker): New class, derived from dom_walker. (sprintf_dom_walker::before_dom_children): New function. (struct call_info): Moved into sprintf_dom_walker class (compute_formath_length, handle_gimple_call): Likewise. (sprintf_length::execute): Call the dominator walker rather than walking the statements. From-SVN: r254156
2017-10-17Simplify format_warning_at_substring APIDavid Malcolm1-33/+27
The format_warning_at_substring API has a rather clunk way of indicating the location of the pertinent param (if any): a source_range * is passed in, which can be NULL. Doing so requires extracting a range from the location_t and passing around a pointer to it, or NULL, as needed. This patch simplifies things by eliminating the source_range * in favor of a location_t, with UNKNOWN_LOCATION used to signify that no param location is available. gcc/c-family/ChangeLog: * c-format.c (format_warning_at_char): Pass UNKNOWN_LOCATION rather than NULL to format_warning_va. (check_format_types): Likewise when calling format_type_warning. Remove code to extract source_ranges and source_range * in favor of just a location_t. (format_type_warning): Convert source_range * param to a location_t. gcc/ChangeLog: * gimple-ssa-sprintf.c (fmtwarn): Update for changed signature of format_warning_at_substring. (maybe_warn): Convert source_range * param to a location_t. Pass UNKNOWN_LOCATION rather than NULL to fmtwarn. (format_directive): Remove code to extract source_ranges and source_range * in favor of just a location_t. (parse_directive): Pass UNKNOWN_LOCATION rather than NULL to fmtwarn. * substring-locations.c (format_warning_va): Convert source_range * param to a location_t. (format_warning_at_substring): Likewise. * substring-locations.h (format_warning_va): Likewise. (format_warning_at_substring): Likewise. From-SVN: r253827
2017-08-30[20/77] Replace MODE_INT checks with is_int_modeRichard Sandiford1-2/+3
Replace checks of "GET_MODE_CLASS (...) == MODE_INT" with "is_int_mode (..., &var)", in cases where it becomes useful to refer to the mode as a scalar_int_mode. 2017-08-30 Richard Sandiford <richard.sandiford@linaro.org> Alan Hayward <alan.hayward@arm.com> David Sherwood <david.sherwood@arm.com> gcc/ * machmode.h (is_int_mode): New fuction. * combine.c (find_split_point): Use it. (combine_simplify_rtx): Likewise. (simplify_if_then_else): Likewise. (simplify_set): Likewise. (simplify_shift_const_1): Likewise. (simplify_comparison): Likewise. * config/aarch64/aarch64.c (aarch64_rtx_costs): Likewise. * cse.c (notreg_cost): Likewise. (cse_insn): Likewise. * cselib.c (cselib_lookup_1): Likewise. * dojump.c (do_jump_1): Likewise. (do_compare_rtx_and_jump): Likewise. * dse.c (get_call_args): Likewise. * dwarf2out.c (rtl_for_decl_init): Likewise. (native_encode_initializer): Likewise. * expmed.c (emit_store_flag_1): Likewise. (emit_store_flag): Likewise. * expr.c (convert_modes): Likewise. (store_field): Likewise. (expand_expr_real_1): Likewise. * fold-const.c (fold_read_from_constant_string): Likewise. * gimple-ssa-sprintf.c (get_format_string): Likewise. * optabs-libfuncs.c (gen_int_libfunc): Likewise. * optabs.c (expand_binop): Likewise. (expand_unop): Likewise. (expand_abs_nojump): Likewise. (expand_one_cmpl_abs_nojump): Likewise. * simplify-rtx.c (mode_signbit_p): Likewise. (val_signbit_p): Likewise. (val_signbit_known_set_p): Likewise. (val_signbit_known_clear_p): Likewise. (simplify_relational_operation_1): Likewise. * tree.c (vector_type_mode): Likewise. gcc/go/ * go-lang.c (go_langhook_type_for_mode): Use is_int_mode. Co-Authored-By: Alan Hayward <alan.hayward@arm.com> Co-Authored-By: David Sherwood <david.sherwood@arm.com> From-SVN: r251472
2017-08-14PR translation/79998 - typo in diagnostic "specified bound %wu"Martin Sebor1-1/+1
gcc/ChangeLog: * gimple-ssa-sprintf.c (pass_sprintf_length::handle_gimple_call): Remove a stray space. From-SVN: r251096
2017-07-10PR tree-optimization/80397 - missing -Wformat-overflow with arguments of ↵Martin Sebor1-3/+3
enum types gcc/ChangeLog: PR tree-optimization/80397 * gimple-ssa-sprintf.c (format_integer): Use INTEGRAL_TYPE_P() instead of testing for equality to INTEGER_TYPE. gcc/testsuite/ChangeLog: PR tree-optimization/80397 * gcc.dg/tree-ssa/builtin-sprintf-warn-17.c: New test. From-SVN: r250106
2017-05-14PR middle-end/77671 - missing -Wformat-overflow warning on sprintf overflow ↵Martin Sebor1-44/+115
with %s gcc/ChangeLog: PR middle-end/77671 * gimple-fold.c (gimple_fold_builtin_sprintf): Make extern. (gimple_fold_builtin_snprintf): Same. * gimple-fold.h (gimple_fold_builtin_sprintf): Declare. (gimple_fold_builtin_snprintf): Same. * gimple-ssa-sprintf.c (get_format_string): Correct the detection of character types. (is_call_safe): New function. (try_substitute_return_value): Call it. (try_simplify_call): New function. (pass_sprintf_length::handle_gimple_call): Call it. gcc/testsuite/ChangeLog: PR middle-end/77671 * gcc.dg/tree-ssa/builtin-sprintf-7.c: New test. * gcc.dg/tree-ssa/builtin-sprintf-8.c: New test. * 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. From-SVN: r248035
2017-05-01gimple-ssa-sprintf.c (format_integer): Set knownrange when it's known.Martin Sebor1-0/+1
gcc/ChangeLog: * gimple-ssa-sprintf.c (format_integer): Set knownrange when it's known. gcc/testsuite/ChangeLog: * tree-ssa/builtin-sprintf-warn-18.c: Adjust to avoid failures on ILP32 targets. From-SVN: r247444
2017-04-28PR tree-optimization/80523 - -Wformat-overflow doesn't consider -fexec-charsetMartin Sebor1-72/+286
gcc/ChangeLog: PR tree-optimization/80523 * gimple-ssa-sprintf.c (target_to_host_charmap): New global variable. (init_target_to_host_charmap, target_to_host, target_strtol10): New functions. (maybe_warn, format_directive, parse_directive): Use new functions. (pass_sprintf_length::execute): Call init_target_to_host_charmap. gcc/testsuite/ChangeLog: PR tree-optimization/80523 * gcc.dg/tree-ssa/builtin-sprintf-warn-18.c: New test. From-SVN: r247401
2017-04-25PR tree-optimization/80497 - ICE at -O1 and above on valid code on ↵Martin Sebor1-2/+5
x86_64-linux-gnu in tree_to_uhwi gcc/ChangeLog: PR tree-optimization/80497 * gimple-ssa-sprintf.c (get_int_range): Avoid assuming all integer constants are representable in HOST_WIDE_INT. (parse_directive): Ditto. gcc/testsuite/ChangeLog: PR tree-optimization/80497 * gcc.dg/tree-ssa/builtin-sprintf-warn-17.c: New test. From-SVN: r247262
2017-04-11PR middle-end/80364 - sanitizer detects signed integer overflow in ↵Martin Sebor1-27/+44
gimple-ssa-sprintf.c gcc/ChangeLog: PR middle-end/80364 * gimple-ssa-sprintf.c (get_int_range): Remove second argument and always use the int type. Use INTEGRAL_TYPE_P() rather than testing for INTEGER_TYPE. (directive::set_width, directive::set_precision, format_character): Adjust. (parse_directive): Use INTEGRAL_TYPE_P() rather than testing for INTEGER_TYPE. gcc/testsuite/ChangeLog: PR middle-end/80364 * gcc.dg/tree-ssa/builtin-sprintf-warn-16.c: New test. From-SVN: r246846
2017-03-14re PR tree-optimization/79800 (wrong snprintf result range with precision in ↵Martin Sebor1-28/+24
a narrow negative-positive range) PR tree-optimization/79800 * gimple-ssa-sprintf.c (format_floating: Add argument. Handle precision in negative-positive range. (format_floating): Call non-const overload with adjusted precision. PR tree-optimization/79800 * gcc.dg/tree-ssa/builtin-sprintf-warn-15.c: Add test cases. * gcc.dg/tree-ssa/pr79800.c: New test. From-SVN: r246151
2017-03-01PR middle-end/79692 - [7 Regression] -Wformat-overflow false positiveMartin Sebor1-32/+132
gcc/ChangeLog: PR middle-end/79692 * gimple-ssa-sprintf.c (directive::known_width_and_precision): New function. (format_integer): Use it. (get_mpfr_format_length): Consider the full range of precision when computing %g output with the # flag. Set the likely byte count to 3 rather than 1 when precision is indeterminate. (format_floating): Correct the lower bound of precision. gcc/testsuite/ChangeLog: PR middle-end/79692 * gcc.dg/tree-ssa/builtin-sprintf-2.c: Add test cases. * gcc.dg/tree-ssa/builtin-sprintf-warn-10.c: Correct %#g. * gcc.dg/tree-ssa/builtin-sprintf-warn-15.c: New test. * gcc.dg/tree-ssa/builtin-snprintf-3.c: Ditto. From-SVN: r245822
2017-02-17re PR tree-optimization/79327 (wrong code at -O2 and -fprintf-return-value)Jakub Jelinek1-20/+9
PR tree-optimization/79327 * gimple-ssa-sprintf.c (format_integer): Remove likely_adjust variable, its initialization and use. From-SVN: r245542
2017-02-14PR middle-end/79448 - unhelpful -Wformat-truncation=2 warningMartin Sebor1-3/+11
gcc/testsuite/ChangeLog: PR middle-end/79448 * gcc.dg/tree-ssa/builtin-snprintf-warn-3.c: New test. * gcc.dg/tree-ssa/pr79448-2.c: New test. * gcc.dg/tree-ssa/pr79448.c: New test. gcc/ChangeLog: PR middle-end/79448 * gimple-ssa-sprintf.c (format_directive): Avoid issuing INT_MAX warning for strings of unknown length. From-SVN: r245437
2017-02-13PR middle-end/79496 - call to snprintf with zero size eliminated with ↵Martin Sebor1-3/+12
-Wformat-truncation=2 gcc/ChangeLog: PR middle-end/79496 * gimple-ssa-sprintf.c (pass_sprintf_length::handle_gimple_call): Avoid clearing info.nowrite flag when snprintf size argument is a range. gcc/testsuite/ChangeLog: PR middle-end/79496 * gcc.dg/tree-ssa/builtin-snprintf-2.c: New test. From-SVN: r245415
2017-02-03PR tree-optimization/79327 - wrong code at -O2 and -fprintf-return-valueMartin Sebor1-2/+38
PR tree-optimization/79327 - wrong code at -O2 and -fprintf-return-value gcc/ChangeLog: * gimple-ssa-sprintf.c (tree_digits): Avoid adding the base prefix when precision has resulted in leading zeros. (format_integer): Adjust the likely counter to assume an unknown argument that may be zero is non-zero. gcc/testsuite/ChangeLog: * gcc.dg/tree-ssa/builtin-sprintf-warn-1.c: Adjust. * gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-13.c: New test. * gcc/testsuite/gcc.dg/tree-ssa/pr79327-2.c: Ditto. From-SVN: r245173
2017-02-03re PR tree-optimization/79327 (wrong code at -O2 and -fprintf-return-value)Jakub Jelinek1-76/+30
PR tree-optimization/79327 * gimple-ssa-sprintf.c (adjust_range_for_overflow): If returning true, always set *argmin and *argmax to TYPE_{MIN,MAX}_VALUE of dirtype. (format_integer): Use wide_int_to_tree instead of build_int_cst + to_?hwi. If argmin is NULL, just set argmin and argmax to TYPE_{MIN,MAX}_VALUE of argtype. Simplify and fix computation of shortest and longest sequence. * gcc.dg/tree-ssa/pr79327.c: New test. * gcc.dg/tree-ssa/builtin-sprintf-warn-1.c (test_sprintf_chk_hh_nonconst): Don't expect 2 bogus warnings. * gcc.dg/tree-ssa/builtin-sprintf-warn-3.c (test_sprintf_chk_range_schar): Adjust dg-message. * gcc.dg/tree-ssa/builtin-sprintf-warn-12.c: New test. * gcc.c-torture/execute/pr79327.c: New test. Co-Authored-By: Martin Sebor <msebor@redhat.com> From-SVN: r245166
2017-02-03PR tree-optimization/79352 - -fprintf-return-value doesn't handle ↵Martin Sebor1-2/+6
flexible-like array members properly gcc/ChangeLog: PR tree-optimization/79352 * gimple-fold.c (get_range_strlen): Add argument. (get_range_strlen): Change return type to bool. (get_maxval_strlen): Pass in a dummy argument. * gimple-fold.h (get_range_strlen): Change return type to bool. * gimple-ssa-sprintf.c (get_string_length): Set unlikely counter. * tree.h (array_at_struct_end_p): Add argument. * tree.c (array_at_struct_end_p): Handle it. gcc/testsuite/ChangeLog: PR tree-optimization/79352 * gcc.dg/tree-ssa/pr79352.c: New test. From-SVN: r245156
2017-02-03Fix memory leaks in gimple-ssa-sprintf.c (PR tree-optimization/79339).Martin Liska1-1/+5
2017-02-03 Martin Liska <mliska@suse.cz> PR tree-optimization/79339 * gimple-ssa-sprintf.c (format_floating_max): Call mpfr_clear. (format_floating): Likewise. From-SVN: r245146
2017-02-02PR middle-end/79275 - -Wformat-overflow false positive exceeding INT_MAX in ↵Martin Sebor1-22/+69
glibc sysdeps/posix/tempname.c gcc/testsuite/ChangeLog: PR middle-end/79275 * gcc.dg/tree-ssa/builtin-sprintf-warn-11.c: New test. * gcc.dg/tree-ssa/pr79275.c: New test. gcc/ChangeLog: PR middle-end/79275 * gimple-ssa-sprintf.c (get_string_length): Set lower bound to zero. (format_string): Tighten up the range of output for non-constant strings and correct the expected range for wide non-constant strings. From-SVN: r245142
2017-01-30gimple-ssa-sprintf.c (fmtresult::adjust_for_width_or_precision): Move ↵Martin Sebor1-14/+14
constant to the right of a relational operator. gcc/ChangeLog: * gimple-ssa-sprintf.c (fmtresult::adjust_for_width_or_precision): Move constant to the right of a relational operator. (get_mpfr_format_length, format_character, format_string): Ditto. (should_warn_p, maybe_warn): Same. From-SVN: r245040
2017-01-27realmpfr.h: Poison MPFR_RND{N,Z,U,D}.Jakub Jelinek1-1/+1
* realmpfr.h: Poison MPFR_RND{N,Z,U,D}. * gimple-ssa-sprintf.c (format_floating_max): Use GMP_RNDN instead of MPFR_RNDN. From-SVN: r244966
2017-01-26gimple-ssa-sprintf.c (format_floating): Simplify the computation of ↵Martin Sebor1-14/+4
precision to avoid preprocessor conditional. gcc/ChangeLog: * gimple-ssa-sprintf.c (format_floating): Simplify the computation of precision to avoid preprocessor conditional. From-SVN: r244961
2017-01-26gimple-ssa-sprintf.c (format_floating): Test HAVE_XFmode and HAVE_DFmode ↵Martin Sebor1-7/+16
before using XFmode or DFmode. gcc/ChangeLog: * gimple-ssa-sprintf.c (format_floating): Test HAVE_XFmode and HAVE_DFmode before using XFmode or DFmode. (parse_directive): Avoid using the z length modifier to avoid the ISO C++98 does not support the ‘z’ gnu_printf length modifier. From-SVN: r244957
2017-01-26PR middle-end/78703 - fprintf-return-value floating point handling incorrect ↵Martin Sebor1-195/+253
in locales with a mulltibyte decimal point gcc/ChangeLog: PR middle-end/78703 * gimple-ssa-sprintf.c (adjust_for_width_or_precision): Change to accept adjustment as an array. (get_int_range): New function. (struct directive): Make width and prec arrays. (directive::set_width, directive::set_precision): Call get_int_range. (format_integer, format_floating): Handle width and precision ranges. (format_string, parse_directive): Same. gcc/testsuite/ChangeLog: PR middle-end/78703 * gcc.dg/tree-ssa/builtin-snprintf-warn-1.c: Update * gcc.dg/tree-ssa/builtin-sprintf-warn-9.c: Rename... * gcc.dg/tree-ssa/builtin-sprintf-warn-10.c: ...to this. * gcc.dg/tree-ssa/builtin-sprintf-warn-9.c: New test. From-SVN: r244956
2017-01-26PR middle-end/78703 -fprintf-return-value floating point handling incorrect ↵Martin Sebor1-759/+945
in locales with a mulltibyte decimal point gcc/ChangeLog: PR middle-end/78703 * gimple-ssa-sprintf.c (struct result_range): Add likely and unlikely counters. (struct format_result): Replace number_chars, number_chars_min, and number_chars_max with a single member of struct result_range. Remove bounded. (format_result::operator+=): Adjust. (struct fmtresult): Remove bounded. Handle likely and unlikely counters. (fmtresult::adjust_for_width_or_precision): New function. (fmtresult:type_max_digits): New function. (bytes_remaining): Handle likely and unlikely counters. (min_bytes_remaining): Remove. (format_percent): Simplify. (format_integer, format_floating): Set likely and unlikely counters. (get_string_length, format_character, format_string): Same. (format_plain, should_warn_p): New function. (maybe_warn): Call should_warn_p. Update diagnostic messages and handle those for all directives, including plain strings. (format_directive): Handle likely and unlikely counters. Remove unnecessary quoting from diagnostics. Add an informational note. (add_bytes): Remove. (pass_sprintf_length::compute_format_length): Simplify. (try_substitute_return_value): Handle likely and unlikely counters. gcc/testsuite/ChangeLog: PR middle-end/78703 * gcc.dg/format/pr78569.c: Adjust. * gcc.dg/tree-ssa/builtin-snprintf-warn-2.c: Same. * gcc.dg/tree-ssa/builtin-sprintf-2.c: Same. * gcc.dg/tree-ssa/builtin-sprintf-5.c: Same. * 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-4.c: Same. * gcc.dg/tree-ssa/builtin-sprintf-warn-6.c: Same. * gcc.dg/tree-ssa/builtin-sprintf-warn-7.c: Same. * gcc.dg/tree-ssa/builtin-sprintf-warn-9.c: Same. * gcc.dg/tree-ssa/builtin-sprintf.c: Same. From-SVN: r244953
2017-01-24Fix build failure with MPFR 2.4.xMarkus Trippelsdorf1-1/+1
* gimple-ssa-sprintf.c (format_floating): Change MPFR_RNDx to GMP_RNDx for compatiblity. From-SVN: r244858
2017-01-23PR middle-end/78703 - -fprintf-return-value floating point handling incorrect...Martin Sebor1-167/+234
PR middle-end/78703 - -fprintf-return-value floating point handling incorrect in locales with a mulltibyte decimal point * gimple-ssa-sprintf.c (warn_level): New global. (format_integer): Use it here and throughout the rest of the file. Use the same switch to compute sign as base. (maybe_warn): New function. (format_directive): Factor out warnings into maybe_warn. Add debugging output. Use warn_level. (add_bytes): Use warn_level. (pass_sprintf_length::compute_format_length): Add debugging output. (try_substitute_return_value): Same. (pass_sprintf_length::handle_gimple_call): Set and use warn_level. From-SVN: r244847
2017-01-23PR middle-end/78703 - -fprintf-return-value floating point handling incorrect...Martin Sebor1-110/+81
PR middle-end/78703 - -fprintf-return-value floating point handling incorrect in locales with a mulltibyte decimal point * gimple-ssa-sprintf.c (struct format_result): Remove constant member. (struct fmtresult, format_integer, format_floating): Adjust. (get_string_length, format_string,format_directive): Same. (pass_sprintf_length::compute_format_length): Same. (try_substitute_return_value): Simplify slightly. From-SVN: r244846
2017-01-23PR middle-end/78703 - -fprintf-return-value floating point handling incorrect...Martin Sebor1-660/+783
PR middle-end/78703 - -fprintf-return-value floating point handling incorrect in locales with a mulltibyte decimal point * gimple-ssa-sprintf.c (pass_sprintf_length::gate): Adjust formatting. (fmtresult::operator+=): Outlined. (struct fmtresult): Add ctors. (struct conversion_spec): Rename... (struct directive): ...to this. Add and remove data members. (directive::set_width, directive::set_precision): New functions. (format_percent): Use fmtresult ctor. (get_width_and_precision): Remove. (format_integer): Make naming changes. Avoid computing width and precision. (format_floating): Same. Adjust indentation. (format_character, format_none): New functions. (format_string): Moved character handling to format_character. (format_directive): Remove arguments, change return type. (parse_directive): New function. (pass_sprintf_length::compute_format_length): Move directive parsing to parse_directive. From-SVN: r244845