Commit graph

209828 commits

Author SHA1 Message Date
David Malcolm
7a49d5dc0e analyzer: add SARIF property bags to -Wanalyzer-overlapping-buffers
gcc/analyzer/ChangeLog:
	* call-details.cc: Include "diagnostic-format-sarif.h".
	(overlapping_buffers::overlapping_buffers): Add params for new
	fields.
	(overlapping_buffers::maybe_add_sarif_properties): New.
	(overlapping_buffers::m_byte_range_a): New field.
	(overlapping_buffers::byte_range_b): New field.
	(overlapping_buffers::m_num_bytes_read_sval): New field.
	(call_details::complain_about_overlap): Pass new params to
	overlapping_buffers ctor.
	* ranges.cc (symbolic_byte_offset::to_json): New.
	(symbolic_byte_range::to_json): New.
	* ranges.h (symbolic_byte_offset::to_json): New decl.
	(symbolic_byte_range::to_json): New decl.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2024-04-10 16:43:28 -04:00
David Malcolm
115d5c6b00 analyzer: show size in SARIF property bag for -Wanalyzer-tainted-allocation-size
gcc/analyzer/ChangeLog:
	* sm-taint.cc (tainted_allocation_size::tainted_allocation_size):
	Add "size_in_bytes" param.
	(tainted_allocation_size::maybe_add_sarif_properties): New.
	(tainted_allocation_size::m_size_in_bytes): New field.
	(region_model::check_dynamic_size_for_taint): Pass size_in_bytes
	to tainted_allocation_size ctor.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2024-04-10 16:43:28 -04:00
David Malcolm
7f6599a201 analyzer: fixes to internal docs
gcc/ChangeLog:
	* doc/analyzer.texi: Various tweaks.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2024-04-10 16:43:28 -04:00
David Malcolm
082374f657 analyzer, testuite: comment fixes
gcc/testsuite/ChangeLog:
	* c-c++-common/analyzer/memset-1.c: Clarify some comments.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2024-04-10 16:43:27 -04:00
David Malcolm
d09d70cdb2 testsuite: add some missing -fanalyzer to plugin tests
gcc/testsuite/ChangeLog:
	* gcc.dg/plugin/copy_from_user-1.c: Add missing directives for an
	analyzer test.
	* gcc.dg/plugin/taint-CVE-2011-0521-1-fixed.c: Add missing
	-fanalyzer to options.
	* gcc.dg/plugin/taint-CVE-2011-0521-1.c: Likewise.
	* gcc.dg/plugin/taint-CVE-2011-0521-2-fixed.c: Likewise.
	(dvb_usercopy): Add default case to avoid complaints about NULL
	derefs.
	* gcc.dg/plugin/taint-CVE-2011-0521-2.c: Likewise.
	* gcc.dg/plugin/taint-CVE-2011-0521-3-fixed.c: Add missing
	-fanalyzer to options.
	* gcc.dg/plugin/taint-CVE-2011-0521-3.c: Likewise.  Drop
	xfail.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2024-04-10 16:43:27 -04:00
Joseph Myers
19b98410eb Regenerate gcc.pot
* gcc.pot: Regenerate.
2024-04-10 17:11:07 +00:00
Harald Anlauf
ded646c91d Fortran: fix argument checking of intrinsics C_SIZEOF, C_F_POINTER [PR106500]
The interpretation of the F2018 standard regarding valid arguments to the
intrinsic C_SIZEOF(X) was clarified in an edit to 18-007r1:

  https://j3-fortran.org/doc/year/22/22-101r1.txt

loosening restrictions and giving examples.  The F2023 text has:

! F2023:18.2.3.8  C_SIZEOF (X)
!
!   X shall be a data entity with interoperable type and type parameters,
!   and shall not be an assumed-size array, an assumed-rank array that
!   is associated with an assumed-size array, an unallocated allocatable
!   variable, or a pointer that is not associated.

where

! 3.41 data entity
!   data object, result of the evaluation of an expression, or the
!   result of the execution of a function reference

Update the checking code for interoperable arguments accordingly, and extend
to reject functions returning pointer as FPTR argument to C_F_POINTER.

gcc/fortran/ChangeLog:

	PR fortran/106500
	* check.cc (is_c_interoperable): Fix checks for C_SIZEOF.
	(gfc_check_c_f_pointer): Reject function returning a pointer as FPTR,
	and improve an error message.

gcc/testsuite/ChangeLog:

	PR fortran/106500
	* gfortran.dg/c_sizeof_6.f90: Remove wrong dg-error.
	* gfortran.dg/sizeof_2.f90: Adjust pattern.
	* gfortran.dg/c_f_pointer_tests_9.f90: New test.
	* gfortran.dg/c_sizeof_7.f90: New test.
2024-04-10 18:44:05 +02:00
Richard Biener
912753cc5f tree-optimization/114672 - WIDEN_MULT_PLUS_EXPR type mismatch
The following makes sure to restrict WIDEN_MULT*_EXPR to a mode
precision final compute type as the mode is used to find the optab
and type checking chokes when seeing bit-precisions later which
would likely also not properly expanded to RTL.

	PR tree-optimization/114672
	* tree-ssa-math-opts.cc (convert_plusminus_to_widen): Only
	allow mode-precision results.

	* gcc.dg/torture/pr114672.c: New testcase.
2024-04-10 18:43:24 +02:00
Andre Vieira
5aa3fec38c aarch64: Add support for _BitInt
This patch adds support for C23's _BitInt for the AArch64 port when compiling
for little endianness.  Big Endianness requires further target-agnostic
support and we therefor disable it for now.

gcc/ChangeLog:

	* config/aarch64/aarch64.cc (TARGET_C_BITINT_TYPE_INFO): Declare MACRO.
	(aarch64_bitint_type_info): New function.
	(aarch64_return_in_memory_1): Return large _BitInt's in memory.
	(aarch64_function_arg_alignment): Adapt to correctly return the ABI
	mandated alignment of _BitInt(N) where N > 128 as the alignment of
	TImode.
	(aarch64_composite_type_p): Return true for _BitInt(N), where N > 128.

