platform/upstream/gcc.git
2 years ago[Ada] Remove obsolete a-assert
Marc Poulhiès [Tue, 23 Nov 2021 09:53:06 +0000 (10:53 +0100)]
[Ada] Remove obsolete a-assert

gcc/ada/

* gcc-interface/a-assert.ads, gcc-interface/a-assert.adb: Remove.

2 years ago[Ada] Do not back-annotate maximum size for limited types
Eric Botcazou [Thu, 18 Nov 2021 21:47:05 +0000 (22:47 +0100)]
[Ada] Do not back-annotate maximum size for limited types

gcc/ada/

* gcc-interface/decl.c (gnat_to_gnu_entity): Do not back-annotate a
maximum size for the Esize of limited record and concurrent types.

2 years ago[Ada] Fix packing for array component with discriminated part
Eric Botcazou [Tue, 16 Nov 2021 23:09:56 +0000 (00:09 +0100)]
[Ada] Fix packing for array component with discriminated part

gcc/ada/

* gcc-interface/gigi.h (aggregate_type_contains_array_p): Delete.
(type_has_variable_size): Declare.
* gcc-interface/decl.c (adjust_packed): Return 0 only if the field
type is an array with variable size.
* gcc-interface/utils.c (aggregate_type_contains_array_p): Make
static and remove SELF_REFERENTIAL parameter.
(type_has_variable_size): Make public.
(create_field_decl): Adjust call to aggregate_type_contains_array_p.

2 years ago[Ada] Invalid memory access on finalization of class-wide type
Justin Squirek [Mon, 15 Nov 2021 22:14:39 +0000 (22:14 +0000)]
[Ada] Invalid memory access on finalization of class-wide type

gcc/ada/

* gcc-interface/decl.c (gnat_to_gnu_entity): Skip normal
processing for Itypes that are E_Class_Wide_Subtype with
Equivalent_Type set.

2 years ago[Ada] Fix oversight in minor cleanup
Eric Botcazou [Tue, 9 Nov 2021 18:56:34 +0000 (19:56 +0100)]
[Ada] Fix oversight in minor cleanup

gcc/ada/

* gcc-interface/trans.c (Call_to_gnu): Rename GNAT_NAME variable
into GNAT_SUBPROG to avoid later shadowing.

2 years ago[Ada] Proof of System.Arith_32 for double arithmetic on 32bits
Yannick Moy [Thu, 25 Nov 2021 14:35:39 +0000 (15:35 +0100)]
[Ada] Proof of System.Arith_32 for double arithmetic on 32bits

gcc/ada/

* libgnat/s-arit32.adb: Add ghost instances and lemmas.
(Scaled_Divide32): Add ghost code to prove. Minor code
modification to return early in error when divisor is zero.
* libgnat/s-arit32.ads: Add ghost instances and utilities.
(Scaled_Divide32): Add contract.

2 years ago[Ada] Reset internal flags for -gnatD and -gnatG
Eric Botcazou [Sun, 28 Nov 2021 16:26:27 +0000 (17:26 +0100)]
[Ada] Reset internal flags for -gnatD and -gnatG

gcc/ada/

* sprint.adb (Source_Dump): Set both Print_Generated_Code and
Debug_Generated_Code to False at the end.

2 years ago[Ada] Fix obsolete array aggregate warning being triggered by expanded code
Marc Poulhiès [Fri, 26 Nov 2021 09:49:51 +0000 (10:49 +0100)]
[Ada] Fix obsolete array aggregate warning being triggered by expanded code

gcc/ada/

* sem_aggr.adb (Resolve_Array_Aggregate): Filter out nodes not
coming from source before emitting the warning.

2 years ago[Ada] Amend proof of System.Arith_Double to remove justifications
Yannick Moy [Fri, 26 Nov 2021 07:55:13 +0000 (08:55 +0100)]
[Ada] Amend proof of System.Arith_Double to remove justifications

gcc/ada/

* libgnat/s-aridou.adb (Log_Single_Size, Big_0): New ghost
constants.
(Lemma_Mult_Non_Negative, Lemma_Mult_Non_Positive,
Lemma_Not_In_Range_Big2xx64): New lemmas on big integers.
(Double_Divide): Remove justifications. Amend for that local
lemma Prove_Overflow_Case.
(Scaled_Divide): Remove justifications. Insert for that local
lemmas Prove_Negative_Dividend, Prove_Positive_Dividend and
Prove_Q_Too_Big, and amend local lemma Prove_Overflow.  To prove
the loop invariant on (Shift mod 2 = 0), introduce local ghost
variable Iter to count loop iterations, and relate its value to
the value of Shift through Log_Single_Size, with the help of
local lemma Prove_Power. Deal with proof regression by adding
new local lemma Prove_First_Iteration and local ghost variable
D123.
* libgnat/s-arit64.ads (Multiply_With_Ovflo_Check64): Remove
unnecessary Pure_Function on function as package is Pure.

2 years ago[Ada] Add pragma Annotate for CodePeer analysis
Yannick Moy [Fri, 26 Nov 2021 08:32:09 +0000 (09:32 +0100)]
[Ada] Add pragma Annotate for CodePeer analysis

gcc/ada/

* libgnat/s-widthi.adb: Add pragma Annotate.

2 years ago[Ada] Proof of support units for 'Width on signed integers
Yannick Moy [Wed, 24 Nov 2021 16:20:59 +0000 (17:20 +0100)]
[Ada] Proof of support units for 'Width on signed integers

gcc/ada/

* libgnat/s-widint.ads: Mark in SPARK.
* libgnat/s-widlli.ads: Likewise.
* libgnat/s-widllli.ads: Likewise.
* libgnat/s-widlllu.ads: Likewise.
* libgnat/s-widllu.ads: Disable ghost/contract.
* libgnat/s-widthi.adb: Replicate and adapt the proof from
s-widthu.adb.
* libgnat/s-widthi.ads: Add minimal postcondition.
* libgnat/s-widthu.adb: Fix comments in the modular case.
* libgnat/s-widthu.ads: Add minimal postcondition.
* libgnat/s-widuns.ads: Disable ghost/contract.

2 years ago[Ada] Cleanup detection of suspension objects
Piotr Trojanek [Thu, 25 Nov 2021 12:02:00 +0000 (13:02 +0100)]
[Ada] Cleanup detection of suspension objects

gcc/ada/

* rtsfind.ads (RE_Id, RE_Unit_Table): Add RE_Suspension_Object.
* sem_util.adb (Is_Descendant_Of_Suspension_Object): Use Is_RTE.
(Is_Suspension_Object): Remove body.
* sem_util.ads (Is_Suspension_Object): Remove spec.
* snames.ads-tmpl (Name_Suspension_Object): Remove, now
unreferenced.

2 years ago[Ada] Cleanup insertion of single freezing actions
Piotr Trojanek [Thu, 25 Nov 2021 13:54:17 +0000 (14:54 +0100)]
[Ada] Cleanup insertion of single freezing actions

gcc/ada/

* exp_util.adb (Append_Freeze_Action): Tune whitespace to make
the code look similar to Append_Freeze_Actions, which takes a
List_Id.
* sem_ch6.adb (Analyze_Return_Type): Cleanup with
Append_Freeze_Action.
* exp_ch3.adb (Build_Access_Subprogram_Wrapper_Body): Likewise.
* sem_ch3.adb (Build_Access_Subprogram_Wrapper): Likewise.
* contracts.adb (Add_Indirect_Call_Wrapper): Remove extra call
to Ensure_Freeze_Node.
(Add_Call_Helper): Likewise.
* freeze.adb (Check_Inherited_Conditions): Likewise.
(Attribute_Renaming): Likewise.
* sem_ch8.adb: Likewise.

2 years ago[Ada] Cleanups related to expansion of dispatching primitives
Piotr Trojanek [Wed, 24 Nov 2021 21:06:01 +0000 (22:06 +0100)]
[Ada] Cleanups related to expansion of dispatching primitives

gcc/ada/

* doc/gnat_rm/standard_and_implementation_defined_restrictions.rst
(No_Dispatching_Calls): Fix whitespace in example code.
* gnat_rm.texi: Regenerate.
* exp_ch13.adb (Expand_N_Freeze_Entity): Replace low-level
membership test with a high-level wrapper.
* exp_ch3.adb (Expand_Freeze_Record_Type): Remove unnecessary
initialization of list of wrapper declarations and unnecessary
guard for list of their bodies (if no bodies are created then
Append_Freeze_Actions is a no-op).

2 years ago[Ada] Use bracket aggregates in Ada2022
Marc Poulhiès [Fri, 5 Nov 2021 09:24:27 +0000 (10:24 +0100)]
[Ada] Use bracket aggregates in Ada2022

gcc/ada/

