[multiple changes]
authorArnaud Charlet <charlet@gcc.gnu.org>
Thu, 23 Jan 2014 17:03:41 +0000 (18:03 +0100)
committerArnaud Charlet <charlet@gcc.gnu.org>
Thu, 23 Jan 2014 17:03:41 +0000 (18:03 +0100)
2014-01-23  Ed Schonberg  <schonberg@adacore.com>

* exp_util.adb (Make_Invqriant_Call): If type of expression is
a private extension, get invariant from base type.

2014-01-23  Robert Dewar  <dewar@adacore.com>

* sem_util.adb, sem_attr.adb: Minor reformatting.

2014-01-23  Robert Dewar  <dewar@adacore.com>

* opt.adb (Save_Opt_Config_Switches): Save SPARK_Mode_Pragma
(Restore_Opt_Config_Switches): Restore SPARK_Mode_Pragma.
* sem.adb (Semantics): Remove save/restore of
SPARK_Mode[_Pragma]. Not needed since already done in
Save/Restore_Opt_Config_Switches.

2014-01-23  Robert Dewar  <dewar@adacore.com>

* gnat_rm.texi, einfo.adb, einfo.ads, sem_prag.adb, gnat_ugn.texi,
freeze.adb, repinfo.adb, aspects.adb, aspects.ads, sem_ch13.adb:
Linker_Section enhancements.

From-SVN: r206992

16 files changed:
gcc/ada/ChangeLog
gcc/ada/aspects.adb
gcc/ada/aspects.ads
gcc/ada/einfo.adb
gcc/ada/einfo.ads
gcc/ada/exp_util.adb
gcc/ada/freeze.adb
gcc/ada/gnat_rm.texi
gcc/ada/gnat_ugn.texi
gcc/ada/opt.adb
gcc/ada/repinfo.adb
gcc/ada/sem.adb
gcc/ada/sem_attr.adb
gcc/ada/sem_ch13.adb
gcc/ada/sem_prag.adb
gcc/ada/sem_util.adb

index 14be35157876ce38542e9a210eef11928faf0881..ae2480e7ad60aafc5b1a442b8f1d3c09099ebbcd 100644 (file)
@@ -1,3 +1,26 @@
+2014-01-23  Ed Schonberg  <schonberg@adacore.com>
+
+       * exp_util.adb (Make_Invqriant_Call): If type of expression is
+       a private extension, get invariant from base type.
+
+2014-01-23  Robert Dewar  <dewar@adacore.com>
+
+       * sem_util.adb, sem_attr.adb: Minor reformatting.
+
+2014-01-23  Robert Dewar  <dewar@adacore.com>
+
+       * opt.adb (Save_Opt_Config_Switches): Save SPARK_Mode_Pragma
+       (Restore_Opt_Config_Switches): Restore SPARK_Mode_Pragma.
+       * sem.adb (Semantics): Remove save/restore of
+       SPARK_Mode[_Pragma]. Not needed since already done in
+       Save/Restore_Opt_Config_Switches.
+
+2014-01-23  Robert Dewar  <dewar@adacore.com>
+
+       * gnat_rm.texi, einfo.adb, einfo.ads, sem_prag.adb, gnat_ugn.texi,
+       freeze.adb, repinfo.adb, aspects.adb, aspects.ads, sem_ch13.adb:
+       Linker_Section enhancements.
+
 2014-01-23  Tristan Gingold  <gingold@adacore.com>
 
        * gnat_rm.texi: Minor editing.
index 64a239ad23d5764884a46076b688886e0b79e7e8..e3ff78d0bc08ef8b165541699197283d40e146f5 100644 (file)
@@ -516,6 +516,7 @@ package body Aspects is
     Aspect_Invariant                    => Aspect_Invariant,
     Aspect_Iterator_Element             => Aspect_Iterator_Element,
     Aspect_Link_Name                    => Aspect_Link_Name,
+    Aspect_Linker_Section               => Aspect_Linker_Section,
     Aspect_Lock_Free                    => Aspect_Lock_Free,
     Aspect_Machine_Radix                => Aspect_Machine_Radix,
     Aspect_No_Return                    => Aspect_No_Return,
index c5d76320ee380ff2963b654797ec286811878cbc..5b76f6a6562f58c41a26a50fd4b128a96810097b 100644 (file)
@@ -103,6 +103,7 @@ package Aspects is
       Aspect_Invariant,                     -- GNAT
       Aspect_Iterator_Element,
       Aspect_Link_Name,
+      Aspect_Linker_Section,                -- GNAT
       Aspect_Machine_Radix,
       Aspect_Object_Size,                   -- GNAT
       Aspect_Output,
