aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/aspects.ads2
-rw-r--r--gcc/ada/exp_util.adb11
-rw-r--r--gcc/ada/exp_util.ads6
-rw-r--r--gcc/ada/sem_ch13.adb260
-rw-r--r--gcc/ada/sem_util.adb37
-rw-r--r--gcc/ada/sem_util.ads15
6 files changed, 202 insertions, 129 deletions
diff --git a/gcc/ada/aspects.ads b/gcc/ada/aspects.ads
index 658a859..6559cda 100644
--- a/gcc/ada/aspects.ads
+++ b/gcc/ada/aspects.ads
@@ -441,7 +441,7 @@ package Aspects is
Aspect_SPARK_Mode => Optional_Name,
Aspect_Stable_Properties => Expression,
Aspect_Static_Predicate => Expression,
- Aspect_Storage_Model_Type => Expression,
+ Aspect_Storage_Model_Type => Optional_Expression,
Aspect_Storage_Pool => Name,
Aspect_Storage_Size => Expression,
Aspect_Stream_Size => Expression,
diff --git a/gcc/ada/exp_util.adb b/gcc/ada/exp_util.adb
index 8557e4b..3286bf6 100644
--- a/gcc/ada/exp_util.adb
+++ b/gcc/ada/exp_util.adb
@@ -6406,16 +6406,7 @@ package body Exp_Util is
begin
if Has_Storage_Model_Type_Aspect (Typ) then
- declare
- SMT_Op : constant Entity_Id :=
- Get_Storage_Model_Type_Entity (Typ, Nam);
- begin
- if not Present (SMT_Op) then
- raise Program_Error;
- else
- return SMT_Op;
- end if;
- end;
+ return Get_Storage_Model_Type_Entity (Typ, Nam);
-- Otherwise we assume that Typ is a descendant of Root_Storage_Pool
diff --git a/gcc/ada/exp_util.ads b/gcc/ada/exp_util.ads
index 1b7be3a..d854672 100644
--- a/gcc/ada/exp_util.ads
+++ b/gcc/ada/exp_util.ads
@@ -623,8 +623,10 @@ package Exp_Util is
-- specifies aspect Storage_Model_Type, returns the Entity_Id of the
-- subprogram associated with Nam, which must either be a primitive op of
-- the type in the case of a storage pool, or the operation corresponding
- -- to Nam as specified in the aspect Storage_Model_Type. It is an error if
- -- no operation corresponding to the given name is found.
+ -- to Nam as specified in the aspect Storage_Model_Type. In the case of
+ -- aspect Storage_Model_Type, returns Empty when no operation is found,
+ -- indicating that the operation is defaulted in the aspect (can occur in
+ -- the case where the storage-model address type is System.Address).
function Find_Hook_Context (N : Node_Id) return Node_Id;
-- Determine a suitable node on which to attach actions related to N that
diff --git a/gcc/ada/sem_ch13.adb b/gcc/ada/sem_ch13.adb
index 7ea04a6..9c3ae6f 100644
--- a/gcc/ada/sem_ch13.adb
+++ b/gcc/ada/sem_ch13.adb
@@ -23,59 +23,60 @@
-- --
------------------------------------------------------------------------------
-with Aspects; use Aspects;
-with Atree; use Atree;
-with Checks; use Checks;
-with Contracts; use Contracts;
-with Debug; use Debug;
-with Einfo; use Einfo;
-with Einfo.Entities; use Einfo.Entities;
-with Einfo.Utils; use Einfo.Utils;
-with Elists; use Elists;
-with Errout; use Errout;
-with Exp_Ch3; use Exp_Ch3;
-with Exp_Disp; use Exp_Disp;
-with Exp_Tss; use Exp_Tss;
-with Exp_Util; use Exp_Util;
-with Freeze; use Freeze;
-with Ghost; use Ghost;
-with Lib; use Lib;
-with Lib.Xref; use Lib.Xref;
-with Namet; use Namet;
-with Nlists; use Nlists;
-with Nmake; use Nmake;
-with Opt; use Opt;
-with Par_SCO; use Par_SCO;
-with Restrict; use Restrict;
-with Rident; use Rident;
-with Rtsfind; use Rtsfind;
-with Sem; use Sem;
-with Sem_Aux; use Sem_Aux;
-with Sem_Case; use Sem_Case;
-with Sem_Cat; use Sem_Cat;
-with Sem_Ch3; use Sem_Ch3;
-with Sem_Ch6; use Sem_Ch6;
-with Sem_Ch7; use Sem_Ch7;
-with Sem_Ch8; use Sem_Ch8;
-with Sem_Dim; use Sem_Dim;
-with Sem_Eval; use Sem_Eval;
-with Sem_Prag; use Sem_Prag;
-with Sem_Res; use Sem_Res;
-with Sem_Type; use Sem_Type;
-with Sem_Util; use Sem_Util;
-with Sem_Warn; use Sem_Warn;
-with Sinfo; use Sinfo;
-with Sinfo.Nodes; use Sinfo.Nodes;
-with Sinfo.Utils; use Sinfo.Utils;
-with Sinput; use Sinput;
-with Snames; use Snames;
-with Stand; use Stand;
+with Aspects; use Aspects;
+with Atree; use Atree;
+with Checks; use Checks;
+with Contracts; use Contracts;
+with Debug; use Debug;
+with Einfo; use Einfo;
+with Einfo.Entities; use Einfo.Entities;
+with Einfo.Utils; use Einfo.Utils;
+with Elists; use Elists;
+with Errout; use Errout;
+with Exp_Ch3; use Exp_Ch3;
+with Exp_Disp; use Exp_Disp;
+with Exp_Tss; use Exp_Tss;
+with Exp_Util; use Exp_Util;
+with Freeze; use Freeze;
+with Ghost; use Ghost;
+with Lib; use Lib;
+with Lib.Xref; use Lib.Xref;
+with Namet; use Namet;
+with Nlists; use Nlists;
+with Nmake; use Nmake;
+with Opt; use Opt;
+with Par_SCO; use Par_SCO;
+with Restrict; use Restrict;
+with Rident; use Rident;
+with Rtsfind; use Rtsfind;
+with Sem; use Sem;
+with Sem_Aux; use Sem_Aux;
+with Sem_Case; use Sem_Case;
+with Sem_Cat; use Sem_Cat;
+with Sem_Ch3; use Sem_Ch3;
+with Sem_Ch6; use Sem_Ch6;
+with Sem_Ch7; use Sem_Ch7;
+with Sem_Ch8; use Sem_Ch8;
+with Sem_Dim; use Sem_Dim;
+with Sem_Eval; use Sem_Eval;
+with Sem_Prag; use Sem_Prag;
+with Sem_Res; use Sem_Res;
+with Sem_Type; use Sem_Type;
+with Sem_Util; use Sem_Util;
+with Sem_Warn; use Sem_Warn;
+with Sinfo; use Sinfo;
+with Sinfo.Nodes; use Sinfo.Nodes;
+with Sinfo.Utils; use Sinfo.Utils;
+with Sinput; use Sinput;
+with Snames; use Snames;
+with Stand; use Stand;
+with System.Case_Util; use System.Case_Util;
with Table;
-with Targparm; use Targparm;
-with Ttypes; use Ttypes;
-with Tbuild; use Tbuild;
-with Urealp; use Urealp;
-with Warnsw; use Warnsw;
+with Targparm; use Targparm;
+with Ttypes; use Ttypes;
+with Tbuild; use Tbuild;
+with Urealp; use Urealp;
+with Warnsw; use Warnsw;
with GNAT.Heap_Sort_G;
@@ -11356,6 +11357,16 @@ package body Sem_Ch13 is
return;
when Aspect_Storage_Model_Type =>
+
+ -- The aggregate argument of Storage_Model_Type is optional, and
+ -- when not present the aspect defaults to the native storage
+ -- model (where the address type is System.Address, and other
+ -- arguments default to corresponding native storage operations).
+
+ if No (Expression (ASN)) then
+ return;
+ end if;
+
T := Entity (ASN);
declare
@@ -16559,12 +16570,14 @@ package body Sem_Ch13 is
return;
+ -- If Addr_Type is not present as the first association, then we default
+ -- it to System.Address.
+
elsif not Present (Addr_Type) then
- Error_Msg_N ("argument association for Address_Type missing; "
- & "must be specified as first aspect argument", N);
- return;
+ Addr_Type := RTE (RE_Address);
+ end if;
- elsif Nam = Name_Null_Address then
+ if Nam = Name_Null_Address then
if not Is_Entity_Name (N)
or else not Is_Constant_Object (Entity (N))
or else
@@ -17335,9 +17348,10 @@ package body Sem_Ch13 is
procedure Validate_Storage_Model_Type_Aspect
(Typ : Entity_Id; ASN : Node_Id)
is
- Assoc : Node_Id;
- Choice : Entity_Id;
- Expr : Node_Id;
+ Assoc : Node_Id;
+ Choice : Entity_Id;
+ Choice_Name : Name_Id;
+ Expr : Node_Id;
Address_Type_Id : Entity_Id := Empty;
Null_Address_Id : Entity_Id := Empty;
@@ -17347,7 +17361,47 @@ package body Sem_Ch13 is
Copy_To_Id : Entity_Id := Empty;
Storage_Size_Id : Entity_Id := Empty;
+ procedure Check_And_Resolve_Storage_Model_Type_Argument
+ (Expr : Node_Id;
+ Typ : Entity_Id;
+ Argument_Id : in out Entity_Id;
+ Nam : Name_Id);
+ -- Checks that the subaspect for Nam has not already been specified for
+ -- Typ's Storage_Model_Type aspect (i.e., checks Argument_Id = Empty),
+ -- resolves Expr, and sets Argument_Id to the entity resolved for Expr.
+
+ procedure Check_And_Resolve_Storage_Model_Type_Argument
+ (Expr : Node_Id;
+ Typ : Entity_Id;
+ Argument_Id : in out Entity_Id;
+ Nam : Name_Id)
+ is
+ Name_String : constant String := To_Mixed (Get_Name_String (Nam));
+
+ begin
+ if Present (Argument_Id) then
+ Error_Msg_String (1 .. Name_String'Length) := Name_String;
+ Error_Msg_Strlen := Name_String'Length;
+
+ Error_Msg_N ("~ already specified", Expr);
+ end if;
+
+ Resolve_Storage_Model_Type_Argument (Expr, Typ, Address_Type_Id, Nam);
+ Argument_Id := Entity (Expr);
+ end Check_And_Resolve_Storage_Model_Type_Argument;
+
+ -- Start of processing for Validate_Storage_Model_Type_Aspect
+
begin
+ -- The aggregate argument of Storage_Model_Type is optional, and when
+ -- not present the aspect defaults to the native storage model (where
+ -- the address type is System.Address, and other arguments default to
+ -- the corresponding native storage operations).
+
+ if No (Expression (ASN)) then
+ return;
+ end if;
+
-- Each expression must resolve to an entity of the right kind or proper
-- profile.
@@ -17358,65 +17412,67 @@ package body Sem_Ch13 is
Choice := First (Choices (Assoc));
+ Choice_Name := Chars (Choice);
+
if Nkind (Choice) /= N_Identifier or else Present (Next (Choice)) then
Error_Msg_N ("illegal name in association", Choice);
- elsif Chars (Choice) = Name_Address_Type then
+ elsif Choice_Name = Name_Address_Type then
if Assoc /= First (Component_Associations (Expression (ASN))) then
Error_Msg_N ("Address_Type must be first association", Choice);
end if;
- Resolve_Storage_Model_Type_Argument
+ Check_And_Resolve_Storage_Model_Type_Argument
(Expr, Typ, Address_Type_Id, Name_Address_Type);
- Address_Type_Id := Entity (Expr);
- -- Shouldn't we check for duplicates of the same subaspect name,
- -- and issue an error in such cases???
+ else
+ -- It's allowed to leave out the Address_Type argument, in which
+ -- case the address type is defined to default to System.Address.
- elsif not Present (Address_Type_Id) then
- Error_Msg_N
- ("Address_Type missing, must be first association", Choice);
-
- elsif Chars (Choice) = Name_Null_Address then
- Resolve_Storage_Model_Type_Argument
- (Expr, Typ, Address_Type_Id, Name_Null_Address);
- Null_Address_Id := Entity (Expr);
-
- elsif Chars (Choice) = Name_Allocate then
- Resolve_Storage_Model_Type_Argument
- (Expr, Typ, Address_Type_Id, Name_Allocate);
- Allocate_Id := Entity (Expr);
-
- elsif Chars (Choice) = Name_Deallocate then
- Resolve_Storage_Model_Type_Argument
- (Expr, Typ, Address_Type_Id, Name_Deallocate);
- Deallocate_Id := Entity (Expr);
-
- elsif Chars (Choice) = Name_Copy_From then
- Resolve_Storage_Model_Type_Argument
- (Expr, Typ, Address_Type_Id, Name_Copy_From);
- Copy_From_Id := Entity (Expr);
-
- elsif Chars (Choice) = Name_Copy_To then
- Resolve_Storage_Model_Type_Argument
- (Expr, Typ, Address_Type_Id, Name_Copy_To);
- Copy_To_Id := Entity (Expr);
-
- elsif Chars (Choice) = Name_Storage_Size then
- Resolve_Storage_Model_Type_Argument
- (Expr, Typ, Address_Type_Id, Name_Storage_Size);
- Storage_Size_Id := Entity (Expr);
+ if No (Address_Type_Id) then
+ Address_Type_Id := RTE (RE_Address);
+ end if;
- else
- Error_Msg_N
- ("invalid name for Storage_Model_Type argument", Choice);
+ if Choice_Name = Name_Null_Address then
+ Check_And_Resolve_Storage_Model_Type_Argument
+ (Expr, Typ, Null_Address_Id, Name_Null_Address);
+
+ elsif Choice_Name = Name_Allocate then
+ Check_And_Resolve_Storage_Model_Type_Argument
+ (Expr, Typ, Allocate_Id, Name_Allocate);
+
+ elsif Choice_Name = Name_Deallocate then
+ Check_And_Resolve_Storage_Model_Type_Argument
+ (Expr, Typ, Deallocate_Id, Name_Deallocate);
+
+ elsif Choice_Name = Name_Copy_From then
+ Check_And_Resolve_Storage_Model_Type_Argument
+ (Expr, Typ, Copy_From_Id, Name_Copy_From);
+
+ elsif Choice_Name = Name_Copy_To then
+ Check_And_Resolve_Storage_Model_Type_Argument
+ (Expr, Typ, Copy_To_Id, Name_Copy_To);
+
+ elsif Choice_Name = Name_Storage_Size then
+ Check_And_Resolve_Storage_Model_Type_Argument
+ (Expr, Typ, Storage_Size_Id, Name_Storage_Size);
+
+ else
+ Error_Msg_N
+ ("invalid name for Storage_Model_Type argument", Choice);
+ end if;
end if;
Next (Assoc);
end loop;
- if No (Address_Type_Id) then
- Error_Msg_N ("match for Address_Type not found", ASN);
+ -- If Address_Type has been specified as or defaults to System.Address,
+ -- then other "subaspect" arguments can be specified, but are optional.
+ -- Otherwise, all other arguments are required and an error is flagged
+ -- about any that are missing.
+
+ if Address_Type_Id = RTE (RE_Address) then
+ return;
elsif No (Null_Address_Id) then
Error_Msg_N ("match for Null_Address primitive not found", ASN);
diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb
index 854afdf..13ffb11 100644
--- a/gcc/ada/sem_util.adb
+++ b/gcc/ada/sem_util.adb
@@ -32575,18 +32575,37 @@ package body Sem_Util is
Find_Value_Of_Aspect (Typ, Aspect_Storage_Model_Type);
begin
- pragma Assert (Present (SMT_Aspect_Value));
+ -- When the aspect has an aggregate expression, search through it
+ -- to locate a match for the name of the given "subaspect" and return
+ -- the entity of the aggregate association's expression.
+
+ if Present (SMT_Aspect_Value) then
+ Assoc := First (Component_Associations (SMT_Aspect_Value));
+ while Present (Assoc) loop
+ if Chars (First (Choices (Assoc))) = Nam then
+ return Entity (Expression (Assoc));
+ end if;
- Assoc := First (Component_Associations (SMT_Aspect_Value));
- while Present (Assoc) loop
- if Chars (First (Choices (Assoc))) = Nam then
- return Entity (Expression (Assoc));
- end if;
+ Next (Assoc);
+ end loop;
+ end if;
- Next (Assoc);
- end loop;
+ -- The aggregate argument of Storage_Model_Type is optional, and when
+ -- not present the aspect defaults to the native storage model, where
+ -- the address type is System.Address. In that case, we return
+ -- System.Address for Name_Address_Type and System.Null_Address for
+ -- Name_Null_Address, but return Empty for other cases, and leave it
+ -- to the back end to map those to the appropriate native operations.
- return Empty;
+ if Nam = Name_Address_Type then
+ return RTE (RE_Address);
+
+ elsif Nam = Name_Null_Address then
+ return RTE (RE_Null_Address);
+
+ else
+ return Empty;
+ end if;
end Get_Storage_Model_Type_Entity;
--------------------------------
diff --git a/gcc/ada/sem_util.ads b/gcc/ada/sem_util.ads
index 64cf5d0..dde5b27 100644
--- a/gcc/ada/sem_util.ads
+++ b/gcc/ada/sem_util.ads
@@ -3680,21 +3680,26 @@ package Sem_Util is
-- Given a type with aspect Storage_Model_Type or an object of such a
-- type, and Nam denoting the name of one of the argument kinds allowed
-- for that aspect, returns the Entity_Id corresponding to the entity
- -- associated with Nam in the aspect. If such an entity is not present,
- -- then returns Empty. (Note: This function is modeled on function
- -- Get_Iterable_Type_Primitive.)
+ -- associated with Nam in the aspect. If an entity was not explicitly
+ -- specified for Nam, then returns Empty, except that in the defaulted
+ -- Address_Type case, System.Address will be returned, and in the
+ -- defaulted Null_Address case, System.Null_Address will be returned.
+ -- (Note: This function is modeled on Get_Iterable_Type_Primitive.)
function Storage_Model_Address_Type
(SM_Obj_Or_Type : Entity_Id) return Entity_Id;
-- Given a type with aspect Storage_Model_Type or an object of such a
-- type, returns the type specified for the Address_Type choice in that
- -- aspect; returns Empty if the type isn't specified.
+ -- aspect; returns type System.Address if the address type was not
+ -- explicitly specified (indicating use of the native memory model).
function Storage_Model_Null_Address
(SM_Obj_Or_Type : Entity_Id) return Entity_Id;
-- Given a type with aspect Storage_Model_Type or an object of such a
-- type, returns the constant specified for the Null_Address choice in
- -- that aspect; returns Empty if the constant object isn't specified.
+ -- that aspect; returns Empty if the constant object isn't specified,
+ -- unless the native memory model is in use (System.Address), in which
+ -- case it returns System.Null_Address.
function Storage_Model_Allocate
(SM_Obj_Or_Type : Entity_Id) return Entity_Id;