This patch enables the recognition/processing of pragma Restrictions
(No_Dependence => unit) in system.ads, allowing more flexibility in
configuring specialized versions of System.

Given a system.ads that contains the line

pragma Restrictions (No_Dependence => Ada.Text_IO);

Compiling the following program gives the indicated error:

     1. with Ada.Text_IO;
             |
        >>> violation of restriction "No_Dependence =>
            Ada.Text_Io" in package System

     2. procedure SysRest is
     3. begin
     4.    Ada.Text_IO.Put_Line ("hello");
     5. end;

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

2014-06-13  Robert Dewar  <de...@adacore.com>

        * back_end.adb (Make_Id): New function.
        (Make_SC): New function.
        (Set_RND): New procedure.
        * back_end.ads (Make_Id): New function.
        (Make_SC): New function.
        (Set_RND): New procedure.
        * einfo.ads: Minor comment updates.
        * frontend.adb: Move Atree.Initialize call to Gnat1drv.
        * gnat1drv.adb (Gnat1drv): New calling sequence for
        Get_Target_Parameters.
        (Gnat1drv): Move Atree.Initialize here from Frontend.
        * targparm.adb (Get_Target_Parameters): New calling
        sequence (Get_Target_Parameters): Handle pragma Restriction
        (No_Dependence,..)
        * targparm.ads (Get_Target_Parameters): New calling sequence.

Index: frontend.adb
===================================================================
--- frontend.adb        (revision 211445)
+++ frontend.adb        (working copy)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1992-2013, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2014, Free Software Foundation, Inc.         --
 --                                                                          --
 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
 -- terms of the  GNU General Public License as published  by the Free Soft- --
@@ -80,7 +80,6 @@
    --  since it uses names table entries.
 
    Rtsfind.Initialize;
-   Atree.Initialize;
    Nlists.Initialize;
    Elists.Initialize;
    Lib.Load.Initialize;
Index: einfo.ads
===================================================================
--- einfo.ads   (revision 211465)
+++ einfo.ads   (working copy)
@@ -101,9 +101,9 @@
 --     pragma Inline declarations
 
 --  This order must be observed. There are no restrictions on the procedures,
---  since the C header file only includes functions (Gigi is not allowed to
---  modify the generated tree). However, functions are required to have headers
---  that fit on a single line.
+--  since the C header file only includes functions (The back end is not
+--  allowed to modify the generated tree). However, functions are required to
+--  have headers that fit on a single line.
 
 --  XEINFO reads and processes the function specs and the pragma Inlines. For
 --  functions that are declared as inlined, XEINFO reads the corresponding body
@@ -121,7 +121,7 @@
 
 --  For functions that are not inlined, there is no restriction on the body,
 --  and XEINFO generates a direct reference in the C header file which allows
---  the C code in Gigi to directly call the corresponding Ada body.
+--  the C code in the  backend to directly call the corresponding Ada body.
 
 ----------------------------------
 -- Handling of Type'Size Values --
@@ -378,16 +378,16 @@
 --       the N_Attribute_Definition_Clause node. Empty if no Address clause.
 --       The expression in the address clause is always a constant that is
 --       defined before the entity to which the address clause applies.
---       Note: Gigi references this field in E_Task_Type entities???
+--       Note: The backend references this field in E_Task_Type entities???
 
 --    Address_Taken (Flag104)
 --       Defined in all entities. Set if the Address or Unrestricted_Access
 --       attribute is applied directly to the entity, i.e. the entity is the
 --       entity of the prefix of the attribute reference. Also set if the
 --       entity is the second argument of an Asm_Input or Asm_Output attribute,
---       as the construct may entail taking its address. Used by Gigi to make
---       sure that the address can be meaningfully taken, and also in the case
---       of subprograms to control output of certain warnings.
+--       as the construct may entail taking its address. Used by the backend to
+--       make sure that the address can be meaningfully taken, and also in the
+--       case of subprograms to control output of certain warnings.
 
 --    Aft_Value (synthesized)
 --       Applies to fixed and decimal types. Computes a universal integer
