platform/upstream/gcc.git
2 years agotestsuite: opt: Fix const7.C for RISC-V.
Jia-Wei Chen [Fri, 13 May 2022 01:55:45 +0000 (09:55 +0800)]
testsuite: opt: Fix const7.C for RISC-V.

Similar to pr593993, RISC-V needs to limit symbols send in sdata.

gcc/testsuite/ChangeLog:

* g++.dg/opt/const7.C: Don't use small data on RISC-V.

2 years agoMove VREL values to their own enumerated type.
Andrew MacLeod [Thu, 12 May 2022 16:00:39 +0000 (12:00 -0400)]
Move VREL values to their own enumerated type.

Re-using some common things like EQ_EXPR and other relationals made
certain things easier, but complicated debugging and added extra overhead
when accessing lookup tables.   With forthcoming additional relation types,
it makes more sense to simple have a distinct relation kind.

* gimple-range-fold.cc (fold_using_range::range_of_phi): Use new VREL_*
enumerated values.
* gimple-range-path.cc (maybe_register_phi_relation): Ditto.
* range-op.cc (*::lhs_op1_relation): Return relation_kind, and use
new VREL enumerated values.
(*::lhs_op2_relation): Ditto.
(*::op1_op2_relation): Ditto.
(*::fold_range): Use new VREL enumerated values.
(minus_op1_op2_relation_effect): Ditto.
(range_relational_tests): Ditto.
* range-op.h (fold_range, op1_range, op2_range): Use VREL_VARYING.
(lhs_op1_relation, lhs_op2_relation, op1_op2_relation): Return
relation_kind.
(*_op1_op2_relation): Return relation_kind.
(relop_early_resolve): Use VREL_UNDEFINED.
* value-query.cc (range_query::query_relation): Use VREL_VARYING.
* value-relation.cc (VREL_LAST): Change enumerated value.
(vrel_range_assert): Delete.
(print_relation): Remove range assert.
(rr_negate_table): Adjust table to use new enumerated values..
(relation_negate): Remove range assert.
(rr_swap_table): Adjust.
(relation_swap): Remove range assert.
(rr_intersect_table): Adjust.
(relation_intersect): Remove range assert.
(rr_union_table): Adjust.
(relation_union): Remove range assert.
(rr_transitive_table): Adjust.
(relation_transitive): Remove range assert.
(equiv_oracle::query_relation): Use new VREL enumerated values.
(equiv_oracle::register_relation): Ditto.
(relation_oracle::register_stmt): Ditto.
(dom_oracle::set_one_relation): Ditto.
(dom_oracle::register_transitives): Ditto.
(dom_oracle::query_relation): Ditto.
(path_oracle::register_relation): Ditto.
(path_oracle::query_relation): Ditto.
* value-relation.h (enum relation_kind_t): New relation_kind.
(*_op1_op2_relation): Adjust prototypes.

2 years agoReturn a bool result for union, and add performance improvements.
Andrew MacLeod [Mon, 9 May 2022 17:32:31 +0000 (13:32 -0400)]
Return a bool result for union, and add performance improvements.

Union_ returns a boolean indicating if the operation changes the range.
Also optimize the common single-pair UNION single-pair case.

* gimple-range-edge.cc (calc_switch_ranges): Check union return value.
* value-range.cc (irange::legacy_verbose_union_): Add return value.
(irange::irange_single_pair_union): New.
(irange::irange_union): Add return value.
* value-range.h (class irange): Adjust prototypes.

2 years agoAdd a return value to intersect and speed it up.
Andrew MacLeod [Mon, 9 May 2022 17:20:06 +0000 (13:20 -0400)]
Add a return value to intersect and speed it up.

Return true if the intersection of ranges changed the original value.
Speed up the case when there is no change by calling an efficient
contains routine.

* value-range.cc (irange::legacy_verbose_intersect): Add return value.
(irange::irange_contains_p): New.
(irange::irange_intersect): Add return value.
* value-range.h (class irange): Adjust prototypes.

2 years agoFix return value in ranger_cache::get_global_range.
Andrew MacLeod [Fri, 18 Mar 2022 15:50:33 +0000 (11:50 -0400)]
Fix return value in ranger_cache::get_global_range.

The "is_current" status is returned by parameter, but was being returned by the
function as well instead of true if NAME had a global range, and FALSE
if it did not.

* gimple-range-cache.cc (ranger_cache::get_global_range): Return the
had_global value instead.

2 years agoMAINTAINERS: Add myself to write after approval
Surya Kumari Jangala [Fri, 13 May 2022 14:13:50 +0000 (09:13 -0500)]
MAINTAINERS: Add myself to write after approval

2022-05-13  Surya Kumari Jangala  <jskumari@linux.ibm.com>

* MAINTAINERS: Add myself to write after approval.

2 years agoAdd relation between op1 & op2 to lhs_opN_relation API.
Andrew MacLeod [Tue, 15 Feb 2022 15:17:26 +0000 (10:17 -0500)]
Add relation between op1 & op2 to lhs_opN_relation API.

We use the relation between op1 and op2 to help fold a statement, but
it was not provided to the lhs_op1_relation and lhs_op2_relation routines
to determine if is also creates a relation between the LHS and either operand.

gcc/
PR tree-optimization/104547
* gimple-range-fold.cc (fold_using_range::range_of_range_op): Add
the op1/op2 relation to the relation call.
* range-op.cc (*::lhs_op1_relation): Add param.
(*::lhs_op2_relation): Ditto.
(operator_minus::lhs_op1_relation): New.
(range_relational_tests): Add relation param.
* range-op.h (lhs_op1_relation, lhs_op2_relation): Adjust prototype.

gcc/testsuite/
* g++.dg/pr104547.C: New.

2 years agoc++: Local symbols do not get module manglings
Nathan Sidwell [Wed, 6 Apr 2022 13:37:12 +0000 (06:37 -0700)]
c++: Local symbols do not get module manglings

Internal-linkage entity mangling is entirely implementation defined --
there's no ABI issue.  Let's not mangle in any module attachment to
them, it makes the symbols unnecessarily longer.

gcc/cp/
* mangle.cc (maybe_write_module): Check external linkage.
gcc/testsuite/
* g++.dg/modules/mod-sym-4.C: New.

2 years agoExport global ranges during the VRP block walk.
Andrew MacLeod [Thu, 17 Feb 2022 00:59:34 +0000 (19:59 -0500)]
Export global ranges during the VRP block walk.

VRP currently searches the ssa_name list for globals to exported after it
finishes running.  Recent changes have VRP calling a side-effect routine for
each stmt during the walk.  This change simply exports globals as they are
calculated the final time during the walk.

* gimple-range.cc (gimple_ranger::register_side_effects): First check
if the DEF should be exported as a global.
* tree-vrp.cc (rvrp_folder::pre_fold_bb): Process PHI side effects,
which will export globals.
(execute_ranger_vrp): Remove call to export_global_ranges.

2 years agoClear killing defs when resetting the path in path_oracle.
Andrew MacLeod [Wed, 23 Feb 2022 17:25:20 +0000 (12:25 -0500)]
Clear killing defs when resetting the path in path_oracle.

When we reset the path oracle, we should clear the killing defs vector.

* value-relation.cc (path_oracle::reset_path): Clear killing_defs.

2 years agoMake range_from_dom more effective.
Andrew MacLeod [Thu, 24 Mar 2022 19:28:43 +0000 (15:28 -0400)]
Make range_from_dom more effective.

Add modes to range_from_dom such that we can simply query, or adjust the
cache and deal with multiple predecessor blocks.

* gimple-range-cache.cc (ranger_cache::ranger_cache): Start with
worlist truncated.
(ranger_cache::entry_range): Add rfd_mode parameter.
(ranger_cache::exit_range): Ditto.
(ranger_cache::edge_range): New.  Incorporate from range_on_edge.
(ranger_cache::range_of_expr): Adjust call to entry_range.
(ranger_cache::range_on_edge): Split to edge_range and call.
(ranger_cache::fill_block_cache): Always invoke range_from_dom.
(ranger_cache::range_from_dom): Make reentrant, add search mode, handle
mutiple predecessors.
(ranger_cache::update_to_nonnull): Adjust call to exit_range.
* gimple-range-cache.h (ranger_cache): Add enum rfd_mode.  Adjust
prototypes.

2 years agolibstdc++: Improve doxygen docs for <mutex>
Jonathan Wakely [Thu, 12 May 2022 22:06:04 +0000 (23:06 +0100)]
libstdc++: Improve doxygen docs for <mutex>

libstdc++-v3/ChangeLog:

* doc/doxygen/user.cfg.in (PREDEFINED): Define
_GTHREAD_USE_MUTEX_TIMEDLOCK macro.
* include/bits/std_mutex.h (mutex, lock_guard): Use @since and
@headerfile.
* include/bits/unique_lock.h (unique_lock): Likewise.
* include/std/mutex (recursive_mutex, timed_mutex)
(recursive_timed_mutex, scoped_lock): Likewise.

2 years agolibstdc++: Improve doxygen docs for some of <memory>
Jonathan Wakely [Thu, 12 May 2022 22:04:29 +0000 (23:04 +0100)]
libstdc++: Improve doxygen docs for some of <memory>

libstdc++-v3/ChangeLog:

* doc/doxygen/user.cfg.in (PREDEFINED): Define
_GLIBCXX23_CONSTEXPR macro.
* include/backward/auto_ptr.h (auto_ptr): Use @deprecated.
* include/bits/unique_ptr.h (default_delete): Use @since and
@headerfile.
* include/std/scoped_allocator: Remove @ingroup from @file
block.

2 years agolibstdc++: Improve doxygen docs for <thread> and <future>
Jonathan Wakely [Thu, 12 May 2022 21:26:34 +0000 (22:26 +0100)]
libstdc++: Improve doxygen docs for <thread> and <future>

libstdc++-v3/ChangeLog:

* include/bits/std_thread.h (thread, thread::id): Improve
doxygen docs.
* include/std/future: Likewise.
* include/std/thread (jthread): Likewise.

2 years agolibstdc++: Improve doxygen docs for algorithms and more
Jonathan Wakely [Thu, 12 May 2022 13:13:37 +0000 (14:13 +0100)]
libstdc++: Improve doxygen docs for algorithms and more

libstdc++-v3/ChangeLog:

* include/bits/ostream_insert.h: Mark helper functions as
undocumented by Doxygen.
* include/bits/stl_algo.h: Use markdown for formatting and mark
helper functions as undocumented.
* include/bits/stl_numeric.h:  Likewise.
* include/bits/stl_pair.h (pair): Add @headerfile.

2 years agolibstdc++: Improve doxygen docs for std::allocator
Jonathan Wakely [Thu, 12 May 2022 12:44:52 +0000 (13:44 +0100)]
libstdc++: Improve doxygen docs for std::allocator