libgcc/ChangeLog:

	* config/aarch64/t-softfp (softfp_extras): Add floatbitinthf,
	floatbitintbf, floatbitinttf and fixtfbitint.
	* config/aarch64/libgcc-softfp.ver (GCC_14.0.0): Add __floatbitinthf,
	__floatbitintbf, __floatbitinttf and __fixtfbitint.

gcc/testsuite/ChangeLog:

	* gcc.target/aarch64/bitint-alignments.c: New test.
	* gcc.target/aarch64/bitint-args.c: New test.
	* gcc.target/aarch64/bitint-sizes.c: New test.
	* gcc.target/aarch64/bitfield-bitint-abi.h: New header.
	* gcc.target/aarch64/bitfield-bitint-abi-align16.c: New test.
	* gcc.target/aarch64/bitfield-bitint-abi-align8.c: New test.
2024-04-10 16:47:15 +01:00
Andre Vieira
3a787e038f aarch64: Do not give ABI change diagnostics for _BitInt(N)
This patch makes sure we do not give ABI change diagnostics for the ABI breaks
of GCC 9, 13 and 14 for any type involving _BitInt(N), since that type did not
exist before this GCC version.

gcc/ChangeLog:

	* config/aarch64/aarch64.cc (bitint_or_aggr_of_bitint_p): New function.
	(aarch64_layout_arg): Don't emit diagnostics for types involving
	_BitInt(N).
2024-04-10 16:38:49 +01:00
Jonathan Wakely
4decc1062f
libstdc++: Adjust expected locale-dependent date formats in tests
The std/time/year_month_day/io.cc test assumes that %x in the fr_FR
locale is %d/%m/%Y but on FreeBSD it is %d.%m.%Y instead. Make the test
PASS for either format.

Similarly, 27_io/manipulators/extended/get_time/char/2.cc expects that
%a in the de_DE locale is "Di" but on FreeBSD it's "Di." with a trailing
period. Adjust the input string to be "1971 Di." instead of "Di 1971"
and that way if %a doesn't expect the trailing '.' it simply won't
extract it from the stream.

This fixes:
FAIL: std/time/year_month_day/io.cc  -std=gnu++20 execution test
FAIL: 27_io/manipulators/extended/get_time/char/2.cc  -std=gnu++17 execution test

libstdc++-v3/ChangeLog:

	* testsuite/27_io/manipulators/extended/get_time/char/2.cc:
	Adjust input string so that it matches %a with or without a
	trailing period.
	* testsuite/std/time/year_month_day/io.cc: Adjust expected
	format for %x in the fr_FR locale.
2024-04-10 16:14:25 +01:00
Jonathan Wakely
9586d6248e
libstdc++: Handle EMLINK and EFTYPE in std::filesystem::remove_all
Although POSIX requires ELOOP, FreeBSD documents that openat with
O_NOFOLLOW returns EMLINK if the last component of a filename is a
symbolic link.  Check for EMLINK as well as ELOOP, so that the TOCTTOU
mitigation in remove_all works correctly.

See https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=214633 or the
FreeBSD man page for reference.

According to its man page, DragonFlyBSD also uses EMLINK for this error,
and NetBSD uses its own EFTYPE. OpenBSD follows POSIX and uses EMLINK.

This fixes these failures on FreeBSD:
FAIL: 27_io/filesystem/operations/remove_all.cc  -std=gnu++17 execution test
FAIL: experimental/filesystem/operations/remove_all.cc  -std=gnu++17 execution test

libstdc++-v3/ChangeLog:

	* src/c++17/fs_ops.cc (remove_all) [__FreeBSD__ || __DragonFly__]:
	Check for EMLINK as well as ELOOP.
	[__NetBSD__]: Check for EFTYPE as well as ELOOP.
2024-04-10 12:58:28 +01:00
Jakub Jelinek
4be1cc5f50 c++: Implement C++26 P2809R3 - Trivial infinite loops are not Undefined Behavior
The following patch attempts to implement P2809R3, which has been voted
in as a DR.

The middle-end has its behavior documented:
'-ffinite-loops'
     Assume that a loop with an exit will eventually take the exit and
     not loop indefinitely.  This allows the compiler to remove loops
     that otherwise have no side-effects, not considering eventual
     endless looping as such.

     This option is enabled by default at '-O2' for C++ with -std=c++11
     or higher.

So, the following patch attempts to detect trivial infinite loops by detecting
trivially empty loops, if their condition is not INTEGER_CST (that case is
handled by the middle-end right already) trying to constant evaluate with
mce=true their condition and if it evaluates to true (and -ffinite-loops and
not processing_template_decl) wraps the condition into an ANNOTATE_EXPR which
tells the middle-end that the loop shouldn't be loop->finite_p despite
-ffinite-loops).

Furthermore, the patch adds -Wtautological-compare warnings for loop
conditions containing std::is_constant_evaluated(), either if those
always evaluate to true, or always evaluate to false, or will evaluate
to true just when checking if it is trivial infinite loop (and if in non-constexpr
function also say that it will evaluate to false otherwise).
The user is doing something weird in all those cases.

2024-04-10  Jakub Jelinek  <jakub@redhat.com>

	PR c++/114462
gcc/
	* tree-core.h (enum annot_expr_kind): Add
	annot_expr_maybe_infinite_kind enumerator.
	* gimplify.cc (gimple_boolify): Handle annot_expr_maybe_infinite_kind.
	* tree-cfg.cc (replace_loop_annotate_in_block): Likewise.
	(replace_loop_annotate): Likewise.  Move loop->finite_p initialization
	before the replace_loop_annotate_in_block calls.
	* tree-pretty-print.cc (dump_generic_node): Handle
	annot_expr_maybe_infinite_kind.
gcc/cp/
	* semantics.cc: Implement C++26 P2809R3 - Trivial infinite
	loops are not Undefined Behavior.
	(maybe_warn_for_constant_evaluated): Add trivial_infinite argument
	and emit special diagnostics for that case.
	(finish_if_stmt_cond): Adjust caller.
	(finish_loop_cond): New function.
	(finish_while_stmt): Use it.
	(finish_do_stmt): Likewise.
	(finish_for_stmt): Likewise.