@@ -415,7 +415,7 @@
 --       object. A value of zero (Uint_0) indicates that the alignment has not
 --       been set yet. The alignment can be set by an explicit alignment
 --       clause, or set by the front-end in package Layout, or set by the
---       back-end as part of the back end back-annotation process. The
+--       back-end as part of the back-end back-annotation process. The
 --       alignment field is also defined in E_Exception entities, but there it
 --       is used only by the back-end for back annotation.
 
@@ -534,13 +534,13 @@
 
 --    Can_Use_Internal_Rep (Flag229) [base type only]
 --       Defined in Access_Subprogram_Kind nodes. This flag is set by the
---       front end and used by the back end. False means that the back end
+--       front end and used by the backend. False means that the backend
 --       must represent the type in the same way as Convention-C types (and
 --       other foreign-convention types). On many targets, this means that
---       the back end will use dynamically generated trampolines for nested
---       subprograms. True means that the back end can represent the type in
+--       the backend will use dynamically generated trampolines for nested
+--       subprograms. True means that the backend can represent the type in
 --       some internal way. On the aforementioned targets, this means that the
---       back end will not use dynamically generated trampolines. This flag
+--       backend will not use dynamically generated trampolines. This flag
 --       must be False if Has_Foreign_Convention is True; otherwise, the front
 --       end is free to set the policy.
 --
@@ -568,11 +568,11 @@
 --       table that has the character string of the identifier, character
 --       literal or operator symbol. See Namet for further details. Note that
 --       throughout the processing of the front end, this name is the simple
---       unqualified name. However, just before gigi is called, a call is made
---       to Qualify_All_Entity_Names. This causes entity names to be qualified
---       using the encoding described in exp_dbug.ads, and from that point on
---       (including post gigi steps such as cross-reference generation), the
---       entities will contain the encoded qualified names.
+--       unqualified name. However, just before the backend is called, a call
+--       is made to Qualify_All_Entity_Names. This causes entity names to be
+--       qualified using the encoding described in exp_dbug.ads, and from that
+--       point (including post backend steps, e.g. cross-reference generation),
+--       the entities will contain the encoded qualified names.
 
 --    Checks_May_Be_Suppressed (Flag31)
 --       Defined in all entities. Set if a pragma Suppress or Unsuppress
@@ -639,7 +639,7 @@
 --       Note: Component_Bit_Offset is redundant with respect to the fields
 --       Normalized_First_Bit and Normalized_Position, and could in principle
 --       be eliminated, but it is convenient in several situations, including
---       use in Gigi, to have this redundant field.
+--       use in the backend, to have this redundant field.
 
 --    Component_Clause (Node13)
 --       Defined in record components and discriminants. If a record
@@ -733,7 +733,7 @@
 --       to the entity, or if internal processing in the compiler determines
 --       that suppression of debug information is desirable. Note that this
 --       flag is only for use by the front end as part of the processing for
---       determining if Needs_Debug_Info should be set. The back end should
+--       determining if Needs_Debug_Info should be set. The backend should
 --       always test Needs_Debug_Info, it should never test Debug_Info_Off.
 
 --    Debug_Renaming_Link (Node25)
@@ -1088,7 +1088,7 @@
 --       Defined in class wide types and subtypes, access to protected
 --       subprogram types, and in exception types. For a classwide type, it
 --       is always Empty. For a class wide subtype, it points to an entity
---       created by the expander which gives Gigi an easily understandable
+--       created by the expander which gives the backend an understandable
 --       equivalent of the class subtype with a known size (given by an
 --       initial value). See Exp_Util.Expand_Class_Wide_Subtype for further
 --       details. For E_Exception_Type, this points to the record containing
@@ -1111,8 +1111,8 @@
 --       of a component to be set without a component clause defined, which
 --       means that the component size is specified, but not the position.
 --       See also RM_Size and the section on "Handling of Type'Size Values".
---       During gigi processing, the value is back annotated for all zero
---       values, so that after the call to gigi, the value is properly set.
+--       During backend processing, the value is back annotated for all zero
+--       values, so that after the call to the backend, the value is set.
 
 --    Etype (Node5)
 --       Defined in all entities. Represents the type of the entity, which