* exp_imgv.adb (Append_Table_To): Add new parameter to
Make_Aggregate call.
* gen_il-fields.ads (Opt_Field_Enum):
Add Is_Parenthesis_Aggregate and Is_Enum_Array_Aggregate.
* gen_il-gen-gen_nodes.adb (Union): Add Is_Enum_Array_Aggregate
and Is_Parenthesis_Aggregate field to N_Aggregate.
* libgnarl/s-interr.adb (User_Handler, User_Entry, Blocked)
(Ignored, Last_Unblocker, Server_ID): Likewise.
* libgnarl/s-intman.ads (Keep_Unmasked, Reserve): Likewise.
* libgnarl/s-intman__posix.adb (Exception_Interrupts)
(Initialize): Likewise.
* libgnarl/s-mudido__affinity.adb (Create): Likewise.
* libgnarl/s-osinte__linux.ads (Unmasked, Reserved): Likewise.
* libgnarl/s-taprop__linux.adb (Create_Task, Set_Task_Affinity)
* libgnarl/s-tasdeb.adb (Trace_On): Likewise.
* libgnarl/s-tasdeb.ads (Known_Tasks): Likewise.
* libgnarl/s-tasinf__linux.ads (Any_CPU, No_CPU): Likewise.
* libgnarl/s-taskin.adb (Initialize_ATCB): Likewise.
* libgnarl/s-taskin.ads (Ada_Task_Control_Block): Likewise.
* libgnarl/s-tasren.adb (Default_Treatment)
(New_State): Likewise.
* libgnarl/s-tassta.adb (Trace_Unhandled_Exception_In_Task):
Likewise.
* libgnarl/s-tataat.adb (Index_Array): Likewise.
* libgnarl/s-tpobop.adb (New_State): Likewise.
* libgnat/a-calend.adb (Cumulative_Days_Before_Month)
(Leap_Second_Times): Likewise.
* libgnat/a-calend.ads (Days_In_Month): Likewise.
* libgnat/a-cfinve.adb (Insert): Likewise.
* libgnat/a-chahan.adb (Char_Map): Likewise.
* libgnat/a-chtgbo.adb (Clear): Likewise.
* libgnat/a-cobove.adb ("&", Insert, To_Vector): Likewise.
* libgnat/a-cofove.adb (Insert, To_Vector): Likewise.
* libgnat/a-cohata.ads (Hash_Table_Type): Likewise.
* libgnat/a-coinve.adb (Merge, Insert, Insert_Space): Likewise.
* libgnat/a-convec.adb (Insert, To_Vector): Likewise.
* libgnat/a-coprnu.ads (Primes): Likewise.
* libgnat/a-direct.adb (Empty_String): Use regular "" instead
of aggregate.
(Start_Search_Internal, Name_Case_Equivalence, Search)
(Start_Search, Start_Search_Internal): Use bracket for
aggregate.
* libgnat/a-direct.ads (Start_Search,Search): Likewise.
* libgnat/a-direio.adb (Zeroes): Likewise.
* libgnat/a-nbnbre.adb (Leading_Padding, Trailing_Padding)
(Numerator_Image): Likewise.
* libgnat/a-ngrear.adb (Jacobi): Likewise.
* libgnat/a-stbubo.adb (Get_UTF_8): Likewise.
* libgnat/a-stbufo.adb (Put): Likewise.
* libgnat/a-stbuun.adb (Get_UTF_8): Likewise.
* libgnat/a-stbuut.adb (Put_7bit, Put_Character)
(Put_Wide_Character, Put_Wide_Wide_Character): Likewise.
* libgnat/a-stmaco.ads (Control_Set,Graphic_Set,Letter_Set)
(Lower_Set, Upper_Set, Basic_Set, Decimal_Digit_Set)
(Hexadecimal_Digit_Set, Alphanumeric_Set, Special_Set)
(ISO_646_Set): Likewise.
* libgnat/a-strbou.ads (Insert, Tail, "*", Replicate)
(Null_Bounded_String): Likewise.
* libgnat/a-strfix.ads (Head, Tail): Likewise.
* libgnat/a-strmap.adb (To_Domain, Lemma_Is_Sorted): Likewise.
* libgnat/a-strmap.ads (Null_Set): Likewise.
* libgnat/a-strsup.adb (Super_Head, Super_Replicate)
(Super_Tail): Likewise.
* libgnat/a-strsup.ads (Super_Head, Super_Tail, Times)
(Super_Replicate): Likewise.
* libgnat/a-sttebu.adb (Put_UTF8, Wide_Put_UTF_16): Likewise.
* libgnat/a-stuten.ads (BOM_16): Likewise.
* libgnat/a-stwibo.ads (Null_Bounded_Wide_String): Likewise.
* libgnat/a-stwima.ads (Null_Range): Likewise.
* libgnat/a-stwisu.adb (Super_Head, Super_Replicate)
(Super_Tail): Likewise.
* libgnat/a-stzbou.ads
(Null_Bounded_Wide_Wide_String): Likewise.
* libgnat/a-stzmap.ads (Null_Range): Likewise.
* libgnat/a-stzsup.adb (Super_Head, Super_Replicate)
(Super_Tail, Super_Trim): Likewise.
* libgnat/a-swmwco.ads (Control_Ranges, Graphic_Ranges)
(Letter_Ranges, Lower_Ranges, Upeer_Ranges, Basic_Ranges)
(Decimal_Digit_Ranges, Hexadecimal_Digit_Ranges)
(Alphanumeric_Ranges, Special_Graphic_Ranges, ISO_646_Ranges)
(Character_Ranges, Lower_Case_Mapping, Upper_Case_Mapping)
(Basic_Mapping): Likewise.
* libgnat/a-szmzco.ads (Control_Ranges, Graphic_Ranges)
(Letter_Ranges, Lower_Ranges, Upeer_Ranges, Basic_Ranges)
(Decimal_Digit_Ranges, Hexadecimal_Digit_Ranges)
(Alphanumeric_Ranges, Special_Graphic_Ranges, ISO_646_Ranges)
(Character_Ranges, Lower_Case_Mapping, Upper_Case_Mapping)
(Basic_Mapping): Likewise.
* libgnat/a-teioed.adb (Format_Number): Likewise.
* libgnat/a-wtedit.adb (Format_Number): Likewise.
* libgnat/a-ztedit.adb (Format_Number): Likewise.
* libgnat/g-arrspl.adb (Separators): Likewise.
* libgnat/g-catiio.adb (Month_Name_To_Number): Likewise.
* libgnat/g-cgideb.adb (NL, Title): Likewise.
* libgnat/g-comlin.adb (Internal_Initialize_Option_Scan)
(Display_Section_Help): Likewise.
* libgnat/g-comlin.ads (Opt_Parser_Data): Likewise.
* libgnat/g-debpoo.adb (Set_Dead_Beef, Dump): Likewise.
* libgnat/g-expect.adb (Expect, Has_Process, Send): Likewise.
* libgnat/g-forstr.adb ("+", Get_Formatted): Likewise.
* libgnat/g-memdum.adb (Dump): Likewise.
* libgnat/g-rannum.adb (Image): Likewise.
* libgnat/g-sechas.adb (Final, HMAC_Initial_Context): Likewise.
* libgnat/g-sehamd.ads (Initial_State): Likewise.
* libgnat/g-sehash.ads (Initial_State): Likewise.
* libgnat/g-sercom.ads (Data_Rate_Value): Likewise.
* libgnat/g-sercom__linux.adb (C_Data_Rate, C_Bits, C_Stop_Bits)
(C_Parity): Likewise.
* libgnat/g-shsh32.ads (K, Transform): Likewise.
* libgnat/g-shsh64.ads (K, Transform): Likewise.
* libgnat/g-socket.adb (Levels, Modes, Shutmodes, Requests)
(Options, Flags, Get_Name_Info, Image): Likewise.
* libgnat/g-socket.ads (Inet_Addr_Bytes_Length, Inet_Addr_Type)
(IPv4_To_IPv6_Prefix, Any_Inet_Addr, Any_Inet6_Addr)
(No_Inet_Addr, Broadcast_Inet_Addr, Loopback_Inet_Addr)
(Loopback_Inet6_Addr, Unspecified_Group_Inet_Addr)
(All_Hosts_Group_Inet_Addr, All_Routers_Group_Inet_Addr)
(Unspecified_Group_Inet6_Addr, All_Hosts_Group_Inet6_Addr)
(All_Routers_Group_Inet6_Addr): Likewise.
* libgnat/g-socpol.adb (To_C, Status, Get_Events): Likewise.
* libgnat/g-socpol.ads (Input_Event, Output_Event, Both_Event)
(Error_Event): Likewise.
* libgnat/g-sothco.ads (Families, Lengths, Sockaddr): Likewise.
* libgnat/g-spipat.adb (OK_For_Simple_Arbno): Likewise.
* libgnat/i-cobol.ads (Ada_To_COBOL, COBOL_To_Ada): Likewise.
* libgnat/i-pacdec.adb (Packed_Byte): Likewise.
* libgnat/i-pacdec.ads (Packed_Size): Likewise.
* libgnat/s-bitops.adb (Masks): Likewise.
* libgnat/s-crc32.adb (Table): Likewise.
* libgnat/s-gearop.adb (Unit_Matrix, Unit_Vector): Likewise.
* libgnat/s-genbig.adb (Out_data, Zero_Data, Big_Exp, Big_Mul)
(To_Bignum, To_String, Image, Leading_Padding): Likewise.
* libgnat/s-htable.adb (Reset): Likewise.
* libgnat/s-imgcha.adb (C0, C1): Likewise.
* libgnat/s-powflt.ads (Powten): Likewise.
* libgnat/s-powlfl.ads (Powten): Likewise.
* libgnat/s-powllf.ads (Powten): Likewise.
* libgnat/s-rannum.adb (Matrix_A, Random_Float_Template, Image):
Likewise.
* libgnat/s-rannum.ads (Generator): Likewise.
* libgnat/s-regexp.adb (Compile,Create_Primary_Table)
(Create_Primary_Table_Glob, Create_Secondary_Table, Compile):
Likewise.
* libgnat/s-regpat.adb (Bit_Conversion, Set, Dump_Until)
(Dump_Current, Dump_Error, Try, Reset_Class): Likewise.
* libgnat/s-regpat.ads (Pattern_Matcher, Never_Match): Likewise.
* libgnat/s-scaval__128.adb (Initialize): Likewise.
* libgnat/s-statxd.adb (Fields, W_F, W_LF)
(W_LLF, W_SF): Likewise.
* libgnat/s-stausa.adb (Initialize, Initialize_Analyzer)
(Output_Results): Likewise.
* libgnat/s-strops.adb (Str_Concat_SC): Likewise.
* libgnat/s-valrea.adb (Maxexp32, Maxexp64, Maxexp80): Likewise.
* libgnat/s-wchcon.ads (WC_Encoding_Letters)
(WC_Longest_Sequences): Likewise.
* par-ch4.adb (P_Aggregate_Or_Paren_Expr): Set
Is_Parenthesis_Aggregate when creating a N_Aggregate using
parenthesis.
* scng.adb (Scan): Lower version needed for bracket syntax from
Extensions to Ada2022.
* sem_aggr.adb (Resolve_Aggregate): Raise error for container
aggregate using parenthesis instead of bracket.
(Resolve_Array_Aggregate): Raise warning for aggregate using
parenthesis in Ada2022 with obsolescent warning enabled and not
in GNAT mode.
* sem_util.ads (Check_Ambiguous_Aggregate): Typo fix in comment.

2 years ago[Ada] Inline all calls in Ada.Task_Identification
Piotr Trojanek [Wed, 17 Nov 2021 13:31:20 +0000 (14:31 +0100)]
[Ada] Inline all calls in Ada.Task_Identification

gcc/ada/

* libgnarl/a-taside.ads (Activation_Is_Complete): Add pragma
Inline.

2 years ago[Ada] Enhance freezing code for instantiations
Eric Botcazou [Wed, 17 Nov 2021 13:19:45 +0000 (14:19 +0100)]
[Ada] Enhance freezing code for instantiations

gcc/ada/

* sem_ch12.adb (Freeze_Package_Instance): Consistently consider
the freeze node of the parent and use large inequality for
Slocs.
(Freeze_Subprogram_Instance): Likewise.
(Insert_Freeze_Node_For_Instance): For an instance in a package
spec with no source body that immediately follows, consider the
body of the package for the placement of the freeze node and go
to the outer level if there is no such body.

2 years ago[Ada] Enable expansion of dispatching equality for GNATprove
Piotr Trojanek [Mon, 22 Nov 2021 18:01:33 +0000 (19:01 +0100)]
[Ada] Enable expansion of dispatching equality for GNATprove

gcc/ada/

* exp_ch13.ads (Expand_N_Freeze_Entity): Add note about a SPARK
twin.
* exp_ch3.ads (Freeze_Type): Likewise.
* exp_spark.adb (Expand_SPARK_N_Freeze_Entity): Mimic what is
done in Freeze_Entity.
(SPARK_Freeze_Type): Mimic what is done in Freeze_Type; add call
to Make_Predefined_Primitive_Eq_Spec.

2 years ago[Ada] Separate building of equality from other dispatching routines
Piotr Trojanek [Mon, 22 Nov 2021 16:58:06 +0000 (17:58 +0100)]
[Ada] Separate building of equality from other dispatching routines

gcc/ada/

* exp_ch3.adb (Make_Predefined_Primitive_Specs): Move code for
spec of dispatching equality.
(Predefined_Primitive_Bodies): Move code for body if dispatching
equality.
(Make_Predefined_Primitive_Eq_Spec): Separated code for spec of
dispatching equality.
(Predefined_Primitive_Eq_Body): Separated code for body of
dispatching equality.
* exp_ch3.ads: Update.

2 years ago[Ada] Split spec and body of expression function with Subprogram_Variant
Piotr Trojanek [Mon, 22 Nov 2021 20:12:41 +0000 (21:12 +0100)]
[Ada] Split spec and body of expression function with Subprogram_Variant

gcc/ada/

* libgnat/s-valuti.ads (Scan_Natural_Ghost): Split body from
spec and put it into private part, so that GNATprove can pick it
both when analysing the unit and its clients.

2 years ago[Ada] Remove extra space after assignment symbol
Piotr Trojanek [Tue, 23 Nov 2021 11:22:27 +0000 (12:22 +0100)]
[Ada] Remove extra space after assignment symbol

gcc/ada/

* exp_aggr.adb, exp_ch6.adb, par-ch4.adb, sem_ch13.adb: Remove
extra space after ":=" symbol.
* gen_il-gen.adb: Likewise; add missing headerbox.

2 years ago[Ada] Don't allow entry in implicit with chain to be ghost
Richard Kenner [Mon, 22 Nov 2021 22:38:50 +0000 (17:38 -0500)]
[Ada] Don't allow entry in implicit with chain to be ghost

