Commit Graph

215500 Commits

Author SHA1 Message Date
GCC Administrator
4958fe2255 Daily bump. 2024-11-19 00:19:52 +00:00
Joseph Myers
3d525fce70 c: Allow bool and enum null pointer constants [PR112556]
As reported in bug 112556, GCC wrongly rejects conversion of null
pointer constants with bool or enum type to pointers in
convert_for_assignment (assignment, initialization, argument passing,
return).  Fix the code there to allow BOOLEAN_TYPE and ENUMERAL_TYPE;
it already allowed INTEGER_TYPE and BITINT_TYPE.

This bug (together with -std=gnu23 meaning false has type bool rather
than int) has in turn resulted in people thinking they need to fix
code using false as a null pointer constant for C23 compatibility.
While such a usage is certainly questionable, it has nothing to do
with C23 compatibility and the right place for warnings about such
usage is -Wzero-as-null-pointer-constant.  I think it would be
appropriate to extend -Wzero-as-null-pointer-constant to cover
BOOLEAN_TYPE, ENUMERAL_TYPE and BITINT_TYPE (in all the various
contexts in which that option generates warnings), though this patch
doesn't do anything about that option.

Bootstrapped with no regressions for x86-64-pc-linux-gnu.

	PR c/112556

gcc/c/
	* c-typeck.cc (convert_for_assignment): Allow conversion of
	ENUMERAL_TYPE and BOOLEAN_TYPE null pointer constants to pointers.

gcc/testsuite/
	* gcc.dg/c11-null-pointer-constant-1.c,
	gcc.dg/c23-null-pointer-constant-1.c: New tests.
2024-11-18 22:26:21 +00:00
David Malcolm
ea1506adbe libdiagnostics: add a "sarif-replay" command-line tool [PR96032]
This patch adds a new "sarif-replay" command-line tool for
viewing .sarif files.  It uses libdiagnostics to "replay"
any diagnostics found in the .sarif files in text form as if
they were GCC diagnostics.

contrib/ChangeLog:
	PR other/96032
	* regenerate-sarif-spec-index.py: New file.

gcc/ChangeLog:
	PR other/96032
	* Makefile.in (lang_checks): If libdiagnostics is enabled, add
	check-sarif-replay.
	(SARIF_REPLAY_OBJS): New.
	(ALL_HOST_OBJS): If libdiagnostics is enabled, add
	$(SARIF_REPLAY_OBJS).
	(sarif-replay): New.
	(install-libdiagnostics): Add sarif-replay to deps, and install
	it.
	* configure: Regenerate.
	* configure.ac (check_languages): If libdiagnostics is enabled,
	add check-sarif-replay.
	(LIBDIAGNOSTICS): If libdiagnostics is enabled, add sarif-replay.
	* doc/install.texi (--enable-libdiagnostics): Note that it also
	enables sarif-replay.
	* libsarifreplay.cc: New file.
	* libsarifreplay.h: New file.
	* sarif-replay.cc: New file.
	* sarif-spec-urls.def: New file.

gcc/testsuite/ChangeLog:
	PR other/96032
	* lib/gcc-dg.exp (gcc-dg-test-1): Add "replay-sarif".
	* lib/sarif-replay-dg.exp: New file.
	* lib/sarif-replay.exp: New file.
	* sarif-replay.dg/2.1.0-invalid/3.1-not-an-object.sarif: New test.
	* sarif-replay.dg/2.1.0-invalid/3.11.11-malformed-placeholder.sarif:
	New test.
	* sarif-replay.dg/2.1.0-invalid/3.11.11-missing-arguments-for-placeholders.sarif:
	New test.
	* sarif-replay.dg/2.1.0-invalid/3.11.11-not-enough-arguments-for-placeholders.sarif:
	New test.
	* sarif-replay.dg/2.1.0-invalid/3.13.2-no-version.sarif: New test.
	* sarif-replay.dg/2.1.0-invalid/3.13.2-version-not-a-string.sarif:
	New test.
	* sarif-replay.dg/2.1.0-invalid/3.13.4-bad-runs.sarif: New test.
	* sarif-replay.dg/2.1.0-invalid/3.13.4-no-runs.sarif: New test.
	* sarif-replay.dg/2.1.0-invalid/3.13.4-non-object-in-runs.sarif:
	New test.
	* sarif-replay.dg/2.1.0-invalid/3.27.10-bad-level.sarif: New test.
	* sarif-replay.dg/2.1.0-unhandled/3.27.10-none-level.sarif: New test.
	* sarif-replay.dg/2.1.0-valid/error-with-note.sarif: New test.
	* sarif-replay.dg/2.1.0-valid/escaped-braces.sarif: New test.
	* sarif-replay.dg/2.1.0-valid/null-runs.sarif: New test.
	* sarif-replay.dg/2.1.0-valid/signal-1.c.sarif: New test.
	* sarif-replay.dg/2.1.0-valid/spec-example-1.sarif: New test.
	* sarif-replay.dg/2.1.0-valid/spec-example-2.sarif: New test.
	* sarif-replay.dg/2.1.0-valid/spec-example-3.sarif: New test.
	* sarif-replay.dg/2.1.0-valid/spec-example-4.sarif: New test.
	* sarif-replay.dg/2.1.0-valid/tutorial-example.sarif: New test.
	* sarif-replay.dg/dg.exp: New script.
	* sarif-replay.dg/malformed-json/array-missing-comma.sarif: New test.
	* sarif-replay.dg/malformed-json/array-with-trailing-comma.sarif:
	New test.
	* sarif-replay.dg/malformed-json/bad-token.sarif: New test.
	* sarif-replay.dg/malformed-json/object-missing-comma.sarif: New test.
	* sarif-replay.dg/malformed-json/object-with-trailing-comma.sarif:
	New test.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2024-11-18 17:08:37 -05:00
David Malcolm
66e6e4f131 json: add json parsing support
This patch implements JSON parsing support.

It's based on the parsing parts of the patch I posted here:
https://gcc.gnu.org/legacy-ml/gcc-patches/2017-08/msg00417.html
with the parsing moved to a separate source file and header, heavily
rewritten to capture source location information for JSON values, and
to capture errors via a result template.

I also added optional support for C and C++ style comments, which is
extremely useful in DejaGnu tests.

gcc/ChangeLog:
	* Makefile.in (OBJS-libcommon): Add json-parsing.o.
	* json-parsing.cc: New file.
	* json-parsing.h: New file.
	* json.cc (selftest::assert_print_eq): Remove "static".
	* json.h (json::array::begin): New.
	(json::array::end): New.
	(json::array::length): New.
	(json::array::get): New.
	(is_a_helper <json::value *>::test): New.
	(is_a_helper <const json::value *>::test): New.
	(is_a_helper <json::object *>::test): New.
	(is_a_helper <const json::object *>::test): New.
	(is_a_helper <json::array *>::test): New.
	(is_a_helper <const json::array *>::test): New.
	(is_a_helper <json::float_number *>::test): New.
	(is_a_helper <const json::float_number *>::test): New.
	(is_a_helper <json::integer_number *>::test): New.
	(is_a_helper <const json::integer_number *>::test): New.
	(is_a_helper <json::string *>::test): New.
	(is_a_helper <const json::string *>::test): New.
	(selftest::assert_print_eq): New decl.
	* selftest-run-tests.cc (selftest::run_tests): Call
	selftest::json_parser_cc_tests.
	* selftest.h (selftest::json_parser_cc_tests): New decl.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2024-11-18 17:08:36 -05:00
David Malcolm
99a909aba3 Add libdiagnostics (v4)
This patch adds a new libdiagnostics shared library available as
part of the GCC build via --enable-libdiagnostics when
configuring GCC.

It combines the following patches from:
  https://gcc.gnu.org/pipermail/gcc-patches/2024-November/668632.html
    [PATCH 1/8] libdiagnostics v4: header
    [PATCH 2/8] libdiagnostics v4: implementation
    [PATCH 3/8] libdiagnostics: add API docs
    [PATCH 4/8] libdiagnostics v4: add C++ wrapper API
    [PATCH 6/8] libdiagnostics v4: test suite

ChangeLog:
	* configure.ac (--enable-libdiagnostics): New.
	* configure: Regenerate.

