[multiple changes]
authorEmmanuel Briot <briot@adacore.com>
Wed, 3 Aug 2011 10:01:51 +0000 (10:01 +0000)
committerArnaud Charlet <charlet@gcc.gnu.org>
Wed, 3 Aug 2011 10:01:51 +0000 (12:01 +0200)
2011-08-03  Yannick Moy  <moy@adacore.com>

* alfa.ads Update format of ALFA section in ALI file in order to add a
mapping from bodies to specs when both are present
(ALFA_Scope_Record): add components for spec file/scope
* get_alfa.adb (Get_ALFA): read the new file/scope for spec when present
* lib-xref-alfa.adb
(Collect_ALFA): after all scopes have been collected, fill in the spec
 information when relevant
* put_alfa.adb (Put_ALFA): write the new file/scope for spec when
present.

2011-08-03  Eric Botcazou  <ebotcazou@adacore.com>

* inline.adb (Add_Inlined_Subprogram): Do not consider the enclosing
code unit to decide whether to add internally generated subprograms.

2011-08-03  Javier Miranda  <miranda@adacore.com>

* sem_aux.ads, sem_aux.adb (Is_VM_By_Copy_Actual): New subprogram.
* exp_ch9.adb
(Build_Simple_Entry_Call): Handle actuals that must be handled by copy
in VM targets.

2011-08-03  Emmanuel Briot  <briot@adacore.com>

* make.adb, makeutl.adb, makeutl.ads (Make.Switches_Of): now shares
code with Makeutl.Get_Switches.
* prj-tree.adb: Update comment.

From-SVN: r177257

gcc/ada/ChangeLog
gcc/ada/prj-env.adb
gcc/ada/prj-env.ads
gcc/ada/prj-ext.adb
gcc/ada/prj-ext.ads
gcc/ada/prj-proc.adb
gcc/ada/prj-tree.adb
gcc/ada/prj-tree.ads

index 3090c3eeb7a2b6c74c9d9798938e9d27a1b3481e..7ce74cf3dfebc3c8177950e179e05cf0a297fa9e 100644 (file)
@@ -1,3 +1,9 @@
+2011-08-03  Emmanuel Briot  <briot@adacore.com>
+
+       * prj-proc.adb, prj-ext.adb, prj-ext.ads, prj-env.adb, prj-env.ads,
+       prj-tree.adb, prj-tree.ads (Initialize_And_Copy, Copy): new subprograms
+       (Process_Declarative_Items): new parameter Child_Env.
+
 2011-08-03  Yannick Moy  <moy@adacore.com>
 
        * alfa.ads Update format of ALFA section in ALI file in order to add a
index 62852220b37d627c0bb0a7cf8fad062d45a2ef77..050660e9b9d73876db29890f9b9ea46544a09246 100644 (file)
@@ -2197,4 +2197,18 @@ package body Prj.Env is
       Projects_Paths.Reset (Self.Cache);
    end Free;
 
+   ----------
+   -- Copy --
+   ----------
+
+   procedure Copy (From : Project_Search_Path; To : out Project_Search_Path) is
+   begin
+      Free (To);
+      if From.Path /= null then
+         To.Path := new String'(From.Path.all);
+      end if;
+
+      --  No need to copy the Cache, it will be recomputed as needed.
+   end Copy;
+
 end Prj.Env;
index 61c043108b981a4ef482d628a13919826e83946b..75f014a4b206d277f54618bd127093f0da36a91f 100644 (file)
@@ -162,6 +162,8 @@ package Prj.Env is
    --  to search for projects on the path (and caches the results to improve
    --  efficiency).
 
+   No_Project_Search_Path : constant Project_Search_Path;
+
    procedure Initialize_Default_Project_Path
      (Self        : in out Project_Search_Path;
       Target_Name : String);
@@ -170,6 +172,9 @@ package Prj.Env is
    --  variables ADA_PROJECT_PATH and GPR_PROJECT_PATH). This does nothing if
    --  Self has already been initialized.
 
+   procedure Copy (From : Project_Search_Path; To : out Project_Search_Path);
+   --  Copy From into To
+
    procedure Initialize_Empty (Self : in out Project_Search_Path);
    --  Initialize self with an empty list of directories. If Self had already
    --  been set, it is reset.