gcc/ada/

* rtsfind.adb (Maybe_Add_With): Ensure that the added "with" is
never marked as ignored ghost code.

2 years ago[Ada] Simplify iteration over record components
Piotr Trojanek [Mon, 22 Nov 2021 11:53:15 +0000 (12:53 +0100)]
[Ada] Simplify iteration over record components

gcc/ada/

* freeze.adb (Freeze_Entity): Replace First_Entity/Next_Entity
with First_Component/Next_Component; remove condition with Ekind
equal to E_Component.
* sem_ch13.adb (Check_Record_Representation_Clause): Likewise
for component-or-discriminant.
* sem_util.adb (Is_Fully_Initialized_Type): Likewise; rename Ent
to a more specific Comp.
* sem_warn.adb (Check_References): Likewise.

2 years ago[Ada] Refactor nested loops in warning on unassigned out parameter
Piotr Trojanek [Mon, 22 Nov 2021 11:15:29 +0000 (12:15 +0100)]
[Ada] Refactor nested loops in warning on unassigned out parameter

gcc/ada/

* sem_warn.adb (Warn_On_Unassigned_Out_Parameter): Move inner
loop at the beginning of subprogram, so it is executed only
once; fix order in the "add an ad hoc" phrase.

2 years ago[Ada] Remove duplicated condition in warnings about read-before-write
Piotr Trojanek [Mon, 22 Nov 2021 11:11:46 +0000 (12:11 +0100)]
[Ada] Remove duplicated condition in warnings about read-before-write

gcc/ada/

* sem_warn.adb (Check_References): Remove redundant condition.

2 years ago[Ada] vx7r2cert/light-tasking-rtp: undefined refs on ppc/ppc64
Doug Rupp [Thu, 18 Nov 2021 20:44:22 +0000 (12:44 -0800)]
[Ada] vx7r2cert/light-tasking-rtp: undefined refs on ppc/ppc64

gcc/ada/

* vxworks7-cert-rtp-link__ppcXX.spec: New file.
* Makefile.rtl: Use it.

2 years ago[Ada] Proof of Interfaces.C with SPARK
Yannick Moy [Mon, 15 Nov 2021 20:36:34 +0000 (21:36 +0100)]
[Ada] Proof of Interfaces.C with SPARK

gcc/ada/

* libgnat/i-c.adb: Add ghost code.
(C_Length_Ghost): New ghost functions to query the C length of a
string.
(To_Ada): Insert constant Count_Cst where needed to comply with
SPARK.  Homogeneize code between variants for char, wchar_t,
char16_t and char32_t. Use char16_nul and char32_nul
systematically instead of their value. Fix the type of index To
to be Integer instead of Positive, to avoid a possible range
check failure on an empty Target. Insert an exit statement to
avoid a possible overflow failure when the last index in Target
is Natural'Last (possibly on a small string as well).
* libgnat/i-c.ads: Add contracts.
(C_Length_Ghost): New ghost functions to query the C length of a
string.
* libgnat/s-os_lib.adb: Remove pragma Compiler_Unit_Warning
causing a spurious error during compilation of GNAT, as this
pragma is not needed anymore now that we bootstrap (stage1) with
the base compiler runtime.

2 years ago[Ada] Add contract to Ada.Task_Identification.Activation_Is_Complete
Piotr Trojanek [Wed, 17 Nov 2021 13:24:25 +0000 (14:24 +0100)]
[Ada] Add contract to Ada.Task_Identification.Activation_Is_Complete

gcc/ada/

* libgnarl/a-taside.ads (Activation_Is_Complete): Add
precondition.

2 years ago[Ada] More intuitive names in sanity-checking of derived types
Piotr Trojanek [Sun, 21 Nov 2021 19:26:32 +0000 (20:26 +0100)]
[Ada] More intuitive names in sanity-checking of derived types

gcc/ada/

* sem_ch3.adb (Check_Derived_Type): Rename local variables; fix
style in comment.

2 years ago[Ada] Proof of System.Val_Util utilities for 'Value support
Yannick Moy [Fri, 19 Nov 2021 09:34:21 +0000 (10:34 +0100)]
[Ada] Proof of System.Val_Util utilities for 'Value support

gcc/ada/

* libgnat/s-valboo.adb (First_Non_Space_Ghost): Move to
utilities.
(Value_Boolean): Prefix call to First_Non_Space_Ghost.
* libgnat/s-valboo.ads (First_Non_Space_Ghost): Move to
utilities.
(Is_Boolean_Image_Ghost, Value_Boolean): Prefix call to
First_Non_Space_Ghost.
* libgnat/s-valuer.adb (Scan_Raw_Real): Adapt to change of
function Scan_Exponent to procedure.
* libgnat/s-valueu.adb (Scan_Raw_Unsigned): Adapt to change of
function Scan_Exponent to procedure.
* libgnat/s-valuti.adb (First_Non_Space_Ghost): Function moved
here.
(Last_Number_Ghost): New ghost query function.
(Scan_Exponent): Change function with side-effects into
procedure, to mark in SPARK. Prove procedure wrt contract.
Change type of local P to avoid possible range check failure (it
is not known whether this can be activated by callers).
(Scan_Plus_Sign, Scan_Sign): Change type of local P to avoid
possible range check failure. Add loop invariants and assertions
for proof.
(Scan_Trailing_Blanks): Add loop invariant.
(Scan_Underscore): Remove SPARK_Mode Off.
* libgnat/s-valuti.ads (First_Non_Space_Ghost): Function moved
here.
(Last_Number_Ghost, Only_Number_Ghost, Is_Natural_Format_Ghost,
Scan_Natural_Ghost): New ghost query functions.
(Scan_Plus_Sign, Scan_Sign, Scan_Exponent, Scan_Trailing_Blanks,
Scan_Underscore): Add functional contracts.

2 years ago[Ada] Proof of Boolean'Image and Boolean'Value
Yannick Moy [Thu, 18 Nov 2021 08:10:02 +0000 (09:10 +0100)]
[Ada] Proof of Boolean'Image and Boolean'Value

gcc/ada/

* libgnat/s-imgboo.adb: Mark in SPARK.
* libgnat/s-imgboo.ads: Mark in SPARK. Change from Pure to
Preelaborate unit in order to be able to depend on
System.Val_Bool.
(Image_Boolean): Functionally specify the result of the
procedure by calling System.Val_Bool.Value_Boolean on the
result.
* libgnat/s-valboo.adb: Mark in SPARK.
(First_Non_Space_Ghost): New ghost function.
(Value_Boolean): Change type of L and F to avoid possible range
check failure on empty Str.
* libgnat/s-valboo.ads: Mark in SPARK. Duplicate with-clause
from body in the spec to be able to call
System.Val_Util.Only_Space_Ghost in the contract.
(First_Non_Space_Ghost): New ghost function computing the first
non-space character in a string.
(Is_Boolean_Image_Ghost): New ghost function computing whether a
string is the image of a boolean value.
(Value_Boolean): Add in precondition the conditions to avoid
raising Constraint_Error. This precondition is never executed,
and only used in proof, thanks to the use of pragma
Assertion_Policy. Given that precondition, the postcondition can
simply check the first non-space character to decide whether
True or False is read.
* libgnat/s-valuti.adb: Mark in SPARK, but use SPARK_Mode Off on
all subprograms not yet proved.
(Bad_Value): Annotate expected exception.
(Normalize_String): Rewrite to avoid possible overflow when
incrementing F in the first loop. Add loop invariants.
* libgnat/s-valuti.ads: Mark in SPARK.
(Bad_Value): Add Depends contract to avoid warning on unused S.
(Only_Space_Ghost): New ghost function to query if string has
only space in the specified range.
(Normalize_String): Add functional contract.
(Scan_Exponent): Mark spec as not in SPARK as this function has
side-effects.

2 years ago[Ada] Fix possible memory corruption for hostnames longer than 1024 bytes
Pascal Obry [Wed, 17 Nov 2021 16:20:32 +0000 (17:20 +0100)]
[Ada] Fix possible memory corruption for hostnames longer than 1024 bytes

gcc/ada/

* libgnat/g-socket.ads (Max_Name_Length): Initialize with
NI_MAXHOST.

2 years ago[Ada] Minor style fix (no dot on single line comment)
Pascal Obry [Wed, 17 Nov 2021 16:20:11 +0000 (17:20 +0100)]
[Ada] Minor style fix (no dot on single line comment)

gcc/ada/

* libgnat/g-socket.ads: Minor style fix.

2 years ago[PR103437] Use long long multiplication as backup for overflow processing
Vladimir N. Makarov [Thu, 2 Dec 2021 15:55:59 +0000 (10:55 -0500)]
[PR103437] Use long long multiplication as backup for overflow processing

__builtin_smul_overflow can be unavailable for some C++ compilers.
Add long long multiplication as backup for overflow processing.

gcc/ChangeLog:
PR rtl-optimization/103437
* ira-color.c (setup_allocno_priorities): Use long long
multiplication as backup for overflow processing.

2 years agolibphobos: Push all callee-save registers on the stack before GC scan on ARM
Iain Buclaw [Thu, 2 Dec 2021 00:53:51 +0000 (01:53 +0100)]
libphobos: Push all callee-save registers on the stack before GC scan on ARM

This is the library fix for PR103520 that also prevents the garbage
collector from releasing live memory.  However this requires that the
host compiler has been patched with this fix, so the GC will remain
disabled in the D front-end for now until enough time has passed for
this to have trickled down into enough releases.

libphobos/ChangeLog:

* libdruntime/core/thread/osthread.d (callWithStackShell): Push all
callee-save registers on the stack for AArch64 and ARM.

2 years agoAArch64: Optimize right shift rounding narrowing
Tamar Christina [Thu, 2 Dec 2021 14:39:22 +0000 (14:39 +0000)]
AArch64: Optimize right shift rounding narrowing

This optimizes right shift rounding narrow instructions to
rounding add narrow high where one vector is 0 when the shift amount is half
that of the original input type.

i.e.

uint32x4_t foo (uint64x2_t a, uint64x2_t b)
{
  return vrshrn_high_n_u64 (vrshrn_n_u64 (a, 32), b, 32);
}

now generates:

foo:
        movi    v3.4s, 0
        raddhn  v0.2s, v2.2d, v3.2d
        raddhn2 v0.4s, v2.2d, v3.2d

instead of:

foo:
        rshrn   v0.2s, v0.2d, 32
        rshrn2  v0.4s, v1.2d, 32
        ret

On Arm cores this is an improvement in both latency and throughput.
Because a vector zero is needed I created a new method
aarch64_gen_shareable_zero that creates zeros using V4SI and then takes a subreg
of the zero to the desired type.  This allows CSE to share all the zero
constants.

gcc/ChangeLog:

* config/aarch64/aarch64-protos.h (aarch64_gen_shareable_zero): New.
* config/aarch64/aarch64-simd.md (aarch64_rshrn<mode>,
aarch64_rshrn2<mode>): Generate rounding half-ing add when appropriate.
* config/aarch64/aarch64.c (aarch64_gen_shareable_zero): New.

gcc/testsuite/ChangeLog:

* gcc.target/aarch64/advsimd-intrinsics/shrn-1.c: New test.
* gcc.target/aarch64/advsimd-intrinsics/shrn-2.c: New test.
* gcc.target/aarch64/advsimd-intrinsics/shrn-3.c: New test.
* gcc.target/aarch64/advsimd-intrinsics/shrn-4.c: New test.

2 years ago[PR103437] Process multiplication overflow in priority calculation for allocno assign...
Vladimir N. Makarov [Thu, 2 Dec 2021 13:29:45 +0000 (08:29 -0500)]
[PR103437] Process multiplication overflow in priority calculation for allocno assignments