@@ -325,6 +326,7 @@ package Aspects is
       Aspect_Invariant               => Expression,
       Aspect_Iterator_Element        => Name,
       Aspect_Link_Name               => Expression,
+      Aspect_Linker_Section          => Expression,
       Aspect_Machine_Radix           => Expression,
       Aspect_Object_Size             => Expression,
       Aspect_Output                  => Name,
@@ -420,6 +422,7 @@ package Aspects is
       Aspect_Invariant                    => Name_Invariant,
       Aspect_Iterator_Element             => Name_Iterator_Element,
       Aspect_Link_Name                    => Name_Link_Name,
+      Aspect_Linker_Section               => Name_Linker_Section,
       Aspect_Lock_Free                    => Name_Lock_Free,
       Aspect_Machine_Radix                => Name_Machine_Radix,
       Aspect_No_Return                    => Name_No_Return,
@@ -624,6 +627,7 @@ package Aspects is
       Aspect_Invariant                    => Always_Delay,
       Aspect_Iterator_Element             => Always_Delay,
       Aspect_Link_Name                    => Always_Delay,
+      Aspect_Linker_Section               => Always_Delay,
       Aspect_Lock_Free                    => Always_Delay,
       Aspect_No_Return                    => Always_Delay,
       Aspect_Output                       => Always_Delay,
index 88643b8ec943566e29d79dbfe3de95f680b85953..e0700595f841df147cfaeb8387eec24181326ed0 100644 (file)
@@ -249,6 +249,7 @@ package body Einfo is
 
    --    SPARK_Pragma                    Node32
 
+   --    Linker_Section_Pragma           Node33
    --    SPARK_Aux_Pragma                Node33
 
    --    Contract                        Node34
@@ -2387,6 +2388,13 @@ package body Einfo is
       return Node23 (Id);
    end Limited_View;
 
+   function Linker_Section_Pragma (Id : E) return N is
+   begin
+      pragma Assert
+        (Is_Type (Id) or else Is_Object (Id) or else Is_Subprogram (Id));
+      return Node33 (Id);
+   end Linker_Section_Pragma;
+
    function Lit_Indexes (Id : E) return E is
    begin
       pragma Assert (Is_Enumeration_Type (Id));
@@ -5095,6 +5103,14 @@ package body Einfo is
       Set_Node23 (Id, V);
    end Set_Limited_View;
 
+   procedure Set_Linker_Section_Pragma (Id : E; V : N) is
+   begin
+      pragma Assert (Is_Type (Id)
+        or else Ekind_In (Id, E_Constant, E_Variable)
+        or else Is_Subprogram (Id));
+      Set_Node33 (Id, V);
+   end Set_Linker_Section_Pragma;
+
    procedure Set_Lit_Indexes (Id : E; V : E) is
    begin
       pragma Assert (Is_Enumeration_Type (Id) and then Root_Type (Id) = Id);
@@ -9453,6 +9469,12 @@ package body Einfo is
               E_Package_Body                               =>
             Write_Str ("SPARK_Aux_Pragma");
 
+         when E_Constant                                   |
+              E_Variable                                   |
+              Subprogram_Kind                              |
+              Type_Kind                                    =>
+            Write_Str ("Linker_Section_Pragma");
+
          when others                                       =>
             Write_Str ("Field33??");
       end case;
index 75995743c04e4f9d3104c7accf2e11636ebee185..e43107bda0a50f23caa931a6fb6b0730fb6d708e 100644 (file)
@@ -1299,6 +1299,10 @@ package Einfo is
 --       If any of these items are present, then the flag Has_Gigi_Rep_Item is
 --       set, indicating that Gigi should search the chain.
 --
+--       Note that in the case of Linker_Section, this is set only for objects,
+--       and only for transitional use until the new Linker_Section_Pragma
+--       field is properly processed by the back end.
+--
 --       Other representation items are included in the chain so that error
 --       messages can easily locate the relevant nodes for posting errors.
 --       Note in particular that size clauses are defined only for this
@@ -1564,6 +1568,10 @@ package Einfo is
 --       If this flag is set, then Gigi should scan the rep item chain to
 --       process any of these items that appear. At least one such item will
 --       be present.
+--
+--       Note that in the case of Linker_Section, this is set only for objects,
+--       and only for transitional use until the new Linker_Section_Pragma
+--       field is properly processed by the back end.
 
 --    Has_Homonym (Flag56)
 --       Defined in all entities. Set if an entity has a homonym in the same
@@ -3055,7 +3063,14 @@ package Einfo is
 --       fide package with the limited-view list through the first_entity and
 --       first_private attributes. The elements of this list are the shadow
 --       entities created for the types and local packages that are declared