gcc/testsuite/
	* g++.dg/cpp26/trivial-infinite-loop1.C: New test.
	* g++.dg/cpp26/trivial-infinite-loop2.C: New test.
	* g++.dg/cpp26/trivial-infinite-loop3.C: New test.
2024-04-10 10:19:04 +02:00
Kewen Lin
4923ed49b9 testsuite: Adjust pr113359-2_*.c with unsigned long long [PR114662]
pr113359-2_*.c define a struct having unsigned long type
members ay and az which have 4 bytes size at -m32, while
the related constants CL1 and CL2 used for equality check
are always 8 bytes, it makes compiler consider the below

  69   if (a.ay != CL1)
  70     __builtin_abort ();

always to abort and optimize away the following call to
getb, which leads to the expected wpa dumping on
"Semantic equality" missing.

This patch is to modify the types with unsigned long long
accordingly.

	PR testsuite/114662

gcc/testsuite/ChangeLog:

	* gcc.dg/lto/pr113359-2_0.c: Use unsigned long long instead of
	unsigned long.
	* gcc.dg/lto/pr113359-2_1.c: Likewise.
2024-04-10 03:00:31 -05:00
Richard Biener
109f1b28fc Revert "combine: Don't combine if I2 does not change"
This reverts commit 839bc42772.
2024-04-10 07:57:03 +02:00
Peter Bergner
7924e35252 rs6000: Replace OPTION_MASK_DIRECT_MOVE with OPTION_MASK_P8_VECTOR [PR101865]
This is a cleanup patch in preparation to fixing the real bug in PR101865.
TARGET_DIRECT_MOVE is redundant with TARGET_P8_VECTOR, so alias it to that.
Also replace all usages of OPTION_MASK_DIRECT_MOVE with OPTION_MASK_P8_VECTOR
and delete the now dead mask.

2024-04-09  Peter Bergner  <bergner@linux.ibm.com>

gcc/
	PR target/101865
	* config/rs6000/rs6000.h (TARGET_DIRECT_MOVE): Define.
	* config/rs6000/rs6000.cc (rs6000_option_override_internal): Replace
	OPTION_MASK_DIRECT_MOVE with OPTION_MASK_P8_VECTOR.  Delete redundant
	OPTION_MASK_DIRECT_MOVE usage.  Delete TARGET_DIRECT_MOVE dead code.
	(rs6000_opt_masks): Neuter the "direct-move" option.
	* config/rs6000/rs6000-c.cc (rs6000_target_modify_macros): Replace
	OPTION_MASK_DIRECT_MOVE with OPTION_MASK_P8_VECTOR.  Delete useless
	comment.
	* config/rs6000/rs6000-cpus.def (ISA_2_7_MASKS_SERVER): Delete
	OPTION_MASK_DIRECT_MOVE.
	(OTHER_VSX_VECTOR_MASKS): Likewise.
	(POWERPC_MASKS): Likewise.
	* config/rs6000/rs6000.opt (mdirect-move): Remove Mask and Var.
2024-04-09 21:39:53 -05:00
Nathaniel Shead
0774240b4d c++: Keep DECL_SAVED_TREE of cdtor instantiations in modules [PR104040]
A template instantiation still needs to have its DECL_SAVED_TREE so that
its definition is emitted into the CMI. This way it can be emitted in
the object file of any importers that use it, in case it doesn't end up
getting emitted in this TU.

This is true even for maybe-in-charge functions, because we don't
currently stream the clones directly but instead regenerate them from
this function.

	PR c++/104040

gcc/cp/ChangeLog:

	* semantics.cc (expand_or_defer_fn_1): Keep DECL_SAVED_TREE for
	all vague linkage cdtors with modules.

gcc/testsuite/ChangeLog:

	* g++.dg/modules/pr104040_a.C: New test.
	* g++.dg/modules/pr104040_b.C: New test.

Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com>
Reviewed-by: Jason Merrill <jason@redhat.com>
2024-04-10 11:40:32 +10:00
Hongyu Wang
ea665f9026 [APX] Prohibit SHA/KEYLOCKER usage of EGPR when APX enabled
The latest APX spec announced removal of SHA/KEYLOCKER evex promotion,
which means the SHA/KEYLOCKER insn does not support EGPR when APX
enabled. Update the corresponding constraints to their EGPR-disabled
counterparts.

gcc/ChangeLog:

	* config/i386/sse.md (sha1msg1): Use "ja" instead of "Bm" for
	memory constraint.
	(sha1msg2): Likewise.
	(sha1nexte): Likewise.
	(sha1rnds4): Likewise.
	(sha256msg1): Likewise.
	(sha256msg2): Likewise.
	(sha256rnds2): Likewise.
	(aes<aesklvariant>u8): Use "jm" instead of "m" for memory
	constraint.
	(*aes<aeswideklvariant>u8): Likewise.
	(*encodekey128u32): Use "jr" instead of "r" for register
	constraints.
	(*encodekey256u32): Likewise.
2024-04-10 09:13:07 +08:00
Nathaniel Shead
77c0b5b23f c++: Track declarations imported from partitions [PR99377]
The testcase in comment 15 of the linked PR is caused because the
following assumption in depset:#️⃣:make_dependency doesn't hold:

  if (DECL_LANG_SPECIFIC (not_tmpl)
      && DECL_MODULE_IMPORT_P (not_tmpl))
    {
      /* Store the module number and index in cluster/section,
         so we don't have to look them up again.  */
      unsigned index = import_entity_index (decl);
      module_state *from = import_entity_module (index);
      /* Remap will be zero for imports from partitions, which
         we want to treat as-if declared in this TU.  */
      if (from->remap)
        {
          dep->cluster = index - from->entity_lwm;
          dep->section = from->remap;
          dep->set_flag_bit<DB_IMPORTED_BIT> ();
        }
    }