We process overflows in cost calculations but for huge functions
priority calculation can overflow as priority can be bigger the cost
used for it.  The patch fixes the problem.

gcc/ChangeLog:

PR rtl-optimization/103437
* ira-color.c (setup_allocno_priorities): Process multiplication
overflow.

2 years agotestsuite: make bic-bitmask-18.c test more precise [PR103479]
Tamar Christina [Thu, 2 Dec 2021 13:30:08 +0000 (13:30 +0000)]
testsuite: make bic-bitmask-18.c test more precise [PR103479]

This updates the testcase bic-bitmask-18.c to seach for " = 0;" as an expression
so it doesn't match any other partial expressions.

gcc/testsuite/ChangeLog:

PR testsuite/103479
* gcc.dg/bic-bitmask-18.c: Update regexpr to expect = 0;.

2 years agoc++: Fix bogus error with __integer_pack [PR94490]
Marek Polacek [Sat, 6 Nov 2021 22:10:39 +0000 (18:10 -0400)]
c++: Fix bogus error with __integer_pack [PR94490]

Here we issue a bogus:

error: '(0 ? fake_tuple_size_v<int> : fake_tuple_size_v<int>)' is not a constant expression

because cxx_constant_value in expand_integer_pack gets

*(0 ? VIEW_CONVERT_EXPR<const int>(fake_tuple_size_v) : VIEW_CONVERT_EXPR<const int>(fake_tuple_size_v))

which is a REFERENCE_REF_P and we evaluate its operand to 3, so we end
up with *3 and that fails.  Sounds like we need to get rid of the
REFERENCE_REF_P then.  That is what tsubst_copy_and_build/INDIRECT_REF
will do:

        if (REFERENCE_REF_P (t))
          {
            /* A type conversion to reference type will be enclosed in
               such an indirect ref, but the substitution of the cast
               will have also added such an indirect ref.  */
            r = convert_from_reference (r);
          }

so I think it's reasonable to call instantiate_non_dependent_expr_sfinae.

PR c++/94490

gcc/cp/ChangeLog:

* pt.c (expand_integer_pack): Call
instantiate_non_dependent_expr_sfinae.

gcc/testsuite/ChangeLog:

* g++.dg/ext/integer-pack5.C: New test.

2 years agoImplement -fprofile-prefix-map.
Martin Liska [Thu, 11 Nov 2021 15:42:23 +0000 (16:42 +0100)]
Implement -fprofile-prefix-map.

PR gcov-profile/96092

gcc/ChangeLog:

* common.opt: New option.
* coverage.c (coverage_begin_function): Emit filename with
remap_profile_filename.
* doc/invoke.texi: Document the new option.
* file-prefix-map.c (add_profile_prefix_map): New.
(remap_profile_filename): Likewise.
* file-prefix-map.h (add_profile_prefix_map): Likewise.
(remap_profile_filename): Likewise.
* lto-opts.c (lto_write_options): Handle
OPT_fprofile_prefix_map_.
* opts-global.c (handle_common_deferred_options): Likewise.
* opts.c (common_handle_option): Likewise.
(gen_command_line_string): Likewise.
* profile.c (output_location): Emit filename with
remap_profile_filename.

2 years agoc++: ICE with unnamed tparm and concept [PR103408]
Marek Polacek [Tue, 30 Nov 2021 21:43:19 +0000 (16:43 -0500)]
c++: ICE with unnamed tparm and concept [PR103408]

Here we crash when issuing the "constraint C has type T, not bool"
error, because pp_cxx_parameter_mapping wasn't prepared to see an
anonymous template parameter.  With this patch we print

error: constraint 'auto(<lambda>) [with <unnamed> = 0]' has type '<lambda()>', not 'bool'

The "<unnamed>" is what this patch adds.

PR c++/103408

gcc/cp/ChangeLog:

* cxx-pretty-print.c (pp_cxx_parameter_mapping): Print "<unnamed>"
rather than crash on an unnamed template parameter.

gcc/testsuite/ChangeLog:

* g++.dg/cpp23/concepts-err1.C: New test.

2 years agomiddle-end/103271 - avoid VLA init of register
Richard Biener [Thu, 2 Dec 2021 11:23:22 +0000 (12:23 +0100)]
middle-end/103271 - avoid VLA init of register

This avoids using VLA types to initalize a register with
-ftrivial-auto-var-init in some cases.

2021-12-02  Richard Biener  <rguenther@suse.de>

PR middle-end/103271
* internal-fn.c (expand_DEFERRED_INIT): When the base
of the LHS is a decl with matching constant size use
that as the initialization target instead of an
eventual VLA typed one.

2 years agotree-optimization/103527 - always use thruth type forgather mask
Richard Biener [Thu, 2 Dec 2021 11:21:19 +0000 (12:21 +0100)]
tree-optimization/103527 - always use thruth type forgather mask

This makes sure to always use a truth type to build the gather
mask argument even when the target builtin prototype in the end
wants a float vector.

2021-12-02  Richard Biener  <rguenther@suse.de>

PR tree-optimization/103527
* tree-vect-stmts.c (vect_build_gather_load_calls): Always
use a truth type for building the vector mask.

2 years agofix spelling of -linker-output-auto-nolto-rel
Rasmus Villemoes [Wed, 1 Dec 2021 10:53:45 +0000 (11:53 +0100)]
fix spelling of -linker-output-auto-nolto-rel

The transposition nolto -> notlo is confusing and it makes the long
name even harder to read than it already is - I kept reading it as
"not lo" until I realized it was a simple typo.

Fixes: 5269b24605b1 (Silence warning in LTO mode on VxWorks)

lto-plugin/
* lto-plugin.c: Fix -linker-output-auto-notlo-rel ->
-linker-output-auto-nolto-rel typo.
(process_option): Adjust accordingly, accepting both old and
new spelling.

gcc/
* config/vxworks.h (LTO_PLUGIN_SPEC): Adapt to corrected
spelling of -linker-output-auto-nolto-rel.

2 years agofortran: OpenMP/OpenACC array mapping alignment fix (PR90030)
Chung-Lin Tang [Thu, 2 Dec 2021 10:24:03 +0000 (18:24 +0800)]
fortran: OpenMP/OpenACC array mapping alignment fix (PR90030)

Fix issue with the Fortran front-end when mapping arrays: when creating the
data MEM_REF for the map clause, there was a convention of casting the
referencing pointer to 'c_char *' by
fold_convert (build_pointer_type (char_type_node), ptr).

This causes the alignment passed to the libgomp runtime for array data
hardwared to '1', and causes alignment errors on the offload target.

This patch fixes this by removing the char_type_node pointer converts, and
adding gcc_asserts to ensure POINTER_TYPE_P (TREE_TYPE (ptr)).

PR fortran/90030

gcc/fortran/ChangeLog:

* trans-openmp.c (gfc_omp_finish_clause): Remove fold_convert to pointer
to char_type_node, add gcc_assert of POINTER_TYPE_P.
(gfc_trans_omp_array_section): Likewise.
(gfc_trans_omp_clauses): Likewise.

gcc/testsuite/ChangeLog:

* gfortran.dg/goacc/finalize-1.f: Adjust scan test.
* gfortran.dg/gomp/affinity-clause-1.f90: Likewise.
* gfortran.dg/gomp/affinity-clause-5.f90: Likewise.
* gfortran.dg/gomp/defaultmap-4.f90: Likewise.
* gfortran.dg/gomp/defaultmap-5.f90: Likewise.
* gfortran.dg/gomp/defaultmap-6.f90: Likewise.
* gfortran.dg/gomp/map-3.f90: Likewise.
* gfortran.dg/gomp/pr78260-2.f90: Likewise.
* gfortran.dg/gomp/pr78260-3.f90: Likewise.

libgomp/ChangeLog:

* testsuite/libgomp.oacc-fortran/pr90030.f90: New test.
* testsuite/libgomp.fortran/pr90030.f90: New test.

2 years agolibphobos: Add missing ControlState variable for AArch64
Iain Buclaw [Thu, 2 Dec 2021 00:42:07 +0000 (01:42 +0100)]
libphobos: Add missing ControlState variable for AArch64

Fixes a typo that occurred during the splitting of the std.math module
into a package.

libphobos/ChangeLog:

* src/std/math/hardware.d (FloatingPointControl.getControlState): Add
missing ControlState variable for AArch64.

2 years agod: Disable the D runtime garbage collector after initializing (PR103520)
Iain Buclaw [Wed, 1 Dec 2021 22:56:28 +0000 (23:56 +0100)]
d: Disable the D runtime garbage collector after initializing (PR103520)

Not all targets that support building libdruntime have a stable garbage
collector, so to avoid running into problems where live memory allocated
by the D GC is freed, disable all in-flight collections until a time
when scanning is more reliably implemented everywhere.

PR d/103520

gcc/d/ChangeLog:

* d-frontend.h (gc_disable): Declare.
* d-lang.cc (d_init_options): Disable the D runtime garbage collector
after initializing.

2 years agod: Prefix object files from the root package with 'root-'
Iain Buclaw [Wed, 1 Dec 2021 22:50:01 +0000 (23:50 +0100)]
d: Prefix object files from the root package with 'root-'

None of the front-end module names in either the dmd or root package
collide just yet, but that does not mean they won't in the future.

gcc/d/ChangeLog:

* Make-lang.in (D_FRONTEND_OBJS): Prefix object files from the root
package with root-.
(d/root-%.o): New recipe.

2 years agoDaily bump.
GCC Administrator [Thu, 2 Dec 2021 00:16:33 +0000 (00:16 +0000)]
Daily bump.

2 years agoanalyzer: fix false leak seen in Juliet 1.3 [PR102471]
David Malcolm [Wed, 1 Dec 2021 19:12:33 +0000 (14:12 -0500)]
analyzer: fix false leak seen in Juliet 1.3 [PR102471]

Juliet 1.3's CWE415_Double_Free__malloc_free_*_67a.c
were showing leak false positives in non-LTO builds; fixed thusly.

gcc/analyzer/ChangeLog:
PR analyzer/102471
* region-model-reachability.cc (reachable_regions::handle_parm):
Treat all svalues within a compound parm has reachable, and those
wrapped in a cast.

gcc/testsuite/ChangeLog:
PR analyzer/102471
* gcc.dg/analyzer/leak-3.c: New test.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2 years agoi386: Improve V8HI and V8HF inserts [PR102811]
Uros Bizjak [Wed, 1 Dec 2021 22:01:09 +0000 (23:01 +0100)]
i386: Improve V8HI and V8HF inserts [PR102811]

Introduce vec_set_0 pattern for V8HI and V8HF modes to implement scalar
element 0 inserts to from a GP register, SSE register or memory.  Also
add V8HI and V8HF AVX2 (x,x,x) alternative to PINSR insn pattern, which is
split after reload to a sequence of PBROADCASTW and PBLENDW.

The V8HF inserts from memory improve from:

-       vpbroadcastw    4(%esp), %xmm1
-       vpblendw        $16, %xmm1, %xmm0, %xmm0
+       vpinsrw $4, 4(%esp), %xmm0, %xmm0

and V8HF inserts from SSE register to element 0 improve from:

        vpxor   %xmm2, %xmm2, %xmm2
-       vpbroadcastw    %xmm0, %xmm0
        vpblendw        $1, %xmm0, %xmm2, %xmm0

Based on the above improvements, the register allocator is able to determine
the optimal instruction (or instruction sequence) based on the register set
of the input value, so there is no need to manually expand V8HI and V8HF
inserts to the sequence of VEC_DUPLICATE and VEC_MERGE RTXes.

2021-12-01  Uroš Bizjak  <ubizjak@gmail.com>

gcc/ChangeLog:

