aboutsummaryrefslogtreecommitdiff
path: root/gcc
AgeCommit message (Collapse)AuthorFilesLines
2024-05-21ada: Remove conversion from String_Id to String and back to String_IdPiotr Trojanek1-4/+2
Code cleanup; semantics is unaffected. gcc/ada/ * exp_put_image.adb (Build_Record_Put_Image_Procedure): Remove useless conversions.
2024-05-21ada: Remove trailing NUL in minimal expansion of Put_Image attributePiotr Trojanek1-1/+3
When procedure that implements Put_Image attribute emits the type name, this name was wrongly followed by a NUL character. gcc/ada/ * exp_put_image.adb (Build_Record_Put_Image_Procedure): Remove trailing NUL from the fully qualified type name.
2024-05-21ada: Follow-up fix to previous change for Text_PtrEric Botcazou1-1/+1
The variable would be saved and restored while still uninitialized. gcc/ada/ * err_vars.ads (Error_Msg_Sloc): Initialize to No_Location.
2024-05-21ada: Add new Mingw task priority mappingJustin Squirek5-228/+289
This patch adds a new mapping (Non_FIFO_Underlying_Priorities) for dynamically setting task priorities in Windows when pragma Task_Dispatching_Policy (FIFO_Within_Priorities) is not present. Additionally, it documents the requirement to specify the pragma in order to use Set_Priority in the general case. gcc/ada/ * doc/gnat_ugn/platform_specific_information.rst: Add note about different priority level granularities under different policies in Windows and move POSIX related info into new section. * libgnarl/s-taprop.ads: Add note about Task_Dispatching_Policy. * libgnarl/s-taprop__mingw.adb: (Set_Priority): Add use of Non_FIFO_Underlying_Priorities. * libgnat/system-mingw.ads: Add documentation for modifying priority mappings and add alternative mapping Non_FIFO_Underlying_Priorities. * gnat_ugn.texi: Regenerate.
2024-05-21Use pblendw instead of pand to clear upper 16 bits.liuhongt2-4/+48
For vec_pack_truncv8si/v4si w/o AVX512, (const_vector:v4si (const_int 0xffff) x4) is used as mask to clear upper 16 bits, but vpblendw with zero_vector can also be used, and zero vector is cheaper than (const_vector:v4si (const_int 0xffff) x4). gcc/ChangeLog: PR target/114427 * config/i386/i386-expand.cc (expand_vec_perm_even_odd_pack): Use pblendw instead of pand to clear upper bits. gcc/testsuite/ChangeLog: * gcc.target/i386/pr114427.c: New test.
2024-05-20testsuite, rs6000: Make powerpc_altivec consider current_compiler_flags ↵Kewen Lin1-1/+1
[PR114842] As noted in PR114842, most of the test cases which require effective target check powerpc_altivec_ok actually care about if ALTIVEC feature is enabled, and they should adopt effective target powerpc_altivec instead. By considering we already have a number of test cases having explicit -maltivec in dg-options etc., to keep them still be tested as before even without altivec enabled by default, this patch makes powerpc_altivec consider current_compiler_flags like what we do for powerpc_vsx. PR testsuite/114842 gcc/testsuite/ChangeLog: * lib/target-supports.exp (check_effective_target_powerpc_altivec): Take current_compiler_flags into account.
2024-05-20testsuite, rs6000: Make powerpc_vsx consider current_compiler_flags [PR114842]Kewen Lin1-1/+1
As noted in PR114842, most of the test cases which require effective target check powerpc_vsx_ok actually care about if VSX feature is enabled, and they should adopt effective target powerpc_vsx instead. By considering we already have a number of test cases having explicit -mvsx in dg-options etc., to keep them still be tested as before even without vsx enabled by default, this patch is to make powerpc_vsx consider current_compiler_flags. PR testsuite/114842 gcc/testsuite/ChangeLog: * lib/target-supports.exp (check_effective_target_powerpc_vsx): Take current_compiler_flags into account.
2024-05-20testsuite, rs6000: Remove effective target powerpc_405_nocacheKewen Lin32-48/+5
With the introduction of -mdejagnu-cpu=, when the test case is specifying -mdejagnu-cpu=405, it would override the other possibly given -mcpu=, so it would compile for PowerPC 405 for sure. This patch is to remove the effective target powerpc_405_nocache and update all its uses. gcc/testsuite/ChangeLog: * gcc.target/powerpc/405-dlmzb-strlen-1.c: Remove the line using powerpc_405_nocache check. * gcc.target/powerpc/405-macchw-1.c: Likewise. * gcc.target/powerpc/405-macchw-2.c: Likewise. * gcc.target/powerpc/405-macchwu-1.c: Likewise. * gcc.target/powerpc/405-macchwu-2.c: Likewise. * gcc.target/powerpc/405-machhw-1.c: Likewise. * gcc.target/powerpc/405-machhw-2.c: Likewise. * gcc.target/powerpc/405-machhwu-1.c: Likewise. * gcc.target/powerpc/405-machhwu-2.c: Likewise. * gcc.target/powerpc/405-maclhw-1.c: Likewise. * gcc.target/powerpc/405-maclhw-2.c: Likewise. * gcc.target/powerpc/405-maclhwu-1.c: Likewise. * gcc.target/powerpc/405-maclhwu-2.c: Likewise. * gcc.target/powerpc/405-mulchw-1.c: Likewise. * gcc.target/powerpc/405-mulchw-2.c: Likewise. * gcc.target/powerpc/405-mulchwu-1.c: Likewise. * gcc.target/powerpc/405-mulchwu-2.c: Likewise. * gcc.target/powerpc/405-mulhhw-1.c: Likewise. * gcc.target/powerpc/405-mulhhw-2.c: Likewise. * gcc.target/powerpc/405-mulhhwu-1.c: Likewise. * gcc.target/powerpc/405-mulhhwu-2.c: Likewise. * gcc.target/powerpc/405-mullhw-1.c: Likewise. * gcc.target/powerpc/405-mullhw-2.c: Likewise. * gcc.target/powerpc/405-mullhwu-1.c: Likewise. * gcc.target/powerpc/405-mullhwu-2.c: Likewise. * gcc.target/powerpc/405-nmacchw-1.c: Likewise. * gcc.target/powerpc/405-nmacchw-2.c: Likewise. * gcc.target/powerpc/405-nmachhw-1.c: Likewise. * gcc.target/powerpc/405-nmachhw-2.c: Likewise. * gcc.target/powerpc/405-nmaclhw-1.c: Likewise. * gcc.target/powerpc/405-nmaclhw-2.c: Likewise. * lib/target-supports.exp (check_effective_target_powerpc_405_nocache): Remove.
2024-05-20testsuite, rs6000: Remove powerpcspe test cases and checksKewen Lin6-162/+5
Since r9-4728 the powerpcspe support had been removed, this follow-up patch is to remove the remaining pieces in testsuite. gcc/testsuite/ChangeLog: * lib/target-supports.exp (check_effective_target_vect_cmdline_needed): Remove check_effective_target_powerpc_spe. (check_effective_target_powerpc_spe_nocache): Remove. (check_effective_target_powerpc_spe): Remove. (check_ppc_cpu_supports_hw_available): Remove powerpc*-*-eabispe check. (check_p8vector_hw_available): Likewise. (check_p9vector_hw_available): Likewise. (check_p9modulo_hw_available): Likewise. (check_ppc_float128_sw_available): Likewise. (check_ppc_float128_hw_available): Likewise. (check_vsx_hw_available): Likewise. (check_vmx_hw_available): Likewise. (check_ppc_recip_hw_available): Likewise. (check_dfp_hw_available): Likewise. (check_htm_hw_available): Likewise. * g++.dg/ext/spe1.C: Remove. * g++.dg/other/opaque-1.C: Remove. * g++.dg/other/opaque-2.C: Remove. * g++.dg/other/opaque-3.C: Remove. * g++.target/powerpc/simd-5.C: Remove.
2024-05-20testsuite, rs6000: Remove powerpc_popcntb_okKewen Lin4-23/+6
There are three uses of effective target powerpc_popcntb_ok, they are all for compiling, but powerpc_popcntb_ok checks for executable generation, which is too heavy. This patch is to remove powerpc_popcntb_ok and adjust its three uses accordingly. gcc/testsuite/ChangeLog: * lib/target-supports.exp (check_effective_target_powerpc_popcntb_ok): Remove. * gcc.target/powerpc/cmpb-2.c: Adjust with dg-skip-if as powerpc_popcntb_ok gets removed. * gcc.target/powerpc/cmpb-3.c: Likewise. * gcc.target/powerpc/cmpb32-2.c: Likewise.
2024-05-20testsuite, rs6000: Remove all linux*paired* checks and casesKewen Lin12-397/+20
Since r9-115-g559289370f76bf the support of paired single had been dropped, but we still have some test checks and cases for that, this patch is to get rid of them. gcc/testsuite/ChangeLog: * lib/target-supports.exp (check_effective_target_vect_int): Remove the check on powerpc-*-linux*paired*. (check_effective_target_vect_intfloat_cvt): Likewise. (check_effective_target_vect_uintfloat_cvt): Likewise. (check_effective_target_vect_floatint_cvt): Likewise. (check_effective_target_vect_floatuint_cvt): Likewise. (check_effective_target_powerpc_altivec_ok): Likewise. (check_effective_target_powerpc_p9modulo_ok): Likewise. (check_effective_target_powerpc_float128_sw_ok): Likewise. (check_effective_target_powerpc_float128_hw_ok): Likewise. (check_effective_target_powerpc_vsx_ok): Likewise. (check_effective_target_powerpc_htm_ok): Likewise. (check_effective_target_vect_shift): Likewise. (check_effective_target_vect_char_add): Likewise. (check_effective_target_vect_shift_char): Likewise. (check_effective_target_vect_long): Likewise. (check_effective_target_ifn_copysign): Likewise. (check_effective_target_vect_sdot_hi): Likewise. (check_effective_target_vect_udot_hi): Likewise. (check_effective_target_vect_pack_trunc): Likewise. (check_effective_target_vect_int_mult): Likewise. * gcc.target/powerpc/paired-1.c: Remove. * gcc.target/powerpc/paired-10.c: Remove. * gcc.target/powerpc/paired-2.c: Remove. * gcc.target/powerpc/paired-3.c: Remove. * gcc.target/powerpc/paired-4.c: Remove. * gcc.target/powerpc/paired-5.c: Remove. * gcc.target/powerpc/paired-6.c: Remove. * gcc.target/powerpc/paired-7.c: Remove. * gcc.target/powerpc/paired-8.c: Remove. * gcc.target/powerpc/paired-9.c: Remove. * gcc.target/powerpc/ppc-paired.c: Remove.
2024-05-20testsuite, rs6000: Remove some checks with aix[456]Kewen Lin1-29/+0
Since r12-75-g0745b6fa66c69c aix6 support had been dropped, so we don't need to check for aix[456].* when testing, this patch is to remove such checks. gcc/testsuite/ChangeLog: * lib/target-supports.exp (check_effective_target_powerpc_altivec_ok): Remove checks for aix[456].* (check_effective_target_powerpc_p9modulo_ok): Likewise. (check_effective_target_powerpc_float128_sw_ok): Likewise. (check_effective_target_powerpc_float128_hw_ok): Likewise. (check_effective_target_powerpc_vsx_ok): Likewise.
2024-05-20testsuite: Fix typo in torture/vector-{1,2}.cKewen Lin2-2/+2
When making some clean up patches, I happened to find test cases vector-{1,2}.c are having typo "powerpc64--*-*" in target selector, which should be powerpc64-*-*. The reason why we didn't catch before is that all our testing machines support VMX insns, so it passes always. But it would break if a test machine doesn't support that, so this patch is to fix it to ensure robustness. gcc/testsuite/ChangeLog: * gcc.dg/torture/vector-1.c: Fix typo. * gcc.dg/torture/vector-2.c: Likewise.
2024-05-20rs6000: Remove useless operands[3]Kewen Lin1-3/+0
As shown, three uses of operands[3] are totally useless, so this patch is to remove them to avoid any confusion. gcc/ChangeLog: * config/rs6000/rs6000.md (@ieee_128bit_vsx_neg<IEEE128>2): Remove the use of operands[3]. (@ieee_128bit_vsx_neg<IEEE128>2): Likewise. (*ieee_128bit_vsx_nabs<mode>2): Likewise.
2024-05-20rs6000: Remove useless entries in rregKewen Lin1-5/+1
When I was working on a trial patch to get rid of TFmode, I noticed that mode attribute rreg only gets used for mode iterator SFDF, it means that only SF and DF key-value pairs are useful, the other are useless, so this patch is to clean up them. gcc/ChangeLog: * config/rs6000/rs6000.md (mode attribute rreg): Remove useless entries with modes TF, TD, V4SF and V2DF.
2024-05-20rs6000: Drop useless vector_{load,store}_<mode> definesKewen Lin1-14/+0
When I was working on a patch to get rid of TFmode, I noticed that define_expands vector_load_<mode> and vector_store_<mode> are useless. This patch is to clean up both. gcc/ChangeLog: * config/rs6000/vector.md (define_expand vector_load_<mode>): Remove. (vector_store_<mode>): Likewise.
2024-05-20rs6000: Clean up TF and TD check with FLOAT128_2REG_PKewen Lin1-1/+1
Commit r6-2116-g2c83faf86827bf did some clean up on TFmode and TFmode check with FLOAT128_2REG_P, but it missed to update an assertion, this patch is to make it align. btw, it's noticed when I'm making a patch to get rid of TFmode. gcc/ChangeLog: * config/rs6000/rs6000-call.cc (rs6000_darwin64_record_arg_recurse): Clean up TFmode and TDmode check with FLOAT128_2REG_P.
2024-05-20rs6000: Add assert !TARGET_VSX if !TARGET_ALTIVEC and strip a useless checkKewen Lin1-2/+3
In function rs6000_option_override_internal, we have the checks and adjustments like: if (TARGET_P8_VECTOR && !TARGET_ALTIVEC) rs6000_isa_flags &= ~OPTION_MASK_P8_VECTOR; if (TARGET_P8_VECTOR && !TARGET_VSX) rs6000_isa_flags &= ~OPTION_MASK_P8_VECTOR; But in fact some previous code has guaranteed !TARGET_VSX if !TARGET_ALTIVEC, so we can remove the former check and adjustment. This patch is to remove it accordingly and also place an explicit assertion. gcc/ChangeLog: * config/rs6000/rs6000.cc (rs6000_option_override_internal): Remove useless check on TARGET_P8_VECTOR && !TARGET_ALTIVEC and add an assertion on !TARGET_VSX if !TARGET_ALTIVEC.
2024-05-20rs6000: Fix ICE on IEEE128 long double without vsx [PR114402]Kewen Lin2-2/+18
As PR114402 shows, we supports IEEE128 format long double even if there is no vsx support, but there is an ICE about cbranch as the test case shows. For now, we only supports compare:CCFP pattern for IEEE128 fp if TARGET_FLOAT128_HW, so in function rs6000_generate_compare we have a check with !TARGET_FLOAT128_HW && FLOAT128_VECTOR_P (mode) to make !TARGET_FLOAT128_HW IEEE128 fp handling go with libcall. But unfortunately the IEEE128 without vsx support doesn't meet FLOAT128_VECTOR_P (mode) so it goes further with an unmatched compare:CCFP pattern which triggers ICE. So this patch is to make rs6000_generate_compare consider IEEE128 without vsx as well then it can end up with libcall. PR target/114402 gcc/ChangeLog: * config/rs6000/rs6000.cc (rs6000_generate_compare): Make IEEE128 handling without vsx go with libcall. gcc/testsuite/ChangeLog: * gcc.target/powerpc/pr114402.c: New test.
2024-05-21Daily bump.GCC Administrator5-1/+719
2024-05-21PR modula2/115164 initial test code highlighting the problemGaius Mulley2-0/+18
This patch includes some trivial testcode which highlights PR 115164. Expect future test code to perform runtime checks for a series of trailing zeros. gcc/testsuite/ChangeLog: PR modula2/115164 * gm2/isolib/run/pass/testlowread.mod: New test. * gm2/isolib/run/pass/testwritereal.mod: New test. Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
2024-05-20PHIOPT: Don't transform minmax if middle bb contains a phi [PR115143]Andrew Pinski4-0/+92
The problem here is even if last_and_only_stmt returns a statement, the bb might still contain a phi node which defines a ssa name which is used in that statement so we need to add a check to make sure that the phi nodes are empty for the middle bbs in both the `CMP?MINMAX:MINMAX` case and the `CMP?MINMAX:B` cases. Bootstrapped and tested on x86_64_linux-gnu with no regressions. PR tree-optimization/115143 gcc/ChangeLog: * tree-ssa-phiopt.cc (minmax_replacement): Check for empty phi nodes for middle bbs for the case where middle bb is not empty. gcc/testsuite/ChangeLog: * gcc.c-torture/compile/pr115143-1.c: New test. * gcc.c-torture/compile/pr115143-2.c: New test. * gcc.c-torture/compile/pr115143-3.c: New test. Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
2024-05-20fortran: Assume there is no cyclic reference with submodule symbols [PR99798]Mikael Morin2-2/+72
This prevents a premature release of memory with procedure symbols from submodules, causing random compiler crashes. The problem is a fragile detection of cyclic references, which can match with procedures host-associated from a module in submodules, in cases where it shouldn't. The formal namespace is released, and with it the dummy arguments symbols of the procedure. But there is no cyclic reference, so the procedure symbol itself is not released and remains, with pointers to its dummy arguments now dangling. The fix adds a condition to avoid the case, and refactors to a new predicate by the way. Part of the original condition is also removed, for lack of a reason to keep it. PR fortran/99798 gcc/fortran/ChangeLog: * symbol.cc (gfc_release_symbol): Move the condition guarding the handling cyclic references... (cyclic_reference_break_needed): ... here as a new predicate. Remove superfluous parts. Add a condition preventing any premature release with submodule symbols. gcc/testsuite/ChangeLog: * gfortran.dg/submodule_33.f08: New test.
2024-05-20aarch64: Fold vget_low_* intrinsics to BIT_FIELD_REF [PR102171]Pengxuan Zheng7-132/+124
This patch folds vget_low_* intrinsics to BIT_FILED_REF to open up more optimization opportunities for gimple optimizers. While we are here, we also remove the vget_low_* definitions from arm_neon.h and use the new intrinsics framework. PR target/102171 gcc/ChangeLog: * config/aarch64/aarch64-builtins.cc (AARCH64_SIMD_VGET_LOW_BUILTINS): New macro to create definitions for all vget_low intrinsics. (VGET_LOW_BUILTIN): Likewise. (enum aarch64_builtins): Add vget_low function codes. (aarch64_general_fold_builtin): Fold vget_low calls. * config/aarch64/aarch64-simd-builtins.def: Delete vget_low builtins. * config/aarch64/aarch64-simd.md (aarch64_get_low<mode>): Delete. (aarch64_vget_lo_halfv8bf): Likewise. * config/aarch64/arm_neon.h (__attribute__): Delete. (vget_low_f16): Likewise. (vget_low_f32): Likewise. (vget_low_f64): Likewise. (vget_low_p8): Likewise. (vget_low_p16): Likewise. (vget_low_p64): Likewise. (vget_low_s8): Likewise. (vget_low_s16): Likewise. (vget_low_s32): Likewise. (vget_low_s64): Likewise. (vget_low_u8): Likewise. (vget_low_u16): Likewise. (vget_low_u32): Likewise. (vget_low_u64): Likewise. (vget_low_bf16): Likewise. gcc/testsuite/ChangeLog: * gcc.target/aarch64/pr113573.c: Replace __builtin_aarch64_get_lowv8hi with vget_low_s16. * gcc.target/aarch64/vget_low_2.c: New test. * gcc.target/aarch64/vget_low_2_be.c: New test. Signed-off-by: Pengxuan Zheng <quic_pzheng@quicinc.com>
2024-05-20AArch64: Improve costing of ctzWilco Dijkstra1-4/+18
Improve costing of ctz - both TARGET_CSSC and vector cases were not handled yet. gcc: * config/aarch64/aarch64.cc (aarch64_rtx_costs): Improve CTZ costing.
2024-05-20AArch64: Fix printing of 2-instruction alternativesWilco Dijkstra1-2/+2
Add missing '\' in 2-instruction movsi/di alternatives so that they are printed on separate lines. gcc: * config/aarch64/aarch64.md (movsi_aarch64): Use '\;' to force newline in 2-instruction pattern. (movdi_aarch64): Likewise.
2024-05-20aarch64: Further renaming of generic codeAjit Kumar Agarwal1-35/+36
Renaming of generic code is done to make target independent and target dependent code to support multiple targets. Target independent code is the Generic code with pure virtual function to interface betwwen target independent and dependent code. Target dependent code is the implementation of pure virtual function for aarch64 target and the call to target independent code. 2024-05-20 Ajit Kumar Agarwal <aagarwa1@linux.ibm.com> gcc/ChangeLog: * config/aarch64/aarch64-ldp-fusion.cc: Rename generic parts of code to avoid "ldp" and "stp".
2024-05-20Regenerate riscv.opt.urls and i386.opt.urlsMark Wielaard2-15/+3
risc-v added an -mfence-tso option. i386 removed Xeon Phi ISA support options. But the opt.urls files weren't regenerated. Fixes: a6114c2a6911 ("RISC-V: Implement -m{,no}fence-tso") Fixes: e1a7e2c54d52 ("i386: Remove Xeon Phi ISA support") gcc/ChangeLog: * config/riscv/riscv.opt.urls: Regenerate. * config/i386/i386.opt.urls: Likewise.
2024-05-20aarch64: Preparatory patch to place target independent and dependent changed ↵Ajit Kumar Agarwal1-182/+373
code in one file Common infrastructure of load store pair fusion is divided into target independent and target dependent changed code. Target independent code is the Generic code with pure virtual function to interface betwwen target independent and dependent code. Target dependent code is the implementation of pure virtual function for aarch64 target and the call to target independent code. 2024-05-20 Ajit Kumar Agarwal <aagarwa1@linux.ibm.com> gcc/ChangeLog: * config/aarch64/aarch64-ldp-fusion.cc: Factor out a target-independent interface and move it to the head of the file
2024-05-20Manually add ChangeLog entry for ↵Jakub Jelinek1-0/+29
r15-575-gda73261ce7731be7f2b164f1db796878cdc23365
2024-05-20ada: Allow 'others' in formal packages with overloaded formalsBob Duff3-22/+14
If a generic package has two or more generic formal parameters with the same defining name (which can happen only for formal subprograms), then RM-12.7(4.1/3) disallows named associations in a corresponding formal package. This is not intended to cover "others => <>". This patch allows "others => <>" even when it applies to such formals. Previously, the compiler incorrectly gave an error. Minor related cleanups involving type Text_Ptr. gcc/ada/ * sem_ch12.adb: Misc cleanups and comment fixes. (Check_Overloaded_Formal_Subprogram): Remove the Others_Choice error message. (Others_Choice): Remove this variable; no longer needed. * types.ads (Text_Ptr): Add a range constraint limiting the subtype to values that are actually used. This has the advantage that when the compiler is compiled with validity checks, uninitialized values of subtypes Text_Ptr and Source_Ptr will be caught. * sinput.ads (Sloc_Adjust): Use the base subtype; this is used as an offset, so we need to allow arbitrary negative values.
2024-05-20ada: Add direct workaround for limitations of RTSfind mechanismEric Botcazou6-63/+12
This adds a direct workaround for the spurious compilation errors caused by the presence of preconditions/postconditions in the Interfaces.C unit, which trip on limitations of the RTSfind mechanism when it comes to visibility, as well as removes an indirect workaround that was added very recently. These errors were first triggered in the context of finalization and worked around by preloading the System.Finalization_Primitives unit. Now they also appear in the context of tasking, and it turns out that the preloading trick does not work for separate compilation units. gcc/ada/ * exp_ch7.ads (Preload_Finalization_Collection): Delete. * exp_ch7.adb (Allows_Finalization_Collection): Revert change. (Preload_Finalization_Collection): Delete. * opt.ads (Interface_Seen): Likewise. * scng.adb (Scan): Revert latest change. * sem_ch10.adb: Remove clause for Exp_Ch7. (Analyze_Compilation_Unit): Revert latest change. * libgnat/i-c.ads: Use a fully qualified name for the standard "+" operator in the preconditons/postconditions of subprograms.
2024-05-20ada: Fix internal error on nested aggregate in conditional expressionEric Botcazou1-1/+3
This plugs a loophole in the change improving code generation for nested aggregates present in conditional expressions: once the delayed expansion is chosen for the nested aggregate, the expansion of the parent aggregate cannot be left to the back-end and the test must be adjusted to implement this in the presence of conditional expressions too. gcc/ada/ * exp_aggr.adb (Expand_Record_Aggregate.Component_OK_For_Backend): Also return False for a delayed conditional expression.
2024-05-20ada: Get rid of secondary stack for indefinite record types with size clauseEric Botcazou3-6/+18
This change eliminates the use of the secondary stack for indefinite record types for which a valid (object) size clause is specified. In accordance with the RM, the compiler accepts (object) size clauses on such types only if all the components, including those of the variants of the variant part if any, have a size known at compile time, and only if the clauses specify a value that is at least as large as the largest possible size of objects of the types when all the variants are considered. However, it would still have used the secondary stack, despite valid (object) size clauses, before the change, as soon as a variant part was present in the types. gcc/ada/ * freeze.ads (Check_Compile_Time_Size): Remove obsolete description of usage for the Size_Known_At_Compile_Time flag. * freeze.adb (Check_Compile_Time_Size.Size_Known): In the case where a variant part is present, do not return False if Esize is known. * sem_util.adb (Needs_Secondary_Stack.Caller_Known_Size_Record): Add missing "Start of processing" comment. Return true if either a size clause or an object size clause has been given for the first subtype of the type.
2024-05-20ada: Formal package comment corrections in sinfo.adsBob Duff1-15/+46
Misc comment corrections and clarifications in sinfo.ads related to generic formal packages. gcc/ada/ * sinfo.ads: Misc comment corrections and clarifications. The syntax for GENERIC_ASSOCIATION and FORMAL_PACKAGE_ACTUAL_PART was wrong. Emphasize that "others => <>" is not represented as an N_Generic_Association (with or without Box_Present set), and give examples illustrating the various possibilities.
2024-05-20ada: Add Is_Base_Type predicate to C interfaceEric Botcazou2-3/+9
This also documents what the predicate effectively does. gcc/ada/ * einfo-utils.ads (Is_Base_Type): Move to Miscellaneous Subprograms section and add description. * fe.h (Is_Base_Type): Declare.
2024-05-20ada: Error on instantiation of generic containing legal container aggregateGary Dismukes1-9/+8
When a container aggregate for a predefined container type (such as a Vector type) that has an iterated component association occurs within a generic unit and that generic is instantiated, the compiler reports a spurious error message "iterated component association can only appear in an array aggregate" and the compilation aborts (because Unrecoverable_Error is raised unconditionally after that error). The problem is that as part of the instantiation process, for aggregates whose type has a partial view, in Copy_Generic_Node the compiler switches the visibility so that the full view of the type is available, and for a type whose full view is a record type this leads to incorrectly trying to process the aggregate as a record aggregate in Resolve_Aggregate (making a call to Resolve_Record_Aggregate). Rather than trying to address this by changing what Copy_Generic_Node does, this can be fixed by reordering and adjusting the code in Resolve_Aggregate, so that we first test whether we need to resolve as a record aggregate (if the aggregate is not homogeneous), followed by testing whether the type has an Aggregate aspect and calling Resolve_Container_Aggregate. As a bonus, we also remove the subsequent complex condition and redundant code for handling null container aggregates. gcc/ada/ * sem_aggr.adb (Resolve_Aggregate): Move condition and call for Resolve_Record_Aggregate in front of code related to calling Resolve_Container_Aggregate (and add test that the aggregate is not homogeneous), and remove special-case testing and call to Resolve_Container_Aggregate for empty aggregates. Also, add error check for an attempt to use "[]" for an aggregate of a record type that does not specify an Aggregate aspect. (Resolve_Record_Aggregate): Remove error check for record aggregates with "[]" (now done by Resolve_Aggregate).
2024-05-20ada: Error on instantiation of generic containing legal container aggregateGary Dismukes1-17/+5
When a container aggregate for a predefined container type (such as a Vector type) that has an iterated component association occurs within a generic unit and that generic is instantiated, the compiler reports a spurious error message "iterated component association can only appear in an array aggregate" and the compilation aborts (because Unrecoverable_Error is raised unconditionally after that error). The problem is that as part of the instantiation process, for aggregates whose type has a partial view, in Copy_Generic_Node the compiler switches the visibility so that the full view of the type is available, and for a type whose full view is a record type this leads to incorrectly trying to process the aggregate as a record aggregate in Resolve_Aggregate (making a call to Resolve_Record_Aggregate). Rather than trying to address this by changing what Copy_Generic_Node does, this can be fixed by reordering and adjusting the code in Resolve_Aggregate, so that we first test whether we need to resolve as a record aggregate (if the aggregate is not homogeneous), followed by testing whether the type has an Aggregate aspect and calling Resolve_Container_Aggregate. As a bonus, we also remove the subsequent complex condition and redundant code for handling null container aggregates. gcc/ada/ * sem_aggr.adb (Resolve_Aggregate): Move condition and call for Resolve_Record_Aggregate in front of code related to calling Resolve_Container_Aggregate (and add test that the aggregate is not homogeneous), and remove special-case testing and call to Resolve_Container_Aggregate for empty aggregates.
2024-05-20ada: Handle accessibility calculations for 'First and 'LastJustin Squirek1-1/+9
This patch fixes a crash in the compiler whereby calculating the accessibility level of of a local variable whose original expression is an 'First on an array type led to an error during compilation. gcc/ada/ * accessibility.adb (Accessibility_Level): Add cases for 'First and 'Last.
2024-05-20ada: Further refine 'Super attributeJustin Squirek1-4/+0
This patch relaxes the restriction on 'Super such that it can apply to abstract type objects. gcc/ada/ * sem_attr.adb (Analyze_Attribute): Remove restriction on 'Super for abstract types.
2024-05-20ada: Fix list of implementation-defined attributesPiotr Trojanek1-0/+27
Several of the implementation-defined attributes were wrongly recognized as defined by the Ada RM. This change only affects code with restriction No_Implementation_Attributes. gcc/ada/ * sem_attr.ads (Attribute_Impl_Def): Fix list of implementation-defined attributes.
2024-05-20ada: Fix list of attributes defined by Ada 2012Piotr Trojanek1-1/+4
Recognize references to attributes Old, Overlaps_Storage and Result as language-defined in Ada 2012 and implementation-defined in earlier versions of Ada. Other attributes introduced by Ada 2012 RM are correctly categorized. This change only affects code with restriction No_Implementation_Attributes. gcc/ada/ * sem_attr.adb (Attribute_12): Add attributes Old, Overlaps_Storage and Result.
2024-05-20ada: Apply restriction No_Implementation_Attributes to source nodes onlyPiotr Trojanek1-13/+14
Restriction No_Implementation_Attributes must not be applied to nodes that come from expansion. In particular, it must not be applied to Object_Size, which is implementation-defined attribute before Ada 2022, but appears in expansion of tagged types since Ada 95. gcc/ada/ * sem_attr.adb (Analyze_Attribute): Move IF statement that checks restriction No_Implementation_Attributes for Ada 2005, 2012 and Ada 2022 attributes inside Comes_From_Source condition that checks the same restriction for Ada 83 attributes.
2024-05-20ada: Remove repeated condition in check for implementation attributesPiotr Trojanek1-1/+1
Code cleanup; semantics is unaffected. gcc/ada/ * sem_attr.adb (Analyze_Attribute): Remove condition that is already checked by an enclosing IF statement.
2024-05-20ada: Use discrete choice list in declaration of universal type attributesPiotr Trojanek1-31/+31
Code cleanup. gcc/ada/ * sem_attr.ads (Universal_Type_Attribute): Simplify using array aggregate syntax with discrete choice list.
2024-05-20ada: Fix style in list of implementation-defined attributesPiotr Trojanek1-0/+8
Code cleanup. gcc/ada/ * sem_attr.ads (Attribute_Impl_Def): Fix style in comment.
2024-05-20ada: Tweak handling of thread ID on POSIXRonan Desplanques11-61/+78
This patch changes the task initialization subprograms on POSIX platforms so that the thread ID of an ATCB is only set once. This has the advantage of getting rid of the Atomic aspect on the corresponding record component, and silences a Helgrind warning about a data race. gcc/ada/ * libgnarl/s-taprop__linux.adb (Enter_Task): Move setting of thread ID out of Enter_Task. (Initialize): Set thread ID for the environment task. (Create_Task): Remove now unnecessary Unrestricted_Access attribute and add justification for a memory write. * libgnarl/s-taprop__posix.adb: Likewise. * libgnarl/s-taprop__qnx.adb: Likewise. * libgnarl/s-taprop__rtems.adb: Likewise. * libgnarl/s-taprop__solaris.adb: Likewise. * libgnarl/s-taspri__posix.ads: Remove pragma Atomic for Private_Data.Thread, and update documentation comment. * libgnarl/s-taspri__lynxos.ads: Likewise. * libgnarl/s-taspri__posix-noaltstack.ads: Likewise. * libgnarl/s-taspri__solaris.ads: Likewise. * libgnarl/s-tporft.adb (Register_Foreign_Thread): Adapt to Enter_Task not setting the thread ID anymore. * libgnarl/s-tassta.adb (Task_Wrapper): Update comment.
2024-05-20ada: Extend expansion delaying mechanism to conditional expressionsEric Botcazou6-135/+479
When an aggregate that needs to be converted into a series of assignments is present in an expression of a parent aggregate, or in the expression of an allocator, an object declaration, or an assignment in very specific cases, its expansion is delayed until its parent itself is expanded. This makes it possible to avoid creating a superfluous temporary for the aggregate. This change extends the delaying mechanism in the case of record aggregates to intermediate conditional expressions, that is to say, to the conditional expressions that are present between the parent and the aggregate, provided that the aggregate be a dependent expression, directly or recursively. This again makes it possible to avoid creating a temporary for the aggregate. gcc/ada/ * exp_aggr.ads (Is_Delayed_Conditional_Expression): New predicate. * exp_aggr.adb (Convert_To_Assignments.Known_Size): Likewise. (Convert_To_Assignments): Climb the parent chain, looking through qualified expressions and dependent expressions of conditional expressions, to find out whether the expansion may be delayed. Call Known_Size for this in the case of an object declaration. If so, set Expansion_Delayed on the aggregate as well as all the intermediate conditional expressions. (Initialize_Component): Reset the Analyzed flag on an initialization expression that is a conditional expression whose expansion has been delayed. (Is_Delayed_Conditional_Expression): New predicate. * exp_ch3.adb (Expand_N_Object_Declaration): Handle initialization expressions that are conditional expressions whose expansion has been delayed. * exp_ch4.adb (Build_Explicit_Assignment): New procedure. (Expand_Allocator_Expression): Handle initialization expressions that are conditional expressions whose expansion has been delayed. (Expand_N_Case_Expression): Deal with expressions whose expansion has been delayed by waiting for the rewriting of their parent as an assignment statement and then optimizing the assignment. (Expand_N_If_Expression): Likewise. (Expand_N_Qualified_Expression): Do not apply a predicate check to an operand that is a delayed aggregate or conditional expression. * gen_il-gen-gen_nodes.adb (N_If_Expression): Add Expansion_Delayed semantic flag. (N_Case_Expression): Likewise. * sinfo.ads (Expansion_Delayed): Document extended usage.
2024-05-20ada: Resolve ACATS compilation and execution issues with container aggregatesGary Dismukes3-273/+569
This change set addresses various compilation and execution problems encountered in the draft ACATS tests for container aggregates: C435001 (container aggregates with Assign_Indexed) C435002 (container aggregates with Add_Unnamed) C435003 (container aggregates with Add_Named) C435004 (container aggregates with Assign_Indexed and Add_Unnamed) gcc/ada/ * exp_aggr.adb (Expand_Container_Aggregate): Add top-level variables Choice_{Lo|Hi} and Int_Choice_{Lo|Hi} used for determining the low and high bounds of component association choices. Replace code for determining whether we have an indexed aggregate with call to new function Sem_Aggr.Is_Indexed_Aggregate. Remove test of whether Empty_Subp is a function, since it must be a function. Move Default and Count_Type to be locals of a new block enclosing the code that creates the object to hold the aggregate length, and set them according to the default and type of the Empty function's parameter when present (and to Empty and Standard_Natural otherwise). Use Siz_Exp for the aggregate length when set, and use Empty's default length when available, and use zero for the length otherwise. In generating the call to the New_Indexed function, use the determined lower and upper bounds if determined earlier by Aggregate_Size, and otherwise compute those from the index type's lower bound and the determined aggregate length. In the case where a call to Empty is generated and the function has a formal parameter, pass the value saved in Siz_Decl (otherwise the parameter list is empty). Remove code specific to making a parameterless call to the Empty function. Extend the code for handling positional container aggregates to account for types that define Assign_Indexed, rather than just Add_Unnamed, and in the case of indexed aggregates, create a temporary object to hold values of the aggregate's key index, and initialize and increment that temporary for each call generated to the Assign_Indexed procedure. For named container aggregates that have key choices given by ranges, call Expand_Range_Component to generate a loop that will call the appropriate insertion procedure for each value of the range. For indexed aggregates with a Component_Associations list, set and use the Assign_Indexed procedure for each component association, whether or not there's an iterator specification. (Add_Range_Size): Add code to determine the low and high bounds of the range and capture those in up-level variables when their value is less than or greater than (respectively) the current minimum and maximum bounds values. (Aggregate_Size): Separately handle the case where a single choice is of a discrete type, and call Add_Range_Size to take its value into consideration for determination of min and max bounds of the aggregate. Add comments in a couple of places. (Build_Siz_Exp): Remove the last sentence and "???" from the comment that talks about accumulating nonstatic sizes, since that sentence seems to be obsolete. Record the low and high bound values in Choice_Lo and Choice_Hi in the case of a nonstatic range. (Expand_Iterated_Component): Set the Defining_Identifier of the iterator specification to the Loop_Id in the N_Iterated_Component_Association case. (Expand_Range_Component): Procedure unnested from the block handling indexed aggregates in Expand_Container_Aggregate, and moved to top level of that procedure so it can also be called for Add_Named cases. A formal parameter Insert_Op is added, and existing calls to this procedure are changed to pass the appropriate insertion procedure's Entity. * sem_aggr.ads: Add with_clause for Sinfo.Nodes. (Is_Indexed_Aggregate): New function for use by Resolve_Container_Aggregate and Expand_Container_Aggregate. * sem_aggr.adb: Add with_clause for Sem_Ch5. Move with_clause for Sinfo.Nodes to sem_aggr.ads. (Is_Indexed_Aggregate): New function to determine whether a container aggregate is a container aggregate (replacing local variable of the same name in Resolve_Container_Aggregate). (Resolve_Iterated_Association): Remove part of comment saying that a Key_Expression is always present. Set Parent field of the copy of a component association with a loop parameter specification. On the setting of Loop_Param_Id, account for a Loop_Parameter_Specification being changed into an Iterator_Specification as a result of being analyzed. Only call Preanalyze_And_Resolve on Key_Expr when a key expression is actually present. Remove loop for handling choices for the case of an N_Component_Association with a Defining_Identifier (there shouldn't be more than one choice in this case, and add an assertion to ensure that). Also add code here to handle the case where the choice is a function call, creating an iterator_specification analyzing it, and call Resolve_Iterated_Association recursively to process it. Add error check to enforce RM22 4.3.5(27), which requires that the type of the loop parameter must be the same as the key type when there is no key expression and the aggregate is an indexed aggregate or has an Add_Named op. (Resolve_Container_Aggregate): In the Add_Unnamed case, call Resolve_Iterated_Association for both N_Iterated_Element_Association and N_Component_Association (rather than just the latter). Remove error check for nonstatic choices in component associations in Add_Named cases (multiple named nonstatic associations are fine except in indexed aggregates). Remove local variable Is_Indexed_Aggregate, replaced with new library-level function of the same name, and add test of Is_Indexed_Aggregate in the case where the aggregate type has an Assign_Indexed operation, as a guard for doing error checks for indexed aggregates. For indexed aggregate resolution, do not call Analyze_And_Resolve on the expression of an N_Component_Association in the "box association" case. Move error checks for indexed aggregates with iterated associations that flag cases where an association is a loop_parameter_specification with an iterator filter or a key expression (violation of RM22 4.3.5(28/5)), from the loop that checks for contiguous and nonoverlapping choices and into the preceding association loop after the call to Resolve_Iterated_Association. The RM reference is added to the error-message strings.
2024-05-20ada: Fix incorrect free with Task_Info pragmaRonan Desplanques1-6/+11
Before this patch, on Linux, the procedure System.Task_Primitives.Operations.Set_Task_Affinity called CPU_FREE on instances of cpu_set_t_ptr that it didn't own when the obsolescent Task_Info pragma was in play. This patch fixes that issue. gcc/ada/ * libgnarl/s-taprop__linux.adb (Set_Task_Affinity): Fix decision about whether to call CPU_FREE.