This is because at least for template specialisations, we first see the
declaration in the header unit imported from the partition, and then the
instantiation provided by the partition itself.  This means that the
'import_entity_index' lookup doesn't report that the specialisation was
declared in the partition and thus should be considered as-if it was
part of the TU, and get emitted into the CMI.

We always need to emit definitions from module partitions into the
primary module interface's CMI, as unlike with other kinds of transitive
imports the built CMIs for module partitions are not visible to
importers.

To fix this, this patch allows, as a special case for installing an
entity from a partition, to overwrite the entity_map entry with the
(later) index into the partition so that this assumption holds again.

We only do this for the first time we override with a partition, so that
entities are at least still reported as originating from the first
imported partition that declares them (rather than the last); existing
tests check for this and this seems to be a friendlier approach to go
for, albeit slightly more expensive.

	PR c++/99377

gcc/cp/ChangeLog:

	* module.cc (trees_in::install_entity): Overwrite entity map
	index if installing from a partition.

gcc/testsuite/ChangeLog:

	* g++.dg/modules/pr99377-3_a.H: New test.
	* g++.dg/modules/pr99377-3_b.C: New test.
	* g++.dg/modules/pr99377-3_c.C: New test.
	* g++.dg/modules/pr99377-3_d.C: New test.

Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com>
2024-04-10 10:40:36 +10:00
GCC Administrator
0753ae158a Daily bump. 2024-04-10 00:16:50 +00:00
Jonathan Wakely
92b38ec84f
libstdc++: Fix build for targets without FP std::from_chars [PR114633]
If the faster std::from_chars is not supported for floating-point types
then just extract the value from the stream using operator>>.

This fixes a build error for targets where __cpp_lib_to_chars is not
defined.

libstdc++-v3/ChangeLog:

	PR libstdc++/114633
	* include/bits/chrono_io.h (_Parser::operator()) <'S'>: Use
	stream extraction if std::from_chars is not available.
2024-04-10 00:21:41 +01:00
David Faust
639215c5eb btf: improve btf-datasec-3.c test [PR114642]
This test failed on powerpc --target_board=unix'{-m32}' because two
variables were not placed in sections where the test silently (and
incorrectly) assumed they would be.

The important thing for the test is only that BTF_KIND_DATASEC entries
are NOT generated for the extern variable declarations without an
explicit section attribute.  Make the test more robust by placing the
non-extern variables in explicit sections, and invert the checks to
more accurately verify what we care about in this test.

gcc/testsuite/
	PR testsuite/114642
	* gcc.dg/debug/btf/btf-datasec-3.c: Make test more robust on different
	architectures.
2024-04-09 11:11:42 -07:00
Juergen Christ
1f719aa7c0 s390x: Optimize vector permute with constant indexes
Loop vectorizer can generate vector permutes with constant indexes
where all indexes are equal.  Optimize this case to use vector
replicate instead of vector permute.

gcc/ChangeLog:

	* config/s390/s390.cc (expand_perm_as_replicate): Implement.
	(vectorize_vec_perm_const_1): Call new function.
	* config/s390/vx-builtins.md (vec_splat<mode>): Change to...
	(@vec_splat<mode>): ...this.

gcc/testsuite/ChangeLog:

	* gcc.target/s390/vector/vec-expand-replicate.c: New test.

Signed-off-by: Juergen Christ <jchrist@linux.ibm.com>
2024-04-09 18:06:05 +02:00
David Faust
8075477f81 btf: emit symbol refs in DATASEC entries only for BPF [PR114608]
The behavior introduced in
  fa60ac5496 btf: Emit labels in DATASEC bts_offset entries.

is only fully correct when compiling for the BPF target with BPF CO-RE
enabled.  In other cases, depending on optimizations, it can result in
an incorrect symbol reference in the entry bts_offset field for a symbol
which may not be emitted at all, causing link-time undefined symbol
reference errors like in PR114608.

The offending bts_offset field of BTF_KIND_DATASEC entries is in reality
only currently useful to consumers of BTF information for BPF programs
anyway.  Correct the regression by only emitting symbol references in
these entries when compiling for the BPF target.  For other targets, the
behavior returns to that prior to fa60ac5496.

The underlying cause is related to PR 113566 "btf: incorrect
BTF_KIND_DATASEC entries for variables which are optimized out." A
complete fix for 113566 is more involved and unsuitable for stage 4,
but will be addressed in the near future.

gcc/
	PR debug/114608
	* btfout.cc (btf_asm_datasec_entry): Only emit a symbol reference when
	generating BTF for BPF CO-RE target.

gcc/testsuite/
	PR debug/114608
	* gcc.dg/debug/btf/btf-datasec-1.c: Check bts_offset symbol references
	only for BPF target.
	* gcc.dg/debug/btf/btf-datasec-2.c: Likewise.
	* gcc.dg/debug/btf/btf-pr106773.c: Likewise.
2024-04-09 08:40:08 -07:00
Richard Ball
685d822e52 aarch64: Fix ACLE SME streaming mode error in neon-sve-bridge
When using LTO, handling the pragma for sme before the pragma
for the neon-sve-bridge caused the following error on svset_neonq,
in the neon-sve-bridge.c test.

error: ACLE function '0' can only be called when SME streaming mode is enabled.

This has been resolved by changing the pragma handlers to accept two modes.
One where they add functions normally and a second in which registered_functions
is filled with a placeholder value.

By using this, the ordering of the functions can be maintained.

gcc/ChangeLog:

	* config/aarch64/aarch64-c.cc (aarch64_pragma_aarch64):
	Add functions_nulls parameter to pragma_handlers.
	* config/aarch64/aarch64-protos.h: Likewise.
	* config/aarch64/aarch64-sve-builtins.h
	(enum handle_pragma_index): Add enum to count
	number of pragmas to be handled.
	* config/aarch64/aarch64-sve-builtins.cc
	(GTY): Add global variable for initial indexes
	and change overload_names to an array.
	(function_builder::function_builder):
	Add pragma handler information.
	(function_builder::add_function):
	Add code for overwriting previous
	registered_functions entries.
	(add_unique_function):
	Use an array to register overload_names
	for both pragma handler modes.
	(add_overloaded_function): Likewise.
	(init_builtins):
	Add functions_nulls parameter to pragma_handlers.
	(handle_arm_sve_h):
	Initialize pragma handler information.
	(handle_arm_neon_sve_bridge_h): Likewise.
	(handle_arm_sme_h): Likewise.