gcc/ChangeLog:
	* configure.ac (check_languages): Add check-libdiagnostics.
	(--enable-libdiagnostics): New.
	* configure: Regenerate.
	* Makefile.in (enable_libdiagnostics): New.
	(lang_checks): If libdiagnostics is enabled, add
	check-libdiagnostics.
	(ALL_HOST_OBJS): If libdiagnostics is enabled, add
	$(libdiagnostics_OBJS).
	(start.encap): Add LIBDIAGNOSTICS.
	(libdiagnostics_OBJS): New.
	(LIBDIAGNOSTICS_VERSION_NUM): New, adapted from code in
	jit/Make-lang.in.
	(LIBDIAGNOSTICS_MINOR_NUM): Likewise.
	(LIBDIAGNOSTICS_RELEASE_NUM): Likewise.
	(LIBDIAGNOSTICS_FILENAME): Likewise.
	(LIBDIAGNOSTICS_IMPORT_LIB): Likewise.
	(libdiagnostics): Likewise.
	(LIBDIAGNOSTICS_AGE): Likewise.
	(LIBDIAGNOSTICS_BASENAME): Likewise.
	(LIBDIAGNOSTICS_SONAME): Likewise.
	(LIBDIAGNOSTICS_LINKER_NAME): Likewise.
	(LIBDIAGNOSTICS_COMMA): Likewise.
	(LIBDIAGNOSTICS_VERSION_SCRIPT_OPTION): Likewise.
	(LIBDIAGNOSTICS_SONAME_OPTION): Likewise.
	(LIBDIAGNOSTICS_SONAME_SYMLINK): Likewise.
	(LIBDIAGNOSTICS_LINKER_NAME_SYMLINK): Likewise.
	(LIBDIAGNOSTICS_FILENAME): Likewise.
	(libdiagnostics.serial): Likewise.
	(LIBDIAGNOSTICS_EXTRA_OPTS): Likewise.
	(install): If libdiagnostics is enabled, add
	install-libdiagnostics.
	(libdiagnostics.install-headers): New.
	(libdiagnostics.install-common): New, adapted from code in
	jit/Make-lang.in.
	(install-libdiagnostics): New.
	* diagnostic-format-text.h
	(diagnostic_text_output_format::get_location_text): Make public.
	* doc/install.texi (--enable-libdiagnostics): New.
	* doc/libdiagnostics/Makefile: New file.
	* doc/libdiagnostics/conf.py: New file.
	* doc/libdiagnostics/index.rst: New file.
	* doc/libdiagnostics/make.bat: New file.
	* doc/libdiagnostics/topics/diagnostic-manager.rst: New file.
	* doc/libdiagnostics/topics/diagnostics.rst: New file.
	* doc/libdiagnostics/topics/execution-paths.rst: New file.
	* doc/libdiagnostics/topics/fix-it-hints.rst: New file.
	* doc/libdiagnostics/topics/index.rst: New file.
	* doc/libdiagnostics/topics/logical-locations.rst: New file.
	* doc/libdiagnostics/topics/message-formatting.rst: New file.
	* doc/libdiagnostics/topics/metadata.rst: New file.
	* doc/libdiagnostics/topics/physical-locations.rst: New file.
	* doc/libdiagnostics/topics/retrofitting.rst: New file.
	* doc/libdiagnostics/topics/sarif.rst: New file.
	* doc/libdiagnostics/topics/text-output.rst: New file.
	* doc/libdiagnostics/topics/ux.rst: New file.
	* doc/libdiagnostics/tutorial/01-hello-world.rst: New file.
	* doc/libdiagnostics/tutorial/02-physical-locations.rst: New file.
	* doc/libdiagnostics/tutorial/03-logical-locations.rst: New file.
	* doc/libdiagnostics/tutorial/04-notes.rst: New file.
	* doc/libdiagnostics/tutorial/05-warnings.rst: New file.
	* doc/libdiagnostics/tutorial/06-fix-it-hints.rst: New file.
	* doc/libdiagnostics/tutorial/07-execution-paths.rst: New file.
	* doc/libdiagnostics/tutorial/index.rst: New file.
	* libdiagnostics++.h: New file.
	* libdiagnostics.cc: New file.
	* libdiagnostics.h: New file.
	* libdiagnostics.map: New file.

gcc/testsuite/ChangeLog:
	* libdiagnostics.dg/libdiagnostics.exp: New, adapted from jit.exp.
	* libdiagnostics.dg/sarif.py: New.
	* libdiagnostics.dg/test-dump.c: New test.
	* libdiagnostics.dg/test-error-c.py: New test.
	* libdiagnostics.dg/test-error-with-note-c.py: New test.
	* libdiagnostics.dg/test-error-with-note.c: New test.
	* libdiagnostics.dg/test-error-with-note.cc: New test.
	* libdiagnostics.dg/test-error.c: New test.
	* libdiagnostics.dg/test-error.cc: New test.
	* libdiagnostics.dg/test-example-1.c: New test.
	* libdiagnostics.dg/test-fix-it-hint-c.py: New test.
	* libdiagnostics.dg/test-fix-it-hint.c: New test.
	* libdiagnostics.dg/test-fix-it-hint.cc: New test.
	* libdiagnostics.dg/test-helpers++.h: New test.
	* libdiagnostics.dg/test-helpers.h: New test.
	* libdiagnostics.dg/test-labelled-ranges.c: New test.
	* libdiagnostics.dg/test-labelled-ranges.cc: New test.
	* libdiagnostics.dg/test-labelled-ranges.py: New test.
	* libdiagnostics.dg/test-logical-location-c.py: New test.
	* libdiagnostics.dg/test-logical-location.c: New test.
	* libdiagnostics.dg/test-metadata-c.py: New test.
	* libdiagnostics.dg/test-metadata.c: New test.
	* libdiagnostics.dg/test-multiple-lines-c.py: New test.
	* libdiagnostics.dg/test-multiple-lines.c: New test.
	* libdiagnostics.dg/test-no-column-c.py: New test.
	* libdiagnostics.dg/test-no-column.c: New test.
	* libdiagnostics.dg/test-no-diagnostics-c.py: New test.
	* libdiagnostics.dg/test-no-diagnostics.c: New test.
	* libdiagnostics.dg/test-note-with-fix-it-hint-c.py: New test.
	* libdiagnostics.dg/test-note-with-fix-it-hint.c: New test.
	* libdiagnostics.dg/test-text-sink-options.c: New test.
	* libdiagnostics.dg/test-warning-c.py: New test.
	* libdiagnostics.dg/test-warning-with-path-c.py: New test.
	* libdiagnostics.dg/test-warning-with-path.c: New test.
	* libdiagnostics.dg/test-warning.c: New test.
	* libdiagnostics.dg/test-write-sarif-to-file-c.py: New test.
	* libdiagnostics.dg/test-write-sarif-to-file.c: New test.
	* libdiagnostics.dg/test-write-text-to-file.c: New test.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2024-11-18 17:08:36 -05:00
David Malcolm
c9d21e19df testsuite: move dg-test cleanup code from gcc-dg.exp to its own file
I need to use this cleanup logic for the testsuite for libdiagnostics
where it's too awkward to directly use gcc-dg.exp itself.

No functional change intended.

gcc/testsuite/ChangeLog:
	* lib/dg-test-cleanup.exp: New file, from material moved from
	lib/gcc-dg.exp.
	* lib/gcc-dg.exp: Add load_lib of dg-test-cleanup.exp.
	(cleanup-after-saved-dg-test): Move to lib/dg-test-cleanup.exp.
	(dg-test): Likewise for override.
	(initialize_prune_notes): Likewise.

libatomic/ChangeLog:
	* testsuite/lib/libatomic.exp: Add
	"load_gcc_lib dg-test-cleanup.exp".

libgomp/ChangeLog:
	* testsuite/lib/libgomp.exp: Add
	"load_gcc_lib dg-test-cleanup.exp".
libitm/ChangeLog:
	* testsuite/lib/libitm.exp: Add
	"load_gcc_lib dg-test-cleanup.exp".

libphobos/ChangeLog:
	* testsuite/lib/libphobos-dg.exp: Add
	"load_gcc_lib dg-test-cleanup.exp".