PR target/102811
* config/i386/sse.md (VI2F): Remove mode iterator.
(VI2F_256_512): New mode iterator.
(vec_set<V8_128:mode>_0): New insn pattern.
(vec_set<VI2F_256_512:mode>_0>): Rename from vec_set<VI2F:mode>mode.
Use VI2F_256_512 mode iterator instead of VI2F.
(*axv512fp16_movsh): Remove.
(<sse2p4_1>_pinsr<ssemodesuffix>): Add (x,x,x) AVX2 alternative.
Do not disable V8HF mode insn on AVX2 targets.
(pinsrw -> pbroadcast + pblendw peephole2): New peephole.
(pinsrw -> pbroadcast + pblendw splitter): New post-reload splitter.
* config/i386/i386.md (extendhfsf): Call gen_vec_setv8hf_0.
* config/i386/i386-expand.c (ix86_expand_vector_set)
<case E_V8HFmode>: Use vec_merge path for TARGET_AVX2.

gcc/testsuite/ChangeLog:

PR target/102881
* gcc.target/i386/pr102811-1.c: New test.
* gcc.target/i386/avx512fp16-1c.c (dg-final): Update
scan-assembler-times scan strings for ia32 targets.
* gcc.target/i386/pr102327-1.c (dg-final): Ditto.
* gcc.target/i386/pr102811.c: Rename from ...
* gcc.target/i386/avx512vl-vcvtps2ph-pr102811.c: ... this.

2 years agoFinal value replacement improvements for until-wrap loops.
Roger Sayle [Wed, 1 Dec 2021 19:58:40 +0000 (19:58 +0000)]
Final value replacement improvements for until-wrap loops.

This middle-end patch is inspired by the Richard Beiner's until-wrap
loop example in PR tree-optimization/101145.

unsigned foo(unsigned val, unsigned start)
{
  unsigned cnt = 0;
  for (unsigned i = start; i > val; ++i)
    cnt++;
  return cnt;
}

For this loop, the tree optimizers currently generate:

unsigned int foo (unsigned int val, unsigned int start)
{
  unsigned int cnt;
  unsigned int _1;
  unsigned int _5;

  <bb 2> [local count: 118111600]:
  if (start_3(D) > val_4(D))
    goto <bb 3>; [89.00%]
  else
    goto <bb 4>; [11.00%]

  <bb 3> [local count: 105119324]:
  _1 = start_3(D) + 1;
  _5 = -start_3(D);
  cnt_2 = _1 > val_4(D) ? _5 : 1;

  <bb 4> [local count: 118111600]:
  # cnt_11 = PHI <cnt_2(3), 0(2)>
  return cnt_11;
}

or perhaps slightly easier to read:

  if (start > val) {
    cnt = (start+1) > val ? -start : 1;
  } else cnt = 0;

In this snippet, if we know start > val, then (start+1) > val
unless start+1 overflows, i.e. (start+1) == 0 and start == ~0.
We can use this (loop header) context to simplify the ternary
expression to "(start != -1) ? -start : 1", which with a little
help from match.pd can be folded to -start.  Hence the optimal
final value replacement should be:

  cnt = (start > val) ? -start : 0;

Or as now generated by this patch:

unsigned int foo (unsigned int val, unsigned int start)
{
  unsigned int cnt;

  <bb 2> [local count: 118111600]:
  if (start_3(D) > val_4(D))
    goto <bb 3>; [89.00%]
  else
    goto <bb 4>; [11.00%]

  <bb 3> [local count: 105119324]:
  cnt_2 = -start_3(D);

  <bb 4> [local count: 118111600]:
  # cnt_11 = PHI <cnt_2(3), 0(2)>
  return cnt_11;
}

We can also improve until-wrap loops that don't have a (suitable) loop
header, as determined by simplify_using_initial_conditions.

unsigned bar(unsigned val, unsigned start)
{
  unsigned cnt = 0;
  unsigned i = start;
  do {
    cnt++;
    i++;
  } while (i > val);
  return cnt;
}

which is currently optimized to:

unsigned int foo (unsigned int val, unsigned int start)
{
  unsigned int cnt;
  unsigned int _9;
  unsigned int _10;

  <bb 2> [local count: 118111600]:
  _9 = start_4(D) + 1;
  _10 = -start_4(D);
  cnt_3 = val_7(D) < _9 ? _10 : 1;
  return cnt_3;
}

Here we have "val < (start+1) ? -start : 1", which again with the
help of match.pd can be slightly simplified to "val <= start ? -start : 1"
when dealing with unsigned types, because at the complicating value where
start == ~0, we fortunately have -start == 1, hence it doesn't matter
whether the second or third operand of the ternary operator is returned.

To summarize, this patch (in addition to tweaking may_be_zero in
number_of_iterations_until_wrap) adds three new constant folding
transforms to match.pd.

X != C1 ? -X : C2 simplifies to -X when -C1 == C2.
which is the generalized form of the simplification above.

X != C1 ? ~X : C2 simplifies to ~X when ~C1 == C2.
which is the BIT_NOT_EXPR analog of the NEGATE_EXPR case.

and the "until-wrap final value replacement without context":

(X + 1) > Y ? -X : 1 simplifies to X >= Y ? -X : 1 when
X is unsigned, as when X + 1 overflows, X is -1, so -X == 1.

2021-12-01  Roger Sayle  <roger@nextmovesoftware.com>
    Richard Biener  <rguenther@suse.de>

gcc/ChangeLog
* tree-ssa-loop-niter.c (number_of_iterations_until_wrap):
Check if simplify_using_initial_conditions allows us to
simplify the expression for may_be_zero.
* match.pd (X != C ? -X : -C -> -X): New transform.
(X != C ? ~X : ~C -> ~X): Likewise.
((X+1) > Y ? -X : 1 -> X >= Y ? -X : 1): Likewise.

gcc/testsuite/ChangeLog
* gcc.dg/fold-condneg-1.c: New test case.
* gcc.dg/fold-condneg-2.c: New test case.
* gcc.dg/fold-condnot-1.c: New test case.
* gcc.dg/pr101145-1.c: New test case.
* gcc.dg/pr101145-2.c: New test case.

2 years agomiddle-end: Skip initialization of opaque type variables [PR103127]
Peter Bergner [Wed, 1 Dec 2021 19:17:52 +0000 (13:17 -0600)]
middle-end: Skip initialization of opaque type variables [PR103127]

For -ftrivial-auto-var-init=*, skip initializing the variable if it is an
opaque type, because CONST0_RTX(mode) is not defined for opaque modes.

2021-12-01  Peter Bergner  <bergner@linux.ibm.com>

gcc/
PR middle-end/103127
* gimplify.c (is_var_need_auto_init): Handle opaque types.

gcc/testsuite/
PR middle-end/103127
* gcc.target/powerpc/pr103127.c: New test.

2 years agodarwin, d: Support outfile substitution for libphobos
Iain Buclaw [Fri, 19 Nov 2021 08:09:54 +0000 (09:09 +0100)]
darwin, d: Support outfile substitution for libphobos

In the gdc driver, this takes the previous fix for the Darwin D
bootstrap, and extends it to the -static-libphobos option as well.
Rather than pushing the -static-libphobos option back onto the command
line, the setting of SKIPOPT is instead conditionally removed.  The same
change has been repeated for -static-libstdc++ so there is now no need
to call generate_option to re-add it.

In the gcc driver, -static-libphobos has been added as a common option,
validated, and a new outfile substition added to config/darwin.h to
correctly replace -lgphobos with libgphobos.a.

gcc/ChangeLog:

* common.opt (static-libphobos): Add option.
* config/darwin.h (LINK_SPEC): Substitute -lgphobos with libgphobos.a
when linking statically.
* gcc.c (driver_handle_option): Set -static-libphobos as always valid.

gcc/d/ChangeLog:

* d-spec.cc (lang_specific_driver): Set SKIPOPT on -static-libstdc++
and -static-libphobos only when target supports LD_STATIC_DYNAMIC.
Remove generate_option to re-add -static-libstdc++.

libphobos/ChangeLog:

* testsuite/testsuite_flags.in: Add libphobos library directory as
search path to --gdcldflags.

2 years agoc++: constexpr, fold, weak redecl, fp/0 [PR103310]
Jason Merrill [Wed, 24 Nov 2021 10:45:02 +0000 (05:45 -0500)]
c++: constexpr, fold, weak redecl, fp/0 [PR103310]

For PR61825, honza changed tree_single_nonzero_warnv_p to prevent a later
declaration from marking a function as weak after we've determined that it
wasn't weak before.  But we shouldn't do that for speculative folding; we
should only do it when we actually need a constant value.  In C++, such a
context is called "manifestly constant-evaluated".  In fold, this seems to
correspond to the folding_initializer flag, since in C this situation only
occurs in static initializers.

This change makes nonzero-1.c well-formed; I've added a nonzero-1a.c to
verify that we delete the null check eventually if there is no weak
redeclaration.

The varasm.c change is so that if we do get the weak redeclaration error, we
get it at the position of the weak declaration rather than the previous
declaration.

Using the FOLD_INIT paths also affects floating point arithmetic: notably,
this makes floating point division by zero in a manifestly
constant-evaluated context constant, as in a C static initializer.  I've had
some success convincing CWG that this is the right direction; C++ should
follow C's floating point semantics more than we have been doing, and Joseph
says that the C policy is that Annex F overrides other parts of the standard
that say that some operations are undefined.  But since we're in stage 3,
I'm only making this change with the new flag -fconstexpr-fp-except.  It may
turn on by default in a future release.

I think this distinction is only relevant for binary operations; arithmetic
for the floating point case, comparison for possibly non-zero addresses.

PR c++/103310

gcc/ChangeLog:

* fold-const.c (maybe_nonzero_address): Use get_create or get
depending on folding_initializer.
(fold_binary_initializer_loc): New.
* fold-const.h (fold_binary_initializer_loc): Declare.
* varasm.c (mark_weak): Don't use the decl location.
* doc/invoke.texi: Document -fconstexpr-fp-except.

gcc/c-family/ChangeLog:

* c.opt: Add -fconstexpr-fp-except.

gcc/cp/ChangeLog:

* constexpr.c (cxx_eval_binary_expression): Use
fold_binary_initializer_loc if manifestly cxeval.

gcc/testsuite/ChangeLog:

* g++.dg/cpp0x/constexpr-fp-except1.C: New test.
* g++.dg/cpp1z/constexpr-if36.C: New test.
* gcc.dg/tree-ssa/nonzero-1.c: Now well-formed.
* gcc.dg/tree-ssa/nonzero-1a.c: New test.

2 years agors6000: Mirror fix for PR102347 in new builtins support
Bill Schmidt [Wed, 1 Dec 2021 15:20:15 +0000 (09:20 -0600)]
rs6000: Mirror fix for PR102347 in new builtins support

Recently Kewen fixed a problem in the old builtins support where
rs6000_builtin_decl prematurely indicated that a target builtin is
unavailable.  This also needs to be done for the new builtins support, but in
this case we have to ensure the error message is still produced from the
overload support in rs6000-c.c.  Unfortunately, this is less straightforward
than it could be, because header file includes need to be adjusted to make this
happen.  Someday we'll consolidate all the builtin code in one file and this
won't have to be so ugly.

2021-12-01  Bill Schmidt  <wschmidt@linux.ibm.com>

gcc/
PR target/102347
* config/rs6000/rs6000-c.c (rs6000-builtins.h): Stop including.
(rs6000-internal.h): Include.
(altivec_resolve_new_overloaded_builtin): Move call to
rs6000_invalid_new_builtin here from rs6000_new_builtin_decl.
* config/rs6000/rs6000-call.c (rs6000-builtins.h): Stop including.
(rs6000_invalid_new_builtin): Remove static qualifier.
(rs6000_new_builtin_decl): Remove test for supported builtin.
* config/rs6000/rs6000-internal.h (rs6000-builtins.h): Include.
(rs6000_invalid_new_builtin): Declare.
* config/rs6000/rs6000.c (rs6000-builtins.h): Don't include.