2024-04-09 16:33:46 +01:00
Paul Thomas
de82b0cf98 Fortran: Fix ICE in trans-stmt.cc(gfc_trans_call) [PR114535]
2024-04-09  Paul Thomas  <pault@gcc.gnu.org>

gcc/fortran
	PR fortran/114535
	* resolve.cc (resolve_symbol): Remove last chunk that checked
	for finalization of unreferenced symbols.

gcc/testsuite/
	PR fortran/114535
	* gfortran.dg/pr114535d.f90: New test.
	* gfortran.dg/pr114535iv.f90: Additional source.
2024-04-09 15:27:28 +01:00
Paul Thomas
88aea122a7 Fortran: Fix ICE in gfc_trans_pointer_assignment [PR113956]
2024-04-09  Paul Thomas  <pault@gcc.gnu.org>

gcc/fortran
	PR fortran/113956
	* trans-expr.cc (gfc_trans_pointer_assignment): Remove assert
	causing the ICE since it was unnecesary.

gcc/testsuite/
	PR fortran/113956
	* gfortran.dg/pr113956.f90: New test.
2024-04-09 15:23:46 +01:00
Richard Biener
32fb04adae lto/114655 - -flto=4 at link time doesn't override -flto=auto at compile time
The following adjusts -flto option processing in lto-wrapper to have
link-time -flto override any compile time setting.

	PR lto/114655
	* lto-wrapper.cc (merge_flto_options): Add force argument.
	(merge_and_complain): Do not force here.
	(run_gcc): But here to make the link-time -flto option override
	any compile-time one.
2024-04-09 15:29:53 +02:00
Sebastian Huber
ce3c743d8c RTEMS: Fix powerpc configuration
gcc/ChangeLog:

	* config/rs6000/rtems.h (OS_MISSING_POWERPC64): Define.
2024-04-09 15:15:12 +02:00
Jørgen Kvalsvik
dd78e6a3cb Guard function->cond_uids access [PR114601]
PR114601 shows that it is possible to reach the condition_uid lookup
without having also created the fn->cond_uids, through
compiler-generated conditionals. Consider all lookups on non-existing
maps misses, which they are from the perspective of the source code, to
avoid the NULL access.

	PR gcov-profile/114601

gcc/ChangeLog:

	* tree-profile.cc (condition_uid): Guard fn->cond_uids access.

gcc/testsuite/ChangeLog:

	* gcc.misc-tests/gcov-pr114601.c: New test.
2024-04-09 13:48:20 +02:00
Jakub Jelinek
a79d13a01f i386: Fix aes/vaes patterns [PR114576]
On Wed, Apr 19, 2023 at 02:40:59AM +0000, Jiang, Haochen via Gcc-patches wrote:
> > >  (define_insn "aesenc"
> > > -  [(set (match_operand:V2DI 0 "register_operand" "=x,x")
> > > -       (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "0,x")
> > > -                      (match_operand:V2DI 2 "vector_operand" "xBm,xm")]
> > > +  [(set (match_operand:V2DI 0 "register_operand" "=x,x,v")
> > > +       (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "0,x,v")
> > > +                      (match_operand:V2DI 2 "vector_operand"
> > > + "xBm,xm,vm")]
> > >                       UNSPEC_AESENC))]
> > > -  "TARGET_AES"
> > > +  "TARGET_AES || (TARGET_VAES && TARGET_AVX512VL)"
> > >    "@
> > >     aesenc\t{%2, %0|%0, %2}
> > > +   vaesenc\t{%2, %1, %0|%0, %1, %2}
> > >     vaesenc\t{%2, %1, %0|%0, %1, %2}"
> > > -  [(set_attr "isa" "noavx,avx")
> > > +  [(set_attr "isa" "noavx,aes,avx512vl")
> > Shouldn't it be vaes_avx512vl and then remove " || (TARGET_VAES &&
> > TARGET_AVX512VL)" from condition.
>
> Since VAES should not imply AES, we need that "|| (TARGET_VAES &&
> TARGET_AVX512VL)"
>
> And there is no need to add vaes_avx512vl since the last alternative will only
> be hit when there is no aes. When there is no aes, the pattern will need vaes
> and avx512vl both or we could not use this pattern. avx512vl here is just like
> a placeholder.

As the following testcase shows, the above change was incorrect.

Using aes isa for the second alternative is obviously wrong, aes is enabled
whenever -maes is, regardless of -mavx or -mno-avx, so the above change
means that for -maes -mno-avx RA can choose, either it matches the first
alternative with the dup operand, or it matches the second one (but that
is of course wrong because vaesenc VEX encoded insn needs AES & AVX CPUID).

The big question is if "Since VAES should not imply AES" is the case or not.
Looking around at what LLVM does on godbolt, seems since clang 6 which added
-mvaes support -mvaes there implies -maes, but GCC treats those two
independent.

Now, if we'd take the LLVM path of making -mvaes imply -maes and -mno-aes
imply -mno-vaes, then we should probably just revert the above patch and
tweak common/config/i386/ to do the implications (+ add the testcase from
this patch).

If we keep the current behavior, where AES and VAES are completely
independent extensions, then we need to do more changes as the following
patch attempts to do.
We should use the aesenc etc. insns for noavx as before, we know at that
point that TARGET_AES must be true because (TARGET_VAES && TARGET_AVX512VL)
won't be true when !TARGET_AVX - TARGET_AVX512VL implies TARGET_AVX.
For the second alternative, i.e. the AVX AES VEX or VAES AVX512F EVEX case
without using %xmm16+/EGPR regs, the patch uses avx isa, but we need to
emit {evex} prefix in the assembly if AES ISA is not enabled.
For the last alternative, we need to use a new vaes_avx512vl isa attribute,
because the %xmm16+/EGPR support is there only if both VAES and AVX512VL
is enabled, not just AVX and AES.
Still, I wonder if -mvaes shouldn't imply at least -mavx512f and
-mno-avx512f shouldn't imply -mno-vaes, because otherwise can't see how
it could use 512-bit registers (this part not done in the patch).

