aboutsummaryrefslogtreecommitdiff
path: root/gcc
AgeCommit message (Collapse)AuthorFilesLines
2024-11-19aarch64: Extend the offset limit in "symbol + offset" from 1MB to 16MBEvgeny Karpov1-0/+15
This patch allows using an offset of up to 16MB in "symbol + offset", instead of 1MB limit that was used previously. gcc/ChangeLog: * config/aarch64/aarch64.cc (aarch64_load_symref_appropriately): Update.
2024-11-19aarch64: Multiple adjustments to support the SMALL code model correctlyEvgeny Karpov5-32/+37
LOCAL_LABEL_PREFIX has been changed to help the assembly compiler recognize local labels. Emitting locals has been replaced with the .lcomm directive to declare uninitialized data without defining an exact section. Functions and objects were missing declarations. Binutils was not able to distinguish static from external, or an object from a function. mingw_pe_declare_object_type has been added to have type information for relocation on AArch64, which is not the case for ix86. This fix relies on changes in binutils. aarch64: Relocation fixes and LTO https://sourceware.org/pipermail/binutils/2024-August/136481.html gcc/ChangeLog: * config/aarch64/aarch64-coff.h (LOCAL_LABEL_PREFIX): Use "." as the local label prefix. (ASM_OUTPUT_ALIGNED_LOCAL): Remove. (ASM_OUTPUT_LOCAL): New. * config/aarch64/cygming.h (ASM_OUTPUT_EXTERNAL_LIBCALL): Update. (ASM_DECLARE_OBJECT_NAME): New. (ASM_DECLARE_FUNCTION_NAME): New. * config/i386/cygming.h (ASM_DECLARE_COLD_FUNCTION_NAME): Update. (ASM_OUTPUT_EXTERNAL_LIBCALL): Update. * config/mingw/winnt.cc (mingw_pe_declare_function_type): Rename into ... (mingw_pe_declare_type): ... this. (i386_pe_start_function): Update. * config/mingw/winnt.h (mingw_pe_declare_function_type): Rename into ... (mingw_pe_declare_type): ... this.
2024-11-19aarch64: Exclude symbols using GOT from code modelsEvgeny Karpov1-2/+4
Symbols using GOT are not supported by the aarch64-w64-mingw32 target and should be excluded from the code models. gcc/ChangeLog: * config/aarch64/aarch64.cc (aarch64_classify_symbol): Disable GOT for PECOFF target.
2024-11-19aarch64: Add minimal C++ supportEvgeny Karpov1-0/+1
The patch resolves compilation issues for the C++ language. Previous patch series contributed to C++ as well, however, C++ could not be tested until we got a C++ compiler and could build at least a "Hello World" C++ program, and in reality, more than that. Another issue has been fixed in the libstdc++ patch. https://gcc.gnu.org/pipermail/libstdc++/2024-September/059472.html gcc/ChangeLog: * config.gcc: Add missing dependencies.
2024-11-19aarch64: Add debugging informationEvgeny Karpov2-1/+47
This patch enables DWARF and allows compilation with debugging information by using "gcc -g". The unwind info is disabled for the moment and will be revisited after SEH implementation for the target. gcc/ChangeLog: * config/aarch64/aarch64.cc (TARGET_ASM_UNALIGNED_HI_OP): Enable DWARF. (TARGET_ASM_UNALIGNED_SI_OP): Likewise. (TARGET_ASM_UNALIGNED_DI_OP): Likewise. * config/aarch64/cygming.h (DWARF2_DEBUGGING_INFO): Likewise. (PREFERRED_DEBUGGING_TYPE): Likewise. (DWARF2_UNWIND_INFO): Likewise. (ASM_OUTPUT_DWARF_OFFSET): Likewise.
2024-11-19Support weak referencesEvgeny Karpov5-8/+21
The patch adds support for weak references. The original MinGW implementation targets ix86, which handles weak symbols differently compared to AArch64. In AArch64, the weak symbols are replaced by other symbols which reference the original weak symbols, and the compiler does not track the original symbol names. This patch resolves this and declares the original symbols. Here is an explanation of why this change is needed and what the difference is between x86_64-w64-mingw32 and aarch64-w64-mingw32. The way x86_64 calls a weak function: call  weak_fn2 GCC emits the call and creates the required definitions at the end of the assembly: .weak weak_fn2 .def  weak_fn2;   .scl  2;    .type 32;   .endef This is different from aarch64: weak_fn2 will be legitimized and replaced by .refptr.weak_fn2, and there will be no other references to weak_fn2 in the code. adrp  x0, .refptr.weak_fn2 add   x0, x0, :lo12:.refptr.weak_fn2 ldr   x0, [x0] blr   x0 GCC does not emit the required definitions at the end of the assembly, and weak_fn2 is tracked only by the mingw stub sybmol. Without the change, the stub definition will emit: .section      .rdata$.refptr.weak_fn2, "dr" .globl  .refptr.weak_fn2 .linkonce     discard .refptr.weak_fn2: .quad   weak_fn2 which is not enough. This fix will emit the required definitions: .weak   weak_fn2 .def    weak_fn2;   .scl  2;    .type 32;   .endef .section      .rdata$.refptr.weak_fn2, "dr" .globl  .refptr.weak_fn2 .linkonce     discard .refptr.weak_fn2: .quad   weak_fn2 This is the first commit in the third patch series with SMALL code model fixes, optimization fixes, LTO, and minimal C++ enablement. Prepared, refactored and validated by Radek Barton <radek.barton@microsoft.com> and Evgeny Karpov <evgeny.karpov@microsoft.com> Contributor: Zac Walker <zacwalker@microsoft.com> gcc/ChangeLog: * config/aarch64/cygming.h (SUB_TARGET_RECORD_STUB): Request declaration for weak symbols. (PE_COFF_LEGITIMIZE_EXTERN_DECL): Legitimize external declaration for weak symbols. * config/i386/cygming.h (SUB_TARGET_RECORD_STUB): Update declarations in ix86 with the same functionality. (PE_COFF_LEGITIMIZE_EXTERN_DECL): Likewise. * config/mingw/winnt-dll.cc (legitimize_pe_coff_symbol): Support declaration for weak symbols if requested. * config/mingw/winnt.cc (struct stub_list): Likewise. (mingw_pe_record_stub): Likewise. (mingw_pe_file_end): Likewise. * config/mingw/winnt.h (mingw_pe_record_stub): Likewise.
2024-11-19ada: Rename Within_Case_Or_If_Expression predicateEric Botcazou3-10/+10
The case and if expressions are exactly the conditional expressions. gcc/ada/ChangeLog: * exp_util.ads (Within_Case_Or_If_Expression): Rename into... (Within_Conditional_Expression): ...this. * exp_util.adb (Within_Case_Or_If_Expression): Rename into... (Within_Conditional_Expression): ...this. * checks.adb (Install_Null_Excluding_Check): Adjust for renaming.
2024-11-19ada: Small fix in expansion of array aggregates handled by the back endEric Botcazou1-46/+25
The (minimal) expansion is now done by Build_Array_Aggr_Code in all cases, which means that it must prevent the aggregate from being re-analyzed as the RHS of the assignment, which may trigger a bogus warning and lead to another useless rewriting. The change also inlines Build_Assignment_With_Temporary that is now called only once by Build_Array_Aggr_Code for this processing. gcc/ada/ChangeLog: * exp_aggr.adb (Build_Assignment_With_Temporary): Inline into... (Build_Array_Aggr_Code): ...this. Set the Analyzed flag on the relocated aggregate if it is to be handled by the back-end.
2024-11-19ada: Cleanup in expansion of aggregates in object declarations with aspectsEric Botcazou3-100/+22
The strategy to expand aggregates present as initialization expressions in object declarations, originally with a subsequent address clause given for the object and later with aspects whose resolution needs to be delayed up to the freeze point, has been to block their resolution, so as to block their expansion, during the processing of the declarations, lest they be nonstatic and expanded in place and therefore generate assignments to the object before its freeze point, which is forbidden. Instead a temporary is created at the declaration point and the aggregates are assigned to it, and finally the temporary is copied into the object at the freeze point. Of course this general strategy cannot be applied to limited types because the copy operation is forbidden for them, so instead aggregates of limited types are resolved but have their expansion delayed, before being eventually expanded through Convert_Aggr_In_Object_Decl, which uses the mechanism based on Initialization_Statements to insert them at the freeze point. After the series of cleanups, all the aggregates that are initialization expressions in object declarations and get expanded in place, go through the Convert_Aggr_In_Object_Decl mechanism, exactly like those of limited type with address clause/aspects have done historically. This means that we no longer need to block the resolution of those of nonlimited type with address clause/aspects. gcc/ada/ChangeLog: * exp_ch3.adb: Remove clauses for Expander. (Expand_N_Object_Declaration): Remove special processing for delayed aggregates of limited types as initialization expressions. * freeze.adb (Warn_Overlay): Bail out if No_Initialization is set on the declaration node of the entity. * sem_ch3.adb (Delayed_Aspect_Present): Delete. (Expand_N_Object_Declaration): Do not block the resolution of the initialization expression that is an aggregate when the object has an address clause or delayed aspects.
2024-11-19fortran: Inline unmasked integral MINLOC/MAXLOC with DIM [PR90608]Mikael Morin5-78/+343
Enable generation of inline code for the MINLOC and MAXLOC intrinsics, if the ARRAY argument is of integral type and of rank > 1 (only the rank 1 case was previously inlined), the DIM argument is a constant value and there is no MASK argument. The restriction to integral ARRAY and absent MASK limits the scope of the change to the cases where we generate single loop inline code. This change uses the existing scalarizer suport for reductions, that is arrays used in scalarization loops, where each element uses a nested scalarization loop to calculate its value. The nested loop (and respectively the nested scalarization chain) is created while walking the MINLOC/MAXLOC expression, it's set up automatically at the time the outer loop is set up, and gfc_conv_intrinsic_minmaxloc is changed to use it as a replacement for the local loop variable (respectively ARRAY scalarization chain) used in the non-reduction case (i.e. when DIM is absent). PR fortran/90608 gcc/fortran/ChangeLog: * trans-intrinsic.cc (gfc_inline_intrinsic_function_p): Return true if DIM is constant, ARRAY is integral and MASK is absent. (walk_inline_intrinsic_minmaxloc): If DIM is present, walk ARRAY and move the dimension corresponding to DIM to a nested chain, keeping the rest of the dimensions as the returned scalarization chain. (gfc_conv_intrinsic_minmaxloc): When inside the scalarization loops, proceed with inline code generation If DIM is present. If DIM is present, skip result array creation and final initialization from individual result local variables. If DIM is present and ARRAY has rank greater than 1, use the nested loop initialized by the scalarizer instead of the local one, use 1 as scalarization dimension, and evaluate ARRAY using the inherited scalarization chain instead of creating a local one by walking the expression. gcc/testsuite/ChangeLog: * gfortran.dg/maxloc_bounds_1.f90: Also accept the error message generated by the scalarizer in case the function call is implemented through inline code. * gfortran.dg/maxloc_bounds_2.f90: Likewise. * gfortran.dg/maxloc_bounds_3.f90: Likewise. * gfortran.dg/minmaxloc_19.f90: New test.
2024-11-19fortran: Add tests covering inline MINLOC/MAXLOC with DIM [PR90608]Mikael Morin6-0/+1434
Add the tests covering the cases for which the following patches will implement inline expansion of MINLOC and MAXLOC. Those are cases where the DIM argument is a constant value, and the ARRAY argument has rank greater than 1. PR fortran/90608 gcc/testsuite/ChangeLog: * gfortran.dg/ieee/maxloc_nan_2.f90: New test. * gfortran.dg/ieee/minloc_nan_2.f90: New test. * gfortran.dg/maxloc_with_dim_1.f90: New test. * gfortran.dg/maxloc_with_dim_and_mask_1.f90: New test. * gfortran.dg/minloc_with_dim_1.f90: New test. * gfortran.dg/minloc_with_dim_and_mask_1.f90: New test.
2024-11-19RISC-V: Load VLS perm indices directly from memory.Robin Dapp7-2/+32
Instead of loading the permutation indices and using vmslt in order to determine which elements belong to which source vector we can compute the proper mask at compile time. That way we can emit vlm instead of vle + vmslt. gcc/ChangeLog: * config/riscv/riscv-v.cc (shuffle_merge_patterns): Load VLS indices directly. gcc/testsuite/ChangeLog: * gcc.target/riscv/rvv/autovec/vls/merge-1.c: Check for vlm and no vmsleu etc. * gcc.target/riscv/rvv/autovec/vls/merge-2.c: Ditto. * gcc.target/riscv/rvv/autovec/vls/merge-3.c: Ditto. * gcc.target/riscv/rvv/autovec/vls/merge-4.c: Ditto. * gcc.target/riscv/rvv/autovec/vls/merge-5.c: Ditto. * gcc.target/riscv/rvv/autovec/vls/merge-6.c: Ditto.
2024-11-19Avoid repeated calls to temporarily_undo_changes [PR117297]Richard Sandiford5-53/+76
In an attempt to reduce compile time, rtl-ssa computes the cost of existing instructions lazily rather than eagerly. However, this means that it might need to calculate the cost of an existing instruction while a change group is already in progress for the instruction. rtl_ssa::insn_info::calculate_cost therefore temporarily undoes any in-progress changes in order to get back the original pattern and insn code. rtl-ssa's main use of insn costs is in rtl_ssa::changes_are_worthwhile, which calculates the cost of a change involving an arbitrary number of instructions. Summing up the original cost of N instructions while those N instructions have in-progress changes could lead to O(N*N) rtl changes, since each lazy calculation might have to temporarily undo the changes to all N instructions. We can avoid that by converting the current temporarily_undo_changes/ redo_changes pair into an RAII class and extending it to allow nested uses. rtl_ssa::changes_are_worthwhile can then undo the in-progress changes once, before computing the original cost of all the instructions. gcc/ PR rtl-optimization/117297 * recog.h (temporarily_undo_changes, redo_changes): Delete in favor of... (undo_recog_changes): ...this new RAII class. * fwprop.cc (should_replace_address): Update accordingly. (fwprop_propagation::check_mem): Likewise. (try_fwprop_subst_note): Likewise. (try_fwprop_subst_pattern): Likewise. * rtl-ssa/insns.cc (insn_info::calculate_cost): Likewise. * rtl-ssa/changes.cc (rtl_ssa::changes_are_worthwhile): Temporarily undo all in-progress changes while computing the cost of the original sequence. * recog.cc (temporarily_undone_changes): Replace with... (undo_recog_changes::s_num_changes): ...this static member variable. (validate_change_1): Update check accordingly. (confirm_change_group): Likewise. (num_validated_changes): Likewise. (temporarily_undo_changes): Replace with... (undo_recog_changes::undo_recog_changes): ...this constructor. (redo_changes): Replace with... (undo_recog_changes::~undo_recog_changes): ...this destructor.
2024-11-19expand: Fix up ICE on VCE from _Complex types to _BitInt [PR117458]Jakub Jelinek2-1/+19
extract_bit_field can't handle extraction of non-mode precision from complex mode operands which don't live in memory, e.g. gen_lowpart crashes on those. The following patch in that case defers the extract_bit_field call until op0 is forced into memory. 2024-11-19 Jakub Jelinek <jakub@redhat.com> PR middle-end/117458 * expr.cc (expand_expr_real_1) <case VIEW_CONVERT_EXPR>: Don't call extract_bit_field if op0 has complex mode and isn't a MEM, instead first force op0 into memory and then call extract_bit_field. * gcc.dg/bitint-116.c: New test.
2024-11-19bitintlower: Handle PAREN_EXPR [PR117459]Jakub Jelinek2-1/+31
The following patch handles PAREN_EXPR in bitint lowering, and handles it as an optimization barrier, so that temporary arithmetics from PAREN_EXPR isn't mixed with temporary arithmetics from outside of the PAREN_EXPR. 2024-11-19 Jakub Jelinek <jakub@redhat.com> PR middle-end/117459 * gimple-lower-bitint.cc (bitint_large_huge::handle_stmt, bitint_large_huge::lower_stmt): Handle PAREN_EXPR. * gcc.dg/torture/bitint-74.c: New test.
2024-11-19bitintlower: Handle EXACT_DIV_EXPR like TRUNC_DIV_EXPR in bitint lowering ↵Jakub Jelinek2-0/+31
[PR117571] r15-4601 added match.pd simplification of some TRUNC_DIV_EXPR expressions into EXACT_DIV_EXPR, so bitintlower can now encounter even those. From bitint lowering POV the fact that the division will be exact doesn't matter, we still need to call at runtime the __divmodbitint4 API and it wouldn't simplify there anything to know it is exact if we duplicated that, so the following patch lowers EXACT_DIV_EXPR exactly as TRUNC_DIV_EXPR. I think we don't need to backport this unless something introduces EXACT_DIV_EXPR on BITINT_TYPEd expressions on the 14 branch as well. 2024-11-19 Jakub Jelinek <jakub@redhat.com> PR middle-end/117571 * gimple-lower-bitint.cc (bitint_large_huge::lower_muldiv_stmt, bitint_large_huge::lower_stmt, stmt_needs_operand_addr, build_bitint_stmt_ssa_conflicts, gimple_lower_bitint): Handle EXACT_DIV_EXPR like TRUNC_DIV_EXPR. * gcc.dg/bitint-114.c: New test.
2024-11-19testsuite: m68k: Fix tests for C23Andreas Schwab2-2/+2
* gcc.target/m68k/crash1.c (seq_printf): Add prototype. * gcc.target/m68k/pr63347.c (oof): Add missing parameter.
2024-11-19[PATCH] testsuite: Require C99 for pow-to-ldexp.cSoumya AR1-0/+1
pow-to-ldexp.c checks for calls to __builtin_ldexpf and __builtin_ldexpl, which will only be performed when the compiler knows the target has a C99 libm available. Modified the test to add a C99 runtime requirement. This fixes the failure on arm-eabi targets for this test case. Signed-off-by: Soumya AR <soumyaa@nvidia.com> gcc/testsuite/ChangeLog: * gcc.dg/tree-ssa/pow-to-ldexp.c: Require c99_runtime.
2024-11-18Regenerate config/avr/avr.opt.urlsDavid Malcolm1-0/+6
gcc/ChangeLog: * config/avr/avr.opt.urls: Regenerate for r15-5415-gc3db52bb47913a. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2024-11-19RISC-V: Remove unnecessary option for scalar SAT_TRUNC testcasePan Li25-48/+46
After we create a isolated folder to hold all SAT scalar test, we have fully control of what optimization options passing to the testcase. Thus, it is better to remove the unnecessary work around for flto option, as well as the -O3 option for each cases. The riscv.exp will pass sorts of different optimization options for each case. The below test suites are passed for this patch. * The rv64gcv fully regression test. It is test only patch and obvious up to a point, will commit it directly if no comments in next 48H. gcc/testsuite/ChangeLog: * gcc.target/riscv/sat/sat_u_trunc-1-u16.c: Remove flto dg-skip workaround and -O3 option. * gcc.target/riscv/sat/sat_u_trunc-1-u32.c: Ditto. * gcc.target/riscv/sat/sat_u_trunc-1-u64.c: Ditto. * gcc.target/riscv/sat/sat_u_trunc-1-u8.c: Ditto. * gcc.target/riscv/sat/sat_u_trunc-2-u16.c: Ditto. * gcc.target/riscv/sat/sat_u_trunc-2-u32.c: Ditto. * gcc.target/riscv/sat/sat_u_trunc-2-u64.c: Ditto. * gcc.target/riscv/sat/sat_u_trunc-2-u8.c: Ditto. * gcc.target/riscv/sat/sat_u_trunc-3-u16.c: Ditto. * gcc.target/riscv/sat/sat_u_trunc-3-u32.c: Ditto. * gcc.target/riscv/sat/sat_u_trunc-3-u64.c: Ditto. * gcc.target/riscv/sat/sat_u_trunc-3-u8.c: Ditto. * gcc.target/riscv/sat/sat_u_trunc-4-u16.c: Ditto. * gcc.target/riscv/sat/sat_u_trunc-4-u32.c: Ditto. * gcc.target/riscv/sat/sat_u_trunc-4-u64.c: Ditto. * gcc.target/riscv/sat/sat_u_trunc-4-u8.c: Ditto. * gcc.target/riscv/sat/sat_u_trunc-5-u16.c: Ditto. * gcc.target/riscv/sat/sat_u_trunc-5-u32.c: Ditto. * gcc.target/riscv/sat/sat_u_trunc-5-u64.c: Ditto. * gcc.target/riscv/sat/sat_u_trunc-5-u8.c: Ditto. * gcc.target/riscv/sat/sat_u_trunc-6-u16.c: Ditto. * gcc.target/riscv/sat/sat_u_trunc-6-u32.c: Ditto. * gcc.target/riscv/sat/sat_u_trunc-6-u64.c: Ditto. * gcc.target/riscv/sat/sat_u_trunc-6-u8.c: Ditto. * gcc.target/riscv/sat/scalar_sat_unary.h: New test. Signed-off-by: Pan Li <pan2.li@intel.com>
2024-11-19RISC-V: Rearrange the test files for scalar SAT_TRUNC [NFC]Pan Li48-0/+0
The test files of scalar SAT_TRUNC only has numbers as the suffix. Rearrange the file name to -{form number}-{target-type}. For example, test form 3 for uint32_t SAT_TRUNC will have -3-u32.c for asm check and -run-3-u32.c for the run test. Meanwhile, all related test files moved to riscv/sat/. The below test suites are passed for this patch. * The rv64gcv fully regression test. It is test only patch and obvious up to a point, will commit it directly if no comments in next 48H. gcc/testsuite/ChangeLog: * gcc.target/riscv/sat_u_trunc-2.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-1-u16.c: ...here. * gcc.target/riscv/sat_u_trunc-3.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-1-u32.c: ...here. * gcc.target/riscv/sat_u_trunc-4.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-1-u64.c: ...here. * gcc.target/riscv/sat_u_trunc-1.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-1-u8.c: ...here. * gcc.target/riscv/sat_u_trunc-6.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-2-u16.c: ...here. * gcc.target/riscv/sat_u_trunc-7.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-2-u32.c: ...here. * gcc.target/riscv/sat_u_trunc-8.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-2-u64.c: ...here. * gcc.target/riscv/sat_u_trunc-5.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-2-u8.c: ...here. * gcc.target/riscv/sat_u_trunc-10.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-3-u16.c: ...here. * gcc.target/riscv/sat_u_trunc-11.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-3-u32.c: ...here. * gcc.target/riscv/sat_u_trunc-12.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-3-u64.c: ...here. * gcc.target/riscv/sat_u_trunc-9.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-3-u8.c: ...here. * gcc.target/riscv/sat_u_trunc-14.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-4-u16.c: ...here. * gcc.target/riscv/sat_u_trunc-15.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-4-u32.c: ...here. * gcc.target/riscv/sat_u_trunc-16.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-4-u64.c: ...here. * gcc.target/riscv/sat_u_trunc-13.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-4-u8.c: ...here. * gcc.target/riscv/sat_u_trunc-18.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-5-u16.c: ...here. * gcc.target/riscv/sat_u_trunc-19.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-5-u32.c: ...here. * gcc.target/riscv/sat_u_trunc-20.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-5-u64.c: ...here. * gcc.target/riscv/sat_u_trunc-17.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-5-u8.c: ...here. * gcc.target/riscv/sat_u_trunc-22.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-6-u16.c: ...here. * gcc.target/riscv/sat_u_trunc-23.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-6-u32.c: ...here. * gcc.target/riscv/sat_u_trunc-24.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-6-u64.c: ...here. * gcc.target/riscv/sat_u_trunc-21.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-6-u8.c: ...here. * gcc.target/riscv/sat_u_trunc-run-2.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-run-1-u16.c: ...here. * gcc.target/riscv/sat_u_trunc-run-3.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-run-1-u32.c: ...here. * gcc.target/riscv/sat_u_trunc-run-4.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-run-1-u64.c: ...here. * gcc.target/riscv/sat_u_trunc-run-1.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-run-1-u8.c: ...here. * gcc.target/riscv/sat_u_trunc-run-6.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-run-2-u16.c: ...here. * gcc.target/riscv/sat_u_trunc-run-7.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-run-2-u32.c: ...here. * gcc.target/riscv/sat_u_trunc-run-8.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-run-2-u64.c: ...here. * gcc.target/riscv/sat_u_trunc-run-5.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-run-2-u8.c: ...here. * gcc.target/riscv/sat_u_trunc-run-10.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-run-3-u16.c: ...here. * gcc.target/riscv/sat_u_trunc-run-11.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-run-3-u32.c: ...here. * gcc.target/riscv/sat_u_trunc-run-12.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-run-3-u64.c: ...here. * gcc.target/riscv/sat_u_trunc-run-9.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-run-3-u8.c: ...here. * gcc.target/riscv/sat_u_trunc-run-14.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-run-4-u16.c: ...here. * gcc.target/riscv/sat_u_trunc-run-15.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-run-4-u32.c: ...here. * gcc.target/riscv/sat_u_trunc-run-16.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-run-4-u64.c: ...here. * gcc.target/riscv/sat_u_trunc-run-13.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-run-4-u8.c: ...here. * gcc.target/riscv/sat_u_trunc-run-18.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-run-5-u16.c: ...here. * gcc.target/riscv/sat_u_trunc-run-19.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-run-5-u32.c: ...here. * gcc.target/riscv/sat_u_trunc-run-20.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-run-5-u64.c: ...here. * gcc.target/riscv/sat_u_trunc-run-17.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-run-5-u8.c: ...here. * gcc.target/riscv/sat_u_trunc-run-22.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-run-6-u16.c: ...here. * gcc.target/riscv/sat_u_trunc-run-23.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-run-6-u32.c: ...here. * gcc.target/riscv/sat_u_trunc-run-24.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-run-6-u64.c: ...here. * gcc.target/riscv/sat_u_trunc-run-21.c: Move to... * gcc.target/riscv/sat/sat_u_trunc-run-6-u8.c: ...here. Signed-off-by: Pan Li <pan2.li@intel.com>
2024-11-19Flatten anonymous structs in CodeView typesMark Harmstone1-113/+167
If a CodeView struct, class, or union has as a member an anonymous struct, class, or union, this gets flattened. The sub-struct's members will appear as if they were part of their parent. For this, we move part of get_type_num_struct into a new function add_to_fieldlist, which also handles creating an LF_INDEX overflow item if an LF_FIELDLIST grows too large. This is because add_struct_member now calls itself recursively, and so needs to handle overflows itself. gcc/ * dwarf2codeview.cc (add_to_fieldlist): New function. (add_struct_member): Call recursively to flatten structs, and call add_to_fieldlist. (add_struct_static_member): Call add_to_fieldlist. (add_struct_function): Call add_to_fieldlist. (add_struct_inheritance): Call add_to_fieldlist. (add_struct_nested_type): Call add_to_fieldlist. (get_type_num_struct): Move code to add_to_fieldlist, and move responsibility for this to subfunctions.
2024-11-19Produce CodeView info about nested typesMark Harmstone1-1/+88
If the DIE for a struct, class, or union contains a nested type, add a LF_NESTTYPE entry to its field list recording this. Plus if we use a nested type, make sure that its parent also gets defined. This may entail adding a forward definition and creating a deferred type, so we need to call flush_deferred_types in codeview_debug_finish as well. gcc/ * dwarf2codeview.cc (enum cv_leaf_type): Add LF_NESTTYPE. (struct codeview_subtype): Add lf_nesttype to union. (flush_deferred_types): Add declaration. (write_lf_fieldlist): Handle LF_NESTTYPE. (codeview_debug_finish): Call flush_deferred_types. (add_struct_nested_type): New function. (get_type_num_struct): Call add_struct_nested_type, and if nested make that parent is added.
2024-11-19Daily bump.GCC Administrator8-1/+846
2024-11-18c: Allow bool and enum null pointer constants [PR112556]Joseph Myers3-0/+177
As reported in bug 112556, GCC wrongly rejects conversion of null pointer constants with bool or enum type to pointers in convert_for_assignment (assignment, initialization, argument passing, return). Fix the code there to allow BOOLEAN_TYPE and ENUMERAL_TYPE; it already allowed INTEGER_TYPE and BITINT_TYPE. This bug (together with -std=gnu23 meaning false has type bool rather than int) has in turn resulted in people thinking they need to fix code using false as a null pointer constant for C23 compatibility. While such a usage is certainly questionable, it has nothing to do with C23 compatibility and the right place for warnings about such usage is -Wzero-as-null-pointer-constant. I think it would be appropriate to extend -Wzero-as-null-pointer-constant to cover BOOLEAN_TYPE, ENUMERAL_TYPE and BITINT_TYPE (in all the various contexts in which that option generates warnings), though this patch doesn't do anything about that option. Bootstrapped with no regressions for x86-64-pc-linux-gnu. PR c/112556 gcc/c/ * c-typeck.cc (convert_for_assignment): Allow conversion of ENUMERAL_TYPE and BOOLEAN_TYPE null pointer constants to pointers. gcc/testsuite/ * gcc.dg/c11-null-pointer-constant-1.c, gcc.dg/c23-null-pointer-constant-1.c: New tests.
2024-11-18libdiagnostics: add a "sarif-replay" command-line tool [PR96032]David Malcolm37-7/+4352
This patch adds a new "sarif-replay" command-line tool for viewing .sarif files. It uses libdiagnostics to "replay" any diagnostics found in the .sarif files in text form as if they were GCC diagnostics. contrib/ChangeLog: PR other/96032 * regenerate-sarif-spec-index.py: New file. gcc/ChangeLog: PR other/96032 * Makefile.in (lang_checks): If libdiagnostics is enabled, add check-sarif-replay. (SARIF_REPLAY_OBJS): New. (ALL_HOST_OBJS): If libdiagnostics is enabled, add $(SARIF_REPLAY_OBJS). (sarif-replay): New. (install-libdiagnostics): Add sarif-replay to deps, and install it. * configure: Regenerate. * configure.ac (check_languages): If libdiagnostics is enabled, add check-sarif-replay. (LIBDIAGNOSTICS): If libdiagnostics is enabled, add sarif-replay. * doc/install.texi (--enable-libdiagnostics): Note that it also enables sarif-replay. * libsarifreplay.cc: New file. * libsarifreplay.h: New file. * sarif-replay.cc: New file. * sarif-spec-urls.def: New file. gcc/testsuite/ChangeLog: PR other/96032 * lib/gcc-dg.exp (gcc-dg-test-1): Add "replay-sarif". * lib/sarif-replay-dg.exp: New file. * lib/sarif-replay.exp: New file. * sarif-replay.dg/2.1.0-invalid/3.1-not-an-object.sarif: New test. * sarif-replay.dg/2.1.0-invalid/3.11.11-malformed-placeholder.sarif: New test. * sarif-replay.dg/2.1.0-invalid/3.11.11-missing-arguments-for-placeholders.sarif: New test. * sarif-replay.dg/2.1.0-invalid/3.11.11-not-enough-arguments-for-placeholders.sarif: New test. * sarif-replay.dg/2.1.0-invalid/3.13.2-no-version.sarif: New test. * sarif-replay.dg/2.1.0-invalid/3.13.2-version-not-a-string.sarif: New test. * sarif-replay.dg/2.1.0-invalid/3.13.4-bad-runs.sarif: New test. * sarif-replay.dg/2.1.0-invalid/3.13.4-no-runs.sarif: New test. * sarif-replay.dg/2.1.0-invalid/3.13.4-non-object-in-runs.sarif: New test. * sarif-replay.dg/2.1.0-invalid/3.27.10-bad-level.sarif: New test. * sarif-replay.dg/2.1.0-unhandled/3.27.10-none-level.sarif: New test. * sarif-replay.dg/2.1.0-valid/error-with-note.sarif: New test. * sarif-replay.dg/2.1.0-valid/escaped-braces.sarif: New test. * sarif-replay.dg/2.1.0-valid/null-runs.sarif: New test. * sarif-replay.dg/2.1.0-valid/signal-1.c.sarif: New test. * sarif-replay.dg/2.1.0-valid/spec-example-1.sarif: New test. * sarif-replay.dg/2.1.0-valid/spec-example-2.sarif: New test. * sarif-replay.dg/2.1.0-valid/spec-example-3.sarif: New test. * sarif-replay.dg/2.1.0-valid/spec-example-4.sarif: New test. * sarif-replay.dg/2.1.0-valid/tutorial-example.sarif: New test. * sarif-replay.dg/dg.exp: New script. * sarif-replay.dg/malformed-json/array-missing-comma.sarif: New test. * sarif-replay.dg/malformed-json/array-with-trailing-comma.sarif: New test. * sarif-replay.dg/malformed-json/bad-token.sarif: New test. * sarif-replay.dg/malformed-json/object-missing-comma.sarif: New test. * sarif-replay.dg/malformed-json/object-with-trailing-comma.sarif: New test. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2024-11-18json: add json parsing supportDavid Malcolm7-4/+2631
This patch implements JSON parsing support. It's based on the parsing parts of the patch I posted here: https://gcc.gnu.org/legacy-ml/gcc-patches/2017-08/msg00417.html with the parsing moved to a separate source file and header, heavily rewritten to capture source location information for JSON values, and to capture errors via a result template. I also added optional support for C and C++ style comments, which is extremely useful in DejaGnu tests. gcc/ChangeLog: * Makefile.in (OBJS-libcommon): Add json-parsing.o. * json-parsing.cc: New file. * json-parsing.h: New file. * json.cc (selftest::assert_print_eq): Remove "static". * json.h (json::array::begin): New. (json::array::end): New. (json::array::length): New. (json::array::get): New. (is_a_helper <json::value *>::test): New. (is_a_helper <const json::value *>::test): New. (is_a_helper <json::object *>::test): New. (is_a_helper <const json::object *>::test): New. (is_a_helper <json::array *>::test): New. (is_a_helper <const json::array *>::test): New. (is_a_helper <json::float_number *>::test): New. (is_a_helper <const json::float_number *>::test): New. (is_a_helper <json::integer_number *>::test): New. (is_a_helper <const json::integer_number *>::test): New. (is_a_helper <json::string *>::test): New. (is_a_helper <const json::string *>::test): New. (selftest::assert_print_eq): New decl. * selftest-run-tests.cc (selftest::run_tests): Call selftest::json_parser_cc_tests. * selftest.h (selftest::json_parser_cc_tests): New decl. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2024-11-18Add libdiagnostics (v4)David Malcolm73-4/+8208
This patch adds a new libdiagnostics shared library available as part of the GCC build via --enable-libdiagnostics when configuring GCC. It combines the following patches from: https://gcc.gnu.org/pipermail/gcc-patches/2024-November/668632.html [PATCH 1/8] libdiagnostics v4: header [PATCH 2/8] libdiagnostics v4: implementation [PATCH 3/8] libdiagnostics: add API docs [PATCH 4/8] libdiagnostics v4: add C++ wrapper API [PATCH 6/8] libdiagnostics v4: test suite ChangeLog: * configure.ac (--enable-libdiagnostics): New. * configure: Regenerate. gcc/ChangeLog: * configure.ac (check_languages): Add check-libdiagnostics. (--enable-libdiagnostics): New. * configure: Regenerate. * Makefile.in (enable_libdiagnostics): New. (lang_checks): If libdiagnostics is enabled, add check-libdiagnostics. (ALL_HOST_OBJS): If libdiagnostics is enabled, add $(libdiagnostics_OBJS). (start.encap): Add LIBDIAGNOSTICS. (libdiagnostics_OBJS): New. (LIBDIAGNOSTICS_VERSION_NUM): New, adapted from code in jit/Make-lang.in. (LIBDIAGNOSTICS_MINOR_NUM): Likewise. (LIBDIAGNOSTICS_RELEASE_NUM): Likewise. (LIBDIAGNOSTICS_FILENAME): Likewise. (LIBDIAGNOSTICS_IMPORT_LIB): Likewise. (libdiagnostics): Likewise. (LIBDIAGNOSTICS_AGE): Likewise. (LIBDIAGNOSTICS_BASENAME): Likewise. (LIBDIAGNOSTICS_SONAME): Likewise. (LIBDIAGNOSTICS_LINKER_NAME): Likewise. (LIBDIAGNOSTICS_COMMA): Likewise. (LIBDIAGNOSTICS_VERSION_SCRIPT_OPTION): Likewise. (LIBDIAGNOSTICS_SONAME_OPTION): Likewise. (LIBDIAGNOSTICS_SONAME_SYMLINK): Likewise. (LIBDIAGNOSTICS_LINKER_NAME_SYMLINK): Likewise. (LIBDIAGNOSTICS_FILENAME): Likewise. (libdiagnostics.serial): Likewise. (LIBDIAGNOSTICS_EXTRA_OPTS): Likewise. (install): If libdiagnostics is enabled, add install-libdiagnostics. (libdiagnostics.install-headers): New. (libdiagnostics.install-common): New, adapted from code in jit/Make-lang.in. (install-libdiagnostics): New. * diagnostic-format-text.h (diagnostic_text_output_format::get_location_text): Make public. * doc/install.texi (--enable-libdiagnostics): New. * doc/libdiagnostics/Makefile: New file. * doc/libdiagnostics/conf.py: New file. * doc/libdiagnostics/index.rst: New file. * doc/libdiagnostics/make.bat: New file. * doc/libdiagnostics/topics/diagnostic-manager.rst: New file. * doc/libdiagnostics/topics/diagnostics.rst: New file. * doc/libdiagnostics/topics/execution-paths.rst: New file. * doc/libdiagnostics/topics/fix-it-hints.rst: New file. * doc/libdiagnostics/topics/index.rst: New file. * doc/libdiagnostics/topics/logical-locations.rst: New file. * doc/libdiagnostics/topics/message-formatting.rst: New file. * doc/libdiagnostics/topics/metadata.rst: New file. * doc/libdiagnostics/topics/physical-locations.rst: New file. * doc/libdiagnostics/topics/retrofitting.rst: New file. * doc/libdiagnostics/topics/sarif.rst: New file. * doc/libdiagnostics/topics/text-output.rst: New file. * doc/libdiagnostics/topics/ux.rst: New file. * doc/libdiagnostics/tutorial/01-hello-world.rst: New file. * doc/libdiagnostics/tutorial/02-physical-locations.rst: New file. * doc/libdiagnostics/tutorial/03-logical-locations.rst: New file. * doc/libdiagnostics/tutorial/04-notes.rst: New file. * doc/libdiagnostics/tutorial/05-warnings.rst: New file. * doc/libdiagnostics/tutorial/06-fix-it-hints.rst: New file. * doc/libdiagnostics/tutorial/07-execution-paths.rst: New file. * doc/libdiagnostics/tutorial/index.rst: New file. * libdiagnostics++.h: New file. * libdiagnostics.cc: New file. * libdiagnostics.h: New file. * libdiagnostics.map: New file. gcc/testsuite/ChangeLog: * libdiagnostics.dg/libdiagnostics.exp: New, adapted from jit.exp. * libdiagnostics.dg/sarif.py: New. * libdiagnostics.dg/test-dump.c: New test. * libdiagnostics.dg/test-error-c.py: New test. * libdiagnostics.dg/test-error-with-note-c.py: New test. * libdiagnostics.dg/test-error-with-note.c: New test. * libdiagnostics.dg/test-error-with-note.cc: New test. * libdiagnostics.dg/test-error.c: New test. * libdiagnostics.dg/test-error.cc: New test. * libdiagnostics.dg/test-example-1.c: New test. * libdiagnostics.dg/test-fix-it-hint-c.py: New test. * libdiagnostics.dg/test-fix-it-hint.c: New test. * libdiagnostics.dg/test-fix-it-hint.cc: New test. * libdiagnostics.dg/test-helpers++.h: New test. * libdiagnostics.dg/test-helpers.h: New test. * libdiagnostics.dg/test-labelled-ranges.c: New test. * libdiagnostics.dg/test-labelled-ranges.cc: New test. * libdiagnostics.dg/test-labelled-ranges.py: New test. * libdiagnostics.dg/test-logical-location-c.py: New test. * libdiagnostics.dg/test-logical-location.c: New test. * libdiagnostics.dg/test-metadata-c.py: New test. * libdiagnostics.dg/test-metadata.c: New test. * libdiagnostics.dg/test-multiple-lines-c.py: New test. * libdiagnostics.dg/test-multiple-lines.c: New test. * libdiagnostics.dg/test-no-column-c.py: New test. * libdiagnostics.dg/test-no-column.c: New test. * libdiagnostics.dg/test-no-diagnostics-c.py: New test. * libdiagnostics.dg/test-no-diagnostics.c: New test. * libdiagnostics.dg/test-note-with-fix-it-hint-c.py: New test. * libdiagnostics.dg/test-note-with-fix-it-hint.c: New test. * libdiagnostics.dg/test-text-sink-options.c: New test. * libdiagnostics.dg/test-warning-c.py: New test. * libdiagnostics.dg/test-warning-with-path-c.py: New test. * libdiagnostics.dg/test-warning-with-path.c: New test. * libdiagnostics.dg/test-warning.c: New test. * libdiagnostics.dg/test-write-sarif-to-file-c.py: New test. * libdiagnostics.dg/test-write-sarif-to-file.c: New test. * libdiagnostics.dg/test-write-text-to-file.c: New test. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2024-11-18testsuite: move dg-test cleanup code from gcc-dg.exp to its own fileDavid Malcolm2-101/+117
I need to use this cleanup logic for the testsuite for libdiagnostics where it's too awkward to directly use gcc-dg.exp itself. No functional change intended. gcc/testsuite/ChangeLog: * lib/dg-test-cleanup.exp: New file, from material moved from lib/gcc-dg.exp. * lib/gcc-dg.exp: Add load_lib of dg-test-cleanup.exp. (cleanup-after-saved-dg-test): Move to lib/dg-test-cleanup.exp. (dg-test): Likewise for override. (initialize_prune_notes): Likewise. libatomic/ChangeLog: * testsuite/lib/libatomic.exp: Add "load_gcc_lib dg-test-cleanup.exp". libgomp/ChangeLog: * testsuite/lib/libgomp.exp: Add "load_gcc_lib dg-test-cleanup.exp". libitm/ChangeLog: * testsuite/lib/libitm.exp: Add "load_gcc_lib dg-test-cleanup.exp". libphobos/ChangeLog: * testsuite/lib/libphobos-dg.exp: Add "load_gcc_lib dg-test-cleanup.exp". libstdc++-v3/ChangeLog: * testsuite/lib/libstdc++.exp: Add "load_gcc_lib dg-test-cleanup.exp". libvtv/ChangeLog: * testsuite/lib/libvtv.exp: Add "load_gcc_lib dg-test-cleanup.exp". Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2024-11-18i386: Enable *rsqrtsf2_sse without TARGET_SSE_MATH [PR117357]Uros Bizjak2-1/+8
__builtin_ia32_rsqrtsf2 expander generates UNSPEC_RSQRT insn pattern also when TARGET_SSE_MATH is not set. Enable *rsqrtsf2_sse without TARGET_SSE_MATH to avoid ICE with unrecognizable insn. PR target/117357 gcc/ChangeLog: * config/i386/i386.md (*rsqrtsf2_sse): Also enable for !TARGET_SSE_MATH. gcc/testsuite/ChangeLog: * gcc.target/i386/pr117357.c: New test.
2024-11-18Fix test failures for enum-alias-{1,2,3} on arm-eabi [PR117419]Martin Uecker3-3/+3
The tests added for PR115157 fail on arm-eabi. Add __INT_MAX__ to enum to make sure they have size int. PR testsuite/117419 gcc/testsuite/ChangeLog: * gcc.dg/enum-alias-1.c: Add __INT_MAX__. * gcc.dg/enum-alias-2.c: Likewise. * gcc.dg/enum-alias-3.c: Likewise. Tested-by: Thiago Jung Bauermann <thiago.bauermann@linaro.org>
2024-11-18Add a timevar for late combineRichard Sandiford2-1/+2
When adding late-combine.cc, I forgot to add a timevar for it. gcc/ * timevar.def (TV_LATE_COMBINE): New timevar. * late-combine.cc (pass_data_late_combine): Use it.
2024-11-18aarch64: Improve early-ra handling of reductionsRichard Sandiford2-9/+113
At the moment, early-ra ducks out of allocating any region that contains a register with both a strong FPR affinity and a strong GPR affinity. The proper allocators are much better at handling that situation. But this means that early-ra tends not to allocate a region of vector code that ends in a reduction to a scalar integer if any later arithmetic is done on the scalar integer result. Currently, if a block acts as an isolated allocation region, the pass will try to split the block into subregions *between* instructions if there are no live FPRs or FPR allocnos. In the reduction case described above, it's convenient to try the same thing *within* instructions. If a block of vector code ends in a reduction, all FPRs and FPR allocnos will be dead between the "use phase" and the "def phase" of the reduction: the vector input will then have died, but the scalar result will not yet have been born. If we split the block that way, the problematic reduction result will be part of the second region, which we can skip allocating, but the vector work will be part of a separate region, which we might be able to allocate. This avoids a MOV in the testcase and also helps a small amount with x264. gcc/ * config/aarch64/aarch64-early-ra.cc (early_ra::IGNORE_REG): New flag. (early_ra::fpr_preference): Handle it. (early_ra::record_constraints): Fail the allocation if an IGNORE_REG output operand is not independent of the inputs. (defines_multi_def_pseudo): New function. (early_ra::could_split_region_here): New member function, split out from... (early_ra::process_block): ...here. Try splitting a block into multiple regions between the definition and use phases of an instruction. Set IGNORE_REG on the output registers if we do so. gcc/testsuite/ * gcc.target/aarch64/early_ra_1.c: New test.
2024-11-18aarch64: Extend early-ra splitting of single-block regionsRichard Sandiford1-3/+6
When early-ra treats a block as an isolated allocation region, it opportunistically splits the block into smaller regions at points where no FPRs or FPR allocnos are live. Previously it only did this if m_allocation_successful, since the contrary included cases in which the live range information wasn't trustworthy. After earlier patches, we should now be able to trust the live range information whenever m_accurate_live_ranges is true. This means that we can split the block into regions even if allocation failed for the current (sub)region. This is just something I noticed by inspection. I don't have a particular test case for it. gcc/ * config/aarch64/aarch64-early-ra.cc (early_ra::process_block): Check m_accurate_live_ranges rather than m_allocation_successful when deciding whether to split a block into multiple regions. Skip over subregions that we decide not to allocate.
2024-11-18aarch64: Relax early_ra treatment of modes_tieable_pRichard Sandiford1-2/+11
At least on aarch64, modes_tieable_p is a stricter condition than can_change_mode_class. can_change_mode_class tells us whether the subreg rules produce a sensible result for a particular mode change. modes_tieable_p in addition tells us whether a mode change is reasonable for optimisation purposes. A false return from either hook should (and does) prevent early_ra from attempting an allocation. But only a false return from can_change_mode_class should invalidate the liveness tracking; we can still analyse subregs for which can_change_mode_class is true and modes_tieable_p is false. This doesn't make a difference on its own, but it helps later patches. gcc/ * config/aarch64/aarch64-early-ra.cc (early_ra::get_allocno_subgroup): Split can_change_mode_class test out from modes_tieable_p test and only invalidate the live range information for the former.
2024-11-18aarch64: Improve early_ra dump informationRichard Sandiford1-5/+38
The early-ra pass often didn't print a dump message when aborting the allocation. This patch uses a similar helper to the previous patch. gcc/ * config/aarch64/aarch64-early-ra.cc (early_ra::record_allocation_failure): New member function. (early_ra::get_allocno_subgroup): Use it instead of setting m_allocation_successful directly. (early_ra::record_constraints): Likewise. (early_ra::allocate_colors): Likewise.
2024-11-18aarch64: Add early_ra::record_live_range_failureRichard Sandiford1-2/+37
So far, early_ra has used a single m_allocation_successful bool to record whether the current region is still being allocated. But there are (at least) two reasons why we might pull out of attempting an allocation: (1) We can't track the liveness of individual FP allocnos, due to some awkward subregs. (2) We're afraid of doing a worse job than the proper allocator. A later patch needs to distinguish (1) from other reasons, since (1) means that the liveness information is not trustworthy. (Currently we assume it is not trustworthy whenever m_allocation_successful is false, but that's too conservative.) gcc/ * config/aarch64/aarch64-early-ra.cc (early_ra::record_live_range_failure): New member function. (early_ra::m_accurate_live_ranges): New member variable. (early_ra::start_new_region): Set m_accurate_live_ranges to true. (early_ra::get_allocno_subgroup): Use record_live_range_failure to abort the allocation on invalid subregs.
2024-11-18aarch64: Split early_ra::record_insn_refsRichard Sandiford1-16/+30
record_insn_refs has three distinct phases: model the definitions, model any call, and model the uses. This patch splits each phase out into its own function. This isn't beneficial on its own, but it helps with later patches. gcc/ * config/aarch64/aarch64-early-ra.cc (early_ra::record_insn_refs): Split into... (early_ra::record_insn_defs, early_ra::record_insn_call) (early_ra::record_insn_uses): ...this new functions. (early_ra::process_block): Update accordingly.
2024-11-18diagnostics: add support for nested diagnostics [PR116253]David Malcolm19-22/+560
Previously the diagnostic subsystem supported a one-deep hierarchy via auto_diagnostic_group, for associating notes with the warning/error they annotate; this only affects SARIF output, not text output. This patch adds support to the diagnostics subsystem for capturing arbitrarily deep nesting structure within diagnostic messages. This patch: * adds the ability to express nesting internally when building diagnostics * captures the nesting in SARIF output in the form documented in SG15's P3358R0 ("SARIF for Structured Diagnostics") via a "nestingLevel" property * adds a new experimental mode to text output to see the hierarchy, via: -fdiagnostics-set-output=text:experimental-nesting=yes * adds test coverage via a plugin, which with the above option emits: • note: child 0 • note: grandchild 0 0 • note: grandchild 0 1 • note: grandchild 0 2 • note: child 1 • note: grandchild 1 0 • note: grandchild 1 1 • note: grandchild 1 2 • note: child 2 • note: grandchild 2 0 • note: grandchild 2 1 • note: grandchild 2 2 using '*' rather than '•' if the text_art::theme is ascii-only. My hope is to eventually: (a) use this to improve C++'s template diagnostics (b) remove the "experimental" caveat from the the text output mode but this patch doesn't touch the C++ frontend, leaving both of these to followup work. gcc/c-family/ChangeLog: PR other/116253 * c-opts.cc (c_diagnostic_text_finalizer): Use text_output.build_indent_prefix for prefix to diagnostic_show_locus. gcc/ChangeLog: PR other/116253 * diagnostic-core.h (class auto_diagnostic_nesting_level): New. * diagnostic-format-sarif.cc (class sarif_builder): Update leading comment re nesting of diagnostics. (sarif_result::on_nested_diagnostic): Add nestingLevel property. * diagnostic-format-text.cc (on_report_diagnostic): If we're showing nested diagnostics, then print changes of location on a new line, indented, and update m_last_location. (diagnostic_text_output_format::build_prefix): If m_show_nesting, then potentially add indentation and a bullet point. (get_bullet_point_unichar): New. (use_unicode_p): New. (diagnostic_text_output_format::build_indent_prefix): New. * diagnostic-format-text.h (diagnostic_text_output_format::diagnostic_text_output_format): Initialize m_show_nesting and m_show_nesting_levels. (diagnostic_text_output_format::build_indent_prefix): New decl. (diagnostic_text_output_format::show_nesting_p): New accessor (diagnostic_text_output_format::show_locations_in_nesting_p): Likewise. (diagnostic_text_output_format::set_show_nesting): New. (diagnostic_text_output_format::set_show_locations_in_nesting): New. (diagnostic_text_output_format::set_show_nesting_levels): New. (diagnostic_text_output_format::m_show_nesting): New field. (diagnostic_text_output_format::m_show_locations_in_nesting): New field. (diagnostic_text_output_format::m_show_nesting_levels): New field. * diagnostic-global-context.cc (auto_diagnostic_nesting_level::auto_diagnostic_nesting_level): New. (auto_diagnostic_nesting_level::~auto_diagnostic_nesting_level): New. * diagnostic-show-locus.cc (layout_printer::print): Temporarily set DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE. * diagnostic.cc (diagnostic_context::initialize): Update for renaming of m_nesting_depth to m_group_nesting_depth and initialize m_diagnostic_nesting_level. (diagnostic_context::finish): Update for renaming of m_nesting_depth to m_group_nesting_depth. (diagnostic_context::report_diagnostic): Likewise. (diagnostic_context::begin_group): Likewise. (diagnostic_context::end_group): Likewise. (diagnostic_context::push_nesting_level): New. (diagnostic_context::pop_nesting_level): New. (diagnostic_context::set_diagnostic_buffer): Update for renaming of m_nesting_depth to m_group_nesting_depth. Assert that we don't have nested diagnostics. * diagnostic.h (diagnostic_context::push_nesting_level): New decl. (diagnostic_context::pop_nesting_level): New decl. (diagnostic_context::get_diagnostic_nesting_level): New accessor. (diagnostic_context::build_indent_prefix): New decl. (diagnostic_context::m_diagnostic_groups): Rename m_nesting_depth to m_group_nesting_depth and add field m_diagnostic_nesting_level. * doc/invoke.texi (fdiagnostics-add-output): Add note about "experimental" schemes, keys, and values. Add keys "experimental-nesting", "experimental-nesting-show-locations", and "experimental-nesting-show-levels" to text scheme. * opts-diagnostic.cc (text_scheme_handler::make_sink): Add keys "experimental-nesting", "experimental-nesting-show-locations", and "experimental-nesting-show-levels". gcc/testsuite/ChangeLog: PR other/116253 * gcc.dg/plugin/diagnostic-test-nesting-sarif.c: New test. * gcc.dg/plugin/diagnostic-test-nesting-sarif.py: New test. * gcc.dg/plugin/diagnostic-test-nesting-text-indented-show-levels.c: New test. * gcc.dg/plugin/diagnostic-test-nesting-text-indented-unicode.c: New test. * gcc.dg/plugin/diagnostic-test-nesting-text-indented.c: New test. * gcc.dg/plugin/diagnostic-test-nesting-text-plain.c: New test. * gcc.dg/plugin/diagnostic_plugin_test_nesting.c: New test plugin. * gcc.dg/plugin/plugin.exp: Add the above. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2024-11-18PR modula2/117555: libgm2 build failure after r15-5081-g95960cd473297cGaius Mulley5-11/+19
This patch adds missing return statements to library procedure functions. These missing statements occur after a call to RAISE. gcc/m2/ChangeLog: PR modula2/117555 * gm2-libs-iso/M2EXCEPTION.mod (M2Exception): Add missing return statement. * gm2-libs-iso/RealConv.mod (ValueReal): Ditto. * gm2-libs-iso/RndFile.mod (StartPos): Ditto. (EndPos): Ditto. (NewPos): Ditto. * gm2-libs-iso/ShortConv.mod (ValueReal): Ditto. * gm2-libs-iso/WholeConv.mod (ValueInt): Ditto. (ValueCard): Ditto. Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
2024-11-18AVR: target/84211 - Add a post reload register optimization pass.Georg-Johann Lay16-112/+5053
This introduces a new post reload pass that tracks known values held in registers and performs optimizations based on that knowledge. It runs between the two instances of the RTL peephole pass. The optimizations are activated by new option -mfuse-move=<0,23> which provides a 3:2:2:2 mixed radix value: Digit 0: Activates try_fuse: Tries to use a MOVW instead of two LDIs. Digit 1: Activates try_bin_arg1: Simplify the 2nd operand of a binary operation, for example X xor Y can be simplified to X when Y = 0. When Y is an expensive constant that's already held in some register R, then the expression can be replaced by X xor R. Digit 2: Activates try_split_any: Split multi-byte operations like shifts into 8-bit instructions. Digit 3: Activates try_split_ldi: Decompose LDI-like insns into a sequence of instructions with better performance. For example, R2[4] = 0x1ff may be performed as: CLR R5 CLR R4 MOVW R2, R4 INC R3 DEC R2 Digit 3 can have a value of 0, 1 or 2, where value=2 may come up with code that performs better than with value=1 at the expense of reduced traceability of the generated assembly code. Here are some examples: Without optimization | With optimization ==================== | ================= long long fn_zero (void) { return 0; } ldi r18, 0 ; movqi_insn | ldi r18, 0 ; movqi_insn ldi r19, 0 ; movqi_insn | ldi r19, 0 ; movqi_insn ldi r20, 0 ; movqi_insn | movw r20, r18 ; *movhi ldi r21, 0 ; movqi_insn | ldi r22, 0 ; movqi_insn | movw r22, r18 ; *movhi ldi r23, 0 ; movqi_insn | ldi r24, 0 ; movqi_insn | movw r24, r18 ; *movhi ldi r25, 0 ; movqi_insn | ret | ret int fn_eq0 (char c) { return c == 0; } mov r18, r24 ; movqi_insn | mov r18, r24 ; movqi_insn ldi r24, 1 ; *movhi | ldi r24, 1 ; *movhi ldi r25, 0 | ldi r25, 0 cp r18, ZERO ; cmpqi3 | cpse r18, ZERO ; peephole breq .+4 ; branch | ldi r24, 0 ; *movhi | ldi r24, 0 ; movqi_insn ldi r25, 0 | ret | ret unsigned fn_crc (unsigned x, unsigned y) { for (char i = 8; i--; x <<= 1) y ^= (x ^ y) & 0x80 ? 79u : 0u; return y; } movw r18, r24 ; *movhi | movw r18, r24 ; *movhi movw r24, r22 ; *movhi | movw r24, r22 ; *movhi ldi r22, 8 ; movqi_insn | ldi r22, 8 ; movqi_insn .L13: | .L13: movw r30, r18 ; *movhi | movw r30, r18 ; *movhi eor r30, r24 ; *xorqi3 | eor r30, r24 ; *xorqi3 eor r31, r25 ; *xorqi3 | eor r31, r25 ; *xorqi3 mov r20, r30 ; *andhi3 | mov r20, r30 ; *andqi3 andi r20, 1<<7 | andi r20, 1<<7 clr r21 | sbrs r30, 7 ; *sbrx_branchhi | sbrc r30, 7 ; *sbrx_branchhi rjmp .+4 | ldi r20, 79 ; movqi_insn | ldi r20, 79 ; movqi_insn ldi r21, 0 ; movqi_insn | eor r24, r20 ; *xorqi3 | eor r24, r20 ; *xorqi3 eor r25, r21 ; *xorqi3 | lsl r18 ; *ashlhi3_const | lsl r18 ; *ashlhi3_const rol r19 | rol r19 subi r22, 1 ; *op8.for.cczn.p| subi r22, 1 ; *op8.for.cczn.plus brne .L13 ; branch_ZN | brne .L13 ; branch_ZN ret | ret #define SPDR (*(uint8_t volatile*) 0x2c) void fn_PR49807 (long big) { SPDR = big >> 24; SPDR = big >> 16; SPDR = big >> 8; SPDR = big; } movw r20, r22 ; *movhi | movw r20, r22 ; *movhi movw r22, r24 ; *movhi | movw r22, r24 ; *movhi mov r24, r23 ; *ashrsi3_const | clr r27 | sbrc r24,7 | com r27 | mov r25, r27 | mov r26, r27 | out 0xc, r24 ; movqi_insn | out 0xc, r23 ; movqi_insn movw r24, r22 ; *ashrsi3_const | clr r27 | sbrc r25, 7 | com r27 | mov r26, r27 | out 0xc, r24 ; movqi_insn | out 0xc, r24 ; movqi_insn clr r27 ; *ashrsi3_const | sbrc r23, 7 | dec r27 | mov r26, r23 | mov r25, r22 | mov r24, r21 | out 0xc, r24 ; movqi_insn | out 0xc, r21 ; movqi_insn out 0xc, r20 ; movqi_insn | out 0xc, r20 ; movqi_insn ret | ret PR target/84211 gcc/ * doc/invoke.texi (AVR Options) [-mfuse-move]: Document new option. * common/config/avr/avr-common.cc (avr_option_optimization_table): Set -mfuse-move= depending on optimization level. * config/avr/avr.opt (-mfuse-move, -mfuse-move=): New options. * config/avr/t-avr (avr-passes.o): Depend on avr-passes-fuse-move.h. * config/avr/avr-passes-fuse-move.h: New file, used by avr-passes.cc. * config/avr/avr-passes.def (avr_pass_fuse_move): Insert new pass. * config/avr/avr-passes.cc (INCLUDE_ARRAY): Define it. (insn-attr.h): Include it. (avr_pass_data_fuse_move): New const pass_data. (avr_pass_fuse_move): New public rtl_opt_pass class. (make_avr_pass_fuse_move): New function. (gprmask_t): New typedef. (next_nondebug_insn_bb, prev_nondebug_insn_bb) (single_set_with_scratch, size_to_mask, size_to_mode) (emit_valid_insn, emit_valid_move_clobbercc) (gpr_regno_p, regmask, has_bits_in) (find_arith, find_arith2, any_shift_p): New local functions. (AVRasm): New namespace. (FUSE_MOVE_MAX_MODESIZE): New define. (avr-passes-fuse-move.h): New include. (memento_t, absint_t, absins_byte_t, absint_val_t) (optimize_data_t, insn_optimizedata_t, find_plies_data_t) (insninfo_t, bbinfo_t, ply_t, plies_t): New structs / classes. * config/avr/avr-protos.h (avr_chunk, avr_byte, avr_word, avr_int8) (avr_uint8, avr_int16, avr_uint16) (avr_out_set_some, avr_set_some_operation) (output_reload_in_const, make_avr_pass_fuse_move): New protos. (avr_dump): Depend macro definition on GCC_DUMPFILE_H. * config/avr/avr.cc (avr_option_override): Insert after pass "avr-fuse-move" instead of after "peephole2". (avr_chunk, avr_byte, avr_word, avr_int8, avr_uint8, avr_int16) (avr_uint16, output_reload_in_const): Functions are no more static. (avr_out_set_some, avr_set_some_operation): New functions. (ashrqi3_out, ashlqi3_out) [offset=7]: Handle "r,r,C07" alternative. (avr_out_insert_notbit): Comment also allows QImode. (avr_adjust_insn_length) [ADJUST_LEN_SET_SOME]: Handle case. * config/avr/avr.md (adjust_len) <set_some>: New attribute value. (set_some): New insn. (andqi3, *andqi3): Add "r,r,Cb1" alternative. (ashrqi3, *ashrqi3 ashlqi3, *ashlqi3): Add a "r,r,C07" alternative. (gen_move_clobbercc_scratch): New emit helper. * config/avr/constraints.md (Cb1): New constraint. * config/avr/predicates.md (dreg_or_0_operand, set_some_operation): New. * config/avr/avr-log.cc (avr_forward_to_printf): New static func. (avr_log_vadump): Use it to recognize more formats. gcc/testsuite/ * gcc.target/avr/torture/test-gprs.h: New file. * gcc.target/avr/torture/pr84211-fuse-move-1.c: New test. * gcc.target/avr/torture/pr84211-fuse-move-2.c: New test.
2024-11-18Fortran: add bounds-checking for ALLOCATE of CHARACTER with type-spec [PR53357]Harald Anlauf6-13/+77
Fix a rejects-(potentially)-valid code for ALLOCATE of CHARACTER with type-spec, and implement a string-length check for -fcheck=bounds. Implement more detailed errors or warnings when character function declarations and references do not match. PR fortran/53357 gcc/fortran/ChangeLog: * dependency.cc (gfc_dep_compare_expr): Return correct result if relationship of expressions could not be determined. * interface.cc (gfc_check_result_characteristics): Implement error messages if character function declations and references do not agree, else emit warning in cases where a mismatch is suspected. * trans-stmt.cc (gfc_trans_allocate): Implement a string length check for -fcheck=bounds. gcc/testsuite/ChangeLog: * gfortran.dg/auto_char_len_4.f90: Adjust patterns. * gfortran.dg/typebound_override_1.f90: Likewise. * gfortran.dg/bounds_check_strlen_10.f90: New test.
2024-11-18tree-optimization/117594 - fix live op vectorization for length masked caseRichard Biener2-1/+22
The code was passing factor == 0 to vect_get_loop_len which always returns an unmodified length, even if the number of scalar elements doesn't agree. It also failed to insert the eventually generated code. PR tree-optimization/117594 * tree-vect-loop.cc (vectorizable_live_operation_1): Pass factor == 1 to vect_get_loop_len, insert generated stmts. * gcc.dg/vect/pr117594.c: New testcase.
2024-11-18[committed][RISC-V][PR target/117595] Fix bogus use of simplify_gen_subregJeff Law3-2/+7
And stage3 begins... Zdenek's fuzzer caught this one. Essentially using simplify_gen_subreg directly with an offset of 0 when we just needed a lowpart. The offset of 0 works for little endian, but for big endian it's simply wrong. simplify_gen_subreg will return NULL_RTX because the case isn't representable. We then embed that NULL_RTX into an insn that's later scanned during mark_jump_label. Scanning the port I see a couple more instances of this incorrect idiom. One is pretty obvious to fix. The others look a bit goofy and I'll probably need to sync with Patrick on them. Anyway tested on riscv64-elf and riscv32-elf with no regressions. Pushing to the trunk. PR target/117595 gcc/ * config/riscv/sync.md (atomic_compare_and_swap<mode>): Use gen_lowpart rather than simplify_gen_subreg. * config/riscv/riscv.cc (riscv_legitimize_move): Similarly. gcc/testsuite/ * gcc.target/riscv/pr117595.c: New test.
2024-11-18PR modula2/117660: Errors referring to variables of type array could display ↵Gaius Mulley5-24/+41
full declaration This patch ensures that the tokens defining the full declaration of an ARRAY type is stored in the symbol table and used during production of error messages. gcc/m2/ChangeLog: PR modula2/117660 * gm2-compiler/P2Build.bnf (ArrayType): Update tok with the composite token produced during array type declaration. * gm2-compiler/P2SymBuild.mod (EndBuildArray): Create the combinedtok and store it into the symbol table. Also ensure combinedtok is pushed to the quad stack. (BuildFieldArray): Preserve typetok. * gm2-compiler/SymbolTable.def (PutArray): Rename parameters. * gm2-compiler/SymbolTable.mod (PutArray): Rename parameters. gcc/testsuite/ChangeLog: PR modula2/117660 * gm2/iso/fail/arraymismatch.mod: New test. Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
2024-11-18AVR: target/117659 - Fix wrong code for u24 << 16.Georg-Johann Lay1-1/+1
gcc/ PR target/117659 * config/avr/avr.cc (avr_out_ashlpsi3) [case 16]: Use %A1 as input (instead of bogus %A0).
2024-11-18PR modula2/117371: Add check for zero step in for loopGaius Mulley2-8/+34
This patch is a follow on from PR modula2/117371 which could include a check to enforce the ISO restriction on a zero for loop step. gcc/m2/ChangeLog: PR modula2/117371 * gm2-compiler/M2GenGCC.mod (PerformLastForIterator): Add check for zero step value and issue an error message. gcc/testsuite/ChangeLog: PR modula2/117371 * gm2/iso/fail/forloopbyzero.mod: New test. Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
2024-11-18ada: Fix interaction of aspect Predicate and static case expressionsEric Botcazou1-25/+18
The semantics of the GNAT-specific Predicate aspect should be equivalent to those of the Static_Predicate aspect when the predicate expression is static, but that is not correctly implemented for static case expressions. gcc/ada/ChangeLog: * exp_ch4.adb (Expand_N_Case_Expression): Remove the test on enclosing predicate function for the return optimization. Rewrite it in the general case to catch all nondynamic predicates. (Expand_N_If_Expression): Remove the test on enclosing predicate function for the return optimization.
2024-11-18ada: Atomic_Synchronization is not a user-visible checkBob Duff13-101/+66
Remove all user-level documentation of the check name "Atomic_Synchronization". The documentation was confusing because this check should never be used in source code, and because it raises the question of whether All_Checks applies to it (it does not). Change the name Atomic_Synchronization to be _Atomic_Synchronization (with a leading underscore) so that it cannot be used in source code. This "check" is not really a check at all; it is used only internally in the implementation of Disable/Enable_Atomic_Synchronization, because the placement and scope of these pragmas match pragma Suppress. gcc/ada/ChangeLog: * doc/gnat_rm/implementation_defined_characteristics.rst: Remove Atomic_Synchronization. * doc/gnat_ugn/building_executable_programs_with_gnat.rst: Likewise. * doc/gnat_rm/implementation_defined_pragmas.rst: DRY. Consolidate documentation of Disable/Enable_Atomic_Synchronization. * checks.adb: Comment fix. * exp_util.ads: Likewise. * targparm.ads: Likewise. * types.ads: Likewise. * gnat1drv.adb: Likewise. DRY. * sem_prag.adb (Process_Disable_Enable_Atomic_Sync): Change name of Atomic_Synchronization to start with underscore. (Process_Suppress_Unsuppress): No need to check Comes_From_Source for Atomic_Synchronization anymore; _Atomic_Synchronization can never come from source. (Anyway, it shouldn't be ignored; it should be an error.) * snames.ads-tmpl (Atomic_Synchronization): Change name to start with underscore. * switch-c.adb (Scan_Front_End_Switches): Minor cleanup: Use 'in'. * gnat_rm.texi: Regenerate. * gnat_ugn.texi: Regenerate.
2024-11-18ada: Fix small oversight in removal of N_Unchecked_Expression nodeEric Botcazou1-0/+3
In addition to Resolve_Indexed_Component, Eval_Indexed_Component can also set the Do_Range_Check flag on the expressions of an N_Indexed_Component node through the call on Check_Non_Static_Context, so this also needs to be blocked by the Kill_Range_Check flag. gcc/ada/ChangeLog: * sem_eval.adb (Eval_Indexed_Component): Clear Do_Range_Check on the expressions if Kill_Range_Check is set on the node.