aboutsummaryrefslogtreecommitdiff
AgeCommit message (Collapse)AuthorFilesLines
2022-04-29c++: check completeness after auto deduction [PR80351]Jason Merrill9-5/+119
Normally we check for incomplete type in start_decl, but that obviously doesn't work for auto variables. Thanks to Pokechu22 for the analysis and testcases: "When cp_finish_decl calls cp_apply_type_quals_to_decl on a const auto or constexpr auto variable, the type might not be complete the first time (this happened when auto deduces to an initializer_list). cp_apply_type_quals_to_decl removes the const qualifier if the type is not complete, which is appropriate for grokdeclarator, on the assumption that the type will be complete when called by cp_finish_decl." PR c++/80351 gcc/cp/ChangeLog: * decl.cc (cp_finish_decl): Check completeness of deduced type. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/constexpr-77482.C: Adjust message. * g++.dg/cpp1y/auto-fn27.C: Likewise. * g++.dg/cpp1y/lambda-generic-variadic22.C: Likewise. * g++.dg/cpp1z/decomp54.C: Likewise. * g++.dg/cpp0x/initlist-const1.C: New test. * g++.dg/warn/Wunused-var-37.C: New test. * g++.dg/warn/Wunused-var-38.C: New test. * g++.dg/warn/Wunused-var-39.C: New test.
2022-04-29Fix exchanged period and letter in gfortan.texi.Thomas Koenig1-1/+1
gcc/fortran/ChangeLog: * gfortran.texi: Fix exchanged period and letter.
2022-04-29Merge branch 'master' into devel/modula-2.Gaius Mulley32-84/+488
2022-04-29PR-105411 BugFix gm2 testsuite now uses TEST_ALWAYS_FLAGS.Gaius Mulley1-3/+11
2022-04-29 Gaius Mulley <gaius.mulley@southwales.ac.uk> gcc/testsuite/ChangeLog: * gcc/testsuite/lib/gm2.exp (gm2_target_compile_default): Add TEST_ALWAYS_FLAGS to allow individual tests to override options. Signed-off-by: Gaius Mulley <gaius.mulley@southwales.ac.uk>
2022-04-29ipa: Release body of clone_of when removing its last clone (PR 100413)Martin Jambor2-1/+69
In the PR, the verifier complains that we did not manage to remove the body of a node and it is right. The node is kept for materialization of two clones but after one is materialized, the other one is removed as unneeded (as a part of delete_unreachable_blocks_update_callgraph). The problem is that the node removal does not check for this situation and can leave the clone_of node there with a body attached to it even though there is no use for it any more. This patch does checks for it and handles the situation in a simlar way that cgraph_node::materialize_clone does it, except that it also has to be careful that the removed node itself does not have any clones, which would still need the clone_of's body. Failing to do that results in a bootstrap failure. gcc/ChangeLog: 2022-04-27 Martin Jambor <mjambor@suse.cz> PR ipa/100413 * cgraph.cc (cgraph_node::remove): Release body of the node this is clone_of if appropriate. gcc/testsuite/ChangeLog: 2022-04-27 Martin Jambor <mjambor@suse.cz> PR ipa/100413 * g++.dg/ipa/pr100413.C: New test.
2022-04-29aarch64: Add option to pr105219 testcaseAndre Vieira1-0/+1
Add option that originally caused testcase to fail for aarch64. gcc/testsuite/ChangeLog: PR tree-optimization/105219 * gcc.dg/vect/pr105219.c: Add aarch64 target option.
2022-04-29c++: Add fixed test [PR83596]Marek Polacek1-0/+11
This was fixed by r269078. PR c++/83596 gcc/testsuite/ChangeLog: * g++.dg/cpp1z/nontype5.C: New test.
2022-04-29libstdc++: Add missing exports for ppc64le --with-long-double-format=ibm ↵Jonathan Wakely2-0/+48
[PR105417] The --with-long-double-abi=ibm build is missing some exports that are present in the --with-long-double-abi=ieee build. Those symbols never should have been exported at all, but now that they have been, they should be exported consistently by both ibm and ieee. This simply defines them as aliases for equivalent symbols that are already present. The abi-tag on num_get::_M_extract_int isn't really needed, because it only uses a std::string as a local variable, not in the return type or function parameters, so it's safe to define the _M_extract_int[abi:cxx11] symbols as aliases for the corresponding function without the abi-tag. This causes some new symbols to be added to the GLIBCXX_3.4.29 version for the ibm long double build mode, but there is no advantage to adding them to 3.4.30 for that build. That would just create more inconsistencies. libstdc++-v3/ChangeLog: PR libstdc++/105417 * config/abi/post/powerpc64-linux-gnu/baseline_symbols.txt: Regenerate. * src/c++11/compatibility-ldbl-alt128.cc [_GLIBCXX_USE_DUAL_ABI]: Define __gnu_ieee128::num_get<C>::_M_extract_int[abi:cxx11]<I> symbols as aliases for corresponding symbols without abi-tag.
2022-04-29c++: Add fixed test [PR78244]Marek Polacek1-0/+26
This was finally fixed for GCC 11 by r11-434. PR c++/78244 gcc/testsuite/ChangeLog: * g++.dg/cpp0x/Wnarrowing20.C: New test.
2022-04-29c++: Add fixed test [PR71424]Marek Polacek1-0/+13
This was fixed by r12-6329-g4f6bc28fc7dd86. PR c++/71424 gcc/testsuite/ChangeLog: * g++.dg/cpp0x/initlist-array15.C: New test.
2022-04-29c++: using in diagnostics [PR102987]Jason Merrill2-7/+12
The decl pretty-printing code wasn't looking at the flags parameter, so we were printing 'using' in the middle of an expression. PR c++/102987 gcc/cp/ChangeLog: * error.cc (dump_decl) [USING_DECL]: Respect flags. gcc/testsuite/ChangeLog: * g++.dg/diagnostic/using1.C: Check pretty-printing.
2022-04-29c++: dump alias-declaration scopeJason Merrill2-1/+3
An alias can't be declared with a qualified-id in actual code, but in diagnostics we want to know which scope it belongs to, and I think a nested-name-specifier is the best way to provide that. gcc/cp/ChangeLog: * error.cc (dump_decl): Check TFF_UNQUALIFIED_NAME. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/alias-decl-1.C: Expect qualified name.
2022-04-29c++: Improve diagnostics for template args terminated with >= or >>= [PR104319]Jakub Jelinek3-6/+98
As mentioned in the PR, for C++98 we have diagnostics that expect >> terminating template arguments to be a mistake for > > (C++11 said it has to be treated that way), while if user trying to spare the spacebar doesn't separate > from following = or >> from following =, the diagnostics is confusing, while clang suggests adding space in between. The following patch does that for >= and >>= too. For some strange reason the error recovery emits further errors, not really sure what's going on because I overwrite the token->type like the code does for the C++11 >> case or for the C++98 >> cases, but at least the first error is nicer (well, for the C++98 nested template case and >>= I need to overwrite it to > and so the = is lost, so perhaps some follow-up errors are needed for that case). 2022-04-29 Jakub Jelinek <jakub@redhat.com> PR c++/104319 * parser.cc (cp_parser_template_argument): Treat >= like C++98 >> after a type id by setting maybe_type_id and aborting tentative parse. (cp_parser_enclosed_template_argument_list): Handle CPP_GREATER_EQ like misspelled CPP_GREATER CPP_RQ and CPP_RSHIFT_EQ like misspelled CPP_GREATER CPP_GREATER_EQ or CPP_RSHIFT CPP_EQ or CPP_GREATER CPP_GREATER CPP_EQ. (cp_parser_next_token_ends_template_argument_p): Return true also for CPP_GREATER_EQ and CPP_RSHIFT_EQ. * g++.dg/parse/template28.C: Adjust expected diagnostics. * g++.dg/parse/template30.C: New test.
2022-04-29libstdc++: Update Solaris baselines for GCC 12.1Rainer Orth4-0/+48
The following patch updates the Solaris baselines for GCC 12.1. Tested on i386-pc-solaris2.11 and sparc-sun-solaris2.11 (Solaris 11.3 and 11.4 in each case). The only (expected) difference between the 11.3 and 11.4 versions is --- baseline_symbols.txt.s113s 2022-04-28 10:37:11.464068450 +0000 +++ baseline_symbols.txt.s114s 2022-04-27 16:54:31.995636805 +0000 @@ -4070,3 +4070,3 @@ -FUNC:_ZSt10from_charsPKcS0_RdSt12chars_format@@GLIBCXX_3.4.30 -FUNC:_ZSt10from_charsPKcS0_ReSt12chars_format@@GLIBCXX_3.4.30 -FUNC:_ZSt10from_charsPKcS0_RfSt12chars_format@@GLIBCXX_3.4.30 +FUNC:_ZSt10from_charsPKcS0_RdSt12chars_format@@GLIBCXX_3.4.29 +FUNC:_ZSt10from_charsPKcS0_ReSt12chars_format@@GLIBCXX_3.4.29 +FUNC:_ZSt10from_charsPKcS0_RfSt12chars_format@@GLIBCXX_3.4.29 which is handled by the fix for PR libstdc++/103407. I'm using the 11.4 version here. 2022-04-27 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> libstdc++-v3: * config/abi/post/i386-solaris/baseline_symbols.txt: Regenerate. * config/abi/post/i386-solaris/amd64/baseline_symbols.txt: Likewise. * config/abi/post/sparc-solaris/baseline_symbols.txt: Likewise. * config/abi/post/sparc-solaris/sparcv9/baseline_symbols.txt: Likewise.
2022-04-29i386: Optimize double-word negation [PR51954]Uros Bizjak2-0/+59
Introduce peephole2 pattern to convert from: mov %esi, %edx negl %eax adcl $0, %edx negl %edx to: xorl %edx, %edx negl %eax sbbl %esi, %edx This conversion is profitable only when initial move is found. Otherwise, additional move to a temporary together with clearing xor is needed. 2022-04-29 Uroš Bizjak <ubizjak@gmail.com> gcc/ChangeLog: PR target/51954 * config/i386/i386.md (adcl/neg -> sbb peephole): New peephole2. gcc/testsuite/ChangeLog: PR target/51954 * gcc.target/i386/pr51954.c: New test.
2022-04-29Merge branch 'master' into devel/modula-2.Gaius Mulley84-374/+1939
2022-04-29Fix is_gimple_condexpr vs is_gimple_condexpr_for_condRichard Biener9-54/+70
The following fixes wrongly used is_gimple_condexpr and makes canonicalize_cond_expr_cond honor either, delaying final checking to callers where all but two in ifcombine are doing the correct thing already. This fixes bugs but is now mainly in preparation for making COND_EXPRs in GIMPLE assignments no longer have a GENERIC expression as condition operand like we already transitioned VEC_COND_EXPR earlier. 2022-04-11 Richard Biener <rguenther@suse.de> * gimple-expr.cc (is_gimple_condexpr): Adjust comment. (canonicalize_cond_expr_cond): Move here from gimple.cc, allow both COND_EXPR and GIMPLE_COND forms. * gimple-expr.h (canonicalize_cond_expr_cond): Declare. * gimple.cc (canonicalize_cond_expr_cond): Remove here. * gimple.h (canonicalize_cond_expr_cond): Likewise. * gimple-loop-versioning.cc (loop_versioning::version_loop): Use is_gimple_condexpr_for_cond. * tree-parloops.cc (gen_parallel_loop): Likewise. * tree-ssa-ifcombine.cc (ifcombine_ifandif): Check for a proper cond expr after canonicalize_cond_expr_cond. Use is_gimple_condexpr_for_cond where appropriate. * tree-ssa-loop-manip.cc (determine_exit_conditions): Likewise. * tree-vect-loop-manip.cc (slpeel_add_loop_guard): Likewise.
2022-04-29PR-105390 BugFix - change handbuilt SysExceptions to avoid the name sigfpe.Gaius Mulley2-10/+10
2022-04-29 Gaius Mulley <gaius.mulley@southwales.ac.uk> gcc/m2/ChangeLog: * m2/gm2-libs-ch/SysExceptions.c: Replace sigfpe with sigfpe_ to avoid name clash with C signal infastructure. * m2/mc-boot-ch/GSysExceptions.c: Replace sigfpe with sigfpe_ to avoid name clash with C signal infastructure. Signed-off-by: Gaius Mulley <gaius.mulley@southwales.ac.uk>
2022-04-29tree-optimization/105431 - another overflow in powi handlingRichard Biener1-7/+5
This avoids undefined signed overflow when calling powi_as_mults_1. 2022-04-29 Richard Biener <rguenther@suse.de> PR tree-optimization/105431 * tree-ssa-math-opts.cc (powi_as_mults_1): Make n unsigned. (powi_as_mults): Use absu_hwi. (gimple_expand_builtin_powi): Remove now pointless n != -n check.
2022-04-29Add gsi_after_labels overload for gimple_seqRichard Biener3-15/+30
The following adds gsi_after_labels for gimple_seq so I do not have to open-code it. I took the liberty to remove the two #defines wrapping gsi_start_1 and gsi_last_1 as we now have C++ references. 2022-02-01 Richard Biener <rguenther@suse.de> * gimple-iterator.h (gsi_after_labels): Add overload for gimple_seq. (gsi_start_1): Rename to gsi_start and take a reference. (gsi_last_1): Likewise. * gimple-iterator.cc (gsi_for_stmt): Use gsi_start. * omp-low.cc (lower_rec_input_clauses): Likewise. (lower_omp_scan): Likewise.
2022-04-29Move common code from range-op.cc to header files.Aldy Hernandez3-97/+143
In preparation for the agnostication of ranger, this patch moves common code that can be shared between non-integer ranges (initially pointers) into the relevant header files. This is a relatively non-invasive change, as any changes that would need to be ported to GCC 12, would occur in the range-op entries themselves, not in the supporting glue which I'm moving. Tested and benchmarked on x86-64 Linux. gcc/ChangeLog: * range-op.cc (empty_range_varying): Move to range-op.h. (range_true): Move to range.h. (range_false): Same. (range_true_and_false): Same. (enum bool_range_state): Move to range-op.h. (relop_early_resolve): Same. (operator_equal::op1_op2_relation): Abstract code to... (equal_op1_op2_relation): ...here. (operator_not_equal::op1_op2_relation): Abstract code to... (not_equal_op1_op2_relation): ...here. (operator_lt::op1_op2_relation): Abstract code to... (lt_op1_op2_relation): ...here. (operator_le::op1_op2_relation): Abstract code to... (le_op1_op2_relation): ...here. (operator_gt::op1_op2_relation): Abstract code to... (gt_op1_op2_relation): ...here. (operator_ge::op1_op2_relation): Abstract code to... (ge_op1_op2_relation): ...here. (class range_op_table): Move to range-op.h. * range-op.h (equal_op1_op2_relation): Moved from range-op.cc. (not_equal_op1_op2_relation): Same. (lt_op1_op2_relation): Same. (le_op1_op2_relation): Same. (gt_op1_op2_relation): Same. (ge_op1_op2_relation): Same. (enum bool_range_state): Same. (get_bool_state): Same. (empty_range_varying): Same. (relop_early_resolve): Same. (class range_op_table): Same. * range.h (range_true): Same. (range_false): Same. (range_true_and_false): Same.
2022-04-29Remove various deprecated methods in class irange.Aldy Hernandez10-24/+24
This patch cleans up some irange methods in preparation for other cleanups later in the cycle. First, we prefer the reference overloads for union and intersect as the pointer versions have been deprecated for a couple releases. Also, I've renamed the legacy union/intersect whose only function was to provide additional verbosity for VRP into legacy_verbose_{union,intersect}. This is a temporary rename to serve as a visual reminder of which of the methods are bound for the chopping block when the legacy code gets removed later this cycle. Tested on x86-64 Linux. gcc/ChangeLog: * gimple-fold.cc (size_must_be_zero_p): Use reference instead of pointer * gimple-ssa-evrp-analyze.cc (evrp_range_analyzer::record_ranges_from_incoming_edge): Rename intersect to legacy_verbose_intersect. * ipa-cp.cc (ipcp_vr_lattice::meet_with_1): Use reference instead of pointer. * tree-ssa-dom.cc (dom_jt_simplifier::simplify): Use value_range instead of value_range_equiv. * tree-vrp.cc (extract_range_from_plus_minus_expr): Use reference instead of pointer. (find_case_label_range): Same. * value-range-equiv.cc (value_range_equiv::intersect): Rename to... (value_range_equiv::legacy_verbose_intersect): ...this. (value_range_equiv::union_): Rename to... (value_range_equiv::legacy_verbose_union_): ...this. * value-range-equiv.h (class value_range_equiv): Rename union and intersect to legacy_verbose_{intersect,union}. * value-range.cc (irange::union_): Rename to... (irange::legacy_verbose_union_): ...this. (irange::intersect): Rename to... (irange::legacy_verbose_intersect): ...this. * value-range.h (irange::union_): Rename union_ to legacy_verbose_union. (irange::intersect): Rename intersect to legacy_verbose_intersect. * vr-values.cc (vr_values::update_value_range): Same. (vr_values::extract_range_for_var_from_comparison_expr): Same. (vr_values::extract_range_from_cond_expr): Rename union_ to legacy_verbose_union. (vr_values::extract_range_from_phi_node): Same.
2022-04-29Prefer global range info setters that take a range.Aldy Hernandez15-62/+79
This patch consolidates the multiple ways we have of storing global ranges into one accepting a range. In an upcoming patch series later this cycle we will be providing a way to store iranges globally, as opposed to the mechanism we have now which squishes wider ranges into value_range's. This is preparation for such work. Tested and benchmarked on x86-64 Linux. gcc/ChangeLog: * gimple-ssa-evrp-analyze.cc (evrp_range_analyzer::set_ssa_range_info): Use *range_info methods that take a range. * gimple-ssa-sprintf.cc (try_substitute_return_value): Same. * ipa-prop.cc (ipcp_update_vr): Same. * tree-inline.cc (remap_ssa_name): Same. * tree-ssa-copy.cc (fini_copy_prop): Same. * tree-ssa-math-opts.cc (optimize_spaceship): Same. * tree-ssa-phiopt.cc (replace_phi_edge_with_variable): Same. * tree-ssa-pre.cc (insert_into_preds_of_block): Same. * tree-ssa-sccvn.cc (eliminate_dom_walker::eliminate_stmt): Same. * tree-ssa-strlen.cc (set_strlen_range): Same. (strlen_pass::handle_builtin_string_cmp): Same. * tree-ssanames.cc (set_range_info): Make static. (duplicate_ssa_name_range_info): Make static and add a new variant calling the static. * tree-ssanames.h (set_range_info): Remove version taking wide ints. (duplicate_ssa_name_range_info): Remove version taking a range_info_def and replace with a version taking SSA names. * tree-vect-loop-manip.cc (vect_gen_vector_loop_niters): Use *range_info methods that take a range. (vect_do_peeling): Same. * tree-vrp.cc (vrp_asserts::remove_range_assertions): Same. * vr-values.cc (simplify_truth_ops_using_ranges): Same.
2022-04-29Call set_undefined from irange constructor.Aldy Hernandez1-2/+1
Small clean up to use set_undefined instead of duplicating the functionality therein. Tested on x86-64 Linux. gcc/ChangeLog: * value-range.h (irange::irange): Use set_undefined.
2022-04-29Make irange::intersect(wide_int, wide_int) private.Aldy Hernandez3-6/+8
This method should have been private, and somehow seeped into the API. Tested and benchmarked on x86-64 Linux. gcc/ChangeLog: * gimple-range-cache.h (non_null_ref::adjust_range): Do not use irange::intersect (wide_int, wide_int). * gimple-range-fold.cc (adjust_pointer_diff_expr): Same. (adjust_imagpart_expr): Same. * value-range.h (irange::intersect (wide_int, wide_int)): Make private.
2022-04-29tree-optimization/104322 - remove dead code in vectorizable_reductionRichard Biener1-6/+1
The PR points out dead code after previous refactoring. 2022-02-01 Richard Biener <rguenther@suse.de> PR tree-optimization/104322 * tree-vect-loop.cc (vectorizable_reduction): Remove dead code.
2022-04-29c++, coroutines: Partial reversion of r12-8308-g15a176a833f23e [PR105426].Iain Sandoe1-6/+8
The changes to fix PR 105287 included a tightening of the constraints on which variables are promoted to frame copies. This has exposed that we are failing to name some variables that should be promoted. We avoid the use of DECL_UID to build anonymous symbols since that might not be stable for -fcompare-debug. The long-term fix is to address the cases where the naming has been missed, but for the short-term (and for the GCC-12 branch) backing out the additional constraint is proposed. Signed-off-by: Iain Sandoe <iain@sandoe.co.uk> PR c++/105426 gcc/cp/ChangeLog: * coroutines.cc (register_local_var_uses): Allow promotion of unnamed temporaries to coroutine frame copies.
2022-04-29middle-end/105376 - invalid REAL_CST for DFP constantRichard Biener2-0/+30
We are eventually ICEing in decimal_to_decnumber on non-decimal REAL_VALUE_TYPE that creep in from uses of build_real (..., dconst*) for DFP types. The following extends the decimal_to_decnumber special-casing of dconst* to build_real, avoiding the bogus REAL_CSTs from creeping into the IL and modified to ones not handled by the decimal_to_decnumber special casing. It also makes sure to ICE for not handled dconst* values at the point we build the REAL_CST. 2022-04-27 Richard Biener <rguenther@suse.de> PR middle-end/105376 * tree.cc (build_real): Special case dconst* arguments for decimal floating point types. * gcc.dg/pr105376.c: New testcase.
2022-04-29ada: bump Library_Version to 13.Martin Liska1-1/+1
gcc/ada/ChangeLog: * gnatvsn.ads: Bump Library_Version to 13.
2022-04-28c++: traits, array of unknown bound of incompleteJason Merrill2-14/+13
My r161129 changed check_trait_type to reject arrays of unknown bound of incomplete type, but I can't find a rationale for that, and now think it's wrong: the standard just requires that the type be "complete, cv void, or an array of unknown bound." I imagine that allowing arrays of unknown bound is because an array of unknown bound can't change from incomplete to complete later in the translation unit, so there's no caching problem. gcc/cp/ChangeLog: * semantics.cc (check_trait_type): Don't check completeness of element type of array of unknown bound. gcc/testsuite/ChangeLog: * g++.dg/ext/unary_trait_incomplete.C: Adjust.
2022-04-28c++: typeid and instantiation [PR102651]Jason Merrill2-4/+25
PR49387 was a problem with initially asking for a typeid for a class template specialization before it was complete, and later actually filling in the descriptor when the class was complete, and thus disagreeing on the form of the descriptor. I fixed that by forcing the class to be complete, but this testcase shows why that approach is problematic. So instead let's adjust the type of the descriptor later if needed. PR c++/102651 PR c++/49387 gcc/cp/ChangeLog: * rtti.cc (get_tinfo_decl_direct): Don't complete_type. (emit_tinfo_decl): Update tdesc type if needed. gcc/testsuite/ChangeLog: * g++.dg/rtti/typeid-complete1.C: New test.
2022-04-28c++: Add diagnostic when operator= is used as truth cond [PR25689]Zhao Wei Liew3-4/+90
When compiling the following code with g++ -Wparentheses, GCC does not warn on the if statement. For example, there is no warning for this code: struct A { A& operator=(int); operator bool(); }; void f(A a) { if (a = 0); // no warning } This is because a = 0 is a call to operator=, which GCC does not handle. This patch fixes this issue by handling calls to operator= when deciding to warn. Bootstrapped and regression tested on x86_64-pc-linux-gnu. PR c++/25689 gcc/cp/ChangeLog: * call.cc (extract_call_expr): Return a NULL_TREE on failure instead of asserting. (build_new_method_call): Suppress -Wparentheses diagnostic for MODIFY_EXPR. * semantics.cc (is_assignment_op_expr_p): Add function to check if an expression is a call to an op= operator expression. (maybe_convert_cond): Handle the case of a op= operator expression for the -Wparentheses diagnostic. gcc/testsuite/ChangeLog: * g++.dg/warn/Wparentheses-31.C: New test. Signed-off-by: Zhao Wei Liew <zhaoweiliew@gmail.com>
2022-04-29Daily bump.GCC Administrator13-1/+384
2022-04-28PR-105388 Fix mc to avoid the name sigfpe.Gaius Mulley3-2/+4
2022-04-28 Gaius Mulley <gaius.mulley@southwales.ac.uk> gcc/m2/ChangeLog: * mc-boot/Gkeyc.c: Rebuilt. * mc/keyc.mod (initMacros): Add sigfpe to the list of names to be avoided. Signed-off-by: Gaius Mulley <gaius.mulley@southwales.ac.uk>
2022-04-28gcov: Add section for freestanding environmentsSebastian Huber1-0/+389
gcc/ * doc/gcov.texi (Profiling and Test Coverage in Freestanding Environments): New section.
2022-04-28gcov: Use xstrerror()Sebastian Huber1-2/+2
libgcc/ * libgcov-util.c (ftw_read_file): Improve notice using xstrerror(). (gcov_profile_merge_stream): Likewise.
2022-04-28gcov-tool: Add merge-stream subcommandSebastian Huber4-0/+212
gcc/ * doc/gcov-tool.texi: Document merge-stream subcommand. * doc/invoke.texi (fprofile-info-section): Mention merge-stream subcommand of gcov-tool. * gcov-tool.cc (gcov_profile_merge_stream): Declare. (print_merge_stream_usage_message): New. (merge_stream_usage): Likewise. (do_merge_stream): Likewise. (print_usage): Call print_merge_stream_usage_message(). (main): Call do_merge_stream() to execute merge-stream subcommand. libgcc/ * libgcov-util.c (consume_stream): New. (get_target_profiles_for_merge): Likewise. (gcov_profile_merge_stream): Likewise.
2022-04-28gcov: Record EOF error during readSebastian Huber1-8/+22
Use an enum for file error codes. gcc/ * gcov-io.cc (gcov_file_error): New enum. (gcov_var): Use gcov_file_error enum for the error member. (gcov_open): Use GCOV_FILE_NO_ERROR. (gcov_close): Use GCOV_FILE_WRITE_ERROR. (gcov_write): Likewise. (gcov_write_unsigned): Likewise. (gcov_write_string): Likewise. (gcov_read_bytes): Set error code if EOF is reached. (gcov_read_counter): Use GCOV_FILE_COUNTER_OVERFLOW.
2022-04-28gcov: Fix integer types in ftw_read_file()Sebastian Huber1-2/+2
libgcc/ * libgcov-util.c (ftw_read_file): Use size_t for strlen() variables.
2022-04-28gcov: Move gcov_open() to caller of read_gcda_file()Sebastian Huber1-9/+7
This allows to reuse read_gcda_file() to read multiple objects from a single file. libgcc/ * libgcov-util.c (read_gcda_file): Do not open file. (ftw_read_file): Open file here.
2022-04-28gcov: Move prepend to list to read_gcda_file()Sebastian Huber1-7/+4
This helps to reuse read_gcda_file(). libgcc/ * libgcov-util.c (read_gcda_file): Prepend new info object to global list. (ftw_read_file): Remove list append here.
2022-04-28gcov: Use xstrdup()Sebastian Huber1-7/+2
Move duplication of filename to caller and use xstrdup() instead of custom code. This helps to reuse read_gcda_file() for other purposes. libgcc/ * libgcov-util.c (read_gcda_file): Do not duplicate filename. (ftw_read_file): Duplicate filename for read_gcda_file().
2022-04-28gcov-tool: Support file input from stdinSebastian Huber1-0/+38
gcc/ * gcov-io.cc (GCOV_MODE_STDIN): Define. (gcov_position): For gcov-tool, return calculated position if file is stdin. (gcov_open): For gcov-tool, use stdin if filename is NULL. (gcov_close): For gcov-tool, do not close stdin. (gcov_read_bytes): For gcov-tool, update position if file is stdin. (gcov_sync): For gcov-tool, discard input if file is stdin.
2022-04-28gcov: Add __gcov_filename_to_gcfn()Sebastian Huber5-30/+105
gcc/ * doc/invoke.texi (fprofile-info-section): Mention __gcov_filename_to_gcfn(). Use "freestanding" to match with C11 standard language. Fix minor example code issues. * gcov-io.h (GCOV_FILENAME_MAGIC): Define and document. gcc/testsuite/ * gcc.dg/gcov-info-to-gcda.c: Test __gcov_filename_to_gcfn(). libgcc/ * gcov.h (__gcov_info_to_gcda): Mention __gcov_filename_to_gcfn(). (__gcov_filename_to_gcfn): Declare and document. * libgcov-driver.c (dump_string): New. (__gcov_filename_to_gcfn): Likewise. (__gcov_info_to_gcda): Adjust comment to match C11 standard language.
2022-04-28gcov: Make gcov_seek() staticSebastian Huber3-8/+4
This function is only used by gcov_write_length() in the gcov-io.cc file. gcc/ * gcov-io.cc (gcov_seek): Make it static. * gcov-io.h (struct gcov_summary): Do not mention gcov_seek(). libgcc/ * libgcov.h (gcov_seek): Remove define and declaration.
2022-04-28gcov: Add open mode parameter to gcov_do_dump()Sebastian Huber3-11/+12
gcc/ * gcov-tool.cc (gcov_do_dump): Add mode parameter. (gcov_output_files): Open files for reading and writing. libgcc/ * libgcov-driver-system.c (gcov_exit_open_gcda_file): Add mode parameter. Pass mode to gcov_open() calls. * libgcov-driver.c (dump_one_gcov): Add mode parameter. Pass mode to gcov_exit_open_gcda_file() call. (gcov_do_dump): Add mode parameter. Pass mode to dump_one_gcov() calls. (__gcov_dump_one): Open file for reading and writing.
2022-04-28gcov: Add mode to all gcov_open()Sebastian Huber5-15/+4
gcc/ * gcov-io.cc (gcov_open): Always use the mode parameter. * gcov-io.h (gcov_open): Declare it unconditionally. libgcc/ * libgcov-driver-system.c (gcov_exit_open_gcda_file): Open file for reading and writing. * libgcov-util.c (read_gcda_file): Open file for reading. * libgcov.h (gcov_open): Delete declaration.
2022-04-28gcov-tool: Allow merging of empty profile listsSebastian Huber2-25/+21
The gcov_profile_merge() already had code to deal with profile information which had no counterpart to merge with. For profile information from files with no associated counterpart, the profile information is simply used as is with the weighting transformation applied. Make sure that gcov_profile_merge() works with an empty target profile list. Return the merged profile list. gcc/ * gcov-tool.cc (gcov_profile_merge): Adjust return type. (profile_merge): Allow merging of directories which contain no profile files. libgcc/ * libgcov-util.c (gcov_profile_merge): Return the list of merged profiles. Accept empty target and source profile lists.
2022-04-28analyzer: handle repeated accesses after init of unknown size [PR105285]David Malcolm2-0/+118
PR analyzer/105285 reports a false positive from -Wanalyzer-null-dereference on git.git's reftable/reader.c. A reduced version of the problem can be seen in test_1a of gcc.dg/analyzer/symbolic-12.c in the following: void test_1a (void *p, unsigned next_off) { struct st_1 *r = p; external_fn(); if (next_off >= r->size) return; if (next_off >= r->size) /* We should have already returned if this is the case. */ __analyzer_dump_path (); /* { dg-bogus "path" } */ } where the analyzer erroneously considers this path, where (next_off >= r->size) is both false and then true: symbolic-12.c: In function ‘test_1a’: symbolic-12.c:22:5: note: path 22 | __analyzer_dump_path (); /* { dg-bogus "path" } */ | ^~~~~~~~~~~~~~~~~~~~~~~ ‘test_1a’: events 1-5 | | 17 | if (next_off >= r->size) | | ^ | | | | | (1) following ‘false’ branch... |...... | 20 | if (next_off >= r->size) | | ~ ~~~~~~~ | | | | | | | (2) ...to here | | (3) following ‘true’ branch... | 21 | /* We should have already returned if this is the case. */ | 22 | __analyzer_dump_path (); /* { dg-bogus "path" } */ | | ~~~~~~~~~~~~~~~~~~~~~~~ | | | | | (4) ...to here | | (5) here | The root cause is that, at the call to the external function, the analyzer considers the cluster for *p to have been touched, binding it to a conjured_svalue, but because p is void * no particular size is known for the write, and so the cluster is bound using a symbolic key covering the base region. Later, the accesses to r->size are handled by binding_cluster::get_any_binding, but binding_cluster::get_binding fails to find a match for the concrete field lookup, due to the key for the binding being symbolic, and reaching this code: 1522 /* If this cluster has been touched by a symbolic write, then the content 1523 of any subregion not currently specifically bound is "UNKNOWN". */ 1524 if (m_touched) 1525 { 1526 region_model_manager *rmm_mgr = mgr->get_svalue_manager (); 1527 return rmm_mgr->get_or_create_unknown_svalue (reg->get_type ()); 1528 } Hence each access to r->size is an unknown svalue, and thus the condition (next_off >= r->size) isn't tracked, leading to the path with contradictory conditions being treated as satisfiable. In the original reproducer in git's reftable/reader.c, the call to the external fn is: reftable_record_type(rec) which is considered to possibly write to *rec, which is *tab, where tab is the void * argument to reftable_reader_seek_void, and thus after the call to reftable_record_type some arbitrary amount of *rec could have been written to. This patch fixes things by detecting the "this cluster has been 'filled' with a conjured value of unknown size" case, and handling get_any_binding on it by returning a sub_svalue of the conjured_svalue, so that repeated accesses to r->size give the same symbolic value, so that the constraint manager rejects the bogus execution path, fixing the false positive. gcc/analyzer/ChangeLog: PR analyzer/105285 * store.cc (binding_cluster::get_any_binding): Handle accessing sub_svalues of clusters where the base region has a symbolic binding. gcc/testsuite/ChangeLog: PR analyzer/105285 * gcc.dg/analyzer/symbolic-12.c: New test. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2022-04-28analyzer: add .fpath.txt dumps to -fdump-analyzer-feasibilityDavid Malcolm8-3/+112
I found this extension to -fdump-analyzer-feasibility very helpful when debugging PR analyzer/105285. gcc/analyzer/ChangeLog: * diagnostic-manager.cc (epath_finder::process_worklist_item): Call dump_feasible_path when a path that reaches the the target enode is found. (epath_finder::dump_feasible_path): New. * engine.cc (feasibility_state::dump_to_pp): New. * exploded-graph.h (feasibility_state::dump_to_pp): New decl. * feasible-graph.cc (feasible_graph::dump_feasible_path): New. * feasible-graph.h (feasible_graph::dump_feasible_path): New decls. * program-point.cc (function_point::print): Fix missing trailing newlines. * program-point.h (program_point::print_source_line): Remove unimplemented decl. gcc/ChangeLog: * doc/invoke.texi (-fdump-analyzer-feasibility): Mention the fpath.txt output. Signed-off-by: David Malcolm <dmalcolm@redhat.com>