2 years agopath solver: Use only one ssa_global_cache.
Aldy Hernandez [Mon, 29 Nov 2021 13:49:59 +0000 (14:49 +0100)]
path solver: Use only one ssa_global_cache.

We're using a temporary range cache while computing ranges for PHIs to
make sure the real cache doesn't get set until all PHIs are computed.
With the ltrans beast in LTO mode this causes undue overhead.

Since we already have a bitmap to indicate whether there's a cache
entry, we can avoid the extra cache object by clearing it while PHIs
are being calculated.

gcc/ChangeLog:

PR tree-optimization/103409
* gimple-range-path.cc (path_range_query::compute_ranges_in_phis):
Do all the work with just one ssa_global_cache.
* gimple-range-path.h: Remove m_tmp_phi_cache.

2 years agolibstdc++: Clear RB tree after moving elements [PR103501]
Jonathan Wakely [Tue, 30 Nov 2021 23:32:50 +0000 (23:32 +0000)]
libstdc++: Clear RB tree after moving elements [PR103501]

If the allocator-extended move constructor move-constructs each element
into the new container, the contents of the old container are left in
moved-from states. We cannot know if those states preserve the
container's ordering and uniqueness guarantees, so just erase all
moved-from elements.

libstdc++-v3/ChangeLog:

PR libstdc++/103501
* include/bits/stl_tree.h (_Rb_tree(_Rb_tree&&, false_type)):
Clear container if elements have been moved-from.
* testsuite/23_containers/map/allocator/move_cons.cc: Expect
moved-from container to be empty.
* testsuite/23_containers/multimap/allocator/move_cons.cc:
Likewise.
* testsuite/23_containers/multiset/allocator/103501.cc: New test.
* testsuite/23_containers/set/allocator/103501.cc: New test.

2 years agolibstdc++: Define std::__is_constant_evaluated() for internal use
Jonathan Wakely [Fri, 26 Nov 2021 23:25:03 +0000 (23:25 +0000)]
libstdc++: Define std::__is_constant_evaluated() for internal use

This adds std::__is_constant_evaluated() as a C++11 wrapper for
__builtin_is_constant_evaluated, but just returning false if the
built-in isn't supported by the compiler. This allows us to use it
throughout the library without checking __has_builtin every time.

Some uses in std::vector and std::string can only be constexpr when the
std::is_constant_evaluated() function actually works, so we might as
well guard them with a relevant macro and call that function directly,
rather than the built-in or std::__is_constant_evaluated().

The remaining checks of the __cpp_lib_is_constant_evaluated macro could
now be replaced by checking __cplusplus >= 202002 instead, but there's
no practical difference. We still need some kind of preprocessor check
there anyway.

libstdc++-v3/ChangeLog:

* doc/doxygen/user.cfg.in (PREDEFINED): Change macro name.
* include/bits/allocator.h (allocate, deallocate): Use
std::__is_constant_evaluated() unconditionally, instead of
checking whether std::is_constant_evaluated() (or the built-in)
can be used.
* include/bits/basic_string.h: Check new macro. call
std::is_constant_evaluated() directly in C++20-only code that is
guarded by a suitable macro.
* include/bits/basic_string.tcc: Likewise.
* include/bits/c++config (__is_constant_evaluated): Define.
(_GLIBCXX_HAVE_BUILTIN_IS_CONSTANT_EVALUATED): Replace with ...
(_GLIBCXX_HAVE_IS_CONSTANT_EVALUATED): New macro.
* include/bits/char_traits.h (char_traits): Replace conditional
calls to std::is_constant_evaluated with unconditional calls to
std::__is_constant_evaluated.
* include/bits/cow_string.h: Use new macro.
* include/bits/ranges_algobase.h (__copy_or_move): Replace
conditional calls to std::is_constant_evaluated with unconditional
calls to std::__is_constant_evaluated.
(__copy_or_move_backward, __fill_n_fn): Likewise.
* include/bits/ranges_cmp.h (ranges::less): Likewise.
* include/bits/stl_algobase.h (lexicographical_compare_three_way):
Likewise.
* include/bits/stl_bvector.h: Call std::is_constant_evaluated
directly in C++20-only code that is guarded by a suitable macro.
* include/bits/stl_construct.h (_Construct, _Destroy, _Destroy_n):
Replace is_constant_evaluated with __is_constant_evaluated.
* include/bits/stl_function.h (greater, less, greater_equal)
(less_equal): Replace __builtin_is_constant_evaluated and
__builtin_constant_p with __is_constant_evaluated.
* include/bits/stl_vector.h: Call std::is_constant_evaluated()
in C++20-only code.
* include/debug/helper_functions.h (__check_singular): Use
__is_constant_evaluated instead of built-in, or remove check
entirely.
* include/std/array (operator<=>): Use __is_constant_evaluated
unconditionally.
* include/std/bit (__bit_ceil): Likewise.
* include/std/type_traits (is_constant_evaluated): Define using
'if consteval' if possible.
* include/std/version: Use new macro.
* libsupc++/compare: Use __is_constant_evaluated instead of
__builtin_is_constant_evaluated.
* testsuite/23_containers/array/tuple_interface/get_neg.cc:
Adjust dg-error lines.

2 years agolibstdc++: Optimize ref-count updates in COW std::string
Jonathan Wakely [Tue, 30 Nov 2021 13:21:55 +0000 (13:21 +0000)]
libstdc++: Optimize ref-count updates in COW std::string

Most ref-count updates in the COW string are done via the functions in
<ext/atomicity.h>, which will use non-atomic ops when the program is
known to be single-threaded. The _M_is_leaked() and _M_is_shared()
functions use __atomic_load_n directly, because <ext/atomicity.h>
doesn't provide a load operation. Those functions can check the
__is_single_threaded() predicate to avoid using __atomic_load_n when not
needed.

The move constructor for the fully-dynamic-string increments the
ref-count by either 2 or 1, for leaked or non-leaked strings
respectively. That can be changed to use a non-atomic store of 1 for all
non-shared strings. It can be non-atomic because even if the program is
multi-threaded, conflicting access to the rvalue object while it's being
moved from would be data race anyway. It can store 1 directly for all
non-shared strings because it doesn't matter whether the initial
refcount was -1 or 0, it should be 1 after the move constructor creates
a second owner.

libstdc++-v3/ChangeLog:

* include/bits/cow_string.h (basic_string::_M_is_leaked): Use
non-atomic load when __is_single_threaded() is true.
(basic_string::_M_is_shared): Likewise.
(basic_string::(basic_string&&)) [_GLIBCXX_FULLY_DYNAMIC_STRING]:
Use non-atomic store when rvalue is not shared.

2 years agolibstdc++: Avoid unwanted allocations in filesystem::path
Jonathan Wakely [Tue, 30 Nov 2021 16:18:23 +0000 (16:18 +0000)]
libstdc++: Avoid unwanted allocations in filesystem::path

When using COW strings, accessing _M_pathname[0] and similar non-const
accessors can cause the string to "leak", meaning it reallocates itself
if it shares ownership with another string object.

This causes test failures for --enable-fully-dynamic-string builds:
/home/jwakely/src/gcc/libstdc++-v3/testsuite/experimental/filesystem/path/construct/90634.cc:62: void test01(): Assertion 'bytes_allocated == 0' failed.
FAIL: experimental/filesystem/path/construct/90634.cc execution test

This FAIL happens because the fully-dynamic move constructor results in
shared ownership, so for path(std::move(std::string("foo"))) the
_M_pathname member shares ownership with the temporary, and the
non-const accesses in _M_split_cmpts() cause a new copy of the string to
be allocated. This un-sharing is wasteful, and entirely unnecessary when
sharing ownership with an rvalue that is about to release its ownership
anyway. Even for lvalues, sharing ownership is not a problem and
reallocating a unique copy of the string is wasteful.

This removes non-const accesses of _M_pathname in the
path::_M_split_cmpts() members.

libstdc++-v3/ChangeLog:

* src/c++17/fs_path.cc (path::_M_split_cmpts()): Remove
micro-optimization for "/" path.
* src/filesystem/path.cc (path::_M_split_cmpts()): Only access
the contents of _M_pathname using const member functions.

2 years agovect: Tighten check for SLP memory groups [PR103517]
Richard Sandiford [Wed, 1 Dec 2021 14:36:24 +0000 (14:36 +0000)]
vect: Tighten check for SLP memory groups [PR103517]

When checking for compatible stmts, vect_build_slp_tree_1 did:

       && !(STMT_VINFO_GROUPED_ACCESS (stmt_info)
    && (first_stmt_code == ARRAY_REF
|| first_stmt_code == BIT_FIELD_REF
|| first_stmt_code == INDIRECT_REF
|| first_stmt_code == COMPONENT_REF
|| first_stmt_code == MEM_REF)))

That is, it allowed any rhs_code as long as the first_stmt_code
looked valid.  This had the effect of allowing IFN_MASK_LOAD
to be paired with an earlier non-call code (but didn't allow
the reverse).

This patch makes the check symmetrical.

gcc/
PR tree-optimization/103517
* tree-vect-slp.c (vect_build_slp_tree_1): When allowing two
different component references, check the codes of both them,
rather than just the first.

gcc/testsuite/
PR tree-optimization/103517
* gcc.dg/vect/pr103517.c: New test.

2 years agoAlso pre-process PHIs in range-of-stmt.
Andrew MacLeod [Mon, 29 Nov 2021 17:00:26 +0000 (12:00 -0500)]
Also pre-process PHIs in range-of-stmt.

PR tree-optimization/103464
* gimple-range.cc (gimple_ranger::prefill_name): Process phis also.
(gimple_ranger::prefill_stmt_dependencies): Ditto.

2 years agotestsuite: Fix typo in comment in aapcs64 test
Alex Coplan [Wed, 1 Dec 2021 13:59:32 +0000 (13:59 +0000)]
testsuite: Fix typo in comment in aapcs64 test

gcc/testsuite/ChangeLog:

* gcc.target/aarch64/aapcs64/macro-def.h (PTR): Fix typo in
comment.

2 years agodoc, d: Add note that D front end now requires GDC installed in order to bootstrap.
Iain Buclaw [Wed, 17 Nov 2021 09:55:08 +0000 (10:55 +0100)]
doc, d: Add note that D front end now requires GDC installed in order to bootstrap.

gcc/ChangeLog:

* doc/install.texi (Prerequisites): Add note that D front end now
requires GDC installed in order to bootstrap.
(Building): Add D compiler section, referencing prerequisites.

2 years agod: Update documentation of new D language options.
Iain Buclaw [Wed, 1 Dec 2021 10:46:46 +0000 (11:46 +0100)]
d: Update documentation of new D language options.

Adds documentation for the following:

    - New switch that controls what code is generated on a contract
      failure (throw or abort).
    - New switch that controls mangling of D types in `extern(C++)`
      code, as well as setting the compile-time value of
      `__traits(getTargetInfo "cppStd")`
    - New switches that generate C++ headers from D source files.
    - New switch to save expanded mixins to a file.
    - New switches that now distinguish between D language changes that
      are either (a) an experimental feature or an upcoming breaking
      change, (b) a warning or help on an upcoming change, or (c) revert
      of a change for users who don't want to deal with the breaking
      change for now.

gcc/d/ChangeLog:

* gdc.texi (Runtime Options): Document -fcheckaction=, -fextern-std=,
-fpreview=, -frevert=.
(Code Generation): Document -fdump-c++-spec=, -fdump-c++-spec-verbose,
-fsave-mixins=.
(Warnings): Update list of supported -ftransitions=.

