Commit Graph

191718 Commits

Author SHA1 Message Date
Patrick Palka be862bf1f6 c++: Add testcase for already fixed PR [PR104425]
Fixed by r12-1829.

	PR c++/104425

gcc/testsuite/ChangeLog:

	* g++.dg/template/partial-specialization10.C: New test.
2022-02-08 09:47:34 -05:00
Tom de Vries ab1355a480 [nvptx] Unbreak build, add PTX_ISA_SM70
With the commit "[nvptx] Choose -mptx default based on -misa" I introduced a
use of PTX_ISA_SM70, without adding it first.

Add it, as well as the corresponding TARGET_SM70.

Build for x86_64 with nvptx accelerator.

gcc/ChangeLog:

2022-02-08  Tom de Vries  <tdevries@suse.de>

	* config/nvptx/nvptx-opts.h (enum ptx_isa): Add PTX_ISA_SM70.
	* config/nvptx/nvptx.h (TARGET_SM70): Define.
2022-02-08 15:35:37 +01:00
Robin Dapp 1e3185e714 s390: Increase costs for load on condition and change movqicc expander.
This patch changes the costs for a load on condition from 5 to 6 in
order to ensure that we only if-convert two and not three or more SETS like

if (cond)
{
  a = b;
  c = d;
  e = f;
}

In the movqicc expander we emit a paradoxical subreg directly that
combine would otherwise try to create by using a non-optimal sequence
(which would be too expensive).

Also, fix two oversights in ifcvt testcases.

gcc/ChangeLog:

	* config/s390/s390.cc (s390_rtx_costs): Increase costs for load
	on condition.
	* config/s390/s390.md: Use paradoxical subreg.

gcc/testsuite/ChangeLog:

	* gcc.target/s390/ifcvt-two-insns-int.c: Fix array size.
	* gcc.target/s390/ifcvt-two-insns-long.c: Dito.
2022-02-08 15:28:53 +01:00
Robin Dapp 38a177fa4c combine: Check for paradoxical subreg.
This adds a check for a paradoxical subreg in reg_subword_p ()
in order to prevent an ICE on s390 in try_combine () triggered
by the movqicc expander.

gcc/ChangeLog:

	* combine.cc (reg_subword_p): Check for paradoxical subreg.
2022-02-08 15:28:53 +01:00
Jonathan Wakely 8dbb60b8df libstdc++: Add comment to acinclude.m4
libstdc++-v3/ChangeLog:

	* acinclude.m4 (GLIBCXX_ENABLE_LOCK_POLICY): Add comment about
	checking for CAS on correct word size.
2022-02-08 14:15:38 +00:00
Patrick Palka 676e987b85 c++: deducing only from noexcept-spec [PR80951]
The "fail-fast" predicate uses_deducible_template_parms used by
unify_one_argument is neglecting to look inside the noexcept-spec of a
function type.  This causes deduction to spuriously fail whenever the
noexcept-spec is the only part of the type which contains a deducible
template parameter.

	PR c++/80951

gcc/cp/ChangeLog:

	* pt.cc (uses_deducible_template_parms): Consider the
	noexcept-spec of a function type.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp1z/noexcept-type25.C: New test.
2022-02-08 09:11:31 -05:00
Patrick Palka 7ff201d85f c++: satisfaction value of type const bool [PR104410]
Here constant evaluation of the atomic constraint use_func_v<T>
sensibly yields an INTEGER_CST of type const bool, but the assert in
satisfaction_value expects unqualified bool.  So let's just relax the
assert to accept cv-qualified bool.

	PR c++/104410

gcc/cp/ChangeLog:

	* constraint.cc (satisfaction_value): Relax assert to accept
	cv-qualified bool.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp2a/concepts-pr104410.C: New test.
2022-02-08 09:11:29 -05:00
Patrick Palka db5f1c1703 c++: lambda in pack expansion using pack in constraint [PR103706]
Here when expanding the pack expansion pattern containing a constrained
lambda, the template argument for each Ts is an ARGUMENT_PACK_SELECT,
which we store inside the lambda's LAMBDA_EXPR_REGEN_INFO.  Then during
satisfaction of the lambda's constraint C<Ts> the satisfaction cache
uses this argument as part of the key to the corresponding sat_entry, but
iterative_hash_template_arg and template_args_equal deliberately don't
handle ARGUMENT_PACK_SELECT.

Since it's wrong to preserve ARGUMENT_PACK_SELECT inside a hash table
due to its instability (as documented in iterative_hash_template_arg),
this patch helps make sure the satisfaction cache doesn't see such trees
by resolving ARGUMENT_PACK_SELECT arguments before adding them to
LAMBDA_EXPR_REGEN_INFO.

	PR c++/103706

gcc/cp/ChangeLog:

	* pt.cc (preserve_args): New function.
	(tsubst_lambda_expr): Use it when setting LAMBDA_EXPR_REGEN_INFO.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp2a/concepts-lambda19.C: New test.
2022-02-08 08:46:32 -05:00
Patrick Palka 34ba3d9a2b c++: constrained auto in lambda using outer tparms [PR103706]
Here we're crashing during satisfaction of the lambda's placeholder type
constraints because the constraints depend on the template arguments
from the enclosing scope, which aren't part of the lambda's DECL_TI_ARGS.

This patch fixes this by making do_auto_deduction consider the
"regenerating" template arguments of a lambda for satisfaction,
mirroring what's done in satisfy_declaration_constraints.

	PR c++/103706

gcc/cp/ChangeLog:

	* constraint.cc (satisfy_declaration_constraints): Use
	lambda_regenerating_args instead.
	* cp-tree.h (lambda_regenerating_args): Declare.
	* pt.cc (lambda_regenerating_args): Define, split out from
	satisfy_declaration_constraints.
	(do_auto_deduction): Use lambda_regenerating_args to obtain the
	full set of outer template arguments for satisfaction when
	inside a lambda.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp2a/concepts-lambda18.C: New test.
2022-02-08 08:46:13 -05:00
Jonathan Wakely 61b783995f libstdc++: Adjust Filesystem TS test for Windows
The Filesystem TS isn't really supported for Windows, but the FAIL for
this test is just because it doesn't match what happens on Windows.

libstdc++-v3/ChangeLog:

	* testsuite/experimental/filesystem/operations/create_directories.cc:
	Adjust expected results for Windows.