libstdc++-v3/ChangeLog:

* doc/doxygen/user.cfg.in (PREDEFINED): Define __allocator_base
so that Doxygen shows the right base-class for std::allocator.
* include/bits/alloc_traits.h: Improve doxygen docs.
* include/bits/allocator.h: Likewise.
* include/bits/new_allocator.h: Likewise.
* include/ext/new_allocator.h: Likewise.

2 years agolibstdc++: Improve doxygen docs for <regex>
Jonathan Wakely [Thu, 12 May 2022 11:16:17 +0000 (12:16 +0100)]
libstdc++: Improve doxygen docs for <regex>

Add @headerfile and @since tags. Improve grouping of non-member
functions via @relates tags.

Mark the std::pair base class of std::sub_match as undocumented, so that
the docs don't show all the related non-member functions are part of the
sub_match API. Use a new macro to re-add the data members for Doxygen
only.

libstdc++-v3/ChangeLog:

* doc/doxygen/user.cfg.in (PREDEFINED): Define macro
_GLIBCXX_DOXYGEN_ONLY to expand its argument.
* include/bits/c++config (_GLIBCXX_DOXYGEN_ONLY): Define.
* include/bits/regex.h: Improve doxygen docs.
* include/bits/regex_constants.h: Likewise.
* include/bits/regex_error.h: Likewise.

2 years agolibstdc++: Improve doxygen docs for <atomic>
Jonathan Wakely [Wed, 11 May 2022 22:52:20 +0000 (23:52 +0100)]
libstdc++: Improve doxygen docs for <atomic>

libstdc++-v3/ChangeLog:

* include/std/atomic: Suppress doxygen docs for
implementation details.
* include/bits/atomic_base.h: Likewise.
* include/bits/shared_ptr_atomic.h: Use markdown. Fix grouping
so that std::atomic is not added to the pointer abstractions
group.

2 years agolibstdc++: Improve doxygen docs for <system_error>
Jonathan Wakely [Wed, 11 May 2022 21:48:17 +0000 (22:48 +0100)]
libstdc++: Improve doxygen docs for <system_error>

libstdc++-v3/ChangeLog:

* include/std/system_error: Improve doxygen comments.

2 years agolibstdc++: Improve doxygen docs for std::pointer_traits
Jonathan Wakely [Wed, 11 May 2022 15:13:16 +0000 (16:13 +0100)]
libstdc++: Improve doxygen docs for std::pointer_traits

libstdc++-v3/ChangeLog:

* include/bits/ptr_traits.h: Add some doxygen comments.

2 years agolibstdc++: Add macros for the inline namespace std::_V2
Jonathan Wakely [Wed, 11 May 2022 15:35:45 +0000 (16:35 +0100)]
libstdc++: Add macros for the inline namespace std::_V2

Use macros to open and close the inline namespace _V2 that is used for
ABI versioning of individual components such as chrono::system_clock.

This allows the namespace to be hidden in the docs generated by Doxygen,
so that we document std::foo instead of std::_V2::foo.

This also makes it easy to remove that namespace entirely for the
gnu-versioned-namespace build, where everything is already versioned as
std::__8 and there are no backwards compatibility guarantees.

libstdc++-v3/ChangeLog:

* doc/doxygen/user.cfg.in (PREDEFINED): Expand new macros to
nothing.
* include/bits/c++config (_GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE)
(_GLIBCXX_END_INLINE_ABI_NAMESPACE): Define new macros.
* include/bits/algorithmfwd.h (_V2::__rotate): Use new macros
for the namespace.
* include/bits/chrono.h (chrono::_V2::system_clock): Likewise.
* include/bits/stl_algo.h (_V2::__rotate): Likewise.
* include/std/condition_variable (_V2::condition_variable_any):
Likewise.
* include/std/system_error (_V2::error_category): Likewise.

2 years agolibstdc++: Fix typo in doxygen @headerfile command
Jonathan Wakely [Wed, 11 May 2022 15:06:13 +0000 (16:06 +0100)]
libstdc++: Fix typo in doxygen @headerfile command

libstdc++-v3/ChangeLog:

* include/bits/mofunc_impl.h: Fix doxygen command.

2 years agolibstdc++: Disable Doxygen GROUP_NESTED_COMPOUNDS config option
Jonathan Wakely [Wed, 11 May 2022 15:46:03 +0000 (16:46 +0100)]
libstdc++: Disable Doxygen GROUP_NESTED_COMPOUNDS config option