---       in a package appearing in a limited_with clause (Ada 2005: AI-50217)
+--       in a package appearing in a limited_with clause (Ada 2005: AI-50217).
+
+--    Linker_Section_Pragma (Node33)
+--       Present in constant, variable, type and subprogram entities. Points
+--       to a linker section pragma that applies to the entity, or is Empty if
+--       no such pragma applies. Note that for constants and variables, this
+--       field may be set as a result of a linker section pragma applied to the
+--       type of the object.
 
 --    Lit_Indexes (Node15)
 --       Defined in enumeration types and subtypes. Non-empty only for the
@@ -3906,9 +3921,9 @@ package Einfo is
 --       or a copy of the low bound of the index base type if not.
 
 --    Subprograms_For_Type (Node29)
---       Defined in all type entities, and in subprogram entities. This is used
---       to hold a list of subprogram entities for subprograms associated with
---       the type, linked through the Subprogram_List field of the subprogram
+--       Defined in all type and subprogram entities. This is used to hold
+--       a list of subprogram entities for subprograms associated with the
+--       type, linked through the Subprograms_For_Type field of the subprogram
 --       entity. Basically this is a way of multiplexing the single field to
 --       hold more than one entity (since we ran out of space in some type
 --       entities). This is currently used for Invariant_Procedure and also
@@ -5067,6 +5082,7 @@ package Einfo is
    --    Related_Expression                  (Node24)
    --    Current_Use_Clause                  (Node27)
    --    Subprograms_For_Type                (Node29)
+   --    Linker_Section_Pragma               (Node33)
 
    --    Depends_On_Private                  (Flag14)
    --    Discard_Names                       (Flag88)
@@ -5301,6 +5317,7 @@ package Einfo is
    --    Interface_Name                      (Node21)   (constants only)
    --    Related_Type                        (Node27)   (constants only)
    --    Initialization_Statements           (Node28)
+   --    Linker_Section_Pragma               (Node33)
    --    Has_Alignment_Clause                (Flag46)
    --    Has_Atomic_Components               (Flag86)
    --    Has_Biased_Representation           (Flag139)
@@ -5480,6 +5497,7 @@ package Einfo is
    --    Corresponding_Equality              (Node30)   (implicit /= only)
    --    Thunk_Entity                        (Node31)   (thunk case only)
    --    SPARK_Pragma                        (Node32)
+   --    Linker_Section_Pragma               (Node33)
    --    Contract                            (Node34)
    --    Body_Needed_For_SAL                 (Flag40)
    --    Elaboration_Entity_Required         (Flag174)
@@ -5633,6 +5651,7 @@ package Einfo is
    --    Last_Entity                         (Node20)
    --    Overridden_Operation                (Node26)
    --    Subprograms_For_Type                (Node29)
+   --    Linker_Section_Pragma               (Node33)
    --    Contract                            (Node34)
    --    Has_Invariants                      (Flag232)
    --    Has_Postconditions                  (Flag240)
@@ -5767,6 +5786,7 @@ package Einfo is
    --    Static_Initialization               (Node30)   (init_proc only)
    --    Thunk_Entity                        (Node31)   (thunk case only)
    --    SPARK_Pragma                        (Node32)
+   --    Linker_Section_Pragma               (Node33)
    --    Contract                            (Node34)
    --    Body_Needed_For_SAL                 (Flag40)
    --    Delay_Cleanups                      (Flag114)
@@ -6001,6 +6021,7 @@ package Einfo is
    --    Last_Assignment                     (Node26)
    --    Related_Type                        (Node27)
    --    Initialization_Statements           (Node28)
+   --    Linker_Section_Pragma               (Node33)
    --    Contract                            (Node34)
    --    Has_Alignment_Clause                (Flag46)
    --    Has_Atomic_Components               (Flag86)
@@ -6566,6 +6587,7 @@ package Einfo is
    function Last_Assignment                     (Id : E) return N;
    function Last_Entity                         (Id : E) return E;
    function Limited_View                        (Id : E) return E;
+   function Linker_Section_Pragma               (Id : E) return N;
    function Lit_Indexes                         (Id : E) return E;
    function Lit_Strings                         (Id : E) return E;
    function Low_Bound_Tested                    (Id : E) return B;
@@ -7192,6 +7214,7 @@ package Einfo is
    procedure Set_Last_Assignment                 (Id : E; V : N);
    procedure Set_Last_Entity                     (Id : E; V : E);
    procedure Set_Limited_View                    (Id : E; V : E);
+   procedure Set_Linker_Section_Pragma           (Id : E; V : N);
    procedure Set_Lit_Indexes                     (Id : E; V : E);
    procedure Set_Lit_Strings                     (Id : E; V : E);
    procedure Set_Low_Bound_Tested                (Id : E; V : B := True);