@@ -1309,7 +1309,7 @@
 --          Thread_Local_Storage pragma
 --
 --       If any of these items are present, then the flag Has_Gigi_Rep_Item is
---       set, indicating that Gigi should search the chain.
+--       set, indicating that the backend should search the chain.
 --
 --       Other representation items are included in the chain so that error
 --       messages can easily locate the relevant nodes for posting errors.
@@ -1558,8 +1558,8 @@
 --    Has_Gigi_Rep_Item (Flag82)
 --       Defined in all entities. Set if the rep item chain (referenced by
 --       First_Rep_Item and linked through the Next_Rep_Item chain) contains a
---       representation item that needs to be specially processed by Gigi, i.e.
---       one of the following items:
+--       representation item that needs to be specially processed by the back
+--       end, i.e. one of the following items:
 --
 --          Machine_Attribute pragma
 --          Linker_Alias pragma
@@ -1568,13 +1568,13 @@
 --          Weak_External pragma
 --          Thread_Local_Storage pragma
 --
---       If this flag is set, then Gigi should scan the rep item chain to
---       process any of these items that appear. At least one such item will
+--       If this flag is set, then the backend should scan the rep item chain
+--       to process any of these items that appear. At least one such item will
 --       be present.
 --
 --    Has_Homonym (Flag56)
 --       Defined in all entities. Set if an entity has a homonym in the same
---       scope. Used by Gigi to generate unique names for such entities.
+--       scope. Used by the backend to generate unique names for all entities.
 
 --    Has_Implicit_Dereference (Flag251)
 --       Defined in types and discriminants. Set if the type has an aspect
@@ -1646,7 +1646,7 @@
 --       scope that has an exception handler and the two scopes are in the
 --       same procedure. This is used by the backend for controlling certain
 --       optimizations to ensure that they are consistent with exceptions.
---       See documentation in Gigi for further details.
+--       See documentation in backend for further details.
 
 --    Has_Non_Null_Refinement (synth)
 --       Defined in E_Abstract_State entities. True if the state has at least
@@ -2185,9 +2185,9 @@
 --       by the expander to represent a task or protected type. For every
 --       concurrent type, such as record type is constructed, and task and
 --       protected objects are instances of this record type at runtime
---       (Gigi will replace declarations of the concurrent type using the
---       declarations of the corresponding record type). See package Exp_Ch9
---       for further details.
+--       (The backend will replace declarations of the concurrent type using
+--       the declarations of the corresponding record type). See Exp_Ch9 for
+--       further details.
 
 --    Is_Concurrent_Type (synthesized)
 --       Applies to all entities, true for task types and subtypes and for
@@ -2212,7 +2212,7 @@
 --       Defined in all types and subtypes. This flag can be set only if
 --       Is_Constr_Subt_For_U_Nominal is also set. It indicates that in
 --       addition the object concerned is aliased. This flag is used by
---       Gigi to determine whether a template must be constructed.
+--       the backend to determine whether a template must be constructed.
 
 --    Is_Constructor (Flag76)
 --       Defined in function and procedure entities. Set if a pragma
@@ -2497,9 +2497,9 @@
 --    Is_Itype (Flag91)
 --       Defined in all entities. Set to indicate that a type is an Itype,
 --       which means that the declaration for the type does not appear
