[Ada] Implement AI12-0291 (Jorvik profile)

2020-06-08  Steve Baird  <baird@adacore.com>

gcc/ada/

	* libgnat/s-rident.ads: Add Jorvik to the Profile_Name
	enumeration type.  Add an element for Jorvik to the array
	aggregate that is the initial value of the constant
	Profile_Info.
	* targparm.adb (Get_Target_Parameters): Handle "pragma Profile
	(Jorvik);" similarly to "pragma Profile (Ravenscar);".
	* snames.ads-tmpl: Declare Name_Jorvik Name_Id. Unlike
	Ravenscar, Jorvik is not a pragma name and has no corresponding
	element in the Pragma_Id enumeration type; this means that its
	declaration must not occur between those of First_Pragma_Name
	and Last_Pragma_Name.
	* sem_prag.adb (Analyze_Pragma): Add call to
	Set_Ravenscar_Profile for Jorvik, similar to the existing calls
	for Ravenscar and the GNAT Ravenscar variants.
This commit is contained in:
Steve Baird 2020-02-19 16:27:47 -08:00 committed by Pierre-Marie de Rodat
parent 4b8c2c4ba3
commit a998e58bf0
4 changed files with 82 additions and 4 deletions

View File

@ -381,6 +381,7 @@ package System.Rident is
Restricted_Tasking,
Restricted,
Ravenscar,
Jorvik,
GNAT_Extended_Ravenscar,
GNAT_Ravenscar_EDF);
-- Names of recognized profiles. No_Profile is used to indicate that a
@ -545,6 +546,67 @@ package System.Rident is
Max_Task_Entries => 0,
others => 0)),
Jorvik =>
-- Restrictions for Jorvik profile ..
-- Note: the table entries here only represent the
-- required restriction profile for Jorvik. The
-- full Jorvik profile also requires:
-- pragma Dispatching_Policy (FIFO_Within_Priorities);
-- pragma Locking_Policy (Ceiling_Locking);
-- pragma Detect_Blocking;
-- The differences between Ravenscar and Jorvik are
-- as follows:
-- 1) Ravenscar includes restriction Simple_Barriers;
-- Jorvik includes Pure_Barriers instead.
-- 2) The following 6 restrictions are included in
-- Ravenscar but not in Jorvik:
-- No_Implicit_Heap_Allocations
-- No_Relative_Delay
-- Max_Entry_Queue_Length => 1
-- Max_Protected_Entries => 1
-- No_Dependence => Ada.Calendar
-- No_Dependence => Ada.Synchronous_Barriers
--
-- The last of those 7 (i.e., No_Dep => Ada.Synch_Bars)
-- is not reflected here (see sem_prag.adb).
(Set =>
(No_Abort_Statements => True,
No_Asynchronous_Control => True,
No_Dynamic_Attachment => True,
No_Dynamic_Priorities => True,
No_Local_Protected_Objects => True,
No_Protected_Type_Allocators => True,
No_Requeue_Statements => True,
No_Task_Allocators => True,
No_Task_Attributes_Package => True,
No_Task_Hierarchy => True,
No_Terminate_Alternatives => True,
Max_Asynchronous_Select_Nesting => True,
Max_Select_Alternatives => True,
Max_Task_Entries => True,
-- plus these additional restrictions:
No_Local_Timing_Events => True,
No_Select_Statements => True,
No_Specific_Termination_Handlers => True,
No_Task_Termination => True,
Pure_Barriers => True,
others => False),
-- Value settings for Ravenscar (same as Restricted)
Value =>
(Max_Asynchronous_Select_Nesting => 0,
Max_Select_Alternatives => 0,
Max_Task_Entries => 0,
others => 0)),
GNAT_Extended_Ravenscar =>
-- Restrictions for GNAT_Extended_Ravenscar =

View File

@ -4330,9 +4330,9 @@ package body Sem_Prag is
procedure Set_Ravenscar_Profile (Profile : Profile_Name; N : Node_Id);
-- Activate the set of configuration pragmas and restrictions that make
-- up the Profile. Profile must be either GNAT_Extended_Ravenscar,
-- GNAT_Ravenscar_EDF, or Ravenscar. N is the corresponding pragma node,
-- which is used for error messages on any constructs violating the
-- profile.
-- GNAT_Ravenscar_EDF, Jorvik, or Ravenscar. N is the corresponding
-- pragma node, which is used for error messages on any constructs
-- violating the profile.
---------------------
-- Ada_2005_Pragma --
@ -11162,7 +11162,7 @@ package body Sem_Prag is
-- Set required policies
-- pragma Task_Dispatching_Policy (FIFO_Within_Priorities)
-- (For Ravenscar and GNAT_Extended_Ravenscar profiles)
-- (For Ravenscar, Jorvik, and GNAT_Extended_Ravenscar profiles)
-- pragma Task_Dispatching_Policy (EDF_Across_Priorities)
-- (For GNAT_Ravenscar_EDF profile)
-- pragma Locking_Policy (Ceiling_Locking)
@ -11283,6 +11283,10 @@ package body Sem_Prag is
-- No_Dependence => Ada.Execution_Time.Group_Budget
-- No_Dependence => Ada.Execution_Time.Timers
-- ??? Eventually when AI12-0073 is implemented, we'll register a
-- No_Dependence restriction on Ada.Synchronous_Barriers
-- for Ravenscar but not for Jorvik.
if Ada_Version >= Ada_2005 then
Pref_Id := Make_Identifier (Loc, Name_Find ("ada"));
Sel_Id := Make_Identifier (Loc, Name_Find ("execution_time"));
@ -21314,6 +21318,9 @@ package body Sem_Prag is
if Chars (Argx) = Name_Ravenscar then
Set_Ravenscar_Profile (Ravenscar, N);
elsif Chars (Argx) = Name_Jorvik then
Set_Ravenscar_Profile (Jorvik, N);
elsif Chars (Argx) = Name_Gnat_Extended_Ravenscar then
Set_Ravenscar_Profile (GNAT_Extended_Ravenscar, N);

View File

@ -782,6 +782,7 @@ package Snames is
Name_Info : constant Name_Id := N + $;
Name_Internal : constant Name_Id := N + $;
Name_Ivdep : constant Name_Id := N + $;
Name_Jorvik : constant Name_Id := N + $;
Name_Link_Name : constant Name_Id := N + $;
Name_Low_Order_First : constant Name_Id := N + $;
Name_Lowercase : constant Name_Id := N + $;

View File

@ -334,6 +334,14 @@ package body Targparm is
Opt.Locking_Policy := 'C';
goto Line_Loop_Continue;
-- Test for pragma Profile (Jorvik);
elsif Looking_At_Skip ("pragma Profile (Jorvik);") then
Set_Profile_Restrictions (Jorvik);
Opt.Task_Dispatching_Policy := 'F';
Opt.Locking_Policy := 'C';
goto Line_Loop_Continue;
-- Test for pragma Profile (GNAT_Extended_Ravenscar);
elsif Looking_At_Skip