public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc(refs/users/guojiufu/heads/guojiufu-branch)] [Ada] Implement AI12-0291 (Jorvik profile)
@ 2020-06-10  3:44 Jiu Fu Guo
  0 siblings, 0 replies; only message in thread
From: Jiu Fu Guo @ 2020-06-10  3:44 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:a998e58bf019c7174a7480fc4d46ec9fcbc4cd92

commit a998e58bf019c7174a7480fc4d46ec9fcbc4cd92
Author: Steve Baird <baird@adacore.com>
Date:   Wed Feb 19 16:27:47 2020 -0800

    [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.

Diff:
---
 gcc/ada/libgnat/s-rident.ads | 62 ++++++++++++++++++++++++++++++++++++++++++++
 gcc/ada/sem_prag.adb         | 15 ++++++++---
 gcc/ada/snames.ads-tmpl      |  1 +
 gcc/ada/targparm.adb         |  8 ++++++
 4 files changed, 82 insertions(+), 4 deletions(-)

diff --git a/gcc/ada/libgnat/s-rident.ads b/gcc/ada/libgnat/s-rident.ads
index 73a0450b458..b7969fb96b4 100644
--- a/gcc/ada/libgnat/s-rident.ads
+++ b/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 =
diff --git a/gcc/ada/sem_prag.adb b/gcc/ada/sem_prag.adb
index 55325f8c8a5..269cbbbe528 100644
--- a/gcc/ada/sem_prag.adb
+++ b/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);
 
diff --git a/gcc/ada/snames.ads-tmpl b/gcc/ada/snames.ads-tmpl
index e5494ae73ab..b88f861a2d5 100644
--- a/gcc/ada/snames.ads-tmpl
+++ b/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 + $;
diff --git a/gcc/ada/targparm.adb b/gcc/ada/targparm.adb
index c1ec8e71249..9e1571091bf 100644
--- a/gcc/ada/targparm.adb
+++ b/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


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2020-06-10  3:44 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-10  3:44 [gcc(refs/users/guojiufu/heads/guojiufu-branch)] [Ada] Implement AI12-0291 (Jorvik profile) Jiu Fu Guo

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).