---       explicitly in the tree. Instead gigi will elaborate the type when it
---       is first used. Has_Delayed_Freeze can be set for Itypes, and the
---       meaning is that the first use (the one which causes the type to be
+--       explicitly in the tree. Instead the backend will elaborate the type
+--       when it is first used. Has_Delayed_Freeze can be set for Itypes, and
+--       the meaning is that the first use (the one which causes the type to be
 --       defined) will be the freeze node. Note that an important restriction
 --       on Itypes is that the first use of such a type (the one that causes it
 --       to be defined) must be in the same scope as the type.
@@ -2523,7 +2523,7 @@
 --       The flag is dynamically set and reset as semantic analysis and
 --       expansion proceeds. Its value is meaningless once the tree is
 --       fully constructed, since it simply indicates the last state.
---       Thus this flag has no meaning to the back end.
+--       Thus this flag has no meaning to the backend.
 
 --    Is_Known_Null (Flag204)
 --       Defined in all entities. Relevant (and can be set ) only for
@@ -2552,7 +2552,7 @@
 --
 --       For objects, the flag indicates the state of knowledge about the
 --       current value of the object. This may be modified during expansion,
---       and thus the final value is not relevant to gigi.
+--       and thus the final value is not relevant to the backend.
 --
 --       For types and subtypes, the flag is set if all possible bit patterns
 --       of length Object_Size (i.e. Esize of the type) represent valid values
@@ -2567,7 +2567,7 @@
 --       The flag is dynamically set and reset as semantic analysis and
 --       expansion proceeds. Its value is meaningless once the tree is
 --       fully constructed, since it simply indicates the last state.
---       Thus this flag has no meaning to the back end.
+--       Thus this flag has no meaning to the backend.
 
 --    Is_Limited_Composite (Flag106)
 --       Defined in all entities. Set for composite types that have a limited
@@ -2709,11 +2709,11 @@
 --       used to implement a packed array (either a modular type, or a subtype
 --       of Packed_Bytes{1,2,4} as appropriate). The flag is set if and only
 --       if the type appears in the Packed_Array_Type field of some other type
---       entity. It is used by Gigi to activate the special processing for such
---       types (unchecked conversions that would not otherwise be allowed are
---       allowed for such types). If the Is_Packed_Array_Type flag is set in
---       an entity, then the Original_Array_Type field of this entity points
---       to the original array type for which this is the packed array type.
+--       entity. It is used by the backend to activate the special processing
+--       for such types (unchecked conversions that would not otherwise be
+--       allowed are allowed for such types). If the Is_Packed_Array_Type flag
+--       is set in an entity, then the Original_Array_Type field of this entity
+--       points to the array type for which this is the packed array type.
 
 --    Is_Potentially_Use_Visible (Flag9)
 --       Defined in all entities. Set if entity is potentially use visible,
@@ -2797,8 +2797,8 @@
 --       Defined in all entities. Set to indicate that an entity defined in
 --       one compilation unit can be referenced from other compilation units.
 --       If this reference causes a reference in the generated variable, for
---       example in the case of a variable name, then Gigi will generate an
---       appropriate external name for use by the linker.
+--       example in the case of a variable name, then the backend will generate
+--       an appropriate external name for use by the linker.
 
 --    Is_Protected_Record_Type (synthesized)
 --       Applies to all entities, true if Is_Concurrent_Record_Type is true and
@@ -3011,7 +3011,7 @@
 --       and full view. The flag is not set reliably on private subtypes,
 --       and is always retrieved from the base type (but this is not a base-
 --       type-only attribute because it applies to other entities). Note that
---       the back end should use Treat_As_Volatile, rather than Is_Volatile
+--       the backend should use Treat_As_Volatile, rather than Is_Volatile
 --       to indicate code generation requirements for volatile variables.
 --       Similarly, any front end test which is concerned with suppressing
 --       optimizations on volatile objects should test Treat_As_Volatile
@@ -3158,7 +3158,7 @@
 --       Defined in entities for types and subtypes. Set if objects of the type
 --       must always be allocated on a byte boundary (more accurately a storage
 --       unit boundary). The front end checks that component clauses respect
---       this rule, and the back end ensures that record packing does not
+--       this rule, and the backend ensures that record packing does not
 --       violate this rule. Currently the flag is set only for packed arrays
 --       longer than 64 bits where the component size is not a power of 2.
 
@@ -3175,7 +3175,7 @@
 --       Comes_From_Source set, and also transitively for entities associated
 --       with such components (e.g. their types). It is true for all entities
 --       in Debug_Generated_Code mode (-gnatD switch). This is the flag that
---       the back end should check to determine whether or not to generate
+--       the backend should check to determine whether or not to generate
 --       debugging information for an entity. Note that callers should always
 --       use Sem_Util.Set_Debug_Info_Needed, rather than Set_Needs_Debug_Info,
 --       so that the flag is set properly on subsidiary entities.
@@ -3283,7 +3283,7 @@
 --    Next_Inlined_Subprogram (Node12)
 --       Defined in subprograms. Used to chain inlined subprograms used in
 --       the current compilation, in the order in which they must be compiled
---       by Gigi to insure that all inlinings are performed.
+--       by the backend to insure that all inlinings are performed.
 
 --    Next_Literal (synthesized)
 --       Applies to enumeration literals, returns the next literal, or
@@ -3339,10 +3339,10 @@
 --       there are default discriminants, and also for the 'Size value).
 
 --    No_Strict_Aliasing (Flag136) [base type only]
---       Defined in access types. Set to direct the back end to avoid any
+--       Defined in access types. Set to direct the backend to avoid any
 --       optimizations based on an assumption about the aliasing status of
 --       objects designated by the access type. For the case of the gcc
---       back end, the effect is as though all references to objects of
+--       backend, the effect is as though all references to objects of
 --       the type were compiled with -fno-strict-aliasing. This flag is
 --       set if an unchecked conversion with the access type as a target
 --       type occurs in the same source unit as the declaration of the
@@ -3372,7 +3372,7 @@
 --       types, it is cheaper to do the copy.
 
 --    OK_To_Reorder_Components (Flag239) [base type only]
---       Defined in record types. Set if the back end is permitted to reorder
+--       Defined in record types. Set if the backend is permitted to reorder
 --       the components. If not set, the record must be layed out in the order
 --       in which the components are declared textually. Currently this flag
 --       can only be set by debug switches.
@@ -3413,9 +3413,9 @@
 --       In base tagged types:
 --         When the component is inherited in a record extension, it points
 --         to the original component (the entity of the ancestor component
---         which is not itself inherited) otherwise it points to itself.
---         Gigi uses this attribute to implement the automatic dereference in
---         the extension and to apply the transformation:
+--         which is not itself inherited) otherwise it points to itself. The
+--         backend uses this attribute to implement the automatic dereference
+--         in the extension and to apply the transformation:
 --
 --            Rec_Ext.Comp -> Rec_Ext.Parent. ... .Parent.Comp
 --
