platform/upstream/gcc.git
2 years ago[Ada] Streamline implementation of Has_Compatible_Representation
Eric Botcazou [Sun, 20 Mar 2022 17:01:04 +0000 (18:01 +0100)]
[Ada] Streamline implementation of Has_Compatible_Representation

The predicate is only concerned with the internal representation of types
and this representation is shared by the subtypes of a given type, so the
implementation can directly look into the (implementation) base types.

No functional changes.

gcc/ada/

* sem_ch13.ads (Has_Compatible_Representation): Minor tweaks.
* sem_ch13.adb (Has_Compatible_Representation): Look directly into
the (implementation) base types and simplifiy accordingly.
* exp_ch5.adb (Change_Of_Representation): Adjust.
* exp_ch6.adb (Expand_Actuals): Likewise.

2 years ago[Ada] Remove superfluous call to Original_Node
Etienne Servais [Thu, 17 Feb 2022 10:40:46 +0000 (11:40 +0100)]
[Ada] Remove superfluous call to Original_Node

The function Same_Object starts by taking the Original_Node of its
arguments.

gcc/ada/

* sem_ch5.adb (Analyze_Assignment): Remove superfluous call to
Original_Node.

2 years ago[Ada] Crash freezing declaration that will raise constraint error
Javier Miranda [Sun, 20 Mar 2022 11:36:25 +0000 (11:36 +0000)]
[Ada] Crash freezing declaration that will raise constraint error

When the compiler is built with assertions enabled and processes the
following declarations:

   type Vector_Boolean_Array is array (1 .. 10) of Boolean;
   O2 : constant Vector_Boolean_Array := [for J in 2 => True];

The expression is rewritten by the frontend with an N_Raise_CE node,
which leads to an assertion error at the freezing point of the object
declaration.

gcc/ada/

* freeze.adb (Freeze_Entity): Protect the call to
Declaration_Node against entities of expressions replaced by the
frontend with an N_Raise_CE node.

2 years ago[Ada] Spurious error on subprogram with class-wide preconditions
Javier Miranda [Fri, 18 Mar 2022 19:28:52 +0000 (19:28 +0000)]
[Ada] Spurious error on subprogram with class-wide preconditions

gcc/ada/

* freeze.adb (Build_DTW_Spec): Do not inherit the not-overriding
indicator because the DTW wrapper overrides its wrapped
subprogram.
* contracts.ads (Make_Class_Precondition_Subps): Adding
documentation.

2 years ago[Ada] Use Actions field of freeze nodes for subprograms
Eric Botcazou [Fri, 18 Mar 2022 23:23:39 +0000 (00:23 +0100)]
[Ada] Use Actions field of freeze nodes for subprograms

This has a couple of advantages: 1) the actions are analyzed with checks
disabled and 2) they are considered elaboration code by Sem_Elab.

gcc/ada/

* exp_ch13.adb (Expand_N_Freeze_Entity): Delete freeze nodes for
subprograms only if they have no actions.
* exp_ch6.adb (Freeze_Subprogram): Put the actions into the Actions
field of the freeze node instead of inserting them after it.
* sem_elab.adb (Is_SPARK_Semantic_Target): Fix typo in comment.
* gcc-interface/trans.cc (process_freeze_entity): Return early for
freeze nodes of subprograms with Interface_Alias set.

2 years ago[Ada] Implement calls to abstract subprograms in class-wide pre/post-conditions
Javier Miranda [Tue, 15 Mar 2022 20:20:24 +0000 (13:20 -0700)]
[Ada] Implement calls to abstract subprograms in class-wide pre/post-conditions

In some special cases involving class-wide pre/post conditions, Ada
allows a non-dispatching call to an abstract function (which is usually
illegal).  Fix a bug in the implementation of Ada's rules about the
run-time behavior of such a call. Thanks to Javier Miranda for producing
this patch.

gcc/ada/

* contracts.adb (Build_Call_Helper_Body): Improve handling of
the case of a (legal) non-dispatching call to an abstract
subprogram.

2 years ago[Ada] Fix documentation of using attribute Loop_Entry in pragmas
Piotr Trojanek [Wed, 16 Mar 2022 13:42:14 +0000 (14:42 +0100)]
[Ada] Fix documentation of using attribute Loop_Entry in pragmas

Attribute Loop_Entry was initially only allowed to appear in pragmas
Loop_Variant and Loop_Invariant. Then it was also allowed to appear in
pragmas Assert, Assert_And_Cut and Assume, but this change was not
reflected in the GNAT RM.

gcc/ada/

* doc/gnat_rm/implementation_defined_attributes.rst
(Loop_Entry): Mention pragmas Assert, Assert_And_Cut and Assume;
refill.
* gnat_rm.texi: Regenerate.

2 years ago[Ada] Check token to be "access", reject it if not
Etienne Servais [Wed, 16 Mar 2022 16:48:22 +0000 (17:48 +0100)]
[Ada] Check token to be "access", reject it if not

The parser skips the token without verifying it is indeed "access".  So
any token is accepted.

gcc/ada/

* par-ch3.adb (P_Access_Type_Definition): Outputs an error if
token is not "access".

2 years ago[Ada] Enable current value propagation within pragma expressions
Piotr Trojanek [Wed, 16 Mar 2022 20:50:08 +0000 (21:50 +0100)]
[Ada] Enable current value propagation within pragma expressions

This patch fixes an odd incomplete optimization within pragma
expressions. For example, in this code:

   X := True;
   pragma Assert (X = True);
   pragma Assert (X);

the first assertion was eliminated by the frontend (regardless of the
optimization switches), while the second assertion was only eliminated
by the backend and only with switch -O1 or similar.

The problem was that the current value propagation was disabled for
references immediately within pragma argument associations. This was
meant to avoid a crash when such a reference appears in pragma
Inspection_Point, but this wasn't a proper fix. The proper solution is
rather to not expand references in pragma Inspection_Point at all.

Actually, this expansion was enabled to avoid a yet another crash, when
the parameter of pragma Inspection_Point is a prival (i.e. a renaming of
private protected component). It turns out that none of these suspicious
problematic fixes is no longer necessary.

Cleanup related to fixes of current value propagation in expansion of
attribute Loop_Entry.

gcc/ada/

* exp_ch2.adb (Expand_Current_Value): Remove special case for
references immediately within pragma argument associations.
* exp_prag.adb (Expand_Pragma_Inspection_Point): Remove special
case for privals.

2 years agoforwprop: Fix a typo and comment formatting
Jakub Jelinek [Tue, 17 May 2022 07:06:55 +0000 (09:06 +0200)]
forwprop: Fix a typo and comment formatting

When looking around the spot of the PR105591 fix, I've noticed a typo
and incorrectly formatted comment.

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

* tree-ssa-forwprop.cc (simplify_bitfield_ref): Spelling fix:
hanlde -> handle.  Fix up comment formatting.

2 years agoOptimize vpermtiw/b to vpunpcklqdq for certain cases.
liuhongt [Fri, 13 May 2022 01:59:13 +0000 (09:59 +0800)]
Optimize vpermtiw/b to vpunpcklqdq for certain cases.

Assembly Optimization like:
-       vmovq   %xmm0, %xmm2
-       vmovdqa .LC0(%rip), %xmm0
        vmovq   %xmm1, %xmm1
-       vpermi2w        %xmm1, %xmm2, %xmm0
+       vmovq   %xmm0, %xmm0
+       vpunpcklqdq     %xmm1, %xmm0, %xmm0

...

-.LC0:
-       .value  0
-       .value  1
-       .value  2
-       .value  3
-       .value  8
-       .value  9
-       .value  10
-       .value  11

gcc/ChangeLog:

PR target/105033
* config/i386/sse.md (*vec_concatv4si): Extend to ..
(*vec_concat<mode>): .. V16QI and V8HImode.
(*vec_concatv16qi_permt2): New pre_reload define_insn_and_split.
(*vec_concatv8hi_permt2): Ditto.

gcc/testsuite/ChangeLog:

* gcc.target/i386/pr105033.c: New test.

2 years agoClamp vec_perm_expr index in simplify_bitfield_ref to avoid ICE.
liuhongt [Mon, 16 May 2022 01:06:04 +0000 (09:06 +0800)]
Clamp vec_perm_expr index in simplify_bitfield_ref to avoid ICE.

gcc/ChangeLog:

PR tree-optimization/105591
* tree-ssa-forwprop.cc (simplify_bitfield_ref): Clamp
vec_perm_expr index.

gcc/testsuite/ChangeLog:

* gcc.dg/pr105591.c: New test.

2 years agoDaily bump.
GCC Administrator [Tue, 17 May 2022 00:16:28 +0000 (00:16 +0000)]
Daily bump.

2 years agoattribs: fix typedefs in generic code [PR105492]
Jason Merrill [Thu, 5 May 2022 15:03:44 +0000 (11:03 -0400)]
attribs: fix typedefs in generic code [PR105492]

In my patch for PR100545 I added an assert to check for broken typedefs in
set_underlying_type, and it found one in this case:
rs6000_handle_altivec_attribute had the same problem as
handle_mode_attribute.  So let's move the fixup into decl_attributes.

PR c/105492

gcc/ChangeLog:

* attribs.cc (decl_attributes): Fix broken typedefs here.

gcc/c-family/ChangeLog:

* c-attribs.cc (handle_mode_attribute): Don't fix broken typedefs
here.

2 years agoanalyzer: implement four new warnings for <stdarg.h> misuses [PR105103]
David Malcolm [Mon, 16 May 2022 19:32:11 +0000 (15:32 -0400)]
analyzer: implement four new warnings for <stdarg.h> misuses [PR105103]

This patch adds support to the analyzer for checking usage of <stdarg.h>,
with four new warnings.

It adds:
(a) a state-machine for tracking "started" and "ended" states on va_list
instances, implementing two new warnings:
  -Wanalyzer-va-list-leak
    for complaining about missing va_end after a va_start or va_copy
  -Wanalyzer-va-list-use-after-va-end:
    for complaining about va_arg or va_copy used on a va_list that's had
    va_end called on it

