diff options
author | charlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-02-08 09:27:17 +0000 |
---|---|---|
committer | charlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-02-08 09:27:17 +0000 |
commit | b55f7641b510c7fd06a7ff9dbb8c173a412f9d43 (patch) | |
tree | dc8537cde3046210d1bdc3d08b0d20cde3b64224 | |
parent | cff7d88e0f1e1289cbe11cbffe0b1372fed55389 (diff) | |
download | gcc-b55f7641b510c7fd06a7ff9dbb8c173a412f9d43.tar.gz |
2012-02-08 Robert Dewar <dewar@adacore.com>
* a-coinve.adb, sem_util.adb, sem_ch8.adb, a-cobove.adb,
a-convec.adb: Minor reformatting and code reorganization.
2012-02-08 Steve Baird <baird@adacore.com>
* sem_cat.adb (In_Preelaborated_Unit): A child
unit instantiation does not inherit preelaboration requirements
from its parent.
2012-02-08 Gary Dismukes <dismukes@adacore.com>
* aspects.ads (type Aspect_Id): Add Aspect_Simple_Storage_Pool.
(Impl_Defined_Aspects): Add entry for Aspect_Simple_Storage_Pool.
(Aspect_Argument): Add Name entry for Aspect_Simple_Storage_Pool.
(Aspect_Names): Add entry for Aspect_Simple_Storage_Pool.
* aspects.adb (Canonical_Aspect): Add entry for
Aspect_Simple_Storage_Pool.
* exp_attr.adb (Expand_N_Attribute_Reference): Handle case of
Attribute_Simple_Storage_Pool in the same way as Storage_Pool
(add conversion, analyze/resolve). For the Storage_Size attribute,
for the simple pool case, locate and use the simple pool type's
Storage_Size function (if any), otherwise evaluate to zero.
* exp_ch4.adb (Expand_N_Allocator): In the case of an allocator
for an access type with an associated simple storage pool,
locate and use the pool type's Allocate.
* exp_intr.adb (Expand_Unc_Deallocation): In the case where the
access type has a simple storage pool, locate the pool type's
Deallocate procedure (if present) and use it as the procedure
to call on the Free operation.
* freeze.adb (Freeze_Entity): In the case of a full type for
a private type defined with pragma Simple_Storage_Pool, check
that the full type is also appropriate for the pragma. For
a simple storage pool type, validate that the operations
Allocate, Deallocate (if present), and Storage_Size
(if present) are defined with appropriate expected profiles.
(Validate_Simple_Pool_Op_Formal): New procedure
(Validate_Simple_Pool_Operation): New procedure Add with and
use of Rtsfind.
* par-prag.adb: Add Pragma_Simple_Storage_Pool to case statement
(no action required).
* sem_attr.adb (Analyze_Attribute): For the case of the
Storage_Pool attribute, give a warning if the prefix type has an
associated simple storage pool, and rewrite the attribute as a
raise of Program_Error. In the case of the Simple_Storage_Pool
attribute, check that the prefix type has an associated simple
storage pool, and set the attribute type to the pool's type.
* sem_ch13.adb (Analyze_Aspect_Specifications): Add
Aspect_Simple_Storage_Pool case choice.
(Analyze_Attribute_Definition_Clause): Add
Aspect_Simple_Storage_Pool to case for Ignore_Rep_Clauses
(no action). Add handling for Simple_Storage_Pool attribute
definition, requiring the name to denote a simple storage pool
object.
(Check_Aspect_At_Freeze_Point): For a simple storage pool
aspect, set the type to that of the name specified for the aspect.
* sem_prag.adb (Analyze_Pragma): Add handling for pragma
Simple_Storage_Pool, requiring that it applies to a library-level
type declared in a package declaration that is a limited private
or limited record type.
* sem_res.adb (Resolve_Allocator): Flag an attempt to call a
build-in-place function in an allocator for an access type with
a simple storage pool as unsupported.
* snames.ads-tmpl: Add Name_Simple_Storage_Pool.
(type Attribute_Id): Add Attribute_Simple_Storage_Pool.
(type Pragma_Id): Add Pragma_Simple_Storage_Pool.
* snames.adb-tmpl (Get_Pragma_Id): Handle case of
Name_Simple_Storage_Pool.
(Is_Pragma_Name): Return True for Name_Simple_Storage_Pool.
2012-02-08 Cyrille Comar <comar@adacore.com>
* projects.texi: Clarify doc for interfaces.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@183997 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ada/ChangeLog | 75 | ||||
-rw-r--r-- | gcc/ada/a-cobove.adb | 13 | ||||
-rw-r--r-- | gcc/ada/a-coinve.adb | 8 | ||||
-rw-r--r-- | gcc/ada/a-convec.adb | 43 | ||||
-rwxr-xr-x | gcc/ada/aspects.adb | 1 | ||||
-rwxr-xr-x | gcc/ada/aspects.ads | 4 | ||||
-rw-r--r-- | gcc/ada/exp_attr.adb | 87 | ||||
-rw-r--r-- | gcc/ada/exp_ch4.adb | 25 | ||||
-rw-r--r-- | gcc/ada/exp_intr.adb | 30 | ||||
-rw-r--r-- | gcc/ada/freeze.adb | 276 | ||||
-rw-r--r-- | gcc/ada/par-prag.adb | 1 | ||||
-rw-r--r-- | gcc/ada/projects.texi | 20 | ||||
-rw-r--r-- | gcc/ada/sem_attr.adb | 37 | ||||
-rw-r--r-- | gcc/ada/sem_cat.adb | 13 | ||||
-rw-r--r-- | gcc/ada/sem_ch13.adb | 81 | ||||
-rw-r--r-- | gcc/ada/sem_ch8.adb | 13 | ||||
-rw-r--r-- | gcc/ada/sem_prag.adb | 60 | ||||
-rw-r--r-- | gcc/ada/sem_res.adb | 25 | ||||
-rw-r--r-- | gcc/ada/sem_util.adb | 8 | ||||
-rw-r--r-- | gcc/ada/snames.adb-tmpl | 5 | ||||
-rw-r--r-- | gcc/ada/snames.ads-tmpl | 3 |
21 files changed, 726 insertions, 102 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index dad7bcbe0e0..16cd2e91dd6 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,78 @@ +2012-02-08 Robert Dewar <dewar@adacore.com> + + * a-coinve.adb, sem_util.adb, sem_ch8.adb, a-cobove.adb, + a-convec.adb: Minor reformatting and code reorganization. + +2012-02-08 Steve Baird <baird@adacore.com> + + * sem_cat.adb (In_Preelaborated_Unit): A child + unit instantiation does not inherit preelaboration requirements + from its parent. + +2012-02-08 Gary Dismukes <dismukes@adacore.com> + + * aspects.ads (type Aspect_Id): Add Aspect_Simple_Storage_Pool. + (Impl_Defined_Aspects): Add entry for Aspect_Simple_Storage_Pool. + (Aspect_Argument): Add Name entry for Aspect_Simple_Storage_Pool. + (Aspect_Names): Add entry for Aspect_Simple_Storage_Pool. + * aspects.adb (Canonical_Aspect): Add entry for + Aspect_Simple_Storage_Pool. + * exp_attr.adb (Expand_N_Attribute_Reference): Handle case of + Attribute_Simple_Storage_Pool in the same way as Storage_Pool + (add conversion, analyze/resolve). For the Storage_Size attribute, + for the simple pool case, locate and use the simple pool type's + Storage_Size function (if any), otherwise evaluate to zero. + * exp_ch4.adb (Expand_N_Allocator): In the case of an allocator + for an access type with an associated simple storage pool, + locate and use the pool type's Allocate. + * exp_intr.adb (Expand_Unc_Deallocation): In the case where the + access type has a simple storage pool, locate the pool type's + Deallocate procedure (if present) and use it as the procedure + to call on the Free operation. + * freeze.adb (Freeze_Entity): In the case of a full type for + a private type defined with pragma Simple_Storage_Pool, check + that the full type is also appropriate for the pragma. For + a simple storage pool type, validate that the operations + Allocate, Deallocate (if present), and Storage_Size + (if present) are defined with appropriate expected profiles. + (Validate_Simple_Pool_Op_Formal): New procedure + (Validate_Simple_Pool_Operation): New procedure Add with and + use of Rtsfind. + * par-prag.adb: Add Pragma_Simple_Storage_Pool to case statement + (no action required). + * sem_attr.adb (Analyze_Attribute): For the case of the + Storage_Pool attribute, give a warning if the prefix type has an + associated simple storage pool, and rewrite the attribute as a + raise of Program_Error. In the case of the Simple_Storage_Pool + attribute, check that the prefix type has an associated simple + storage pool, and set the attribute type to the pool's type. + * sem_ch13.adb (Analyze_Aspect_Specifications): Add + Aspect_Simple_Storage_Pool case choice. + (Analyze_Attribute_Definition_Clause): Add + Aspect_Simple_Storage_Pool to case for Ignore_Rep_Clauses + (no action). Add handling for Simple_Storage_Pool attribute + definition, requiring the name to denote a simple storage pool + object. + (Check_Aspect_At_Freeze_Point): For a simple storage pool + aspect, set the type to that of the name specified for the aspect. + * sem_prag.adb (Analyze_Pragma): Add handling for pragma + Simple_Storage_Pool, requiring that it applies to a library-level + type declared in a package declaration that is a limited private + or limited record type. + * sem_res.adb (Resolve_Allocator): Flag an attempt to call a + build-in-place function in an allocator for an access type with + a simple storage pool as unsupported. + * snames.ads-tmpl: Add Name_Simple_Storage_Pool. + (type Attribute_Id): Add Attribute_Simple_Storage_Pool. + (type Pragma_Id): Add Pragma_Simple_Storage_Pool. + * snames.adb-tmpl (Get_Pragma_Id): Handle case of + Name_Simple_Storage_Pool. + (Is_Pragma_Name): Return True for Name_Simple_Storage_Pool. + +2012-02-08 Cyrille Comar <comar@adacore.com> + + * projects.texi: Clarify doc for interfaces. + 2012-02-07 Eric Botcazou <ebotcazou@adacore.com> * gcc-interface/Make-lang.in (GCC_LINKERFLAGS): New variable. diff --git a/gcc/ada/a-cobove.adb b/gcc/ada/a-cobove.adb index aaf69c31213..9148fa17454 100644 --- a/gcc/ada/a-cobove.adb +++ b/gcc/ada/a-cobove.adb @@ -939,8 +939,6 @@ package body Ada.Containers.Bounded_Vectors is Array_Type => Elements_Array, "<" => "<"); - -- Start of processing for Sort - begin if Container.Last <= Index_Type'First then return; @@ -2238,8 +2236,9 @@ package body Ada.Containers.Bounded_Vectors is ---------------------- procedure Reverse_Elements (Container : in out Vector) is - E : Elements_Array renames Container.Elements; - Idx, Jdx : Count_Type; + E : Elements_Array renames Container.Elements; + Idx : Count_Type; + Jdx : Count_Type; begin if Container.Length <= 1 then @@ -2251,9 +2250,9 @@ package body Ada.Containers.Bounded_Vectors is -- catch more things) instead of for element tampering (which will catch -- fewer things). It's true that the elements of this vector container -- could be safely moved around while (say) an iteration is taking place - -- (iteration only increments the busy counter), and so technically all - -- we would need here is a test for element tampering (indicated by the - -- lock counter), that's simply an artifact of our array-based + -- (iteration only increments the busy counter), and so technically + -- all we would need here is a test for element tampering (indicated + -- by the lock counter), that's simply an artifact of our array-based -- implementation. Logically Reverse_Elements requires a check for -- cursor tampering. diff --git a/gcc/ada/a-coinve.adb b/gcc/ada/a-coinve.adb index ef5389f95a3..326524cc2f1 100644 --- a/gcc/ada/a-coinve.adb +++ b/gcc/ada/a-coinve.adb @@ -1402,8 +1402,6 @@ package body Ada.Containers.Indefinite_Vectors is Array_Type => Elements_Array, "<" => Is_Less); - -- Start of processing for Sort - begin if Container.Last <= Index_Type'First then return; @@ -3432,9 +3430,9 @@ package body Ada.Containers.Indefinite_Vectors is -- catch more things) instead of for element tampering (which will catch -- fewer things). It's true that the elements of this vector container -- could be safely moved around while (say) an iteration is taking place - -- (iteration only increments the busy counter), and so technically all - -- we would need here is a test for element tampering (indicated by the - -- lock counter), that's simply an artifact of our array-based + -- (iteration only increments the busy counter), and so technically + -- all we would need here is a test for element tampering (indicated + -- by the lock counter), that's simply an artifact of our array-based -- implementation. Logically Reverse_Elements requires a check for -- cursor tampering. diff --git a/gcc/ada/a-convec.adb b/gcc/ada/a-convec.adb index 837c7832f53..729fead732c 100644 --- a/gcc/ada/a-convec.adb +++ b/gcc/ada/a-convec.adb @@ -1047,8 +1047,6 @@ package body Ada.Containers.Vectors is Array_Type => Elements_Array, "<" => "<"); - -- Start of processing for Sort - begin if Container.Last <= Index_Type'First then return; @@ -2994,9 +2992,9 @@ package body Ada.Containers.Vectors is -- catch more things) instead of for element tampering (which will catch -- fewer things). It's true that the elements of this vector container -- could be safely moved around while (say) an iteration is taking place - -- (iteration only increments the busy counter), and so technically all - -- we would need here is a test for element tampering (indicated by the - -- lock counter), that's simply an artifact of our array-based + -- (iteration only increments the busy counter), and so technically + -- all we would need here is a test for element tampering (indicated + -- by the lock counter), that's simply an artifact of our array-based -- implementation. Logically Reverse_Elements requires a check for -- cursor tampering. @@ -3006,22 +3004,22 @@ package body Ada.Containers.Vectors is end if; declare - I, J : Index_Type; - E : Elements_Type renames Container.Elements.all; + K : Index_Type; + J : Index_Type; + E : Elements_Type renames Container.Elements.all; begin - I := Index_Type'First; + K := Index_Type'First; J := Container.Last; - while I < J loop + while K < J loop declare - EI : constant Element_Type := E.EA (I); - + EK : constant Element_Type := E.EA (K); begin - E.EA (I) := E.EA (J); - E.EA (J) := EI; + E.EA (K) := E.EA (J); + E.EA (J) := EK; end; - I := I + 1; + K := K + 1; J := J - 1; end loop; end; @@ -3116,12 +3114,12 @@ package body Ada.Containers.Vectors is Count : constant Count_Type'Base := Container.Length - Length; begin - -- Set_Length allows the user to set the length explicitly, instead of - -- implicitly as a side-effect of deletion or insertion. If the + -- Set_Length allows the user to set the length explicitly, instead + -- of implicitly as a side-effect of deletion or insertion. If the -- requested length is less then the current length, this is equivalent -- to deleting items from the back end of the vector. If the requested - -- length is greater than the current length, then this is equivalent to - -- inserting "space" (nonce items) at the end. + -- length is greater than the current length, then this is equivalent + -- to inserting "space" (nonce items) at the end. if Count >= 0 then Container.Delete_Last (Count); @@ -3360,6 +3358,7 @@ package body Ada.Containers.Vectors is end if; elsif Index_Type'First <= 0 then + -- Here we can compute Last directly, in the normal way. We know that -- No_Index is less than 0, so there is no danger of overflow when -- adding the (positive) value of Length. @@ -3440,13 +3439,11 @@ package body Ada.Containers.Vectors is begin if Position.Container = null then raise Constraint_Error with "Position cursor has no element"; - end if; - - if Position.Container /= Container'Unrestricted_Access then + elsif Position.Container /= Container'Unrestricted_Access then raise Program_Error with "Position cursor denotes wrong container"; + else + Update_Element (Container, Position.Index, Process); end if; - - Update_Element (Container, Position.Index, Process); end Update_Element; ----------- diff --git a/gcc/ada/aspects.adb b/gcc/ada/aspects.adb index a0105d9433b..d78ce81427a 100755 --- a/gcc/ada/aspects.adb +++ b/gcc/ada/aspects.adb @@ -298,6 +298,7 @@ package body Aspects is Aspect_Remote_Access_Type => Aspect_Remote_Access_Type, Aspect_Read => Aspect_Read, Aspect_Shared => Aspect_Atomic, + Aspect_Simple_Storage_Pool => Aspect_Simple_Storage_Pool, Aspect_Size => Aspect_Size, Aspect_Small => Aspect_Small, Aspect_Static_Predicate => Aspect_Predicate, diff --git a/gcc/ada/aspects.ads b/gcc/ada/aspects.ads index 187b6451a78..bb713a42758 100755 --- a/gcc/ada/aspects.ads +++ b/gcc/ada/aspects.ads @@ -74,6 +74,7 @@ package Aspects is Aspect_Predicate, -- GNAT Aspect_Priority, Aspect_Read, + Aspect_Simple_Storage_Pool, -- GNAT Aspect_Size, Aspect_Small, Aspect_Static_Predicate, @@ -186,6 +187,7 @@ package Aspects is Aspect_Pure_Function => True, Aspect_Remote_Access_Type => True, Aspect_Shared => True, + Aspect_Simple_Storage_Pool => True, Aspect_Suppress_Debug_Info => True, Aspect_Test_Case => True, Aspect_Universal_Data => True, @@ -277,6 +279,7 @@ package Aspects is Aspect_Predicate => Expression, Aspect_Priority => Expression, Aspect_Read => Name, + Aspect_Simple_Storage_Pool => Name, Aspect_Size => Expression, Aspect_Small => Expression, Aspect_Static_Predicate => Expression, @@ -364,6 +367,7 @@ package Aspects is Aspect_Remote_Types => Name_Remote_Types, Aspect_Shared => Name_Shared, Aspect_Shared_Passive => Name_Shared_Passive, + Aspect_Simple_Storage_Pool => Name_Simple_Storage_Pool, Aspect_Size => Name_Size, Aspect_Small => Name_Small, Aspect_Static_Predicate => Name_Static_Predicate, diff --git a/gcc/ada/exp_attr.adb b/gcc/ada/exp_attr.adb index 14d9da1609a..a2651545871 100644 --- a/gcc/ada/exp_attr.adb +++ b/gcc/ada/exp_attr.adb @@ -6,7 +6,7 @@ -- -- -- B o d y -- -- -- --- Copyright (C) 1992-2011, Free Software Foundation, Inc. -- +-- Copyright (C) 1992-2012, Free Software Foundation, Inc. -- -- -- -- GNAT is free software; you can redistribute it and/or modify it under -- -- terms of the GNU General Public License as published by the Free Soft- -- @@ -4217,6 +4217,17 @@ package body Exp_Attr is when Attribute_Scaling => Expand_Fpt_Attribute_RI (N); + ------------------------- + -- Simple_Storage_Pool -- + ------------------------- + + when Attribute_Simple_Storage_Pool => + Rewrite (N, + Make_Type_Conversion (Loc, + Subtype_Mark => New_Reference_To (Etype (N), Loc), + Expression => New_Reference_To (Entity (N), Loc))); + Analyze_And_Resolve (N, Typ); + ---------- -- Size -- ---------- @@ -4475,7 +4486,10 @@ package body Exp_Attr is -- Storage_Size -- ------------------ - when Attribute_Storage_Size => Storage_Size : begin + when Attribute_Storage_Size => Storage_Size : declare + Alloc_Op : Entity_Id := Empty; + + begin -- Access type case, always go to the root type @@ -4497,19 +4511,64 @@ package body Exp_Attr is (Storage_Size_Variable (Root_Type (Ptyp)), Loc))))); elsif Present (Associated_Storage_Pool (Root_Type (Ptyp))) then - Rewrite (N, - OK_Convert_To (Typ, - Make_Function_Call (Loc, - Name => - New_Reference_To - (Find_Prim_Op - (Etype (Associated_Storage_Pool (Root_Type (Ptyp))), - Attribute_Name (N)), - Loc), - Parameter_Associations => New_List ( - New_Reference_To - (Associated_Storage_Pool (Root_Type (Ptyp)), Loc))))); + -- If the access type is associated with a simple storage pool + -- object, then attempt to locate the optional Storage_Size + -- function of the simple storage pool type. If not found, + -- then the result will default to zero. + + if Present (Get_Rep_Pragma (Root_Type (Ptyp), + Name_Simple_Storage_Pool)) + then + declare + Pool_Type : constant Entity_Id := + Base_Type (Etype (Entity (N))); + + begin + Alloc_Op := Get_Name_Entity_Id (Name_Storage_Size); + while Present (Alloc_Op) loop + if Scope (Alloc_Op) = Scope (Pool_Type) + and then Present (First_Formal (Alloc_Op)) + and then Etype (First_Formal (Alloc_Op)) = Pool_Type + then + exit; + end if; + + Alloc_Op := Homonym (Alloc_Op); + end loop; + end; + + -- In the normal Storage_Pool case, retrieve the primitive + -- function associated with the pool type. + + else + Alloc_Op := + Find_Prim_Op + (Etype (Associated_Storage_Pool (Root_Type (Ptyp))), + Attribute_Name (N)); + end if; + + -- If Storage_Size wasn't found (can only occur in the simple + -- storage pool case), then simply use zero for the result. + + if not Present (Alloc_Op) then + Rewrite (N, Make_Integer_Literal (Loc, 0)); + + -- Otherwise, rewrite the allocator as a call to pool type's + -- Storage_Size function. + + else + Rewrite (N, + OK_Convert_To (Typ, + Make_Function_Call (Loc, + Name => + New_Reference_To (Alloc_Op, Loc), + + Parameter_Associations => New_List ( + New_Reference_To + (Associated_Storage_Pool + (Root_Type (Ptyp)), Loc))))); + end if; else Rewrite (N, Make_Integer_Literal (Loc, 0)); diff --git a/gcc/ada/exp_ch4.adb b/gcc/ada/exp_ch4.adb index b0a65cf92da..605de764254 100644 --- a/gcc/ada/exp_ch4.adb +++ b/gcc/ada/exp_ch4.adb @@ -3565,6 +3565,31 @@ package body Exp_Ch4 is Set_Procedure_To_Call (N, RTE (RE_SS_Allocate)); end if; + -- In the case of an allocator for a simple storage pool, locate + -- and save a reference to the pool type's Allocate routine. + + elsif Present (Get_Rep_Pragma + (Etype (Pool), Name_Simple_Storage_Pool)) + then + declare + Alloc_Op : Entity_Id := Get_Name_Entity_Id (Name_Allocate); + Pool_Type : constant Entity_Id := Base_Type (Etype (Pool)); + + begin + while Present (Alloc_Op) loop + if Scope (Alloc_Op) = Scope (Pool_Type) + and then Present (First_Formal (Alloc_Op)) + and then Etype (First_Formal (Alloc_Op)) = Pool_Type + then + Set_Procedure_To_Call (N, Alloc_Op); + + exit; + end if; + + Alloc_Op := Homonym (Alloc_Op); + end loop; + end; + elsif Is_Class_Wide_Type (Etype (Pool)) then Set_Procedure_To_Call (N, RTE (RE_Allocate_Any)); diff --git a/gcc/ada/exp_intr.adb b/gcc/ada/exp_intr.adb index b116a8a28f0..2707d7a2a06 100644 --- a/gcc/ada/exp_intr.adb +++ b/gcc/ada/exp_intr.adb @@ -6,7 +6,7 @@ -- -- -- B o d y -- -- -- --- Copyright (C) 1992-2011, Free Software Foundation, Inc. -- +-- Copyright (C) 1992-2012, Free Software Foundation, Inc. -- -- -- -- GNAT is free software; you can redistribute it and/or modify it under -- -- terms of the GNU General Public License as published by the Free Soft- -- @@ -1084,6 +1084,34 @@ package body Exp_Intr is if Is_RTE (Pool, RE_SS_Pool) then null; + -- If the pool object is of a simple storage pool type, then attempt + -- to locate the type's Deallocate procedure, if any, and set the + -- free operation's procedure to call. If the type doesn't have a + -- Deallocate (which is allowed), then the actual will simply be set + -- to null. + + elsif Present (Get_Rep_Pragma + (Etype (Pool), Name_Simple_Storage_Pool)) + then + declare + Dealloc_Op : Entity_Id := Get_Name_Entity_Id (Name_Deallocate); + Pool_Type : constant Entity_Id := Base_Type (Etype (Pool)); + + begin + while Present (Dealloc_Op) loop + if Scope (Dealloc_Op) = Scope (Pool_Type) + and then Present (First_Formal (Dealloc_Op)) + and then Etype (First_Formal (Dealloc_Op)) = Pool_Type + then + Set_Procedure_To_Call (Free_Node, Dealloc_Op); + + exit; + end if; + + Dealloc_Op := Homonym (Dealloc_Op); + end loop; + end; + -- Case of a class-wide pool type: make a dispatching call to -- Deallocate through the class-wide Deallocate_Any. diff --git a/gcc/ada/freeze.adb b/gcc/ada/freeze.adb index 9138c3ea879..9d3dd171bb9 100644 --- a/gcc/ada/freeze.adb +++ b/gcc/ada/freeze.adb @@ -42,6 +42,7 @@ with Nmake; use Nmake; with Opt; use Opt; with Restrict; use Restrict; with Rident; use Rident; +with Rtsfind; use Rtsfind; with Sem; use Sem; with Sem_Aux; use Sem_Aux; with Sem_Cat; use Sem_Cat; @@ -4103,6 +4104,281 @@ package body Freeze is end loop; end; end if; + + -- If the type is a simple storage pool type, then this is where + -- we attempt to locate and validate its Allocate, Deallocate, and + -- Storage_Size operations (the first is required, and the latter + -- two are optional). We also verify that the full type for a + -- private type is allowed to be a simple storage pool type. + + if Present (Get_Rep_Pragma (E, Name_Simple_Storage_Pool)) + and then (Is_Base_Type (E) or else Has_Private_Declaration (E)) + then + + -- If the type is marked Has_Private_Declaration, then this is + -- a full type for a private type that was specified with the + -- pragma Simple_Storage_Pool, and here we ensure that the + -- pragma is allowed for the full type (for example, it can't + -- be an array type, or a nonlimited record type). + + if Has_Private_Declaration (E) then + if (not Is_Record_Type (E) + or else not Is_Immutably_Limited_Type (E)) + and then not Is_Private_Type (E) + then + Error_Msg_Name_1 := Name_Simple_Storage_Pool; + + Error_Msg_N + ("pragma% can only apply to full type that is an " & + "explicitly limited type", E); + end if; + end if; + + Validate_Simple_Pool_Ops : declare + Pool_Type : Entity_Id renames E; + Address_Type : constant Entity_Id := RTE (RE_Address); + Stg_Cnt_Type : constant Entity_Id := RTE (RE_Storage_Count); + + procedure Validate_Simple_Pool_Op_Formal + (Pool_Op : Entity_Id; + Pool_Op_Formal : in out Entity_Id; + Expected_Mode : Formal_Kind; + Expected_Type : Entity_Id; + Formal_Name : String; + OK_Formal : in out Boolean); + -- Validate one formal Pool_Op_Formal of the candidate pool + -- operation Pool_Op. The formal must be of Expected_Type + -- and have mode Expected_Mode. OK_Formal will be set to + -- False if the formal doesn't match. If OK_Formal is False + -- on entry, then the formal will effectively be ignored + -- (because validation of the pool op has already failed). + -- Upon return, Pool_Op_Formal will be updated to the next + -- formal, if any. + + procedure Validate_Simple_Pool_Operation (Op_Name : Name_Id); + -- Search for and validate a simple pool operation with the + -- name Op_Name. If the name is Allocate, then there must be + -- exactly one such primitive operation for the simple pool + -- type. If the name is Deallocate or Storage_Size, then + -- there can be at most one such primitive operation. The + -- profile of the located primitive must conform to what + -- is expected for each operation. + + ------------------------------------ + -- Validate_Simple_Pool_Op_Formal -- + ------------------------------------ + + procedure Validate_Simple_Pool_Op_Formal + (Pool_Op : Entity_Id; + Pool_Op_Formal : in out Entity_Id; + Expected_Mode : Formal_Kind; + Expected_Type : Entity_Id; + Formal_Name : String; + OK_Formal : in out Boolean) + is + begin + -- If OK_Formal is False on entry, then simply ignore + -- the formal, because an earlier formal has already + -- been flagged. + + if not OK_Formal then + return; + + -- If no formal is passed in, then issue an error for a + -- missing formal. + + elsif not Present (Pool_Op_Formal) then + Error_Msg_NE + ("simple storage pool op missing formal " & + Formal_Name & " of type&", Pool_Op, Expected_Type); + OK_Formal := False; + + return; + end if; + + if Etype (Pool_Op_Formal) /= Expected_Type then + -- If the pool type was expected for this formal, then + -- this will not be considered a candidate operation + -- for the simple pool, so we unset OK_Formal so that + -- the op and any later formals will be ignored. + + if Expected_Type = Pool_Type then + OK_Formal := False; + + return; + + else + Error_Msg_NE + ("wrong type for formal " & Formal_Name & + " of simple storage pool op; expected type&", + Pool_Op_Formal, Expected_Type); + end if; + end if; + + -- Issue error if formal's mode is not the expected one + + if Ekind (Pool_Op_Formal) /= Expected_Mode then + Error_Msg_N + ("wrong mode for formal of simple storage pool op", + Pool_Op_Formal); + end if; + + -- Advance to the next formal + + Next_Formal (Pool_Op_Formal); + end Validate_Simple_Pool_Op_Formal; + + ------------------------------------ + -- Validate_Simple_Pool_Operation -- + ------------------------------------ + + procedure Validate_Simple_Pool_Operation + (Op_Name : Name_Id) + is + Op : Entity_Id; + Found_Op : Entity_Id := Empty; + Formal : Entity_Id; + Is_OK : Boolean; + + begin + pragma Assert + (Op_Name = Name_Allocate + or else Op_Name = Name_Deallocate + or else Op_Name = Name_Storage_Size); + + Error_Msg_Name_1 := Op_Name; + + -- For each homonym declared immediately in the scope + -- of the simple storage pool type, determine whether + -- the homonym is an operation of the pool type, and, + -- if so, check that its profile is as expected for + -- a simple pool operation of that name. + + Op := Get_Name_Entity_Id (Op_Name); + while Present (Op) loop + if Ekind_In (Op, E_Function, E_Procedure) + and then Scope (Op) = Current_Scope + then + Formal := First_Entity (Op); + + Is_OK := True; + + -- The first parameter must be of the pool type + -- in order for the operation to qualify. + + if Op_Name = Name_Storage_Size then + Validate_Simple_Pool_Op_Formal + (Op, Formal, E_In_Parameter, Pool_Type, + "Pool", Is_OK); + + else + Validate_Simple_Pool_Op_Formal + (Op, Formal, E_In_Out_Parameter, Pool_Type, + "Pool", Is_OK); + end if; + + -- If another operation with this name has already + -- been located for the type, then flag an error, + -- since we only allow the type to have a single + -- such primitive. + + if Present (Found_Op) and then Is_OK then + Error_Msg_NE + ("only one % operation allowed for " & + "simple storage pool type&", Op, Pool_Type); + end if; + + -- In the case of Allocate and Deallocate, a formal + -- of type System.Address is required. + + if Op_Name = Name_Allocate then + Validate_Simple_Pool_Op_Formal + (Op, Formal, E_Out_Parameter, + Address_Type, "Storage_Address", Is_OK); + + elsif Op_Name = Name_Deallocate then + Validate_Simple_Pool_Op_Formal + (Op, Formal, E_In_Parameter, + Address_Type, "Storage_Address", Is_OK); + end if; + + -- In the case of Allocate and Deallocate, formals + -- of type Storage_Count are required as the third + -- and fourth parameters. + + if Op_Name /= Name_Storage_Size then + Validate_Simple_Pool_Op_Formal + (Op, Formal, E_In_Parameter, + Stg_Cnt_Type, "Size_In_Storage_Units", Is_OK); + + Validate_Simple_Pool_Op_Formal + (Op, Formal, E_In_Parameter, + Stg_Cnt_Type, "Alignment", Is_OK); + end if; + + -- If no mismatched formals have been found (Is_OK) + -- and no excess formals are present, then this + -- operation has been validated, so record it. + + if not Present (Formal) and then Is_OK then + Found_Op := Op; + end if; + end if; + + Op := Homonym (Op); + end loop; + + -- There must be a valid Allocate operation for the type, + -- so issue an error if none was found. + + if Op_Name = Name_Allocate + and then not Present (Found_Op) + then + Error_Msg_N ("missing % operation for simple " & + "storage pool type", Pool_Type); + + elsif Present (Found_Op) then + -- Simple pool operations can't be abstract + + if Is_Abstract_Subprogram (Found_Op) then + Error_Msg_N + ("simple storage pool operation must not be " & + "abstract", Found_Op); + end if; + + -- The Storage_Size operation must be a function with + -- Storage_Count as its result type. + + if Op_Name = Name_Storage_Size then + if Ekind (Found_Op) = E_Procedure then + Error_Msg_N + ("% operation must be a function", Found_Op); + + elsif Etype (Found_Op) /= Stg_Cnt_Type then + Error_Msg_NE + ("wrong result type for%, expected type&", + Found_Op, Stg_Cnt_Type); + end if; + + -- Allocate and Deallocate must be procedures + + elsif Ekind (Found_Op) = E_Function then + Error_Msg_N + ("% operation must be a procedure", Found_Op); + end if; + end if; + end Validate_Simple_Pool_Operation; + + -- Start of processing for Validate_Simple_Pool_Ops + + begin + Validate_Simple_Pool_Operation (Name_Allocate); + + Validate_Simple_Pool_Operation (Name_Deallocate); + + Validate_Simple_Pool_Operation (Name_Storage_Size); + end Validate_Simple_Pool_Ops; + end if; end if; -- Now that all types from which E may depend are frozen, see if the diff --git a/gcc/ada/par-prag.adb b/gcc/ada/par-prag.adb index 328ddb63f16..6402ff4e880 100644 --- a/gcc/ada/par-prag.adb +++ b/gcc/ada/par-prag.adb @@ -1230,6 +1230,7 @@ begin Pragma_Shared_Passive | Pragma_Short_Circuit_And_Or | Pragma_Short_Descriptors | + Pragma_Simple_Storage_Pool | Pragma_Storage_Size | Pragma_Storage_Unit | Pragma_Static_Elaboration_Desired | diff --git a/gcc/ada/projects.texi b/gcc/ada/projects.texi index 8f9faad645f..88a623d4c31 100644 --- a/gcc/ada/projects.texi +++ b/gcc/ada/projects.texi @@ -1767,10 +1767,10 @@ language and takes a list of sources as parameter. @table @asis @item @b{Library_Interface}: @cindex @code{Library_Interface} - This attribute defines an explicit subset of the units of the project. - Projects importing this library project may only "with" units whose sources - are listed in the @code{Library_Interface}. Other sources are considered - implementation units. + This attribute defines an explicit subset of the units of the project. Units + from projects importing this library project may only "with" units whose + sources are listed in the @code{Library_Interface}. Other sources are + considered implementation units. @smallexample @c projectfile @group @@ -1781,11 +1781,13 @@ language and takes a list of sources as parameter. @end smallexample @item @b{Interfaces} - This attribute defnes an explicit subset of the source files of a project. - It may be used as a replacement for attribute @code{Library_Interface}. For - multi-language library projects, it is the only way to make the project a - Stand-Alone Library project and at the same time to reduce the non Ada - interfacing sources. + This attribute defines an explicit subset of the source files of a project. + Sources from projects importing this project, can only depend on sources from + this subset. This attribute can be used on non library projects. It can also + be used as a replacement for attribute @code{Library_Interface}, in which + case, units have to be replaced by source files. For multi-language library + projects, it is the only way to make the project a Stand-Alone Library project + whose interface is not purely Ada. @item @b{Library_Standalone}: @cindex @code{Library_Standalone} diff --git a/gcc/ada/sem_attr.adb b/gcc/ada/sem_attr.adb index a832612009b..aa798b00973 100644 --- a/gcc/ada/sem_attr.adb +++ b/gcc/ada/sem_attr.adb @@ -4528,7 +4528,8 @@ package body Sem_Attr is -- Storage_Pool -- ------------------ - when Attribute_Storage_Pool => Storage_Pool : + when Attribute_Storage_Pool | + Attribute_Simple_Storage_Pool => Storage_Pool : begin Check_E0; @@ -4546,7 +4547,38 @@ package body Sem_Attr is Set_Entity (N, RTE (RE_Global_Pool_Object)); end if; - Set_Etype (N, Class_Wide_Type (RTE (RE_Root_Storage_Pool))); + if Attr_Id = Attribute_Storage_Pool then + if Present (Get_Rep_Pragma (Etype (Entity (N)), + Name_Simple_Storage_Pool)) + then + Error_Msg_Name_1 := Aname; + Error_Msg_N ("cannot use % attribute for type with simple " & + "storage pool?", N); + Error_Msg_N + ("\Program_Error will be raised at run time?", N); + + Rewrite + (N, Make_Raise_Program_Error + (Sloc (N), Reason => PE_Explicit_Raise)); + end if; + + Set_Etype (N, Class_Wide_Type (RTE (RE_Root_Storage_Pool))); + + -- In the Simple_Storage_Pool case, verify that the pool entity is + -- actually of a simple storage pool type, and set the attribute's + -- type to the pool object's type. + + else + if not Present (Get_Rep_Pragma (Etype (Entity (N)), + Name_Simple_Storage_Pool)) + then + Error_Attr_P + ("cannot use % attribute for type without simple " & + "storage pool"); + end if; + + Set_Etype (N, Etype (Entity (N))); + end if; -- Validate_Remote_Access_To_Class_Wide_Type for attribute -- Storage_Pool since this attribute is not defined for such @@ -7931,6 +7963,7 @@ package body Sem_Attr is Attribute_Priority | Attribute_Read | Attribute_Result | + Attribute_Simple_Storage_Pool | Attribute_Storage_Pool | Attribute_Storage_Size | Attribute_Storage_Unit | diff --git a/gcc/ada/sem_cat.adb b/gcc/ada/sem_cat.adb index 91d731f14b2..cbb86c8efe0 100644 --- a/gcc/ada/sem_cat.adb +++ b/gcc/ada/sem_cat.adb @@ -486,11 +486,22 @@ package body Sem_Cat is --------------------------- function In_Preelaborated_Unit return Boolean is - Unit_Entity : constant Entity_Id := Current_Scope; + Unit_Entity : Entity_Id := Current_Scope; Unit_Kind : constant Node_Kind := Nkind (Unit (Cunit (Current_Sem_Unit))); begin + -- If evaluating actuals for a child unit instantiation, then ignore + -- the preelaboration status of the parent; use the child instead. + + if Is_Compilation_Unit (Unit_Entity) + and then Unit_Kind in N_Generic_Instantiation + and then not In_Same_Source_Unit (Unit_Entity, + Cunit (Current_Sem_Unit)) + then + Unit_Entity := Cunit_Entity (Current_Sem_Unit); + end if; + -- There are no constraints on the body of Remote_Call_Interface or -- Remote_Types packages. diff --git a/gcc/ada/sem_ch13.adb b/gcc/ada/sem_ch13.adb index 502bc13c8ea..5fe669d51f2 100644 --- a/gcc/ada/sem_ch13.adb +++ b/gcc/ada/sem_ch13.adb @@ -1064,23 +1064,24 @@ package body Sem_Ch13 is -- Aspects corresponding to attribute definition clauses - when Aspect_Address | - Aspect_Alignment | - Aspect_Bit_Order | - Aspect_Component_Size | - Aspect_External_Tag | - Aspect_Input | - Aspect_Machine_Radix | - Aspect_Object_Size | - Aspect_Output | - Aspect_Read | - Aspect_Size | - Aspect_Small | - Aspect_Storage_Pool | - Aspect_Storage_Size | - Aspect_Stream_Size | - Aspect_Value_Size | - Aspect_Write => + when Aspect_Address | + Aspect_Alignment | + Aspect_Bit_Order | + Aspect_Component_Size | + Aspect_External_Tag | + Aspect_Input | + Aspect_Machine_Radix | + Aspect_Object_Size | + Aspect_Output | + Aspect_Read | + Aspect_Size | + Aspect_Small | + Aspect_Simple_Storage_Pool | + Aspect_Storage_Pool | + Aspect_Storage_Size | + Aspect_Stream_Size | + Aspect_Value_Size | + Aspect_Write => -- Construct the attribute definition clause @@ -2210,13 +2211,14 @@ package body Sem_Ch13 is -- legality, e.g. failing to provide a stream attribute for a -- type may make a program illegal. - when Attribute_External_Tag | - Attribute_Input | - Attribute_Output | - Attribute_Read | - Attribute_Storage_Pool | - Attribute_Storage_Size | - Attribute_Write => + when Attribute_External_Tag | + Attribute_Input | + Attribute_Output | + Attribute_Read | + Attribute_Simple_Storage_Pool | + Attribute_Storage_Pool | + Attribute_Storage_Size | + Attribute_Write => null; -- Other cases are errors ("attribute& cannot be set with @@ -3163,7 +3165,7 @@ package body Sem_Ch13 is -- Storage_Pool attribute definition clause - when Attribute_Storage_Pool => Storage_Pool : declare + when Attribute_Storage_Pool | Attribute_Simple_Storage_Pool => declare Pool : Entity_Id; T : Entity_Id; @@ -3194,8 +3196,24 @@ package body Sem_Ch13 is return; end if; - Analyze_And_Resolve - (Expr, Class_Wide_Type (RTE (RE_Root_Storage_Pool))); + if Id = Attribute_Storage_Pool then + Analyze_And_Resolve + (Expr, Class_Wide_Type (RTE (RE_Root_Storage_Pool))); + + -- In the Simple_Storage_Pool case, we allow a variable of any + -- Simple_Storage_Pool type, so we Resolve without imposing an + -- expected type. + + else + Analyze_And_Resolve (Expr); + + if not Present (Get_Rep_Pragma + (Etype (Expr), Name_Simple_Storage_Pool)) + then + Error_Msg_N + ("expression must be of a simple storage pool type", Expr); + end if; + end if; if not Denotes_Variable (Expr) then Error_Msg_N ("storage pool must be a variable", Expr); @@ -3280,7 +3298,7 @@ package body Sem_Ch13 is Error_Msg_N ("incorrect reference to a Storage Pool", Expr); return; end if; - end Storage_Pool; + end; ------------------ -- Storage_Size -- @@ -6147,6 +6165,13 @@ package body Sem_Ch13 is when Aspect_Small => T := Universal_Real; + -- For a simple storage pool, we have to retrieve the type of the + -- pool object associated with the aspect's corresponding attribute + -- definition clause. + + when Aspect_Simple_Storage_Pool => + T := Etype (Expression (Aspect_Rep_Item (ASN))); + when Aspect_Storage_Pool => T := Class_Wide_Type (RTE (RE_Root_Storage_Pool)); diff --git a/gcc/ada/sem_ch8.adb b/gcc/ada/sem_ch8.adb index 94f369adc8e..dda30af7e1c 100644 --- a/gcc/ada/sem_ch8.adb +++ b/gcc/ada/sem_ch8.adb @@ -2664,11 +2664,14 @@ package body Sem_Ch8 is if not Is_Actual and then (Old_S = New_S - or else (Nkind (Nam) /= N_Expanded_Name - and then Chars (Old_S) = Chars (New_S)) - or else (Nkind (Nam) = N_Expanded_Name - and then Entity (Prefix (Nam)) = Current_Scope - and then Chars (Selector_Name (Nam)) = Chars (New_S))) + or else + (Nkind (Nam) /= N_Expanded_Name + and then Chars (Old_S) = Chars (New_S)) + or else + (Nkind (Nam) = N_Expanded_Name + and then Entity (Prefix (Nam)) = Current_Scope + and then + Chars (Selector_Name (Nam)) = Chars (New_S))) then Error_Msg_N ("subprogram cannot rename itself", N); end if; diff --git a/gcc/ada/sem_prag.adb b/gcc/ada/sem_prag.adb index 3a16969ac34..3268c67b1f9 100644 --- a/gcc/ada/sem_prag.adb +++ b/gcc/ada/sem_prag.adb @@ -13150,6 +13150,65 @@ package body Sem_Prag is Check_Valid_Configuration_Pragma; Short_Descriptors := True; + ------------------------- + -- Simple_Storage_Pool -- + ------------------------- + + -- pragma Simple_Storage_Pool (type_LOCAL_NAME); + + when Pragma_Simple_Storage_Pool => Simple_Storage_Pool : declare + Type_Id : Node_Id; + Typ : Entity_Id; + + begin + GNAT_Pragma; + Check_Arg_Count (1); + Check_Arg_Is_Library_Level_Local_Name (Arg1); + + Type_Id := Get_Pragma_Arg (Arg1); + Find_Type (Type_Id); + Typ := Entity (Type_Id); + + if Typ = Any_Type then + return; + end if; + + -- We require the pragma to apply to a type declared in a package + -- declaration, but not (immediately) within a package body. + + if Ekind (Current_Scope) /= E_Package + or else In_Package_Body (Current_Scope) + then + Error_Pragma + ("pragma% can only apply to type declared immediately " & + "within a package declaration"); + end if; + + -- A simple storage pool type must be an immutably limited record + -- or private type. If the pragma is given for a private type, + -- the full type is similarly restricted (which is checked later + -- in Freeze_Entity). + + if Is_Record_Type (Typ) + and then not Is_Immutably_Limited_Type (Typ) + then + Error_Pragma + ("pragma% can only apply to explicitly limited record type"); + + elsif Is_Private_Type (Typ) and then not Is_Limited_Type (Typ) then + Error_Pragma + ("pragma% can only apply to a private type that is limited"); + + elsif not Is_Record_Type (Typ) + and then not Is_Private_Type (Typ) + then + Error_Pragma + ("pragma% can only apply to limited record or private type"); + end if; + + Record_Rep_Item (Typ, N); + end Simple_Storage_Pool; + ---------------------- -- Source_File_Name -- ---------------------- @@ -15117,6 +15176,7 @@ package body Sem_Prag is Pragma_Shared => -1, Pragma_Shared_Passive => -1, Pragma_Short_Descriptors => 0, + Pragma_Simple_Storage_Pool => 0, Pragma_Source_File_Name => -1, Pragma_Source_File_Name_Project => -1, Pragma_Source_Reference => -1, diff --git a/gcc/ada/sem_res.adb b/gcc/ada/sem_res.adb index 0fecd5b53d7..7c8de23f943 100644 --- a/gcc/ada/sem_res.adb +++ b/gcc/ada/sem_res.adb @@ -4228,6 +4228,31 @@ package body Sem_Res is Wrong_Type (Expression (E), Etype (E)); end if; + -- Calls to build-in-place functions are not currently supported in + -- allocators for access types associated with a simple storage pool. + -- Supporting such allocators may require passing additional implicit + -- parameters to build-in-place functions (or a significant revision + -- of the current b-i-p implementation to unify the handling for + -- multiple kinds of storage pools). ??? + + if Is_Immutably_Limited_Type (Desig_T) + and then Nkind (Expression (E)) = N_Function_Call + then + declare + Pool : constant Entity_Id + := Associated_Storage_Pool (Root_Type (Typ)); + begin + if Present (Pool) + and then Present (Get_Rep_Pragma + (Etype (Pool), Name_Simple_Storage_Pool)) + then + Error_Msg_N + ("limited function calls not yet supported in simple " & + "storage pool allocators", Expression (E)); + end if; + end; + end if; + -- A special accessibility check is needed for allocators that -- constrain access discriminants. The level of the type of the -- expression used to constrain an access discriminant cannot be diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb index 3da93ea2931..14376bbfa08 100644 --- a/gcc/ada/sem_util.adb +++ b/gcc/ada/sem_util.adb @@ -7138,18 +7138,14 @@ package body Sem_Util is -- is fully initialized. if Is_Scalar_Type (Typ) then - return - Ada_Version >= Ada_2012 - and then Has_Default_Aspect (Typ); + return Ada_Version >= Ada_2012 and then Has_Default_Aspect (Typ); elsif Is_Access_Type (Typ) then return True; elsif Is_Array_Type (Typ) then if Is_Fully_Initialized_Type (Component_Type (Typ)) - or else - (Ada_Version >= Ada_2012 - and then Has_Default_Aspect (Typ)) + or else (Ada_Version >= Ada_2012 and then Has_Default_Aspect (Typ)) then return True; end if; diff --git a/gcc/ada/snames.adb-tmpl b/gcc/ada/snames.adb-tmpl index e6753b583de..f49e75b5dc6 100644 --- a/gcc/ada/snames.adb-tmpl +++ b/gcc/ada/snames.adb-tmpl @@ -6,7 +6,7 @@ -- -- -- B o d y -- -- -- --- Copyright (C) 1992-2011, Free Software Foundation, Inc. -- +-- Copyright (C) 1992-2012, Free Software Foundation, Inc. -- -- -- -- GNAT is free software; you can redistribute it and/or modify it under -- -- terms of the GNU General Public License as published by the Free Soft- -- @@ -217,6 +217,8 @@ package body Snames is return Pragma_Priority; elsif N = Name_Relative_Deadline then return Pragma_Relative_Deadline; + elsif N = Name_Simple_Storage_Pool then + return Pragma_Simple_Storage_Pool; elsif N = Name_Storage_Size then return Pragma_Storage_Size; elsif N = Name_Storage_Unit then @@ -414,6 +416,7 @@ package body Snames is or else N = Name_Interface or else N = Name_Relative_Deadline or else N = Name_Priority + or else N = Name_Simple_Storage_Pool or else N = Name_Storage_Size or else N = Name_Storage_Unit; end Is_Pragma_Name; diff --git a/gcc/ada/snames.ads-tmpl b/gcc/ada/snames.ads-tmpl index f004adfd00c..3bf9f12668c 100644 --- a/gcc/ada/snames.ads-tmpl +++ b/gcc/ada/snames.ads-tmpl @@ -909,6 +909,7 @@ package Snames is Name_Elab_Body : constant Name_Id := N + $; -- GNAT Name_Elab_Spec : constant Name_Id := N + $; -- GNAT Name_Elab_Subp_Body : constant Name_Id := N + $; -- GNAT + Name_Simple_Storage_Pool : constant Name_Id := N + $; -- GNAT Name_Storage_Pool : constant Name_Id := N + $; -- These attributes are the ones that return types @@ -1459,6 +1460,7 @@ package Snames is Attribute_Elab_Body, Attribute_Elab_Spec, Attribute_Elab_Subp_Body, + Attribute_Simple_Storage_Pool, Attribute_Storage_Pool, -- Type attributes @@ -1730,6 +1732,7 @@ package Snames is Pragma_Fast_Math, Pragma_Interface, Pragma_Priority, + Pragma_Simple_Storage_Pool, Pragma_Storage_Size, Pragma_Storage_Unit, |