@@ -7960,6 +7983,7 @@ package Einfo is
    pragma Inline (Last_Assignment);
    pragma Inline (Last_Entity);
    pragma Inline (Limited_View);
+   pragma Inline (Linker_Section_Pragma);
    pragma Inline (Lit_Indexes);
    pragma Inline (Lit_Strings);
    pragma Inline (Low_Bound_Tested);
@@ -8386,6 +8410,7 @@ package Einfo is
    pragma Inline (Set_Last_Assignment);
    pragma Inline (Set_Last_Entity);
    pragma Inline (Set_Limited_View);
+   pragma Inline (Set_Linker_Section_Pragma);
    pragma Inline (Set_Lit_Indexes);
    pragma Inline (Set_Lit_Strings);
    pragma Inline (Set_Low_Bound_Tested);
index 1845a3b390d9d0497d1ca7a5f3d215f68432b0bf..f9a5818537afefe8a6db7c1afc1a674a79629ac0 100644 (file)
@@ -5566,11 +5566,12 @@ package body Exp_Util is
       Typ := Etype (Expr);
 
       --  Subtypes may be subject to invariants coming from their respective
-      --  base types.
+      --  base types. The subtype may be fully or partially private.
 
       if Ekind_In (Typ, E_Array_Subtype,
                         E_Private_Subtype,
-                        E_Record_Subtype)
+                        E_Record_Subtype,
+                        E_Record_Subtype_With_Private)
       then
          Typ := Base_Type (Typ);
       end if;
index 310511f5275515d129852f13df7eb1d01c23012d..952ea3f7c719cffe9e841d3f66077a330e22a65c 100644 (file)
@@ -2283,7 +2283,6 @@ package body Freeze is
                   --  Start of processing for Alias_Atomic_Check
 
                begin
-
                   --  If object size of component type isn't known, we cannot
                   --  be sure so we defer to the back end.
 
@@ -4046,6 +4045,19 @@ package body Freeze is
                   Set_Is_Public (E);
                end if;
 
+               --  For source objects that are not Imported and are library
+               --  level, if no linker section pragma was given inherit the
+               --  appropriate linker section from the corresponding type.
+
+               if Comes_From_Source (E)
+                 and then not Is_Imported (E)
+                 and then Is_Library_Level_Entity (E)
+                 and then No (Linker_Section_Pragma (E))
+               then
+                  Set_Linker_Section_Pragma
+                    (E, Linker_Section_Pragma (Etype (E)));
+               end if;
+
                --  For convention C objects of an enumeration type, warn if
                --  the size is not integer size and no explicit size given.
                --  Skip warning for Boolean, and Character, assume programmer
index 8ad73c59e21a3b8ec37f438214909f1090ec065d..210ed23fe632870491325d271226b6bfd56c8fac 100644 (file)
@@ -294,6 +294,7 @@ Implementation Defined Aspects
 * Aspect Initializes::
 * Aspect Inline_Always::
 * Aspect Invariant::
+* Aspect Linker_Section::
 * Aspect Object_Size::
 * Aspect Persistent_BSS::
 * Aspect Predicate::