@@ -3999,7 +3999,7 @@
 --       be set as a result of situations (such as address overlays) where
 --       the front end wishes to force volatile handling to inhibit aliasing
 --       optimization which might be legally ok, but is undesirable. Note
---       that the back end always tests this flag rather than Is_Volatile.
+--       that the backend always tests this flag rather than Is_Volatile.
 --       The front end tests Is_Volatile if it is concerned with legality
 --       checks associated with declared volatile variables, but if the test
 --       is for the purposes of suppressing optimizations, then the front
@@ -4029,7 +4029,7 @@
 --       the full view of a private type T is derived from another private type
 --       with discriminants Td, the full view of T is also private, and there
 --       is no way to attach to it a further full view that would convey the
---       structure of T to the back end. The Underlying_Full_ View is an
+--       structure of T to the backend. The Underlying_Full_ View is an
 --       attribute of the full view that is a subtype of Td with the same
 --       constraint as the declaration for T. The declaration for this subtype
 --       is built at the point of the declaration of T, either as completion,
@@ -4222,7 +4222,7 @@
 --  In addition, we define the kind E_Allocator_Type to label allocators.
 --  This is because special resolution rules apply to this construct.
 --  Eventually the constructs are labeled with the access type imposed by
---  the context. Gigi should never see types with this Ekind.
+--  the context. The backend should never see types with this Ekind.
 
 --  Similarly, the type E_Access_Attribute_Type is used as the initial kind
 --  associated with an access attribute. After resolution a specific access
@@ -4409,8 +4409,8 @@
       --  objects using 'Reference. This is needed because special resolution
       --  rules apply to these constructs. On the resolution pass, this type
       --  is almost always replaced by the actual access type, but if the
-      --  context does not provide one Gigi can handle the Allocator_Type
-      --  itself as long as it has been frozen.
+      --  context does not provide one, the backend will see Allocator_Type
+      --  itself (which will already have been frozen).
 
       E_General_Access_Type,
       --  An access type created by an access type declaration with the all