@@ -234,4 +239,9 @@ private
 
       Cache : Projects_Paths.Instance;
    end record;
+
+   No_Project_Search_Path : constant Project_Search_Path :=
+     (Path  => null,
+      Cache => Projects_Paths.Nil);
+
 end Prj.Env;
index b9885c310a753d24543bb5ba1de3dadf4a739b00..a235bde8fa2d14221765f00a9cd2b0b213256d02 100644 (file)
@@ -46,9 +46,11 @@ package body Prj.Ext is
          if Copy_From.Refs /= null then
             N := Name_To_Name_HTable.Get_First (Copy_From.Refs.all);
             while N /= null loop
-               N2 := new Name_To_Name;
-               N2.Key := N.Key;
-               N2.Value := N.Value;
+               N2 := new Name_To_Name'
+                 (Key    => N.Key,
+                  Value  => N.Value,
+                  Source => N.Source,
+                  Next   => null);
                Name_To_Name_HTable.Set (Self.Refs.all, N2);
                N := Name_To_Name_HTable.Get_Next (Copy_From.Refs.all);
             end loop;
@@ -63,24 +65,47 @@ package body Prj.Ext is
    procedure Add
      (Self          : External_References;
       External_Name : String;
-      Value         : String)
+      Value         : String;
+      Source        : External_Source := External_Source'First)
    is
-      N : Name_To_Name_Ptr;
+      Key : Name_Id;
+      N   : Name_To_Name_Ptr;
 
    begin
-      N := new Name_To_Name;
-
-      Name_Len := Value'Length;
-      Name_Buffer (1 .. Name_Len) := Value;
-      N.Value := Name_Find;
-
       Name_Len := External_Name'Length;
       Name_Buffer (1 .. Name_Len) := External_Name;
       Canonical_Case_Env_Var_Name (Name_Buffer (1 .. Name_Len));