@@ -4249,12 +4250,30 @@ pragma Linker_Section (
 @end smallexample
 
 @noindent
-@var{LOCAL_NAME} must refer to an object that is
+@var{LOCAL_NAME} must refer to an object, type, or subprogram that is
 declared at the library level. This pragma specifies the name of the
 linker section for the given entity. It is equivalent to
 @code{__attribute__((section))} in GNU C and causes @var{LOCAL_NAME} to
 be placed in the @var{static_string_EXPRESSION} section of the
 executable (assuming the linker doesn't rename the section).
+GNAT also provides an implementation defined aspect of the same name.
+
+In the case of specifying this aspect for a type, the effect is to
+specify the corresponding for all library level objects of the type which
+do not have an explicit linker section set. Note that this only applies to
+whole objects, not to components of composite objects.
+
+In the case of a subprogram, the linker section applies to all previously
+declared matching overloaded subprograms in the current declarative part
+which do not already have a linker section assigned. The linker section
+aspect is useful in this case for specifying different linker sections
+for different elements of such an overloaded set.
+
+Note that an empty string specifies that no linker section is specified.
+This is not quite the same as omitting the pragma or aspect, since it
+can be used to specify that one element of an overloaded set of subprograms
+has the default linker section, or that one object of a type for which a
+linker section is specified should has the default linker section.
 
 The compiler normally places library-level entities in standard sections
 depending on the class: procedures and functions generally go in the
@@ -4283,6 +4302,12 @@ package IO_Card is
   Port_B : Integer;
   pragma Volatile (Port_B);
   pragma Linker_Section (Port_B, ".bss.port_b");
+
+  type Port_Type is new Integer with Linker_Section => ".bss";
+  PA : Port_Type with Linker_Section => ".bss.PA";
+  PB : Port_Type; --  ends up in linker section ".bss"
+
+  procedure Q with Linker_Section => "Qsection";
 end IO_Card;
 @end smallexample
 
@@ -7631,6 +7656,7 @@ clause.
 * Aspect Initializes::
 * Aspect Inline_Always::
 * Aspect Invariant::
+* Aspect Linker_Section::
 * Aspect Lock_Free::
 * Aspect Object_Size::
 * Aspect Persistent_BSS::
@@ -7824,6 +7850,12 @@ This aspect is equivalent to pragma @code{Invariant}. It is a
 synonym for the language defined aspect @code{Type_Invariant} except
 that it is separately controllable using pragma @code{Assertion_Policy}.
 
+@node Aspect Linker_Section
+@unnumberedsec Aspect Linker_Section
+@findex Linker_Section
+@noindent
+This aspect is equivalent to an @code{Linker_Section} pragma.
+
 @node Aspect Lock_Free
 @unnumberedsec Aspect Lock_Free
 @findex Lock_Free
index ca9209cfe44399b0f22a6ffb08cfcbf0d0dfe3c8..11286ef0766cbb0e43ce572de76a00f019b27cba 100644 (file)
@@ -7430,7 +7430,12 @@ the @option{-gnatR} switch). For @option{-gnatR1} (which is the default,
 so @option{-gnatR} with no parameter has the same effect), size and alignment
 information is listed for declared array and record types. For
 @option{-gnatR2}, size and alignment information is listed for all
-declared types and objects. Finally @option{-gnatR3} includes symbolic
+declared types and objects. The @code{Linker_Section} is also listed for any
+entity for which the @code{Linker_Section} is set explicitly or implicitly (the
+latter case occurs for objects of a type for which a @code{Linker_Section}
+is set).
+
+Finally @option{-gnatR3} includes symbolic
 expressions for values that are computed at run time for
 variant records. These symbolic expressions have a mostly obvious
 format with #n being used to represent the value of the n'th
index 636829c5f0c9a2c3283584abf00d0915e2ab3dd1..20ecb4f5dea3cda93bf146c48459c56125d517af 100644 (file)
@@ -100,6 +100,7 @@ package body Opt is
       Polling_Required               := Save.Polling_Required;
       Short_Descriptors              := Save.Short_Descriptors;
       SPARK_Mode                     := Save.SPARK_Mode;
+      SPARK_Mode_Pragma              := Save.SPARK_Mode_Pragma;
       Use_VADS_Size                  := Save.Use_VADS_Size;
 
       --  Update consistently the value of Init_Or_Norm_Scalars. The value of
@@ -137,6 +138,7 @@ package body Opt is
       Save.Polling_Required               := Polling_Required;
       Save.Short_Descriptors              := Short_Descriptors;
       Save.SPARK_Mode                     := SPARK_Mode;
+      Save.SPARK_Mode_Pragma              := SPARK_Mode_Pragma;
       Save.Use_VADS_Size                  := Use_VADS_Size;
    end Save_Opt_Config_Switches;
 
index a907c7b9d18c6abe81ac64129a26864f4224a2c3..11b92e62c38a27c3193cc112aa893e2922bdb0af 100644 (file)
@@ -36,6 +36,7 @@ with Debug;   use Debug;
 with Einfo;   use Einfo;
 with Lib;     use Lib;
 with Namet;   use Namet;
+with Nlists;  use Nlists;
 with Opt;     use Opt;
 with Output;  use Output;
 with Sem_Aux; use Sem_Aux;
@@ -43,6 +44,7 @@ with Sinfo;   use Sinfo;
 with Sinput;  use Sinput;
 with Snames;  use Snames;
 with Stand;   use Stand;
+with Stringt; use Stringt;
 with Table;   use Table;
 with Uname;   use Uname;
 with Urealp;  use Urealp;
@@ -147,6 +149,10 @@ package body Repinfo is
    procedure List_Array_Info (Ent : Entity_Id; Bytes_Big_Endian : Boolean);
    --  List representation info for array type Ent
 
+   procedure List_Linker_Section (Ent : Entity_Id);
+   --  List linker section for Ent (caller has checked that Ent is an entity
+   --  for which the Linker_Section_Pragma field is defined).
+
    procedure List_Mechanisms (Ent : Entity_Id);
    --  List mechanism information for parameters of Ent, which is subprogram,
    --  subprogram type, or an entry or entry family.
@@ -352,8 +358,8 @@ package body Repinfo is
 
          if List_Representation_Info_Mechanisms
            and then (Is_Subprogram (Ent)
-                       or else Ekind (Ent) = E_Entry
-                       or else Ekind (Ent) = E_Entry_Family)
+                      or else Ekind (Ent) = E_Entry
+                      or else Ekind (Ent) = E_Entry_Family)
          then
             Need_Blank_Line := True;
             List_Mechanisms (Ent);