Before Doxygen version 1.9.2 this option is broken (see
https://github.com/doxygen/doxygen/issues/8638 for more details) and
classes are not added to the correct groups by @ingroup and @addtogroup.

Also remove the obsolete CLASS_DIAGRAMS option that causes a warning.

libstdc++-v3/ChangeLog:

* doc/doxygen/user.cfg.in (GROUP_NESTED_COMPOUNDS): Set to NO.
(CLASS_DIAGRAMS): Remove obsolete option.

2 years agolibgomp nvptx plugin: Only consider '--with-cuda-driver=[...]' when applicable
Thomas Schwinge [Thu, 12 May 2022 15:51:43 +0000 (17:51 +0200)]
libgomp nvptx plugin: Only consider '--with-cuda-driver=[...]' when applicable

They're not applicable in 'PLUGIN_NVPTX_DYNAMIC' configurations.

libgomp/
* plugin/Makefrag.am (libgomp_plugin_nvptx_la_CPPFLAGS)
[PLUGIN_NVPTX_DYNAMIC]: Don't append '$(PLUGIN_NVPTX_CPPFLAGS)'.
(libgomp_plugin_nvptx_la_LDFLAGS) [PLUGIN_NVPTX_DYNAMIC]: Don't
append '$(PLUGIN_NVPTX_LDFLAGS)'.
* Makefile.in: Regenerate.

2 years agoAvoid visiting newly-created blocks in harden-conditionals
Alexandre Oliva [Fri, 13 May 2022 10:48:51 +0000 (07:48 -0300)]
Avoid visiting newly-created blocks in harden-conditionals

Reverse iteration over blocks, in gimple-harden-conditionals.cc, was
supposed to avoid visiting blocks introduced by hardening and
introducing further reversed conditionals and traps for them, but
newly-created blocks may be inserted before the current block, as
shown by the PR105455 testcase.

Use an auto_sbitmap to gather preexisting blocks that need visiting.

for  gcc/ChangeLog

* gimple-harden-conditionals.cc: Include sbitmap.h.
(pass_harden_conditional_branches::execute): Skip new blocks.
(pass_harden_compares::execute): Likewise.

2 years agoada: gcc-if: build proper String_Pointer for Get_External_Name
Alexandre Oliva [Fri, 13 May 2022 10:48:50 +0000 (07:48 -0300)]
ada: gcc-if: build proper String_Pointer for Get_External_Name

The compiler is allowed to assume it can access String bounds, such as
the prefix passed to Get_External_Name, even in circumstances in which
the prefix is not going to be used and has_prefix is false, so, from
the C side, we have to build a proper String_Template for the
String_Pointer.

for  gcc/ada/ChangeLog

* gcc-interface/decl.cc (is_cplusplus_method): Build proper
String for Get_External_Name.

2 years agoIntroduce tests for hardbool Machine_Attribute for Ada
Alexandre Oliva [Fri, 13 May 2022 10:48:49 +0000 (07:48 -0300)]
Introduce tests for hardbool Machine_Attribute for Ada

Test for the validity checking performed on nonstandard booleans
annotated with the "hardbool" Machine_Attribute pragma.

for  gcc/testsuite/ChangeLog

* gnat.dg/hardbool.ads: New.
* gnat.dg/hardbool.adb: New.

2 years agoarm: correctly handle misaligned MEMs on MVE [PR105463]
Richard Earnshaw [Wed, 11 May 2022 12:08:40 +0000 (13:08 +0100)]
arm: correctly handle misaligned MEMs on MVE [PR105463]

Vector operations in MVE must be aligned to the element size, so if we
are asked for a misaligned move in a wider mode we must recast it to a
form suitable for the known alignment (larger elements have better
address offset ranges, so there is some advantage to using wider
element sizes if possible).  Whilst fixing this, also rework the
predicates used for validating operands - the Neon predicates are
not right for MVE.

gcc/ChangeLog:

PR target/105463
* config/arm/mve.md (*movmisalign<mode>_mve_store): Use
mve_memory_operand.
(*movmisalign<mode>_mve_load): Likewise.
* config/arm/vec-common.md (movmisalign<mode>): Convert to generator
form...
(@movmisalign<mode>): ... thus.  Use generic predicates and then
rework operands if they are not valid.  For MVE rework to a
narrower element size if the alignment is not high enough.

2 years agoarm: fix some issues in mve_vector_mem_operand
Richard Earnshaw [Wed, 11 May 2022 10:40:42 +0000 (11:40 +0100)]
arm: fix some issues in mve_vector_mem_operand

There are a couple of issues with the mve_vector_mem_operand function.
Firstly, SP is permitted as a register provided there is no write-back
operation.  Secondly, there were some cases where 'strict' was not
being applied when checking which registers had been used.

gcc/ChangeLog:

* config/arm/arm.cc (mve_vector_mem_operand): Allow SP_REGNUM
when there is no write-back.  Fix use when strict is true.

2 years agoxtensa: Reflect the 32-bit Integer Divide Option
Takayuki 'January June' Suwa [Fri, 6 May 2022 10:34:19 +0000 (19:34 +0900)]
xtensa: Reflect the 32-bit Integer Divide Option

On Espressif's ESP8266 (based on Tensilica LX106, no hardware divider),
this patch reduces the size of each:

  __moddi3() @ libgcc.a :  969 -> 301 (saves 668)
  __divmoddi4()         : 1111 -> 426 (saves 685)
  __udivmoddi4()        : 1043 -> 319 (saves 724)

in bytes, respectively.

gcc/ChangeLog:

* config/xtensa/xtensa.h (TARGET_HAS_NO_HW_DIVIDE): New macro
definition.

2 years agoxtensa: Rename deprecated extv/extzv insn patterns to extvsi/extzvsi
Takayuki 'January June' Suwa [Fri, 6 May 2022 10:34:06 +0000 (19:34 +0900)]
xtensa: Rename deprecated extv/extzv insn patterns to extvsi/extzvsi

These patterns were deprecated since GCC 4.8.

gcc/ChangeLog:

* config/xtensa/xtensa.md (extvsi, extvsi_internal, extzvsi,
extzvsi_internal): Rename from extv, extv_internal, extzv and
extzv_internal, respectively.

2 years agoFix wrong SRA with VIEW_CONVERT_EXPR and reverse SSO
Eric Botcazou [Fri, 13 May 2022 09:15:08 +0000 (11:15 +0200)]
Fix wrong SRA with VIEW_CONVERT_EXPR and reverse SSO

Most cases of VIEW_CONVERT_EXPRs involving reverse scalar storage order are
disqualified for SRA because they are storage_order_barrier_p, but you can
still have a VIEW_CONVERT_EXPR to a regular composite type being applied to
a component of a record type with reverse scalar storage order.

In this case the bypass for !useless_type_conversion_p in sra_modify_assign,
albeit already heavily guarded, triggers and may generate wrong code, so the
patch makes sure that it does only when the SSO is the same on both side.

gcc/
* tree-sra.cc (sra_modify_assign): Check that scalar storage order
is the same on the LHS and RHS before rewriting one with the model
of the other.
gcc/testsuite/
* gnat.dg/sso17.adb: New test.

2 years ago[Ada] Fix incorrect call to inherited function with limited return type
Eric Botcazou [Sat, 5 Mar 2022 18:18:18 +0000 (19:18 +0100)]
[Ada] Fix incorrect call to inherited function with limited return type

This is a return convention mismatch coming from a discrepancy of the
Returns_By_Ref flag for the inherited function.

gcc/ada/

* sem_ch3.adb (Derive_Subprogram): For a function, also copy the
Returns_By_Ref flag from the parent.

2 years ago[Ada] Storage_Model_Object fails to return object entity
Gary Dismukes [Fri, 4 Mar 2022 22:19:18 +0000 (17:19 -0500)]
[Ada] Storage_Model_Object fails to return object entity

After a compilation unit containing a Designated_Storage_Model aspect
was processed by the compiler front end, the aspect's expression was
seen as not having been analyzed. In some cases this can lead to the
Storage_Model_Object function not returning the entity of the associated
model object (such as when the model object is specified using an
expanded name). This was due to a second copy of the aspect's expression
being made in Check_Aspect_At_Freeze_Point, and that copy wasn't
analyzed, even though the earlier version of the expression prior to
that copy had been. (The copy is needed for proper checking of Ada's
rules for ensuring that certain aspect expressions resolve the same way
at the freeze point and later at the end of the declarations.) This is
corrected by doing analysis of the new aspect expression within
Check_Aspect_At_Freeze_Point, as is already done in that procedure in
the case of several other aspects.

gcc/ada/

* sem_ch13.adb (Check_Aspect_At_Freeze_Point): Analyze the
expression of the aspect at this point, like other aspects that
denote simple entities. Ensures that function
Storage_Model_Object will have an entity to retrieve from the
aspect expression. Also, move comment about aspects that don't
require delay analysis in front of last alternative of the case
statement, where it's supposed to be.

2 years ago[Ada] Compiler crash on -gnata -O2
Javier Miranda [Tue, 15 Feb 2022 19:09:48 +0000 (19:09 +0000)]
[Ada] Compiler crash on -gnata -O2

gcc/ada/

* contracts.adb (Build_Unique_Name): New subprogram.
(Make_Class_Precondition_Subps): Use Build_Unique_Name to
generate the names of the call helpers and the name of indirect
call wrappers.
* freeze.adb (Needs_Wrapper): Remove dead code.
(Check_Inherited_Conditions): Defer building helpers and ICW
until all the dispatch table wrappers have been built and
analyzed. Required to ensure uniqueness in their names because
when building these wrappers for overlapped subprograms their
homonym number is not definite until they have been analyzed.

2 years ago[Ada] Only use alternate stack when needed
Arnaud Charlet [Fri, 25 Feb 2022 09:39:57 +0000 (04:39 -0500)]
[Ada] Only use alternate stack when needed

If we're not going to install a signal handler for SIGSEGV then we do
not need an alternate stack to handle this signal (and e.g. stack
overflows).

gcc/ada/

* libgnarl/s-taprop__linux.adb (Initialize): Do not use an
alternate stack if no handler for SEGV is installed.

2 years ago[Ada] Extend hardcfr testing (documentation)
Alexandre Oliva [Wed, 23 Feb 2022 15:57:15 +0000 (12:57 -0300)]
[Ada] Extend hardcfr testing (documentation)

Having realized that noreturn calls of __builtin_return are special,
and other noreturn calls don't get edges to the exit block, I've
realized the consequences of the logic to insert checking before
noreturn and tail calls were not quite what I'd expected before.

Specifically, noreturn calls other than __builtin_return don't get any
checking whatsoever.  Moreover, optional tail calls are only detected
long after hardcfr; the logic should work for must-tail calls, but
there doesn't seem to be a way to test it.

Documentation has been simplified so as to remove mention of these
possibilities, that can't really be relied on.

gcc/ada/

* doc/gnat_rm/security_hardening_features.rst (Control Flow
Redundancy): Drop mentions of noreturn and tail calls.
* gnat_rm.texi: Regenerate.

2 years ago[Ada] CUDA: use binder to generate kernel-registration code
Ghjuvan Lacambre [Tue, 14 Sep 2021 08:49:08 +0000 (10:49 +0200)]
[Ada] CUDA: use binder to generate kernel-registration code

Compiling CUDA code requires compiling code for the host (= CPU) and for
the device (= GPU). Device code is embedded into the host code and must
be registered with the CUDA runtime by the host.

The original approach we took for registering CUDA kernels was to
generate the registration-code on a unit basis, i.e. each unit took care
of registering its own kernels. Unfortunately, this makes linking
kernels and device functions that belong to different units much harder.

We thus rework this approach in order to have GNAT generate kernel names
in ALI files. The binder reads the ALI files and generates kernel
registration code for each of the kernels found in ALI files.

gcc/ada/

* ali.adb: Introduce new 'K' line in ALI files, used to
represent CUDA kernel entries.
* ali.ads: Create new CUDA_Kernels table, which contains entries
of type CUDA_Kernel_Record. Each CUDA_Kernel_Record corresponds
to a K line in an ali file.
* bindgen.adb: Introduce new Gen_CUDA_Init procedure in the
binder, which generates CUDA kernel registration code.
* gnat_cuda.adb: Move Get_CUDA_Kernels spec to package spec to
make it available to bindgen.adb.
* gnat_cuda.ads: Likewise.
* lib-writ.adb: Introduce new Output_CUDA_Symbols procedure,
which generates one 'K' line in the ALI file per visible CUDA
kernel.
* opt.ads: Introduce Enable_CUDA_Expansion option, triggered by
using the -gnatd_c flag.
* switch-b.adb: Likewise.
* switch-c.adb: Likewise.

2 years ago[Ada] Fix iterated component association for array aggregate
Marc Poulhiès [Fri, 18 Feb 2022 15:35:06 +0000 (16:35 +0100)]
[Ada] Fix iterated component association for array aggregate

Create a scope for the Ada 2022 iterated component association loops. In
the case of elements needing finalization, the late expansion would
crash on references to the loop variable within the loop body.

gcc/ada/

* exp_aggr.adb (Gen_Loop): Create scope for loop variable of
iterated components.

2 years ago[Ada] Simplify helper units for formal hashed sets/maps
Yannick Moy [Thu, 24 Feb 2022 16:30:36 +0000 (17:30 +0100)]
[Ada] Simplify helper units for formal hashed sets/maps

As tampering checks do not exist in formal hashed sets and maps, remove
the machinery for such checks in the version of generic key and node
operations for formal sets/maps. Update comments as well.

gcc/ada/

* libgnat/a-chtgfk.adb (Checked_Equivalent_Keys, Checked_Index):
Remove useless functions.
(Delete_Key_Sans_Free, Find, Generic_Conditional_Insert): Adapt
to removal of wrapper functions.
* libgnat/a-chtgfk.ads (Checked_Equivalent_Keys, Checked_Index):
Remove useless functions.
* libgnat/a-chtgfo.adb (Checked_Index): Remove useless function.
(Clear): Delete code commented out regarding Busy and Lock
management.
(Delete_Node_At_Index): Delete unused procedure.
(Delete_Node_Sans_Free, Free, Generic_Read, Next): Adapt to
removal of wrapper functions.
* libgnat/a-chtgfo.ads (Checked_Index): Remove useless function.
(Delete_Node_At_Index): Delete unused procedure.

2 years ago[Ada] Adapt body of formal sets and maps for SPARK
Yannick Moy [Thu, 17 Feb 2022 07:58:30 +0000 (08:58 +0100)]
[Ada] Adapt body of formal sets and maps for SPARK

Remove violations of SPARK rules, to prepare for the proof of hashed
sets and maps:

- Make the type of hash tables not tagged, so that it will be possible
  to mark the type of nodes as having relaxed initialization.

- Remove comparison of addresses as check or optimization: as a check,
  it is not necessary in SPARK as the caller cannot pass in aliased
  parameters in such cases; as an optimization, it is not possible in
  SPARK code.

- Avoid aliasing when inserting a node in the hash table. The code for
  insertion in sets and maps was explicitly aliasing a global for the
  container and a parameter for its hash table component, both being
  written. Rewrite the code to pass only the hash table as parameter.

- Insert constants for subtype constraints, which cannot depend on
  variables in SPARK code.

- Use procedures instead of functions when side-effects are expected.

- Rename variables whose value is only written through calls and not
  read, using Unused prefix, so that flow analysis does not warn about
  it.

gcc/ada/

* libgnat/a-cfhama.adb (Generic_Allocate): Retype to avoid
aliasing.
(Assign, Move): Remove address comparison.
(Include): Insert constants for subtype constraints.
(Insert): Rewrite to avoid aliasing and function with side-effects.
* libgnat/a-cfhase.adb (Generic_Allocate): Retype to avoid
aliasing.
(Assign, Move): Remove address comparison.
(Difference, Intersection, Is_Subset, Overlap,
Symmetric_Difference, Union): Remove address comparison.  Insert
constants for subtype constraints.
(Insert): Rewrite to avoid aliasing and function with
side-effects.
* libgnat/a-chtgfk.adb (Checked_Equivalent_Keys, Checked_Index,
Delete_Key_Sans_Free, Find, Generic_Replace_Element, Index):
Type for hash tables not tagged anymore.
(Generic_Conditional_Insert): New_Node generic formal is a
procedure taking the hash table as first parameter now, to avoid
aliasing in the caller.
* libgnat/a-chtgfk.ads: Same.
* libgnat/a-chtgfo.adb (Checked_Index, Clear,
Delete_Node_At_Index, Delete_Node_Sans_Free, First, Free,
Generic_Allocate, Generic_Iteration, Generic_Read,
Generic_Write, Index, Next): Type for hash tables not tagged
anymore.
(Generic_Equal): Removed tagged. Remove address comparison.
* libgnat/a-chtgfo.ads: Same.
* libgnat/a-cohata.ads (Hash_Table_Type): Remove tagged.

2 years ago[Ada] Remove dependency on tampering checks and controlled types for formal
Yannick Moy [Wed, 16 Feb 2022 12:56:50 +0000 (13:56 +0100)]
[Ada] Remove dependency on tampering checks and controlled types for formal

Formal hashed sets and maps are now using a different type of hash table
that does not require controlled types. This is possible because formal
containers do not rely on tampering checks, as cursors do not hold a
pointer to a single matching container, but are logical indexes that can
be used with multiple containers.

For simplicity of the package organisation, and symmetry with other
versions of containers, add a formal version of hashed types in the
shared Ada.Containers.Hash_Tables unit. This unit should be specialized
to only include the formal version of hash tables for runtimes that
do not support controlled types (so that the dependency on
Ada.Containers.Helpers can be removed).

The new versions of units for generic keys and operations are modified
versions of the units for bounded containers, with all tampering checks
removed (they were no-op in formal containers). A declaration of
constant Checks is added at the start of the body, as these units cannot
use the version in Ada.Containers.Helpers.

gcc/ada/

* Makefile.rtl: Add new files.
* libgnat/a-cfhama.adb: Use formal version of hash tables.
* libgnat/a-cfhama.ads: Same.
* libgnat/a-cfhase.adb: Same.
* libgnat/a-cfhase.ads: Same.
* libgnat/a-chtgfk.adb: New unit for formal containers, modified
version of Generic_Bounded_Keys.
* libgnat/a-chtgfk.ads: Same.
* libgnat/a-chtgfo.adb: New unit for formal containers, modified
version of Generic_Bounded_Operations.
* libgnat/a-chtgfo.ads: Same.
* libgnat/a-cohata.ads (Generic_Formal_Hash_Table_Types): Third
version of the type for hash tables, equivalent to the bounded
version without tampering checks.

2 years ago[Ada] Ada ABI change when building with assertions
Javier Miranda [Sun, 27 Feb 2022 11:42:46 +0000 (11:42 +0000)]
[Ada] Ada ABI change when building with assertions

Compiling with and without assertions enabled the name of some generated
symbols differ; this is an issue when using pre-built libraries.

gcc/ada/

* freeze.adb (Check_Inherited_Conditions): Dispatch table
wrappers must be placed in the list of entities of their scope
at the same place of their wrapped primitive. This is required
for private types since these wrappers are built when their full
tagged type declaration is frozen but they may override a
primitive defined in the public part of the package (and it is
important to maintain the wrapper in the list of public entities
of the package to ensure their correct visibility).

2 years ago[Ada] Take into account GNSA_ROOT env var for prefix
Johannes Kanig [Thu, 24 Feb 2022 10:47:47 +0000 (19:47 +0900)]
[Ada] Take into account GNSA_ROOT env var for prefix

The GNSA_ROOT environment variable can be used to indicate to the
compiler how to find the runtime directory.

gcc/ada/

* osint.ads, osint.adb (Relocate_Path): If the GNSA_ROOT
environment variable is set, we use that as the prefix, instead
of computing the prefix from the executable location.

2 years ago[Ada] Implement late initialization rules for type extensions
Steve Baird [Wed, 9 Feb 2022 01:43:14 +0000 (17:43 -0800)]
[Ada] Implement late initialization rules for type extensions

Default initialization of a record object is required to initialize any
components that "require late initialization" after other components.
This includes the case of a type extension; "late initialization"
components of the parent type are required to be initialized after
non-late-init extension components. This is implemented by generalizing
the use of an existing init proc parameter. Previously, the init proc
for a tagged type took a Boolean parameter indicating whether or not to
initialize the Tag component. With this change, this parameter can now
take on any of four values indicating whether to perform

   1) Full initialization (including the tag component).
   2) Full initialization except for the tag component.
   3) Early (non-tag) initialization only.
   4) Late (non-tag) initialization only.

