diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index efd983c628d..1389ebf4dd7 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,12 @@ +2012-01-30 Pascal Obry + + * prj-proc.adb (Recursive_Process): Set From_Encapsulated_Lib + boolean value to true in the process list created by this routine. + * prj.ads (Project_List_Element): New field From_Encapsulated_Lib. + Continued work for KA06-021. + * prj.adb (Compute_All_Imported_Projects): Set + From_Encapsulated_Lib boolean flag. + 2012-01-30 Vincent Pucci * sem_dim.adb (Expand_Put_Call_With_Dimension_Symbol): Minor diff --git a/gcc/ada/prj-proc.adb b/gcc/ada/prj-proc.adb index 8e5060be243..0e45c0d6951 100644 --- a/gcc/ada/prj-proc.adb +++ b/gcc/ada/prj-proc.adb @@ -6,7 +6,7 @@ -- -- -- B o d y -- -- -- --- Copyright (C) 2001-2011, Free Software Foundation, Inc. -- +-- Copyright (C) 2001-2012, 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- -- @@ -32,6 +32,7 @@ with Prj.Env; with Prj.Err; use Prj.Err; with Prj.Ext; use Prj.Ext; with Prj.Nmsc; use Prj.Nmsc; +with Prj.Util; with Prj.Part; with Snames; @@ -149,7 +150,8 @@ 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; + From_Encapsulated_Lib : 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 @@ -161,6 +163,9 @@ package body Prj.Proc is -- 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). + -- + -- From_Encapsulated_Lib is true if we are parsing a project from + -- encapsulated library dependencies. function Get_Attribute_Index (Tree : Project_Node_Tree_Ref; @@ -2357,7 +2362,8 @@ package body Prj.Proc is From_Project_Node => From_Project_Node, From_Project_Node_Tree => From_Project_Node_Tree, Env => Env, - Extended_By => No_Project); + Extended_By => No_Project, + From_Encapsulated_Lib => False); Success := Total_Errors_Detected = 0 @@ -2491,7 +2497,8 @@ 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; + From_Encapsulated_Lib : Boolean) is Shared : constant Shared_Project_Tree_Data_Access := In_Tree.Shared; @@ -2550,21 +2557,20 @@ package body Prj.Proc is Project_Node_Of (With_Clause, From_Project_Node_Tree), From_Project_Node_Tree => From_Project_Node_Tree, Env => Env, - Extended_By => No_Project); - - -- Imported is the id of the last imported project. If - -- it is nil, then this imported project is our first. + Extended_By => No_Project, + From_Encapsulated_Lib => From_Encapsulated_Lib); if Imported = null then - Project.Imported_Projects := - new Project_List_Element' - (Project => New_Project, - Next => null); + Project.Imported_Projects := new Project_List_Element' + (Project => New_Project, + From_Encapsulated_Lib => False, + Next => null); Imported := Project.Imported_Projects; else Imported.Next := new Project_List_Element' - (Project => New_Project, - Next => null); + (Project => New_Project, + From_Encapsulated_Lib => False, + Next => null); Imported := Imported.Next; end if; end if; @@ -2762,7 +2768,7 @@ package body Prj.Proc is else declare - Imported : Project_List; + Imported, Mark : Project_List; Declaration_Node : Project_Node_Id := Empty_Node; Name : constant Name_Id := @@ -2795,10 +2801,18 @@ package body Prj.Proc is (Project_Qualifier_Of (From_Project_Node, From_Project_Node_Tree))); + -- Note that at this point we do not know yet if the project has + -- been withed from an encapsulated library or not. + In_Tree.Projects := new Project_List_Element' - (Project => Project, - Next => In_Tree.Projects); + (Project => Project, + From_Encapsulated_Lib => False, + Next => In_Tree.Projects); + + -- Keep track of this point + + Mark := In_Tree.Projects; Processed_Projects.Set (Name, Project); @@ -2874,7 +2888,8 @@ 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, + From_Encapsulated_Lib => From_Encapsulated_Lib); Process_Declarative_Items (Project => Project, @@ -2893,29 +2908,57 @@ package body Prj.Proc is Process_Imported_Projects (Imported, Limited_With => True); - if Err_Vars.Total_Errors_Detected = 0 then - Process_Aggregated_Projects; + -- At this point (after Process_Declarative_Items) we have the + -- attribute values set, we can backtrace In_Tree.Project and + -- set the From_Encapsulated_Library status. - -- For an aggregate library we add the aggregated projects as - -- imported ones. This is necessary to give visibility to all - -- sources from the aggregates from the aggregated library - -- projects. + declare + Lib_Standalone : constant Prj.Variable_Value := + Prj.Util.Value_Of + (Snames.Name_Library_Standalone, + Project.Decl.Attributes, + Shared); + List : Project_List := In_Tree.Projects; + Is_Encapsulated : Boolean; + begin + Get_Name_String (Lib_Standalone.Value); + To_Lower (Name_Buffer (1 .. Name_Len)); - if Project.Qualifier = Aggregate_Library then - declare - L : Aggregated_Project_List; - begin - L := Project.Aggregated_Projects; - while L /= null loop - Project.Imported_Projects := - new Project_List_Element' - (Project => L.Project, - Next => Project.Imported_Projects); - L := L.Next; - end loop; - end; + Is_Encapsulated := Name_Buffer (1 .. Name_Len) = "encapsulated"; + + if Is_Encapsulated then + while List /= null and then List /= Mark loop + List.From_Encapsulated_Lib := Is_Encapsulated; + List := List.Next; + end loop; end if; - end if; + + if Err_Vars.Total_Errors_Detected = 0 then + Process_Aggregated_Projects; + + -- For an aggregate library we add the aggregated projects + -- as imported ones. This is necessary to give visibility + -- to all sources from the aggregates from the aggregated + -- library projects. + + if Project.Qualifier = Aggregate_Library then + declare + L : Aggregated_Project_List; + begin + L := Project.Aggregated_Projects; + while L /= null loop + Project.Imported_Projects := + new Project_List_Element' + (Project => L.Project, + From_Encapsulated_Lib => Is_Encapsulated, + Next => + Project.Imported_Projects); + L := L.Next; + end loop; + end; + end if; + end if; + end; if Project.Qualifier = Aggregate and then In_Tree.Is_Root_Tree then Free (Child_Env); diff --git a/gcc/ada/prj.adb b/gcc/ada/prj.adb index ed2c8572869..efbdaf97d75 100644 --- a/gcc/ada/prj.adb +++ b/gcc/ada/prj.adb @@ -1477,9 +1477,10 @@ package body Prj is Project : Project_Id; procedure Recursive_Add - (Prj : Project_Id; - Tree : Project_Tree_Ref; - Dummy : in out Boolean); + (Prj : Project_Id; + Tree : Project_Tree_Ref; + Context : Project_Context; + Dummy : in out Boolean); -- Recursively add the projects imported by project Project, but not -- those that are extended. @@ -1488,9 +1489,10 @@ package body Prj is ------------------- procedure Recursive_Add - (Prj : Project_Id; - Tree : Project_Tree_Ref; - Dummy : in out Boolean) + (Prj : Project_Id; + Tree : Project_Tree_Ref; + Context : Project_Context; + Dummy : in out Boolean) is pragma Unreferenced (Dummy, Tree); @@ -1521,13 +1523,14 @@ package body Prj is Project.All_Imported_Projects := new Project_List_Element' - (Project => Prj2, - Next => Project.All_Imported_Projects); + (Project => Prj2, + From_Encapsulated_Lib => Context.From_Encapsulated_Lib, + Next => Project.All_Imported_Projects); end if; end Recursive_Add; procedure For_All_Projects is - new For_Every_Project_Imported (Boolean, Recursive_Add); + new For_Every_Project_Imported_Context (Boolean, Recursive_Add); Dummy : Boolean := False; List : Project_List; diff --git a/gcc/ada/prj.ads b/gcc/ada/prj.ads index 93e25df4564..c185aef6e01 100644 --- a/gcc/ada/prj.ads +++ b/gcc/ada/prj.ads @@ -938,8 +938,9 @@ package Prj is type Project_List_Element; type Project_List is access all Project_List_Element; type Project_List_Element is record - Project : Project_Id := No_Project; - Next : Project_List := null; + Project : Project_Id := No_Project; + From_Encapsulated_Lib : Boolean := False; + Next : Project_List := null; end record; -- A list of projects