Patchwork [Ada] Lock-free implementation of protected objects (PR ada/54125)

login
register
mail settings
Submitter Arnaud Charlet
Date Aug. 6, 2012, 8:12 a.m.
Message ID <20120806081250.GA14034@adacore.com>
Download mbox | patch
Permalink /patch/175293/
State New
Headers show

Comments

Arnaud Charlet - Aug. 6, 2012, 8:12 a.m.
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  <pucci@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.

Patch

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;