aboutsummaryrefslogtreecommitdiff
path: root/gcc
AgeCommit message (Collapse)AuthorFilesLines
2022-07-08middle-end: Use subregs to expand COMPLEX_EXPR to set the lowpart.Tamar Christina10-51/+99
When lowering COMPLEX_EXPR we currently emit two VEC_EXTRACTs. One for the lowpart and one for the highpart. The problem with this is that in RTL the lvalue of the RTX is the only thing tying the two instructions together. This means that e.g. combine is unable to try to combine the two instructions for setting the lowpart and highpart. For ISAs that have bit extract instructions we can eliminate one of the extracts if, and only if we're setting the entire complex number. This change changes the expand code when we're setting the entire complex number to generate a subreg for the lowpart instead of a vec_extract. This allows us to optimize sequences such as: _Complex int f(int a, int b) { _Complex int t = a + b * 1i; return t; } from: f: bfi x2, x0, 0, 32 bfi x2, x1, 32, 32 mov x0, x2 ret into: f: bfi x0, x1, 32, 32 ret I have also confirmed the codegen for x86_64 did not change. gcc/ChangeLog: * expmed.cc (store_bit_field_1): Add parameter that indicates if value is still undefined and if so emit a subreg move instead. (store_integral_bit_field): Likewise. (store_bit_field): Likewise. * expr.h (write_complex_part): Likewise. * expmed.h (store_bit_field): Add new parameter. * builtins.cc (expand_ifn_atomic_compare_exchange_into_call): Use new parameter. (expand_ifn_atomic_compare_exchange): Likewise. * calls.cc (store_unaligned_arguments_into_pseudos): Likewise. * emit-rtl.cc (validate_subreg): Likewise. * expr.cc (emit_group_store): Likewise. (copy_blkmode_from_reg): Likewise. (copy_blkmode_to_reg): Likewise. (clear_storage_hints): Likewise. (write_complex_part): Likewise. (emit_move_complex_parts): Likewise. (expand_assignment): Likewise. (store_expr): Likewise. (store_field): Likewise. (expand_expr_real_2): Likewise. * ifcvt.cc (noce_emit_move_insn): Likewise. * internal-fn.cc (expand_arith_set_overflow): Likewise. (expand_arith_overflow_result_store): Likewise. (expand_addsub_overflow): Likewise. (expand_neg_overflow): Likewise. (expand_mul_overflow): Likewise. (expand_arith_overflow): Likewise. gcc/testsuite/ChangeLog: * g++.target/aarch64/complex-init.C: New test.
2022-07-08i386: Handle memory operand for direct call to cvtps2pd in unpackHaochen Jiang2-2/+41
gcc/ChangeLog: PR target/106180 * config/i386/sse.md (sse2_cvtps2pd<mask_name>_1): Rename from *sse2_cvtps2pd<mask_name>_1. (vec_unpacks_lo_v4sf): Add handler for memory operand. gcc/testsuite/ChangeLog: PR target/106180 * g++.target/i386/pr106180-1.C: New test.
2022-07-08LoongArch: Modify fp_sp_offset and gp_sp_offset's calculation method when ↵Lulu Cheng2-3/+24
frame->mask or frame->fmask is zero. Under the LA architecture, when the stack is dropped too far, the process of dropping the stack is divided into two steps. step1: After dropping the stack, save callee saved registers on the stack. step2: The rest of it. The stack drop operation is optimized when frame->total_size minus frame->sp_fp_offset is an integer multiple of 4096, can reduce the number of instructions required to drop the stack. However, this optimization is not effective because of the original calculation method The following case: int main() { char buf[1024 * 12]; printf ("%p\n", buf); return 0; } As you can see from the generated assembler, the old GCC has two more instructions than the new GCC, lines 14 and line 24. new old 10 main: | 11 main: 11 addi.d $r3,$r3,-16 | 12 lu12i.w $r13,-12288>>12 12 lu12i.w $r13,-12288>>12 | 13 addi.d $r3,$r3,-2032 13 lu12i.w $r5,-12288>>12 | 14 ori $r13,$r13,2016 14 lu12i.w $r12,12288>>12 | 15 lu12i.w $r5,-12288>>12 15 st.d $r1,$r3,8 | 16 lu12i.w $r12,12288>>12 16 add.d $r12,$r12,$r5 | 17 st.d $r1,$r3,2024 17 add.d $r3,$r3,$r13 | 18 add.d $r12,$r12,$r5 18 add.d $r5,$r12,$r3 | 19 add.d $r3,$r3,$r13 19 la.local $r4,.LC0 | 20 add.d $r5,$r12,$r3 20 bl %plt(printf) | 21 la.local $r4,.LC0 21 lu12i.w $r13,12288>>12 | 22 bl %plt(printf) 22 add.d $r3,$r3,$r13 | 23 lu12i.w $r13,8192>>12 23 ld.d $r1,$r3,8 | 24 ori $r13,$r13,2080 24 or $r4,$r0,$r0 | 25 add.d $r3,$r3,$r13 25 addi.d $r3,$r3,16 | 26 ld.d $r1,$r3,2024 26 jr $r1 | 27 or $r4,$r0,$r0 | 28 addi.d $r3,$r3,2032 | 29 jr $r1 gcc/ChangeLog: * config/loongarch/loongarch.cc (loongarch_compute_frame_info): Modify fp_sp_offset and gp_sp_offset's calculation method, when frame->mask or frame->fmask is zero, don't minus UNITS_PER_WORD or UNITS_PER_FP_REG. gcc/testsuite/ChangeLog: * gcc.target/loongarch/prolog-opt.c: New test.
2022-07-08Daily bump.GCC Administrator6-1/+172
2022-07-07c++: generic targs and identity substitution [PR105956]Patrick Palka2-64/+152
In r13-1045-gcb7fd1ea85feea I assumed that substitution into generic DECL_TI_ARGS corresponds to an identity mapping of the given arguments, and hence its safe to always elide such substitution. But this PR demonstrates that such a substitution isn't always the identity mapping, in particular when there's an ARGUMENT_PACK_SELECT argument, which gets handled specially during substitution: * when substituting an APS into a template parameter, we strip the APS to its underlying argument; * and when substituting an APS into a pack expansion, we strip the APS to its underlying argument pack. In this testcase, when expanding the pack expansion pattern (idx + Ns)... with Ns={0,1}, we specialize idx twice, first with Ns=APS<0,{0,1}> and then Ns=APS<1,{0,1}>. The DECL_TI_ARGS of idx are the generic template arguments of the enclosing class template impl, so before r13-1045, we'd substitute into its DECL_TI_ARGS which gave Ns={0,1} as desired. But after r13-1045, we elide this substitution and end up attempting to hash the original Ns argument, an APS, which ICEs. So this patch reverts that part of r13-1045. I considered using preserve_args in this case instead, but that'd break the static_assert in the testcase because preserve_args always strips APS to its underlying argument, but here we want to strip it to its underlying argument pack, so we'd incorrectly end up forming the specializations impl<0>::idx and impl<1>::idx instead of impl<0,1>::idx. Although we can't elide the substitution into DECL_TI_ARGS in light of ARGUMENT_PACK_SELECT, it should still be safe to elide template argument coercion in the case of a non-template decl, which this patch preserves. It's unfortunate that we need to remove this optimization just because it doesn't hold for one special tree code. So this patch implements a heuristic in tsubst_template_args to avoid allocating a new TREE_VEC if the substituted elements are identical to those of a level from ARGS, as well as a similar heuristic for tsubst_argument_pack. It turns out that about 40% of all calls to tsubst_template_args benefit from this, and it reduces memory usage by about 4% for e.g. range-v3's zip.cpp (relative to r13-1045) which more than makes up for the reversion. PR c++/105956 gcc/cp/ChangeLog: * pt.cc (template_arg_to_parm): Define. (tsubst_argument_pack): Try to reuse the corresponding ARGUMENT_PACK from 'args' when substituting into a generic ARGUMENT_PACK for a variadic template parameter. (tsubst_template_args): Move variable declarations closer to their first use. Replace 'orig_t' with 'r'. Rename 'need_new' to 'const_subst_p'. Heuristically detect if the substituted elements are identical to that of a level from 'args' and avoid allocating a new TREE_VEC if so. Add sanity check for the length of the new TREE_VEC, and remove dead ARGUMENT_PACK_P test. (tsubst_decl) <case TYPE_DECL, case VAR_DECL>: Revert r13-1045-gcb7fd1ea85feea change for avoiding substitution into DECL_TI_ARGS, but still avoid coercion in this case. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/variadic183.C: New test.
2022-07-07analyzer: use label_text for superedge::get_descriptionDavid Malcolm4-14/+9
gcc/analyzer/ChangeLog: * checker-path.cc (start_cfg_edge_event::get_desc): Update for superedge::get_description returning a label_text. * engine.cc (feasibility_state::maybe_update_for_edge): Likewise. * supergraph.cc (superedge::dump): Likewise. (superedge::get_description): Convert return type from char * to label_text. * supergraph.h (superedge::get_description): Likewise. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2022-07-07Convert label_text to C++11 move semanticsDavid Malcolm13-97/+63
libcpp's class label_text stores a char * for a string and a flag saying whether it owns the buffer. I added this class before we could use C++11, and so to avoid lots of copying it required an explicit call to label_text::maybe_free to potentially free the buffer. Now that we can use C++11, this patch removes label_text::maybe_free in favor of doing the cleanup in the destructor, and using C++ move semantics to avoid any copying. This allows lots of messy cleanup code to be eliminated in favor of implicit destruction (mostly in the analyzer). No functional change intended. gcc/analyzer/ChangeLog: * call-info.cc (call_info::print): Update for removal of label_text::maybe_free in favor of automatic memory management. * checker-path.cc (checker_event::dump): Likewise. (checker_event::prepare_for_emission): Likewise. (state_change_event::get_desc): Likewise. (superedge_event::should_filter_p): Likewise. (start_cfg_edge_event::get_desc): Likewise. (warning_event::get_desc): Likewise. (checker_path::dump): Likewise. (checker_path::debug): Likewise. * diagnostic-manager.cc (diagnostic_manager::prune_for_sm_diagnostic): Likewise. (diagnostic_manager::prune_interproc_events): Likewise. * program-state.cc (sm_state_map::to_json): Likewise. * region.cc (region::to_json): Likewise. * sm-malloc.cc (inform_nonnull_attribute): Likewise. * store.cc (binding_map::to_json): Likewise. (store::to_json): Likewise. * svalue.cc (svalue::to_json): Likewise. gcc/c-family/ChangeLog: * c-format.cc (range_label_for_format_type_mismatch::get_text): Update for removal of label_text::maybe_free in favor of automatic memory management. gcc/ChangeLog: * diagnostic-format-json.cc (json_from_location_range): Update for removal of label_text::maybe_free in favor of automatic memory management. * diagnostic-format-sarif.cc (sarif_builder::make_location_object): Likewise. * diagnostic-show-locus.cc (struct pod_label_text): New. (class line_label): Convert m_text from label_text to pod_label_text. (layout::print_any_labels): Move "text" to the line_label. * tree-diagnostic-path.cc (path_label::get_text): Update for removal of label_text::maybe_free in favor of automatic memory management. (event_range::print): Likewise. (default_tree_diagnostic_path_printer): Likewise. (default_tree_make_json_for_path): Likewise. libcpp/ChangeLog: * include/line-map.h: Include <utility>. (class label_text): Delete maybe_free method in favor of a destructor. Add move ctor and assignment operator. Add deletion of the copy ctor and copy-assignment operator. Rename field m_caller_owned to m_owned. Add std::move where necessary; add moved_from member function. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2022-07-07analyzer: fix false positives from -Wanalyzer-tainted-divisor [PR106225]David Malcolm4-12/+119
gcc/analyzer/ChangeLog: PR analyzer/106225 * sm-taint.cc (taint_state_machine::on_stmt): Move handling of assignments from division to... (taint_state_machine::check_for_tainted_divisor): ...this new function. Reject warning when the divisor is known to be non-zero. * sm.cc: Include "analyzer/program-state.h". (sm_context::get_old_region_model): New. * sm.h (sm_context::get_old_region_model): New decl. gcc/testsuite/ChangeLog: PR analyzer/106225 * gcc.dg/analyzer/taint-divisor-1.c: Add test coverage for various correct and incorrect checks against zero. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2022-07-07statistics.cc: Add check to see if fn is not NULL in get_function_name.Prathamesh Kulkarni1-1/+1
gcc/ChangeLog: * statistics.cc (get_function_name): Add check to see if fn is not NULL.
2022-07-07c++: -Woverloaded-virtual and dtors [PR87729]Jason Merrill2-0/+10
My earlier patch broke out of the loop over base members when we found a match, but that caused trouble for dtors, which can have multiple for which same_signature_p is true. But as the function comment says, we know this doesn't apply to [cd]tors, so skip them. PR c++/87729 gcc/cp/ChangeLog: * class.cc (warn_hidden): Ignore [cd]tors. gcc/testsuite/ChangeLog: * g++.dg/warn/Woverloaded-virt3.C: New test.
2022-07-07Speedup update-ssa some moreRichard Biener1-16/+20
The following avoids copying an sbitmap and one traversal by avoiding to re-allocate old_ssa_names when not necessary. In addition this actually checks what the comment before PHI insert iterating promises, that the old_ssa_names set does not grow. * tree-into-ssa.cc (iterating_old_ssa_names): New. (add_new_name_mapping): Grow {new,old}_ssa_names separately and only when actually needed. Assert we are not growing the old_ssa_names set when iterating over it. (update_ssa): Remove old_ssa_names copying and empty_p query, note we are iterating over it and expect no set changes.
2022-07-07Fix Intel MIC 'mkoffload' for OpenMP 'requires'Thomas Schwinge1-12/+44
Similar to how the other 'mkoffload's got changed in recent commit 683f11843974f0bdf42f79cdcbb0c2b43c7b81b0 "OpenMP: Move omp requires checks to libgomp". This also means finally switching Intel MIC 'mkoffload' to 'GOMP_offload_register_ver', 'GOMP_offload_unregister_ver', making 'GOMP_offload_register', 'GOMP_offload_unregister' legacy entry points. gcc/ * config/i386/intelmic-mkoffload.cc (generate_host_descr_file) (prepare_target_image, main): Handle OpenMP 'requires'. (generate_host_descr_file): Switch to 'GOMP_offload_register_ver', 'GOMP_offload_unregister_ver'. libgomp/ * target.c (GOMP_offload_register, GOMP_offload_unregister): Denote as legacy entry points. * testsuite/lib/libgomp.exp (check_effective_target_offload_target_any): New proc. * testsuite/libgomp.c-c++-common/requires-1.c: Enable for 'offload_target_any'. * testsuite/libgomp.c-c++-common/requires-3.c: Likewise. * testsuite/libgomp.c-c++-common/requires-7.c: Likewise. * testsuite/libgomp.fortran/requires-1.f90: Likewise.
2022-07-07target/106219 - proprly mark builtins pure via ix86_add_new_builtinsRichard Biener2-0/+33
The target optimize pragma path to initialize extra target specific builtins missed handling of the pure_p flag which in turn causes extra clobber side-effects of gather builtins leading to unexpected issues downhill. PR target/106219 * config/i386/i386-builtins.cc (ix86_add_new_builtins): Properly set DECL_PURE_P. * g++.dg/pr106219.C: New testcase.
2022-07-07testsuite: Fix incorrect -mfloat128-type optionJonathan Wakely1-1/+1
This test currently fails with an error about -mfloat128-type being an invalid option, which is not what it's supposed to be testing: XFAIL: gcc.target/powerpc/ppc-fortran/pr80108-1.f90 -O (test for excess errors) Excess errors: xgcc: error: unrecognized command-line option '-mfloat128-type'; did you mean '-mfloat128'? With this change we get the error that the comment says it expects: XFAIL: gcc.target/powerpc/ppc-fortran/pr80108-1.f90 -O (test for excess errors) Excess errors: f951: Error: power9 target option is incompatible with '-mcpu=<xxx>' for <xxx> less than power9 f951: Error: '-mfloat128' requires VSX support f951: Error: '-m64' requires a PowerPC64 cpu gcc/testsuite/ChangeLog: * gcc.target/powerpc/ppc-fortran/pr80108-1.f90: Change -mfloat128-type to -mfloat128.
2022-07-07Speed up LC SSA rewrite moreRichard Biener1-9/+21
In many cases loops have only one exit or a variable is only live across one of the exits. In this case we know that all uses outside of the loop will be dominated by the single LC PHI node we insert. If that holds for all variables requiring LC SSA PHIs then we can simplify the update_ssa process, avoiding the (iterated) dominance frontier computations. * tree-ssa-loop-manip.cc (add_exit_phis_var): Return the number of LC PHIs inserted. (add_exit_phis): Return whether any variable required multiple LC PHI nodes. (rewrite_into_loop_closed_ssa_1): Use TODO_update_ssa_no_phi when possible.
2022-07-07Speed up LC SSA rewriteRichard Biener1-39/+56
The following avoids collecting all loops exit blocks into bitmaps and computing the union of those up the loop tree possibly repeatedly. Instead we make sure to do this only once for each loop with a definition possibly requiring a LC phi node plus make sure to leverage recorded exits to avoid the intermediate bitmap allocation. * tree-ssa-loop-manip.cc (compute_live_loop_exits): Take the def loop exit block bitmap as argument instead of re-computing it here. (add_exit_phis_var): Adjust. (loop_name_cmp): New function. (add_exit_phis): Sort variables to insert LC PHI nodes after definition loop, for each definition loop compute the exit block bitmap once. (get_loops_exit): Remove. (rewrite_into_loop_closed_ssa_1): Do not pre-record all loop exit blocks into bitmaps. Record loop exits if required.
2022-07-07Mips: Fix the ASAN shadow offset hook for the n32 ABIDimitrije Milosevic2-8/+6
gcc/ChangeLog: * config/mips/mips.cc (mips_asan_shadow_offset): Reformat to handle the N32 ABI. * config/mips/mips.h (SUBTARGET_SHADOW_OFFSET): Remove the macro, as it is not needed anymore.
2022-07-07Daily bump.GCC Administrator8-1/+300
2022-07-06Restore 'GOMP_offload_unregister_ver' functionalityThomas Schwinge2-8/+8
The recent commit 683f11843974f0bdf42f79cdcbb0c2b43c7b81b0 "OpenMP: Move omp requires checks to libgomp" changed the 'GOMP_offload_register_ver' interface but didn't change 'GOMP_offload_unregister_ver' accordingly, so we're no longer actually unregistering. gcc/ * config/gcn/mkoffload.cc (process_obj): Clarify 'target_data' -> '[...]_data'. * config/nvptx/mkoffload.cc (process): Likewise. libgomp/ * target.c (GOMP_offload_register_ver): Clarify 'target_data' -> 'data'. (GOMP_offload_unregister_ver): Likewise. Fix up 'target_data'.
2022-07-06Define 'OMP_REQUIRES_[...]', 'GOMP_REQUIRES_[...]' in a single placeThomas Schwinge1-4/+4
Clean up for recent commit 683f11843974f0bdf42f79cdcbb0c2b43c7b81b0 "OpenMP: Move omp requires checks to libgomp". gcc/ * omp-general.h (enum omp_requires): Use 'GOMP_REQUIRES_[...]'. include/ * gomp-constants.h (OMP_REQUIRES_[...]): Update comment.
2022-07-06diagnostics: Honor #pragma GCC diagnostic in the preprocessor [PR53431]Lewis Hyatt9-142/+506
As discussed on PR c++/53431, currently, "#pragma GCC diagnostic" does not always take effect for diagnostics generated by libcpp. The reason is that libcpp itself does not interpret this pragma and only sends it on to the frontend, hence the pragma is only honored if the frontend arranges for it. The C frontend does process the pragma immediately (more or less) after seeing the token, so things work fine there. The PR points out that it doesn't work for C++, because the C++ frontend doesn't handle anything until it has read all the tokens from libcpp. The underlying problem is not C++-specific, though, and for instance, gcc -E has the same issue. This commit fixes the PR by adding the concept of an early pragma handler that can be registered by frontends, which gives them a chance to process diagnostic pragmas from libcpp before it is too late for them to take effect. The C++ and preprocess-only frontends are modified to use early pragmas and correct the behavior. gcc/c-family/ChangeLog: PR preprocessor/53920 PR c++/53431 * c-common.cc (c_option_is_from_cpp_diagnostics): New function. * c-common.h (c_option_is_from_cpp_diagnostics): Declare. (c_pp_stream_token): Declare. * c-ppoutput.cc (init_pp_output): Refactor logic about skipping pragmas to... (should_output_pragmas): ...here. New function. (token_streamer::stream): Support handling early pragmas. (do_line_change): Likewise. (c_pp_stream_token): New function. * c-pragma.cc (struct pragma_diagnostic_data): New helper class. (pragma_diagnostic_lex_normal): New function. Moved logic for interpreting GCC diagnostic pragmas here. (pragma_diagnostic_lex_pp): New function for parsing diagnostic pragmas directly from libcpp. (handle_pragma_diagnostic): Refactor into helper function... (handle_pragma_diagnostic_impl): ...here. New function. (handle_pragma_diagnostic_early): New function. (handle_pragma_diagnostic_early_pp): New function. (struct pragma_ns_name): Renamed to... (struct pragma_pp_data): ...this. Add new "early_handler" member. (c_register_pragma_1): Support early pragmas in the preprocessor. (c_register_pragma_with_early_handler): New function. (c_register_pragma): Support the new early handlers in struct internal_pragma_handler. (c_register_pragma_with_data): Likewise. (c_register_pragma_with_expansion): Likewise. (c_register_pragma_with_expansion_and_data): Likewise. (c_invoke_early_pragma_handler): New function. (c_pp_invoke_early_pragma_handler): New function. (init_pragma): Add early pragma support for diagnostic pragmas. * c-pragma.h (struct internal_pragma_handler): Add new early handler members. (c_register_pragma_with_early_handler): Declare. (c_invoke_early_pragma_handler): Declare. (c_pp_invoke_early_pragma_handler): Declare. gcc/cp/ChangeLog: PR c++/53431 * parser.cc (cp_parser_pragma_kind): Move earlier in the file. (cp_lexer_handle_early_pragma): New function. (cp_lexer_new_main): Support parsing and handling early pragmas. (c_parse_file): Adapt to changes in cp_lexer_new_main. gcc/testsuite/ChangeLog: PR preprocessor/53920 PR c++/53431 * c-c++-common/pragma-diag-11.c: New test. * c-c++-common/pragma-diag-12.c: New test. * c-c++-common/pragma-diag-13.c: New test.
2022-07-06d: Merge upstream dmd 56589f0f4, druntime 651389b5, phobos 1516ecad9.Iain Buclaw14-35/+173
D front-end changes: - Import latest bug fixes to mainline. D runtime changes: - Import latest bug fixes to mainline. Phobos changes: - Import latest bug fixes to mainline. gcc/d/ChangeLog: * dmd/MERGE: Merge upstream dmd 56589f0f4. libphobos/ChangeLog: * libdruntime/MERGE: Merge upstream druntime 651389b5. * src/MERGE: Merge upstream phobos 1516ecad9.
2022-07-06d: Build the D sources in the front-end with -fno-exceptionsIain Buclaw1-1/+5
The D front-end does not use exceptions, but it still requires RTTI for some lowerings of convenience language features. Enforce it with by building with `-fno-exceptions'. gcc/d/ChangeLog: * Make-lang.in (NOEXCEPTION_DFLAGS): Define. (ALL_DFLAGS): Add NO_EXCEPTION_DFLAGS.
2022-07-06analyzer: add testcase of using closed fd without warning.Immad Mir1-0/+10
This patch adds a testcase for passing a closed fd to a function that does not emit any warning. gcc/testsuite/ChangeLog: * gcc.dg/analyzer/fd-4.c: Add a new testcase to demonstrate passsing of a closed file descriptor to a function that does not emit any warning. Signed-off-by: Immad Mir <mirimmad@outlook.com>
2022-07-06analyzer: reorder initialization of state m_invalid in sm-fd.cc [PR106184]Immad Mir1-2/+3
This patch reorders the initialization of state m_invalid in sm-fd.cc so that the order of initializers is same as the ordering of the fields in the class decl. gcc/analyzer/ChangeLog: PR analyzer/106184 * sm-fd.cc (fd_state_machine): Change ordering of initialization of state m_invalid so that the order of initializers is same as the ordering of the fields in the class decl. Signed-off-by: Immad Mir <mirimmad@outlook.com>
2022-07-06analyzer: show close event for use_after_close diagnosticImmad Mir2-5/+14
This patch saves the "close" event in use_after_close diagnostic and shows it where possible. gcc/analyzer/ChangeLog: * sm-fd.cc (use_after_close): save the "close" event and show it where possible. gcc/testsuite/ChangeLog: * gcc.dg/analyzer/fd-4.c (test_3): change the message note to conform to the changes in analyzer/sm-fd.cc (test_4): Likewise. Signed-off-by: Immad Mir <mirimmad@outlook.com>
2022-07-06[Ada] Simplify regular expression that matches 8 consecutive digitsPiotr Trojanek1-1/+1
Makefile cleanup; behaviour is unaffected. gcc/ada/ * gcc-interface/Make-lang.in (ada/generated/gnatvsn.ads): Simplify regular expression. The "interval expression", i.e. \{8\} is part of the POSIX regular expressions, so it should not be a problem for modern implementations of sed.
2022-07-06[Ada] Update comment after recent changes wrt. secondary stack & tagged typesEric Botcazou1-3/+1
gcc/ada/ * gcc-interface/trans.cc (gnat_to_gnu): Update comment.
2022-07-06[Ada] Improve code generated for aggregates of VFA typeEric Botcazou3-4/+29
This avoids using a full access for constants internally generated from assignments of aggregates with a Volatile_Full_Access type. gcc/ada/ * gcc-interface/gigi.h (simple_constant_p): Declare. * gcc-interface/decl.cc (gnat_to_gnu_entity) <E_Variable>: Strip the qualifiers from the type of a simple constant. (simple_constant_p): New predicate. * gcc-interface/trans.cc (node_is_atomic): Return true for objects with atomic type except for simple constants. (node_is_volatile_full_access): Return false for simple constants with VFA type.
2022-07-06[Ada] Fix crash on aliased renaming of unconstrained arrayEric Botcazou1-5/+7
gcc/ada/ * gcc-interface/decl.cc (gnat_to_gnu_entity) <E_Variable>: Create a local constant holding the underlying GNAT type of the object. Do not fiddle with the object size for an unconstrained array.
2022-07-06[Ada] Small tweak to gnat_to_gnu_subprog_typeEric Botcazou1-3/+3
No functional changes. gcc/ada/ * gcc-interface/decl.cc (gnat_to_gnu_subprog_type): Constify a local variable and move a couple of others around.
2022-07-06[Ada] Do not give warnings for compiler-generated entities by defaultEric Botcazou1-0/+11
gcc/ada/ * gcc-interface/trans.cc (gnat_gimplify_expr) <SAVE_EXPR>: New case.
2022-07-06[Ada] Document the various function return mechanismsEric Botcazou1-1/+42
gcc/ada/ * exp_ch6.adb (Function return mechanisms): New paragraph.
2022-07-06[Ada] Deferred constant considered as not preelaborableYannick Moy1-2/+3
Fix detection of non-preelaborable constructs for checking SPARK elaboration rules, which was tagging deferred constant declarations as not preelaborable. gcc/ada/ * sem_util.adb (Is_Non_Preelaborable_Construct): Fix for deferred constants.
2022-07-06[Ada] Indexing error when calling GNAT.Regpat.MatchJustin Squirek2-20/+42
This patch corrects an error in the compiler whereby a buffer sizing error fails to get raised when compiling a regex expression with an insufficiently sized Pattern_Matcher as the documentation indicated. This, in turn, could lead to indexing errors when attempting to call Match with the malformed regex program buffer. gcc/ada/ * libgnat/s-regpat.adb, libgnat/s-regpat.ads (Compile): Add a new defaulted parameter Error_When_Too_Small to trigger an error, if specified true, when Matcher is too small to hold the compiled regex program.
2022-07-06[Ada] Spurious non-callable warning on prefixed call in class conditionJustin Squirek1-4/+19
This patch corrects an error in the compiler whereby a function call in prefix notation within a class condition causes a spurious error claiming the name in the call is a non-callable entity when there exists a type extension in the same unit extended with a component featuring the same name as the function in question. gcc/ada/ * sem_ch4.adb (Analyze_Selected_Component): Add condition to avoid interpreting derived type components as candidates for selected components in preanalysis of inherited class conditions.
2022-07-06[Ada] Support ghost generic formal parametersYannick Moy9-63/+347
This adds support in GNAT for ghost generic formal parameters, as included in SPARK RM 6.9. gcc/ada/ * ghost.adb (Check_Ghost_Context): Delay checking for generic associations. (Check_Ghost_Context_In_Generic_Association): Perform ghost checking in analyzed generic associations. (Check_Ghost_Formal_Procedure_Or_Package): Check SPARK RM 6.9(13-14) for formal procedures and packages. (Check_Ghost_Formal_Variable): Check SPARK RM 6.9(13-14) for variables. * ghost.ads: Declarations for the above. * sem_ch12.adb (Analyze_Associations): Apply delayed checking for generic associations. (Analyze_Formal_Object_Declaration): Same. (Analyze_Formal_Subprogram_Declaration): Same. (Instantiate_Formal_Package): Same. (Instantiate_Formal_Subprogram): Same. (Instantiate_Object): Same. Copy ghost aspect to newly declared object for actual for IN formal object. Use new function Get_Enclosing_Deep_Object to retrieve root object. (Instantiate_Type): Copy ghost aspect to declared subtype for actual for formal type. * sem_prag.adb (Analyze_Pragma): Recognize new allowed declarations. * sem_util.adb (Copy_Ghost_Aspect): Copy the ghost aspect between nodes. (Get_Enclosing_Deep_Object): New function to return enclosing deep object (or root for reachable part). * sem_util.ads (Copy_Ghost_Aspect): Same. (Get_Enclosing_Deep_Object): Same. * libgnat/s-imageu.ads: Declare formal subprograms as ghost. * libgnat/s-valuei.ads: Same. * libgnat/s-valuti.ads: Same.
2022-07-06[Ada] Missing error on tagged type conversionJavier Miranda1-34/+102
The compiler does not report an error on a type conversion to/from a tagged type whose parent type is an interface type and there is no relationship between the source and target types. This bug has been dormant since January/2016. This patch also improves the text of errors reported on interface type conversions suggesting how to fix these errors. gcc/ada/ * sem_res.adb (Resolve_Type_Conversion): Code cleanup since the previous static check has been moved to Valid_Tagged_Conversion. (Valid_Tagged_Conversion): Fix the code checking conversion to/from interface types since incorrectly returns True when the parent type of the operand type (or the target type) is an interface type; add missing static checks on interface type conversions.
2022-07-06[Ada] Handle secondary stack memory allocations alignmentMarc Poulhiès3-35/+74
To accomodate cases where objects allocated on the secondary stack needed a more constrained alignement than Standard'Maximum_Alignement, the alignment for all allocations in the full runtime were forced on to be aligned on Standard'Maximum_Alignement*2. This changes removes this workaround and correctly handles the over-alignment in all runtimes. This change modifies the SS_Allocate procedure to accept a new Alignment parameter and to dynamically realign the pointer returned by the memory allocation (Allocate_* functions or dedicated stack allocations for zfp/cert). It also simplifies the 0-sized allocations by not allocating any memory if pointer is already correctly aligned (already the case in cert and zfp runtimes). gcc/ada/ * libgnat/s-secsta.ads (SS_Allocate): Add new Alignment parameter. (Memory_Alignment): Remove. * libgnat/s-secsta.adb (Align_Addr): New. (SS_Allocate): Add new Alignment parameter. Realign pointer if needed. Don't allocate anything for 0-sized allocations. * gcc-interface/utils2.cc (build_call_alloc_dealloc_proc): Add allocated object's alignment as last parameter to allocation invocation.
2022-07-06[Ada] Cleanup use of local scalars in GNAT.Socket.Get_Address_InfoPiotr Trojanek1-4/+4
A cleanup opportunity spotted while working on improved detection of uninitialised local scalar objects. gcc/ada/ * libgnat/g-socket.adb (Get_Address_Info): Reduce scope of the Found variable; avoid repeated assignment inside the loop.
2022-07-06[Ada] Vxworks7* - Makefile.rtl rtp vs rtp-smp cleanupDoug Rupp1-49/+25
Only smp runtimes are built for vxworks7*, even though the -smp suffix is removed during install. Therefore, in general, the build macros for the non-smp runtimes are superfluous except on the legacy ppc-vxworks6 target where both the smp and non-smp runtime are built. Lastly, an error message is added if a runtime build is commanded that doesn't exist, rather then letting the build mysteriously fail. gcc/ada/ * Makefile.rtl [arm,aarch64 vxworks7]: Remove rtp and kernel build macros and set an error variable if needed. [x86,x86_vxworks7]: Likewise. [ppc,ppc64]: Set an error variable if needed. (rts-err): New phony Makefile target. (setup-rts): Depend on rts-err.
2022-07-06[Ada] Fix incorrect itype sharing for case expression in limited type returnEric Botcazou1-72/+76
The compiler aborts with an internal error in gigi, but the problem is an itype incorrectly shared between several branches of an if_statement that has been created for a Build-In-Place return. Three branches of this if_statement contain an allocator statement and the latter two have been obtained as the result of calling New_Copy_Tree on the first; now the initialization expression of the first had also been obtained as the result of calling New_Copy_Tree on the original tree, and these chained calls to New_Copy_Tree run afoul of an issue with the copy of itypes after the rewrite of an aggregate as an expression with actions. Fixing this issue looks quite delicate, so this fixes the incorrect sharing by replacing the chained calls to New_Copy_Tree with repeated calls on the original expression, which is more elegant in any case. gcc/ada/ * exp_ch3.adb (Make_Allocator_For_BIP_Return): New local function. (Expand_N_Object_Declaration): Use it to build the three allocators for a Build-In-Place return with an unconstrained type. Update the head comment after other recent changes.
2022-07-06[Ada] Remove old vxworks from Makefile.rtl - e500 port.Doug Rupp3-489/+0
The powerpc e500 port has been LTS'd gcc/ada/ * libgnat/system-vxworks7-e500-kernel.ads: Remove. * libgnat/system-vxworks7-e500-rtp-smp.ads: Likewise. * libgnat/system-vxworks7-e500-rtp.ads: Likewise.
2022-07-06[Ada] Incorrect emptying of CUDA global subprogramsJustin Squirek1-3/+6
This patch corrects an error in the compiler whereby no Corresponding_Spec was set for emptied CUDA global subprograms - leading to a malformed tree. gcc/ada/ * gnat_cuda.adb (Empty_CUDA_Global_Subprogram): Set Specification and Corresponding_Spec to match the original Kernel_Body.
2022-07-06[Ada] Remove explicit call to Make_Unchecked_Type_ConversionPiotr Trojanek2-5/+3
Respect a comment in sinfo.ads, which says: "Unchecked type conversion nodes should be created by calling Tbuild.Unchecked_Convert_To, rather than by directly calling Nmake.Make_Unchecked_Type_Conversion." No test appears to be affected by this change, so this is just a cleanup. gcc/ada/ * exp_ch6.adb (Build_Static_Check_Helper_Call): Replace explicit call to Make_Unchecked_Type_Conversion with a call to Unchecked_Convert_To. * tbuild.adb (Unchecked_Convert_To): Fix whitespace.
2022-07-06[Ada] Restore accidentally removed part of a comment about unset referencesPiotr Trojanek1-0/+1
Fix an unintentionally removed comment. gcc/ada/ * sem_res.adb (Resolve_Actuals): Restore first sentence of a comment.
2022-07-06[Ada] Fix spurious error for aggregate with box component choiceEric Botcazou4-94/+83
It comes from the Volatile_Full_Access (or Atomic) aspect: the aggregate is effectively analyzed/resolved twice and this does not work. It is fixed by calling Is_Full_Access_Aggregate before resolution. gcc/ada/ * exp_aggr.adb (Expand_Record_Aggregate): Do not call Is_Full_Access_Aggregate here. * freeze.ads (Is_Full_Access_Aggregate): Delete. * freeze.adb (Is_Full_Access_Aggregate): Move to... (Freeze_Entity): Do not call Is_Full_Access_Aggregate here. * sem_aggr.adb (Is_Full_Access_Aggregate): ...here (Resolve_Aggregate): Call Is_Full_Access_Aggregate here.
2022-07-06analyzer: fix uninit false positive with -ftrivial-auto-var-init= [PR106204]David Malcolm3-13/+86
-fanalyzer handles -ftrivial-auto-var-init= by special-casing IFN_DEFERRED_INIT to be a no-op, so that e.g.: len_2 = .DEFERRED_INIT (4, 2, &"len"[0]); is treated as a no-op, so that len_2 is still uninitialized after the stmt. PR analyzer/106204 reports that -fanalyzer gives false positives from -Wanalyzer-use-of-uninitialized-value on locals that have their address taken, due to e.g.: _1 = .DEFERRED_INIT (4, 2, &"len"[0]); len = _1; where -fanalyzer leaves _1 uninitialized, and then complains about the assignment to "len". Fixed thusly by suppressing the warning when assigning from such SSA names. gcc/analyzer/ChangeLog: PR analyzer/106204 * region-model.cc (within_short_circuited_stmt_p): Move extraction of assign_stmt to caller. (due_to_ifn_deferred_init_p): New. (region_model::check_for_poison): Move extraction of assign_stmt from within_short_circuited_stmt_p to here. Share logic with call to due_to_ifn_deferred_init_p. gcc/testsuite/ChangeLog: PR analyzer/106204 * gcc.dg/analyzer/torture/uninit-pr106204.c: New test. * gcc.dg/analyzer/uninit-pr106204.c: New test. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2022-07-06c++: dependent conversion operator lookup [PR106179]Jason Merrill2-4/+9
This testcase demonstrates that my assumption that we would only be interested in a class template lookup if the template-id is followed by :: was wrong. PR c++/106179 PR c++/106024 gcc/cp/ChangeLog: * parser.cc (cp_parser_lookup_name): Remove :: requirement for using unqualified lookup result. gcc/testsuite/ChangeLog: * g++.dg/template/operator16.C: New test.
2022-07-06Daily bump.GCC Administrator6-1/+441