-      N.Key := Name_Find;
+      Key := Name_Find;
+
+      --  Check whether the value is already defined, to properly respect the
+      --  overriding order.
+
+      if Source /= External_Source'First then
+         N := Name_To_Name_HTable.Get (Self.Refs.all, Key);
+         if N /= null then
+            if External_Source'Pos (N.Source) <
+              External_Source'Pos (Source)
+            then
+               if Current_Verbosity = High then
+                  Debug_Output
+                    ("Not overridding existing variable '" & External_Name
+                     & "', value was defined in " & N.Source'Img);
+               end if;
+               return;
+            end if;
+         end if;
+      end if;
+
+      Name_Len := Value'Length;
+      Name_Buffer (1 .. Name_Len) := Value;
+      N := new Name_To_Name'
+        (Key    => Key,
+         Source => Source,
+         Value  => Name_Find,
+         Next   => null);
 
       if Current_Verbosity = High then
-         Debug_Output ("Add (" & External_Name & ") is", N.Value);
+         Debug_Output ("Add external (" & External_Name & ") is", N.Value);
       end if;
 
       Name_To_Name_HTable.Set (Self.Refs.all, N);
@@ -103,7 +128,8 @@ package body Prj.Ext is
                External_Name =>
                  Declaration (Declaration'First .. Equal_Pos - 1),
                Value         =>
-                 Declaration (Equal_Pos + 1 .. Declaration'Last));
+                 Declaration (Equal_Pos + 1 .. Declaration'Last),
+               Source        => From_Command_Line);
             return True;
          end if;
       end loop;
@@ -146,6 +172,7 @@ package body Prj.Ext is
          Value := Name_To_Name_HTable.Get (Self.Refs.all, Name_Find);
 
          if Value /= null then
+            Debug_Output ("Value_Of (" & Name & ") is in cache", Value.Value);
             return Value.Value;
          end if;
       end if;
@@ -162,14 +189,15 @@ package body Prj.Ext is
             Val := Name_Find;
 
             if Current_Verbosity = High then
-               Debug_Output ("Value_Of (" & Get_Name_String (External_Name)
-                             & ") is", Val);
+               Debug_Output ("Value_Of (" & Name & ") is", Val);
             end if;
 
             if Self.Refs /= null then
-               Value := new Name_To_Name;
-               Value.Key := External_Name;
-               Value.Value := Val;
+               Value := new Name_To_Name'
+                 (Key    => External_Name,
+                  Value  => Val,
+                  Source => From_Environment,
+                  Next   => null);
                Name_To_Name_HTable.Set (Self.Refs.all, Value);
             end if;
 
@@ -178,8 +206,8 @@ package body Prj.Ext is
 
          else
             if Current_Verbosity = High then
-               Debug_Output ("Value_Of (" & Get_Name_String (External_Name)
-                             & ") is default", With_Default);
+               Debug_Output
+                 ("Value_Of (" & Name & ") is default", With_Default);
             end if;
 
             Free (Env_Value);
index 4ea46080814115c7e69092b5306917cca6daae52..75b0ed2a0f1ba563d888aad9e68245f691a90f7f 100644 (file)
@@ -54,11 +54,25 @@ package Prj.Ext is
    procedure Free (Self : in out External_References);
    --  Free memory used by Self
 
+   type External_Source is
+     (From_Command_Line,
+      From_Environment,
+      From_External_Attribute);
+   --  Where was the value of an external reference defined ?
+   --  They are prioritized in that order, so that a user can always use the
+   --  command line to override a value coming from his environment, or an
+   --  environment variable to override a value defined in an aggregate project
+   --  through the "for External()..." attribute.
+
    procedure Add
      (Self          : External_References;
       External_Name : String;
-      Value         : String);
-   --  Add an external reference (or modify an existing one)
+      Value         : String;
+      Source        : External_Source := External_Source'First);
+   --  Add an external reference (or modify an existing one).
+   --  No overriding is done if the Source's priority is less than the one
+   --  used to previously set the value of the variable. The default for Source
+   --  is such that overriding always occurs.
 
    function Value_Of
      (Self          : External_References;
@@ -88,9 +102,10 @@ private
    type Name_To_Name;
    type Name_To_Name_Ptr is access all Name_To_Name;
    type Name_To_Name is record
-      Key   : Name_Id;
-      Value : Name_Id;
-      Next  : Name_To_Name_Ptr;
+      Key    : Name_Id;
+      Value  : Name_Id;
+      Source : External_Source;
+      Next   : Name_To_Name_Ptr;
    end record;
 
    procedure Set_Next (E : Name_To_Name_Ptr; Next : Name_To_Name_Ptr);
index f83a05f6c979f29ffe417ea24eaa2b0cf7a393f0..4e3ba1ba3688f3cc8b7d2cd92ffaad51476b4e6d 100644 (file)
@@ -131,10 +131,17 @@ package body Prj.Proc is
       Node_Tree         : Project_Node_Tree_Ref;
       Env               : Prj.Tree.Environment;
       Pkg               : Package_Id;
-      Item              : Project_Node_Id);
+      Item              : Project_Node_Id;
+      Child_Env         : in out Prj.Tree.Environment;
+      Can_Modify_Child_Env : Boolean);
    --  Process declarative items starting with From_Project_Node, and put them
    --  in declarations Decl. This is a recursive procedure; it calls itself for
    --  a package declaration or a case construction.
+   --  Child_Env is the modified environment after seeing declarations like
+   --  "for External(...) use" or "for Project_Path use" in aggregate projects.
+   --  It should have been initialized first. This environment can only be
+   --  modified if Can_Modify_Child_Env is True, otherwise all the above
+   --  attributes simply have no effect.
 
    procedure Recursive_Process
      (In_Tree                : Project_Tree_Ref;
@@ -142,13 +149,22 @@ package body Prj.Proc is
       From_Project_Node      : Project_Node_Id;
       From_Project_Node_Tree : Project_Node_Tree_Ref;
       Env                    : in out Prj.Tree.Environment;
-      Extended_By            : Project_Id);
+      Extended_By            : Project_Id;
+      Child_Env              : in out Prj.Tree.Environment;
+      Is_Root_Project        : Boolean);
    --  Process project with node From_Project_Node in the tree. Do nothing if
    --  From_Project_Node is Empty_Node. If project has already been processed,
    --  simply return its project id. Otherwise create a new project id, mark it
    --  as processed, call itself recursively for all imported projects and a
    --  extended project, if any. Then process the declarative items of the
    --  project.
+   --  Child_Env is the environment created from an aggregate project (new
+   --  external values or project path), and should be initialized before the
+   --  call.
+   --  Is_Root_Project should be true only for the project that the user
+   --  explicitly loaded. In the context of aggregate projects, only that
+   --  project is allowed to modify the environment that will be used to load
+   --  projects (Child_Env).
 
    function Get_Attribute_Index
      (Tree  : Project_Node_Tree_Ref;
@@ -1392,7 +1408,9 @@ package body Prj.Proc is
       Node_Tree              : Project_Node_Tree_Ref;
       Env                    : Prj.Tree.Environment;
       Pkg                    : Package_Id;
-      Item                   : Project_Node_Id)
+      Item                   : Project_Node_Id;
+      Child_Env              : in out Prj.Tree.Environment;
+      Can_Modify_Child_Env   : Boolean)
    is
       procedure Check_Or_Set_Typed_Variable
         (Value       : in out Variable_Value;
@@ -1597,7 +1615,9 @@ package body Prj.Proc is
                   Env                    => Env,
                   Pkg                    => New_Pkg,
                   Item                   =>
-                    First_Declarative_Item_Of (Current_Item, Node_Tree));
+                    First_Declarative_Item_Of (Current_Item, Node_Tree),
+                  Child_Env              => Child_Env,
+                  Can_Modify_Child_Env   => Can_Modify_Child_Env);
             end;
          end if;
       end Process_Package_Declaration;