2 years ago[Ada] Fix incorrect fixed-point computation in expression function
Eric Botcazou [Fri, 19 Nov 2021 17:24:01 +0000 (18:24 +0100)]
[Ada] Fix incorrect fixed-point computation in expression function

gcc/ada/

* einfo.ads (E_Decimal_Fixed_Point_Subtype): Fix pasto.
* freeze.adb (Freeze_Fixed_Point_Type): Retrieve the underlying type
of the first subtype and do not use a stale value of Small_Value.
* sem_res.adb (Resolve_Real_Literal): In the case of a fixed-point
type, make sure that the base type is frozen and use its Small_Value
to compute the corresponding integer value of the literal.

2 years ago[Ada] Tune whitespace of the bounded lists Aggregate aspect
Piotr Trojanek [Fri, 19 Nov 2021 09:13:08 +0000 (10:13 +0100)]
[Ada] Tune whitespace of the bounded lists Aggregate aspect

gcc/ada/

* libgnat/a-cbdlli.ads (List): Remove extra space in Aggregate
aspect.

2 years ago[Ada] Allow formal functions to have a default in the form of an expression function
Gary Dismukes [Tue, 16 Nov 2021 21:56:44 +0000 (16:56 -0500)]
[Ada] Allow formal functions to have a default in the form of an expression function

gcc/ada/

* doc/gnat_rm/implementation_defined_pragmas.rst: Add
documentation of the new form of formal subprogram default in
the section on language extensions (pragma Extensions_Allowed).
* gnat_rm.texi: Regenerate.
* gen_il-gen-gen_nodes.adb: Add Expression as a syntactic field
of N_Formal_(Abstract|Concrete)_Subprogram_Declaration nodes.
* par-ch12.adb (P_Formal_Subprogram_Declaration): Add parsing
support for the new default of a parenthesized expression for
formal functions. Issue an error when extensions are not
allowed, suggesting use of -gnatX. Update comment with extended
syntax for SUBPROGRAM_DEFAULT.
* sem_ch12.adb (Analyze_Formal_Subprogram_Declaration): Issue an
error when an expression default is given for an abstract formal
function. When a default expression is present for a formal
function, install the function's formals and preanalyze the
expression.
(Instantiate_Formal_Subprogram): Fix typo in RM paragraph in a
comment.  When a formal function has a default expression,
create a body for the function that will evaluate the expression
and will be called when the default applies in an instantiation.
The implicit function is marked as inlined and as having
convention Intrinsic.

2 years ago[Ada] Do not return freeze nodes for start of early call regions
Eric Botcazou [Thu, 18 Nov 2021 18:00:45 +0000 (19:00 +0100)]
[Ada] Do not return freeze nodes for start of early call regions

gcc/ada/

* sem_elab.adb (Previous_Suitable_Construct): New function declared
in the Early_Call_Region_Processor package.
(Find_ECR): Call it to get the previous node at the start.
(Include): Call it to get the previous node during the traversal.

2 years ago[Ada] Fix crash on pragma Compile_Time_Warning/Error
Bob Duff [Wed, 17 Nov 2021 17:06:32 +0000 (12:06 -0500)]
[Ada] Fix crash on pragma Compile_Time_Warning/Error

gcc/ada/

* sem_prag.adb (Process_Compile_Time_Warning_Or_Error): Do not
follow the Corresponding_Spec pointer if Acts_As_Spec is True,
because Corresponding_Spec is Empty in that case, so we would
exit the loop prematurely, and incorrectly think we are not
inside a generic unit when we are.

2 years ago[Ada] Syntax error on "not null procedure"
Bob Duff [Wed, 17 Nov 2021 14:58:49 +0000 (09:58 -0500)]
[Ada] Syntax error on "not null procedure"

gcc/ada/

* par-ch3.adb (P_Access_Type_Definition): If Not_Null_Subtype is
True, give an error in the access-to-subprogram cases.

2 years ago[Ada] Tidy up freezing code for instantiations (continued)
Eric Botcazou [Wed, 17 Nov 2021 12:43:15 +0000 (13:43 +0100)]
[Ada] Tidy up freezing code for instantiations (continued)

gcc/ada/

* sem_ch12.adb (Freeze_Package_Instance): Move up.

2 years ago[Ada] Tidy up freezing code for instantiations
Eric Botcazou [Mon, 15 Nov 2021 15:04:25 +0000 (16:04 +0100)]
[Ada] Tidy up freezing code for instantiations

gcc/ada/

* sem_ch12.adb (Freeze_Subprogram_Body): Rename into...
(Freeze_Subprogram_Instance): ...this and change the name of the
first parameter and local variables for the sake of consistency.
(Insert_Freeze_Node_For_Instance): Use local variable Par_Inst.
(Install_Body): Rename into...
(Freeze_Package_Instance): ...this, remove first parameter and
change the name of local variables for the sake of consistency.
Do not deal with the special case of incomplete actual types here
and do not insert the body.
(Instantiate_Package_Body): Deal with the special case of incomplete
actual types here and insert the body.  Call Freeze_Package_Instance
only if expansion is done.
(Instantiate_Subprogram_Body): Minor consistency tweak.

2 years ago[Ada] Fix typo in comment
Etienne Servais [Thu, 18 Nov 2021 10:43:19 +0000 (11:43 +0100)]
[Ada] Fix typo in comment

gcc/ada/

* sem_aggr.adb (Resolve_Aggregate): Fix typo in comment.

2 years ago[Ada] Improve support for casing on types with controlled parts
Steve Baird [Fri, 5 Nov 2021 22:22:05 +0000 (15:22 -0700)]
[Ada] Improve support for casing on types with controlled parts

gcc/ada/

* sem_case.adb (Check_Bindings): Provide a second strategy for
implementing bindings and choose which strategy to use for a
given binding. The previous approach was to introduce a new
object and assign the bound value to the object.  The new
approach is to introduce a renaming of a dereference of an
access value that references the appropriate subcomponent, so no
copies are made.  The original strategy is still used if the
type of the object is elementary.  When the renaming approach is
used, the initialization of the access value is not generated
until expansion. Until this missing initialization is added, the
tree looks like a known-at-compile-time dereference of a null
access value: Temp : Some_Access_Type; Obj : Designated_Type
renames Temp.all; This leads to problems, so a bogus initial
value is provided here and then later deleted during expansion.
(Check_Composite_Case_Selector): Disallow a case selector
expression that requires finalization. Note that it is ok if the
selector's type requires finalization, as long as the expression
itself doesn't have any "newly constructed" parts.
* exp_ch5.adb (Pattern_Match): Detect the case where analysis of
a general (i.e., composite selector type) case statement chose
to implement a binding as a renaming rather than by making a
copy. In that case, generate the assignments to initialize the
access-valued object whose designated value is later renamed
(and remove the bogus initial value for that object that was
added during analysis).
* sem_util.ads, sem_util.adb: Add new function
Is_Newly_Constructed corresponding to RM 4.4 term.

2 years ago[Ada] Fix issues with ignored ghost code and unnesting
Richard Kenner [Tue, 16 Nov 2021 14:39:57 +0000 (09:39 -0500)]
[Ada] Fix issues with ignored ghost code and unnesting

gcc/ada/

* frontend.adb (Frontend): Do unnesting after ignored ghost code
has been removed.
* inline.adb (Analyze_Inlined_Bodies): Don't put ignored ghost
entities on inlined subprogram list.

2 years ago[Ada] Make Timed_Task_Entry_Call's defer_abort nestable
Ghjuvan Lacambre [Tue, 16 Nov 2021 13:19:07 +0000 (14:19 +0100)]
[Ada] Make Timed_Task_Entry_Call's defer_abort nestable

gcc/ada/

* libgnarl/s-tasren.adb (Timed_Task_Entry_Call): Replace
Defer_Abort and Undefer_Abort with Defer_Abort_Nestable and
Undefer_Abort_Nestable.

2 years ago[Ada] Do not free task for _parent
Ghjuvan Lacambre [Tue, 16 Nov 2021 11:19:13 +0000 (12:19 +0100)]
[Ada] Do not free task for _parent

gcc/ada/

* exp_ch7.adb (Cleanup_Record): Don't process parent.

2 years ago[Ada] Spurious warning when using 'Type_Key on generic formal
Justin Squirek [Tue, 16 Nov 2021 15:50:06 +0000 (10:50 -0500)]
[Ada] Spurious warning when using 'Type_Key on generic formal

gcc/ada/

* sem_attr.adb (Type_Key): Avoid premature use warnings when the
prefix is a generic actual.

2 years ago[Ada] Create object file for ignored ghost compilation unit
Richard Kenner [Sat, 13 Nov 2021 13:33:29 +0000 (08:33 -0500)]
[Ada] Create object file for ignored ghost compilation unit

gcc/ada/

* gnat1drv.adb (Gnat1drv): Force generation of object file if
compilation unit is an ignored ghost.

2 years ago[Ada] RTEMS: add traceback support for AArch64
Patrick Bernardi [Sat, 13 Nov 2021 01:01:20 +0000 (20:01 -0500)]
[Ada] RTEMS: add traceback support for AArch64

gcc/ada/

* tracebak.c: Add AArch64 RTEMS support.

2 years ago[Ada] Add signal to exception mapping for RTEMS
Patrick Bernardi [Fri, 12 Nov 2021 22:55:57 +0000 (17:55 -0500)]
[Ada] Add signal to exception mapping for RTEMS

gcc/ada/

* init.c: Add __gnat_error_handler and __gnat_install_handler
for RTEMS.

2 years ago[Ada] Fix small discrepancy between -gnatG and -gnatD[G] outputs
Eric Botcazou [Thu, 11 Nov 2021 11:36:10 +0000 (12:36 +0100)]
[Ada] Fix small discrepancy between -gnatG and -gnatD[G] outputs

gcc/ada/

* sprint.ads (Source_Dump): Fix typo in comment.
* sprint.adb (Source_Dump): Set Dump_Freeze_Null for both -gnatG
and -gnatD.
* switch-c.adb (Scan_Front_End_Switches) <'D'>: Remove obsolete
kludge.

2 years ago[Ada] Improve error messages for dot notation when -gnatX not used
Yannick Moy [Fri, 8 Oct 2021 14:19:50 +0000 (16:19 +0200)]
[Ada] Improve error messages for dot notation when -gnatX not used

gcc/ada/

* einfo.ads (Direct_Primitive_Operations): Update the doc to
indicate that this field is used for all types now.
* sem_ch4.adb (Try_Object_Operation): Add parameter
Allow_Extensions set to True to pretend that extensions are
allowed.
* sem_ch4.ads: Same.
* sem_ch6.adb: Do not require Extensions_Allowed.
* sem_ch8.adb (Find_Selected_Component): Remove duplicate
"where" in comment.  Improve the error messages regarding use of
prefixed calls.

2 years ago[Ada] Add query for extended precision floating-point types
Yannick Moy [Mon, 8 Nov 2021 10:53:42 +0000 (11:53 +0100)]
[Ada] Add query for extended precision floating-point types

gcc/ada/

* sem_util.adb (Is_Extended_Precision_Floating_Point_Type): New
function.
* sem_util.ads (Is_Extended_Precision_Floating_Point_Type): New
function.

2 years ago[Ada] Replace low-level detection of subprograms with high-level wrapper
Piotr Trojanek [Wed, 10 Nov 2021 11:41:19 +0000 (12:41 +0100)]
[Ada] Replace low-level detection of subprograms with high-level wrapper

gcc/ada/

* exp_aggr.adb, sem_cat.adb, sem_ch10.adb, sem_ch12.adb,
sem_elim.adb, sem_util.adb: Replace uses of Subprogram_Kind with
Is_Subprogram.

2 years ago[Ada] Sync whitespace between variants of Indefinite_Holders unit
Piotr Trojanek [Mon, 8 Nov 2021 13:19:39 +0000 (14:19 +0100)]
[Ada] Sync whitespace between variants of Indefinite_Holders unit