Index: gnat1drv.adb
===================================================================
--- gnat1drv.adb        (revision 211445)
+++ gnat1drv.adb        (working copy)
@@ -81,6 +81,10 @@
 
 with System.Assertions;
 
+--------------
+-- Gnat1drv --
+--------------
+
 procedure Gnat1drv is
    Main_Unit_Node : Node_Id;
    --  Compilation unit node for main unit
@@ -763,6 +767,7 @@
       Scan_Compiler_Arguments;
       Osint.Add_Default_Search_Dirs;
 
+      Atree.Initialize;
       Nlists.Initialize;
       Sinput.Initialize;
       Sem.Initialize;
@@ -785,7 +790,7 @@
 
       --  Acquire target parameters from system.ads (source of package System)
 
-      declare
+      Targparm_Acquire : declare
          use Sinput;
 
          S : Source_File_Index;
@@ -812,13 +817,18 @@
          Targparm.Get_Target_Parameters
            (System_Text  => Source_Text  (S),
             Source_First => Source_First (S),
-            Source_Last  => Source_Last  (S));
+            Source_Last  => Source_Last  (S),
+            Make_Id      => Back_End.Make_Id'Unrestricted_Access,
+            Make_SC      => Back_End.Make_SC'Unrestricted_Access,
+            Set_RND      => Back_End.Set_RND'Unrestricted_Access);
 
          --  Acquire configuration pragma information from Targparm
 
          Restrict.Restrictions := Targparm.Restrictions_On_Target;
-      end;
+      end Targparm_Acquire;
 
+      --  Perform various adjustments and settings of global switches
+
       Adjust_Global_Switches;
 
       --  Output copyright notice if full list mode unless we have a list
Index: targparm.adb
===================================================================
--- targparm.adb        (revision 211445)
+++ targparm.adb        (working copy)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1999-2013, Free Software Foundation, Inc.         --
+--          Copyright (C) 1999-2014, Free Software Foundation, Inc.         --
 --                                                                          --
 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
 -- terms of the  GNU General Public License as published  by the Free Soft- --
@@ -160,7 +160,11 @@
 
    --  Version which reads in system.ads
 
-   procedure Get_Target_Parameters is
+   procedure Get_Target_Parameters
+     (Make_Id : Make_Id_Type := null;
+      Make_SC : Make_SC_Type := null;
+      Set_RND : Set_RND_Type := null)
+   is
       Text : Source_Buffer_Ptr;
       Hi   : Source_Ptr;
 
@@ -183,7 +187,10 @@
       Get_Target_Parameters
         (System_Text  => Text,
          Source_First => 0,
-         Source_Last  => Hi);
+         Source_Last  => Hi,
+         Make_Id      => Make_Id,
+         Make_SC      => Make_SC,
+         Set_RND      => Set_RND);
    end Get_Target_Parameters;
 
    --  Version where caller supplies system.ads text
@@ -191,7 +198,10 @@
    procedure Get_Target_Parameters
      (System_Text  : Source_Buffer_Ptr;
       Source_First : Source_Ptr;
-      Source_Last  : Source_Ptr)
+      Source_Last  : Source_Ptr;
+      Make_Id      : Make_Id_Type := null;
+      Make_SC      : Make_SC_Type := null;
+      Set_RND      : Set_RND_Type := null)
    is
       P : Source_Ptr;
       --  Scans source buffer containing source of system.ads
@@ -341,6 +351,61 @@
                null;
             end loop Ploop;
 