2024-04-09  Jakub Jelinek  <jakub@redhat.com>

	PR target/114576
	* config/i386/i386.md (isa): Remove aes, add vaes_avx512vl.
	(enabled): Remove aes isa check, add vaes_avx512vl.
	* config/i386/sse.md (aesenc, aesenclast, aesdec, aesdeclast): Use
	jm instead of m for second alternative and emit {evex} prefix
	for it if !TARGET_AES.  Use noavx,avx,vaes_avx512vl isa attribute.
	(vaesdec_<mode>, vaesdeclast_<mode>, vaesenc_<mode>,
	vaesenclast_<mode>): Add second alternative with x instead of v
	and jm instead of m.

	* gcc.target/i386/aes-pr114576.c: New test.
2024-04-09 12:35:18 +02:00
Gaius Mulley
897a241ddd modula2: remove description of fdebug-trace-quad, fdebug-trace-api and add fm2-debug-trace=
This documentation fix removes the descriptions of -fdebug-trace-quad
and -fdebug-trace-api.  It adds a description of -fm2-debug-trace=
together with the trace alternatives: line,token,quad,all.

gcc/ChangeLog:

	* doc/gm2.texi (Compiler options): Remove -fdebug-trace-quad.
	Remove -fdebug-trace-api.
	Add -fm2-debug-trace=.

Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
2024-04-09 11:21:02 +01:00
Gaius Mulley
46120d7d12 modula2: tidyup makeSystem
This patch provides a tidyup for gcc/m2/tools-src/makeSystem.
It only runs the compiler once and will echo a debug command line
should it fail.

gcc/m2/ChangeLog:

	* tools-src/makeSystem: Invoke ${COMPILER} once and adjust
	the echo string to expand the shell variables with -wrapper
	gdb, --args.

Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
2024-04-09 11:02:17 +01:00
Yang Yujie
8657d76d58 LoongArch: Enable switchable target
This patch fixes the back-end context switching in cases where functions
should be built with their own target contexts instead of the
global one, such as LTO linking and functions with target attributes (TBD).

	PR target/113233

gcc/ChangeLog:

	* config/loongarch/loongarch.cc (loongarch_reg_init):
	Reinitialize the loongarch_regno_mode_ok cache.
	(loongarch_option_override): Same.
	(loongarch_save_restore_target_globals): Restore target globals.
	(loongarch_set_current_function): Restore the target contexts
	for functions.
	(TARGET_SET_CURRENT_FUNCTION): Define.
	* config/loongarch/loongarch.h (SWITCHABLE_TARGET): Enable
	switchable target context.
	* config/loongarch/loongarch-builtins.cc (loongarch_init_builtins):
	Initialize all builtin functions at startup.
	(loongarch_expand_builtin): Turn assertion of builtin availability
	into a test.

gcc/testsuite/ChangeLog:

	* lib/target-supports.exp: Define condition loongarch_sx_as.
	* gcc.dg/lto/pr113233_0.c: New test.
2024-04-09 17:03:15 +08:00
Christophe Lyon
73fb0a6153 rust: Add rust.install-dvi and rust.install-html rules
rust has the (empty) rust.dvi and rust.html rules, but lacks the
(empty) rust.install-dvi and rust.install-html ones.

2024-04-04  Christophe Lyon  <christophe.lyon@linaro.org>

	gcc/rust/
	* Make-lang.in (rust.install-dvi, rust.install-html): New rules.
2024-04-09 09:00:57 +00:00
Jørgen Kvalsvik
a2447556a5 Generate constant at start of loop, without UB
Generating the constants used for recording the edges taken for
condition coverage would trigger undefined behavior when an expression
had exactly 64 (== sizeof (1ULL)) conditions, as it would generate the
constant for the next iteration at the end of the loop body, even if there
was never a next iteration. By moving the check and constant generation
to the top of the loop and hoisting the increment flag there is no
opportunity for UB.

	PR middle-end/114627

gcc/ChangeLog:

	* tree-profile.cc (instrument_decisions): Generate constant
	at the start of loop.
2024-04-09 09:57:42 +02:00
Jørgen Kvalsvik
2daeb89d6f Add tree-inlined gconds to caller cond->expr map
Properly add the condition -> expression mapping of inlined gconds from
the caller into the callee map. This is a fix for PR114599 that works
beyond fixing the segfault, as the previous fixed copied references to
the source gconds, not the deep copied ones that end up in the calle
body.

The new tests checks this, both in the case of a calle without
conditions (which triggered the segfault), and a test that shows that
conditions are properly mapped, and not mixed.

	PR middle-end/114599

gcc/ChangeLog:

	* tree-inline.cc (copy_bb): Copy cond_uids into callee.
	(prepend_lexical_block): Remove outdated comment.
	(add_local_variables): Remove bad cond_uids copy.

gcc/testsuite/ChangeLog:

	* gcc.misc-tests/gcov-19.c: New test.
2024-04-09 09:56:44 +02:00
Jakub Jelinek
21c9fd9688 libquadmath: Provide __BYTE_ORDER, __LITTLE_ENDIAN and __BIG_ENDIAN definitions
My earlier libquadmath change apparently broke mingw32 build, while on Linux
<bits/endian.h> is included and defines these, on Mingw apparently that isn't
the case, while soft-fp wants a guarantee that sfp-machine.h defines these.

2024-04-09  Jakub Jelinek  <jakub@redhat.com>

	* sfp-machine.h (__LITTLE_ENDIAN, __BIG_ENDIAN, __BYTE_ORDER): Define
	if __BYTE_ORDER isn't defined.