With this change, the init proc for a type extension has the option of
performing the early and late portions of the parent's initialization
via two separate calls to the parent type's init proc.

gcc/ada/

* exp_ch3.ads (Build_Intialization_Call): Add new formal
parameter, Init_Control_Actual, with default value. Clients
outside of package Exp_Ch3 are unaffected.
* exp_ch3.adb (Initialization_Control): new package; support for
this 4-valued parameter.  The existing Requires_Late_Init
function is moved into this new package.
(Build_Initialization_Call): Add new formal parameter for
subprogram body, use this new formal parameter in generating an
init proc call.
(Build_Record_Init_Proc): Replace Set_Tag Boolean formal
parameter with 4-valued Init_Control_Formal. Wrap if-statements
with appropriate conditions around tag initialization, early
initialization, and late initialization statements.
* exp_util.adb (Build_Task_Image_Decl): Avoid problem with
duplicate declarations when an init proc for a type extension
calls the parent type's init proc twice.

2 years ago[Ada] Handle IN iterator for class-wide derived object of iterator type
Ed Schonberg [Tue, 15 Feb 2022 14:38:42 +0000 (15:38 +0100)]
[Ada] Handle IN iterator for class-wide derived object of iterator type

The compiler currently rejects iterating on an interface type derived
from an iterator type.

See Ada RM 5.5.1(6/3) and 5.5.2(3/3).

gcc/ada/

* sem_ch5.adb (Analyze_Iterator_Specification): Fix Typ in the
case of a class-wide derived iterator.

2 years ago[Ada] Facilitate proof of Overwrite in bounded strings library
Yannick Moy [Wed, 23 Feb 2022 11:58:42 +0000 (12:58 +0100)]
[Ada] Facilitate proof of Overwrite in bounded strings library

Consistently use >= operator in both the code and contracts of
function/procedure Overwrite, to facilitate proof, instead of the strict
inequality > sometimes, as only New_Item remains in the result in the
case of equal size too.

gcc/ada/

* libgnat/a-strbou.ads (Overwrite): Switch to >= operator in
contracts.
* libgnat/a-strsup.adb (Super_Overwrite): Switch to >= operator
in code of procedure (function already uses it).
* libgnat/a-strsup.ads (Super_Overwrite): Switch to >= operator
in contracts.

2 years ago[Ada] Fix code example on representation clause
Etienne Servais [Wed, 23 Feb 2022 10:44:42 +0000 (11:44 +0100)]
[Ada] Fix code example on representation clause

The column is superfluous, component names are missing.

gcc/ada/

* doc/gnat_rm/representation_clauses_and_pragmas.rst: Fix code
snippet.
* gnat_rm.texi: Regenerate.

2 years ago[Ada] Do not overwrite limited view of result type
Eric Botcazou [Sat, 19 Feb 2022 11:30:47 +0000 (12:30 +0100)]
[Ada] Do not overwrite limited view of result type

This removes obsolete code that overwrites a limited view present as the
result type of a function during the tentative analysis of prefixed
views for function calls involving tagged types. The original view is
necessary for the code generator to break the circularity present in
this setup.

The change also adds a couple of guards for the illegal case where the
limited view is the only view available when the function is invoked.

gcc/ada/

* aspects.adb (Find_Value_Of_Aspect): Add guard.
* sem_ch4.adb (Complete_Object_Operation): Remove obsolete code.
* sem_ch5.adb (Has_Sec_Stack_Default_Iterator): Add guard.

2 years ago[Ada] Wrong address for class-wide interface access conversion
Javier Miranda [Tue, 15 Feb 2022 18:39:42 +0000 (18:39 +0000)]
[Ada] Wrong address for class-wide interface access conversion

The compiler generates wrong code on instantiations of package
Address_To_Access_Conversions when the generic formal is a class-wide
interface type; this causes wrong dispatching calls when the
access-to-class-wide-interface object returned by To_Pointer is used to
dispatch a call.

gcc/ada/

* exp_attr.adb (Expand_N_Attribute_Reference): The expansion of
'Address in a call to an instantiation of the implicit
subprogram To_Pointer with a class-wide interface type target
requires adding an implicit type conversion to force
displacement of the "this" pointer.

2 years ago[Ada] Crash in task body reference to discriminant
Javier Miranda [Sun, 6 Feb 2022 11:23:53 +0000 (11:23 +0000)]
[Ada] Crash in task body reference to discriminant

The compiler may crash processing the successor or predecessor of a task
type discrete discriminant.

gcc/ada/

* sem_attr.adb (Resolve_Attribute): Ensure that attribute
expressions are resolved at this stage; required for preanalyzed
references to discriminants since their resolution (and
expansion) will take care of updating their Entity attribute to
reference their discriminal.

2 years ago[Ada] Improve expected type error messages
Justin Squirek [Mon, 31 Jan 2022 21:51:38 +0000 (21:51 +0000)]
[Ada] Improve expected type error messages

This patch improves error messages concerning type mismatches by
printing the actual expected type in more cases instead of the expected
type's first subtype.

gcc/ada/

* sem_util.adb (Wrong_Type): Avoid using the first subtype of
the expected type in error messages when the expected type is
not internally generated.

2 years ago[Ada] Document control flow redundancy
Alexandre Oliva [Wed, 9 Feb 2022 09:25:13 +0000 (06:25 -0300)]
[Ada] Document control flow redundancy

Add documentation about -fharden-control-flow-redundancy.

gcc/ada/

* doc/gnat_rm/security_hardening_features.rst: Add subsection on
Control Flow Redundancy.
* gnat_rm.texi: Regenerate.

2 years ago[Ada] Fix compiler crash on FOR iteration scheme over container
Eric Botcazou [Thu, 17 Feb 2022 17:20:01 +0000 (18:20 +0100)]
[Ada] Fix compiler crash on FOR iteration scheme over container

The front-end drops a freeze node on the floor because it puts the node
into the Condition_Actions of an N_Iteration_Scheme of a FOR loop.

gcc/ada/

* exp_util.adb (Insert_Actions) <N_Iteration_Scheme>: Check that
it is a WHILE iteration scheme before using Condition_Actions.

2 years ago[Ada] Remove obsolete uses of Unchecked_Conversion from Ada 83
Piotr Trojanek [Wed, 9 Feb 2022 21:32:19 +0000 (22:32 +0100)]
[Ada] Remove obsolete uses of Unchecked_Conversion from Ada 83

Similar to a recent removal of obsolete uses of Unchecked_Deallocation.

In Ada 83 the Unchecked_Conversion was a top-level unit; since Ada 95 it
is an obsolete renaming of Ada.Unchecked_Conversion. GNAT doesn't warn
yet about uses of these obsolete renamings, but it still seems better to
avoid them.

gcc/ada/

* atree.adb, gen_il-gen.adb, osint.adb, set_targ.adb,
sinput.adb, table.adb, treepr.adb, types.ads: Replace uses of
Unchecked_Conversion in the compiler itself.
* libgnarl/a-reatim.adb, libgnarl/s-osinte__gnu.ads,
libgnarl/s-osinte__kfreebsd-gnu.ads, libgnat/a-coboho.adb,
libgnat/a-stuten.ads, libgnat/s-putima.adb: Likewise in the
runtime.
* doc/gnat_ugn/gnat_and_program_execution.rst: Likewise in
documentation.
* gnat_ugn.texi: Regenerate.