@@ -374,13 +380,16 @@ package body Repinfo is
                               and then Present (Full_View (E))))
               or else Debug_Flag_AA
             then
-               if Is_Subprogram (E)
-                       or else
-                     Ekind (E) = E_Entry
-                       or else
-                     Ekind (E) = E_Entry_Family
-                       or else
-                     Ekind (E) = E_Subprogram_Type
+               if Is_Subprogram (E) then
+                  List_Linker_Section (E);
+
+                  if List_Representation_Info_Mechanisms then
+                     List_Mechanisms (E);
+                  end if;
+
+               elsif Ekind_In (E, E_Entry,
+                                  E_Entry_Family,
+                                  E_Subprogram_Type)
                then
                   if List_Representation_Info_Mechanisms then
                      List_Mechanisms (E);
@@ -391,24 +400,28 @@ package body Repinfo is
                      List_Record_Info (E, Bytes_Big_Endian);
                   end if;
 
+                  List_Linker_Section (E);
+
                elsif Is_Array_Type (E) then
                   if List_Representation_Info >= 1 then
                      List_Array_Info (E, Bytes_Big_Endian);
                   end if;
 
+                  List_Linker_Section (E);
+
                elsif Is_Type (E) then
                   if List_Representation_Info >= 2 then
                      List_Type_Info (E);
+                     List_Linker_Section (E);
                   end if;
 
-               elsif Ekind (E) = E_Variable
-                       or else
-                     Ekind (E) = E_Constant
-                       or else
-                     Ekind (E) = E_Loop_Parameter
-                       or else
-                     Is_Formal (E)
-               then
+               elsif Ekind_In (E, E_Variable, E_Constant) then
+                  if List_Representation_Info >= 2 then
+                     List_Object_Info (E);
+                     List_Linker_Section (E);
+                  end if;
+
+               elsif Ekind (E) = E_Loop_Parameter or else Is_Formal (E) then
                   if List_Representation_Info >= 2 then
                      List_Object_Info (E);
                   end if;
@@ -425,17 +438,12 @@ package body Repinfo is
 
                --  Recurse into bodies
 
-               elsif Ekind (E) = E_Protected_Type
-                       or else
-                     Ekind (E) = E_Task_Type
-                       or else
-                     Ekind (E) = E_Subprogram_Body
-                       or else
-                     Ekind (E) = E_Package_Body
-                       or else
-                     Ekind (E) = E_Task_Body
-                       or else
-                     Ekind (E) = E_Protected_Body
+               elsif Ekind_In (E, E_Protected_Type,
+                                  E_Task_Type,
+                                  E_Subprogram_Body,
+                                  E_Package_Body,
+                                  E_Task_Body,
+                                  E_Protected_Body)
                then
                   List_Entities (E, Bytes_Big_Endian);
 
@@ -633,6 +641,34 @@ package body Repinfo is
       end if;
    end List_GCC_Expression;
 
