Commit Graph

193374 Commits

Author SHA1 Message Date
Eric Botcazou
b90e43dbbb [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.
2022-05-16 08:42:06 +00:00
Piotr Trojanek
7e0c853c6f [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.
2022-05-16 08:42:06 +00:00
Piotr Trojanek
20652c7f22 [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.
2022-05-16 08:42:06 +00:00
Justin Squirek
b32b51902c [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.
2022-05-16 08:42:06 +00:00
Etienne Servais
26bbf0e5da [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.
2022-05-16 08:42:06 +00:00
Yannick Moy
c1e007985f [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.
2022-05-16 08:42:05 +00:00
Ghjuvan Lacambre
9eb55045f8 [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.
2022-05-16 08:42:05 +00:00
Joel Brobecker
f29e9e8896 [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.
2022-05-16 08:42:05 +00:00
Joel Brobecker
1bdf9fa390 [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.
2022-05-16 08:42:05 +00:00
Joel Brobecker
839e7f16ab [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.
2022-05-16 08:42:05 +00:00
Joel Brobecker
9abb17d9fa [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.
2022-05-16 08:42:05 +00:00
Joel Brobecker
dec636b831 [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.
2022-05-16 08:42:05 +00:00
Gary Dismukes
21f8b41051 [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.
2022-05-16 08:42:04 +00:00
Etienne Servais
ae745a0de3 [Ada] Handle case-expression inside if-expression in -gnato2
gcc/ada/

	* checks.adb (Apply_Arithmetic_Overflow_Minimized_Eliminated):
	Fix condition to return.
2022-05-16 08:42:04 +00:00
Yannick Moy
7d8e3f5298 [Ada] Update comment justifying non-inlining for proof inside generics
gcc/ada/

	* inline.adb (Can_Be_Inlined_In_GNATprove_Mode): Update comment.
2022-05-16 08:42:04 +00:00
Marc Poulhiès
aacbf3761c [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.
2022-05-16 08:42:04 +00:00
Eric Botcazou
e4acb82e97 [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.
2022-05-16 08:42:04 +00:00
Javier Miranda
e6bdaa0299 [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.
2022-05-16 08:42:04 +00:00
Eric Botcazou
146ea83af9 [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.
2022-05-16 08:42:03 +00:00
Eric Botcazou
861b78a946 [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.
2022-05-16 08:42:03 +00:00
Steve Baird
7c88e46a27 [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.
2022-05-16 08:42:03 +00:00
Eric Botcazou
909ce3528c [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.
2022-05-16 08:42:03 +00:00
Piotr Trojanek
9a39b25f6f [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.
2022-05-16 08:42:03 +00:00
Piotr Trojanek
90fadb50df [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.
2022-05-16 08:42:03 +00:00
Olivier Hainque
d12b8e951c [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.
2022-05-16 08:42:02 +00:00
Eric Botcazou
2878027c64 [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.
2022-05-16 08:42:02 +00:00
Eric Botcazou
82ca7489e7 [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.
2022-05-16 08:42:02 +00:00
Piotr Trojanek
4e8b88f36c [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.
2022-05-16 08:42:02 +00:00
Piotr Trojanek
457fb3369a [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.
2022-05-16 08:42:02 +00:00
Piotr Trojanek
07ee67a44d [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.
2022-05-16 08:42:02 +00:00
Martin Liska
ca32b29ec3 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.
2022-05-16 10:38:46 +02:00
Marcel Vollweiler
b4fb9f4f9a 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.
2022-05-16 01:02:50 -07:00
Martin Liska
ec69db6be6 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.
2022-05-16 09:53:33 +02:00
Richard Biener
9a53101caa 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.
2022-05-16 08:23:39 +02:00
liuhongt
69c4b5c519 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.
2022-05-16 08:30:34 +08:00
GCC Administrator
ac6a32f663 Daily bump. 2022-05-16 00:16:23 +00:00
Uros Bizjak
18547874ee 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.
2022-05-15 22:07:46 +02:00
Jason Merrill
4df735e01e 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.
2022-05-15 12:43:30 -04:00
Jason Merrill
87e1f023aa 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.
2022-05-15 12:41:14 -04:00
Jason Merrill
ce46d60413 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.
2022-05-15 05:45:06 -04:00
GCC Administrator
c5397682af Daily bump. 2022-05-15 00:16:17 +00:00
GCC Administrator
9df4ffe493 Daily bump. 2022-05-14 00:17:19 +00:00
Marek Polacek
62ecd2b8d4 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.
2022-05-13 19:45:49 -04:00
Ian Lance Taylor
dd7813f05d 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
2022-05-13 15:21:12 -07:00
Roger Sayle
d75d4293dc 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.
2022-05-13 22:30:47 +01:00
Paul A. Clarke
14e678a2c4 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.
2022-05-13 16:22:29 -05:00
Paul A. Clarke
eccbd7fcee 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.
2022-05-13 16:22:29 -05:00
Roger Sayle
1fe04c497d 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.
2022-05-13 22:20:16 +01:00
Philipp Tomsich
16f7fcadac 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>
2022-05-13 22:21:43 +02:00
Jonathan Wakely
7f40ac326a libstdc++: Make std:🧵:_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.
2022-05-13 20:40:05 +01:00