2 years ago[Ada] Remove obsolete uses of Unchecked_Deallocation from Ada 83
Piotr Trojanek [Wed, 9 Feb 2022 12:01:11 +0000 (13:01 +0100)]
[Ada] Remove obsolete uses of Unchecked_Deallocation from Ada 83

In Ada 83 the Unchecked_Deallocation was a top-level unit; since Ada 95
it is an obsolete renaming of Ada.Unchecked_Deallocation. GNAT doesn't
yet warn about uses of these obsolete renamings, but it still seems
better to avoid them.

Cleanup before adding a new instance of Unchecked_Deallocation.
Offending occurrences found with grep.

gcc/ada/

* butil.adb, sem.adb, sinput.adb, types.ads, xref_lib.adb:
Replace uses of Unchecked_Deallocation with
Ada.Unchecked_Deallocation.
* doc/gnat_ugn/gnat_and_program_execution.rst: Likewise for the
documentation; fix casing of GNAT.IO.
* gnat_ugn.texi: Regenerate.

2 years ago[Ada] Fix the Ada 2022 iterated component association RM reference
Marc Poulhiès [Tue, 15 Feb 2022 14:12:38 +0000 (15:12 +0100)]
[Ada] Fix the Ada 2022 iterated component association RM reference

Fix the error message pointing to the Ada reference section on mixed
iterated component association being forbidden.  Remove useless loop.

gcc/ada/

* sem_aggr.adb (Resolve_Array_Aggregate): Fix ARM reference.
Remove useless loop.

2 years ago[Ada] Fix typo on "that"
Etienne Servais [Wed, 16 Feb 2022 17:49:01 +0000 (18:49 +0100)]
[Ada] Fix typo on "that"

gcc/ada/

* sem_ch3.adb (Analyze_Subtype_Declaration): Fix typo in
comment.

2 years ago[Ada] Spurious access error in function returning type with access discriminant
Justin Squirek [Wed, 15 Dec 2021 14:27:23 +0000 (14:27 +0000)]
[Ada] Spurious access error in function returning type with access discriminant

This patch fixes an issue in the compiler whereby incorrect
accessibility checks were generated in functions returning types with
unconstrained access discriminants when the value supplied for the
discriminant is a formal parameter.

More specifically, accessibility checks for return statements featuring
a result type having access discriminants were incorrectly being
performed against the level of the function declaration instead of the
level of the master of the call.

gcc/ada/

* sem_ch6.adb (Check_Return_Construct_Accessibility): Modify
generation of run-time accessibility checks to account for cases
where Extra_Accessibility_Of_Result should be used versus the
level of the enclosing subprogram. Use original node to avoid
checking against expanded code. Disable check generation for
tagged type case.
(Is_Formal_Of_Current_Function): Added to encompass a predicate
used within Check_Return_Construct_Accessibility to test if an
associated expression is related to a relevant formal.
* sem_util.adb, sem_util.ads (Enclosing_Subprogram): Modified to
accept Node_Or_Entity_Id.
(Innermost_Master_Scope_Depth): Calculate level based on the
subprogram of a return statement instead of the one returned by
Current_Subprogram.
(Needs_Result_Accessibility_Level): Remove
Disable_Coextension_Cases constant, and disable the tagged type
case for performance reasons.

2 years ago[Ada] Accept effectively volatile components in actuals
Piotr Trojanek [Wed, 16 Feb 2022 11:13:57 +0000 (12:13 +0100)]
[Ada] Accept effectively volatile components in actuals

In SPARK we forbid names that are effectively volatile for reading if
they occur in actual subprogram parameters. We wrongly rejected
references to components, which are not names in Ada.

gcc/ada/

* sem_res.adb (Flag_Effectively_Volatile_Objects): Ignore
component and discriminant identifiers.

2 years ago[Ada] Remove redundant guard in checks for volatile actuals
Piotr Trojanek [Wed, 16 Feb 2022 09:15:12 +0000 (10:15 +0100)]
[Ada] Remove redundant guard in checks for volatile actuals

When flagging names of volatile objects occurring in actual parameters
we guard against identifiers without entity. This is redundant, because
earlier in the resolution of actual parameters we already guard against
actuals with Any_Type.

Code cleanup related to handling of volatile components; behaviour is
unaffected.

gcc/ada/

* sem_res.adb (Flag_Effectively_Volatile_Objects): Remove
redundant guard.

2 years ago[Ada] Ineffective use type clause warnings cause compile time crash
Justin Squirek [Mon, 14 Feb 2022 20:51:49 +0000 (20:51 +0000)]
[Ada] Ineffective use type clause warnings cause compile time crash

This patch corrects an error in the compiler whereby the presence of a
generic instance featuring a use type clause at library level may cause
a crash at compile time when warnings for ineffective use clauses are
enabled and the type in question is already use visible.

gcc/ada/

* sem_ch8.adb (Determine_Package_Scope): Created to centralize
the calculation of which package a given use clause belongs to.
(Most_Descendant_Use_Clause): Modified to call
Determine_Package_Scope.
* sem_util.adb, sem_util.ads (Enclosing_Package): Modified to
handle both entity and node ids.

2 years agotestsuite: Make AArch64 attributes_7.c generate unique report lines.
Christophe Lyon [Fri, 6 May 2022 17:30:51 +0000 (18:30 +0100)]
testsuite: Make AArch64 attributes_7.c generate unique report lines.

This test is executed in both C and C++ modes, lines 98 and 100 pass
in C++ and are xfail in C.

This results in similar lines in gcc.sum and g++.sum, differing by the
PASS or XFAIL prefix, which confuses compare_test: it reports these
tests twice, as "now fail, but worked before" and "now work, but
didn't before". To make the diagnostic different betweek C and C++, I
use $tool in the dg-error comment field.

2022-05-13  Christophe Lyon  <christophe.lyon@arm.com>

gcc/testsuite/
* gcc.target/aarch64/sve/acle/general/attributes_7.c: Make
diagnostic unique.

2 years agoMake gimple_build main workers more flexible
Richard Biener [Thu, 12 May 2022 06:24:12 +0000 (08:24 +0200)]
Make gimple_build main workers more flexible

The following makes the main gimple_build API take a
gimple_stmt_iterator, whether to insert before or after and
an iterator update argument to make it more convenient to use
in certain situations (see the tree-vect-generic.cc hunks for
an example).  It also makes the case we insert into the IL
somewhat distinct from inserting into a standalone sequence in
that it simplifies built expressions the same way as inserting
and calling fold_stmt (..., follow_all_ssa_edges) would.  When
inserting into a standalone sequence we restrict simplification
to defs within the currently building sequence.

The patch only amends the tree_code gimple_build API, I will
followup with converting the rest as well.  The patch got larger
than intended because the template forwarders now use gsi_last
which introduces a dependency on gimple-iterator.h requiring
mass #include re-org across the tree.  There are two frontend
specific files including gimple-fold.h just for some padding
clearing stuff - I've removed the include and instead moved
the declarations to fold-const.h (but not the implementations).
Otherwise I'd have to include half of the middle-end headers in
those files which I didn't much like.

2022-05-12  Richard Biener  <rguenther@suse.de>

gcc/cp/
* constexpr.cc: Remove gimple-fold.h include.

gcc/c-family/
* c-omp.cc: Remove gimple-fold.h include.

gcc/analyzer/
* supergraph.cc: Re-order gimple-fold.h include.

gcc/
* gimple-fold.cc (gimple_build): Adjust for new
main API.
* gimple-fold.h (gimple_build): New main APIs with
iterator, insert direction and iterator update.
(gimple_build): New forwarder template.
(clear_padding_type_may_have_padding_p): Remove.
(clear_type_padding_in_mask): Likewise.
(arith_overflowed_p): Likewise.
* fold-const.h (clear_padding_type_may_have_padding_p): Declare.
(clear_type_padding_in_mask): Likewise.
(arith_overflowed_p): Likewise.
* tree-vect-generic.cc (gimplify_build3): Use main gimple_build API.
(gimplify_build2): Likewise.
(gimplify_build1): Likewise.
* ubsan.cc (ubsan_expand_ptr_ifn): Likewise, avoid extra
compare stmt.
* gengtype.cc (open_base_files): Re-order includes.
* builtins.cc: Re-order gimple-fold.h include.
* calls.cc: Likewise.
* cgraphbuild.cc: Likewise.
* cgraphunit.cc: Likewise.
* config/rs6000/rs6000-builtin.cc: Likewise.
* config/rs6000/rs6000-call.cc: Likewise.
* config/rs6000/rs6000.cc: Likewise.
* config/s390/s390.cc: Likewise.
* expr.cc: Likewise.
* fold-const.cc: Likewise.
* function-tests.cc: Likewise.
* gimple-match-head.cc: Likewise.
* gimple-range-fold.cc: Likewise.
* gimple-ssa-evrp-analyze.cc: Likewise.
* gimple-ssa-evrp.cc: Likewise.
* gimple-ssa-sprintf.cc: Likewise.
* gimple-ssa-warn-access.cc: Likewise.
* gimplify.cc: Likewise.
* graphite-isl-ast-to-gimple.cc: Likewise.
* ipa-cp.cc: Likewise.
* ipa-devirt.cc: Likewise.
* ipa-prop.cc: Likewise.
* omp-low.cc: Likewise.
* pointer-query.cc: Likewise.
* range-op.cc: Likewise.
* tree-cfg.cc: Likewise.
* tree-if-conv.cc: Likewise.
* tree-inline.cc: Likewise.
* tree-object-size.cc: Likewise.
* tree-ssa-ccp.cc: Likewise.
* tree-ssa-dom.cc: Likewise.
* tree-ssa-forwprop.cc: Likewise.
* tree-ssa-ifcombine.cc: Likewise.
* tree-ssa-loop-ivcanon.cc: Likewise.
* tree-ssa-math-opts.cc: Likewise.
* tree-ssa-pre.cc: Likewise.
* tree-ssa-propagate.cc: Likewise.
* tree-ssa-reassoc.cc: Likewise.
* tree-ssa-sccvn.cc: Likewise.
* tree-ssa-strlen.cc: Likewise.
* tree-ssa.cc: Likewise.
* value-pointer-equiv.cc: Likewise.
* vr-values.cc: Likewise.