+            --  No_Dependence case
+
+            if System_Text (P .. P + 16) = "No_Dependence => " then
+               P := P + 17;
+
+               --  Skip this processing (and simply ignore No_Dependence lines)
+               --  if caller did not supply the three subprograms we need to
+               --  process these lines.
+
+               if Make_Id = null then
+                  goto Line_Loop_Continue;
+               end if;
+
+               --  We have scanned out "pragma Restrictions (No_Dependence =>"
+
+               declare
+                  Unit  : Node_Id;
+                  Id    : Node_Id;
+                  Start : Source_Ptr;
+
+               begin
+                  Unit := Empty;
+
+                  --  Loop through components of name, building up Unit
+
+                  loop
+                     Start := P;
+                     while System_Text (P) /= '.'
+                             and then
+                           System_Text (P) /= ')'
+                     loop
+                        P := P + 1;
+                     end loop;
+
+                     Id := Make_Id (System_Text (Start .. P - 1));
+
+                     --  If first name, just capture the identifier
+
+                     if Unit = Empty then
+                        Unit := Id;
+                     else
+                        Unit := Make_SC (Unit, Id);
+                     end if;
+
+                     exit when System_Text (P) = ')';
+                     P := P + 1;
+                  end loop;
+
+                  Set_RND (Unit);
+                  goto Line_Loop_Continue;
+               end;
+            end if;
+
+            --  Here if unrecognizable restrictions pragma form
+
             Set_Standard_Error;
             Write_Line
                ("fatal error: system.ads is incorrectly formatted");
Index: targparm.ads
===================================================================
--- targparm.ads        (revision 211445)
+++ targparm.ads        (working copy)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 S p e c                                  --
 --                                                                          --
---          Copyright (C) 1999-2013, Free Software Foundation, Inc.         --
+--          Copyright (C) 1999-2014, Free Software Foundation, Inc.         --
 --                                                                          --
 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
 -- terms of the  GNU General Public License as published  by the Free Soft- --
@@ -612,17 +612,42 @@
    --  These subprograms are used to initialize the target parameter values
    --  from the system.ads file. Note that this is only done once, so if more
    --  than one call is made to either routine, the second and subsequent
-   --  calls are ignored.
+   --  calls are ignored. It also reads restriction pragmas from system.ads
+   --  and records them, though as further detailed below, the caller has some
+   --  control over the handling of No_Dependence restrictions.
 
+   type Make_Id_Type is access function (Str : Text_Buffer) return Node_Id;
+   --  Parameter type for Get_Target_Parameters for function that creates an
+   --  identifier node with Sloc value System_Location and given string as the
+   --  Chars value.
+
+   type Make_SC_Type is access function (Pre, Sel : Node_Id) return Node_Id;
+   --  Parameter type for Get_Target_Parameters for function that creates a
+   --  selected component with Sloc value System_Location and given Prefix
+   --  (Pre) and Selector (Sel) values.
+
+   type Set_RND_Type is access procedure (Unit : Node_Id);
+   --  Parameter type for Get_Target_Parameters that records a Restriction
+   --  No_Dependence for the given unit (identifier or selected component).
+
    procedure Get_Target_Parameters
      (System_Text  : Source_Buffer_Ptr;
       Source_First : Source_Ptr;
-      Source_Last  : Source_Ptr);
+      Source_Last  : Source_Ptr;
+      Make_Id      : Make_Id_Type := null;
+      Make_SC      : Make_SC_Type := null;
+      Set_RND      : Set_RND_Type := null);
    --  Called at the start of execution to obtain target parameters from
    --  the source of package System. The parameters provide the source
    --  text to be scanned (in System_Text (Source_First .. Source_Last)).
+   --  if the three subprograms are left at their default value of null,
+   --  Get_Target_Parameters will ignore pragma Restrictions No_Dependence
+   --  lines, otherwise it will use these three subprograms to record them.
 
-   procedure Get_Target_Parameters;
+   procedure Get_Target_Parameters
+     (Make_Id : Make_Id_Type := null;
+      Make_SC : Make_SC_Type := null;
+      Set_RND : Set_RND_Type := null);
    --  This version reads in system.ads using Osint. The idea is that the
    --  caller uses the first version if they have to read system.ads anyway
    --  (e.g. the compiler) and uses this simpler interface if system.ads is
Index: back_end.adb
===================================================================
--- back_end.adb        (revision 211445)
+++ back_end.adb        (working copy)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1992-2013, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2014, Free Software Foundation, Inc.         --
 --                                                                          --
 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
 -- terms of the  GNU General Public License as published  by the Free Soft- --