(b) interprocedural tracking of variadic parameters, tracking symbolic
values, implementing two new warnings:
  -Wanalyzer-va-arg-type-mismatch
     for type-checking va_arg usage against the types of the parameters
     that were actually passed to the variadic call
  -Wanalyzer-va-list-exhausted
     for complaining if va_arg is used too many times on a va_list

Here's an LTO example of a type mismatch in a variadic call that
straddles two source files:

stdarg-lto-1-a.c: In function 'called_by_test_type_mismatch_1':
stdarg-lto-1-a.c:19:7: warning: 'va_arg' expected 'const char *' but
 received 'int' for variadic argument 1 of 'ap' [-Wanalyzer-va-arg-type-mismatch]
   19 |   str = va_arg (ap, const char *);
      |       ^
  'test_type_mismatch_1': events 1-2
    |
    |stdarg-lto-1-b.c:3:6:
    |    3 | void test_type_mismatch_1 (void)
    |      |      ^
    |      |      |
    |      |      (1) entry to 'test_type_mismatch_1'
    |    4 | {
    |    5 |   called_by_test_type_mismatch_1 (42, 1066);
    |      |   ~
    |      |   |
    |      |   (2) calling 'called_by_test_type_mismatch_1' from 'test_type_mismatch_1' with 1 variadic argument
    |
    +--> 'called_by_test_type_mismatch_1': events 3-4
           |
           |stdarg-lto-1-a.c:12:1:
           |   12 | called_by_test_type_mismatch_1 (int placeholder, ...)
           |      | ^
           |      | |
           |      | (3) entry to 'called_by_test_type_mismatch_1'
           |......
           |   19 |   str = va_arg (ap, const char *);
           |      |       ~
           |      |       |
           |      |       (4) 'va_arg' expected 'const char *' but received 'int' for variadic argument 1 of 'ap'
           |

gcc/ChangeLog:
PR analyzer/105103
* Makefile.in (ANALYZER_OBJS): Add analyzer/varargs.o.
* doc/invoke.texi: Add -Wanalyzer-va-arg-type-mismatch,
-Wanalyzer-va-list-exhausted, -Wanalyzer-va-list-leak, and
-Wanalyzer-va-list-use-after-va-end.

gcc/analyzer/ChangeLog:
PR analyzer/105103
* analyzer.cc (make_label_text_n): New.
* analyzer.h (class var_arg_region): New forward decl.
(make_label_text_n): New decl.
* analyzer.opt (Wanalyzer-va-arg-type-mismatch): New option.
(Wanalyzer-va-list-exhausted): New option.
(Wanalyzer-va-list-leak): New option.
(Wanalyzer-va-list-use-after-va-end): New option.
* checker-path.cc (call_event::get_desc): Split out decl access
into..
(call_event::get_caller_fndecl): ...this new function and...
(call_event::get_callee_fndecl): ...this new function.
* checker-path.h (call_event::get_desc): Drop "FINAL".
(call_event::get_caller_fndecl): New decl.
(call_event::get_callee_fndecl): New decl.
(class call_event): Make fields protected.
* diagnostic-manager.cc (null_assignment_sm_context::warn): New
overload.
(null_assignment_sm_context::get_new_program_state): New.
(diagnostic_manager::add_events_for_superedge): Move case
SUPEREDGE_CALL to a new pending_diagnostic::add_call_event vfunc.
* engine.cc (impl_sm_context::warn): Implement new override.
(impl_sm_context::get_new_program_state): New.
* pending-diagnostic.cc: Include "analyzer/diagnostic-manager.h",
"cpplib.h", "digraph.h", "ordered-hash-map.h", "cfg.h",
"basic-block.h", "gimple.h", "gimple-iterator.h", "cgraph.h"
"analyzer/supergraph.h", "analyzer/program-state.h",
"alloc-pool.h", "fibonacci_heap.h", "shortest-paths.h",
"sbitmap.h", "analyzer/exploded-graph.h", "diagnostic-path.h",
and "analyzer/checker-path.h".
(ht_ident_eq): New.
(fixup_location_in_macro_p): New.
(pending_diagnostic::fixup_location): New.
(pending_diagnostic::add_call_event): New.
* pending-diagnostic.h (pending_diagnostic::fixup_location): Drop
no-op inline implementation in favor of the more complex
implementation above.
(pending_diagnostic::add_call_event): New vfunc.
* region-model-impl-calls.cc: Include "analyzer/sm.h",
"diagnostic-path.h", and "analyzer/pending-diagnostic.h".
* region-model-manager.cc
(region_model_manager::get_var_arg_region): New.
(region_model_manager::log_stats): Log m_var_arg_regions.
* region-model.cc (region_model::on_call_pre): Handle IFN_VA_ARG,
BUILT_IN_VA_START, and BUILT_IN_VA_COPY.
(region_model::on_call_post): Handle BUILT_IN_VA_END.
(region_model::get_representative_path_var_1): Handle RK_VAR_ARG.
(region_model::push_frame): Push variadic arguments.
* region-model.h (region_model_manager::get_var_arg_region): New
decl.
(region_model_manager::m_var_arg_regions): New field.
(region_model::impl_call_va_start): New decl.
(region_model::impl_call_va_copy): New decl.
(region_model::impl_call_va_arg): New decl.
(region_model::impl_call_va_end): New decl.
* region.cc (alloca_region::dump_to_pp): Dump the id.
(var_arg_region::dump_to_pp): New.
(var_arg_region::get_frame_region): New.
* region.h (enum region_kind): Add RK_VAR_ARG.
(region::dyn_cast_var_arg_region): New.
(class var_arg_region): New.
(is_a_helper <const var_arg_region *>::test): New.
(struct default_hash_traits<var_arg_region::key_t>): New.
* sm.cc (make_checkers): Call make_va_list_state_machine.
* sm.h (sm_context::warn): New vfunc.
(sm_context::get_old_svalue): Drop unused decl.
(sm_context::get_new_program_state): New vfunc.
(make_va_list_state_machine): New decl.
* varargs.cc: New file.

gcc/testsuite/ChangeLog:
PR analyzer/105103
* gcc.dg/analyzer/stdarg-1.c: New test.
* gcc.dg/analyzer/stdarg-2.c: New test.
* gcc.dg/analyzer/stdarg-fmtstring-1.c: New test.
* gcc.dg/analyzer/stdarg-lto-1-a.c: New test.
* gcc.dg/analyzer/stdarg-lto-1-b.c: New test.
* gcc.dg/analyzer/stdarg-lto-1.h: New test.
* gcc.dg/analyzer/stdarg-sentinel-1.c: New test.
* gcc.dg/analyzer/stdarg-types-1.c: New test.
* gcc.dg/analyzer/stdarg-types-2.c: New test.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2 years agod: Merge upstream dmd 60bfa0ee7, druntime 94bd5bcb, phobos 3a1cd9a01.
Iain Buclaw [Mon, 16 May 2022 16:30:46 +0000 (18:30 +0200)]
d: Merge upstream dmd 60bfa0ee7, druntime 94bd5bcb, phobos 3a1cd9a01.

D front-end changes:

    - Import dmd v2.100.0.
    - Add bit fields to D, enabled via the -fpreview=bitfields switch.
    - Removed the -ftransition=markdown and -frevert=markdown switches.
    - Added new trait `__traits(classInstanceAlignment)' to provide the
      required data alignment for classes.
    - The check for `pragma(crt_constructor)' and `pragma(crt_destructor)'
      linkage has been relaxed to allow all `void()' signatures.
    - ImportC parser now recognizes the `typeof(...)' operator.

D runtime changes:

    - Import druntime v2.100.0.

Phobos changes:

    - Import phobos v2.100.0.
    - To comply with dip1000, `std.socket.Socket` methods now accept only
      `scope' arrays.
    - The `fill', `alignSize', `align2', and `align4' methods of
      `std.outbuffer.OutBuffer' have been extended to allow specifying a custom
      value when pre-filling or padding the buffer.

gcc/d/ChangeLog:

* dmd/MERGE: Merge upstream dmd 60bfa0ee7.
* dmd/VERSION: Update version to v2.100.0.
* d-builtins.cc (d_init_versions): Update for new front-end interface.
* d-codegen.cc (d_decl_context): Use resolvedLinkage to get
declaration linkage.
(build_struct_literal): Track offset in bits.
* d-gimplify.cc (d_gimplify_modify_expr): Check both operands for a
bit-field reference.
* d-lang.cc (d_handle_option): Handle -fpreview=bitfields, remove
-frevert=markdown and -ftransition=vmarkdown.
(d_post_options): Set flag_rtti and flag_exceptions if -fno-druntime
was seen on command-line.
(d_parse_file): Update for new front-end interface.
(d_type_promotes_to): Use resolvedLinkage to get declaration linkage.
* decl.cc (make_thunk): Likewise.
* expr.cc (ExprVisitor::visit (CatAssignExp *)): Remove lowering for
appending of an element or array to another array.
* lang.opt (fpreview=bitfields): New option.
(frevert=markdown): Remove.
(ftransition=vmarkdown): Remove.
* types.cc (layout_aggregate_members): Ignore anonymous fields in
total count.

libphobos/ChangeLog:

* libdruntime/MERGE: Merge upstream druntime 94bd5bcb.
* libdruntime/Makefile.am (ALL_DRUNTIME_INSTALL_DSOURCES): Add
$(DRUNTIME_DSOURCES_ELF).
(ALL_DRUNTIME_SOURCES): Likewise.
(DRUNTIME_DSOURCES_ELF): New variable.
* libdruntime/Makefile.in: Regenerate.
* src/MERGE: Merge upstream phobos 3a1cd9a01.
* testsuite/libphobos.init_fini/custom_gc.d: Update test.

2 years agolibstdc++: Fix hyperlink in docs
Jonathan Wakely [Mon, 16 May 2022 13:54:07 +0000 (14:54 +0100)]
libstdc++: Fix hyperlink in docs

libstdc++-v3/ChangeLog:

* doc/xml/manual/prerequisites.xml: Fix attributes for external
hyperlink.
* doc/html/manual/setup.html: Regenerate.

2 years agolibstdc++: Update C++23 status docs
Jonathan Wakely [Mon, 16 May 2022 13:44:41 +0000 (14:44 +0100)]
libstdc++: Update C++23 status docs

These are the C++23 proposals supported in the gcc-12 branch.

libstdc++-v3/ChangeLog:

* doc/xml/manual/status_cxx2023.xml: Update with gcc-12 support.
* doc/html/*: Regenerate.

2 years agolibstdc++: Add C++23 status docs
Jonathan Wakely [Mon, 16 May 2022 13:09:05 +0000 (14:09 +0100)]
libstdc++: Add C++23 status docs

These are the C++23 proposals already supported in the gcc-11 branch.

libstdc++-v3/ChangeLog:

* doc/xml/manual/intro.xml: Include new chapter.
* doc/xml/manual/status_cxx2020.xml: Tweak release numbers.
* doc/xml/manual/status_cxx2023.xml: New file.
* doc/html/*: Regenerate.

2 years agolibstdc++: Fix status docs for <bit> support
Jonathan Wakely [Mon, 16 May 2022 12:57:08 +0000 (13:57 +0100)]
libstdc++: Fix status docs for <bit> support

libstdc++-v3/ChangeLog:

* doc/html/manual/status.html: Regenerate.
* doc/xml/manual/status_cxx2020.xml: Fix supported version for
C++20 bit operations.

2 years agoFinish gimple_build API enhancement
Richard Biener [Mon, 16 May 2022 10:39:30 +0000 (12:39 +0200)]
Finish gimple_build API enhancement

This finishes the remaining parts of the gimple_build API enhancement,
converting the remaining workers to receive a gimple_stmt_iterator,
direction and update argument.  It also moves the code_helper
receiving functions from gimple-match.h to gimple-fold.h.

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

* gimple-match.h (gimple_build): Move code_helper overloads ...
* gimple-fold.h (gimple_build): ... here.
(gimple_build): Transition to new worker API.  Provide
overloads from sequence-based API.
(gimple_convert): Likewise.
(gimple_convert_to_ptrofftype): Likewise.
(gimple_build_vector_from_val): Likewise.
(gimple_build_vector): Likewise.
(gimple_build_round_up): Likewise.
* gimple-fold.cc (gimple_build_insert_seq): New helper.
(gimple_build): Use it.  Transition combined_fn and code_helper
API parts.
(gimple_convert): Transition to new worker API.
(gimple_convert_to_ptrofftype): Likewise.
(gimple_build_vector_from_val): Likewise.
(gimple_build_vector): Likewise.
(gimple_build_round_up): Likewise.

2 years agoMove code_helper to tree.h
Richard Biener [Mon, 16 May 2022 10:09:29 +0000 (12:09 +0200)]
Move code_helper to tree.h

tree.h already contains combined_fn handling at the top and moving
code_helper away from gimple-match.h makes improving the gimple_build
API easier.

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

* gimple-match.h (code_helper): Move class ...
* tree.h (code_helper): ... here.

2 years agortl-optimization/105577 - testcase for the PR
Richard Biener [Mon, 16 May 2022 10:07:31 +0000 (12:07 +0200)]
rtl-optimization/105577 - testcase for the PR

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

PR rtl-optimization/105577
* g++.dg/torture/pr105577.C: New testcase.

2 years agoipa/105598 - testcase for PR105598
Richard Biener [Mon, 16 May 2022 09:21:06 +0000 (11:21 +0200)]
ipa/105598 - testcase for PR105598

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

gcc/testsuite/
* gcc.dg/torture/pr105598.c: New testcase.

2 years agoopts-global.cc: document last change
Martin Liska [Mon, 16 May 2022 09:07:57 +0000 (11:07 +0200)]
opts-global.cc: document last change

gcc/ChangeLog:

* opts-global.cc (write_langs): Add comment.

2 years agoDo not use DW_OP_not for TRUTH_NOT_EXPR in conditional expressions
Eric Botcazou [Mon, 16 May 2022 08:44:09 +0000 (10:44 +0200)]
Do not use DW_OP_not for TRUTH_NOT_EXPR in conditional expressions

DW_OP_not is a bitwise, not a logical NOT, so it computes the wrong result
in a DWARF conditional expression.

gcc/
* dwarf2out.cc (loc_list_from_tree_1) <TRUTH_NOT_EXPR>: Do a logical
instead of a bitwise negation.
<COND_EXPR>: Swap the operands if the condition is TRUTH_NOT_EXPR.

2 years ago[Ada] Fix fallout of change in equality for untagged record types
Eric Botcazou [Wed, 16 Mar 2022 13:50:24 +0000 (14:50 +0100)]
[Ada] Fix fallout of change in equality for untagged record types

The problem is that the resolution of expanded names implicitly assumes
that the visible and private homonyms in a given scope are segregated on
the homonym chain, and this was no longer the case for equality operators
in the specific case at stake.

gcc/ada/

* sem_ch7.adb (Inspect_Untagged_Record_Completion): Also move the
equality operator on the homonym chain if there is another equality
operator in the private part.

2 years ago[Ada] Fix expansion of attribute Loop_Entry wrt value propagation
Piotr Trojanek [Wed, 16 Mar 2022 12:36:40 +0000 (13:36 +0100)]
[Ada] Fix expansion of attribute Loop_Entry wrt value propagation

When expanding attribute Loop_Entry we create constant object
declarations and put them just before the loop. The current values of
variables at the point of Loop_Entry attribute must not be used when
analysing the initialization expressions of these constants, because
they might be different from the values at the loop entry itself.

gcc/ada/

* exp_attr.adb (Expand_Loop_Entry_Attribute): Disable value
propagation when analysing the constant that holds the
Loop_Entry prefix value.

2 years ago[Ada] Remove useless code related to current value propagation
Piotr Trojanek [Wed, 16 Mar 2022 13:22:42 +0000 (14:22 +0100)]
[Ada] Remove useless code related to current value propagation

The current value propagation applies only to assignable objects and
doesn't make sense for subprogram entities. This was a mistake
introduced when extending the current value propagation years ago.

Cleanup related to fixing interference between expansion of attribute
Loop_Entry and current value propagation.

gcc/ada/

* sem_attr.adb (Address_Checks): Remove call to
Kill_Current_Values for subprogram entities, because this
routine only does something for object entities.

2 years ago[Ada] Type invariant or postcondition may cause uninitialized memory reads
Justin Squirek [Thu, 10 Feb 2022 23:03:00 +0000 (23:03 +0000)]
[Ada] Type invariant or postcondition may cause uninitialized memory reads

This patch corrects an error in the compiler whereby a function
requiring the generation of a postconditions procedure may cause an
uninitialized memory read when the return type
Has_Unconstrained_Elements or is an unconstrained array.

The error occurs because evaluation of postconditions happens within the
"at end" handler when the temporary result object may go out of scope.
The patch modifies expansion in the above cases to evaluate
postconditions at the point of return instead - in order to guarantee
the result object is valid.

Note that these changes have the side effect of introducing a semantic
bug such that functions returning types with unconstrained elements will
have their postconditions/return type invariants evaluated before
finalization. Work is currently being done to introduce wrappers which
will solve this problem and remove technical debt in this area.

gcc/ada/

* exp_ch7.adb (Build_Finalizer): Disable late evaluation of
postconditions for functions returning types which where
Has_Unconstrained_Elements is true or are unconstrained arrays.

2 years ago[Ada] Freeze target type on qualified expression expansion
Etienne Servais [Mon, 14 Mar 2022 13:35:43 +0000 (14:35 +0100)]
[Ada] Freeze target type on qualified expression expansion

An object declaration (other than a deferred constant declaration)
causes freezing where it occurs (13.14(6)), which means every name
occurring within it causes freezing (13.14(4/1)), and when the name in a
subtype_mark causes freezing, the denoted subtype is frozen (13.14(11)).
Hence, one needs to freeze the target type when expanding a qualified
expression.

gcc/ada/

* exp_ch4.adb (Expand_N_Qualified_Expression): Freeze
Target_Type.

2 years ago[Ada] Fix proof of double arithmetic units
Yannick Moy [Fri, 11 Mar 2022 10:54:53 +0000 (11:54 +0100)]
[Ada] Fix proof of double arithmetic units

Proof of an assertion is not automatic anymore. Add two assertions
before it to guide the prover.

gcc/ada/

* libgnat/s-aridou.adb (Double_Divide): Add intermediate
assertions.

2 years ago[Ada] Don't crash on ghost packages when emitting CUDA symbols in ALI files
Ghjuvan Lacambre [Mon, 14 Mar 2022 08:58:52 +0000 (09:58 +0100)]
[Ada] Don't crash on ghost packages when emitting CUDA symbols in ALI files

Before this commit, a GNAT compiled with assertions would crash when
attempting to emit CUDA symbols in ALI files for spark_mode/ghost
packages, whose content is a single null statement.

gcc/ada/

* lib-writ.adb (Output_CUDA_Symbols): Check for null packages.

2 years ago[Ada] GNAT.Debug_Pools: Improve documentation of the Stack_Trace_Depth parameter
Joel Brobecker [Mon, 14 Mar 2022 03:54:02 +0000 (07:54 +0400)]
[Ada] GNAT.Debug_Pools: Improve documentation of the Stack_Trace_Depth parameter

Setting this parameter to zero when calling the Configure procedure has
the effect of disabling completely the tracking of the biggest memory
users, which wasn't clear from the current documentation.  So this patch
enhances the documentation of both the Configure procedure as well as
the Dump procedure to make that explicit.

gcc/ada/

* libgnat/g-debpoo.ads: Improve documentation of the
Stack_Trace_Depth parameter.

2 years ago[Ada] sigaction result not properly checked in __gnat_install_handler (QNX)
Joel Brobecker [Fri, 11 Mar 2022 03:39:53 +0000 (03:39 +0000)]
[Ada] sigaction result not properly checked in __gnat_install_handler (QNX)

The QNX version of __gnat_install_handler calls sigaction for a number
of signals, and then prints an error message when the the call failed.
But unfortunately, except for the first call, we forgot to store
sigaction's return value, so the check that ensues uses a potentially
uninitialized variable, which the compiler does detect (this is how we
found this issue).

This change fixes this by make sure we store the result of each
sigaction call before checking it.

While at it, we noticed a thinko in the error messages all alerting
about the SIGFPE signal, rather than the signal it just tested.  Most
likely a copy/paste thinko. Fixed by this change as well.

gcc/ada/

* init.c (__gnat_install_handler) [__QNX__]: Save sigaction's
return value in err before checking err's value.  Fix incorrect
signal names in perror messages.

2 years ago[Ada] Fix thinko in QNX's implementation of __gnat_install_handler
Joel Brobecker [Fri, 11 Mar 2022 04:22:34 +0000 (04:22 +0000)]
[Ada] Fix thinko in QNX's implementation of __gnat_install_handler

On QNX, the sigaction handler is incorrectly installed via the
sa_handler field of struct sigaction, rather than the sa_sigaction
field. This triggers a compilation warning due to a mismatch between the
function's signature and the field's type.

    | init.c:2614:18: warning: assignment to 'void (*)(int)'
    | from incompatible pointer type 'void (*)(int,  siginfo_t *, void *)'
    | {aka 'void (*)(int,  struct _siginfo *, void *)'}
    | [-Wincompatible-pointer-types]

In practice, using the sa_handler field actually works, but only because
those two fields are inside a union:

    From target/qnx7/usr/include/signal.h:
    | union { \
    |     __handler_type  _sa_handler; \
    |     __action_type   _sa_sigaction; \
    |     } __sa_un; \

This commit fixes this.

gcc/ada/

* init.c (__gnat_install_handler) [__QNX__]: Set
act.sa_sigaction rather than act.sa_handler.

2 years ago[Ada] Add <stdlib.h> #include in cstreams.c
Joel Brobecker [Fri, 11 Mar 2022 04:22:26 +0000 (04:22 +0000)]
[Ada] Add <stdlib.h> #include in cstreams.c

When building the GNAT runtime for QNX, we get the following warning:

| cstreams.c: In function '__gnat_full_name':
| cstreams.c:209:5: warning: implicit declaration of function 'realpath'
|                   [-Wimplicit-function-declaration]
|   209 |     realpath (nam, buffer);
|       |     ^~~~~~~~

This commit fixes the warning by adding the corresponding #include
of <stdlib.h>

gcc/ada/

* cstreams.c: Add <stdlib.h> #include.

2 years ago[Ada] replace call to bzero in terminals.c by call to memset
Joel Brobecker [Fri, 11 Mar 2022 04:22:15 +0000 (04:22 +0000)]
[Ada] replace call to bzero in terminals.c by call to memset

bzero is marked as legacy in POSIX.1-2001, and using it triggers a
deprecation warnings on some systems such as QNX. This change adjusts
the one place where we use it in terminals.c to use memset instead.
This, in turns, allows us to get rid of a hack for HP/UX and Solaris.

gcc/ada/

* terminals.c: Remove bzero #define on HP/UX or Solaris
platforms.
(child_setup_tty): Replace bzero call by equivalent call to
memset.

2 years ago[Ada] Revise Storage_Model_Support operations to do checks and take objects and types
Gary Dismukes [Tue, 8 Mar 2022 23:21:48 +0000 (18:21 -0500)]
[Ada] Revise Storage_Model_Support operations to do checks and take objects and types

The functions in subpackage Storage_Model_Support (apart from the
Has_*_Aspect functions) are revised to have assertions that will fail
when passed a parameter that doesn't specify the appropriate aspect
(either aspect Storage_Model_Type or Designated_Storage_Model), instead
of returning Empty for bad arguments. Also, various of the functions now
allow either a type with aspect Storage_Model_Type or an object of such
a type.

gcc/ada/

* sem_util.ads (Storage_Model_Support): Revise comments on most
operations within this nested package to reflect that they can
now be passed either a type that has aspect Storage_Model_Type
or an object of such a type.  Change the names of the relevant
formals to SM_Obj_Or_Type. Also, add more precise semantic
descriptions in some cases, and declare the subprograms in a
more logical order.
* sem_util.adb (Storage_Model_Support.Storage_Model_Object): Add
an assertion that the type must specify aspect
Designated_Storage_Model, rather than returning Empty when it
doesn't specify that aspect.
(Storage_Model_Support.Storage_Model_Type): Add an assertion
that formal must be an object whose type specifies aspect
Storage_Model_Type, rather than returning Empty for when it
doesn't have such a type (and test Has_Storage_Model_Type_Aspect
rather than Find_Value_Of_Aspect).
(Storage_Model_Support.Get_Storage_Model_Type_Entity): Allow
both objects and types, and add an assertion that the type (or
the type of the object) has a value for aspect
Storage_Model_Type.

2 years ago[Ada] Handle case-expression inside if-expression in -gnato2
Etienne Servais [Tue, 8 Mar 2022 13:49:55 +0000 (14:49 +0100)]
[Ada] Handle case-expression inside if-expression in -gnato2

gcc/ada/

* checks.adb (Apply_Arithmetic_Overflow_Minimized_Eliminated):
Fix condition to return.

2 years ago[Ada] Update comment justifying non-inlining for proof inside generics
Yannick Moy [Fri, 11 Mar 2022 11:55:16 +0000 (12:55 +0100)]
[Ada] Update comment justifying non-inlining for proof inside generics

gcc/ada/

* inline.adb (Can_Be_Inlined_In_GNATprove_Mode): Update comment.

2 years ago[Ada] Fix iterated element association loop var escaping loop scope
Marc Poulhiès [Mon, 7 Mar 2022 13:02:13 +0000 (14:02 +0100)]
[Ada] Fix iterated element association loop var escaping loop scope

Fix the escaping of the loop variable from the loop scope in both forms
of iterated element associations (i.e. "for J in ..." and "for J of
..."). Create a dedicated scope around the analyses of both loops. Also
create a copy of the Loop_Parameter_Specification instead of analyzing
(and modifying) the original Tree as it will be reanalyzed later.

gcc/ada/

* sem_aggr.adb (Resolve_Iterated_Association): Create scope
around N_Iterated_Element_Association handling. Analyze a copy
of the Loop_Parameter_Specification. Call Analyze instead
Analyze_* to be more homogeneous.
(Sem_Ch5): Remove now unused package.

2 years ago[Ada] Fix internal error on iterated array aggregate
Eric Botcazou [Wed, 9 Mar 2022 23:31:11 +0000 (00:31 +0100)]
[Ada] Fix internal error on iterated array aggregate

The front-end drops the declaration of a temporary on the floor because
Insert_Actions fails to climb up out of an N_Iterated_Component_Association
when the temporary is created during the analysis of its Discrete_Choices.

gcc/ada/

* exp_util.adb (Insert_Actions) <N_Iterated_Component_Association>:
Climb up out of the node if the actions come from Discrete_Choices.

2 years ago[Ada] Accept calls to abstract subprograms in class-wide pre/post-conditions
Javier Miranda [Tue, 8 Mar 2022 22:55:16 +0000 (14:55 -0800)]
[Ada] Accept calls to abstract subprograms in class-wide pre/post-conditions

Fix a regression in the support for Ada 2022's treatment of calls to
abstract subprograms in pre/post-conditions (thanks to Javier Miranda
for producing this patch).

gcc/ada/

* sem_disp.adb (Check_Dispatching_Context): When checking to see
whether an expression occurs in a class-wide pre/post-condition,
also check for the possibility that it occurs in a class-wide
preconditions subprogram that was introduced as part of
expansion. Without this fix, some legal calls occuring in
class-wide preconditions may be incorrectly flagged as violating
the "a call to an abstract subprogram must be dispatching" rule.

2 years ago[Ada] Fix internal error on mix of controlled and protected types
Eric Botcazou [Thu, 10 Mar 2022 10:11:32 +0000 (11:11 +0100)]
[Ada] Fix internal error on mix of controlled and protected types

The key is that the protected type is a (limited) private type, which
fools a test in Cleanup_Scopes.

gcc/ada/

* inline.adb (Cleanup_Scopes): Test the underlying type.

2 years ago[Ada] Fix internal error on predicate aspect with iterator
Eric Botcazou [Wed, 9 Mar 2022 19:47:00 +0000 (20:47 +0100)]
[Ada] Fix internal error on predicate aspect with iterator

The semantic analysis of predicates involves a fair amount of tree
copying because of both semantic and implementation considerations, and
there is a difficulty with quantified expressions since they declare a
new entity that cannot be shared between the various copies of the tree.

This change implements a specific processing for it in New_Copy_Tree
that subsumes a couple of fixes made earlier for variants of the issue.

gcc/ada/

* sem_util.ads (Is_Entity_Of_Quantified_Expression): Declare.
* sem_util.adb (Is_Entity_Of_Quantified_Expression): New
predicate.
(New_Copy_Tree): Deal with all entities of quantified
expressions.
* sem_ch13.adb (Build_Predicate_Functions): Get rid of
superfluous tree copying and remove obsolete code.
* sem_ch6.adb (Fully_Conformant_Expressions): Deal with all
entities of quantified expressions.

2 years ago[Ada] Implement component finalization ordering rules for type extensions
Steve Baird [Thu, 3 Mar 2022 22:35:31 +0000 (14:35 -0800)]
[Ada] Implement component finalization ordering rules for type extensions

Finalization of a record object is required to finalize any components
that have an access discriminant constrained by a per-object expression
before other components. This includes the case of a type extension;
"early finalization" components of the parent type are required to be
finalized before non-early-finalization extension components. This is
implemented in the extension type's finalization procedure by placing
the call to the parent type's finalization procedure between the
finalization of the "early finalization" extension components and the
finalization of the other extension components. Previously that call was
executed after finalizing all of the extension conponents.

gcc/ada/

* exp_ch7.adb (Build_Finalize_Statements): Add Last_POC_Call
variable to keep track of the last "early finalization" call
generated for type extension's finalization procedure. If
non-empty, then this will indicate the point at which to insert
the call to the parent type's finalization procedure. Modify
nested function Process_Component_List_For_Finalize to set this
variable (and avoid setting it during a recursive call).  If
Last_POC_Call is empty, then insert the parent finalization call
before, rather than after, the finalization code for the
extension components.

2 years ago[Ada] Fix implementation issues with equality for untagged record types
Eric Botcazou [Mon, 28 Feb 2022 14:27:27 +0000 (15:27 +0100)]
[Ada] Fix implementation issues with equality for untagged record types

This moves the implementation of AI12-0101 + AI05-0123 from the expander
to the semantic analyzer and completes the implementation of AI12-0413,
which are both binding interpretations in Ada 2012, fixing a few bugs in
the process and removing a fair amount of duplicated code throughout.

gcc/ada/

* einfo-utils.adb (Remove_Entity): Fix couple of oversights.
* exp_ch3.adb (Is_User_Defined_Equality): Delete.
(User_Defined_Eq): Call Get_User_Defined_Equality.
(Make_Eq_Body): Likewise.
(Predefined_Primitive_Eq_Body): Call Is_User_Defined_Equality.
* exp_ch4.adb (Build_Eq_Call): Call Get_User_Defined_Equality.
(Is_Equality): Delete.
(User_Defined_Primitive_Equality_Op): Likewise.
(Find_Aliased_Equality): Call Is_User_Defined_Equality.
(Expand_N_Op_Eq): Call Underlying_Type unconditionally.
Do not implement AI12-0101 + AI05-0123 here.
(Expand_Set_Membership): Call Resolve_Membership_Equality.
* exp_ch6.adb (Expand_Call_Helper): Remove obsolete code.
* sem_aux.ads (Is_Record_Or_Limited_Type): Delete.
* sem_aux.adb (Is_Record_Or_Limited_Type): Likewise.
* sem_ch4.ads (Nondispatching_Call_To_Abstract_Operation): Declare.
* sem_ch4.adb (Analyze_Call): Call Call_Abstract_Operation.
(Analyze_Membership_Op): Call Resolve_Membership_Equality.
(Nondispatching_Call_To_Abstract_Operation): New procedure.
(Remove_Abstract_Operations): Call it.
* sem_ch6.adb (Check_Untagged_Equality): Remove obsolete error and
call Is_User_Defined_Equality.
* sem_ch7.adb (Inspect_Untagged_Record_Completion): New procedure
implementing AI12-0101 + AI05-0123.
(Analyze_Package_Specification): Call it.
(Declare_Inherited_Private_Subprograms): Minor tweak.
(Uninstall_Declarations): Likewise.
* sem_disp.adb (Check_Direct_Call): Adjust to new implementation
of Is_User_Defined_Equality.
* sem_res.ads (Resolve_Membership_Equality): Declare.
* sem_res.adb (Resolve): Replace direct error handling with call to
Nondispatching_Call_To_Abstract_Operation
(Resolve_Call): Likewise.
(Resolve_Equality_Op): Likewise.  mplement AI12-0413.
(Resolve_Membership_Equality): New procedure.
(Resolve_Membership_Op): Call Get_User_Defined_Equality.
* sem_util.ads (Get_User_Defined_Eq): Rename into...
(Get_User_Defined_Equality): ...this.
* sem_util.adb (Get_User_Defined_Eq): Rename into...
(Get_User_Defined_Equality): ...this. Call Is_User_Defined_Equality.
(Is_User_Defined_Equality): Also check the profile but remove tests
on Comes_From_Source and Parent.
* sinfo.ads (Generic_Parent_Type): Adjust field description.
* uintp.ads (Ubool): Invoke user-defined equality in predicate.

2 years ago[Ada] Remove duplicated detection of user-defined equality
Piotr Trojanek [Tue, 8 Mar 2022 16:46:26 +0000 (17:46 +0100)]
[Ada] Remove duplicated detection of user-defined equality

Cleanup related to handling of user-defined equality in GNATprove.

gcc/ada/

* exp_ch3.adb (User_Defined_Eq): Replace duplicated code with a
call to Get_User_Defined_Eq.

2 years ago[Ada] Improve building of untagged equality
Piotr Trojanek [Tue, 8 Mar 2022 16:37:29 +0000 (17:37 +0100)]
[Ada] Improve building of untagged equality

When checking components of a record type for their own user-defined
equality function it is enough to find just one such a component.

Cleanup related to handling of user-defined equality in GNATprove.

gcc/ada/

* exp_ch3.adb (Build_Untagged_Equality): Exit early when the
outcome of a loop is already known.

2 years ago[Ada] Map gnatlib-shared to gnatlib-shared-dual for aarch64-vx7r2
Olivier Hainque [Fri, 18 Feb 2022 22:57:42 +0000 (22:57 +0000)]
[Ada] Map gnatlib-shared to gnatlib-shared-dual for aarch64-vx7r2

This is an incremental change towards supporting shared libraries
for VxWorks on aarch64.

The aarch64-vx7r2 compiler supports compilation with -fpic/PIC.  This
change adds aarch64 to the list of CPUs for which GNATLIB_SHARED maps to
gnatlib-shared-dual for vxworks7r2, so "make gnatlib-shared" actually
builds a shared lib.

While other adjustments will be needed to get the runtime tests to pass,
this one is a necessary step and doesn't impair the rest.

gcc/ada/

* Makefile.rtl: Add aarch64 to the list of CPUs for which
GNATLIB_SHARED maps to gnatlib-shared-dual for vxworks7r2.

2 years ago[Ada] Couple of small consistency tweaks
Eric Botcazou [Tue, 8 Mar 2022 07:52:10 +0000 (08:52 +0100)]
[Ada] Couple of small consistency tweaks

This aligns Analyze_Negation and Analyze_Unary_Op with the other similar
procedures in Sem_Ch4.  No functional changes.

gcc/ada/

* sem_ch4.adb (Analyze_Negation): Minor tweak.
(Analyze_Unary_Op): Likewise.

2 years ago[Ada] Fix spurious error on limited view with incomplete type
Eric Botcazou [Thu, 3 Mar 2022 14:57:47 +0000 (15:57 +0100)]
[Ada] Fix spurious error on limited view with incomplete type

The problem is that Install_Limited_With_Clause does not fully implement
AI05-0129, in the case where a regular with clause is processed before a
limited_with clause of the same package: the visible "shadow" entity is
that of the incomplete type, instead of that of the full type per the AI.

This requires adjusting Remove_Limited_With_Unit to match the change in
Install_Limited_With_Clause and also Build_Incomplete_Type_Declaration,
which is responsible for synthesizing incomplete types out of full type
declarations for self-referential types.

A small tweak is also needed in Analyze_Subprogram_Body_Helper to align
it with an equivalent processing for CW types in Find_Type_Name. And the
patch also changes the Incomplete_View field in full type declarations
to point to the entity of the view instead of its declaration.

gcc/ada/

* exp_ch3.adb (Build_Assignment): Adjust to the new definition of
Incomplete_View field.
* sem_ch10.ads (Decorate_Type): Declare.
* sem_ch10.adb (Decorate_Type): Move to library level.
(Install_Limited_With_Clause): In the already analyzed case, also
deal with incomplete type declarations present in the sources and
simplify the replacement code.
(Build_Shadow_Entity): Deal with swapped views in package body.
(Restore_Chain_For_Shadow): Deal with incomplete type declarations
present in the sources.
* sem_ch3.adb (Analyze_Full_Type_Declaration): Adjust to the new
definition of Incomplete_View field.
(Build_Incomplete_Type_Declaration): Small consistency tweak.
Set the incomplete type as the Incomplete_View of the full type.
If the scope is a package with a limited view, build a shadow
entity for the incomplete type.
* sem_ch6.adb (Analyze_Subprogram_Body_Helper): When replacing
the limited view of a CW type as designated type of an anonymous
access return type, get to the CW type of the incomplete view of
the tagged type, if any.
(Collect_Primitive_Operations): Adjust to the new definition of
Incomplete_View field.
* sinfo.ads (Incomplete_View): Denote the entity itself instead
of its declaration.
* sem_util.adb: Remove call to Defining_Entity.

2 years ago[Ada] Pick volatile refinement property of a subtype from its base type
Piotr Trojanek [Mon, 7 Mar 2022 14:27:06 +0000 (15:27 +0100)]
[Ada] Pick volatile refinement property of a subtype from its base type

Volatile refinement properties (e.g. Async_Writers), which refine the
Volatile aspect in SPARK, are inherited by subtypes from their base
types. In particular, this patch fixes handling of those properties for
subtypes of private types.

gcc/ada/

* sem_util.adb (Type_Or_Variable_Has_Enabled_Property): Given a
subtype recurse into its base type.

2 years ago[Ada] Clarify code for detecting volatile refinement properties
Piotr Trojanek [Mon, 7 Mar 2022 13:07:15 +0000 (14:07 +0100)]
[Ada] Clarify code for detecting volatile refinement properties

Routine Type_Or_Variable_Has_Enabled_Property handles either types or
objects; replace negation with an explicit positive condition.

Cleanup related to handling of volatile refinement aspects in SPARK;
behaviour is unaffected.

gcc/ada/

* sem_util.adb (Type_Or_Variable_Has_Enabled_Property): Clarify.

2 years ago[Ada] Remove duplicated code for detecting enabled pragmas
Piotr Trojanek [Fri, 4 Mar 2022 16:46:30 +0000 (17:46 +0100)]
[Ada] Remove duplicated code for detecting enabled pragmas

Routines Is_Enabled and Is_Enabled_Pragma are identical (except for
comments); remove this duplication.

Cleanup related to handling of volatile refinement aspects in SPARK;
behaviour is unaffected.

gcc/ada/

* sem_util.adb (Is_Enabled): Remove; use Is_Enabled_Pragma
instead.

2 years agoUse more ARRAY_SIZE.
Martin Liska [Thu, 13 Jan 2022 17:46:26 +0000 (18:46 +0100)]
Use more ARRAY_SIZE.

gcc/ada/ChangeLog:

* locales.c (iso_639_1_to_639_3): Use ARRAY_SIZE.
(language_name_to_639_3): Likewise.
(country_name_to_3166): Likewise.

gcc/analyzer/ChangeLog:

* engine.cc (exploded_node::get_dot_fillcolor): Use ARRAY_SIZE.
* function-set.cc (test_stdio_example): Likewise.
* sm-file.cc (get_file_using_fns): Likewise.
* sm-malloc.cc (malloc_state_machine::unaffected_by_call_p): Likewise.
* sm-signal.cc (get_async_signal_unsafe_fns): Likewise.

gcc/ChangeLog:

* attribs.cc (diag_attr_exclusions): Use ARRAY_SIZE.
(decls_mismatched_attributes): Likewise.
* builtins.cc (c_strlen): Likewise.
* cfg.cc (DEF_BASIC_BLOCK_FLAG): Likewise.
* common/config/aarch64/aarch64-common.cc (aarch64_option_init_struct): Likewise.
* config/aarch64/aarch64-builtins.cc (aarch64_lookup_simd_builtin_type): Likewise.
(aarch64_init_simd_builtin_types): Likewise.
(aarch64_init_builtin_rsqrt): Likewise.
* config/aarch64/aarch64.cc (is_madd_op): Likewise.
* config/arm/arm-builtins.cc (arm_lookup_simd_builtin_type): Likewise.
(arm_init_simd_builtin_types): Likewise.
* config/avr/gen-avr-mmcu-texi.cc (mcus[ARRAY_SIZE): Likewise.
(c_prefix): Likewise.
(main): Likewise.
* config/c6x/c6x.cc (N_SAVE_ORDER): Likewise.
* config/darwin-c.cc (darwin_register_frameworks): Likewise.
* config/gcn/mkoffload.cc (process_obj): Likewise.
* config/i386/i386-builtins.cc (get_builtin_code_for_version): Likewise.
(fold_builtin_cpu): Likewise.
* config/m32c/m32c.cc (PUSHM_N): Likewise.
* config/nvptx/mkoffload.cc (process): Likewise.
* config/rs6000/driver-rs6000.cc (host_detect_local_cpu): Likewise.
* config/s390/s390.cc (NR_C_MODES): Likewise.
* config/tilepro/gen-mul-tables.cc (find_sequences): Likewise.
(create_insn_code_compression_table): Likewise.
* config/vms/vms.cc (NBR_CRTL_NAMES): Likewise.
* diagnostic-format-json.cc (json_from_expanded_location): Likewise.
* dwarf2out.cc (ARRAY_SIZE): Likewise.
* genhooks.cc (emit_documentation): Likewise.
(emit_init_macros): Likewise.
* gimple-ssa-sprintf.cc (format_floating): Likewise.
* gimple-ssa-warn-access.cc (memmodel_name): Likewise.
* godump.cc (keyword_hash_init): Likewise.
* hash-table.cc (hash_table_higher_prime_index): Likewise.
* input.cc (for_each_line_table_case): Likewise.
* ipa-free-lang-data.cc (free_lang_data): Likewise.
* ipa-inline.cc (sanitize_attrs_match_for_inline_p): Likewise.
* optc-save-gen.awk: Likewise.
* spellcheck.cc (test_metric_conditions): Likewise.
* tree-vect-slp-patterns.cc (sizeof): Likewise.
(ARRAY_SIZE): Likewise.
* tree.cc (build_common_tree_nodes): Likewise.

gcc/c-family/ChangeLog:

* c-common.cc (ARRAY_SIZE): Use ARRAY_SIZE.
(c_common_nodes_and_builtins): Likewise.
* c-format.cc (check_tokens): Likewise.
(check_plain): Likewise.
* c-pragma.cc (c_pp_lookup_pragma): Likewise.
(init_pragma): Likewise.
* known-headers.cc (get_string_macro_hint): Likewise.
(get_stdlib_header_for_name): Likewise.
* c-attribs.cc: Likewise.

gcc/c/ChangeLog:

* c-decl.cc (match_builtin_function_types): Use ARRAY_SIZE.

gcc/cp/ChangeLog:

* module.cc (depset::entity_kind_name): Use ARRAY_SIZE.
* name-lookup.cc (get_std_name_hint): Likewise.
* parser.cc (cp_parser_new): Likewise.

gcc/fortran/ChangeLog:

* frontend-passes.cc (gfc_code_walker): Use ARRAY_SIZE.
* openmp.cc (gfc_match_omp_context_selector_specification): Likewise.
* trans-intrinsic.cc (conv_intrinsic_ieee_builtin): Likewise.
* trans-types.cc (gfc_get_array_descr_info): Likewise.

gcc/jit/ChangeLog:

* jit-builtins.cc (find_builtin_by_name): Use ARRAY_SIZE.
(get_string_for_type_id): Likewise.
* jit-recording.cc (recording::context::context): Likewise.

gcc/lto/ChangeLog:

* lto-common.cc (lto_resolution_read): Use ARRAY_SIZE.
* lto-lang.cc (lto_init): Likewise.

2 years agoOpenMP, C++: Add template support for the has_device_addr clause.
Marcel Vollweiler [Mon, 16 May 2022 08:02:50 +0000 (01:02 -0700)]
OpenMP, C++: Add template support for the has_device_addr clause.

This patch adds support for list items in the has_device_addr clause which type
is given by C++ template parameters.

gcc/cp/ChangeLog:

* pt.cc (tsubst_omp_clauses): Added OMP_CLAUSE_HAS_DEVICE_ADDR.
* semantics.cc (finish_omp_clauses): Added template decl processing.

libgomp/ChangeLog:

* testsuite/libgomp.c++/target-has-device-addr-7.C: New test.
* testsuite/libgomp.c++/target-has-device-addr-8.C: New test.
* testsuite/libgomp.c++/target-has-device-addr-9.C: New test.

2 years agoFix ubsan error in opts-global.cc
Martin Liska [Mon, 16 May 2022 07:48:27 +0000 (09:48 +0200)]
Fix ubsan error in opts-global.cc

Fixes:
opts-global.cc:75:15: runtime error: store to address 0x00000bc9be70 with insufficient space for an object of type 'char'
which happens when mask == 0, len == 0 and we allocate zero elements.
Eventually, result[0] is called which triggers the UBSAN.

gcc/ChangeLog:

* opts-global.cc (write_langs): Allocate at least one byte.

2 years agoAdd MIN/MAX folding from fold_cond_expr_with_comparison to match.pd
Richard Biener [Fri, 13 May 2022 07:35:30 +0000 (09:35 +0200)]
Add MIN/MAX folding from fold_cond_expr_with_comparison to match.pd

The following adds MIN/MAX folding from fold_cond_expr_with_comparison
to the part GIMPLE of match.pd, leaving the GENERIC part in
fold-const.cc since that's constrainted on frontend specific things
I did not want to carry to match.pd.

The effect becomes appearant when we no longer can rely on GENERIC
folding of COND_EXPRs in gcc.dg/tree-ssa/pr92834.c and
gcc.dg/tree-ssa/pr94786.c.

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

* match.pd (A cmp B ? A : B -> min/max): New patterns
carried over from fold_cond_expr_with_comparison.

2 years agoFix ICE caused by wrong condition.
liuhongt [Fri, 13 May 2022 07:48:01 +0000 (15:48 +0800)]
Fix ICE caused by wrong condition.

When d->perm[i] == d->perm[i-1] + 1 and d->perm[i] == nelt, it's not
continuous. It should fail if there's more than 2 continuous areas.

gcc/ChangeLog:

PR target/105587
* config/i386/i386-expand.cc
(expand_vec_perm_pslldq_psrldq_por): Fail when (d->perm[i] ==
d->perm[i-1] + 1) && d->perm[i] == nelt && start != -1.

gcc/testsuite/ChangeLog:

* gcc.target/i386/pr105587.c: New test.

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

2 years agoi386: Remove constraints when used with constant integer predicates.
Uros Bizjak [Sun, 15 May 2022 20:07:46 +0000 (22:07 +0200)]
i386: Remove constraints when used with constant integer predicates.

const_int_operand and other const*_operand predicates do not need
constraints when the constraint is inherited from the range of
constant integer predicate.  Remove the constraint in case all
alternatives use the same inherited constraint.

2022-05-15  Uroš Bizjak  <ubizjak@gmail.com>

gcc/ChangeLog:

* config/i386/i386.md: Remove constraints when used with
const_int_operand, const0_operand, const_1_operand, constm1_operand,
const8_operand, const128_operand, const248_operand, const123_operand,
const2367_operand, const1248_operand, const359_operand,
const_4_or_8_to_11_operand, const48_operand, const_0_to_1_operand,
const_0_to_3_operand, const_0_to_4_operand, const_0_to_5_operand,
const_0_to_7_operand, const_0_to_15_operand, const_0_to_31_operand,
const_0_to_63_operand, const_0_to_127_operand, const_0_to_255_operand,
const_0_to_255_mul_8_operand, const_1_to_31_operand,
const_1_to_63_operand, const_2_to_3_operand, const_4_to_5_operand,
const_4_to_7_operand, const_6_to_7_operand, const_8_to_9_operand,
const_8_to_11_operand, const_8_to_15_operand, const_10_to_11_operand,
const_12_to_13_operand, const_12_to_15_operand, const_14_to_15_operand,
const_16_to_19_operand, const_16_to_31_operand, const_20_to_23_operand,
const_24_to_27_operand and const_28_to_31_operand.
* config/i386/mmx.md: Ditto.
* config/i386/sse.md: Ditto.
* config/i386/subst.md: Ditto.
* config/i386/sync.md: Ditto.

2 years agoc++: hidden friend access [DR1699]
Jason Merrill [Sat, 19 Mar 2022 02:52:32 +0000 (22:52 -0400)]
c++: hidden friend access [DR1699]

It has come up several times that Clang considers hidden friends of a class
to be sufficiently memberly to be covered by a friend declaration naming the
class.  This is somewhat unclear in the standard: [class.friend] says
"Declaring a class to be a friend implies that private and protected members
of the class granting friendship can be named in the base-specifiers and
member declarations of the befriended class."

A hidden friend is a syntactic member-declaration, but is it a "member
declaration"?  CWG was ambivalent, and referred the question to EWG as a
design choice.  But recently Patrick mentioned that the current G++ choice
not to treat it as a "member declaration" was making his library work
significantly more cumbersome, so let's go ahead and vote the other way.

This means that the testcases for 100502 and 58993 are now accepted.

DR1699
PR c++/100502
PR c++/58993

gcc/cp/ChangeLog:

* friend.cc (is_friend): Hidden friends count as members.
* search.cc (friend_accessible_p): Likewise.

gcc/testsuite/ChangeLog:

* g++.dg/template/access37.C: Now OK.
* g++.dg/template/friend69.C: Now OK.
* g++.dg/lookup/friend23.C: New test.

2 years agoc++: parsing injected-class-name as template
Jason Merrill [Fri, 13 May 2022 01:28:47 +0000 (21:28 -0400)]
c++: parsing injected-class-name as template

While I was backporting the patch for PR102300, it occurred to me that it
would be cleaner to look through the injected-class-name earlier in the
function.  I don't think this changes any test results.

gcc/cp/ChangeLog:

* parser.cc (cp_parser_template_name): Look through
injected-class-name.

2 years agoc++: array {}-init [PR105589]
Jason Merrill [Fri, 13 May 2022 20:07:10 +0000 (16:07 -0400)]
c++: array {}-init [PR105589]

My patch for 105191 made us use build_value_init more frequently from
build_vec_init_expr, but build_value_init doesn't like to be called to
initialize a class in a template.  That's caused trouble in the past, and
seems like a strange restriction, so let's fix it.

PR c++/105589
PR c++/105191
PR c++/92385

gcc/cp/ChangeLog:

* init.cc (build_value_init): Handle class in template.

gcc/testsuite/ChangeLog:

* g++.dg/cpp0x/initlist-array16.C: New test.

2 years agoDaily bump.
GCC Administrator [Sun, 15 May 2022 00:16:17 +0000 (00:16 +0000)]
Daily bump.

2 years agoDaily bump.
GCC Administrator [Sat, 14 May 2022 00:17:19 +0000 (00:17 +0000)]
Daily bump.

2 years agoc++: Add fixed test [PR81952]
Marek Polacek [Fri, 13 May 2022 23:45:03 +0000 (19:45 -0400)]
c++: Add fixed test [PR81952]

This was fixed by r258755:
PR c++/81311 - wrong C++17 overload resolution.

PR c++/81952

gcc/testsuite/ChangeLog:

* g++.dg/overload/conv-op4.C: New test.

2 years agocompiler: always sort interface parse methods
Ian Lance Taylor [Thu, 12 May 2022 02:23:01 +0000 (19:23 -0700)]
compiler: always sort interface parse methods

The exporter relies on sorting interface parse methods.  It would sort
them as it encountered interface types.  However, when an interface
type is an element of a struct or array type, the exporter might
encounter that interface type before sorting the parse methods.  If it
then encountered an identical interface type again, it could get
confused about whether the two types are identical or not.

Fix the problem by always sorting the parse methods in the
finalize_methods pass.

Also firm up the export type sorting to make sure we never have this
kind of confusion again.  Doing this revealed that we need to be more
careful about sorting in order to handle aliases correctly.

Also fix the interface type hash computation to use the right hash
value when looking at parse methods rather than all methods.

The test case for this is https://go.dev/cl/405759.

Fixes golang/go#52841

Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/405556

2 years agoImproved V1TI (and V2DI) mode equality/inequality on x86_64.
Roger Sayle [Fri, 13 May 2022 21:26:29 +0000 (22:26 +0100)]
Improved V1TI (and V2DI) mode equality/inequality on x86_64.

This patch improves support for vector equality and inequality of
V1TImode vectors, and V2DImode vectors with sse2 but not sse4.
Consider the three functions below:

typedef unsigned int uv4si __attribute__ ((__vector_size__ (16)));
typedef unsigned long long uv2di __attribute__ ((__vector_size__ (16)));
typedef unsigned __int128 uv1ti __attribute__ ((__vector_size__ (16)));

uv4si eq_v4si(uv4si x, uv4si y) { return x == y; }
uv2di eq_v2di(uv2di x, uv2di y) { return x == y; }
uv1ti eq_v1ti(uv1ti x, uv1ti y) { return x == y; }

These all perform vector comparisons of 128bit SSE2 registers, generating
the result as a vector, where ~0 (all 1 bits) represents true and a zero
represents false.  eq_v4si is trivially implemented by x86_64's pcmpeqd
instruction. This patch improves the other two cases:

For v2di, gcc -O2 currently generates:

movq    %xmm0, %rdx
        movq    %xmm1, %rax
        movdqa  %xmm0, %xmm2
        cmpq    %rax, %rdx
        movhlps %xmm2, %xmm3
        movhlps %xmm1, %xmm4
        sete    %al
        movq    %xmm3, %rdx
        movzbl  %al, %eax
        negq    %rax
        movq    %rax, %xmm0
        movq    %xmm4, %rax
        cmpq    %rax, %rdx
        sete    %al
        movzbl  %al, %eax
        negq    %rax
        movq    %rax, %xmm5
        punpcklqdq      %xmm5, %xmm0
        ret

but with this patch we now generate:

        pcmpeqd %xmm0, %xmm1
        pshufd  $177, %xmm1, %xmm0
        pand    %xmm1, %xmm0
        ret

where the results of a V4SI comparison are shuffled and bit-wise ANDed
to produce the desired result.  There's no change in the code generated
for "-O2 -msse4" where the compiler generates a single "pcmpeqq" insn.

For V1TI mode, the results are equally dramatic, where the current -O2
output looks like:

        movaps  %xmm0, -40(%rsp)
        movq    -40(%rsp), %rax
        movq    -32(%rsp), %rdx
        movaps  %xmm1, -24(%rsp)
        movq    -24(%rsp), %rcx
        movq    -16(%rsp), %rsi
        xorq    %rcx, %rax
        xorq    %rsi, %rdx
        orq     %rdx, %rax
        sete    %al
        xorl    %edx, %edx
        movzbl  %al, %eax
        negq    %rax
        adcq    $0, %rdx
        movq    %rax, %xmm2
        negq    %rdx
        movq    %rdx, -40(%rsp)
        movhps  -40(%rsp), %xmm2
        movdqa  %xmm2, %xmm0
        ret

with this patch we now generate:

        pcmpeqd %xmm0, %xmm1
        pshufd  $177, %xmm1, %xmm0
        pand    %xmm1, %xmm0
        pshufd  $78, %xmm0, %xmm1
        pand    %xmm1, %xmm0
        ret

performing a V2DI comparison, followed by a shuffle and pand, and with
-O2 -msse4 take advantages of SSE4.1's pcmpeqq:

        pcmpeqq %xmm0, %xmm1
        pshufd  $78, %xmm1, %xmm0
        pand    %xmm1, %xmm0
        ret

2022-05-13  Roger Sayle  <roger@nextmovesoftware.com>
    Uroš Bizjak  <ubizjak@gmail.com>

gcc/ChangeLog
* config/i386/sse.md (vec_cmpeqv2div2di): Enable for TARGET_SSE2.
For !TARGET_SSE4_1, expand as a V4SI vector comparison, followed
by a pshufd and pand.
(vec_cmpeqv1tiv1ti): New define_expand implementing V1TImode
vector equality as a V2DImode vector comparison (see above),
followed by a pshufd and pand.

gcc/testsuite/ChangeLog
* gcc.target/i386/sse2-v1ti-veq.c: New test case.
* gcc.target/i386/sse2-v1ti-vne.c: New test case.

2 years agors6000: Remove a few needless 'lp64' contraints.
Paul A. Clarke [Tue, 8 Mar 2022 23:12:41 +0000 (17:12 -0600)]
rs6000: Remove a few needless 'lp64' contraints.

A few tests need not be restricted to 'lp64', so remove the restriction.

A few of those need a simple change to the DejaGnu directives to suppress
'-mcmodel' flags for '-m32'.

2022-05-13  Paul A. Clarke  <pc@us.ibm.com>

gcc/testsuite
* g++.target/powerpc/pr65240-1.C: Adjust DejaGnu directives.
* g++.target/powerpc/pr65240-2.C: Likewise.
* g++.target/powerpc/pr65240-3.C: Likewise.
* g++.target/powerpc/pr65240-4.C: Likewise.
* g++.target/powerpc/pr65242.C: Likewise.
* g++.target/powerpc/pr67211.C: Likewise.
* g++.target/powerpc/pr69667.C: Likewise.
* g++.target/powerpc/pr71294.C: Likewise.

2 years agors6000: Move g++.dg powerpc PR tests to g++.target
Paul A. Clarke [Mon, 21 Feb 2022 18:14:01 +0000 (12:14 -0600)]
rs6000: Move g++.dg powerpc PR tests to g++.target

Also adjust DejaGnu directives, as specifically requiring "powerpc*-*-*" is no
longer required.

2021-05-13  Paul A. Clarke  <pc@us.ibm.com>

gcc/testsuite
* g++.dg/pr65240.h: Move to g++.target/powerpc.
* g++.dg/pr93974.C: Likewise.
* g++.dg/pr65240-1.C: Move to g++.target/powerpc, adjust dg directives.
* g++.dg/pr65240-2.C: Likewise.
* g++.dg/pr65240-3.C: Likewise.
* g++.dg/pr65240-4.C: Likewise.
* g++.dg/pr65242.C: Likewise.
* g++.dg/pr67211.C: Likewise.
* g++.dg/pr69667.C: Likewise.
* g++.dg/pr71294.C: Likewise.
* g++.dg/pr84264.C: Likewise.
* g++.dg/pr84279.C: Likewise.
* g++.dg/pr85657.C: Likewise.

2 years agoPR tree-optimization/83907: Improved memset handling in strlen pass.
Roger Sayle [Fri, 13 May 2022 21:20:16 +0000 (22:20 +0100)]
PR tree-optimization/83907: Improved memset handling in strlen pass.

This patch implements the missed optimization enhancement PR 83907,
by handling memset with a constant byte value in tree-ssa's strlen
optimization pass.  Effectively, this treats memset(dst,'x',3) as
it would memcpy(dst,"xxx",3).

This patch also includes a tweak to handle_store to address another
missed optimization observed in the related test case pr83907-2.c.
The consecutive byte stores to memory get coalesced into a vector
write of a vector const, but unfortunately tree-ssa-strlen's
handle_store didn't previously handle the (unusual) case where the
stored "string" starts with a zero byte but also contains non-zero
bytes.

2022-05-13  Roger Sayle  <roger@nextmovesoftware.com>

gcc/ChangeLog
PR tree-optimization/83907
* tree-ssa-strlen.cc (handle_builtin_memset): Record a strinfo
for memset with an constant char value.
(handle_store): Improved handling of stores with a first byte
of zero, but not storing_all_zeros_p.

gcc/testsuite/ChangeLog
PR tree-optimization/83907
* gcc.dg/tree-ssa/pr83907-1.c: New test case.
* gcc.dg/tree-ssa/pr83907-2.c: New test case.

2 years agoRISC-V: Implement C[LT]Z_DEFINED_VALUE_AT_ZERO
Philipp Tomsich [Fri, 1 Apr 2022 12:42:58 +0000 (14:42 +0200)]
RISC-V: Implement C[LT]Z_DEFINED_VALUE_AT_ZERO

The Zbb support has introduced ctz and clz to the backend, but some
transformations in GCC need to know what the value of c[lt]z at zero
is. This affects how the optab is generated and may suppress use of
CLZ/CTZ in tree passes.

Among other things, this is needed for the transformation of
table-based ctz-implementations, such as in deepsjeng, to work
(see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90838).

Prior to this change, the test case from PR90838 would compile to
on RISC-V targets with Zbb:
  myctz:
lui a4,%hi(.LC0)
ld a4,%lo(.LC0)(a4)
neg a5,a0
and a5,a5,a0
mul a5,a5,a4
lui a4,%hi(.LANCHOR0)
addi a4,a4,%lo(.LANCHOR0)
srli a5,a5,58
sh2add a5,a5,a4
lw a0,0(a5)
ret

After this change, we get:
  myctz:
ctz a0,a0
andi a0,a0,63
ret

Testing this with deepsjeng_r (from SPEC 2017) against QEMU, this
shows a clear reduction in dynamic instruction count:
 - before  1961888067076
 - after   1907928279874 (2.75% reduction)

This also merges the various target-specific test-cases (for x86-64,
aarch64 and riscv) within gcc.dg/pr90838.c.

This extends the macros (i.e., effective-target keywords) used in
testing (lib/target-supports.exp) to reliably distinguish between RV32
and RV64 via __riscv_xlen (i.e., the integer register bitwidth) :
testing for ILP32 could be misleading (as ILP32 is a valid memory
model for 64bit systems).

gcc/ChangeLog:

* config/riscv/riscv.h (CLZ_DEFINED_VALUE_AT_ZERO): Implement.
(CTZ_DEFINED_VALUE_AT_ZERO): Same.
* doc/sourcebuild.texi: add documentation for RISC-V specific
test target keywords

gcc/testsuite/ChangeLog:

* gcc.dg/pr90838.c: Add additional flags (dg-additional-options)
  when compiling for riscv64 and subsume gcc.target/aarch64/pr90838.c
  and gcc.target/i386/pr95863-2.c.
* gcc.target/aarch64/pr90838.c: Removed.
* gcc.target/i386/pr95863-2.c: Removed.
* lib/target-supports.exp: Recognize RV32 or RV64 via XLEN

Signed-off-by: Philipp Tomsich <philipp.tomsich@vrull.eu>
Signed-off-by: Manolis Tsamis <manolis.tsamis@vrull.eu>
Co-authored-by: Manolis Tsamis <manolis.tsamis@vrull.eu>
2 years agolibstdc++: Make std::thread::_State private
Jonathan Wakely [Thu, 12 May 2022 19:46:55 +0000 (20:46 +0100)]
libstdc++: Make std::thread::_State private

* include/bits/std_thread.h (thread::_State, thread::_State_ptr):
Declare as private unless _GLIBCXX_THREAD_IMPL is defined.
* src/c++11/thread.cc (_GLIBCXX_THREAD_IMPL): Define.

2 years agolibstdc++: Add noexcept to std::launch operators
Jonathan Wakely [Thu, 12 May 2022 18:33:58 +0000 (19:33 +0100)]
libstdc++: Add noexcept to std::launch operators

libstdc++-v3/ChangeLog:

* include/std/future (launch): Make operators noexcept.

2 years agolibstdc++: Allow std::swap to find overload for std::exception_ptr
Jonathan Wakely [Thu, 12 May 2022 13:18:53 +0000 (14:18 +0100)]
libstdc++: Allow std::swap to find overload for std::exception_ptr

The non-member swap for std::exception_ptr is in a nested namespace and
so can only be found by ADL currently. Add a using-declaration so that
qualified std::swap calls will use the std::exception_ptr::swap member,
instead of the generic std::swap.

There's no new test for this, because the generic std::swap works, it
just does more work than is necessary.

Also tell Doxygen to replace the __exception_ptr namespace with
"__unspecified__" in the generate docs, so the real name is not
documented.

libstdc++-v3/ChangeLog:

* doc/doxygen/user.cfg.in (PREDEFINED): Replace __exception_ptr
with "__unspecified__".
* libsupc++/exception_ptr.h: Improve doxygen docs.
(__exception_ptr::swap): Also declare in namespace std.

2 years agolibstdc++: Make std::rethrow_if_nested work without RTTI
Jonathan Wakely [Thu, 12 May 2022 13:18:06 +0000 (14:18 +0100)]
libstdc++: Make std::rethrow_if_nested work without RTTI

This allows std::rethrow_if_nested to work with -fno-rtti by not
attempting the dynamic_cast if it requires RTTI, since that's ill-formed
with -fno-rtti. The cast will still work if a static upcast to
std::nested_exception is allowed.

Also use if-constexpr to avoid the compile-time overload resolution (and
SFINAE) and run-time dispatching for std::rethrow_if_nested and
std::throw_with_nested.

Also add better doxygen comments throughout the file.

libstdc++-v3/ChangeLog:

* libsupc++/nested_exception.h (throw_with_nested) [C++17]: Use
if-constexpr instead of tag dispatching.
(rethrow_if_nested) [C++17]: Likewise.
(rethrow_if_nested) [!__cpp_rtti]: Do not use dynamic_cast if it
would require RTTI.
* testsuite/18_support/nested_exception/rethrow_if_nested-term.cc:
New test.

2 years agoCheck operand for type, not LHS.
Andrew MacLeod [Fri, 13 May 2022 17:11:18 +0000 (13:11 -0400)]
Check operand for type, not LHS.

When folding, the LHS has not been set, so we should be checking the type of
op1.  We should also make sure op1 is not undefined.

PR tree-optimization/105597
gcc/
* range-op.cc (operator_minus::lhs_op1_relation): Use op1 instead
of the lhs and make sure it is not undefined.
gcc/testsuite/
* gcc.dg/pr105597.c: New.

2 years agolibgomp.fortran/target-nowait-array-section.f90: Fix typo
Tobias Burnus [Fri, 13 May 2022 18:04:38 +0000 (20:04 +0200)]
libgomp.fortran/target-nowait-array-section.f90: Fix typo

Fix typo as requested in the review approval.

libgomp/ChangeLog:

* testsuite/libgomp.fortran/target-nowait-array-section.f90: New test.

2 years agoOpenMP/Fortran: Use firstprivat not alloc for ptr attach for arrays
Tobias Burnus [Fri, 13 May 2022 18:00:34 +0000 (20:00 +0200)]
OpenMP/Fortran: Use firstprivat not alloc for ptr attach for arrays

For a non-descriptor array,  map(A(n:m)) was mapped as
  map(tofrom:A[n-1] [len: ...]) map(alloc:A [pointer assign, bias: ...])
with this patch, it is changed to
  map(tofrom:A[n-1] [len: ...]) map(firstprivate:A [pointer assign, bias: ...])

The latter avoids an alloc - and also avoids the race condition with
nowait in the enclosed testcase. (Note: predantically, the testcase is
invalid since OpenMP 5.1, violating the map clause restriction at [354:10-13].

gcc/fortran/ChangeLog:

* trans-openmp.cc (gfc_trans_omp_clauses): When mapping nondescriptor
array sections, use GOMP_MAP_FIRSTPRIVATE_POINTER instead of
GOMP_MAP_POINTER for the pointer attachment.

libgomp/ChangeLog:

* testsuite/libgomp.fortran/target-nowait-array-section.f90: New test.

2 years ago[AArch64] add barriers to ool __sync builtins
Sebastian Pop [Mon, 18 Apr 2022 15:13:20 +0000 (15:13 +0000)]
[AArch64] add barriers to ool __sync builtins

2022-05-13  Sebastian Pop  <spop@amazon.com>

gcc/
PR target/105162
* config/aarch64/aarch64-protos.h (atomic_ool_names): Increase dimension
of str array.
* config/aarch64/aarch64.cc (aarch64_atomic_ool_func): Call
memmodel_from_int and handle MEMMODEL_SYNC_*.
(DEF0): Add __aarch64_*_sync functions.

gcc/testsuite/
PR target/105162
* gcc.target/aarch64/sync-comp-swap-ool.c: New.
* gcc.target/aarch64/sync-op-acquire-ool.c: New.
* gcc.target/aarch64/sync-op-full-ool.c: New.
* gcc.target/aarch64/target_attr_20.c: Update check.
* gcc.target/aarch64/target_attr_21.c: Same.

libgcc/
PR target/105162
* config/aarch64/lse.S: Define BARRIER and handle memory MODEL 5.
* config/aarch64/t-lse: Add a 5th memory model for _sync functions.

2 years agotestsuite: btf: Fix btf-datasec-1.c for RISC-V
Palmer Dabbelt [Wed, 4 May 2022 00:27:15 +0000 (17:27 -0700)]
testsuite: btf: Fix btf-datasec-1.c for RISC-V

Similar to 37e65643d3e ("testsuite/101269: fix testcase when used with
-m32"), RISC-V needs to be told not to put symbols in the
sdata/srodata/sbss sections.

gcc/testsuite/ChangeLog

* gcc.dg/debug/btf/btf-datasec-1.c: Don't use small data on RISC-V.

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.