aboutsummaryrefslogtreecommitdiff
path: root/gcc
AgeCommit message (Collapse)AuthorFilesLines
2024-05-07expansion: Use __trunchfbf2 calls rather than __extendhfbf2 [PR114907]Jakub Jelinek3-3/+40
The HF and BF modes have the same size/precision and neither is a subset nor superset of the other. So, using either __extendhfbf2 or __trunchfbf2 is weird. The expansion apparently emits __extendhfbf2, but on the libgcc side we apparently have __trunchfbf2 implemented. I think it is easier to switch to using what is available rather than adding new entrypoints to libgcc, even alias, because this is backportable. 2024-05-07 Jakub Jelinek <jakub@redhat.com> PR middle-end/114907 * expr.cc (convert_mode_scalar): Use trunc_optab rather than sext_optab for HF->BF conversions. * optabs-libfuncs.cc (gen_trunc_conv_libfunc): Likewise. * gcc.dg/pr114907.c: New test.
2024-05-07tree-inline: Remove .ASAN_MARK calls when inlining functions into ↵Jakub Jelinek2-7/+47
no_sanitize callers [PR114956] In r9-5742 we've started allowing to inline always_inline functions into functions which have disabled e.g. address sanitization even when the always_inline function is implicitly from command line options sanitized. This mostly works fine because most of the asan instrumentation is done only late after ipa, but as the following testcase the .ASAN_MARK ifn calls gimplifier adds can result in ICEs. Fixed by dropping those during inlining, similarly to how we drop .TSAN_FUNC_EXIT calls. 2024-05-07 Jakub Jelinek <jakub@redhat.com> PR sanitizer/114956 * tree-inline.cc: Include asan.h. (copy_bb): Remove also .ASAN_MARK calls if id->dst_fn has asan/hwasan sanitization disabled. * gcc.dg/asan/pr114956.c: New test.
2024-05-07c++: DECL_DECOMPOSITION_P cleanupMarek Polacek5-20/+10
DECL_DECOMPOSITION_P already checks VAR_P but we repeat the check in a lot of places. gcc/cp/ChangeLog: * decl.cc (duplicate_decls): Don't check VAR_P before DECL_DECOMPOSITION_P. * init.cc (build_aggr_init): Likewise. * parser.cc (cp_parser_range_for): Likewise. (do_range_for_auto_deduction): Likewise. (cp_convert_range_for): Likewise. (cp_convert_omp_range_for): Likewise. (cp_finish_omp_range_for): Likewise. * pt.cc (extract_locals_r): Likewise. (tsubst_omp_for_iterator): Likewise. (tsubst_decomp_names): Likewise. (tsubst_stmt): Likewise. * typeck.cc (maybe_warn_about_returning_address_of_local): Likewise.
2024-05-07PR modula2/114133 bugfix constants must be cast prior to vararg callGaius Mulley4-9/+11
This bug fix corrects the test codes below by converting the constant literals to the type required by C. In the testcases below the values, 1 etc were converted into the INTEGER type before being passed to a C vararg function. By default in modula2 constant literal ordinals are represented as the ZTYPE (the largest GCC integer type node). gcc/testsuite/ChangeLog: PR modula2/114133 * gm2/extensions/run/pass/callingc10.mod: Convert constant literal numbers into INTEGER. * gm2/extensions/run/pass/callingc11.mod: Ditto. * gm2/extensions/run/pass/vararg2.mod: Ditto. * gm2/iso/run/pass/packed.mod: Emit a printf as a runtime diagnostic. Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
2024-05-07[RISC-V] [PATCH v2] Enable inlining str* by defaultJeff Law3-6/+13
So with Chrstoph's patches from late 2022 we've had the ability to inline strlen, and str[n]cmp (scalar). However, we never actually turned this capability on by default! This patch flips the those default to allow inlinining by default. It also fixes one bug exposed by our internal testing when NBYTES is zero for strncmp. I don't think that case happens enough to try and optimize it, we just disable inline expansion for that instance. This has been bootstrapped and regression tested on rv64gc at various times as well as cross tested on rv64gc more times than I can probably count (we've have this patch internally for a while). More importantly, I just successfully tested it on rv64gc and rv32gcv elf configurations with the trunk gcc/ * config/riscv/riscv-string.cc (riscv_expand_strcmp): Do not inline strncmp with zero size. (emit_strcmp_scalar_compare_subword): Adjust rotation for rv32 vs rv64. * config/riscv/riscv.opt (var_inline_strcmp): Enable by default. (vriscv_inline_strncmp, riscv_inline_strlen): Likewise. gcc/testsuite * gcc.target/riscv/zbb-strlen-disabled-2.c: Turn off inlining.
2024-05-07aarch64: Build and add objects for Cygwin and MinGW for AArch64Zac Walker1-0/+5
gcc/ChangeLog: * config.gcc: Build and add objects for Cygwin and MinGW. Add Cygwin and MinGW options to the target.
2024-05-07Rename "x86 Windows Options" to "Cygwin and MinGW Options"Zac Walker5-12/+22
Rename "x86 Windows Options" to "Cygwin and MinGW Options". It will be used also for AArch64. gcc/ChangeLog: * config/i386/mingw-w64.opt.urls: Rename options' name and regenerate option URLs. * config/lynx.opt.urls: Likewise. * config/mingw/cygming.opt.urls: Likewise. * config/mingw/mingw.opt.urls: Likewise. * doc/invoke.texi: Likewise.
2024-05-07aarch64: Add SEH to machine_functionZac Walker1-0/+6
SEH is not enabled in aarch64-w64-mingw32 target yet. However, it is needed to be declared in machine_function for reusing winnt.cc. gcc/ChangeLog: * config/aarch64/aarch64.h (struct seh_frame_state): Declare SEH structure in machine_function. (GTY): Add SEH field.
2024-05-07aarch64: Add Cygwin and MinGW environments for AArch64Zac Walker3-0/+181
Define Cygwin and MinGW environment such as types, SEH definitions, shared libraries, etc. gcc/ChangeLog: * config.gcc: Add Cygwin and MinGW difinitions. * config/aarch64/aarch64-protos.h (mingw_pe_maybe_record_exported_symbol): Declare functions which are used in Cygwin and MinGW environment. (mingw_pe_section_type_flags): Likewise. (mingw_pe_unique_section): Likewise. (mingw_pe_encode_section_info): Likewise. * config/aarch64/cygming.h: New file.
2024-05-07Exclude i386 functionality from aarch64 buildZac Walker4-3/+19
This patch defines TARGET_AARCH64_MS_ABI in config.gcc and uses it to exclude i386 functionality from aarch64 build and adjust MinGW headers for AArch64 MS ABI. gcc/ChangeLog: * config.gcc: Define TARGET_AARCH64_MS_ABI. * config/mingw/mingw-stdint.h (INTPTR_TYPE): Use TARGET_AARCH64_MS_ABI to adjust MinGW headers for AArch64 MS ABI. (UINTPTR_TYPE): Likewise. (defined): Likewise. * config/mingw/mingw32.h (DEFAULT_ABI): Likewise. (defined): Likewise. * config/mingw/winnt.cc (defined): Use TARGET_ARM64_MS_ABI to exclude ix86_get_callcvt. (i386_pe_maybe_mangle_decl_assembler_name): Likewise. (i386_pe_mangle_decl_assembler_name): Likewise.
2024-05-07Rename section and encoding functions from i386 which will be used in aarch64Zac Walker4-27/+27
gcc/ChangeLog: * config/i386/cygming.h (SUBTARGET_ENCODE_SECTION_INFO): Rename functions in mingw folder which will be reused for aarch64. (TARGET_ASM_UNIQUE_SECTION): Likewise. (TARGET_ASM_NAMED_SECTION): Likewise. (TARGET_SECTION_TYPE_FLAGS): Likewise. (ASM_DECLARE_COLD_FUNCTION_NAME): Likewise. (ASM_OUTPUT_EXTERNAL_LIBCALL): Likewise. * config/i386/i386-protos.h (i386_pe_unique_section): Rename into ... (mingw_pe_unique_section): ... this. (i386_pe_declare_function_type): Rename into ... (mingw_pe_declare_function_type): ... this. (i386_pe_encode_section_info): Rename into ... (mingw_pe_encode_section_info): ... this. (i386_pe_maybe_record_exported_symbol): Rename into ... (mingw_pe_maybe_record_exported_symbol): ... this. (i386_pe_section_type_flags): Rename into ... (mingw_pe_section_type_flags): ... this. (i386_pe_asm_named_section): Rename into ... (mingw_pe_asm_named_section): ... this. * config/mingw/winnt.cc (i386_pe_encode_section_info): Rename into ... (mingw_pe_encode_section_info): ... this. (i386_pe_unique_section): Rename into ... (mingw_pe_unique_section): ... this. (i386_pe_section_type_flags): Rename into ... (mingw_pe_section_type_flags): ... this. (i386_pe_asm_named_section): Rename into ... (mingw_pe_asm_named_section): ... this. (i386_pe_asm_output_aligned_decl_common): Likewise. (i386_pe_declare_function_type): Rename into ... (mingw_pe_declare_function_type): ... this. (i386_pe_maybe_record_exported_symbol): Rename into ... (mingw_pe_maybe_record_exported_symbol): ... this. (i386_pe_start_function): Likewise. * varasm.cc (switch_to_comdat_section): Likewise.
2024-05-07Reuse MinGW from i386 for AArch64Zac Walker14-21/+24
This patch creates a new config/mingw directory to share MinGW related definitions, and moves there the corresponding existing files from config/i386. gcc/ChangeLog: * config.gcc: Adjust targets after moving MinGW related files from i386 to mingw folder. * config/i386/cygming.opt: Move to... * config/mingw/cygming.opt: ...here. * config/i386/cygming.opt.urls: Move to... * config/mingw/cygming.opt.urls: ...here. * config/i386/cygwin-d.cc: Move to... * config/mingw/cygwin-d.cc: ...here. * config/i386/mingw-stdint.h: Move to... * config/mingw/mingw-stdint.h: ...here. * config/i386/mingw.opt: Move to... * config/mingw/mingw.opt: ...here. * config/i386/mingw.opt.urls: Move to... * config/mingw/mingw.opt.urls: ...here. * config/i386/mingw32.h: Move to... * config/mingw/mingw32.h: ...here. * config/i386/msformat-c.cc: Move to... * config/mingw/msformat-c.cc: ...here. * config/i386/t-cygming: Move to... * config/mingw/t-cygming: ...here and updated. * config/i386/winnt-cxx.cc: Move to... * config/mingw/winnt-cxx.cc: ...here. * config/i386/winnt-d.cc: Move to... * config/mingw/winnt-d.cc: ...here. * config/i386/winnt-stubs.cc: Move to... * config/mingw/winnt-stubs.cc: ...here. * config/i386/winnt.cc: Move to... * config/mingw/winnt.cc: ...here.
2024-05-07aarch64: Add aarch64-w64-mingw32 COFFZac Walker2-0/+92
Define ASM specific for COFF format on AArch64. gcc/ChangeLog: * config.gcc: Add COFF format support definitions. * config/aarch64/aarch64-coff.h: New file.
2024-05-07aarch64: Mark x18 register as a fixed register for MS ABIZac Walker3-2/+40
Define the MS ABI for aarch64-w64-mingw32. Adjust FIXED_REGISTERS, CALL_REALLY_USED_REGISTERS and STATIC_CHAIN_REGNUM for AArch64 MS ABI. The X18 register is reserved on Windows for the TEB. gcc/ChangeLog: * config.gcc: Define TARGET_AARCH64_MS_ABI when AArch64 MS ABI is used. * config/aarch64/aarch64.h (FIXED_X18): Adjust FIXED_REGISTERS, CALL_REALLY_USED_REGISTERS and STATIC_CHAIN_REGNUM for AArch64 MS ABI. (CALL_USED_X18): Likewise. (FIXED_REGISTERS): Likewise. * config/aarch64/aarch64-abi-ms.h: New file.
2024-05-07Introduce aarch64-w64-mingw32 targetZac Walker1-0/+13
Add the initial aarch64-w64-mingw32 target for gcc. This is the first commit in a sequence of patch series to add new aarch64-w64-mingw32 target. Coauthors: Zac Walker <zacwalker@microsoft.com>, Mark Harmstone <mark@harmstone.com> and Ron Riddle <ron.riddle@microsoft.com> Refactored, prepared, and validated by Radek Barton <radek.barton@microsoft.com> and Evgeny Karpov <evgeny.karpov@microsoft.com> fixincludes/ChangeLog: * mkfixinc.sh: Extend for *-mingw32* targets. gcc/ChangeLog: * config.gcc: Add aarch64-w64-mingw32 target.
2024-05-07aarch64: Preserve mem info on change of base for ldp/stp [PR114674]Alex Coplan2-4/+21
The ldp/stp fusion pass can change the base of an access so that the two accesses end up using a common base register. So far we have been using adjust_address_nv to do this, but this means that we don't preserve other properties of the mem we're replacing. It seems better to use replace_equiv_address_nv, as this will preserve e.g. the MEM_ALIGN of the mem whose address we're changing. The PR shows that by adjusting the other mem we lose alignment information about the original access and therefore end up rejecting an otherwise viable pair when --param=aarch64-stp-policy=aligned is passed. This patch fixes that by using replace_equiv_address_nv instead. Notably this is the same approach as taken by aarch64_check_consecutive_mems when a change of base is required, so this at least makes things more consistent between the ldp fusion pass and the peepholes. gcc/ChangeLog: PR target/114674 * config/aarch64/aarch64-ldp-fusion.cc (ldp_bb_info::fuse_pair): Use replace_equiv_address_nv on a change of base instead of adjust_address_nv on the other access. gcc/testsuite/ChangeLog: PR target/114674 * gcc.target/aarch64/pr114674.c: New test.
2024-05-07Fix block index check in insert_updated_phi_nodes_forRichard Biener1-1/+1
This replaces a >= 0 block index check with the appropriate NUM_FIXED_BLOCKs, the check is from times ENTRY_BLOCK was negative. * tree-into-ssa.cc (insert_updated_phi_nodes_for): Fix block index check.
2024-05-07Avoid re-allocating vectorRichard Biener1-1/+3
The following avoids re-allocating the var map BB vector by pre-allocating it to the exact size needed when operating on the whole function. * tree-ssa-live.cc (init_var_map): Pre-allocate vec_bbs vector to the correct size and use quick_push.
2024-05-07middle-end/27800 - avoid unnecessary temporary during gimplificationRichard Biener2-2/+16
This avoids a tempoary when gimplifying reg = a ? b : c, re-using the LHS of an assignment if that's a register. PR middle-end/27800 * gimplify.cc (gimplify_modify_expr_rhs): For a COND_EXPR avoid a temporary from gimplify_cond_expr when the LHS is a register by pushing the assignment into the COND_EXPR arms. * gcc.dg/pr27800.c: New testcase.
2024-05-07Remove redundant checkRichard Biener1-4/+0
operand_equal_p already has checking code to verify the hash is equal, avoid doing that again in gimplify_hasher::equal. * gimplify.cc (gimplify_hasher::equal): Remove redundant checking.
2024-05-07tree-optimization/110490 - bitcount for narrow modesStefan Schulze Frielinghaus1-0/+23
Bitcount operations popcount, clz, and ctz are emulated for narrow modes in case an operation is only supported for wider modes. Beside that ctz may be emulated via clz in expand_ctz. Reflect this in expression_expensive_p. I considered the emulation of ctz via clz as not expensive since this basically reduces to ctz (x) = c - (clz (x & ~x)) where c is the mode precision minus 1 which should be faster than a loop. gcc/ChangeLog: PR tree-optimization/110490 * tree-scalar-evolution.cc (expression_expensive_p): Also consider mode widening for popcount, clz, and ctz.
2024-05-07Use unsigned for stack var indexes during RTL expansionRichard Biener1-38/+37
We're currently using size_t but at the same time storing them into bitmaps which only support unsigned int index. The following makes it unsigned int throughout, saving memory as well. * cfgexpand.cc (stack_var::representative): Use 'unsigned' for stack var indexes instead of 'size_t'. (stack_var::next): Likewise. (EOC): Likewise. (stack_vars_alloc): Likewise. (stack_vars_num): Likewise. (decl_to_stack_part): Likewise. (stack_vars_sorted): Likewise. (add_stack_var): Likewise. (add_stack_var_conflict): Likewise. (stack_var_conflict_p): Likewise. (visit_op): Likewise. (visit_conflict): Likewise. (add_scope_conflicts_1): Likewise. (stack_var_cmp): Likewise. (part_hashmap): Likewise. (update_alias_info_with_stack_vars): Likewise. (union_stack_vars): Likewise. (partition_stack_vars): Likewise. (dump_stack_var_partition): Likewise. (expand_stack_vars): Likewise. (account_stack_vars): Likewise. (stack_protect_decl_phase_1): Likewise. (stack_protect_decl_phase_2): Likewise. (asan_decl_phase_3): Likewise. (init_vars_expansion): Likewise. (estimated_stack_frame_size): Likewise.
2024-05-07middle-end/114931 - type_hash_canon and structual equality typesRichard Biener4-32/+74
TYPE_STRUCTURAL_EQUALITY_P is part of our type system so we have to make sure to include that into the type unification done via type_hash_canon. This requires the flag to be set before querying the hash which is the biggest part of the patch. PR middle-end/114931 gcc/ * tree.cc (type_hash_canon_hash): Hash TYPE_STRUCTURAL_EQUALITY_P. (type_cache_hasher::equal): Compare TYPE_STRUCTURAL_EQUALITY_P. (build_array_type_1): Set TYPE_STRUCTURAL_EQUALITY_P before probing with type_hash_canon. (build_function_type): Likewise. (build_method_type_directly): Likewise. (build_offset_type): Likewise. (build_complex_type): Likewise. * attribs.cc (build_type_attribute_qual_variant): Likewise. gcc/c-family/ * c-common.cc (complete_array_type): Set TYPE_STRUCTURAL_EQUALITY_P before probing with type_hash_canon. gcc/testsuite/ * gcc.dg/pr114931.c: New testcase.
2024-05-07Minor range type fixes for IPA in preparation for prange.Aldy Hernandez4-13/+19
The polymorphic Value_Range object takes a tree type at construction so it can determine what type of range to use (currently irange or frange). It seems a few of the types are slightly off. This isn't a problem now, because IPA only cares about integers and pointers, which can both live in an irange. However, with prange coming about, we need to get the type right, because you can't store an integer in a pointer range or vice versa. Also, in preparation for prange, the irange::supports_p() idiom will become: irange::supports_p () || prange::supports_p() To avoid changing all these places, I've added an inline function we can later change and change everything at once. Finally, there's a Value_Range::supports_type_p() && irange::supports_p() in the code. The latter is a subset of the former, so there's no need to check both. gcc/ChangeLog: * ipa-cp.cc (ipa_vr_operation_and_type_effects): Use ipa_supports_p. (ipa_value_range_from_jfunc): Change Value_Range type. (propagate_vr_across_jump_function): Same. * ipa-cp.h (ipa_supports_p): New. * ipa-fnsummary.cc (evaluate_conditions_for_known_args): Change Value_Range type. * ipa-prop.cc (ipa_compute_jump_functions_for_edge): Use ipa_supports_p. (ipcp_get_parm_bits): Same.
2024-05-07Remove obsolete Solaris 11.3 supportRainer Orth13-366/+36
Support for Solaris 11.3 had already been obsoleted in GCC 13. However, since the only Solaris system in the cfarm was running 11.3, I've kept it in tree until now when both Solaris 11.4/SPARC and x86 systems have been added. This patch actually removes the Solaris 11.3 support. Apart from several minor simplifications, there are two more widespread changes: * In Solaris 11.4, libsocket and libnsl were folded into libc, so there's no longer a need to link them explictly. * Since Solaris 11.4, Solaris includes all crts needed by gcc (like crt1.o and gcrt1.o) with the base system. All workarounds to provide fallbacks can thus go. Bootstrapped without regressions on i386-pc-solaris2.11 and sparc-sun-solaris2.11 (as/ld, gas/ld, and gas/gld) as well as Solaris 11.3/x86 to ascertain that version is actually rejected. 2024-04-30 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> c++tools: * configure.ac (ax_lib_socket_nsl.m4): Don't sinclude. (AX_LIB_SOCKET_NSL): Don't call. (NETLIBS): Remove. * configure: Regenerate. * Makefile.in (NETLIBS): Remove. (g++-mapper-server$(exeext)): Remove $(NETLIBS). gcc: * config.gcc: Move *-*-solaris2.11.[0-3]* to unsupported list. <*-*-solaris2*> (default_use_cxa_atexit): Set unconditionally. * configure.ac (AX_LIB_SOCKET_NSL): Don't call. (NETLIBS): Remove. (gcc_cv_ld_aligned_shf_merge): Remove. (hidden_linkonce) <i?86-*-solaris2* | x86_64-*-solaris2*>: Remove. (gcc_cv_target_dl_iterate_phdr) <*-*-solaris2*>: Always set to yes. * Makefile.in (NETLIBS): Remove. * configure, config.in, aclocal.m4: Regenerate. * config/sol2.h: Don't check HAVE_SOLARIS_CRTS. (STARTFILE_SPEC): Remove !HAVE_SOLARIS_CRTS case. [USE_GLD] (LINK_EH_SPEC): Remove TARGET_DL_ITERATE_PHDR guard. * config/i386/i386.cc (USE_HIDDEN_LINKONCE): Remove guard. * varasm.cc (mergeable_string_section): Remove HAVE_LD_ALIGNED_SHF_MERGE handling. (mergeable_constant_section): Likewise. * doc/install.texi (Specific,i?86-*-solaris2*): Reference Solaris 11.4 only. (Specific, *-*-solaris2*): Document Solaris 11.3 removal. Remove 11.3 references and caveats. Update for 11.4. gcc/cp: * Make-lang.in (cc1plus$(exeext)): Remove $(NETLIBS). gcc/objcp: * Make-lang.in (cc1objplus$(exeext)): Remove $(NETLIBS). gcc/testsuite: * lib/target-supports.exp (check_effective_target_pie): Always enable on *-*-solaris2*. libgcc: * configure.ac <*-*-solaris2*> (libgcc_cv_solaris_crts): Remove. * config.host <*-*-solaris2*>: Remove !libgcc_cv_solaris_crts support. * configure, config.in: Regenerate. * config/sol2/gmon.c (internal_mcount) [!HAVE_SOLARIS_CRTS]: Remove. * config/i386/sol2-c1.S, config/sparc/sol2-c1.S: Remove. * config/sol2/t-sol2 (crt1.o, gcrt1.o): Remove. libstdc++-v3: * testsuite/lib/dg-options.exp (add_options_for_net_ts) <*-*-solaris2*>: Don't link with -lsocket -lnsl.
2024-05-07Revert "Revert "combine: Don't combine if I2 does not change""Richard Biener1-0/+11
This reverts commit 109f1b28fc94c93096506e3df0c25e331cef19d0.
2024-05-07ada: Fix calculation of tasks in null arraysPiotr Trojanek1-1/+2
Fix handling of null arrays when calculating the secondary stack size for the binder. gcc/ada/ * sem_util.adb (Number_Of_Elements_In_Array): Fix counting of elements in null arrays; remove redundant parenthesis; avoid run-time conversion of 1 to universal integer.
2024-05-07ada: Prevent calculation of negative stack countsPiotr Trojanek7-20/+20
Negative numbers of stack counts have no meaning. gcc/ada/ * lib.ads, lib.adb (Primary_Stack_Count, Sec_Stack_Count, Increment_Primary_Stack_Count, Increment_Sec_Stack_Count, Unit_Record): Stack counts are never negative. * ali.ads (Unit_Record): Likewise. * bindgen.adb (Num_Primary_Stacks, Num_Sec_Stacks): Likewise. * exp_ch3.adb (Count_Default_Sized_Task_Stacks): Likewise. * sem_util.ads, sem_util.adb (Number_Of_Elements_In_Array): Likewise.
2024-05-07ada: Cleanup calculation of task stacksPiotr Trojanek1-18/+13
Code cleanup; semantics is unaffected. gcc/ada/ * exp_ch3.adb (Count_Default_Sized_Task_Stacks): Do not look for tasks inside record discriminants; remove avoid repeated call to Has_Task that happened for record components. (Expand_N_Object_Declaration): Use high-level routine to detect array types and subtypes; remove unused initial values.
2024-05-07ada: Fix grammar in commentPiotr Trojanek1-1/+1
Code cleanup. gcc/ada/ * exp_aggr.ads (Static_Array_Aggregate): Fix typo in comment.
2024-05-07ada: Remove redundant guard against empty list of declarationsPiotr Trojanek1-2/+1
Code cleanup. gcc/ada/ * inline.adb (Has_Single_Return): Remove redundant check for empty list, because First works also for empty list.
2024-05-07ada: Remove redundant guard against empty list of actionsPiotr Trojanek1-14/+11
Code cleanup. gcc/ada/ * exp_ch4.adb (Useful): Remove redundant check for empty list, because iteration with First works also for empty list; rename local variable from L to Action.
2024-05-07ada: Cleanup detection of per-object constraints in inlining for SPARKPiotr Trojanek1-14/+14
In GNATprove mode we didn't inline subprograms whose formal parameters was of a record type with constraints depending on discriminants. Now this is extended to formal parameters with per-object constraints, regardless if they come from references to discriminants or from attributes prefixed by the current type instance. gcc/ada/ * inline.adb (Has_Formal_With_Per_Object_Constrained_Component): Use flag Has_Per_Object_Constraint which is set by analysis; rename for consistency.
2024-05-07ada: Simplify detection of the enclosing scopePiotr Trojanek1-4/+1
Code cleanup; behaviour is unaffected. gcc/ada/ * sem_attr.adb (Analyze_Access_Attribute): Replace loop with Current_Scope_No_Loops.
2024-05-07ada: Reduce scope in the analysis of access attributesPiotr Trojanek1-7/+8
Code cleanup; semantics is unaffected. gcc/ada/ * sem_attr.adb (Analyze_Access_Attribute): Move code to IF branch where its result is used.
2024-05-07ada: Fix detection of components with per-object constraintsPiotr Trojanek2-80/+14
Routine Contains_POC (where POC means "per-object constraint") was failing to detect expressions of the form "Current_Type'Access", because it was comparing prefix (typically an N_Identifier) with a scope (typically an N_Definining_Entity). This was harmless, because these expressions are detected anyway in Analyze_Access_Attribute, together with uses of 'Unconstrained_Access and 'Unchecked_Access. Also, this routine was failing to detect the use of discriminants in array types with constrained subtype indication, e.g.: type T (D : Integer) is record C : array (Integer range 1 .. D); end record; It is simpler to just reuse Has_Discriminant_Dependent_Constraint and leave detection of access attributes to Analyze_Access_Attribute. gcc/ada/ * sem_attr.adb (Analyze_Access_Attribute): Prevent search from going too far. * sem_ch3.adb (Analyze_Component_Declaration): Remove Contains_POC; reuse Has_Discriminant_Dependent_Constraint.
2024-05-07ada: Fix bad interaction between homogeneous finalization master and BIP ↵Eric Botcazou11-523/+32
protocol Dynamically-allocated objects that require finalization are attached to a finalization master, which is of a (limited) controlled type declared in the System.Finalization_Masters unit. Now there are two kinds of them: homogeneous and heterogeneous; for the former, all the objects attached to the master share the same Finalize_Address primitive whereas, for the latter, they may have different Finalize_Address primitives. There is a problem in this scheme with the BIP protocol, because this protocol forwards the finalization master from callers to callees and it does so even if the result types are distinct, so it is possible for a homogeneous finalization master to end up containing objects with different Finalize_Address primitives; in that case, the object attached last wins and sets the common Finalize_Address, which is then used to finalize other objects with unpredictable outcome (and very loud valgrind report). Therefore, this change gets rid of homogeneous finalization masters and also streamlines the implementation of heterogeneous ones by storing the Finalize_Address primitive on a per object basis in the FM_Node record. gcc/ada/ * einfo.ads (Pending_Access_Types): Delete. * exp_ch3.adb (Freeze_Type.Process_Pending_Access_Types): Likewise. (Freeze_Type): Do not call Process_Pending_Access_Types. * exp_ch7.ads (Make_Set_Finalize_Address_Call): Delete. * exp_ch7.adb (Build_Finalization_Master.Add_Pending_Access_Type): Delete. (Build_Finalization_Master): Do not set Finalize_Address on the master or call Add_Pending_Access_Type. (Make_Set_Finalize_Address_Call): Delete. * gen_il-fields.ads (Opt_Field_Enum): Remove Pending_Access_Types. * gen_il-gen-gen_entities.adb (Type_Kind): Likewise. * rtsfind.ads (RE_Id): Remove RE_Set_Finalize_Address. (RE_Unit_Table): Likewise. * sem_ch3.adb (Analyze_Full_Type_Declaration): Do not deal with pending access types. * libgnat/s-finmas.ads (Attach_Unprotected): Add Finalize_Address second parameter. (Delete_Finalize_Address_Unprotected): Delete. (Finalize_Address): Likewise. (Finalize_Address_Unprotected): Likewise. (Is_Homogeneous): Likewise. (Set_Finalize_Address): Likewise. (Set_Finalize_Address_Unprotected): Likewise. (Set_Heterogeneous_Finalize_Address_Unprotected): Likewise. (Set_Is_Heterogeneous): Likewise. (FM_Node): Add Finalize_Address component. (Finalization_Master): Remove Is_Homogeneous and Finalize_Address components. * libgnat/s-finmas.adb: Remove with & use clauses for System.HTable. (Finalize_Address_Table): Delete. (Attach_Unprotected): Add Finalize_Address second parameter and save its value in the Finalize_Address field of the node. (Delete_Finalize_Address_Unprotected): Delete. (Finalize): Call Finalize_Address saved in the nodes. (Finalize_Address): Delete. (Finalize_Address_Unprotected): Likewise. (Hash): Likewise. (Is_Homogeneous): Likewise. (Print_Master): Adjust. (Set_Finalize_Address): Delete. (Set_Finalize_Address_Unprotected): Likewise. (Set_Heterogeneous_Finalize_Address_Unprotected): Likewise. (Set_Is_Heterogeneous): Likewise. * libgnat/s-stposu.adb (Finalize_Address_Table_In_Use): Likewise. (Allocate_Any_Controlled): Pass Fin_Address to Attach_Unprotected and remove obsolete processing. (Deallocate_Any_Controlled): Remove obsolete processing. (Set_Pool_Of_Subpool): Do not call Set_Is_Heterogeneous.
2024-05-07ada: Add Global contracts to Ada.Numerics.Generic_Elementary_FunctionsJoffrey Huguet1-46/+74
GNATprove raised warnings about unspecified Global contracts when using functions from an instance of Ada.Numerics.Generic_Elementary_Functions. This patch adds null Global contracts to all subprograms. gcc/ada/ * libgnat/a-ngelfu.ads (Sqrt): Add Global contracts. (Log): Likewise. (Exp): Likewise. ("**"): Likewise. (Sin): Likewise. (Cos): Likewise. (Tan): Likewise. (Cot): Likewise. (Arcsin): Likewise. (Arccos): Likewise. (Arctan): Likewise. (Arccot): Likewise. (Sinh): Likewise. (Cosh): Likewise. (Tanh): Likewise. (Coth): Likewise. (Arcsinh): Likewise. (Arccosh): Likewise. (Arctanh): Likewise. (Arccoth): Likewise.
2024-05-07ada: Remove obsolete field Postconditions_ProcEric Botcazou3-8/+0
It is now totally unused by the front-end and dependent tools. gcc/ada/ * einfo.ads (Postconditions_Proc): Delete. * gen_il-fields.ads (Opt_Field_Enum): Remove Postconditions_Proc. * gen_il-gen-gen_entities.adb (E_Function): Likewise. (E_Procedure): Likewise. (E_Entry): Likewise. (E_Entry_Family): Likewise.
2024-05-07ada: Fix typo in documentation commentRonan Desplanques1-1/+1
gcc/ada/ * sinfo.ads: Fix typo.
2024-05-07ada: Fix crash on body postconditionBob Duff3-67/+13
This patch fixes a bug where the compiler could crash on a postcondition on a subprogram body (i.e. a body that "acts as spec"), if the postcondition contains 'Old attributes that use the Ada 2022 feature that allows certain conditionals (see RM-6.1.1). The main bug fix here is in exp_attr.adb to set Ins_Node properly in the Acts_As_Spec case. Otherwise, the initialization of the 'Old temp would occur before the declaration, which gigi does not like. gcc/ada/ * exp_attr.adb (Attribute_Old): The 'Old attribute we are processing here is in a postcondition, which cannot be inside the "Wrapped_Statements" of the subprogram with that postcondition. So remove the loop labeled "Climb the parent chain looking for subprogram _Wrapped_Statements". The only way this loop could find a Subp is if we are nested inside a subprogram that also has a postcondition, and in that case we would find the wrong (outer) one. In any case, Subp is set to Empty after the loop, so all subsequent tests for Present (Subp) are necessarily False; remove them and the corresponding code. Set Ins_Node unconditionally (to the right thing). Remove obsolete comments. * sem_util.adb (Determining_Expressions): Fix assertion; Pragma_Test_Case was missing. (Eligible_For_Conditional_Evaluation): Fix assert that could fail in case of errors. * libgnat/s-valspe.ads: Remove pragma Unevaluated_Use_Of_Old; there are no uses of 'Old in this package.
2024-05-07ada: Adapt proof of runtime unitsYannick Moy4-5/+24
Restore proof of runtime units after changes in SPARK. gcc/ada/ * libgnat/a-strsea.adb (Index): Add assertions. * libgnat/a-strsup.ads ("="): Remove useless precondition. * libgnat/s-aridou.adb (Prove_Rounding_Case): Add assertions. (Lemma_Shift_Right): Add call to lemma. * libgnat/s-arit32.adb (Prove_Rounding_Case): Add assertion. (Prove_ Signs): Add assertions. (Scaled_Divide32): Add assertions.
2024-05-07Update copyright years.Marc Poulhiès2-2/+2
2024-05-07ada: Improve pragma No_Return's pre-Ada2022 handling of functionsSteve Baird1-69/+97
Ada 2022 allows pragma No_Return to apply to a function (or a generic function). For earlier Ada versions, if a No_Return pragma argument's possible resolutions include a function (or a generic function) then we want to ignore that candidate if a non-function candidate is also available and otherwise to generate an error message mentioning that this is an Ada 2022 feature. gcc/ada/ * sem_prag.adb (Analyze_Pragma): Restructure the loop over possible resolutions of a No_Return pragma's argument so that functions (and generic functions) are not processed until after it is known whether there is a non-function candidate resolution. For a pre-2022 Ada version, terminate the iteration before processing functions if a non-function resolution is found.
2024-05-07ada: Fix LTO type mismatches in GNAT.Sockets.ThinEric Botcazou2-18/+170
The default implementation of GNAT.Sockets.Thin is mainly used on Linux and the socklen_t type used in various routines of the BSD sockets C API is a typedef for unsigned int there, so importing it as Interface.C.int will be flagged as a type mismatch during LTO compilation. gcc/ada/ * libgnat/g-socthi.ads (C_Bind): Turn into inline function. (C_Getpeername): Likewise. (C_Getsockname): Likewise. (C_Getsockopt): Likewise. (C_Setsockopt): Likewise. (Nonreentrant_Gethostbyaddr): Likewise. * libgnat/g-socthi.adb (Syscall_Accept): Adjust profile. (Syscall_Connect): Likewise. (Syscall_Recvfrom): Likewise. (Syscall_Sendto): Likewise. (C_Bind): New function. (C_Accept): Adjust to above change for profiles. (C_Connect): Likewise. (C_Getpeername): New function. (C_Getsockname): Likewise. (C_Getsockopt): Likewise. (C_Recvfrom): Adjust to above change for profiles. (C_Setsockopt): New function. (Nonreentrant_Gethostbyaddr): Likewise.
2024-05-07ada: Aspects on multiple component declarationsBob Duff10-59/+45
This patch fixes a bug where aspect specifications were ignored on all but the last of multiple component declarations. For example, in a record type with components "X, Y: T with Volatile;" only Y was marked Volatile; X was not. Both should be marked Volatile. The fix is in Par.Ch3.P_Component_Items, where P_Aspect_Specifications needs to be called each time through the loop. In addition, various minor cleanups. gcc/ada/ * par-ch3.adb (P_Component_Items): Move P_Aspect_Specifications into the loop, so aspects can be attached to multiple component declarations. (P_Type_Declaration, P_Subtype_Declaration) (P_Known_Discriminant_Part_Opt): Remove default for Semicolon in calls to P_Aspect_Specifications. * gen_il-gen-gen_nodes.adb (N_Discriminant_Specification): Add Aspect_Specifications field to N_Discriminant_Specification, which was missing. * aspects.adb (Has_Aspect_Specifications_Flag): Make it True for N_Discriminant_Specification. * par-ch13.adb: Remove default for Semicolon in calls to P_Aspect_Specifications. (Get_Aspect_Specifications): Misc cleanup. (P_Aspect_Specifications): Remove comment. It's not clear what "the flag" is referring to, but anyway the first part of the comment is obvious, and the second part is apparently obsolete. Misc cleanup. * par.adb (P_Aspect_Specifications, Get_Aspect_Specifications): Remove default for Semicolon; calls are more readable that way. Improve comments. * par-ch12.adb: Remove default for Semicolon in calls to P_Aspect_Specifications. * par-ch6.adb: Likewise. * par-ch7.adb: Likewise. * par-ch9.adb: Likewise. * par-endh.adb: Likewise.
2024-05-07ada: Bad internal naming when using pragma Compile_Time_ErrorJustin Squirek1-1/+17
This patch fixes an error in the compiler whereby the presence of a condition which tests the size of a type not known at compile time within an instance of pragma Compile_Time_Error causes incorrect internal names to be generated for said type during expansion. gcc/ada/ * sem_prag.adb (Defer_Compile_Time_Warning_Error_To_BE): Better handle itypes such that the tree copy required for the expansion of the pragma doesn't cause ordering problems with internal names.
2024-05-07ada: Fix missing flag for GNATproveYannick Moy1-0/+11
GNATprove expects the frontend to position correctly range check flags, on expressions which might lead to a range check failure. This was missing on in-out parameters of calls. Now fixed. There is no impact on compilation. gcc/ada/ * sem_res.adb (Resolve_Actuals): Add range check flag.
2024-05-07ada: Fix spurious error on generic state in SPARKYannick Moy1-0/+8
The public state of a generic package needs not be part of the state of the enclosing unit, only the state of instantiations need to be accounted for in the enclosing package. Now fixed. gcc/ada/ * sem_util.adb (Find_Placement_In_State_Space): Stop search for placement when reaching the public state of a generic package.
2024-05-07ada: Reject non-statically compatible extended return statementJavier Miranda2-2/+27
Add missing check of RM 6.5(5.3/5): when the result subtype of the function is defined by a subtype mark, the subtype defined by the subtype indication of the extended return statement shall be statically compatible with the result subtype of the function. gcc/ada/ * sem_ch3.adb (Check_Return_Subtype_Indication): Add missing check on statically compatible subtypes. * sem_eval.adb (Subtypes_Statically_Compatible): Ensure that both types are either scalar types or access types to evaluate this predicate.