2024-04-09 09:40:45 +02:00
Jakub Jelinek
cfed80b9e4 c++: Fix up maybe_warn_for_constant_evaluated calls [PR114580]
When looking at maybe_warn_for_constant_evaluated for the trivial
infinite loops patch, I've noticed that it can emit weird diagnostics
for if constexpr in templates, first warn that std::is_constant_evaluted()
always evaluates to false (because the function template is not constexpr)
and then during instantiation warn that std::is_constant_evaluted()
always evaluates to true (because it is used in if constexpr condition).
Now, only the latter is actually true, even when the if constexpr
is in a non-constexpr function, it will still always evaluate to true.

So, the following patch fixes it to call maybe_warn_for_constant_evaluated
always with IF_STMT_CONSTEXPR_P (if_stmt) as the second argument rather than
true if it is if constexpr with non-dependent condition etc.

2024-04-09  Jakub Jelinek  <jakub@redhat.com>

	PR c++/114580
	* semantics.cc (finish_if_stmt_cond): Call
	maybe_warn_for_constant_evaluated with IF_STMT_CONSTEXPR_P (if_stmt)
	as the second argument, rather than true/false depending on if
	it is if constexpr with non-dependent constant expression with
	bool type.

	* g++.dg/cpp2a/is-constant-evaluated15.C: New test.
2024-04-09 09:31:42 +02:00
Jakub Jelinek
64aa48ced0 Fix up duplicated words mostly in comments, part 2
Another patch from eyeballing
git grep -v 'long long\|optab optab\|template template\|double double' | grep ' \([a-zA-Z]\+\) \1 '
output, this time in gcc/ subdirectory.

2024-04-09  Jakub Jelinek  <jakub@redhat.com>

gcc/
	* expr.cc (convert_mode_scalar): Fix duplicated words in comment;
	into into -> it into.
	* function.h (function::cond_uids): Fix duplicated words in comment;
	same same -> same.
	* config/riscv/riscv-vector-costs.cc
	(costs::adjust_vect_cost_per_loop): Fix duplicated words in comment;
	model model -> model.
	* config/riscv/riscv-vector-builtins-shapes.cc (build_base): Fix
	duplicated words in comment; for for -> for.
	* config/riscv/riscv-avlprop.cc (pass_avlprop::execute): Fix
	duplicated words in comment; more more -> more.
	* config/aarch64/driver-aarch64.cc (host_detect_local_cpu): Fix
	duplicated words in comment; be be -> be.
	* tree-profile.cc (masking_vectors): Fix duplicated words in comment;
	has has -> has, the the -> the.
	* value-range.cc (irange::set_range_from_bitmask): Fix duplicated
	words in comment; the the -> the.
	* gcov.cc (add_condition_counts): Fix duplicated words in comment;
	to to -> to.
	* vr-values.cc (get_scev_info): Fix duplicated words in comment;
	the the -> to the.
	* tree-vrp.cc (fully_replaceable): Fix duplicated words in comment;
	by by -> by.
	* mode-switching.cc (single_succ_confluence_n): Fix duplicated words
	in comment; the the -> the.
	* tree-ssa-phiopt.cc (value_replacement): Fix duplicated words in
	comment; can can -> we can.
	* gimple-range-phi.cc (phi_analyzer::process_phi): Fix duplicated words
	in comment; it it -> it is.
	* tree-ssa-sccvn.cc (visit_phi): Fix duplicated words in comment;
	to to -> to.
	* rtl-ssa/accesses.h (use_info::next_debug_insn_use): Fix duplicated
	words in comment; if if -> if.
	* doc/options.texi (InverseMask): Fix duplicated words; and and -> and.
	Change take to takes.
	* doc/invoke.texi (fanalyzer-undo-inlining): Fix duplicated words;
	be be -> be.
	(-minline-memops-threshold): Likewise.
gcc/analyzer/
	* analyzer.opt (Wanalyzer-undefined-behavior-strtok): Fix duplicated
	words; in in -> in.
	* program-state.cc (sm_state_map::replay_call_summary): Fix duplicated
	words in comment; to to -> to.
	(program_state::replay_call_summary): Likewise.
	* region-model.cc (region_model::replay_call_summary): Likewise.
gcc/c/
	* c-decl.cc (previous_tag): Fix duplicated words in comment; the the
	-> the.
	(diagnose_mismatched_decls): Fix duplicated words in comment;
	about about -> about.
gcc/cp/
	* constexpr.cc (build_new_constexpr_heap_type): Fix duplicated words
	in comment; is is -> is.
	* cp-tree.def (CO_RETURN_EXPR): Fix duplicated words in comment;
	for for -> for.
	* parser.cc (fixup_blocks_walker): Fix duplicated words in comment;
	is is -> is.
	* semantics.cc (fixup_template_type): Fix duplicated words in comment;
	for for -> for.
	(finish_omp_for): Fix duplicated words in comment; the the -> the.
	* pt.cc (more_specialized_fn): Fix duplicated words in comment;
	think think -> think.
	(type_targs_deducible_from): Fix duplicated words in comment; the the
	-> the.
gcc/jit/
	* docs/topics/expressions.rst (Constructor expressions): Fix
	duplicated words; have have -> have.
2024-04-09 09:29:08 +02:00
Jakub Jelinek
7dd1f9d2ec bitint: Don't move debug stmts from before returns_twice calls [PR114628]
Debug stmts are allowed by the verifier before the returns_twice calls.
More importantly, they don't have a lhs, so the current handling of
arg_stmts statements to force them on the edges ICEs.

The following patch just keeps them where they were before.

2024-04-09  Jakub Jelinek  <jakub@redhat.com>

	PR middle-end/114628
	* gimple-lower-bitint.cc (gimple_lower_bitint): Keep debug stmts
	before returns_twice calls as is, don't push them into arg_stmts
	vector/move to edges.

	* gcc.dg/bitint-105.c: New test.
2024-04-09 09:28:27 +02:00
Sergey Bugaev
46c91665f4 libgcc: Add basic support for aarch64-gnu (GNU/Hurd on AArch64)
There is currently no unwinding implementation.

libgcc/ChangeLog:

	* config.host: Recognize aarch64*-*-gnu* hosts.
	* config/aarch64/gnu-unwind.h: New file.
	* config/aarch64/heap-trampoline.c
	(allocate_trampoline_page): Support GNU/Hurd.

