This patch removes dependency on Support_Atomic_Primitives in the run-time package System.Atomic_Primitives by introducing a new attribute Atomic_Always_Lock_Free. This changes allow us to remove all the Support_Atomic_Primitives defaulted values in the corresponding system packages and fixes build failures on platform that didn't have the flag Support_Atomic_Primitives defined in the target system.ads (PR ada/54125)
Tested on x86_64-pc-linux-gnu, committed on trunk 2012-08-06 Vincent Pucci <pu...@adacore.com> PR ada/54125 * exp_attr.adb (Expand_N_Attribute_Reference): Expand new Atomic_Always_Lock_Free attribute. * sem_attr.adb (Analyze_Attribute): Analyze new Atomic_Always_Lock_Free attribute. (Eval_Attribute): Nothing to do with new Atomic_Always_Lock_Free attribute. * sem_ch9.adb (Allows_Lock_Free_Implementation): Support_Atomic_Primitives check replaces previous erroneous size check. * sem_util.adb, sem_util.ads (Support_Atomic_Primitives): New routine. * snames.ads-tmpl: New name Name_Atomic_Always_Lock_Free and new attribute Attribute_Atomic_Always_Lock_Free defined. * s-atopri.adb: Support_Atomic_Primitives checks replaced by Atomic_Always_Lock_Free queries. * system-aix64.ads, system-aix.ads, system-darwin-ppc.ads, system-hpux.ads, system-linux-alpha.ads, system-linux-hppa.ads, system-linux-ppc.ads, system-linux-s390.ads, system-linux-s390x.ads, system-linux-sh4.ads, system-linux-sparc.ads, system-lynxos178-ppc.ads, system-lynxos-ppc.ads, system-mingw.ads, system-vxworks-arm.ads, system-solaris-sparc.ads, system-solaris-sparcv9.ads, system-vms_64.ads, system-vxworks-m68k.ads, system-vxworks-mips.ads, system-vxworks-ppc.ads, system-vxworks-sparcv9.ads: Flag Support_Atomic_Primitives removed.
Index: system-linux-s390x.ads =================================================================== --- system-linux-s390x.ads (revision 190155) +++ system-linux-s390x.ads (working copy) @@ -130,7 +130,6 @@ Stack_Check_Probes : constant Boolean := False; Stack_Check_Limits : constant Boolean := False; Support_Aggregates : constant Boolean := True; - Support_Atomic_Primitives : constant Boolean := False; Support_Composite_Assign : constant Boolean := True; Support_Composite_Compare : constant Boolean := True; Support_Long_Shifts : constant Boolean := True; Index: system-linux-alpha.ads =================================================================== --- system-linux-alpha.ads (revision 190155) +++ system-linux-alpha.ads (working copy) @@ -130,7 +130,6 @@ Stack_Check_Probes : constant Boolean := True; Stack_Check_Limits : constant Boolean := False; Support_Aggregates : constant Boolean := True; - Support_Atomic_Primitives : constant Boolean := False; Support_Composite_Assign : constant Boolean := True; Support_Composite_Compare : constant Boolean := True; Support_Long_Shifts : constant Boolean := True; Index: exp_attr.adb =================================================================== --- exp_attr.adb (revision 190155) +++ exp_attr.adb (working copy) @@ -3100,19 +3100,6 @@ end if; end; - --------------- - -- Lock_Free -- - --------------- - - -- Rewrite the attribute reference with the value of Uses_Lock_Free - - when Attribute_Lock_Free => Lock_Free : declare - V : constant Entity_Id := Boolean_Literals (Uses_Lock_Free (Ptyp)); - begin - Rewrite (N, New_Occurrence_Of (V, Loc)); - Analyze_And_Resolve (N, Standard_Boolean); - end Lock_Free; - ------------- -- Machine -- ------------- @@ -6018,6 +6005,7 @@ when Attribute_Abort_Signal | Attribute_Address_Size | + Attribute_Atomic_Always_Lock_Free | Attribute_Base | Attribute_Class | Attribute_Compiler_Version | @@ -6035,6 +6023,7 @@ Attribute_Has_Tagged_Values | Attribute_Large | Attribute_Last_Valid | + Attribute_Lock_Free | Attribute_Machine_Emax | Attribute_Machine_Emin | Attribute_Machine_Mantissa | Index: system-vxworks-arm.ads =================================================================== --- system-vxworks-arm.ads (revision 190155) +++ system-vxworks-arm.ads (working copy) @@ -145,7 +145,6 @@ Stack_Check_Probes : constant Boolean := False; Stack_Check_Limits : constant Boolean := True; Support_Aggregates : constant Boolean := True; - Support_Atomic_Primitives : constant Boolean := False; Support_Composite_Assign : constant Boolean := True; Support_Composite_Compare : constant Boolean := True; Support_Long_Shifts : constant Boolean := True; Index: sem_ch9.adb =================================================================== --- sem_ch9.adb (revision 190158) +++ sem_ch9.adb (working copy) @@ -557,7 +557,6 @@ Id : constant Entity_Id := Entity (N); Comp_Decl : Node_Id; Comp_Id : Entity_Id := Empty; - Comp_Size : Int := 0; Comp_Type : Entity_Id; begin @@ -591,40 +590,19 @@ Layout_Type (Comp_Type); - if Known_Static_Esize (Comp_Type) then - Comp_Size := UI_To_Int (Esize (Comp_Type)); + if not + Support_Atomic_Primitives (Comp_Type) + then + if Lock_Free_Given then + Error_Msg_NE + ("type of& must support atomic " & + "operations", + N, Comp_Id); + return Skip; + end if; - -- If the Esize (Object_Size) is unknown at - -- compile-time, look at the RM_Size - -- (Value_Size) since it may have been set by - -- an explicit representation clause. - - elsif Known_Static_RM_Size (Comp_Type) then - Comp_Size := - UI_To_Int (RM_Size (Comp_Type)); - - -- Worrisome missing else raise PE??? + return Abandon; end if; - - -- Check that the size of the component is 8, - -- 16, 32 or 64 bits. - - -- What about AAMP here??? - - case Comp_Size is - when 8 | 16 | 32 | 64 => - null; - when others => - if Lock_Free_Given then - Error_Msg_NE - ("type of& must support atomic " & - "operations", - N, Comp_Id); - return Skip; - end if; - - return Abandon; - end case; end if; -- Check if another protected component has Index: system-linux-hppa.ads =================================================================== --- system-linux-hppa.ads (revision 190155) +++ system-linux-hppa.ads (working copy) @@ -132,7 +132,6 @@ Stack_Check_Probes : constant Boolean := True; Stack_Check_Limits : constant Boolean := False; Support_Aggregates : constant Boolean := True; - Support_Atomic_Primitives : constant Boolean := False; Support_Composite_Assign : constant Boolean := True; Support_Composite_Compare : constant Boolean := True; Support_Long_Shifts : constant Boolean := True; Index: system-linux-s390.ads =================================================================== --- system-linux-s390.ads (revision 190155) +++ system-linux-s390.ads (working copy) @@ -130,7 +130,6 @@ Stack_Check_Probes : constant Boolean := False; Stack_Check_Limits : constant Boolean := False; Support_Aggregates : constant Boolean := True; - Support_Atomic_Primitives : constant Boolean := False; Support_Composite_Assign : constant Boolean := True; Support_Composite_Compare : constant Boolean := True; Support_Long_Shifts : constant Boolean := True; Index: system-solaris-sparcv9.ads =================================================================== --- system-solaris-sparcv9.ads (revision 190155) +++ system-solaris-sparcv9.ads (working copy) @@ -132,7 +132,6 @@ Stack_Check_Probes : constant Boolean := True; Stack_Check_Limits : constant Boolean := False; Support_Aggregates : constant Boolean := True; - Support_Atomic_Primitives : constant Boolean := False; Support_Composite_Assign : constant Boolean := True; Support_Composite_Compare : constant Boolean := True; Support_Long_Shifts : constant Boolean := True; Index: system-mingw.ads =================================================================== --- system-mingw.ads (revision 190155) +++ system-mingw.ads (working copy) @@ -132,7 +132,6 @@ Stack_Check_Probes : constant Boolean := True; Stack_Check_Limits : constant Boolean := False; Support_Aggregates : constant Boolean := True; - Support_Atomic_Primitives : constant Boolean := False; Support_Composite_Assign : constant Boolean := True; Support_Composite_Compare : constant Boolean := True; Support_Long_Shifts : constant Boolean := True; Index: sem_util.adb =================================================================== --- sem_util.adb (revision 190155) +++ sem_util.adb (working copy) @@ -12833,6 +12833,47 @@ end if; end Subprogram_Access_Level; + ------------------------------- + -- Support_Atomic_Primitives -- + ------------------------------- + + function Support_Atomic_Primitives (Typ : Entity_Id) return Boolean is + Size : Int; + + begin + -- Verify the alignment of Typ is known + + if not Known_Alignment (Typ) then + return False; + end if; + + if Known_Static_Esize (Typ) then + Size := UI_To_Int (Esize (Typ)); + + -- If the Esize (Object_Size) is unknown at compile-time, look at the + -- RM_Size (Value_Size) since it may have been set by an explicit rep + -- item. + + elsif Known_Static_RM_Size (Typ) then + Size := UI_To_Int (RM_Size (Typ)); + + -- Otherwise, the size is considered to be unknown. + + else + return False; + end if; + + -- Check that the size of the component is 8, 16, 32 or 64 bits and that + -- Typ is properly aligned. + + case Size is + when 8 | 16 | 32 | 64 => + return Size = UI_To_Int (Alignment (Typ)) * 8; + when others => + return False; + end case; + end Support_Atomic_Primitives; + ----------------- -- Trace_Scope -- ----------------- Index: sem_util.ads =================================================================== --- sem_util.ads (revision 190155) +++ sem_util.ads (working copy) @@ -1477,6 +1477,10 @@ function Subprogram_Access_Level (Subp : Entity_Id) return Uint; -- Return the accessibility level of the view denoted by Subp + function Support_Atomic_Primitives (Typ : Entity_Id) return Boolean; + -- Return True if Typ supports the GCC built-in atomic operations (i.e. if + -- Typ is properly sized and aligned). + procedure Trace_Scope (N : Node_Id; E : Entity_Id; Msg : String); -- Print debugging information on entry to each unit being analyzed Index: system-vms_64.ads =================================================================== --- system-vms_64.ads (revision 190155) +++ system-vms_64.ads (working copy) @@ -150,7 +150,6 @@ Stack_Check_Probes : constant Boolean := True; Stack_Check_Limits : constant Boolean := False; Support_Aggregates : constant Boolean := True; - Support_Atomic_Primitives : constant Boolean := False; Support_Composite_Assign : constant Boolean := True; Support_Composite_Compare : constant Boolean := True; Support_Long_Shifts : constant Boolean := True; Index: sem_attr.adb =================================================================== --- sem_attr.adb (revision 190159) +++ sem_attr.adb (working copy) @@ -2573,6 +2573,15 @@ Set_Etype (N, RTE (RE_AST_Handler)); end AST_Entry; + ----------------------------- + -- Atomic_Always_Lock_Free -- + ----------------------------- + + when Attribute_Atomic_Always_Lock_Free => + Check_E0; + Check_Type; + Set_Etype (N, Standard_Boolean); + ---------- -- Base -- ---------- @@ -5956,6 +5965,13 @@ return; end if; + -- For Lock_Free, we apply the attribute to the type of the object. + -- This is allowed since we have already verified that the type is a + -- protected type. + + elsif Id = Attribute_Lock_Free then + P_Entity := Etype (P); + -- No other attributes for objects are folded else @@ -6021,17 +6037,22 @@ -- Definite must be folded if the prefix is not a generic type, -- that is to say if we are within an instantiation. Same processing - -- applies to the GNAT attributes Has_Discriminants, Type_Class, - -- Has_Tagged_Value, and Unconstrained_Array. + -- applies to the GNAT attributes Atomic_Always_Lock_Free, + -- Has_Discriminants, Lock_Free, Type_Class, Has_Tagged_Value, and + -- Unconstrained_Array. - elsif (Id = Attribute_Definite + elsif (Id = Attribute_Atomic_Always_Lock_Free or else + Id = Attribute_Definite + or else Id = Attribute_Has_Access_Values or else Id = Attribute_Has_Discriminants or else Id = Attribute_Has_Tagged_Values or else + Id = Attribute_Lock_Free + or else Id = Attribute_Type_Class or else Id = Attribute_Unconstrained_Array @@ -6136,23 +6157,28 @@ -- since we can't do anything with unconstrained arrays. In addition, -- only the First, Last and Length attributes are possibly static. - -- Definite, Has_Access_Values, Has_Discriminants, Has_Tagged_Values, - -- Type_Class, and Unconstrained_Array are again exceptions, because - -- they apply as well to unconstrained types. + -- Atomic_Always_Lock_Free, Definite, Has_Access_Values, + -- Has_Discriminants, Has_Tagged_Values, Lock_Free, Type_Class, and + -- Unconstrained_Array are again exceptions, because they apply as well + -- to unconstrained types. -- In addition Component_Size is an exception since it is possibly -- foldable, even though it is never static, and it does apply to -- unconstrained arrays. Furthermore, it is essential to fold this -- in the packed case, since otherwise the value will be incorrect. - elsif Id = Attribute_Definite + elsif Id = Attribute_Atomic_Always_Lock_Free or else + Id = Attribute_Definite + or else Id = Attribute_Has_Access_Values or else Id = Attribute_Has_Discriminants or else Id = Attribute_Has_Tagged_Values or else + Id = Attribute_Lock_Free + or else Id = Attribute_Type_Class or else Id = Attribute_Unconstrained_Array @@ -6381,6 +6407,30 @@ null; end if; + ----------------------------- + -- Atomic_Always_Lock_Free -- + ----------------------------- + + -- Atomic_Always_Lock_Free attribute is a Boolean, thus no need to fold + -- here. + + when Attribute_Atomic_Always_Lock_Free => Atomic_Always_Lock_Free : + declare + V : constant Entity_Id := + Boolean_Literals + (Support_Atomic_Primitives_On_Target + and then Support_Atomic_Primitives (P_Type)); + + begin + Rewrite (N, New_Occurrence_Of (V, Loc)); + + -- Analyze and resolve as boolean. Note that this attribute is a + -- static attribute in GNAT. + + Analyze_And_Resolve (N, Standard_Boolean); + Static := True; + end Atomic_Always_Lock_Free; + --------- -- Bit -- --------- @@ -6801,11 +6851,19 @@ -- Lock_Free -- --------------- - -- Lock_Free attribute is a Boolean, thus no need to fold here. + when Attribute_Lock_Free => Lock_Free : declare + V : constant Entity_Id := Boolean_Literals (Uses_Lock_Free (P_Type)); - when Attribute_Lock_Free => - null; + begin + Rewrite (N, New_Occurrence_Of (V, Loc)); + -- Analyze and resolve as boolean. Note that this attribute is a + -- static attribute in GNAT. + + Analyze_And_Resolve (N, Standard_Boolean); + Static := True; + end Lock_Free; + ---------- -- Last -- ---------- Index: system-vxworks-sparcv9.ads =================================================================== --- system-vxworks-sparcv9.ads (revision 190155) +++ system-vxworks-sparcv9.ads (working copy) @@ -147,7 +147,6 @@ Stack_Check_Probes : constant Boolean := False; Stack_Check_Limits : constant Boolean := True; Support_Aggregates : constant Boolean := True; - Support_Atomic_Primitives : constant Boolean := False; Support_Composite_Assign : constant Boolean := True; Support_Composite_Compare : constant Boolean := True; Support_Long_Shifts : constant Boolean := True; Index: system-linux-ppc.ads =================================================================== --- system-linux-ppc.ads (revision 190155) +++ system-linux-ppc.ads (working copy) @@ -140,7 +140,6 @@ Stack_Check_Probes : constant Boolean := True; Stack_Check_Limits : constant Boolean := False; Support_Aggregates : constant Boolean := True; - Support_Atomic_Primitives : constant Boolean := False; Support_Composite_Assign : constant Boolean := True; Support_Composite_Compare : constant Boolean := True; Support_Long_Shifts : constant Boolean := True; Index: system-aix64.ads =================================================================== --- system-aix64.ads (revision 190155) +++ system-aix64.ads (working copy) @@ -142,7 +142,6 @@ Stack_Check_Probes : constant Boolean := True; Stack_Check_Limits : constant Boolean := False; Support_Aggregates : constant Boolean := True; - Support_Atomic_Primitives : constant Boolean := False; Support_Composite_Assign : constant Boolean := True; Support_Composite_Compare : constant Boolean := True; Support_Long_Shifts : constant Boolean := True; Index: system-lynxos-ppc.ads =================================================================== --- system-lynxos-ppc.ads (revision 190155) +++ system-lynxos-ppc.ads (working copy) @@ -146,7 +146,6 @@ Stack_Check_Probes : constant Boolean := True; Stack_Check_Limits : constant Boolean := False; Support_Aggregates : constant Boolean := True; - Support_Atomic_Primitives : constant Boolean := False; Support_Composite_Assign : constant Boolean := True; Support_Composite_Compare : constant Boolean := True; Support_Long_Shifts : constant Boolean := True; Index: system-linux-sh4.ads =================================================================== --- system-linux-sh4.ads (revision 190155) +++ system-linux-sh4.ads (working copy) @@ -140,7 +140,6 @@ Stack_Check_Probes : constant Boolean := False; Stack_Check_Limits : constant Boolean := False; Support_Aggregates : constant Boolean := True; - Support_Atomic_Primitives : constant Boolean := False; Support_Composite_Assign : constant Boolean := True; Support_Composite_Compare : constant Boolean := True; Support_Long_Shifts : constant Boolean := True; Index: s-atopri.adb =================================================================== --- s-atopri.adb (revision 190160) +++ s-atopri.adb (working copy) @@ -37,7 +37,7 @@ function Lock_Free_Read_8 (Ptr : Address) return uint8 is begin - if Support_Atomic_Primitives then + if uint8'Atomic_Always_Lock_Free then return Atomic_Load_8 (Ptr, Acquire); else raise Program_Error; @@ -50,7 +50,7 @@ function Lock_Free_Read_16 (Ptr : Address) return uint16 is begin - if Support_Atomic_Primitives then + if uint16'Atomic_Always_Lock_Free then return Atomic_Load_16 (Ptr, Acquire); else raise Program_Error; @@ -63,7 +63,7 @@ function Lock_Free_Read_32 (Ptr : Address) return uint32 is begin - if Support_Atomic_Primitives then + if uint32'Atomic_Always_Lock_Free then return Atomic_Load_32 (Ptr, Acquire); else raise Program_Error; @@ -76,7 +76,7 @@ function Lock_Free_Read_64 (Ptr : Address) return uint64 is begin - if Support_Atomic_Primitives then + if uint64'Atomic_Always_Lock_Free then return Atomic_Load_64 (Ptr, Acquire); else raise Program_Error; @@ -97,7 +97,7 @@ begin if Expected /= Desired then - if Support_Atomic_Primitives then + if uint8'Atomic_Always_Lock_Free then Actual := Sync_Compare_And_Swap_8 (Ptr, Expected, Desired); else raise Program_Error; @@ -126,7 +126,7 @@ begin if Expected /= Desired then - if Support_Atomic_Primitives then + if uint16'Atomic_Always_Lock_Free then Actual := Sync_Compare_And_Swap_16 (Ptr, Expected, Desired); else raise Program_Error; @@ -155,7 +155,7 @@ begin if Expected /= Desired then - if Support_Atomic_Primitives then + if uint32'Atomic_Always_Lock_Free then Actual := Sync_Compare_And_Swap_32 (Ptr, Expected, Desired); else raise Program_Error; @@ -184,7 +184,7 @@ begin if Expected /= Desired then - if Support_Atomic_Primitives then + if uint64'Atomic_Always_Lock_Free then Actual := Sync_Compare_And_Swap_64 (Ptr, Expected, Desired); else raise Program_Error; Index: system-vxworks-ppc.ads =================================================================== --- system-vxworks-ppc.ads (revision 190155) +++ system-vxworks-ppc.ads (working copy) @@ -154,7 +154,6 @@ Stack_Check_Probes : constant Boolean := False; Stack_Check_Limits : constant Boolean := True; Support_Aggregates : constant Boolean := True; - Support_Atomic_Primitives : constant Boolean := False; Support_Composite_Assign : constant Boolean := True; Support_Composite_Compare : constant Boolean := True; Support_Long_Shifts : constant Boolean := True; Index: system-hpux.ads =================================================================== --- system-hpux.ads (revision 190155) +++ system-hpux.ads (working copy) @@ -132,7 +132,6 @@ Stack_Check_Probes : constant Boolean := True; Stack_Check_Limits : constant Boolean := False; Support_Aggregates : constant Boolean := True; - Support_Atomic_Primitives : constant Boolean := False; Support_Composite_Assign : constant Boolean := True; Support_Composite_Compare : constant Boolean := True; Support_Long_Shifts : constant Boolean := True; Index: system-darwin-ppc.ads =================================================================== --- system-darwin-ppc.ads (revision 190155) +++ system-darwin-ppc.ads (working copy) @@ -158,7 +158,6 @@ Stack_Check_Probes : constant Boolean := False; Stack_Check_Limits : constant Boolean := False; Support_Aggregates : constant Boolean := True; - Support_Atomic_Primitives : constant Boolean := False; Support_Composite_Assign : constant Boolean := True; Support_Composite_Compare : constant Boolean := True; Support_Long_Shifts : constant Boolean := True; Index: system-solaris-sparc.ads =================================================================== --- system-solaris-sparc.ads (revision 190155) +++ system-solaris-sparc.ads (working copy) @@ -132,7 +132,6 @@ Stack_Check_Probes : constant Boolean := True; Stack_Check_Limits : constant Boolean := False; Support_Aggregates : constant Boolean := True; - Support_Atomic_Primitives : constant Boolean := False; Support_Composite_Assign : constant Boolean := True; Support_Composite_Compare : constant Boolean := True; Support_Long_Shifts : constant Boolean := True; Index: system-vxworks-m68k.ads =================================================================== --- system-vxworks-m68k.ads (revision 190155) +++ system-vxworks-m68k.ads (working copy) @@ -145,7 +145,6 @@ Stack_Check_Probes : constant Boolean := False; Stack_Check_Limits : constant Boolean := True; Support_Aggregates : constant Boolean := True; - Support_Atomic_Primitives : constant Boolean := False; Support_Composite_Assign : constant Boolean := True; Support_Composite_Compare : constant Boolean := True; Support_Long_Shifts : constant Boolean := True; Index: snames.ads-tmpl =================================================================== --- snames.ads-tmpl (revision 190155) +++ snames.ads-tmpl (working copy) @@ -766,6 +766,7 @@ Name_Asm_Input : constant Name_Id := N + $; -- GNAT Name_Asm_Output : constant Name_Id := N + $; -- GNAT Name_AST_Entry : constant Name_Id := N + $; -- VMS + Name_Atomic_Always_Lock_Free : constant Name_Id := N + $; -- GNAT Name_Bit : constant Name_Id := N + $; -- GNAT Name_Bit_Order : constant Name_Id := N + $; Name_Bit_Position : constant Name_Id := N + $; -- GNAT @@ -1363,6 +1364,7 @@ Attribute_Asm_Input, Attribute_Asm_Output, Attribute_AST_Entry, + Attribute_Atomic_Always_Lock_Free, Attribute_Bit, Attribute_Bit_Order, Attribute_Bit_Position, Index: system-vxworks-mips.ads =================================================================== --- system-vxworks-mips.ads (revision 190155) +++ system-vxworks-mips.ads (working copy) @@ -145,7 +145,6 @@ Stack_Check_Probes : constant Boolean := False; Stack_Check_Limits : constant Boolean := True; Support_Aggregates : constant Boolean := True; - Support_Atomic_Primitives : constant Boolean := False; Support_Composite_Assign : constant Boolean := True; Support_Composite_Compare : constant Boolean := True; Support_Long_Shifts : constant Boolean := True; Index: system-linux-sparc.ads =================================================================== --- system-linux-sparc.ads (revision 190155) +++ system-linux-sparc.ads (working copy) @@ -130,7 +130,6 @@ Stack_Check_Probes : constant Boolean := True; Stack_Check_Limits : constant Boolean := False; Support_Aggregates : constant Boolean := True; - Support_Atomic_Primitives : constant Boolean := False; Support_Composite_Assign : constant Boolean := True; Support_Composite_Compare : constant Boolean := True; Support_Long_Shifts : constant Boolean := True; Index: system-aix.ads =================================================================== --- system-aix.ads (revision 190155) +++ system-aix.ads (working copy) @@ -142,7 +142,6 @@ Stack_Check_Probes : constant Boolean := True; Stack_Check_Limits : constant Boolean := False; Support_Aggregates : constant Boolean := True; - Support_Atomic_Primitives : constant Boolean := False; Support_Composite_Assign : constant Boolean := True; Support_Composite_Compare : constant Boolean := True; Support_Long_Shifts : constant Boolean := True;