libstdc++-v3/ChangeLog:
	* testsuite/lib/libstdc++.exp: Add
	"load_gcc_lib dg-test-cleanup.exp".

libvtv/ChangeLog:
	* testsuite/lib/libvtv.exp: Add
	"load_gcc_lib dg-test-cleanup.exp".

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2024-11-18 16:49:04 -05:00
Uros Bizjak
344356f781 i386: Enable *rsqrtsf2_sse without TARGET_SSE_MATH [PR117357]
__builtin_ia32_rsqrtsf2 expander generates UNSPEC_RSQRT insn pattern
also when TARGET_SSE_MATH is not set.  Enable *rsqrtsf2_sse without
TARGET_SSE_MATH to avoid ICE with unrecognizable insn.

	PR target/117357

gcc/ChangeLog:

	* config/i386/i386.md (*rsqrtsf2_sse):
	Also enable for !TARGET_SSE_MATH.

gcc/testsuite/ChangeLog:

	* gcc.target/i386/pr117357.c: New test.
2024-11-18 22:38:46 +01:00
Martin Uecker
a3098b9a72 Fix test failures for enum-alias-{1,2,3} on arm-eabi [PR117419]
The tests added for PR115157 fail on arm-eabi.  Add __INT_MAX__
to enum to make sure they have size int.

	PR testsuite/117419

gcc/testsuite/ChangeLog:
	* gcc.dg/enum-alias-1.c: Add __INT_MAX__.
	* gcc.dg/enum-alias-2.c: Likewise.
	* gcc.dg/enum-alias-3.c: Likewise.

Tested-by: Thiago Jung Bauermann <thiago.bauermann@linaro.org>
2024-11-18 20:53:15 +01:00
Richard Sandiford
a019429f36 Add a timevar for late combine
When adding late-combine.cc, I forgot to add a timevar for it.

gcc/
	* timevar.def (TV_LATE_COMBINE): New timevar.
	* late-combine.cc (pass_data_late_combine): Use it.
2024-11-18 19:33:58 +00:00
Richard Sandiford
8633bdb346 aarch64: Improve early-ra handling of reductions
At the moment, early-ra ducks out of allocating any region
that contains a register with both a strong FPR affinity and
a strong GPR affinity.  The proper allocators are much better
at handling that situation.

But this means that early-ra tends not to allocate a region
of vector code that ends in a reduction to a scalar integer
if any later arithmetic is done on the scalar integer result.

Currently, if a block acts as an isolated allocation region, the pass
will try to split the block into subregions *between* instructions if
there are no live FPRs or FPR allocnos.  In the reduction case described
above, it's convenient to try the same thing *within* instructions.
If a block of vector code ends in a reduction, all FPRs and FPR
allocnos will be dead between the "use phase" and the "def phase"
of the reduction: the vector input will then have died, but the
scalar result will not yet have been born.

If we split the block that way, the problematic reduction result
will be part of the second region, which we can skip allocating,
but the vector work will be part of a separate region, which we
might be able to allocate.

This avoids a MOV in the testcase and also helps a small amount
with x264.

gcc/
	* config/aarch64/aarch64-early-ra.cc
	(early_ra::IGNORE_REG): New flag.
	(early_ra::fpr_preference): Handle it.
	(early_ra::record_constraints): Fail the allocation if an
	IGNORE_REG output operand is not independent of the inputs.
	(defines_multi_def_pseudo): New function.
	(early_ra::could_split_region_here): New member function, split
	out from...
	(early_ra::process_block): ...here.  Try splitting a block into
	multiple regions between the definition and use phases of an
	instruction.  Set IGNORE_REG on the output registers if we do so.

gcc/testsuite/
	* gcc.target/aarch64/early_ra_1.c: New test.
2024-11-18 19:32:51 +00:00
Richard Sandiford
279475fd72 aarch64: Extend early-ra splitting of single-block regions
When early-ra treats a block as an isolated allocation region,
it opportunistically splits the block into smaller regions
at points where no FPRs or FPR allocnos are live.  Previously
it only did this if m_allocation_successful, since the contrary
included cases in which the live range information wasn't trustworthy.

After earlier patches, we should now be able to trust the live range
information whenever m_accurate_live_ranges is true.  This means that
we can split the block into regions even if allocation failed for the
current (sub)region.

This is just something I noticed by inspection.  I don't have
a particular test case for it.

gcc/
	* config/aarch64/aarch64-early-ra.cc
	(early_ra::process_block): Check m_accurate_live_ranges
	rather than m_allocation_successful when deciding whether
	to split a block into multiple regions.  Skip over subregions
	that we decide not to allocate.
2024-11-18 19:32:50 +00:00
Richard Sandiford
428f3cacdd aarch64: Relax early_ra treatment of modes_tieable_p
At least on aarch64, modes_tieable_p is a stricter condition than
can_change_mode_class.  can_change_mode_class tells us whether the
subreg rules produce a sensible result for a particular mode change.
modes_tieable_p in addition tells us whether a mode change is
reasonable for optimisation purposes.

A false return from either hook should (and does) prevent early_ra
from attempting an allocation.  But only a false return from
can_change_mode_class should invalidate the liveness tracking;
we can still analyse subregs for which can_change_mode_class is
true and modes_tieable_p is false.

This doesn't make a difference on its own, but it helps later
patches.

gcc/
	* config/aarch64/aarch64-early-ra.cc
	(early_ra::get_allocno_subgroup): Split can_change_mode_class test
	out from modes_tieable_p test and only invalidate the live range
	information for the former.
2024-11-18 19:32:50 +00:00
Richard Sandiford
102e42a0df aarch64: Improve early_ra dump information
The early-ra pass often didn't print a dump message when aborting the
allocation.  This patch uses a similar helper to the previous patch.

gcc/
	* config/aarch64/aarch64-early-ra.cc
	(early_ra::record_allocation_failure): New member function.
	(early_ra::get_allocno_subgroup): Use it instead of setting
	m_allocation_successful directly.
	(early_ra::record_constraints): Likewise.
	(early_ra::allocate_colors): Likewise.
2024-11-18 19:32:49 +00:00
Richard Sandiford
716aa5a668 aarch64: Add early_ra::record_live_range_failure
So far, early_ra has used a single m_allocation_successful bool
to record whether the current region is still being allocated.
But there are (at least) two reasons why we might pull out of
attempting an allocation:

(1) We can't track the liveness of individual FP allocnos,
    due to some awkward subregs.

(2) We're afraid of doing a worse job than the proper allocator.