@@ -1949,9 +1969,26 @@ package body Prj.Proc is
          end if;
 
          if Name = Snames.Name_External then
+            if Can_Modify_Child_Env then
+               Add (Child_Env.External,
+                    External_Name => Get_Name_String (Index_Name),
+                    Value         => Get_Name_String (New_Value.Value),
+                    Source        => From_External_Attribute);
+               Add (Env.External,
+                    External_Name => Get_Name_String (Index_Name),
+                    Value         => Get_Name_String (New_Value.Value),
+                    Source        => From_External_Attribute);
+            else
+               if Current_Verbosity = High then
+                  Debug_Output
+                    ("'for External' has no effect except in root aggregate ("
+                     & Get_Name_String (Index_Name) & ")", New_Value.Value);
+               end if;
+            end if;
+
+         elsif Name = Snames.Name_Project_Path then
             Debug_Output
-              ("Defined external value ("
-               & Get_Name_String (Index_Name) & ")", New_Value.Value);
+              ("Defined project path");
          end if;
       end Process_Expression_For_Associative_Array;
 
@@ -2236,7 +2273,9 @@ package body Prj.Proc is
                Node_Tree              => Node_Tree,
                Env                    => Env,
                Pkg                    => Pkg,
-               Item                   => Decl_Item);
+               Item                   => Decl_Item,
+               Child_Env              => Child_Env,
+               Can_Modify_Child_Env   => Can_Modify_Child_Env);
          end if;
       end Process_Case_Construction;
 
@@ -2291,6 +2330,7 @@ package body Prj.Proc is
       Env                    : in out Prj.Tree.Environment;
       Reset_Tree             : Boolean := True)
    is
+      Child_Env : Prj.Tree.Environment;
    begin
       if Reset_Tree then
 
@@ -2306,13 +2346,19 @@ package body Prj.Proc is
 
       Debug_Increase_Indent ("Process tree, phase 1");
 
+      Initialize_And_Copy (Child_Env, Copy_From => Env);
+
       Recursive_Process
         (Project                => Project,
          In_Tree                => In_Tree,
          From_Project_Node      => From_Project_Node,
          From_Project_Node_Tree => From_Project_Node_Tree,
          Env                    => Env,
-         Extended_By            => No_Project);
+         Extended_By            => No_Project,
+         Child_Env              => Child_Env,
+         Is_Root_Project        => True);
+
+      Free (Child_Env);
 
       Success :=
         Total_Errors_Detected = 0
@@ -2448,7 +2494,9 @@ package body Prj.Proc is
       From_Project_Node      : Project_Node_Id;
       From_Project_Node_Tree : Project_Node_Tree_Ref;
       Env                    : in out Prj.Tree.Environment;