@@ -24,6 +24,7 @@
 ------------------------------------------------------------------------------
 
 with Atree;     use Atree;
+with Csets;     use Csets;
 with Debug;     use Debug;
 with Elists;    use Elists;
 with Errout;    use Errout;
@@ -33,13 +34,14 @@
 with Osint.C;   use Osint.C;
 with Namet;     use Namet;
 with Nlists;    use Nlists;
+with Nmake;     use Nmake;
+with Restrict;  use Restrict;
 with Stand;     use Stand;
 with Sinput;    use Sinput;
 with Stringt;   use Stringt;
 with Switch;    use Switch;
 with Switch.C;  use Switch.C;
 with System;    use System;
-with Types;     use Types;
 
 with System.OS_Lib; use System.OS_Lib;
 
@@ -163,6 +165,15 @@
          gigi_operating_mode           => Mode);
    end Call_Back_End;
 
+   -------------------------------
+   -- Gen_Or_Update_Object_File --
+   -------------------------------
+
+   procedure Gen_Or_Update_Object_File is
+   begin
+      null;
+   end Gen_Or_Update_Object_File;
+
    -------------
    -- Len_Arg --
    -------------
@@ -178,6 +189,36 @@
       raise Program_Error;
    end Len_Arg;
 
+   -------------
+   -- Make_Id --
+   -------------
+
+   function Make_Id (Str : Text_Buffer) return Node_Id is
+   begin
+      Name_Len := 0;
+
+      for J in Str'Range loop
+         Name_Len := Name_Len + 1;
+         Name_Buffer (Name_Len) := Fold_Lower (Str (J));
+      end loop;
+
+      return
+        Make_Identifier (System_Location,
+          Chars => Name_Find);
+   end Make_Id;
+
+   -------------
+   -- Make_SC --
+   -------------
+
+   function  Make_SC (Pre, Sel : Node_Id) return Node_Id is
+   begin
+      return
+        Make_Selected_Component (System_Location,
+          Prefix        => Pre,
+          Selector_Name => Sel);
+   end Make_SC;
+
    -----------------------------
    -- Scan_Compiler_Arguments --
    -----------------------------
@@ -342,13 +383,13 @@
       end loop;
    end Scan_Compiler_Arguments;
 
-   -------------------------------
-   -- Gen_Or_Update_Object_File --
-   -------------------------------
+   -------------
+   -- Set_RND --
+   -------------
 
-   procedure Gen_Or_Update_Object_File is
+   procedure Set_RND (Unit : Node_Id) is
    begin
-      null;
-   end Gen_Or_Update_Object_File;
+      Restrict.Set_Restriction_No_Dependence (Unit, Warn => False);
+   end Set_RND;
 
 end Back_End;
Index: back_end.ads
===================================================================
--- back_end.ads        (revision 211445)
+++ back_end.ads        (working copy)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 S p e c                                  --
 --                                                                          --
---          Copyright (C) 1992-2013, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2014, Free Software Foundation, Inc.         --
 --                                                                          --
 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
 -- terms of the  GNU General Public License as published  by the Free Soft- --
@@ -24,7 +24,11 @@
 ------------------------------------------------------------------------------
 
 --  Call the back end with all the information needed
+--  Note: there are multiple bodies/variants of this package, so do not
+--  modify this spec without coordination.
 
+with Types; use Types;
+
 package Back_End is
 
    type Back_End_Mode_Type is (
@@ -82,4 +86,13 @@
    --  object file's timestamp is correct when compared with the corresponding
    --  ali file by gnatmake.
 
+   function  Make_Id (Str : Text_Buffer) return Node_Id;
+   function  Make_SC (Pre, Sel : Node_Id) return Node_Id;
+   procedure Set_RND (Unit : Node_Id);
+   --  Subprograms for call to Get_Target_Parameters, see spec of package
+   --  Targparm for full description of these three subprograms. These are
+   --  parked in this package because they are have to be at the top level
+   --  because of accessibility issues, and Gnat1drv, which is where they
+   --  are used, is a subprogram.
+
 end Back_End;

Reply via email to