[Ada] Max_Entry_Queue_Length aspect for protected entries

Allow values of negative one to be accepted as a valid parameter as a
special case.

2019-08-21  Justin Squirek  <squirek@adacore.com>

gcc/ada/

	* doc/gnat_rm/implementation_defined_pragmas.rst: Modify
	documentation to reflect expected behavior.
	* gnat_rm.texi: Regenerate.
	* sem_prag.adb (Analyze_Pragma): Modify handling of pragma
	Max_Entry_Queue_Length to not reject integer values of negative
	one.
	* sem_util.adb (Get_Max_Queue_Length): Add processing for values
	of negative one to fit within the current scheme.

From-SVN: r274774
This commit is contained in:
Justin Squirek 2019-08-21 08:29:23 +00:00 committed by Pierre-Marie de Rodat
parent 1e78c638a7
commit df2d2fe0ee
5 changed files with 39 additions and 13 deletions

View File

@ -1,3 +1,14 @@
2019-08-21 Justin Squirek <squirek@adacore.com>
* doc/gnat_rm/implementation_defined_pragmas.rst: Modify
documentation to reflect expected behavior.
* gnat_rm.texi: Regenerate.
* sem_prag.adb (Analyze_Pragma): Modify handling of pragma
Max_Entry_Queue_Length to not reject integer values of negative
one.
* sem_util.adb (Get_Max_Queue_Length): Add processing for values
of negative one to fit within the current scheme.
2019-08-20 Arnaud Charlet <charlet@adacore.com>
* exp_unst.adb (Unnest_Subprograms, Unnest_Subprogram): Take

View File

@ -3888,8 +3888,10 @@ Syntax::
This pragma is used to specify the maximum callers per entry queue for
individual protected entries and entry families. It accepts a single
positive integer as a parameter and must appear after the declaration
of an entry.
integer (-1 or more) as a parameter and must appear after the declaration of an
entry.
A value of -1 represents no additional restriction on queue length.
Pragma No_Body
==============

View File

@ -1764,9 +1764,9 @@ Syntax:
pragma Aggregate_Individually_Assign;
@end example
Where possible GNAT will store the binary representation of a record aggregate
Where possible, GNAT will store the binary representation of a record aggregate
in memory for space and performance reasons. This configuration pragma changes
this behaviour so that record aggregates are instead always converted into
this behavior so that record aggregates are instead always converted into
individual assignment statements.
@node Pragma Allow_Integer_Address,Pragma Annotate,Pragma Aggregate_Individually_Assign,Implementation Defined Pragmas
@ -5394,8 +5394,10 @@ pragma Max_Entry_Queue (static_integer_EXPRESSION);
This pragma is used to specify the maximum callers per entry queue for
individual protected entries and entry families. It accepts a single
positive integer as a parameter and must appear after the declaration
of an entry.
integer (-1 or more) as a parameter and must appear after the declaration of an
entry.
A value of -1 represents no additional restriction on queue length.
@node Pragma No_Body,Pragma No_Caching,Pragma Max_Queue_Length,Implementation Defined Pragmas
@anchor{gnat_rm/implementation_defined_pragmas pragma-no-body}@anchor{a1}

View File

@ -19538,7 +19538,7 @@ package body Sem_Prag is
| Pragma_Max_Entry_Queue_Depth
| Pragma_Max_Queue_Length
=>
Max_Queue_Length : declare
Max_Entry_Queue_Length : declare
Arg : Node_Id;
Entry_Decl : Node_Id;
Entry_Id : Entity_Id;
@ -19589,9 +19589,9 @@ package body Sem_Prag is
Val := Expr_Value (Arg);
if Val <= 0 then
if Val < -1 then
Error_Pragma_Arg
("argument for pragma% must be positive", Arg1);
("argument for pragma% cannot be less than -1", Arg1);
elsif not UI_Is_In_Int_Range (Val) then
Error_Pragma_Arg
@ -19609,7 +19609,7 @@ package body Sem_Prag is
end if;
Record_Rep_Item (Entry_Id, N);
end Max_Queue_Length;
end Max_Entry_Queue_Length;
-----------------
-- Memory_Size --

View File

@ -9752,16 +9752,27 @@ package body Sem_Util is
function Get_Max_Queue_Length (Id : Entity_Id) return Uint is
pragma Assert (Is_Entry (Id));
Prag : constant Entity_Id := Get_Pragma (Id, Pragma_Max_Queue_Length);
Max : Uint;
begin
-- A value of 0 represents no maximum specified, and entries and entry
-- families with no Max_Queue_Length aspect or pragma default to it.
-- A value of 0 or -1 represents no maximum specified, and entries and
-- entry families with no Max_Queue_Length aspect or pragma default to
-- it.
if not Present (Prag) then
return Uint_0;
end if;
return Intval (Expression (First (Pragma_Argument_Associations (Prag))));
Max := Intval (Expression (First (Pragma_Argument_Associations (Prag))));
-- Since -1 and 0 are equivalent, return 0 for instances of -1 for
-- uniformity.
if Max = -1 then
return Uint_0;
end if;
return Max;
end Get_Max_Queue_Length;
------------------------