gcc/testsuite/
* gcc.dg/plugin/diagnostic_group_plugin.c: Reorder or remove
gimple-fold.h include.
* gcc.dg/plugin/diagnostic_plugin_show_trees.c:
Likewise.
* gcc.dg/plugin/diagnostic_plugin_test_inlining.c:
Likewise.
* gcc.dg/plugin/diagnostic_plugin_test_metadata.c:
Likewise.
* gcc.dg/plugin/diagnostic_plugin_test_paths.c:
Likewise.
* gcc.dg/plugin/diagnostic_plugin_test_show_locus.c:
Likewise.
* gcc.dg/plugin/diagnostic_plugin_test_string_literals.c: Likewise.
* gcc.dg/plugin/diagnostic_plugin_test_tree_expression_range.c:
Likewise.
* gcc.dg/plugin/finish_unit_plugin.c: Likewise.
* gcc.dg/plugin/ggcplug.c: Likewise.
* gcc.dg/plugin/must_tail_call_plugin.c: Likewise.
* gcc.dg/plugin/one_time_plugin.c: Likewise.
* gcc.dg/plugin/selfassign.c: Likewise.
* gcc.dg/plugin/start_unit_plugin.c: Likewise.
* g++.dg/plugin/selfassign.c: Likewise.

2 years ago[PR105455] Set edge probabilities when hardening conditionals
Alexandre Oliva [Wed, 11 May 2022 07:27:42 +0000 (04:27 -0300)]
[PR105455] Set edge probabilities when hardening conditionals

When turning unconditional edges into conditional, as in
gimple-harden-conditionals.cc:insert_check_and_trap, the newly-created
edge's probability comes out uninitialized, while the previously
unconditional edge's probability is presumably
profile_probability::always.

Mixing initialized and uninitialized probabilities before expand
breaks predict.cc:force_edge_cold: the initialized probability may end
up copied to a REG_BR_PROB note in a conditional branch insn, but if
force_edge_cold is called on that edge, it will find another edge with
uninitialized probability and assume the note is absent.  Later on,
rtl_verify_edges complains that the note does not match the
probability modified by force_edge_cold in the edge.

This patch sets probabilities for edges affected by hardening of
conditionals, both the newly-created edges to trap blocks and the
previously-unconditional edges, so that the former are considered
never taken, while the latter are confirmed as always taken.

for  gcc/ChangeLog

PR rtl-optimization/105455
* gimple-harden-conditionals.cc (insert_check_and_trap): Set
probabilities for newly-conditional edges.

for  gcc/testsuite/ChangeLog

PR rtl-optimization/105455
* gcc.dg/pr105455.c: New.

2 years agoStrip of a vector load which is only used partially.
liuhongt [Fri, 8 Apr 2022 03:26:46 +0000 (11:26 +0800)]
Strip of a vector load which is only used partially.

Optimize

  _4 = VEC_PERM_EXPR <_1, _1, { 4, 5, 6, 7, 4, 5, 6, 7 }>;
  _5 = BIT_FIELD_REF <_4, 128, 0>;

to

  _5 = BIT_FIELD_REF <_1, 128, 128>;

gcc/ChangeLog:

PR tree-optimization/102583
* tree-ssa-forwprop.cc (simplify_bitfield_ref): Extended to a
contiguous stride in the VEC_PERM_EXPR.

gcc/testsuite/ChangeLog:

* gcc.target/i386/pr102583.c: New test.
* gcc.target/i386/pr92645-2.c: Adjust testcase.
* gcc.target/i386/pr92645-3.c: Ditto.

2 years agoDaily bump.
GCC Administrator [Fri, 13 May 2022 00:16:30 +0000 (00:16 +0000)]
Daily bump.

2 years agoc++: tighten TMPL_ARGS_LEVEL macro
Patrick Palka [Thu, 12 May 2022 20:52:06 +0000 (16:52 -0400)]
c++: tighten TMPL_ARGS_LEVEL macro

This patch makes TMPL_ARGS_LEVEL verify the level argument is valid when
the one-dimensional vector case.  Doing so uncovered a couple of latent
issues: in try_class_unification, we weren't correctly copying targs
when it's two-dimensional, and in unify_pack_expansion it seems an
inequality test needs to be reversed.  This patch fixes both issues, and
in passing makes the former function free the temporary copy of targs.

gcc/cp/ChangeLog:

* cp-tree.h (TMPL_ARGS_LEVEL): Assert LEVEL is 1 when
TMPL_ARGS_HAVE_MULTIPLE_LEVELS is false.
* pt.cc (try_class_unification): Correctly copy multidimensional
targs.  Free the copy of targs.
(unify_pack_expansion): Fix level comparison.

2 years agotestsuite: PPC vector double requires VSX
David Edelsohn [Thu, 12 May 2022 18:47:35 +0000 (14:47 -0400)]
testsuite: PPC vector double requires VSX

pr101168.C uses __vector double, which requires VSX, not just Altivec.
This patch invokes the testcase with the -mvsx option.

* g++.target/powerpc/pr101168.C: Require VSX.

2 years agolibstdc++: Remove whitespace before preprocessor directives
Jonathan Wakely [Thu, 12 May 2022 16:37:33 +0000 (17:37 +0100)]
libstdc++: Remove whitespace before preprocessor directives

These are harmless, but also unnecessary and inconsistent (and their
removal was requested by PR libstdc++/17632).

libstdc++-v3/ChangeLog:

* config/locale/dragonfly/numeric_members.cc: Remove whitespace.
* config/locale/gnu/numeric_members.cc: Likewise.
* include/bits/locale_facets_nonio.h: Likewise.
* libsupc++/typeinfo: Likewise.

2 years agoRefactor '-ldl' handling for libgomp proper and plugins
Thomas Schwinge [Thu, 5 May 2022 21:01:36 +0000 (23:01 +0200)]
Refactor '-ldl' handling for libgomp proper and plugins

Instead of implicit global 'LIBS="-ldl $LIBS"' via 'AC_CHECK_LIB', make
'-ldl' explicit for libgomp proper, and clean up 'PLUGIN_GCN_LIBS',
'PLUGIN_NVPTX_LIBS' accordingly.

libgomp/
* Makefile.am (libgomp_la_LIBADD): Initialize.
* plugin/configfrag.ac (DL_LIBS): New.
(PLUGIN_GCN_LIBS): Remove.
(PLUGIN_NVPTX_LIBS): Don't set in the 'PLUGIN_NVPTX_DYNAMIC' case.
* plugin/Makefrag.am (libgomp_la_LIBADD)
(libgomp_plugin_gcn_la_LIBADD): Consider '$(DL_LIBS)'.
(libgomp_plugin_nvptx_la_LIBADD) <PLUGIN_NVPTX_DYNAMIC>: Likewise.
* Makefile.in: Regenerate.
* config.h.in: Likewise.
* configure: Likewise.
* testsuite/Makefile.in: Likewise.

2 years agortl-optimization/105577 - RTL DSE and non-call EH
Richard Biener [Thu, 12 May 2022 12:03:32 +0000 (14:03 +0200)]
rtl-optimization/105577 - RTL DSE and non-call EH

When one of the first two stages of DSE removes a throwing stmt
we have to purge dead EH edges before the DF re-analyze fires off
a fast DCE since that cannot cope with the situation.

2022-05-12  Richard Biener  <rguenther@suse.de>

PR rtl-optimization/105577
* dse.cc (rest_of_handle_dse): Make sure to purge dead EH
edges before running fast DCE via df_analyze.

2 years ago[Ada] Skip postponed validation checks with compilation errors
Piotr Trojanek [Wed, 16 Feb 2022 12:01:36 +0000 (13:01 +0100)]
[Ada] Skip postponed validation checks with compilation errors

If there are compilation errors then gigi doesn't backannotate the AST
with sizes, alignment, etc. The postponed compilation validation checks
can then easily crash or give spurious errors. We now just skip them.

gcc/ada/

* gnat1drv.adb (Gnat1drv): Skip postponed checks when there are
errors.

2 years ago[Ada] Fix URL in doc
Arnaud Charlet [Wed, 16 Feb 2022 11:23:24 +0000 (11:23 +0000)]
[Ada] Fix URL in doc

gcc/ada/

* doc/gnat_ugn/the_gnat_compilation_model.rst: Fix URL.
* gnat_ugn.texi: Regenerate.

2 years ago[Ada] Restore double quotes in debug printouts
Bob Duff [Mon, 14 Feb 2022 21:00:55 +0000 (16:00 -0500)]
[Ada] Restore double quotes in debug printouts

A previous change in "Make debug printouts more robust" accidentally
removed double quotes around identifiers in debug printouts. This patch
restores those. So for example, we have:

       Prev_Entity = Node #10 N_Defining_Identifier "foo" (Entity_Id=795)

and not:

       Prev_Entity = Node #10 N_Defining_Identifier foo (Entity_Id=795)

This affects the output of -gnatdt, and certain calls normally done from
gdb.

gcc/ada/

* namet.ads, namet.adb (Write_Name_For_Debug): Add Quote
parameter to allow conditional addition of quotes. Note that
some calls to Write_Name_For_Debug, for example for file names,
shouldn't have quotes, as in some_package.adb:123:45.
* treepr.adb (Print_Name): Add double quotes around the name
using the above Quote parameters.

2 years ago[Ada] Reuse collective subtype for comparison operators where possible
Piotr Trojanek [Wed, 16 Feb 2022 09:00:02 +0000 (10:00 +0100)]
[Ada] Reuse collective subtype for comparison operators where possible

Replace membership alternatives with N_Op_Compare. Code cleanup;
semantics is unaffected.

gcc/ada/

* sem_res.adb (Resolve_Actuals): Simplify with N_Op_Compare.
* sem_util.adb (Replace_Null_Operand,
Null_To_Null_Address_Convert_OK): Likewise.

2 years ago[Ada] Remove unreferenced Is_Selector_Name routine
Piotr Trojanek [Tue, 15 Feb 2022 16:59:10 +0000 (17:59 +0100)]
[Ada] Remove unreferenced Is_Selector_Name routine

Function Is_Selector_Name was added in 1995 while experimenting with
default expressions in record declarations. This experiment was
abandoned after one day and this routine was never used since then.

gcc/ada/

* sem_util.ads (Is_Selector_Name): Remove spec.
* sem_util.adb (Is_Selector_Name): Remove body.

2 years ago[Ada] Add more dummy names in Sem_Warn.Has_Junk_Name
Arnaud Charlet [Mon, 14 Feb 2022 08:19:50 +0000 (03:19 -0500)]
[Ada] Add more dummy names in Sem_Warn.Has_Junk_Name

To sync the names used in CodePeer (and SPARK) when filtering out
warnings on e.g. unused variables.

gcc/ada/

* sem_warn.adb (Has_Junk_Name): Add more dummy names.

2 years ago[Ada] Fix warning about generic subprograms withed but not referenced
Piotr Trojanek [Fri, 11 Feb 2022 13:31:39 +0000 (14:31 +0100)]
[Ada] Fix warning about generic subprograms withed but not referenced