A later patch needs to distinguish (1) from other reasons, since
(1) means that the liveness information is not trustworthy.
(Currently we assume it is not trustworthy whenever
m_allocation_successful is false, but that's too conservative.)

gcc/
	* config/aarch64/aarch64-early-ra.cc
	(early_ra::record_live_range_failure): New member function.
	(early_ra::m_accurate_live_ranges): New member variable.
	(early_ra::start_new_region): Set m_accurate_live_ranges to true.
	(early_ra::get_allocno_subgroup): Use record_live_range_failure
	to abort the allocation on invalid subregs.
2024-11-18 19:32:49 +00:00
Richard Sandiford
4712ecde48 aarch64: Split early_ra::record_insn_refs
record_insn_refs has three distinct phases: model the definitions,
model any call, and model the uses.  This patch splits each phase
out into its own function.

This isn't beneficial on its own, but it helps with later patches.

gcc/
	* config/aarch64/aarch64-early-ra.cc
	(early_ra::record_insn_refs): Split into...
	(early_ra::record_insn_defs, early_ra::record_insn_call)
	(early_ra::record_insn_uses): ...this new functions.
	(early_ra::process_block): Update accordingly.
2024-11-18 19:32:48 +00:00
David Malcolm
a5af2ec16f diagnostics: add support for nested diagnostics [PR116253]
Previously the diagnostic subsystem supported a one-deep
hierarchy via auto_diagnostic_group, for associating
notes with the warning/error they annotate; this only
affects SARIF output, not text output.

This patch adds support to the diagnostics subsystem for
capturing arbitrarily deep nesting structure within
diagnostic messages.

This patch:
* adds the ability to express nesting internally when
  building diagnostics
* captures the nesting in SARIF output in the form documented
  in SG15's P3358R0 ("SARIF for Structured Diagnostics") via
  a "nestingLevel" property
* adds a new experimental mode to text output to see the
  hierarchy, via:
  -fdiagnostics-set-output=text:experimental-nesting=yes
* adds test coverage via a plugin, which with the above
  option emits:
  • note: child 0
    • note: grandchild 0 0
    • note: grandchild 0 1
    • note: grandchild 0 2
  • note: child 1
    • note: grandchild 1 0
    • note: grandchild 1 1
    • note: grandchild 1 2
  • note: child 2
    • note: grandchild 2 0
    • note: grandchild 2 1
    • note: grandchild 2 2
  using '*' rather than '•' if the text_art::theme is ascii-only.

My hope is to eventually:
(a) use this to improve C++'s template diagnostics
(b) remove the "experimental" caveat from the the text output mode

but this patch doesn't touch the C++ frontend, leaving both of these
to followup work.

gcc/c-family/ChangeLog:
	PR other/116253
	* c-opts.cc (c_diagnostic_text_finalizer): Use
	text_output.build_indent_prefix for prefix to
	diagnostic_show_locus.

gcc/ChangeLog:
	PR other/116253
	* diagnostic-core.h (class auto_diagnostic_nesting_level): New.
	* diagnostic-format-sarif.cc (class sarif_builder): Update leading
	comment re nesting of diagnostics.
	(sarif_result::on_nested_diagnostic): Add nestingLevel property.
	* diagnostic-format-text.cc (on_report_diagnostic): If we're
	showing nested diagnostics, then print changes of location on a
	new line, indented, and update m_last_location.
	(diagnostic_text_output_format::build_prefix): If m_show_nesting,
	then potentially add indentation and a bullet point.
	(get_bullet_point_unichar): New.
	(use_unicode_p): New.
	(diagnostic_text_output_format::build_indent_prefix): New.
	* diagnostic-format-text.h
	(diagnostic_text_output_format::diagnostic_text_output_format):
	Initialize m_show_nesting and m_show_nesting_levels.
	(diagnostic_text_output_format::build_indent_prefix): New decl.
	(diagnostic_text_output_format::show_nesting_p): New accessor
	(diagnostic_text_output_format::show_locations_in_nesting_p):
	Likewise.
	(diagnostic_text_output_format::set_show_nesting): New.
	(diagnostic_text_output_format::set_show_locations_in_nesting):
	New.
	(diagnostic_text_output_format::set_show_nesting_levels): New.
	(diagnostic_text_output_format::m_show_nesting): New field.
	(diagnostic_text_output_format::m_show_locations_in_nesting): New
	field.
	(diagnostic_text_output_format::m_show_nesting_levels): New field.
	* diagnostic-global-context.cc
	(auto_diagnostic_nesting_level::auto_diagnostic_nesting_level):
	New.
	(auto_diagnostic_nesting_level::~auto_diagnostic_nesting_level):
	New.
	* diagnostic-show-locus.cc (layout_printer::print): Temporarily
	set DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE.
	* diagnostic.cc (diagnostic_context::initialize): Update for
	renaming of m_nesting_depth to m_group_nesting_depth and
	initialize m_diagnostic_nesting_level.
	(diagnostic_context::finish): Update for renaming of
	m_nesting_depth to m_group_nesting_depth.
	(diagnostic_context::report_diagnostic): Likewise.
	(diagnostic_context::begin_group): Likewise.
	(diagnostic_context::end_group): Likewise.
	(diagnostic_context::push_nesting_level): New.
	(diagnostic_context::pop_nesting_level): New.
	(diagnostic_context::set_diagnostic_buffer): Update for renaming
	of m_nesting_depth to m_group_nesting_depth.  Assert that we don't
	have nested diagnostics.
	* diagnostic.h (diagnostic_context::push_nesting_level): New decl.
	(diagnostic_context::pop_nesting_level): New decl.
	(diagnostic_context::get_diagnostic_nesting_level): New accessor.
	(diagnostic_context::build_indent_prefix): New decl.
	(diagnostic_context::m_diagnostic_groups): Rename m_nesting_depth
	to m_group_nesting_depth and add field m_diagnostic_nesting_level.
	* doc/invoke.texi (fdiagnostics-add-output): Add note about
	"experimental" schemes, keys, and values.  Add keys
	"experimental-nesting", "experimental-nesting-show-locations",
	and "experimental-nesting-show-levels" to text scheme.
	* opts-diagnostic.cc (text_scheme_handler::make_sink): Add keys
	"experimental-nesting", "experimental-nesting-show-locations",
	and "experimental-nesting-show-levels".

gcc/testsuite/ChangeLog:
	PR other/116253
	* gcc.dg/plugin/diagnostic-test-nesting-sarif.c: New test.
	* gcc.dg/plugin/diagnostic-test-nesting-sarif.py: New test.
	* gcc.dg/plugin/diagnostic-test-nesting-text-indented-show-levels.c:
	New test.
	* gcc.dg/plugin/diagnostic-test-nesting-text-indented-unicode.c:
	New test.
	* gcc.dg/plugin/diagnostic-test-nesting-text-indented.c: New test.
	* gcc.dg/plugin/diagnostic-test-nesting-text-plain.c: New test.
	* gcc.dg/plugin/diagnostic_plugin_test_nesting.c: New test plugin.
	* gcc.dg/plugin/plugin.exp: Add the above.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2024-11-18 14:20:17 -05:00
Gaius Mulley
6d90f5d0ae PR modula2/117555: libgm2 build failure after r15-5081-g95960cd473297c
This patch adds missing return statements to library procedure
functions.  These missing statements occur after a call to RAISE.

gcc/m2/ChangeLog:

	PR modula2/117555
	* gm2-libs-iso/M2EXCEPTION.mod (M2Exception): Add missing
	return statement.
	* gm2-libs-iso/RealConv.mod (ValueReal): Ditto.
	* gm2-libs-iso/RndFile.mod (StartPos): Ditto.
	(EndPos): Ditto.
	(NewPos): Ditto.
	* gm2-libs-iso/ShortConv.mod (ValueReal): Ditto.
	* gm2-libs-iso/WholeConv.mod (ValueInt): Ditto.
	(ValueCard): Ditto.

Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
2024-11-18 18:35:28 +00:00
Georg-Johann Lay
c3db52bb47 AVR: target/84211 - Add a post reload register optimization pass.
This introduces a new post reload pass that tracks known values held
in registers and performs optimizations based on that knowledge.

It runs between the two instances of the RTL peephole pass.

The optimizations are activated by new option -mfuse-move=<0,23>
which provides a 3:2:2:2 mixed radix value:

Digit 0: Activates try_fuse:
    Tries to use a MOVW instead of two LDIs.

Digit 1: Activates try_bin_arg1:
    Simplify the 2nd operand of a binary operation, for example
    X xor Y  can be simplified to  X  when  Y = 0.  When  Y  is an
    expensive constant that's already held in some register R, then
    the expression can be replaced by  X xor R.

Digit 2: Activates try_split_any:
    Split multi-byte operations like shifts into 8-bit instructions.

Digit 3: Activates try_split_ldi:
    Decompose LDI-like insns into a sequence of instructions with better
    performance.  For example, R2[4] = 0x1ff may be performed as:
       CLR  R5
       CLR  R4
       MOVW R2, R4
       INC  R3
       DEC  R2
    Digit 3 can have a value of 0, 1 or 2, where value=2 may come up
    with code that performs better than with value=1 at the expense of
    reduced traceability of the generated assembly code.

Here are some examples:

   Without optimization              |   With optimization
   ====================              |   =================

   long long fn_zero (void)
   {
      return 0;
   }

   ldi r18, 0     ;  movqi_insn      |   ldi r18, 0     ;  movqi_insn
   ldi r19, 0     ;  movqi_insn      |   ldi r19, 0     ;  movqi_insn
   ldi r20, 0     ;  movqi_insn      |   movw r20, r18  ;  *movhi
   ldi r21, 0     ;  movqi_insn      |
   ldi r22, 0     ;  movqi_insn      |   movw r22, r18  ;  *movhi
   ldi r23, 0     ;  movqi_insn      |
   ldi r24, 0     ;  movqi_insn      |   movw r24, r18  ;  *movhi
   ldi r25, 0     ;  movqi_insn      |
   ret                               |   ret

   int fn_eq0 (char c)
   {
       return c == 0;
   }

   mov r18, r24    ;  movqi_insn     |   mov r18, r24   ;  movqi_insn
   ldi r24, 1      ;  *movhi         |   ldi r24, 1     ;  *movhi
   ldi r25, 0                        |   ldi r25, 0
   cp  r18, ZERO   ;  cmpqi3         |   cpse r18, ZERO ;  peephole
   breq .+4        ;  branch         |
   ldi r24, 0      ;  *movhi         |   ldi r24, 0     ;  movqi_insn
   ldi r25, 0                        |
   ret                               |   ret

   unsigned fn_crc (unsigned x, unsigned y)
   {
       for (char i = 8; i--; x <<= 1)
           y ^= (x ^ y) & 0x80 ? 79u : 0u;
       return y;
   }

   movw r18, r24   ;  *movhi         |  movw r18, r24    ;  *movhi
   movw r24, r22   ;  *movhi         |  movw r24, r22    ;  *movhi
   ldi  r22, 8     ;  movqi_insn     |  ldi  r22, 8      ;  movqi_insn
  .L13:                              | .L13:
   movw r30, r18   ;  *movhi         |  movw r30, r18    ;  *movhi
   eor  r30, r24   ;  *xorqi3        |  eor  r30, r24    ;  *xorqi3
   eor  r31, r25   ;  *xorqi3        |  eor  r31, r25    ;  *xorqi3
   mov  r20, r30   ;  *andhi3        |  mov  r20, r30    ;  *andqi3
   andi r20, 1<<7                    |  andi r20, 1<<7
   clr  r21                          |
   sbrs r30, 7     ;  *sbrx_branchhi |  sbrc r30, 7      ;  *sbrx_branchhi
   rjmp .+4                          |
   ldi  r20, 79    ;  movqi_insn     |  ldi  r20, 79     ;  movqi_insn
   ldi  r21, 0     ;  movqi_insn     |
   eor  r24, r20   ;  *xorqi3        |  eor r24, r20     ;  *xorqi3
   eor  r25, r21   ;  *xorqi3        |
   lsl  r18        ;  *ashlhi3_const |  lsl  r18         ;  *ashlhi3_const
   rol  r19                          |  rol  r19
   subi r22, 1     ;  *op8.for.cczn.p|  subi r22, 1      ;  *op8.for.cczn.plus
   brne .L13       ;  branch_ZN      |  brne .L13        ;  branch_ZN
   ret                               |  ret

   #define SPDR (*(uint8_t volatile*) 0x2c)

   void fn_PR49807 (long big)
   {
       SPDR = big >> 24;
       SPDR = big >> 16;
       SPDR = big >> 8;
       SPDR = big;
   }

   movw r20, r22   ;  *movhi         |  movw r20, r22    ;  *movhi
   movw r22, r24   ;  *movhi         |  movw r22, r24    ;  *movhi
   mov  r24, r23   ;  *ashrsi3_const |
   clr  r27                          |
   sbrc r24,7                        |
   com  r27                          |
   mov  r25, r27                     |
   mov  r26, r27                     |
   out  0xc, r24   ;  movqi_insn     |  out 0xc, r23     ;  movqi_insn
   movw r24, r22   ;  *ashrsi3_const |
   clr  r27                          |
   sbrc r25, 7                       |
   com  r27                          |
   mov  r26, r27                     |
   out  0xc, r24   ;  movqi_insn     |  out 0xc, r24     ;  movqi_insn
   clr  r27        ;  *ashrsi3_const |
   sbrc r23, 7                       |
   dec  r27                          |
   mov  r26, r23                     |
   mov  r25, r22                     |
   mov  r24, r21                     |
   out  0xc, r24   ;  movqi_insn     |  out 0xc, r21     ;  movqi_insn
   out  0xc, r20   ;  movqi_insn     |  out 0xc, r20     ;  movqi_insn
   ret                               |  ret

	PR target/84211
gcc/
	* doc/invoke.texi (AVR Options) [-mfuse-move]: Document new option.
	* common/config/avr/avr-common.cc (avr_option_optimization_table):
	Set -mfuse-move= depending on optimization level.
	* config/avr/avr.opt (-mfuse-move, -mfuse-move=): New options.
	* config/avr/t-avr (avr-passes.o): Depend on avr-passes-fuse-move.h.
	* config/avr/avr-passes-fuse-move.h: New file, used by avr-passes.cc.
	* config/avr/avr-passes.def (avr_pass_fuse_move): Insert new pass.
	* config/avr/avr-passes.cc (INCLUDE_ARRAY): Define it.
	(insn-attr.h): Include it.
	(avr_pass_data_fuse_move): New const pass_data.
	(avr_pass_fuse_move): New public rtl_opt_pass class.
	(make_avr_pass_fuse_move): New function.
	(gprmask_t): New typedef.
	(next_nondebug_insn_bb, prev_nondebug_insn_bb)
	(single_set_with_scratch, size_to_mask, size_to_mode)
	(emit_valid_insn, emit_valid_move_clobbercc)
	(gpr_regno_p, regmask, has_bits_in)
	(find_arith, find_arith2, any_shift_p): New local functions.
	(AVRasm): New namespace.
	(FUSE_MOVE_MAX_MODESIZE): New define.
	(avr-passes-fuse-move.h): New include.
	(memento_t, absint_t, absins_byte_t, absint_val_t)
	(optimize_data_t, insn_optimizedata_t, find_plies_data_t)
	(insninfo_t, bbinfo_t, ply_t, plies_t): New structs / classes.
	* config/avr/avr-protos.h (avr_chunk, avr_byte, avr_word, avr_int8)
	(avr_uint8, avr_int16, avr_uint16)
	(avr_out_set_some, avr_set_some_operation)
	(output_reload_in_const, make_avr_pass_fuse_move): New protos.
	(avr_dump): Depend macro definition on GCC_DUMPFILE_H.
	* config/avr/avr.cc (avr_option_override): Insert after
	pass "avr-fuse-move" instead of after "peephole2".
	(avr_chunk, avr_byte, avr_word, avr_int8, avr_uint8, avr_int16)
	(avr_uint16, output_reload_in_const): Functions are no more static.
	(avr_out_set_some, avr_set_some_operation): New functions.
	(ashrqi3_out, ashlqi3_out) [offset=7]: Handle "r,r,C07" alternative.
	(avr_out_insert_notbit): Comment also allows QImode.
	(avr_adjust_insn_length) [ADJUST_LEN_SET_SOME]: Handle case.
	* config/avr/avr.md (adjust_len) <set_some>: New attribute value.
	(set_some): New insn.
	(andqi3, *andqi3): Add "r,r,Cb1" alternative.
	(ashrqi3, *ashrqi3 ashlqi3, *ashlqi3): Add a "r,r,C07" alternative.
	(gen_move_clobbercc_scratch): New emit helper.
	* config/avr/constraints.md (Cb1): New constraint.
	* config/avr/predicates.md (dreg_or_0_operand, set_some_operation): New.
	* config/avr/avr-log.cc (avr_forward_to_printf): New static func.
	(avr_log_vadump): Use it to recognize more formats.
gcc/testsuite/
	* gcc.target/avr/torture/test-gprs.h: New file.
	* gcc.target/avr/torture/pr84211-fuse-move-1.c: New test.
	* gcc.target/avr/torture/pr84211-fuse-move-2.c: New test.
2024-11-18 19:14:57 +01:00
Harald Anlauf
386f6d98ba Fortran: add bounds-checking for ALLOCATE of CHARACTER with type-spec [PR53357]
Fix a rejects-(potentially)-valid code for ALLOCATE of CHARACTER with
type-spec, and implement a string-length check for -fcheck=bounds.
Implement more detailed errors or warnings when character function
declarations and references do not match.

	PR fortran/53357

gcc/fortran/ChangeLog:

	* dependency.cc (gfc_dep_compare_expr): Return correct result if
	relationship of expressions could not be determined.
	* interface.cc (gfc_check_result_characteristics): Implement error
	messages if character function declations and references do not
	agree, else emit warning in cases where a mismatch is suspected.
	* trans-stmt.cc (gfc_trans_allocate): Implement a string length
	check for -fcheck=bounds.

gcc/testsuite/ChangeLog:

	* gfortran.dg/auto_char_len_4.f90: Adjust patterns.
	* gfortran.dg/typebound_override_1.f90: Likewise.
	* gfortran.dg/bounds_check_strlen_10.f90: New test.
2024-11-18 19:04:15 +01:00
Richard Biener
c108785c42 tree-optimization/117594 - fix live op vectorization for length masked case
The code was passing factor == 0 to vect_get_loop_len which always
returns an unmodified length, even if the number of scalar elements
doesn't agree.  It also failed to insert the eventually generated
code.

	PR tree-optimization/117594
	* tree-vect-loop.cc (vectorizable_live_operation_1): Pass
	factor == 1 to vect_get_loop_len, insert generated stmts.

	* gcc.dg/vect/pr117594.c: New testcase.
2024-11-18 18:57:21 +01:00
Jeff Law
f5ceca9627 [committed][RISC-V][PR target/117595] Fix bogus use of simplify_gen_subreg
And stage3 begins...

Zdenek's fuzzer caught this one.  Essentially using simplify_gen_subreg
directly with an offset of 0 when we just needed a lowpart.

The offset of 0 works for little endian, but for big endian it's simply wrong.
simplify_gen_subreg will return NULL_RTX because the case isn't representable.
We then embed that NULL_RTX into an insn that's later scanned during
mark_jump_label.

Scanning the port I see a couple more instances of this incorrect idiom.   One
is pretty obvious to fix.  The others look a bit goofy and I'll probably need
to sync with Patrick on them.

Anyway tested on riscv64-elf and riscv32-elf with no regressions.  Pushing to
the trunk.

	PR target/117595
gcc/
	* config/riscv/sync.md (atomic_compare_and_swap<mode>): Use gen_lowpart
	rather than simplify_gen_subreg.
	* config/riscv/riscv.cc (riscv_legitimize_move): Similarly.

gcc/testsuite/
	* gcc.target/riscv/pr117595.c: New test.
2024-11-18 10:55:09 -07:00
Gaius Mulley
ab7abf1db0 PR modula2/117660: Errors referring to variables of type array could display full declaration
This patch ensures that the tokens defining the full declaration of an
ARRAY type is stored in the symbol table and used during production of
error messages.

gcc/m2/ChangeLog:

	PR modula2/117660
	* gm2-compiler/P2Build.bnf (ArrayType): Update tok with the
	composite token produced during array type declaration.
	* gm2-compiler/P2SymBuild.mod (EndBuildArray): Create the
	combinedtok and store it into the symbol table.
	Also ensure combinedtok is pushed to the quad stack.
	(BuildFieldArray): Preserve typetok.
	* gm2-compiler/SymbolTable.def (PutArray): Rename parameters.
	* gm2-compiler/SymbolTable.mod (PutArray): Rename parameters.

gcc/testsuite/ChangeLog:

	PR modula2/117660
	* gm2/iso/fail/arraymismatch.mod: New test.

Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
2024-11-18 17:51:37 +00:00
Georg-Johann Lay
bba27015f2 AVR: target/117659 - Fix wrong code for u24 << 16.
gcc/
	PR target/117659
	* config/avr/avr.cc (avr_out_ashlpsi3) [case 16]: Use %A1 as
	input (instead of bogus %A0).
2024-11-18 18:16:35 +01:00
Jeff Law
1100c0576b Fix more c23 bool fallout
While these haven't shown up in my tester (not configs I test) and I think
we're likely going to be deprecating the nds32 target. we might as well go
ahead and fix them.

I'm going to include this under the pr117628 umbrella.

	PR target/117628

libgcc/
	* config/arm/freebsd-atomic.c (bool): Remove unnecessary typedef.
	* config/arm/linux-atomic-64bit.c: Likewise.
	* config/arm/linux-atomic.c: Likewise.
	* config/nds32/linux-atomic.c: Likewise.
	* config/nios2/linux-atomic.c: Likewise.
2024-11-18 10:11:01 -07:00
Jeff Law
39a39d1f38 [RFA] Fix csky and c6x build failures
csky fails to build libgcc after the c23 changes because it has a typedef for
bool.  AFAICT it's internal to the file, so removing the typedef isn't an ABI
change.

Similiarly for c6x which includes unwind-arm-common.inc.  I suspect most, if
not all of the arm-v7 and older targets are failing to build right now.

I've built and regression tested both csky-linux-gnu and c6x-elf with this
change.  OK for the trunk?

	PR target/117628
libgcc/
	* config/csky/linux-atomic.c (bool): Remove unnecessary typedef.
	* unwind-arm-common.inc (bool): Similarly.
2024-11-18 10:01:32 -07:00
Gaius Mulley
e37641458e PR modula2/117371: Add check for zero step in for loop
This patch is a follow on from PR modula2/117371 which could include
a check to enforce the ISO restriction on a zero for loop step.

gcc/m2/ChangeLog:

	PR modula2/117371
	* gm2-compiler/M2GenGCC.mod (PerformLastForIterator):
	Add check for zero step value and issue an error message.

gcc/testsuite/ChangeLog:

	PR modula2/117371
	* gm2/iso/fail/forloopbyzero.mod: New test.

Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
2024-11-18 16:34:42 +00:00
Eric Botcazou
70999668a1 ada: Fix interaction of aspect Predicate and static case expressions
The semantics of the GNAT-specific Predicate aspect should be equivalent
to those of the Static_Predicate aspect when the predicate expression is
static, but that is not correctly implemented for static case expressions.

gcc/ada/ChangeLog:

	* exp_ch4.adb (Expand_N_Case_Expression): Remove the test on
	enclosing predicate function for the return optimization.
	Rewrite it in the general case to catch all nondynamic predicates.
	(Expand_N_If_Expression): Remove the test on enclosing predicate
	function for the return optimization.
2024-11-18 15:06:55 +01:00
Bob Duff
4e23ce5070 ada: Atomic_Synchronization is not a user-visible check
Remove all user-level documentation of the check name
"Atomic_Synchronization". The documentation was confusing because
this check should never be used in source code, and because it
raises the question of whether All_Checks applies to it (it does
not).

Change the name Atomic_Synchronization to be _Atomic_Synchronization
(with a leading underscore) so that it cannot be used in source code.

This "check" is not really a check at all; it is used only internally in
the implementation of Disable/Enable_Atomic_Synchronization, because the
placement and scope of these pragmas match pragma Suppress.

gcc/ada/ChangeLog:

	* doc/gnat_rm/implementation_defined_characteristics.rst:
	Remove Atomic_Synchronization.
	* doc/gnat_ugn/building_executable_programs_with_gnat.rst:
	Likewise.
	* doc/gnat_rm/implementation_defined_pragmas.rst: DRY.
	Consolidate documentation of Disable/Enable_Atomic_Synchronization.
	* checks.adb: Comment fix.
	* exp_util.ads: Likewise.
	* targparm.ads: Likewise.
	* types.ads: Likewise.
	* gnat1drv.adb: Likewise. DRY.
	* sem_prag.adb (Process_Disable_Enable_Atomic_Sync):
	Change name of Atomic_Synchronization to start with
	underscore.
	(Process_Suppress_Unsuppress): No need to check Comes_From_Source for
	Atomic_Synchronization anymore; _Atomic_Synchronization can never
	come from source. (Anyway, it shouldn't be ignored; it should be
	an error.)
	* snames.ads-tmpl (Atomic_Synchronization):
	Change name to start with underscore.
	* switch-c.adb (Scan_Front_End_Switches):
	Minor cleanup: Use 'in'.
	* gnat_rm.texi: Regenerate.
	* gnat_ugn.texi: Regenerate.
2024-11-18 15:06:55 +01:00
Eric Botcazou
70faad1961 ada: Fix small oversight in removal of N_Unchecked_Expression node
In addition to Resolve_Indexed_Component, Eval_Indexed_Component can also
set the Do_Range_Check flag on the expressions of an N_Indexed_Component
node through the call on Check_Non_Static_Context, so this also needs to
be blocked by the Kill_Range_Check flag.

gcc/ada/ChangeLog:

	* sem_eval.adb (Eval_Indexed_Component): Clear Do_Range_Check on
	the expressions if Kill_Range_Check is set on the node.
2024-11-18 15:06:55 +01:00
Eric Botcazou
b4fd15d8be ada: Fix another minor fallout of previous changes to aggregate expansion
This is another glitch associated with Initialization_Statements.

gcc/ada/ChangeLog:

	* exp_util.adb (Remove_Init_Call): Rewrite a compound statement in
	the Initialization_Statements of the variable as a null statement
	instead of removing it.
	* freeze.adb (Explode_Initialization_Compound_Statement): Small
	comment tweaks.
2024-11-18 15:06:55 +01:00
Eric Botcazou
1b24e30cab ada: Fix another minor fallout of previous changes to aggregate expansion
The processing of static array aggregates in Exp_Aggr requires that their
bounds be representable as Int(eger) values for practical purposes, and
the previous changes have exposed another path where this is not checked.

This introduces a UI_Are_In_Int_Range local predicate for convenience.

gcc/ada/ChangeLog:

	* exp_aggr.adb (UI_Are_In_Int_Range): New predicate.
	(Aggr_Size_OK): Use it.
	(Flatten): Likewise.
	(Packed_Array_Aggregate_Handled): Likewise.
	(Static_Array_Aggregate): Likewise.
2024-11-18 15:06:55 +01:00
Eric Botcazou
3716d9887c ada: Fix minor fallout of previous changes to aggregate expansion
The problem occurs for an anonymous array object declared with an aspect and
when pragma {Initialize,Normalize}_Scalars is in effect: in this case, the
synthesized aggregate is attached to the Initialization_Statements field by
Convert_Aggr_In_Object_Decl, but Explode_Initialization_Compound_Statement
puts it back at the point of declaration instead of the freeze point, thus
voiding the effects of the mechanism.

This was previously hidden because of a bypass in Freeze_Entity which drops
the freeze node on the floor in this case, so the change fixes the issue and
removes the bypass in the process.

gcc/ada/ChangeLog:

	* freeze.ads (Explode_Initialization_Compound_Statement): Adjust the
	description.
	* freeze.adb (Explode_Initialization_Compound_Statement): If the
	entity has its freezing delayed, append the initialization actions
	to its freeze actions.
	(Freeze_Object_Declaration): Remove commented out code.
	(Freeze_Entity): Remove bypass for object of anonymous array type.
2024-11-18 15:06:55 +01:00
Eric Botcazou
6a7849592d ada: Small cleanup and refactoring in expansion of asynchronous select
The exception handler that catches Abort_Signal does nothing nowadays.
This refactors the code to use Build_Abort_Block more consistently and
also makes it simpler by dropping the identifier on the abort block.

No functional changes.

gcc/ada/ChangeLog:

	* exp_sel.ads (Build_Abort_Block): Remove second parameter and
	rename the third.
	(Build_Abort_Block_Handler): Fix description.
	* exp_sel.adb (Build_Abort_Block): Remove second parameter, rename
	the third and adjust accordingly.
	* exp_ch9.adb (Expand_N_Asynchronous_Select): Fix the description
	of the exception handler throughout.  Remove Abort_Block_Ent and
	Hdle local variables.  Call Build_Abort_Block consistently to build
	the abort block and adjust existing calls.
2024-11-18 15:06:55 +01:00
Steve Baird
0019e8dc76 ada: Array aggregate with large static bounds causes compiler crash
In some cases an array aggregate with statically known bounds and at least
one bound outside of the range of a 32-bit signed integer causes
a bugbox.

gcc/ada/ChangeLog:

	* exp_aggr.adb (Convert_To_Positional.Flatten): Avoid raising
	Constraint_Error in UI_To_Int by testing UI_Is_In_Int_Range first.
2024-11-18 15:06:54 +01:00
Eric Botcazou
b2320a12df ada: Cleanup in expansion of array aggregates in object declarations
This mainly decouples the handling of the declaration case from that of the
assignment case in Expand_Array_Aggregate, as well as moves the expansion
in the case of an aggregate that can be processed by the back end to the
Build_Array_Aggr_Code routine.

gcc/ada/ChangeLog:

	* exp_aggr.adb (Build_Array_Aggr_Code): Build the simple assignment
	for the case of an aggregate that can be handled by the back end.
	(Expand_Array_Aggregate): Adjust description of the processing.
	Move handling of declaration case to STEP 4 and remove handling of
	the case of an aggregate that can be processed by the back end.
	(Late_Expansion): Likewise for the second part.
	* exp_ch3.adb (Expand_N_Object_Declaration): Deal with a delayed
	aggregate synthesized for the default initialization, if any.
	* sem_eval.adb (Eval_Indexed_Component): Bail out for the name of
	an assignment statement.
2024-11-18 15:06:54 +01:00
Eric Botcazou
7617b83242 ada: Further cleanup in expansion of array aggregates in allocators
This mainly decouples the handling of the allocator case from that of the
assignment case in Expand_Array_Aggregate and also makes Must_Slide a bit
more forgiving.

gcc/ada/ChangeLog:

	* exp_aggr.adb (In_Place_Assign_OK): Remove handling of allocators
	and call Must_Slide instead of implementing the check manually.
	(Convert_To_Assignments): Adjust outdated comment.
	(Expand_Array_Aggregate): Move handling of allocator case to STEP 3
	and call Must_Slide directly for it.
	(Must_Slide): Replace tests based on Is_OK_Static_Expression with
	tests based on Compile_Time_Known_Value.
2024-11-18 15:06:54 +01:00
Eric Botcazou
856467a7e6 ada: Small cleanup in expansion of array aggregates in allocators
Convert_Array_Aggr_In_Allocator does nothing that Late_Expansion cannot do,
so this deletes the former and moves its support code for Storage_Model to
the latter.  No functional changes.

gcc/ada/ChangeLog:

	* exp_aggr.adb (Convert_Array_Aggr_In_Allocator): Delete.
	(Convert_Aggr_In_Allocator): Do not call above procedure.
	(Late_Expansion): Deal with a target that is the dereference of a
	prefix with a Storage_Model.  Remove an useless actual parameter
	in the call to Build_Array_Aggr_Code.
2024-11-18 15:06:54 +01:00
Javier Miranda
7eafe8e9e9 ada: Constraint error not raised in ACATS test c413007
Reverse the meaning of switch -gnatd_P; that is, enable by default
the generating of a runtime check when the prefix of the call is
an access-to-subprogram type with a null value.

gcc/ada/ChangeLog:

	* sem_res.adb (Resolve_Actuals): Add by default a null-exclusion
	check on the prefix of the call when it is an access-type; it can
	be disabled using -gnatd_P.
	* debug.adb (gnatd_P): Update documentation.
2024-11-18 15:06:54 +01:00
squirek
1850d0dbd3 ada: Crash on 'Access for Stream_Element_Array object
This patch fixes a crash in the compiler when the actual for an anonymous
access type formal is an 'Access of a Sream_Element_Array object during
the calculation of said actual's accessibility level.

gcc/ada/ChangeLog:

	* accessibility.adb (Accessibility_Level): Handle the Input attribute
	case
2024-11-18 15:06:54 +01:00
Ronan Desplanques
28a69cb3db ada: Tweak test for predefined main unit
This change is part of an effort to reduce usage of
Is_Predefined_Filename.

gcc/ada/ChangeLog:

	* frontend.adb (Frontend): tweak test for predefined main unit.
2024-11-18 15:06:54 +01:00
Tobias Burnus
884637b636 libgomp/plugin/plugin-gcn.c: async-queue init - fix function-return type and fail fatally
libgomp/ChangeLog:

	* plugin/plugin-gcn.c (GOMP_OFFLOAD_openacc_async_construct): In
	case of an error, call GOMP_PLUGIN_fatal not ..._error; use NULL
	not false in return.
2024-11-18 14:58:21 +01:00
Jennifer Schmitz
944471eaee testsuite: Move test pr117093.c into gcc.target/aarch64.
The test file pr117093.c failed on platforms other than aarch64, because
it uses arm_neon.h. We moved it into gcc.target/aarch64.

The patch was bootstrapped and tested on aarch64-linux-gnu and
x86_64-linux-gnu, no regression.
Committed as obvious.

Signed-off-by: Jennifer Schmitz <jschmitz@nvidia.com>

gcc/testsuite/
	PR tree-optimization/117093
	* gcc.dg/tree-ssa/pr117093.c: Move to gcc.target/aarch64.
	* gcc.target/aarch64/pr117093.c: New test.
2024-11-18 13:17:19 +01:00
Robin Dapp
52a392b8b7 RISC-V: Add VLS modes to strided loads.
This patch adds VLS modes to the strided load expanders.

gcc/ChangeLog:

	* config/riscv/autovec.md: Add VLS modes.
	* config/riscv/vector-iterators.md: Ditto.
	* config/riscv/vector.md: Ditto.
2024-11-18 11:49:25 +01:00
Robin Dapp
b89273a049 RISC-V: Add else operand to masked loads [PR115336].
This patch adds else operands to masked loads.  Currently the default
else operand predicate just accepts "undefined" (i.e. SCRATCH) values.

	PR middle-end/115336
	PR middle-end/116059

gcc/ChangeLog:

	* config/riscv/autovec.md: Add else operand.
	* config/riscv/predicates.md (maskload_else_operand): New
	predicate.
	* config/riscv/riscv-v.cc (get_else_operand): Remove static.
	(expand_load_store): Use get_else_operand and adjust index.
	(expand_gather_scatter): Ditto.
	(expand_lanes_load_store): Ditto.

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/rvv/autovec/pr115336.c: New test.
	* gcc.target/riscv/rvv/autovec/pr116059.c: New test.
2024-11-18 11:48:42 +01:00
Robin Dapp
ebf3077241 i386: Add zero maskload else operand.
gcc/ChangeLog:

	* config/i386/sse.md (maskload<mode><sseintvecmodelower>):
	Call maskload<mode>..._1.
	(maskload<mode><sseintvecmodelower>_1): Rename.
2024-11-18 11:48:42 +01:00
Robin Dapp
4a39addb49 gcn: Add else operand to masked loads.
This patch adds an undefined else operand to the masked loads.

gcc/ChangeLog:

	* config/gcn/predicates.md (maskload_else_operand): New
	predicate.
	* config/gcn/gcn-valu.md: Use new predicate.
2024-11-18 11:48:42 +01:00
Robin Dapp
a166a6ccdc aarch64: Add masked-load else operands.
This adds zero else operands to masked loads and their intrinsics.
I needed to adjust more than initially thought because we rely on
combine for several instructions and a change in a "base" pattern
needs to propagate to all those.

gcc/ChangeLog:

	* config/aarch64/aarch64-sve-builtins-base.cc: Add else
	handling.
	* config/aarch64/aarch64-sve-builtins.cc (function_expander::use_contiguous_load_insn):
	Ditto.
	* config/aarch64/aarch64-sve-builtins.h: Add else operand to
	contiguous load.
	* config/aarch64/aarch64-sve.md (@aarch64_load<SVE_PRED_LOAD:pred_load>
	_<ANY_EXTEND:optab><SVE_HSDI:mode><SVE_PARTIAL_I:mode>):
	Split and add else operand.
	(@aarch64_load_<ANY_EXTEND:optab><SVE_HSDI:mode><SVE_PARTIAL_I:mode>):
	Ditto.
	(*aarch64_load_<ANY_EXTEND:optab>_mov<SVE_HSDI:mode><SVE_PARTIAL_I:mode>):
	Ditto.
	* config/aarch64/aarch64-sve2.md: Ditto.
	* config/aarch64/iterators.md: Remove unused iterators.
	* config/aarch64/predicates.md (aarch64_maskload_else_operand):
	Add zero else operand.
2024-11-18 11:48:42 +01:00
Robin Dapp
634ae740f5 vect: Add maskload else value support.
This patch adds an else operand to vectorized masked load calls.
The current implementation adds else-value arguments to the respective
target-querying functions that is used to supply the vectorizer with the
proper else value.

We query the target for its supported else operand and uses that for the
maskload call.  If necessary, i.e. if the mode has padding bits and if
the else operand is nonzero, a VEC_COND enforcing a zero else value is
emitted.

gcc/ChangeLog:

	* optabs-query.cc (supports_vec_convert_optab_p): Return icode.
	(get_supported_else_val): Return supported else value for
	optab's operand at index.
	(supports_vec_gather_load_p): Add else argument.
	(supports_vec_scatter_store_p): Ditto.
	* optabs-query.h (supports_vec_gather_load_p): Ditto.
	(get_supported_else_val): Ditto.
	* optabs-tree.cc (target_supports_mask_load_store_p): Ditto.
	(can_vec_mask_load_store_p): Ditto.
	(target_supports_len_load_store_p): Ditto.
	(get_len_load_store_mode): Ditto.
	* optabs-tree.h (target_supports_mask_load_store_p): Ditto.
	(can_vec_mask_load_store_p): Ditto.
	* tree-vect-data-refs.cc (vect_lanes_optab_supported_p): Ditto.
	(vect_gather_scatter_fn_p): Ditto.
	(vect_check_gather_scatter): Ditto.
	(vect_load_lanes_supported): Ditto.
	* tree-vect-patterns.cc (vect_recog_gather_scatter_pattern):
	Ditto.
	* tree-vect-slp.cc (vect_get_operand_map): Adjust indices for
	else operand.
	(vect_slp_analyze_node_operations): Skip undefined else operand.
	* tree-vect-stmts.cc (exist_non_indexing_operands_for_use_p):
	Add else operand handling.
	(vect_get_vec_defs_for_operand): Handle undefined else operand.
	(check_load_store_for_partial_vectors): Add else argument.
	(vect_truncate_gather_scatter_offset): Ditto.
	(vect_use_strided_gather_scatters_p): Ditto.
	(get_group_load_store_type): Ditto.
	(get_load_store_type): Ditto.
	(vect_get_mask_load_else): Ditto.
	(vect_get_else_val_from_tree): Ditto.
	(vect_build_one_gather_load_call): Add zero else operand.
	(vectorizable_load): Use else operand.
	* tree-vectorizer.h (vect_gather_scatter_fn_p): Add else
	argument.
	(vect_load_lanes_supported): Ditto.
	(vect_get_mask_load_else): Ditto.
	(vect_get_else_val_from_tree): Ditto.
2024-11-18 11:48:42 +01:00
Robin Dapp
6b6bd53619 tree-ifcvt: Add zero maskload else value.
When predicating a load we implicitly assume that the else value is
zero.  This matters in case the loaded value is padded (like e.g.
a Bool) and we must ensure that the padding bytes are zero on targets
that don't implicitly zero inactive elements.

A former version of this patch still had this handling in ifcvt but
the latest version defers it to the vectorizer.

gcc/ChangeLog:

	* tree-if-conv.cc (predicate_load_or_store): Add zero else
	operand and comment.
2024-11-18 11:48:41 +01:00
Robin Dapp
8f68d9cb78 ifn: Add else-operand handling.
This patch adds else-operand handling to the internal functions.

gcc/ChangeLog:

	* internal-fn.cc (add_mask_and_len_args): Rename...
	(add_mask_else_and_len_args): ...to this and add else handling.
	(expand_partial_load_optab_fn): Use adjusted function.
	(expand_partial_store_optab_fn): Ditto.
	(expand_scatter_store_optab_fn): Ditto.
	(expand_gather_load_optab_fn): Ditto.
	(internal_fn_len_index): Add else handling.
	(internal_fn_else_index): Ditto.
	(internal_fn_mask_index): Ditto.
	(get_supported_else_vals): New function.
	(supported_else_val_p): New function.
	(internal_gather_scatter_fn_supported_p): Add else operand.
	* internal-fn.h (internal_gather_scatter_fn_supported_p): Define
	else constants.
	(MASK_LOAD_ELSE_ZERO): Ditto.
	(MASK_LOAD_ELSE_M1): Ditto.
	(MASK_LOAD_ELSE_UNDEFINED): Ditto.
	(get_supported_else_vals): Declare.
	(supported_else_val_p): Ditto.
2024-11-18 11:48:41 +01:00