gcc/ada/

* libgnat/a-coinho.ads: Sync whitespace with
a-coinho__shared.ads.
* libgnat/a-coinho__shared.ads: Sync whitespace with
a-coinho.ads.

2 years ago[Ada] Sort list of Ada runtime units in Makefile.rtl
Piotr Trojanek [Mon, 8 Nov 2021 11:35:43 +0000 (12:35 +0100)]
[Ada] Sort list of Ada runtime units in Makefile.rtl

gcc/ada/

* Makefile.rtl (GNATRTL_TASKING_OBJS): Sort.
(GNATRTL_NONTASKING_OBJS): Sort.

2 years ago[Ada] Whitespace cleanup in Makefile.rtl dependency rules
Piotr Trojanek [Mon, 8 Nov 2021 10:51:25 +0000 (11:51 +0100)]
[Ada] Whitespace cleanup in Makefile.rtl dependency rules

gcc/ada/

* Makefile.rtl: Remove extra whitespace in special compilation
rules.

2 years ago[Ada] Document System.Atomic_Counters as supported on ARM and AARCH64
Piotr Trojanek [Mon, 8 Nov 2021 11:46:42 +0000 (12:46 +0100)]
[Ada] Document System.Atomic_Counters as supported on ARM and AARCH64

gcc/ada/

* doc/gnat_rm/the_gnat_library.rst (System.Atomic_Counters):
Sync description with comment in s-atocou.ads.
* gnat-style.texi, gnat_rm.texi, gnat_ugn.texi: Regenerate.

2 years ago[Ada] Improve messages on incorrect state refinement in SPARK
Yannick Moy [Wed, 29 Sep 2021 13:26:54 +0000 (15:26 +0200)]
[Ada] Improve messages on incorrect state refinement in SPARK

gcc/ada/

* sem_ch10.adb (Is_Private_Library_Unit): Move query to
Sem_Util for sharing.
* sem_ch7.adb (Analyze_Package_Body_Helper): Add continuation
message.
* sem_prag.adb (Analyze_Part_Of): Call new function
Is_Private_Library_Unit.
(Check_Valid_Library_Unit_Pragma): Specialize error messages on
misplaced pragmas.
(Analyze_Refined_State_In_Decl_Part): Recognize missing Part_Of
on object in private part.
* sem_util.adb (Check_State_Refinements): Add continuation
message.
(Find_Placement_In_State_Space): Fix detection of placement,
which relied wrongly on queries In_Package_Body/In_Private_Part
which do not provide the right information here for all cases.
(Is_Private_Library_Unit): Move query here for sharing.
* sem_util.ads (Is_Private_Library_Unit): Move query here for
sharing.

2 years ago[Ada] Storage error on untagged prefixed subprogram calls with -gnatX
Gary Dismukes [Fri, 5 Nov 2021 23:30:05 +0000 (19:30 -0400)]
[Ada] Storage error on untagged prefixed subprogram calls with -gnatX

gcc/ada/

* sem_ch3.adb (Analyze_Full_Type_Declaration): If the full type
has a primitives list but its base type doesn't, set the base
type's list to the full type's list (covers certain constrained
cases, such as for arrays).
(Analyze_Incomplete_Type_Decl): Unconditionally initialize an
incomplete type's primitives list.
(Analyze_Subtype_Declaration): Unconditionally set a subtype's
primitives list to the base type's list, so the lists are
shared.
(Build_Derived_Private_Type): Unconditionally initialize a
derived private type's list to a new empty list.
(Build_Derived_Record_Type): Unconditionally initialize a
derived record type's list to a new empty list (now a single
call for tagged and untagged cases).
(Derived_Type_Declaration): Unconditionally initialize a derived
type's list to a new empty list in error cases (when Parent_Type
is undefined or illegal).
(Process_Full_View): Unconditionally copy the primitive
operations from the private view to the full view (rather than
conditioning it on whether extensions are enabled).
* sem_ch7.adb (New_Private_Type): Unconditionally initialize an
untagged private type's primitives list to a new empty list.

2 years ago[Ada] Avoid duplication for Sets functions
Etienne Servais [Fri, 5 Nov 2021 13:25:50 +0000 (14:25 +0100)]
[Ada] Avoid duplication for Sets functions

gcc/ada/

* libgnat/a-cbhase.adb, libgnat/a-cborse.adb,
libgnat/a-cihase.adb, libgnat/a-ciorse.adb,
libgnat/a-cohase.adb, libgnat/a-coorse.adb
(Constant_Reference,Reference_Preserving_Key): Refactor using
the equivalence stated in the RM.

2 years ago[Ada] Simplify building of inequality function body
Piotr Trojanek [Fri, 5 Nov 2021 14:13:47 +0000 (15:13 +0100)]
[Ada] Simplify building of inequality function body

gcc/ada/

* exp_ch3.adb (Make_Eq_Body): Refactor to avoid appending to an
empty list; also, when exiting early we will not create any
list; fix style in comment.

2 years ago[Ada] Cleanup listing of representation info
Piotr Trojanek [Fri, 5 Nov 2021 15:51:46 +0000 (16:51 +0100)]
[Ada] Cleanup listing of representation info

gcc/ada/

* repinfo.adb (List_Entities): Simplify detection of entries;
refactor potentially redundant comparison.

2 years agoi386: Fix up some minor formatting issues and one inconsistency
Jakub Jelinek [Wed, 1 Dec 2021 09:22:55 +0000 (10:22 +0100)]
i386: Fix up some minor formatting issues and one inconsistency

While looking at a proposed vendor backport, I've noticed some
formatting issues in x86-tune.def.  Also, in all spots m_GENERIC
comes last, except one recently changed, I think it is useful to have
m_GENERIC always last for consistency.

2021-12-01  Jakub Jelinek  <jakub@redhat.com>

* config/i386/x86-tune.def (X86_TUNE_SCHEDULE,
X86_TUNE_SSE_PARTIAL_REG_FP_CONVERTS_DEPENDENCY,
X86_TUNE_MISALIGNED_MOVE_STRING_PRO_EPILOGUES): Formatting fixes.
(X86_TUNE_USE_GATHER): Put m_GENERIC last for consistency.

2 years agolibcpp: Enable P1949R7 for C++98 too [PR100977]
Jakub Jelinek [Wed, 1 Dec 2021 09:21:20 +0000 (10:21 +0100)]
libcpp: Enable P1949R7 for C++98 too [PR100977]

On Mon, Nov 29, 2021 at 05:53:58PM -0500, Jason Merrill wrote:
> I'm inclined to go ahead and change C++98 as well; I doubt anyone is relying
> on the particular C++98 extended character set rules, and we already accept
> the union of the different sets when not pedantic.

Ok, here is an incremental patch to do that also for -std={c,gnu}++98.

2021-12-01  Jakub Jelinek  <jakub@redhat.com>

PR c++/100977
* init.c (struct lang_flags): Remove cxx23_identifiers.
(lang_defaults): Remove cxx23_identifiers initializers.
(cpp_set_lang): Don't copy cxx23_identifiers.
* include/cpplib.h (struct cpp_options): Adjust comment about
c11_identifiers.  Remove cxx23_identifiers field.
* lex.c (warn_about_normalization): Use cplusplus instead of
cxx23_identifiers.
* charset.c (ucn_valid_in_identifier): Likewise.

* g++.dg/cpp/ucnid-1.C: Adjust expected diagnostics.
* g++.dg/cpp/ucnid-1-utf8.C: Likewise.

2 years agosimplify-rtx: Punt on simplify_associative_operation with large operands [PR102356]
Jakub Jelinek [Wed, 1 Dec 2021 09:16:57 +0000 (10:16 +0100)]
simplify-rtx: Punt on simplify_associative_operation with large operands [PR102356]

Seems simplify_associate_operation is quadratic, which isn't a big deal
for use during combine and other similar RTL passes, because those never
try to combine expressions from more than a few instructions and because
those instructions need to be recognized the machine description also bounds
how many expressions can appear in there.
var-tracking has depth limits only for some cases and unlimited depth
for the vt_expand_loc though:
 /* This is the value used during expansion of locations.  We want it
    to be unbounded, so that variables expanded deep in a recursion
    nest are fully evaluated, so that their values are cached
    correctly.  We avoid recursion cycles through other means, and we
    don't unshare RTL, so excess complexity is not a problem.  */
 #define EXPR_DEPTH (INT_MAX)
 /* We use this to keep too-complex expressions from being emitted as
    location notes, and then to debug information.  Users can trade
    compile time for ridiculously complex expressions, although they're
    seldom useful, and they may often have to be discarded as not
    representable anyway.  */
 #define EXPR_USE_DEPTH (param_max_vartrack_expr_depth)

IMO for very large expressions it isn't worth trying to reassociate though,
in fact e.g. for the new testcase below keeping it as is has bigger chance
of generating smaller debug info which the dwarf2out.c part of the change
tries to achieve - if a binary operation has the same operands, we can
use DW_OP_dup and not bother computing the possibly large operand again.

The patch fixes it by adding a counter to simplify_context and counting
how many times simplify_associative_operation has been called during
a single outermost simplify_* call, and once it reaches some maximum
(currently 64), it stops reassociating.

Another possibility to deal with the power expressions in debug info
would be to introduce some new RTL operation for the pow{,i} (x, n)
case, allow that solely in debug insns and expand those into DWARF
using a loop.  But that seems like quite a lot of work for something rarely
used (especially when powi for larger n is only useful for 0 and 1 inputs
because anything else overflows).

2021-12-01  Jakub Jelinek  <jakub@redhat.com>

PR rtl-optimization/102356
* rtl.h (simplify_context): Add assoc_count member and
max_assoc_count static member.
* simplify-rtx.c (simplify_associative_operation): Don't reassociate
more than max_assoc_count times within one outermost simplify_* call.
* dwarf2out.c (mem_loc_descriptor): Optimize binary operation
with both operands the same using DW_OP_dup.

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

2 years agolibcpp: Fix up #__VA_OPT__ handling [PR103415]
Jakub Jelinek [Wed, 1 Dec 2021 09:07:59 +0000 (10:07 +0100)]
libcpp: Fix up #__VA_OPT__ handling [PR103415]

stringify_arg uses pfile->u_buff to create the string literal.
Unfortunately, paste_tokens -> _cpp_lex_direct -> lex_number -> _cpp_unaligned_alloc
can in some cases use pfile->u_buff too, which results in losing everything
prepared for the string literal until the token pasting.

The following patch fixes that by not calling paste_token during the
construction of the string literal, but doing that before.  All the tokens
we are processing have been pushed into a token buffer using
tokens_buff_add_token so it is fine if we paste some of them in that buffer
(successful pasting creates a new token in that buffer), move following
tokens if any to make it contiguous, pop (throw away) the extra tokens at
the end and then do stringify_arg.

Also, paste_tokens now copies over PREV_WHITE and PREV_FALLTHROUGH flags
from the original lhs token to the replacement token.  Copying that way
the PREV_WHITE flag is needed for the #__VA_OPT__ handling and copying
over PREV_FALLTHROUGH fixes the new Wimplicit-fallthrough-38.c test.

2021-12-01  Jakub Jelinek  <jakub@redhat.com>

PR preprocessor/103415
libcpp/
* macro.c (stringify_arg): Remove va_opt argument and va_opt handling.
(paste_tokens): On successful paste or in PREV_WHITE and
PREV_FALLTHROUGH flags from the *plhs token to the new token.
(replace_args): Adjust stringify_arg callers.  For #__VA_OPT__,
perform token pasting in a separate loop before stringify_arg call.
gcc/testsuite/
* c-c++-common/cpp/va-opt-8.c: New test.
* c-c++-common/Wimplicit-fallthrough-38.c: New test.