For warnings about unreferenced entities and unused WITH clauses we
typically exclude references outside of the extended main source unit.
However, we include references to variables of formal private types to
warn in the instance if the corresponding type is not a fully
initialized type.

This special case was unnecessarily applied to references to other
entities of formal private types. In particular, we applied it to the
references to generic functions, where the full initialization of the
formal private type doesn't matter.

As an extreme example, this special case was unnecessarily applied to
"pragma Pure (Unchecked_Conversion)" in the runtime unit.

gcc/ada/

* lib-xref.adb (Generate_Reference): Fix comment and implement
it precisely.

2 years ago[Ada] Fix warning about generic subprograms withed but not instantiated
Piotr Trojanek [Fri, 11 Feb 2022 09:40:32 +0000 (10:40 +0100)]
[Ada] Fix warning about generic subprograms withed but not instantiated

The compiler should warn when a generic subprogram unit is withed but
not instantiated by the current main unit. This warning relies on flag
Is_Instantiated, which was wrongly set when the generic unit was also
withed and instantiated by some other unit.

This change merely reverts a fix done 20 years ago, which worked around
some spurious warning emitted with inlining enabled. Now the
Is_Instantiated flag is set similarly for generic subprograms and
generic packages.

gcc/ada/

* atree.adb, atree.ads: Move WITH clause from spec to body; to
prevent new warnings stopping the bootstrap.
* fmap.adb, fname-sf.adb, libgnat/a-direct.adb,
libgnat/s-bignum.adb: Remove unnecessary WITH clauses; to
prevent new warnings stopping the bootstrap.
* sem_ch12.adb (Analyze_Subprogram_Instantiation): Only set
Is_Instantiated flag when the instance is in the extended main
source unit.

2 years ago[Ada] Remove useless pragma Warnings Off from runtime units
Yannick Moy [Fri, 11 Feb 2022 08:02:42 +0000 (09:02 +0100)]
[Ada] Remove useless pragma Warnings Off from runtime units

GNAT does not issue a warning anymore on a postcondition of True (used
here to prevent inining inside GNATprove for proof).

gcc/ada/

* libgnat/s-valuei.ads: Remove pragma Warnings Off.
* libgnat/s-valueu.ads: Same.
* libgnat/s-valuti.ads: Same.

2 years ago[Ada] Do not issue a warning on a postcondition of True or False
Yannick Moy [Thu, 10 Feb 2022 11:36:52 +0000 (12:36 +0100)]
[Ada] Do not issue a warning on a postcondition of True or False

Do not issue a warning about the postcondition of a function not
mentioning its result when this postcondition is statically True or
False, as this is a specification of non-termination (for value False)
or a hint to SPARK prover for not inlining an expression function (for
value True). In any case, the warning brings no value here.

gcc/ada/

* sem_util.adb (Check_Result_And_Post_State): Exempt trivial
post.

2 years ago[Ada] Remove front-end SJLJ processing
Arnaud Charlet [Sun, 6 Feb 2022 16:06:36 +0000 (16:06 +0000)]
[Ada] Remove front-end SJLJ processing

We no longer use the so called front-end SJLJ exception mechanism, so
get rid of it.

gcc/ada/

* ali.adb, ali.ads, bcheck.adb, exp_ch11.adb, fe.h,
gnat1drv.adb, opt.adb, opt.ads, targparm.adb, targparm.ads,
lib-writ.adb: Get rid of Frontend_Exceptions processing.
* libgnat/system-aix.ads, libgnat/system-darwin-arm.ads,
libgnat/system-darwin-ppc.ads, libgnat/system-darwin-x86.ads,
libgnat/system-djgpp.ads, libgnat/system-dragonfly-x86_64.ads,
libgnat/system-freebsd.ads, libgnat/system-hpux-ia64.ads,
libgnat/system-hpux.ads, libgnat/system-linux-alpha.ads,
libgnat/system-linux-arm.ads, libgnat/system-linux-hppa.ads,
libgnat/system-linux-ia64.ads, libgnat/system-linux-m68k.ads,
libgnat/system-linux-mips.ads, libgnat/system-linux-ppc.ads,
libgnat/system-linux-riscv.ads, libgnat/system-linux-s390.ads,
libgnat/system-linux-sh4.ads, libgnat/system-linux-sparc.ads,
libgnat/system-linux-x86.ads, libgnat/system-lynxos178-ppc.ads,
libgnat/system-lynxos178-x86.ads, libgnat/system-mingw.ads,
libgnat/system-qnx-aarch64.ads, libgnat/system-rtems.ads,
libgnat/system-solaris-sparc.ads,
libgnat/system-solaris-x86.ads,
libgnat/system-vxworks-arm-rtp-smp.ads,
libgnat/system-vxworks-arm-rtp.ads,
libgnat/system-vxworks-arm.ads,
libgnat/system-vxworks-e500-kernel.ads,
libgnat/system-vxworks-e500-rtp-smp.ads,
libgnat/system-vxworks-e500-rtp.ads,
libgnat/system-vxworks-ppc-kernel.ads,
libgnat/system-vxworks-ppc-rtp-smp.ads,
libgnat/system-vxworks-ppc-rtp.ads,
libgnat/system-vxworks-x86-kernel.ads,
libgnat/system-vxworks-x86-rtp-smp.ads,
libgnat/system-vxworks-x86-rtp.ads,
libgnat/system-vxworks7-aarch64-rtp-smp.ads,
libgnat/system-vxworks7-aarch64.ads,
libgnat/system-vxworks7-arm-rtp-smp.ads,
libgnat/system-vxworks7-arm.ads,
libgnat/system-vxworks7-e500-kernel.ads,
libgnat/system-vxworks7-e500-rtp-smp.ads,
libgnat/system-vxworks7-e500-rtp.ads,
libgnat/system-vxworks7-ppc-kernel.ads,
libgnat/system-vxworks7-ppc-rtp-smp.ads,
libgnat/system-vxworks7-ppc-rtp.ads,
libgnat/system-vxworks7-ppc64-kernel.ads,
libgnat/system-vxworks7-ppc64-rtp-smp.ads,
libgnat/system-vxworks7-x86-kernel.ads,
libgnat/system-vxworks7-x86-rtp-smp.ads,
libgnat/system-vxworks7-x86-rtp.ads,
libgnat/system-vxworks7-x86_64-kernel.ads,
libgnat/system-vxworks7-x86_64-rtp-smp.ads: Remove
Frontend_Exceptions line.
* gcc-interface/decl.cc, gcc-interface/trans.cc
(gnat_to_gnu_entity, gnat_to_gnu_subprog_type, gigi,
gnat_to_gnu): Remove Front_End_SJLJ processing and always assume
Back_End_Exceptions.

2 years ago[Ada] Make debug printouts more robust
Bob Duff [Thu, 10 Feb 2022 19:55:32 +0000 (14:55 -0500)]
[Ada] Make debug printouts more robust

This patch improves some debug printouts so that they avoid crashing on
invalid data.

In addition, the relevant code uses Global_Name_Buffer all over the
place. This patch cleans up some of those uses, in particular ones in
the same code as the robustness changes, and code called by that code.

gcc/ada/

* namet.ads, namet.adb (Write_Name_For_Debug): New more-robust
version of Write_Name.
(Destroy_Global_Name_Buffer): New procedure to help detect bugs
related to use of Global_Name_Buffer.  Misc cleanup and comment
improvements. E.g. we don't need to document every detail of
debugging printouts, especially since they can change.
* uname.ads, uname.adb (Write_Unit_Name_For_Debug): New
more-robust version of Write_Unit_Name.
(Get_Unit_Name_String): Pass buffer in, instead of using the
global variable. Misc cleanup. Remove the "special fudge", which
is apparently not needed, and anyway the comment "the %s or %b
has already been eliminated" seems wrong.
(Write_Unit_Name): Call the new version of Get_Unit_Name_String.
* errout.adb (Set_Msg_Insertion_Unit_Name): Call the new version
of Get_Unit_Name_String. We pass the global variable here,
because it's too much trouble to disentangle such uses in
Errout.
* sem_util.ads, sem_util.adb, sem_dist.adb
(Get_Library_Unit_Name): New version of
Get_Library_Unit_Name_String that avoids usage of the global
variable.
* casing.ads, casing.adb, exp_prag.adb, exp_util.adb
(Set_All_Upper_Case): Remove. There is no need for a wrapper
here -- code is clearer without it.
* treepr.adb (Print_Name): Call Write_Name_For_Debug, which
deals with No_Name (etc), rather than duplicating that here.
Note that the call to Get_Name_String was superfluous.
(Tree_Dump): Call Write_Unit_Name_For_Debug instead of
Write_Unit_Name, which crashes if not Is_Valid_Name.
* erroutc.ads: Improve comments.
* erroutc.adb (Set_Msg_Name_Buffer): Call
Destroy_Global_Name_Buffer to detect potential bugs where it
incorrectly looks at the global variable.
* sinput.adb (Write_Location): Call Write_Name_For_Debug instead
of Write_Name, so it won't blow up on invalid data.
* sinput.ads: Improve comments; remove some verbosity.
* libgnat/s-imagef.adb: Fix typo in comment.

2 years ago[Ada] Add ghost code to facilitate proof with SPARK
Yannick Moy [Thu, 10 Feb 2022 10:54:44 +0000 (11:54 +0100)]
[Ada] Add ghost code to facilitate proof with SPARK

Proof of generic units for Long_Long_Long_Unsigned instantiations is
harder for provers, as they have to deal with larger values. Add ghost
code to make the proof easier.

gcc/ada/

* libgnat/s-imageu.adb (Set_Image_Unsigned): Add lemma.
* libgnat/s-valueu.adb (Scan_Raw_Unsigned): Add assertion.

2 years ago[Ada] Remove use of use-clauses in loaded runtime units
Yannick Moy [Thu, 10 Feb 2022 09:31:05 +0000 (10:31 +0100)]
[Ada] Remove use of use-clauses in loaded runtime units

The spec of runtime units that may be loaded by the compiler should not
contain use-clauses, for visibility to be correctly handled.  Remove
use-clauses that were introduced for the ghost big integers unit as part
of the proof of runtime units.

gcc/ada/

* libgnat/s-aridou.ads: Remove use-clause, add renames and
subtypes.
* libgnat/s-exponn.ads: Same.
* libgnat/s-expont.ads: Same.
* libgnat/s-widthu.ads: Same.

2 years ago[Ada] Fix support for ISO-8859-15 and IBM CP 850 encoding
Etienne Servais [Tue, 8 Feb 2022 11:17:48 +0000 (12:17 +0100)]
[Ada] Fix support for ISO-8859-15 and IBM CP 850 encoding

