[Ada] Implement AI12-0291 (Jorvik profile)

Message ID 20200608080043.GA90427@adacore.com
State New
Headers show
Series
  • [Ada] Implement AI12-0291 (Jorvik profile)
Related show

Commit Message

Pierre-Marie de Rodat June 8, 2020, 8 a.m.
The Jorvik profile is a newly defined profile, similar to the Ravenscar
profile but less restrictive in some cases. It differs from the
Ravenscar profile only in the removal of six restrictions and the
relaxation of one (Ravenscar's Simple_Barriers restriction is replaced
with a Pure_Barriers restriction).

Tested on x86_64-pc-linux-gnu, committed on trunk

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.

Patch

--- gcc/ada/libgnat/s-rident.ads
+++ gcc/ada/libgnat/s-rident.ads
@@ -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 =

--- gcc/ada/sem_prag.adb
+++ gcc/ada/sem_prag.adb
@@ -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);
 

--- gcc/ada/snames.ads-tmpl
+++ gcc/ada/snames.ads-tmpl
@@ -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 + $;

--- gcc/ada/targparm.adb
+++ gcc/ada/targparm.adb
@@ -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