2022-02-08 13:31:09 +00:00
Jonathan Wakely 5750952bec libstdc++: Fix filesystem::remove_all for Windows [PR104161]
The recursive_directory_iterator::__erase member was failing for
Windows, because the entry._M_type value is always file_type::none
(because _Dir_base::advance doesn't populate it for Windows) and
top.unlink uses fs::remove which sets an error using the
system_category. That meant that ec.value() was a Windows error code and
not an errno value, so the comparisons to EPERM and EISDIR failed.
Instead of depending on a specific Windows error code for attempting to
remove a directory, just use directory_entry::refresh() to query the
type first. This doesn't avoid the TOCTTOU races with directory
symlinks, but we can't avoid them on Windows without openat and
unlinkat, and creating symlinks requires admin privs on Windows anyway.

This also fixes the fs::remove_all(const path&) overload, which was
supposed to use the same logic as the other overload, but I forgot to
change it before my previous commit.

libstdc++-v3/ChangeLog:

	PR libstdc++/104161
	* src/c++17/fs_dir.cc (fs::recursive_directory_iterator::__erase):
	[i_GLIBCXX_FILESYSTEM_IS_WINDOWS]: Refresh entry._M_type member,
	instead of checking for errno values indicating a directory.
	* src/c++17/fs_ops.cc (fs::remove_all(const path&)): Use similar
	logic to non-throwing overload.
	(fs::remove_all(const path&, error_code&)): Add comments.
	* src/filesystem/ops-common.h: Likewise.
2022-02-08 13:31:05 +00:00
Tom de Vries decde11183 [nvptx] Choose -mptx default based on -misa
While testing with driver version 390.147 I ran into the problem that it
doesn't support ptx isa version 6.3 (the new default), only 6.1.

Furthermore, using the -mptx option is a bit user-unfriendly.

Say we want to compile for sm_80.  We can use -misa=sm_80 to specify that, but
then run into errors because the default ptx version is 6.3, which doesn't
support sm_80 yet.

Address both these issues by:
- picking a default -mptx based on the active -misa, and
- ensuring that the default -mptx is at least 6.0 (instead
  of 6.3).

Also add an error in case of incompatible options like
"-misa=sm_80 -mptx=6.3":
...
cc1: error: PTX version (-mptx) needs to be at least 7.0 to support \
  selected -misa (sm_80)
...

Tested on x86_64-linux with nvptx accelerator.

gcc/ChangeLog:

2022-02-08  Tom de Vries  <tdevries@suse.de>

	PR target/104283
	* config/nvptx/nvptx-opts.h (enum ptx_version): Add PTX_VERSION_3_0
	and PTX_VERSION_4_2.
	* config/nvptx/nvptx.cc (first_ptx_version_supporting_sm)
	(default_ptx_version_option, ptx_version_to_string)
	(sm_version_to_string, handle_ptx_version_option): New function.
	(nvptx_option_override): Call handle_ptx_version_option.
	(nvptx_file_start): Use ptx_version_to_string and sm_version_to_string.
	* config/nvptx/nvptx.md (define_insn "nvptx_shuffle<mode>")
	(define_insn "nvptx_vote_ballot"): Use TARGET_PTX_6_0.
	* config/nvptx/nvptx.opt (mptx): Remove 'Init'.
2022-02-08 13:55:23 +01:00
Maciej W. Rozycki 6de582dd62 RISC-V/testsuite: Run target testing over all the usual optimization levels
Use `gcc-dg-runtest' test driver rather than `dg-runtest' to run the
RISC-V testsuite as several targets already do.  Adjust test options
across individual test cases accordingly where required.

As some tests want to be run at `-Og', add a suitable optimization
variant via ADDITIONAL_TORTURE_OPTIONS, and include the moderately
recent `-Oz' variant as well.

	gcc/testsuite/
	* gcc.target/riscv/riscv.exp: Use `gcc-dg-runtest' rather than
	`dg-runtest'.  Add `-Og -g' and `-Oz' variants via
	ADDITIONAL_TORTURE_OPTIONS.
	* gcc.target/riscv/arch-1.c: Adjust test options accordingly.
	* gcc.target/riscv/arch-10.c: Likewise.
	* gcc.target/riscv/arch-11.c: Likewise.
	* gcc.target/riscv/arch-12.c: Likewise.
	* gcc.target/riscv/arch-2.c: Likewise.
	* gcc.target/riscv/arch-3.c: Likewise.
	* gcc.target/riscv/arch-4.c: Likewise.
	* gcc.target/riscv/arch-5.c: Likewise.
	* gcc.target/riscv/arch-6.c: Likewise.
	* gcc.target/riscv/arch-7.c: Likewise.
	* gcc.target/riscv/arch-8.c: Likewise.
	* gcc.target/riscv/arch-9.c: Likewise.
	* gcc.target/riscv/attribute-1.c: Likewise.
	* gcc.target/riscv/attribute-10.c: Likewise.
	* gcc.target/riscv/attribute-11.c: Likewise.
	* gcc.target/riscv/attribute-12.c: Likewise.
	* gcc.target/riscv/attribute-13.c: Likewise.
	* gcc.target/riscv/attribute-14.c: Likewise.
	* gcc.target/riscv/attribute-15.c: Likewise.
	* gcc.target/riscv/attribute-16.c: Likewise.
	* gcc.target/riscv/attribute-17.c: Likewise.
	* gcc.target/riscv/attribute-2.c: Likewise.
	* gcc.target/riscv/attribute-3.c: Likewise.
	* gcc.target/riscv/attribute-4.c: Likewise.
	* gcc.target/riscv/attribute-5.c: Likewise.
	* gcc.target/riscv/attribute-7.c: Likewise.
	* gcc.target/riscv/attribute-8.c: Likewise.
	* gcc.target/riscv/attribute-9.c: Likewise.
	* gcc.target/riscv/interrupt-1.c: Likewise.
	* gcc.target/riscv/interrupt-2.c: Likewise.
	* gcc.target/riscv/interrupt-3.c: Likewise.
	* gcc.target/riscv/interrupt-4.c: Likewise.
	* gcc.target/riscv/interrupt-conflict-mode.c: Likewise.
	* gcc.target/riscv/interrupt-debug.c: Likewise.
	* gcc.target/riscv/interrupt-mmode.c: Likewise.
	* gcc.target/riscv/interrupt-smode.c: Likewise.
	* gcc.target/riscv/interrupt-umode.c: Likewise.
	* gcc.target/riscv/li.c: Likewise.
	* gcc.target/riscv/load-immediate.c: Likewise.
	* gcc.target/riscv/losum-overflow.c: Likewise.
	* gcc.target/riscv/mcpu-6.c: Likewise.
	* gcc.target/riscv/mcpu-7.c: Likewise.
	* gcc.target/riscv/pr102957.c: Likewise.
	* gcc.target/riscv/pr103302.c: Likewise.
	* gcc.target/riscv/pr104140.c: Likewise.
	* gcc.target/riscv/pr84660.c: Likewise.
	* gcc.target/riscv/pr93202.c: Likewise.
	* gcc.target/riscv/pr93304.c: Likewise.
	* gcc.target/riscv/pr95252.c: Likewise.
	* gcc.target/riscv/pr95683.c: Likewise.
	* gcc.target/riscv/pr98777.c: Likewise.
	* gcc.target/riscv/pr99702.c: Likewise.
	* gcc.target/riscv/predef-1.c: Likewise.
	* gcc.target/riscv/predef-10.c: Likewise.
	* gcc.target/riscv/predef-11.c: Likewise.
	* gcc.target/riscv/predef-12.c: Likewise.
	* gcc.target/riscv/predef-13.c: Likewise.
	* gcc.target/riscv/predef-14.c: Likewise.
	* gcc.target/riscv/predef-15.c: Likewise.
	* gcc.target/riscv/predef-16.c: Likewise.
	* gcc.target/riscv/predef-2.c: Likewise.
	* gcc.target/riscv/predef-3.c: Likewise.
	* gcc.target/riscv/predef-4.c: Likewise.
	* gcc.target/riscv/predef-5.c: Likewise.
	* gcc.target/riscv/predef-6.c: Likewise.
	* gcc.target/riscv/predef-7.c: Likewise.
	* gcc.target/riscv/predef-8.c: Likewise.
	* gcc.target/riscv/promote-type-for-libcall.c: Likewise.
	* gcc.target/riscv/save-restore-1.c: Likewise.
	* gcc.target/riscv/save-restore-2.c: Likewise.
	* gcc.target/riscv/save-restore-3.c: Likewise.
	* gcc.target/riscv/save-restore-4.c: Likewise.
	* gcc.target/riscv/save-restore-6.c: Likewise.
	* gcc.target/riscv/save-restore-7.c: Likewise.
	* gcc.target/riscv/save-restore-8.c: Likewise.
	* gcc.target/riscv/save-restore-9.c: Likewise.
	* gcc.target/riscv/shift-and-1.c: Likewise.
	* gcc.target/riscv/shift-and-2.c: Likewise.
	* gcc.target/riscv/shift-shift-1.c: Likewise.
	* gcc.target/riscv/shift-shift-2.c: Likewise.
	* gcc.target/riscv/shift-shift-3.c: Likewise.
	* gcc.target/riscv/shift-shift-4.c: Likewise.
	* gcc.target/riscv/shift-shift-5.c: Likewise.
	* gcc.target/riscv/shorten-memrefs-1.c: Likewise.
	* gcc.target/riscv/shorten-memrefs-2.c: Likewise.
	* gcc.target/riscv/shorten-memrefs-3.c: Likewise.
	* gcc.target/riscv/shorten-memrefs-4.c: Likewise.
	* gcc.target/riscv/shorten-memrefs-5.c: Likewise.
	* gcc.target/riscv/shorten-memrefs-6.c: Likewise.
	* gcc.target/riscv/shorten-memrefs-7.c: Likewise.
	* gcc.target/riscv/shorten-memrefs-8.c: Likewise.
	* gcc.target/riscv/switch-qi.c: Likewise.
	* gcc.target/riscv/switch-si.c: Likewise.
	* gcc.target/riscv/weak-1.c: Likewise.
	* gcc.target/riscv/zba-adduw.c: Likewise.
	* gcc.target/riscv/zba-shNadd-01.c: Likewise.
	* gcc.target/riscv/zba-shNadd-02.c: Likewise.
	* gcc.target/riscv/zba-shNadd-03.c: Likewise.
	* gcc.target/riscv/zba-slliuw.c: Likewise.
	* gcc.target/riscv/zba-zextw.c: Likewise.
	* gcc.target/riscv/zbb-andn-orn-xnor-01.c: Likewise.
	* gcc.target/riscv/zbb-andn-orn-xnor-02.c: Likewise.
	* gcc.target/riscv/zbb-li-rotr.c: Likewise.
	* gcc.target/riscv/zbb-min-max.c: Likewise.
	* gcc.target/riscv/zbb-rol-ror-01.c: Likewise.
	* gcc.target/riscv/zbb-rol-ror-02.c: Likewise.
	* gcc.target/riscv/zbb-rol-ror-03.c: Likewise.
	* gcc.target/riscv/zbbw.c: Likewise.
	* gcc.target/riscv/zbs-bclr.c: Likewise.
	* gcc.target/riscv/zbs-bext.c: Likewise.
	* gcc.target/riscv/zbs-binv.c: Likewise.
	* gcc.target/riscv/zbs-bset.c: Likewise.
	* gcc.target/riscv/zero-extend-1.c: Likewise.
	* gcc.target/riscv/zero-extend-2.c: Likewise.
	* gcc.target/riscv/zero-extend-3.c: Likewise.
	* gcc.target/riscv/zero-extend-4.c: Likewise.
	* gcc.target/riscv/zero-extend-5.c: Likewise.
2022-02-08 12:20:03 +00:00
Maciej W. Rozycki 5e92fddad7 doc: RISC-V: Document the `-misa-spec=' option
We have recently updated the default for the `-misa-spec=' option, yet
we still have not documented it nor its `--with-isa-spec=' counterpart
in the GCC manuals.  Fix that.

	gcc/
	* doc/install.texi (Configuration): Document `--with-isa-spec='
	RISC-V option.
	* doc/invoke.texi (Option Summary): List `-misa-spec=' RISC-V
	option.
	(RISC-V Options): Document it.
2022-02-08 12:14:58 +00:00
Maciej W. Rozycki 3faeba72cf RISC-V: Add target machine headers as a dependency for riscv-sr.o
Make riscv-sr.o depend on target machine headers, removing spurious test
failures:

FAIL: gcc.target/riscv/save-restore-3.c scan-assembler-not call[ \t]*t0,__riscv_save_0
FAIL: gcc.target/riscv/save-restore-3.c scan-assembler-not tail[ \t]*__riscv_restore_0
FAIL: gcc.target/riscv/save-restore-3.c scan-assembler tail[ \t]*foo
FAIL: gcc.target/riscv/save-restore-6.c scan-assembler-not call[ \t]*t0,__riscv_save_0
FAIL: gcc.target/riscv/save-restore-6.c scan-assembler-not tail[ \t]*__riscv_restore_0
FAIL: gcc.target/riscv/save-restore-6.c scan-assembler tail[ \t]*other_func

if the definitions of UNSPECs are locally changed and GCC rebuilt from a
dirty tree.

	gcc/
	* config/riscv/t-riscv (riscv-sr.o): Add $(TM_H) dependency.
2022-02-08 12:14:58 +00:00
Tom de Vries 73f4a989b7 [nvptx] Fix 'main (int argc)' compilation
On nvptx, with test-case sso-12.c I run into:
...
spawn nvptx-none-run ./sso-12.exe^M
error: Prototype doesn't match for 'main' in 'input file 1 at offset 1796', \
  first defined in 'input file 1 at offset 1796'^M
nvptx-run: cuLinkAddData failed: device kernel image is invalid \
  (CUDA_ERROR_INVALID_SOURCE, 300)^M
FAIL: gcc.dg/sso-12.c execution test
...

The problem is that the test case uses 'main (int)' prototype, while __main
uses:
...
extern int main (int, void **);
...

There's code in write_fn_proto_1 to handle 'main (void)' as if
'main (int, void **)' was specified, but that's not active for 'main (int)'.

Fix this in write_fn_proto_1 by handling 'main (int)' as if
'main (int, void **)' was specified.

Tested on nvptx.

gcc/ChangeLog:

2022-02-07  Tom de Vries  <tdevries@suse.de>

	* config/nvptx/nvptx.cc (write_fn_proto_1): Handle 'main (int)'.
2022-02-08 09:55:31 +01:00
Tom de Vries f05cc4fd6f [testsuite] Require c99_runtime to run builtin-sprintf.c
On nvptx, I run into an execution failure in test-case
gcc.dg/tree-ssa/builtin-sprintf.c because the test-case uses the 'hh'
modifier.

The port uses newlib, which does by default not support that modifier.
There's a configure option --enable-newlib-io-c99-formats to enable this
support, but that requires alloca support, which nvptx doesn't have.

Fix this by requiring c99_runtime for running the test-case.

Tested on nvptx.

gcc/testsuite/ChangeLog:

2022-02-07  Tom de Vries  <tdevries@suse.de>

	* gcc.dg/tree-ssa/builtin-sprintf.c: Require c99_runtime for
	dg-do run.
2022-02-08 09:55:23 +01:00
Tom de Vries 04b54cc486 [nvptx] Fix .local atomic regressions
In PR target/104364, two problems were reported:
- in muniform-simt mode, an atom.cas insn is no longer executed in the
  "master lane" only.
- in msoft-stack mode, an __atomic_compare_exchange_n on stack memory is
  translated assuming it accesses local memory, while that's not the case.

Fix these by:
- ensuring that all insns with atomic attribute are also predicable, such
  that the validate_change in nvptx_reorg_uniform_simt will succeed, and
  asserting that it does, and
- guarding the local atomics implementation with a new function
  nvptx_mem_local_p that correctly handles msoft-stack.

Tested on x86_64 with nvptx accelerator.

gcc/ChangeLog:

2022-02-04  Tom de Vries  <tdevries@suse.de>

	PR target/104364
	* config/nvptx/nvptx-protos.h (nvptx_mem_local_p): Declare.
	* config/nvptx/nvptx.cc (nvptx_reorg_uniform_simt): Assert that
	change is validated.
	(nvptx_mem_local_p): New function.
	* config/nvptx/nvptx.md: Use nvptx_mem_local_p.
	(define_c_enum "unspecv"): Add UNSPECV_CAS_LOCAL.
	(define_insn "atomic_compare_and_swap<mode>_1_local"): New
	non-atomic, non-predicable define_insn, factored out of ...
	(define_insn "atomic_compare_and_swap<mode>_1"): ... here.
	Make predicable again.
	(define_expand "atomic_compare_and_swap<mode>"): Use
	atomic_compare_and_swap<mode>_1_local.

gcc/testsuite/ChangeLog:

2022-02-04  Tom de Vries  <tdevries@suse.de>

	PR target/104364
	* gcc.target/nvptx/softstack-2.c: New test.
	* gcc.target/nvptx/uniform-simt-1.c: New test.
2022-02-08 09:54:30 +01:00
Jakub Jelinek 0af7ef050a libgomp: Fix segfault with posthumous orphan tasks [PR104385]
The following patch fixes crashes with posthumous orphan tasks.
When a parent task finishes, gomp_clear_parent clears the parent
pointers of its children tasks present in the parent->children_queue.
But children that are still waiting for dependencies aren't in that
queue yet, they will be added there only when the sibling they are
waiting for exits.  Unfortunately we were adding those tasks into
the queues with the original task->parent which then causes crashes
because that task is gone and freed.  The following patch fixes that
by clearing the parent field when we schedule such task for running
by adding it into the queues and we know that the sibling task which
is about to finish has NULL parent.

2022-02-08  Jakub Jelinek  <jakub@redhat.com>

	PR libgomp/104385
	* task.c (gomp_task_run_post_handle_dependers): If parent is NULL,
	clear task->parent.
	* testsuite/libgomp.c/pr104385.c: New test.
2022-02-08 09:30:17 +01:00
Ulrich Weigand a362158097 MAINTAINERS: Remove Hartmut Penner as s390 maintainer
Hartmut is no longer with IBM and has not worked on GCC for a
long time; he asked to be removed from MAINTAINERS.

ChangeLog:

	* MAINTAINERS: Remove Hartmut Penner as s390 maintainer.
2022-02-08 09:23:14 +01:00
liuhongt 0103c2e408 Don't propagate for a more expensive reg-reg move.
For i386, it enables optimization like:

        vmovd   %xmm0, %edx
-       vmovd   %xmm0, %eax
+       movl    %edx, %eax

gcc/ChangeLog:

	PR rtl-optimization/104059
	* regcprop.cc (copyprop_hardreg_forward_1): Don't propagate
	for a more expensive reg-reg move.

gcc/testsuite/ChangeLog:

	* gcc.target/i386/pr104059.c: New test.
2022-02-08 12:39:31 +08:00
GCC Administrator cc2430c122 Daily bump. 2022-02-08 00:16:24 +00:00
David Malcolm 0c04ac0e15 analyzer: fix ICE on realloc of non-heap [PR104417]
gcc/analyzer/ChangeLog:
	PR analyzer/104417
	* sm-taint.cc (tainted_allocation_size::tainted_allocation_size):
	Remove overzealous assertion.
	(tainted_allocation_size::emit): Likewise.
	(region_model::check_dynamic_size_for_taint): Likewise.

gcc/testsuite/ChangeLog:
	PR analyzer/104417
	* gcc.dg/analyzer/pr104417.c: New test.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2022-02-07 18:32:47 -05:00
David Malcolm 9d2c0fad59 analyzer: fixes to memcpy [PR103872]
PR analyzer/103872 reports a failure of gcc.dg/analyzer/pr103526.c on
riscv64-unknown-elf-gcc.  The issue is that I wrote the test on x86_64
where a memcpy in the test is optimized to a write to a read/write pair,
whereas due to alignment differences the analyzer can see it as a
memcpy call, revealing problems with the analyzer's implementation
of memcpy.

This patch reimplements region_model::impl_call_memcpy in terms of a
get_store_value followed by a set_value, fixing the issue.

gcc/analyzer/ChangeLog:
	PR analyzer/103872
	* region-model-impl-calls.cc (region_model::impl_call_memcpy):
	Reimplement in terms of a get_store_value followed by a set_value.

gcc/testsuite/ChangeLog:
	PR analyzer/103872
	* gcc.dg/analyzer/memcpy-1.c: Add alternate versions of test cases
	in which the calls to memcpy are hidden from the optimizer.  Add
	further test cases.
	* gcc.dg/analyzer/taint-size-1.c: Add test coverage for memcpy
	with tainted size.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2022-02-07 18:31:54 -05:00
David Malcolm f30e65e94d testsuite: avoid analyzer asm failures on non-Linux
gcc/testsuite/ChangeLog:
	* gcc.dg/analyzer/asm-x86-1.c: Use dg-do "compile" rather than
	"assemble".
	* gcc.dg/analyzer/asm-x86-lp64-1.c: Likewise.
	* gcc.dg/analyzer/asm-x86-lp64-2.c: Likewise.
	* gcc.dg/analyzer/torture/asm-x86-linux-array_index_mask_nospec.c:
	Likewise.
	* gcc.dg/analyzer/torture/asm-x86-linux-cpuid-paravirt-1.c:
	Likewise, and restrict to x86_64-pc-linux-gnu.
	* gcc.dg/analyzer/torture/asm-x86-linux-cpuid-paravirt-2.c: Likewise.
	* gcc.dg/analyzer/torture/asm-x86-linux-cpuid.c: Use dg-do
	"compile" rather than "assemble".
	* gcc.dg/analyzer/torture/asm-x86-linux-rdmsr-paravirt.c:
	Likewise, and restrict to x86_64-pc-linux-gnu.
	* gcc.dg/analyzer/torture/asm-x86-linux-rdmsr.c: Use dg-do
	"compile" rather than "assemble".
	* gcc.dg/analyzer/torture/asm-x86-linux-wfx_get_ps_timeout-full.c:
	Likewise.
	* gcc.dg/analyzer/torture/asm-x86-linux-wfx_get_ps_timeout-reduced.c:
	Likewise.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2022-02-07 18:31:11 -05:00
Jakub Jelinek 5d2a330dee testsuite: Fix up testsuite/gcc.c-torture/execute/builtins/lib/chk.c for powerpc [PR104380]
> > The following testcase FAILs when configured with
> > --with-long-double-format=ieee .  Only happens in the -std=c* modes, not the
> > GNU modes; while the glibc headers have __asm redirects of
> > vsnprintf and __vsnprinf_chk to __vsnprintfieee128 and
> > __vsnprintf_chkieee128, the vsnprintf fortification extern inline gnu_inline
> > always_inline wrapper calls __builtin_vsnprintf_chk and we actually emit
> > a call to __vsnprinf_chk (i.e. with IBM extended long double) instead of
> > __vsnprintf_chkieee128.
> >
> > rs6000_mangle_decl_assembler_name already had cases for *printf and *scanf,
> > so this just adds another case for *printf_chk.  *scanf_chk doesn't exist.
> > __ prefixing isn't done because *printf_chk already starts with __.

Unfortunately, while I've tested the testcase also with -mabi=ieeelongdouble
by hand, the full bootstrap/regtest was on GCCFarm where glibc is too old
to test with --with-long-double-format=ieee.
I've done full bootstrap/regtest with that option during the weekend and
the patch regressed:
FAIL: gcc.c-torture/execute/builtins/snprintf-chk.c execution,  -O1
FAIL: gcc.c-torture/execute/builtins/snprintf-chk.c execution,  -O2
FAIL: gcc.c-torture/execute/builtins/snprintf-chk.c execution,  -O2 -flto -fno-use-linker-plugin -flto-partition=none
FAIL: gcc.c-torture/execute/builtins/snprintf-chk.c execution,  -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects
FAIL: gcc.c-torture/execute/builtins/snprintf-chk.c execution,  -O3 -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions
FAIL: gcc.c-torture/execute/builtins/snprintf-chk.c execution,  -O3 -g
FAIL: gcc.c-torture/execute/builtins/snprintf-chk.c execution,  -Og -g
FAIL: gcc.c-torture/execute/builtins/snprintf-chk.c execution,  -Os
FAIL: gcc.c-torture/execute/builtins/sprintf-chk.c execution,  -O1
FAIL: gcc.c-torture/execute/builtins/sprintf-chk.c execution,  -O2
FAIL: gcc.c-torture/execute/builtins/sprintf-chk.c execution,  -O2 -flto -fno-use-linker-plugin -flto-partition=none
FAIL: gcc.c-torture/execute/builtins/sprintf-chk.c execution,  -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects
FAIL: gcc.c-torture/execute/builtins/sprintf-chk.c execution,  -O3 -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions
FAIL: gcc.c-torture/execute/builtins/sprintf-chk.c execution,  -O3 -g
FAIL: gcc.c-torture/execute/builtins/sprintf-chk.c execution,  -Og -g
FAIL: gcc.c-torture/execute/builtins/sprintf-chk.c execution,  -Os
FAIL: gcc.c-torture/execute/builtins/vsnprintf-chk.c execution,  -O1
FAIL: gcc.c-torture/execute/builtins/vsnprintf-chk.c execution,  -O2
FAIL: gcc.c-torture/execute/builtins/vsnprintf-chk.c execution,  -O2 -flto -fno-use-linker-plugin -flto-partition=none
FAIL: gcc.c-torture/execute/builtins/vsnprintf-chk.c execution,  -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects
FAIL: gcc.c-torture/execute/builtins/vsnprintf-chk.c execution,  -O3 -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions
FAIL: gcc.c-torture/execute/builtins/vsnprintf-chk.c execution,  -O3 -g
FAIL: gcc.c-torture/execute/builtins/vsnprintf-chk.c execution,  -Og -g
FAIL: gcc.c-torture/execute/builtins/vsnprintf-chk.c execution,  -Os
FAIL: gcc.c-torture/execute/builtins/vsprintf-chk.c execution,  -O1
FAIL: gcc.c-torture/execute/builtins/vsprintf-chk.c execution,  -O2
FAIL: gcc.c-torture/execute/builtins/vsprintf-chk.c execution,  -O2 -flto -fno-use-linker-plugin -flto-partition=none
FAIL: gcc.c-torture/execute/builtins/vsprintf-chk.c execution,  -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects
FAIL: gcc.c-torture/execute/builtins/vsprintf-chk.c execution,  -O3 -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions
FAIL: gcc.c-torture/execute/builtins/vsprintf-chk.c execution,  -O3 -g
FAIL: gcc.c-torture/execute/builtins/vsprintf-chk.c execution,  -Og -g
FAIL: gcc.c-torture/execute/builtins/vsprintf-chk.c execution,  -Os

The problem is that the execute/builtins/ testsuite wants to override some
of the library functions and with the change we (correctly) call
__*printf_chkieee128 and so lib/chk.c is no longer called but the glibc
APIs are.

2022-02-07  Jakub Jelinek  <jakub@redhat.com>

	PR target/104380
	* gcc.c-torture/execute/builtins/lib/chk.c (__sprintf_chkieee128,
	__vsprintf_chkieee128, __snprintf_chkieee128,
	__vsnprintf_chkieee128): New aliases to non-ieee128 suffixed functions
	for powerpc -mabi=ieeelongdouble.
2022-02-07 17:39:11 +01:00
Tamar Christina f2d1316451 AArch32: correct usdot-product RTL patterns.
There was a bug in the ACLE specication for dot product which has now
been fixed[1].  This means some intrinsics were missing and are added by this
patch.

Bootstrapped and regtested on arm-none-linux-gnueabihf and no issues.

Ok for master?

[1] https://github.com/ARM-software/acle/releases/tag/r2021Q3

gcc/ChangeLog:

	* config/arm/arm_neon.h (vusdotq_s32, vusdot_laneq_s32,
	vusdotq_laneq_s32, vsudot_laneq_s32, vsudotq_laneq_s32): New
	* config/arm/arm_neon_builtins.def (usdot): Add V16QI.
	(usdot_laneq, sudot_laneq): New.
	* config/arm/neon.md (neon_<sup>dot_laneq<vsi2qi>): New.
	(neon_<sup>dot_lane<vsi2qi>): Remote unneeded code.

gcc/testsuite/ChangeLog:

	* gcc.target/arm/simd/vdot-2-1.c: Add new tests.
	* gcc.target/arm/simd/vdot-2-2.c: Likewise and fix output.
2022-02-07 12:56:54 +00:00
Tamar Christina 12aae3b93a AArch32: correct dot-product RTL patterns.
The previous fix for this problem was wrong due to a subtle difference between
where NEON expects the RMW values and where intrinsics expects them.

The insn pattern is modeled after the intrinsics and so needs an expand for
the vectorizer optab to switch the RTL.

However operand[3] is not expected to be written to so the current pattern is
bogus.

Instead we use the expand to shuffle around the RTL.

The vectorizer expects operands[3] and operands[0] to be
the same but the aarch64 intrinsics expanders expect operands[0] and
operands[1] to be the same.

This also fixes some issues with big-endian, each dot product performs 4 8-byte
multiplications.  However compared to AArch64 we don't enter lanes in GCC
lane indexed in AArch32 aside from loads/stores.  This means no lane remappings
are done in arm-builtins.c and so none should be done at the instruction side.

There are some other instructions that need inspections as I think there are
more incorrect ones.

Third there was a bug in the ACLE specication for dot product which has now been
fixed[1].  This means some intrinsics were missing and are added by this patch.

Bootstrapped and regtested on arm-none-linux-gnueabihf and no issues.

Ok for master? and active branches after some stew?

[1] https://github.com/ARM-software/acle/releases/tag/r2021Q3

gcc/ChangeLog:

	* config/arm/arm_neon.h (vdot_laneq_u32, vdotq_laneq_u32,
	vdot_laneq_s32, vdotq_laneq_s32): New.
	* config/arm/arm_neon_builtins.def (sdot_laneq, udot_laneq): New.
	* config/arm/neon.md (neon_<sup>dot<vsi2qi>): New.
	(<sup>dot_prod<vsi2qi>): Re-order rtl.
	(neon_<sup>dot_lane<vsi2qi>): Fix rtl order and endiannes.
	(neon_<sup>dot_laneq<vsi2qi>): New.

gcc/testsuite/ChangeLog:

	* gcc.target/arm/simd/vdot-compile.c: Add new cases.
	* gcc.target/arm/simd/vdot-exec.c: Likewise.
2022-02-07 12:56:37 +00:00
Andreas Krebbel db95441cf5 Check always_inline flag in s390_can_inline_p [PR104327]
MASK_MVCLE is set for -Os but not for other optimization levels. In
general it should not make much sense to inline across calls where the
flag is different but we have to allow it for always_inline.

The patch also rearranges the hook implementation a bit based on the
recommendations from Jakub und Martin in the PR.

Bootstrapped and regression tested on s390x with various arch flags.
Will commit after giving a few days for comments.

gcc/ChangeLog:

	PR target/104327
	* config/s390/s390.cc (s390_can_inline_p): Accept a few more flags
	if always_inline is set. Don't inline when tune differs without
	always_inline.

gcc/testsuite/ChangeLog:

	PR target/104327
	* gcc.c-torture/compile/pr104327.c: New test.
2022-02-07 11:18:08 +01:00
Richard Biener 70430001b7 middle-end/104402 - split out _Complex compares from COND_EXPRs
This makes sure we always have a _Complex compare split to a
different stmt for the compare operand in a COND_EXPR on GIMPLE.
Complex lowering doesn't handle this and the change is something
we want for all kind of compares at some point.

2022-02-07  Richard Biener  <rguenther@suse.de>

	PR middle-end/104402
	* gimple-expr.cc (is_gimple_condexpr): _Complex typed
	compares are not valid.
	* tree-cfg.cc (verify_gimple_assign_ternary): For COND_EXPR
	check is_gimple_condexpr.

	* gcc.dg/torture/pr104402.c: New testcase.
2022-02-07 09:37:59 +01:00
Kewen Lin e66ba0f55c rs6000: Move the hunk affecting VSX/ALTIVEC ahead [PR103627]
The modified hunk can update VSX and ALTIVEC flag, we have some codes
to check/warn for some flags related to VSX and ALTIVEC sitting where
the hunk is proprosed to be moved to.  Without this adjustment, the
VSX and ALTIVEC update is too late, it can cause the incompatibility
and result in unexpected behaviors, the associated test case is one
typical case.

Since we already have the code which sets TARGET_FLOAT128_TYPE and lays
after the moved place, and OPTION_MASK_FLOAT128_KEYWORD will rely on
TARGET_FLOAT128_TYPE, so it just simply remove them.

gcc/ChangeLog:

	PR target/103627
	* config/rs6000/rs6000.cc (rs6000_option_override_internal): Move the
	hunk affecting VSX and ALTIVEC to appropriate place.

gcc/testsuite/ChangeLog:

	PR target/103627
	* gcc.target/powerpc/pr103627-3.c: New test.
2022-02-06 21:30:02 -06:00
Kewen Lin 8103623923 rs6000: Disable MMA if no VSX support [PR103627]
As PR103627 shows, there is an unexpected case where !TARGET_VSX
and TARGET_MMA co-exist.  As ISA3.1 claims, SIMD is a requirement
for MMA.  By looking into the ICE, I noticed that the current
MMA implementation depends on vector pairs load/store which use
VSX register, but we don't have a separated option to control
Power10 vector support and Segher pointed out "-mpower9-vector is
a workaround that should go away" and more explanations in [1].
So this patch makes MMA require VSX instead.

[1] https://gcc.gnu.org/pipermail/gcc-patches/2022-January/589303.html

gcc/ChangeLog:

	PR target/103627
	* config/rs6000/rs6000.cc (rs6000_option_override_internal): Disable
	MMA if !TARGET_VSX.

gcc/testsuite/ChangeLog:

	PR target/103627
	* gcc.target/powerpc/pr103627-1.c: New test.
	* gcc.target/powerpc/pr103627-2.c: New test.
2022-02-06 21:29:32 -06:00
GCC Administrator 353f8fcc2e Daily bump. 2022-02-07 00:16:17 +00:00
Patrick Palka 8eb329e963 c++: dependent noexcept-spec on defaulted comparison op [PR96242]
Here we're failing to instantiate the defaulted comparison op's
explicit dependent noexcept-spec.  The problem is ultimately that
mark_used relies on maybe_instantiate_noexcept to synthesize a defaulted
comparison op, but the relevant DECL_MAYBE_DELETED fn handling in m_i_n
is intended for such functions whose noexcept-spec wasn't explicitly
provided (and is therefore determined via synthesis), so m_i_n just
exits early afterwards, without considering that the synthesized fn may
have an explicit noexcept-spec that needs instantiating.

This patch fixes this issue by making mark_used directly synthesize a
DECL_MAYBE_DELETED fn before calling maybe_instantiate_noexcept.  And
in turn, we can properly restrict the DECL_MAYBE_DELETED fn synthesis
in m_i_n to only those without an explicit noexcept-spec.

	PR c++/96242

gcc/cp/ChangeLog:

	* decl2.cc (mark_used): Directly synthesize a DECL_MAYBE_DELETED
	fn by calling maybe_synthesize_method instead of relying on
	maybe_instantiate_noexcept.  Move call to m_i_n after the
	DECL_DELETED_FN handling.
	* pt.cc (maybe_instantiate_noexcept): Restrict DECL_MAYBE_DELETED
	fn synthesis to only those with an implicit noexcept-spec, and
	return !DECL_DELETED_FN instead of !DECL_MAYBE_DELETED afterwards.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp2a/spaceship-synth15.C: New test.
2022-02-06 10:47:48 -05:00
Jakub Jelinek f9e900ce9b c++: Further address_compare fixes [PR89074]
This patch introduces folding_cxx_constexpr, folding_initializer is used
for both C and C++ initializer/constant expression folding and enables more
optimizations over what we do normally at runtime, while folding_cxx_constexpr
is used only during C++ constant expression folding and disables some optimizations.

The patch improves STRING_CST vs. STRING_CST folding, for folding_initializer
FUNCTION_DECL vs. FUNCTION_DECL folding, disables some optimizations like
is_global_var != is_global_var or STRING_CST vs. DECL_P for folding_cxx_constexpr
etc.

2022-02-06  Jakub Jelinek  <jakub@redhat.com>

	PR c++/89074
	PR c++/104033
	* fold-const.h (folding_initializer): Adjust comment.
	(folding_cxx_constexpr): Declare.
	* fold-const.cc (folding_initializer): Adjust comment.
	(folding_cxx_constexpr): New variable.
	(address_compare): Restrict the decl vs. STRING_CST
	or vice versa or STRING_CST vs. STRING_CST or
	is_global_var != is_global_var optimizations to !folding_cxx_constexpr.
	Punt for FUNCTION_DECLs with non-zero offsets.  If folding_initializer,
	assume non-aliased functions have non-zero size and have different
	addresses.  For folding_cxx_constexpr, punt on comparisons of start
	of some object and end of another one, regardless whether it is a decl
	or string literal.  Also punt for folding_cxx_constexpr on
	STRING_CST vs. STRING_CST comparisons if the two literals could be
	overlapping.

	* constexpr.cc (cxx_eval_binary_expression): Temporarily set
	folding_cxx_constexpr.

	* g++.dg/cpp1y/constexpr-89074-3.C: New test.
2022-02-06 11:16:29 +01:00
GCC Administrator 661109b024 Daily bump. 2022-02-06 00:16:21 +00:00
Jeff Law f49b8d25b1 Fix expected output for s390 tests
Recent changes in diagnostic outputs have been triggering failures on the s390
testsuite.  In particular, capitalization changed in one diagnostic and the
range representation changed in another.  This patch makes the obvious updates
to the s390 testsuite.

gcc/testsuite
	* gcc.target/s390/20150826-1.c: Update expected output.
	* gcc.target/s390/zvector/imm-range-error-1.c: Likewise.
2022-02-05 12:28:04 -05:00
Jakub Jelinek b3763384a1 match.pd: Fix x * 0.0 -> 0.0 folding [PR104389]
The recent PR95115 change to punt in const_binop on folding operation
with non-NaN operands into NaN if flag_trapping_math broke the following
testcase, because the x * 0.0 simplification punts just if
x maybe a NaN (because NaN * 0.0 is NaN not 0.0) or if one of the operands
could be negative zero.  But Inf * 0.0 or -Inf * 0.0 is also NaN, not
0.0, so when NaNs are honored we need to punt for possible infinities too.

2022-02-05  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/104389
	* match.pd (x * 0 -> 0): Punt if x maybe infinite and NaNs are
	honored.

	* gcc.dg/pr104389.c: New test.
2022-02-05 10:53:54 +01:00
Kito Cheng affdeda16e RISC-V: Fix detection of zifencei support for binutils
- binutils will complain version info is not found if default ISA spec
  is 2.2 for binutils.

Error: cannot find default versions of the ISA extension `zifencei'

gcc/ChangeLog:

	* configure.ac: Fix detection for zifencei support.
	* configure: Regenerate.
2022-02-05 17:29:17 +08:00
Kito Cheng 06e32a5ebf RISC-V: Always pass -misa-spec to assembler [PR104219]
Add -misa-spec to OPTION_DEFAULT_SPECS to make sure -misa-spec will
always pass that into assembler, that prevent GCC and binutils using
different way to interpret the ISA string.

gcc/ChangeLog:

	PR target/104219
	* config.gcc (riscv*-*-*): Normalize the with_isa_spec value.
	(all_defaults): Add isa_spec.
	* config/riscv/riscv.h (OPTION_DEFAULT_SPECS): Add isa_spec.
2022-02-05 16:10:12 +08:00
Jason Merrill 119cea98f6 c++: assignment, aggregate, array [PR104300]
The PR92385 fix meant that we see more VEC_INIT_EXPR outside of INIT_EXPR;
in such cases, we need to wrap them in TARGET_EXPR.  I previously fixed
that in build_array_copy; we also need it in process_init_constructor.
After fixing that, I needed to adjust a few places to recognize the
VEC_INIT_EXPR even inside a TARGET_EXPR.  And prevent cp_fully_fold_init
from lowering VEC_INIT_EXPR too soon.  And handle COMPOUND_EXPR inside
TARGET_EXPR better.

	PR c++/104300
	PR c++/92385

gcc/cp/ChangeLog:

	* cp-tree.h (get_vec_init_expr): New.
	(target_expr_needs_replace): New.
	* cp-gimplify.cc (cp_gimplify_init_expr): Use it.
	(struct cp_fold_data): New.
	(cp_fold_r): Only genericize inits at end of fn.
	(cp_fold_function): Here.
	(cp_fully_fold_init): Not here.
	* init.cc (build_vec_init): Use get_vec_init_expr.
	* tree.cc (build_vec_init_expr): Likewise.
	* typeck2.cc (split_nonconstant_init_1): Likewise.
	(process_init_constructor): Wrap VEC_INIT_EXPR in
	TARGET_EXPR.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp0x/initlist-array14.C: New test.
2022-02-05 00:56:05 -05:00
Jason Merrill 0ef416e7ed c++: add comment
gcc/cp/ChangeLog:

	* pt.cc (iterative_hash_template_arg): Add comment.
2022-02-05 00:56:05 -05:00
Ian Lance Taylor b523cae81c compiler: accept "any" as an alias for "interface{}"
For golang/go#33232

Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/382248
2022-02-04 16:44:43 -08:00
GCC Administrator 3c1cbde16e Daily bump. 2022-02-05 00:16:31 +00:00
Jonathan Wakely 6e3419529d libstdc++: Fix std::filesystem build failure for Windows
The std::filesystem code needs to use posix::DIR not ::DIR, as that is
an alias for _WDIR on Windows.

libstdc++-v3/ChangeLog:

	* src/filesystem/dir-common.h (_Dir_base::openat): Change return
	type to use portable posix::DIR alias.
2022-02-04 23:56:29 +00:00
Jonathan Wakely 0d1aabb60e libstdc++: Allow Clang to use <stdatomic.h> before C++23
There is code that only expects to be compiled with clang++ and uses its
<stdatomic.h>, which works because Clang supports the _Atomic specifier
in C++. The addition  of <stdatomic.h> to libstdc++ broke this code, as
now it finds the C++ header instead, which is empty for any standard
mode before C++23.

This change allows that code to keep working as before, by forwarding to
clang's <stdatomic.h>.

libstdc++-v3/ChangeLog:

	* include/c_compatibility/stdatomic.h [__clang__]: Use
	#include_next <stdatomic.h>.
2022-02-04 19:51:26 +00:00
Jonathan Wakely da72e0fd20 libstdc++: Remove un-implementable noexcept from Filesystem TS operations
LWG 3014 removed these incorrect noexcept specifications from the C++17
std::filesystem operations. They are also incorrect on the experimental
TS versions and should be removed from them too.

libstdc++-v3/ChangeLog:

	* include/experimental/bits/fs_ops.h (fs::copy_file): Remove
	noexcept.
	(fs::create_directories): Likewise.
	(fs::remove_all): Likewise.
	* src/filesystem/ops.cc (fs::copy_file): Remove noexcept.
	(fs::create_directories): Likewise.
	(fs::remove_all): Likewise.
2022-02-04 19:51:26 +00:00
Jonathan Wakely ebf6175464 libstdc++: Fix filesystem::remove_all races [PR104161]
This fixes the remaining filesystem::remove_all race condition by using
POSIX openat to recurse into sub-directories and using POSIX unlinkat to
remove files. This avoids the remaining race where the directory being
removed is replaced with a symlink after the directory has been opened,
so that the filesystem::remove("subdir/file") resolves to "target/file"
instead, because "subdir" has been removed and replaced with a symlink.
The previous patch only fixed the case where the directory was replaced
with a symlink before we tried to open it, but it still used the full
(potentially compromised) path as an argument to filesystem::remove.

The first part of the fix is to use openat when recursing into a
sub-directory with recursive_directory_iterator. This means that opening
"dir/subdir" uses the file descriptor for "dir", and so is sure to open
"dir/subdir" and not "symlink/subdir". (The previous patch to use
O_NOFOLLOW already ensured we won't open "dir/symlink/" here.)

The second part of the fix is to use unlinkat for the remove_all
operation. Previously we used a directory_iterator to get the name of
each file in a directory and then used filesystem::remove(iter->path())
on that name. This meant that any checks (e.g. O_NOFOLLOW) done by the
iterator could be invalidated before the remove operation on that
pathname. The directory iterator contains an open DIR stream, which we
can use to obtain a file descriptor to pass to unlinkat. This ensures
that the file being deleted really is contained within the directory
we're iterating over, rather than using a pathname that could resolve to
some other file.

The filesystem::remove_all function previously used a (non-recursive)
filesystem::directory_iterator for each directory, and called itself
recursively for sub-directories. The new implementation uses a single
filesystem::recursive_directory_iterator object, and calls a new __erase
member function on that iterator. That new __erase member function does
the actual work of removing a file (or a directory after its contents
have been iterated over and removed) using unlinkat. That means we don't
need to expose the DIR stream or its file descriptor to the remove_all
function, it's still encapuslated by the iterator class.

It would be possible to add a __rewind member to directory iterators
too, to call rewinddir after each modification to the directory. That
would make it more likely for filesystem::remove_all to successfully
remove everything even if files are being written to the directory tree
while removing it. It's unclear if that is actually prefereable, or if
it's better to fail and report an error at the first opportunity.

The necessary APIs (openat, unlinkat, fdopendir, dirfd) are defined in
POSIX.1-2008, and in Glibc since 2.10. But if the target doesn't provide
them, the original code (with race conditions) is still used.

This also reduces the number of small memory allocations needed for
std::filesystem::remove_all, because we do not store the full path to
every directory entry that is iterated over. The new filename_only
option means we only store the filename in the directory entry, as that
is all we need in order to use openat or unlinkat.

Finally, rather than duplicating everything for the Filesystem TS, the
std::experimental::filesystem::remove_all implementation now just calls
std::filesystem::remove_all to do the work.

libstdc++-v3/ChangeLog:

	PR libstdc++/104161
	* acinclude.m4 (GLIBCXX_CHECK_FILESYSTEM_DEPS): Check for dirfd
	and unlinkat.
	* config.h.in: Regenerate.
	* configure: Regenerate.
	* include/bits/fs_dir.h (recursive_directory_iterator): Declare
	remove_all overloads as friends.
	(recursive_directory_iterator::__erase): Declare new member
	function.
	* include/bits/fs_fwd.h (remove, remove_all): Declare.
	* src/c++17/fs_dir.cc (_Dir): Add filename_only parameter to
	constructor. Pass file descriptor argument to base constructor.
	(_Dir::dir_and_pathname, _Dir::open_subdir, _Dir::do_unlink)
	(_Dir::unlink, _Dir::rmdir): Define new member functions.
	(directory_iterator): Pass filename_only argument to _Dir
	constructor.
	(recursive_directory_iterator::_Dir_stack): Adjust constructor
	parameters to take a _Dir rvalue instead of creating one.
	(_Dir_stack::orig): Add data member for storing original path.
	(_Dir_stack::report_error): Define new member function.
	(__directory_iterator_nofollow): Move here from dir-common.h and
	fix value to be a power of two.
	(__directory_iterator_filename_only): Define new constant.
	(recursive_directory_iterator): Construct _Dir object and move
	into _M_dirs stack. Pass skip_permission_denied argument to first
	advance call.
	(recursive_directory_iterator::increment): Use _Dir::open_subdir.
	(recursive_directory_iterator::__erase): Define new member
	function.
	* src/c++17/fs_ops.cc (ErrorReporter, do_remove_all): Remove.
	(fs::remove_all): Use new recursive_directory_iterator::__erase
	member function.
	* src/filesystem/dir-common.h (_Dir_base): Add int parameter to
	constructor and use openat to implement nofollow semantics.
	(_Dir_base::fdcwd, _Dir_base::set_close_on_exec, _Dir_base::openat):
	Define new member functions.
	(__directory_iterator_nofollow): Move to fs_dir.cc.
	* src/filesystem/dir.cc (_Dir): Pass file descriptor argument to
	base constructor.
	(_Dir::dir_and_pathname, _Dir::open_subdir): Define new member
	functions.
	(recursive_directory_iterator::_Dir_stack): Adjust constructor
	parameters to take a _Dir rvalue instead of creating one.
	(recursive_directory_iterator): Check for new nofollow option.
	Construct _Dir object and move into _M_dirs stack. Pass
	skip_permission_denied argument to first advance call.
	(recursive_directory_iterator::increment): Use _Dir::open_subdir.
	* src/filesystem/ops.cc (fs::remove_all): Use C++17 remove_all.
2022-02-04 19:51:26 +00:00
Bill Schmidt b28b92bc00 rs6000: More factoring of overload processing
This patch continues the refactoring started with r12-6014.  I had previously
noted that the resolve_vec* routines can be further simplified by processing
the argument list earlier, so that all routines can use the arrays of arguments
and types.  I found that this was useful for some of the routines, but not for
all of them.

For several of the special-cased overloads, we don't specify all of the
possible type combinations in rs6000-overload.def, because the types don't
matter for the expansion we do.  For these, we can't use generic error message
handling when the number of arguments is incorrect, because the result is
misleading error messages that indicate argument types are wrong.

So this patch goes halfway and improves the factoring on the remaining special
cases, but leaves vec_splats, vec_promote, vec_extract, vec_insert, and
vec_step alone.

2022-02-02  Bill Schmidt  <wschmidt@linux.ibm.com>

gcc/
	* config/rs6000/rs6000-c.cc (resolve_vec_mul): Accept args and types
	parameters instead of arglist and nargs.  Simplify accordingly.  Remove
	unnecessary test for argument count mismatch.
	(resolve_vec_cmpne): Likewise.
	(resolve_vec_adde_sube): Likewise.
	(resolve_vec_addec_subec): Likewise.
	(altivec_resolve_overloaded_builtin): Move overload special handling
	after the gathering of arguments into args[] and types[] and the test
	for correct number of arguments.  Don't perform the test for correct
	number of arguments for certain special cases.  Call the other special
	cases with args and types instead of arglist and nargs.
2022-02-04 13:43:23 -06:00
Bill Schmidt 8cb748a31c rs6000: Clean up ISA 3.1 documentation [PR100808]
Due to a pasto error in the documentation, vec_replace_unaligned was
implemented with the same function prototypes as vec_replace_elt.  It was
intended that vec_replace_unaligned always specify output vectors as having
type vector unsigned char, to emphasize that elements are potentially
misaligned by this built-in function.  This patch corrects the
misimplementation.

2022-02-04  Bill Schmidt  <wschmidt@linux.ibm.com>

gcc/
	PR target/100808
	* doc/extend.texi (Basic PowerPC Built-in Functions Available on ISA
	3.1): Provide consistent type names.  Remove unnecessary semicolons.
	Fix bad line breaks.
2022-02-04 13:32:11 -06:00