Signed-off-by: Sergey Bugaev <bugaevc@gmail.com>
2024-04-09 09:23:33 +02:00
Sergey Bugaev
9670a23263 aarch64: Add support for aarch64-gnu (GNU/Hurd on AArch64)
Coupled with a corresponding binutils patch, this produces a toolchain that can
sucessfully build working binaries targeting aarch64-gnu.

gcc/Changelog:

	* config.gcc: Recognize aarch64*-*-gnu* targets.
	* config/aarch64/aarch64-gnu.h: New file.

Signed-off-by: Sergey Bugaev <bugaevc@gmail.com>
2024-04-09 09:23:33 +02:00
Sergey Bugaev
532c57f8c3 Move GNU/Hurd startfile spec from config/i386/gnu.h to config/gnu.h
Since it's not i386-specific; this makes it possible to reuse it for other
architectures.

Also, add a warning for the case gnu.h is specified before gnu-user.h, which
would cause gnu-user's version of the spec to override gnu's, and not the other
way around as it's intended. The i?86-gnu target currently specifies them in
the right order, but it's easy to accidentally put them in a wrong order.

gcc/Changelog:

	* config/i386/gnu.h: Move GNU/Hurd STARTFILE_SPEC from here...
	* config/gnu.h: ...to here.

Signed-off-by: Sergey Bugaev <bugaevc@gmail.com>
2024-04-09 09:23:32 +02:00
Richard Biener
d76df699b8 middle-end/114604 - ranger allocates bitmap without initialized obstack
The following fixes ranger bitmap allocation when invoked from IPA
context where the global bitmap obstack possibly isn't initialized.
Instead of trying to use one of the ranger obstacks the following
simply initializes the global bitmap obstack around an active ranger.

	PR middle-end/114604
	* gimple-range.cc (enable_ranger): Initialize the global
	bitmap obstack.
	(disable_ranger): Release it.
2024-04-09 08:46:21 +02:00
Sebastian Huber
ddee4376d1 RTEMS: Add multilib configuration for aarch64
Add a multilib with workarounds for Cortex-A53 errata.

gcc/ChangeLog:

	* config.gcc (aarch64-*-rtems*): Add target makefile fragment
	t-aarch64-rtems.
	* config/aarch64/t-aarch64-rtems: New file.
2024-04-09 08:25:37 +02:00
Jakub Jelinek
481ba4fb5f libquadmath: Use soft-fp for sqrtq finite positive arguments [PR114623]
sqrt should be 0.5ulp precise, but the current implementation is less
precise than that.
The following patch uses the soft-fp code (like e.g. glibc for x86) for it
if possible.  I didn't want to replicate the libgcc infrastructure for
choosing the right sfp-machine.h, so the patch just uses a single generic
implementation.  As the code is used solely for the finite positive arguments,
it shouldn't generate NaNs (so the exact form of canonical QNaN/SNaN is
irrelevant), and sqrt for these shouldn't produce underflows/overflows either,
for < 1.0 arguments it always returns larger values than the argument and for
> 1.0 smaller values than the argument.

2024-04-09  Jakub Jelinek  <jakub@redhat.com>

	PR libquadmath/114623
	* sfp-machine.h: New file.
	* math/sqrtq.c: Include from libgcc/soft-fp also soft-fp.h and quad.h
	if possible.
	(USE_SOFT_FP): Define in that case.
	(sqrtq): Use soft-fp based implementation for the finite positive
	arguments if possible.
2024-04-09 08:17:25 +02:00
H.J. Lu
18e94e04da x86: Define __APX_INLINE_ASM_USE_GPR32__
Define __APX_INLINE_ASM_USE_GPR32__ for -mapx-inline-asm-use-gpr32.
When __APX_INLINE_ASM_USE_GPR32__ is defined, inline asm statements
should contain only instructions compatible with r16-r31.

gcc/

	PR target/114587
	* config/i386/i386-c.cc (ix86_target_macros_internal): Define
	__APX_INLINE_ASM_USE_GPR32__ for -mapx-inline-asm-use-gpr32.

gcc/testsuite/

	PR target/114587
	* gcc.target/i386/apx-3.c: Likewise.
2024-04-08 19:42:36 -07:00
Kewen Lin
9c97de6823 testsuite: Add profile_update_atomic check to gcov-20.c [PR114614]
As PR114614 shows, the newly added test case gcov-20.c by
commit r14-9789-g08a52331803f66 failed on targets which do
not support atomic profile update, there would be a message
like:

  warning: target does not support atomic profile update,
           single mode is selected

Since the test case adopts -fprofile-update=atomic, it
requires effective target check profile_update_atomic, this
patch is to add the check accordingly.

	PR testsuite/114614

gcc/testsuite/ChangeLog:

	* gcc.misc-tests/gcov-20.c: Add effective target check
	profile_update_atomic.
2024-04-08 21:02:17 -05:00
Kewen Lin
26eb5f8fd1 rs6000: Fix wrong align passed to build_aligned_type [PR88309]
As the comments in PR88309 show, there are two oversights
in rs6000_gimple_fold_builtin that pass align in bytes to
build_aligned_type but which actually requires align in
bits, it causes unexpected ICE or hanging in function
is_miss_rate_acceptable due to zero align_unit value.

This patch is to fix them by converting bytes to bits, add
an assertion on positive align_unit value and notes function
build_aligned_type requires align measured in bits in its
function comment.

	PR target/88309

Co-authored-by: Andrew Pinski <quic_apinski@quicinc.com>

gcc/ChangeLog:

	* config/rs6000/rs6000-builtin.cc (rs6000_gimple_fold_builtin): Fix
	wrong align passed to function build_aligned_type.
	* tree-ssa-loop-prefetch.cc (is_miss_rate_acceptable): Add an
	assertion to ensure align_unit should be positive.
	* tree.cc (build_qualified_type): Update function comments.

gcc/testsuite/ChangeLog:

	* gcc.target/powerpc/pr88309.c: New test.
2024-04-08 21:02:13 -05:00