+   -------------------------
+   -- List_Linker_Section --
+   -------------------------
+
+   procedure List_Linker_Section (Ent : Entity_Id) is
+      Arg : Node_Id;
+
+   begin
+      if Present (Linker_Section_Pragma (Ent)) then
+         Write_Str ("pragma Linker_Section (");
+         List_Name (Ent);
+         Write_Str (", """);
+
+         Arg :=
+           Last (Pragma_Argument_Associations (Linker_Section_Pragma (Ent)));
+
+         if Nkind (Arg) = N_Pragma_Argument_Association then
+            Arg := Expression (Arg);
+         end if;
+
+         pragma Assert (Nkind (Arg) = N_String_Literal);
+         String_To_Name_Buffer (Strval (Arg));
+         Write_Str (Name_Buffer (1 .. Name_Len));
+         Write_Str (""");");
+         Write_Eol;
+      end if;
+   end List_Linker_Section;
+
    ---------------------
    -- List_Mechanisms --
    ---------------------
index db462a4d9f2106fcc34819dfd19819f69a48df50..b6eb3fe4b1ee748f75cdad66e3f60f59c117727a 100644 (file)
@@ -1311,8 +1311,6 @@ package body Sem is
       S_Inside_A_Generic  : constant Boolean          := Inside_A_Generic;
       S_Outer_Gen_Scope   : constant Entity_Id        := Outer_Generic_Scope;
       S_Style_Check       : constant Boolean          := Style_Check;
-      S_SPARK_Mode        : constant SPARK_Mode_Type  := SPARK_Mode;
-      S_SPARK_Mode_Pragma : constant Node_Id          := SPARK_Mode_Pragma;
 
       Generic_Main : constant Boolean :=
                        Nkind (Unit (Cunit (Main_Unit)))
@@ -1512,8 +1510,6 @@ package body Sem is
       Inside_A_Generic     := S_Inside_A_Generic;
       Outer_Generic_Scope  := S_Outer_Gen_Scope;
       Style_Check          := S_Style_Check;
-      SPARK_Mode           := S_SPARK_Mode;
-      SPARK_Mode_Pragma    := S_SPARK_Mode_Pragma;
 
       Restore_Opt_Config_Switches (Save_Config_Switches);
 
index 413be90332ac13b086e3dabd22eb6cf026fb3ec8..1ce0d83429ebb08dbb8aa554f52813263d1f7d3c 100644 (file)
@@ -4525,8 +4525,9 @@ package body Sem_Attr is
            and then Is_Potentially_Unevaluated (N)
            and then not Is_Entity_Name (P)
          then
-            Error_Msg_N ("prefix that is potentially unevaluated must "
-               & "denote an entity", N);
+            Error_Msg_N
+              ("prefix that is potentially unevaluated must denote an entity",
+               N);
          end if;
 
          --  The attribute appears within a pre/postcondition, but refers to
index dbfc215378d6fd71bfffe1f10c0be26767c6b4ff..9c1c6984b42746b8596929fb2174721b648e2e85 100644 (file)
@@ -1633,10 +1633,11 @@ package body Sem_Ch13 is
                --  referring to the entity, and the second argument is the
                --  aspect definition expression.
 
-               --  Suppress/Unsuppress
+               --  Linker_Section/Suppress/Unsuppress
 
-               when Aspect_Suppress   |
-                    Aspect_Unsuppress =>
+               when Aspect_Linker_Section |
+                    Aspect_Suppress       |
+                    Aspect_Unsuppress     =>
 
                   Make_Aitem_Pragma
                     (Pragma_Argument_Associations => New_List (
@@ -7941,6 +7942,9 @@ package body Sem_Ch13 is
               Aspect_Value_Size     =>
             T := Any_Integer;
 
+         when Aspect_Linker_Section =>
+            T := Standard_String;
+
          when Aspect_Synchronization =>
             return;
 
index 1a847fd03d4751fe2e1809e54a16c9f1a4ff4cd1..cffae57dfc2d9467171240fc4ffb7128a0a24e26 100644 (file)
@@ -15545,7 +15545,11 @@ package body Sem_Prag is
          --      [Entity  =>]  LOCAL_NAME
          --      [Section =>]  static_string_EXPRESSION);
 
-         when Pragma_Linker_Section =>
+         when Pragma_Linker_Section => Linker_Section : declare
+            Arg : Node_Id;
+            Ent : Entity_Id;
+
+         begin
             GNAT_Pragma;
             Check_Arg_Order ((Name_Entity, Name_Section));
             Check_Arg_Count (2);
@@ -15554,25 +15558,69 @@ package body Sem_Prag is
             Check_Arg_Is_Library_Level_Local_Name (Arg1);
             Check_Arg_Is_Static_Expression (Arg2, Standard_String);
 
-            --  This pragma applies to objects and types
+            --  Check kind of entity
 
-            if not Is_Object (Entity (Get_Pragma_Arg (Arg1)))
-              and then not Is_Type (Entity (Get_Pragma_Arg (Arg1)))
-            then
-               Error_Pragma_Arg
-                 ("pragma% applies only to objects and types", Arg1);
-            end if;
+            Arg := Get_Pragma_Arg (Arg1);
+            Ent := Entity (Arg);
 
-            --  The only processing required is to link this item on to the
-            --  list of rep items for the given entity. This is accomplished
-            --  by the call to Rep_Item_Too_Late (when no error is detected
-            --  and False is returned).
+            case Ekind (Ent) is
 
-            if Rep_Item_Too_Late (Entity (Get_Pragma_Arg (Arg1)), N) then
-               return;
-            else
-               Set_Has_Gigi_Rep_Item (Entity (Get_Pragma_Arg (Arg1)));
-            end if;
+               --  Objects (constants and variables)
+
+               when E_Constant | E_Variable =>
+                  Set_Linker_Section_Pragma (Ent, N);
+
+                  --  For now, for objects, we also link onto the rep item
+                  --  chain and set the gigi rep item flag. This is here for
+                  --  transition purposes only. When the processing for the
+                  --  Linker_Section_Pragma field is completed, this can be
+                  --  removed, since it will no longer be used.
+
+                  --  This is accomplished by the call to Rep_Item_Too_Late
+                  --  (when no error is detected and False is returned).
+
+                  if not Rep_Item_Too_Late (Ent, N) then
+                     Set_Has_Gigi_Rep_Item (Ent);
+                  end if;
+
+               --  Types
+
+               when Type_Kind =>
+                  Set_Linker_Section_Pragma (Ent, N);
+
+               --  Subprograms
+
+               when Subprogram_Kind =>
+
+                  --  Aspect case, entity already set
+
+                  if From_Aspect_Specification (N) then
+                     Set_Linker_Section_Pragma
+                       (Entity (Corresponding_Aspect (N)), N);
+
+                  --  Pragma case, we must climb the homonym chain, but skip
+                  --  any for which the linker section is already set.
+
+                  else
+                     loop
+                        if No (Linker_Section_Pragma (Ent)) then
+                           Set_Linker_Section_Pragma (Ent, N);
+                        end if;
+
+                        Ent := Homonym (Ent);
+                        exit when No (Ent)
+                          or else Scope (Ent) /= Current_Scope;
+                     end loop;
+                  end if;
+
+               --  All other cases are illegal
+
+               when others =>
+                  Error_Pragma_Arg
+                    ("pragma% applies only to objects, subprograms, and types",
+                     Arg1);
+            end case;
+         end Linker_Section;
 
          ----------
          -- List --
index a315e5d1709656234a679eac0ac67bc2a3feb370..be59c9bd19738e997c5bd16cd7620501dbcc664c 100644 (file)
@@ -10249,48 +10249,6 @@ package body Sem_Util is
       end if;
    end Is_Partially_Initialized_Type;
 
-   --------------------------------
-   -- Is_Potentially_Unevaluated --
-   --------------------------------
-
-   function Is_Potentially_Unevaluated (N : Node_Id) return Boolean is
-      Par  : Node_Id;
-      Expr : Node_Id;
-
-   begin
-      Expr := N;
-      Par  := Parent (N);
-      while not Nkind_In (Par, N_If_Expression,
-                                N_Case_Expression,
-                                N_And_Then,
-                                N_Or_Else,
-                                N_In,
-                                N_Not_In)
-      loop
-         Expr := Par;
-         Par  := Parent (Par);
-         if Nkind (Par) not in N_Subexpr then
-            return False;
-         end if;
-      end loop;
-
-      if Nkind (Par) = N_If_Expression then
-         return Is_Elsif (Par) or else Expr /= First (Expressions (Par));
-
-      elsif Nkind (Par) = N_Case_Expression then
-         return Expr /= Expression (Par);
-
-      elsif Nkind_In (Par, N_And_Then, N_Or_Else) then
-         return Expr = Right_Opnd (Par);
-
-      elsif Nkind_In (Par, N_In, N_Not_In) then
-         return Expr /= Left_Opnd (Par);
-
-      else
-         return False;
-      end if;
-   end Is_Potentially_Unevaluated;
-
    ------------------------------------
    -- Is_Potentially_Persistent_Type --
    ------------------------------------
@@ -10355,6 +10313,49 @@ package body Sem_Util is
       end if;
    end Is_Potentially_Persistent_Type;
 
+   --------------------------------
+   -- Is_Potentially_Unevaluated --
+   --------------------------------
+
+   function Is_Potentially_Unevaluated (N : Node_Id) return Boolean is
+      Par  : Node_Id;
+      Expr : Node_Id;
+
+   begin
+      Expr := N;
+      Par  := Parent (N);
+      while not Nkind_In (Par, N_If_Expression,
+                                N_Case_Expression,
+                                N_And_Then,
+                                N_Or_Else,
+                                N_In,
+                                N_Not_In)
+      loop
+         Expr := Par;
+         Par  := Parent (Par);
+
+         if Nkind (Par) not in N_Subexpr then
+            return False;
+         end if;
+      end loop;
+
+      if Nkind (Par) = N_If_Expression then
+         return Is_Elsif (Par) or else Expr /= First (Expressions (Par));
+
+      elsif Nkind (Par) = N_Case_Expression then
+         return Expr /= Expression (Par);
+
+      elsif Nkind_In (Par, N_And_Then, N_Or_Else) then
+         return Expr = Right_Opnd (Par);
+
+      elsif Nkind_In (Par, N_In, N_Not_In) then
+         return Expr /= Left_Opnd (Par);
+
+      else
+         return False;
+      end if;
+   end Is_Potentially_Unevaluated;
+
    ---------------------------------
    -- Is_Protected_Self_Reference --
    ---------------------------------