-      Extended_By            : Project_Id)
+      Extended_By            : Project_Id;
+      Child_Env              : in out Prj.Tree.Environment;
+      Is_Root_Project        : Boolean)
    is
       procedure Process_Imported_Projects
         (Imported     : in out Project_List;
@@ -2501,7 +2549,9 @@ package body Prj.Proc is
                       (With_Clause, From_Project_Node_Tree),
                   From_Project_Node_Tree => From_Project_Node_Tree,
                   Env                    => Env,
-                  Extended_By            => No_Project);
+                  Extended_By            => No_Project,
+                  Child_Env              => Child_Env,
+                  Is_Root_Project        => False);
 
                --  Imported is the id of the last imported project. If
                --  it is nil, then this imported project is our first.
@@ -2555,7 +2605,7 @@ package body Prj.Proc is
                Errout_Handling   => Prj.Part.Never_Finalize,
                Current_Directory => Get_Name_String (Project.Directory.Name),
                Is_Config_File    => False,
-               Env               => Env);
+               Env               => Child_Env);
 
             Success := not Prj.Tree.No (Loaded_Tree);
 
@@ -2565,8 +2615,10 @@ package body Prj.Proc is
                   Project                => List.Project,
                   From_Project_Node      => Loaded_Tree,
                   From_Project_Node_Tree => From_Project_Node_Tree,
-                  Env                    => Env,
-                  Extended_By            => No_Project);
+                  Env                    => Child_Env,
+                  Extended_By            => No_Project,
+                  Child_Env              => Child_Env,
+                  Is_Root_Project        => False);
             else
                Debug_Output ("Failed to parse", Name_Id (List.Path));
             end if;
@@ -2768,7 +2820,9 @@ package body Prj.Proc is
                  (Declaration_Node, From_Project_Node_Tree),
                From_Project_Node_Tree => From_Project_Node_Tree,
                Env                    => Env,
-               Extended_By            => Project);
+               Extended_By            => Project,
+               Child_Env              => Child_Env,
+               Is_Root_Project        => False);
 
             Process_Declarative_Items
               (Project                => Project,
@@ -2778,7 +2832,9 @@ package body Prj.Proc is
                Env                    => Env,
                Pkg                    => No_Package,
                Item                   => First_Declarative_Item_Of
-                 (Declaration_Node, From_Project_Node_Tree));
+                 (Declaration_Node, From_Project_Node_Tree),
+               Child_Env              => Child_Env,
+               Can_Modify_Child_Env   => Is_Root_Project);
 
             if Project.Extends /= No_Project then
                Process_Extended_Project;
index 3ac6a889f837f3c3db0cb1dddb96fba31eee38c8..0a1b9a58ef084244ac347a50a5d2964e49663540 100644 (file)
@@ -1005,7 +1005,8 @@ package body Prj.Tree is
    ----------------
 
    procedure Initialize
-     (Self : in out Environment; Flags : Processing_Flags) is
+     (Self      : out Environment;
+      Flags     : Processing_Flags) is
    begin
       --  Do not reset the external references, in case we are reloading a
       --  project, since we want to preserve the current environment. But we
@@ -1018,6 +1019,19 @@ package body Prj.Tree is
       Self.Flags := Flags;
    end Initialize;
 
+   -------------------------
+   -- Initialize_And_Copy --
+   -------------------------
+
+   procedure Initialize_And_Copy
+     (Self      : out Environment;
+      Copy_From : Environment) is
+   begin
+      Self.Flags := Copy_From.Flags;
+      Prj.Ext.Initialize (Self.External, Copy_From => Copy_From.External);
+      Prj.Env.Copy (From => Copy_From.Project_Path, To => Self.Project_Path);
+   end Initialize_And_Copy;
+
    ----------
    -- Free --
    ----------
index 69372ae5d6b006552ca489596722c77e80b624f9..fede1f9e438f5bdf43c077e2d0f01ba7a54f20be 100644 (file)
@@ -60,9 +60,16 @@ package Prj.Tree is
       --  Configure errors and warnings
    end record;
 
-   procedure Initialize (Self : in out Environment; Flags : Processing_Flags);
+   procedure Initialize
+     (Self      : out Environment;
+      Flags     : Processing_Flags);
    --  Initialize a new environment
 
+   procedure Initialize_And_Copy
+     (Self      : out Environment;
+      Copy_From : Environment);
+   --  Initialize a new environment, copying its values from Copy_From
+
    procedure Free (Self : in out Environment);
    --  Free the memory used by Self