In ISO-8859-15, code for "lower y with diaeresis" is used for the upper
case.  In IBM CP 850, upper and lower o with stroke were missing.

gcc/ada/

* csets.adb (Fold_Latin_9): Fix y with diaeresis.
(Fold_IBM_PC_850): Fix o with stroke.

2 years ago[Ada] Remove redundant guard against Any_String
Piotr Trojanek [Wed, 9 Feb 2022 16:40:48 +0000 (17:40 +0100)]
[Ada] Remove redundant guard against Any_String

A sequence of checks for a valid Boolean argument fails when applied to
Any_String because its component is not of a Boolean type. The explicit
guard was unnecessary; it was only needed when a First_Index applied to
Any_String would crash, but this was fixed soon after this guard was
added.

Cleanup related to recent fixes for resolution of Boolean operators.

gcc/ada/

* sem_type.adb (Valid_Boolean_Arg): Remove redundant guard.

2 years ago[Ada] Accept raise expressions as operands of boolean operators
Piotr Trojanek [Wed, 9 Feb 2022 16:15:27 +0000 (17:15 +0100)]
[Ada] Accept raise expressions as operands of boolean operators

This patch restores the previous behaviour of a recently rewritten
routine Sem_Ch4.Find_Boolean_Types for boolean operators where one of
the operands is a raise-expression, e.g.:

  (raise Program_Error or else (X /= Y))

This change is required for the Entity field of the "or else" operator
to be set. For GNAT it doesn't matter, but GNATprove requires this field
to be set.

The affected call sequence starts at Find_Boolean_Types, goes via
Check_Right_Argument and Check_Boolean_Pair to Valid_Boolean_Arg, which
ultimately guards a call to Add_One_Interp.

gcc/ada/

* sem_type.adb (Valid_Boolean_Arg): Operands of Raise_Type are
valid boolean arguments.

2 years ago[Ada] Plug loophole in Possible_Type_For_Conditional_Expression
Eric Botcazou [Wed, 9 Feb 2022 16:16:09 +0000 (17:16 +0100)]
[Ada] Plug loophole in Possible_Type_For_Conditional_Expression

We need to check that the designated subprograms of access-to-subprogram
types are subtype conformant before registering a common interpretation.

gcc/ada/

* sem_ch4.adb (Possible_Type_For_Conditional_Expression): Add
test for subtype conformance in the cases of
access-to-subprogram types.

2 years ago[Ada] Adapt CodePeer analysis of GNAT to changes in dependencies
Yannick Moy [Tue, 8 Feb 2022 17:04:49 +0000 (18:04 +0100)]
[Ada] Adapt CodePeer analysis of GNAT to changes in dependencies

New dependencies in s-imagei are causing issues for CodePeer analysis
of GNAT source and libs. Updating the setup.

gcc/ada/

* libgnat/s-imagef.adb: Justify false message from CodePeer.

2 years ago[Ada] Revamp analysis of conditional expressions
Eric Botcazou [Mon, 7 Feb 2022 10:44:29 +0000 (11:44 +0100)]
[Ada] Revamp analysis of conditional expressions

The current implementation is skewed toward the first dependent
expression and does not look into the interpretations of the others if
the first one is not overloaded, which can create spurious ambiguities.
And more precise error messages are now given if the types of the
dependent expressions are not compatible.

gcc/ada/

* sem_ch4.adb (Analyze_Case_Expression): Rewrite.
(Analyze_If_Expression): Likewise.
(Possible_Type_For_Conditional_Expression): New function.
* sem_type.adb (Specific_Type): Retur the base type in more
cases.

2 years ago[Ada] Proof of 'Image support for signed integers
Yannick Moy [Fri, 4 Feb 2022 14:20:20 +0000 (15:20 +0100)]
[Ada] Proof of 'Image support for signed integers

Prove System.Image_I, similarly to the proof done for System.Image_U.
The contracts make the connection between the result of Image_Integer,
the available space computed with System.Width_U and the result of
'Value as computed by Value_Integer.

I/O units that now depend on non-pure units are also marked not Pure
anymore.

gcc/ada/

* libgnat/s-imagef.adb: Adapt to new signature of Image_I, by
providing ghost imported subprograms. For now, no contract is
used on these subprograms, as System.Image_F is not proved.
* libgnat/s-imagef.ads: Add modular type Uns as formal
parameter, to use in defining Int_Params for instantiating
Image_I.
* libgnat/s-imagei.adb: Add contracts and ghost code.
* libgnat/s-imagei.ads: Replace Int formal parameter by package
Int_Params, which bundles type Int and Uns with ghost
subprograms.  Add contracts.
* libgnat/s-imfi128.ads: Adapt to new formal of Image_F.
* libgnat/s-imfi32.ads: Adapt to new formal of Image_F.
* libgnat/s-imfi64.ads: Adapt to new formal of Image_F.
* libgnat/s-imgint.ads: Adapt to new formals of Image_I.
* libgnat/s-imglli.ads: Adapt to new formals of Image_I.
* libgnat/s-imgllli.ads: Adapt to new formals of Image_I.
* libgnat/s-valint.ads: Adapt to new formals of Value_I.
* libgnat/s-vallli.ads: Adapt to new formals of Value_I.
* libgnat/s-valllli.ads: Adapt to new formals of Value_I.
* libgnat/s-valuei.adb (Prove_Scan_Only_Decimal_Ghost): New
ghost lemma.
* libgnat/s-valuei.ads: New formal parameters to prove the new
lemma.
* libgnat/s-valuti.ads (Int_Params): Define a generic package to
be used as a trait-like formal parameter in Image_I and other
generics that need to instantiate Image_I.
* libgnat/s-widthu.ads (Big_10): Qualify the 10 literal.

2 years ago[Ada] Rewrite Sem_Ch4.Find_Boolean_Types
Eric Botcazou [Fri, 4 Feb 2022 17:53:43 +0000 (18:53 +0100)]
[Ada] Rewrite Sem_Ch4.Find_Boolean_Types

Using a straight implementation like the one in Find_Arithmetic_Types.

gcc/ada/

* sem_ch4.adb (Find_Arithmetic_Types): Use local variables.
(Find_Boolean_Types): Rewrite modeled on Find_Arithmetic_Types.

2 years ago[Ada] Introduce hardbool Machine_Attribute for Ada
Alexandre Oliva [Fri, 4 Feb 2022 02:00:09 +0000 (23:00 -0300)]
[Ada] Introduce hardbool Machine_Attribute for Ada

Implement and document hardened booleans, from nonstandard boolean types
with representation clauses to the extra validity checking performed on
boolean types annotated with the "hardbool" Machine_Attribute pragma.

gcc/ada/

* doc/gnat_rm/security_hardening_features.rst (Hardened
Booleans): New.
* exp_util.adb (Adjust_Condition): Perform validity checking on
hardbool-annotated types even with -gnatVT.
* gnat_rm.texi: Regenerate.
* gcc-interface/utils.cc (gnat_internal_attribute_table): Ignore
hardbool.

2 years ago[Ada] Fix scope of block in expanded protected entry body
Piotr Trojanek [Fri, 4 Feb 2022 19:56:51 +0000 (20:56 +0100)]
[Ada] Fix scope of block in expanded protected entry body

We expand protected entry body into procedure with a nested block. The
scope of this block is naturally the enclosing procedure. However, the
scope field was wrongly set to the entity of the enclosing procedure
body (i.e. E_Subprogram_Body); now it is set to the entity of the
enclosing procedure spec (i.e. E_Procedure).

In general, the scope field should always points to spec, even for
entities that are syntactically nested within a program unit body. The
scope set to E_Subprogram_Body entity was only accepted because in gigi
we had a protection for that, but this protection is now removed.

This patch fixes a regression in a ravenscar testsuite test (c_rf02_06),
where GNAT was crashing when compiling in configurable runtime mode with
restriction No_Exception_Propagation.

gcc/ada/

* exp_ch9.adb (Build_Protected_Entry): Set scope of the nested
block to spec and not the body of the procedure created for a
protected entry.

2 years ago[Ada] Fix typo in comment
Etienne Servais [Mon, 7 Feb 2022 14:34:01 +0000 (15:34 +0100)]
[Ada] Fix typo in comment

gcc/ada/

* sem_ch3.adb (Find_Type_Of_Object): Remove duplicate "i" in
comment.

2 years ago[Ada] Fix style checking rule for square brackets in Ada 2022 and above
Marc Poulhiès [Fri, 28 Jan 2022 15:55:43 +0000 (16:55 +0100)]
[Ada] Fix style checking rule for square brackets in Ada 2022 and above

The square bracket syntax introduced in Ada 2022 was incorrectly handled
by the style checker and incorrect spacing was enforced. The issue was
in part caused by the wide character syntax (support removed starting
from Ada 2022) that treats the square bracket as a valid identifier
character.

gcc/ada/

* csets.adb (Initialize): Only treat square bracket as valid
identifier character for Ada versions prior to Ada 2022.
* style.ads (Check_Left_Paren): Rename...
(Check_Left_Paren_Square_Bracket): ...to this.
* styleg.adb (Check_Left_Bracket): Rename...
(Check_Left_Paren_Square_Bracket): ...to this.
* styleg.ads (Check_Left_Paren): Rename...
(Check_Left_Paren_Square_Bracket): ...to this.
* scng.adb (Scan): Add check for spacing around left square
bracket and use new name for Check_Left_Paren_Square_Bracket.
* libgnat/a-szmzco.ads (Control_Ranges, Graphic_Ranges)
(Letter_Ranges, Decimal_Digit_Ranges, ISO_646_Ranges)
(Character_Ranges): Fix style (remove extra space).
* libgnat/a-swmwco.ads (Control_Ranges, Graphic_Ranges)
(Letter_Ranges, Decimal_Digit_Ranges, ISO_646_Ranges)
(Character_Ranges): Likewise.
* opt.adb (Set_Config_Switches): Remove [ from Identifier_Char
set.

2 years ago[Ada] Fix remaining asymmetry in Specific_Type
Eric Botcazou [Sun, 6 Feb 2022 14:54:25 +0000 (15:54 +0100)]
[Ada] Fix remaining asymmetry in Specific_Type

gcc/ada/

* sem_type.adb (Specific_Type): Add swapped cases for interfaces.

2 years ago[Ada] Fix typos in syntax for implementation-defined pragmas
Piotr Trojanek [Fri, 4 Feb 2022 08:16:53 +0000 (09:16 +0100)]
[Ada] Fix typos in syntax for implementation-defined pragmas

Documentation cleanup. Spotted while looking at description of
configuration pragmas.

gcc/ada/

* doc/gnat_rm/implementation_defined_pragmas.rst:
(Export_Object, Import_Object, Short_Descriptors): Fix pragma
syntax specification.
* gnat_rm.texi: Regenerate.