diff options
author | Arnaud Charlet <charlet@gcc.gnu.org> | 2009-06-23 11:57:45 +0200 |
---|---|---|
committer | Arnaud Charlet <charlet@gcc.gnu.org> | 2009-06-23 11:57:45 +0200 |
commit | 1290ef1492d55f7131e4c7d15bfc4a2b5a7046e4 (patch) | |
tree | 63b071b08e39559bcd93745051792552ce1c32a4 | |
parent | d6a24cdbbf6412c8b716a9dfddefb0b6796222b6 (diff) | |
download | gcc-1290ef1492d55f7131e4c7d15bfc4a2b5a7046e4.zip gcc-1290ef1492d55f7131e4c7d15bfc4a2b5a7046e4.tar.gz gcc-1290ef1492d55f7131e4c7d15bfc4a2b5a7046e4.tar.bz2 |
[multiple changes]
2009-06-23 Emmanuel Briot <briot@adacore.com>
* prj-proc.adb, prj-proc.ads, prj-nmsc.adb, prj-nmsc.ads, prj-conf.adb,
prj-conf.ads (Check_Configuration): New parameter
Compiler_Driver_Mandatory.
2009-06-23 Ed Schonberg <schonberg@adacore.com>
* sem_ch10.adb (Analyze_With_Clause): If a subprogram instance in the
context of the current unit has an inline pragma, the instance is not
rewritten as the declaration of the package wrapper. Handle both
possibilities when retrieving the visible subprogram that renames the
instantiation itself.
From-SVN: r148839
-rw-r--r-- | gcc/ada/ChangeLog | 14 | ||||
-rw-r--r-- | gcc/ada/prj-conf.adb | 41 | ||||
-rw-r--r-- | gcc/ada/prj-conf.ads | 8 | ||||
-rw-r--r-- | gcc/ada/prj-nmsc.adb | 24 | ||||
-rw-r--r-- | gcc/ada/prj-nmsc.ads | 7 | ||||
-rw-r--r-- | gcc/ada/prj-proc.adb | 16 | ||||
-rw-r--r-- | gcc/ada/prj-proc.ads | 3 | ||||
-rw-r--r-- | gcc/ada/sem_ch10.adb | 18 |
8 files changed, 95 insertions, 36 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 2e143ce..6418c11 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,17 @@ +2009-06-23 Emmanuel Briot <briot@adacore.com> + + * prj-proc.adb, prj-proc.ads, prj-nmsc.adb, prj-nmsc.ads, prj-conf.adb, + prj-conf.ads (Check_Configuration): New parameter + Compiler_Driver_Mandatory. + +2009-06-23 Ed Schonberg <schonberg@adacore.com> + + * sem_ch10.adb (Analyze_With_Clause): If a subprogram instance in the + context of the current unit has an inline pragma, the instance is not + rewritten as the declaration of the package wrapper. Handle both + possibilities when retrieving the visible subprogram that renames the + instantiation itself. + 2009-06-23 Javier Miranda <miranda@adacore.com> * exp_ch4.adb (Displace_Allocator_Pointer, Expand_N_Allocator): Handle diff --git a/gcc/ada/prj-conf.adb b/gcc/ada/prj-conf.adb index 2591e6d..7c60f53 100644 --- a/gcc/ada/prj-conf.adb +++ b/gcc/ada/prj-conf.adb @@ -801,6 +801,7 @@ package body Prj.Conf is begin Free (Config_File_Path); + Config := No_Project; if Config_File_Name /= "" then Config_File_Path := Locate_Config_File (Config_File_Name); @@ -830,28 +831,32 @@ package body Prj.Conf is -- Parse the configuration file - if Verbose_Mode then + if Verbose_Mode and then Config_File_Path /= null then Write_Str ("Checking configuration "); Write_Line (Config_File_Path.all); end if; - Prj.Part.Parse - (In_Tree => Project_Node_Tree, - Project => Config_Project_Node, - Project_File_Name => Config_File_Path.all, - Always_Errout_Finalize => False, - Packages_To_Check => Packages_To_Check, - Current_Directory => Current_Directory, - Is_Config_File => True); - - if Config_Project_Node /= Empty_Node then + if Config_File_Path /= null then + Prj.Part.Parse + (In_Tree => Project_Node_Tree, + Project => Config_Project_Node, + Project_File_Name => Config_File_Path.all, + Always_Errout_Finalize => False, + Packages_To_Check => Packages_To_Check, + Current_Directory => Current_Directory, + Is_Config_File => True); + else + -- Maybe the user will want to create his own configuration file + Config_Project_Node := Empty_Node; + end if; - if On_Load_Config /= null then - On_Load_Config - (Config_File => Config_Project_Node, - Project_Node_Tree => Project_Node_Tree); - end if; + if On_Load_Config /= null then + On_Load_Config + (Config_File => Config_Project_Node, + Project_Node_Tree => Project_Node_Tree); + end if; + if Config_Project_Node /= Empty_Node then Prj.Proc.Process_Project_Tree_Phase_1 (In_Tree => Project_Tree, Project => Config, @@ -901,7 +906,8 @@ package body Prj.Conf is Target_Name : String := ""; Normalized_Hostname : String; Report_Error : Put_Line_Access := null; - On_Load_Config : Config_File_Hook := null) + On_Load_Config : Config_File_Hook := null; + Compiler_Driver_Mandatory : Boolean := True) is Main_Config_Project : Project_Id; Success : Boolean; @@ -955,6 +961,7 @@ package body Prj.Conf is Report_Error => Report_Error, Current_Dir => Current_Directory, When_No_Sources => Warning, + Compiler_Driver_Mandatory => Compiler_Driver_Mandatory, Is_Config_File => False); if not Success then diff --git a/gcc/ada/prj-conf.ads b/gcc/ada/prj-conf.ads index 51cb8b3..a3a499f 100644 --- a/gcc/ada/prj-conf.ads +++ b/gcc/ada/prj-conf.ads @@ -31,12 +31,15 @@ with Prj.Tree; package Prj.Conf is type Config_File_Hook is access procedure - (Config_File : Prj.Tree.Project_Node_Id; + (Config_File : in out Prj.Tree.Project_Node_Id; Project_Node_Tree : Prj.Tree.Project_Node_Tree_Ref); -- Hook called after the config file has been parsed. This lets the -- application do last minute changes to it (GPS uses this to add the -- default naming schemes for instance). -- At that point, the config file has not been applied to the project yet. + -- When no config file was found, and automatic generation is disabled, it + -- is possible that Config_File is set to Empty_Node when this procedure is + -- called. You can then decide to create a new config file if you need. procedure Parse_Project_And_Apply_Config (Main_Project : out Prj.Project_Id; @@ -94,7 +97,8 @@ package Prj.Conf is Target_Name : String := ""; Normalized_Hostname : String; Report_Error : Put_Line_Access := null; - On_Load_Config : Config_File_Hook := null); + On_Load_Config : Config_File_Hook := null; + Compiler_Driver_Mandatory : Boolean := True); -- Same as above, except the project must already have been parsed through -- Prj.Part.Parse, and only the processing of the project and the -- configuration is done at this level. diff --git a/gcc/ada/prj-nmsc.adb b/gcc/ada/prj-nmsc.adb index 04f8ec5..6c38cf3 100644 --- a/gcc/ada/prj-nmsc.adb +++ b/gcc/ada/prj-nmsc.adb @@ -281,8 +281,12 @@ package body Prj.Nmsc is procedure Check_Configuration (Project : Project_Id; - In_Tree : Project_Tree_Ref); + In_Tree : Project_Tree_Ref; + Compiler_Driver_Mandatory : Boolean); -- Check the configuration attributes for the project + -- If Compiler_Driver_Mandatory is true, then a Compiler.Driver attribute + -- for each language must be defined, or we will not look for its source + -- files. procedure Check_If_Externally_Built (Project : Project_Id; @@ -791,7 +795,8 @@ package body Prj.Nmsc is When_No_Sources : Error_Warning; Current_Dir : String; Proc_Data : in out Processing_Data; - Is_Config_File : Boolean) + Is_Config_File : Boolean; + Compiler_Driver_Mandatory : Boolean) is Extending : Boolean := False; @@ -824,7 +829,9 @@ package body Prj.Nmsc is -- Check configuration in multi language mode if Must_Check_Configuration then - Check_Configuration (Project, In_Tree); + Check_Configuration + (Project, In_Tree, + Compiler_Driver_Mandatory => Compiler_Driver_Mandatory); end if; -- Library attributes @@ -1132,7 +1139,8 @@ package body Prj.Nmsc is procedure Check_Configuration (Project : Project_Id; - In_Tree : Project_Tree_Ref) + In_Tree : Project_Tree_Ref; + Compiler_Driver_Mandatory : Boolean) is Dot_Replacement : File_Name_Type := No_File; Casing : Casing_Type := All_Lower_Case; @@ -2364,9 +2372,13 @@ package body Prj.Nmsc is while Lang_Index /= No_Language_Index loop Current_Language := Lang_Index.Display_Name; - -- For all languages, Compiler_Driver needs to be specified + -- For all languages, Compiler_Driver needs to be specified. This is + -- only necessary if we do intend to compiler (not in GPS for + -- instance) - if Lang_Index.Config.Compiler_Driver = No_File then + if Compiler_Driver_Mandatory + and then Lang_Index.Config.Compiler_Driver = No_File + then Error_Msg_Name_1 := Current_Language; Error_Msg (Project, diff --git a/gcc/ada/prj-nmsc.ads b/gcc/ada/prj-nmsc.ads index 4c0db4e..8ab78af 100644 --- a/gcc/ada/prj-nmsc.ads +++ b/gcc/ada/prj-nmsc.ads @@ -47,7 +47,8 @@ private package Prj.Nmsc is When_No_Sources : Error_Warning; Current_Dir : String; Proc_Data : in out Processing_Data; - Is_Config_File : Boolean); + Is_Config_File : Boolean; + Compiler_Driver_Mandatory : Boolean); -- Perform consistency and semantic checks on a project, starting from the -- project tree parsed from the .gpr file. This procedure interprets the -- various case statements in the project based on the current environment @@ -69,6 +70,10 @@ private package Prj.Nmsc is -- language are found in a project where this language is declared. -- -- Is_Config_File should be True if Project is config file (.cgpr) + -- + -- If Compiler_Driver_Mandatory is true, then a Compiler.Driver attribute + -- for each language must be defined, or we will not look for its source + -- files. private type Processing_Data is record diff --git a/gcc/ada/prj-proc.adb b/gcc/ada/prj-proc.adb index 31efd81..c65a286 100644 --- a/gcc/ada/prj-proc.adb +++ b/gcc/ada/prj-proc.adb @@ -83,7 +83,8 @@ package body Prj.Proc is Project : Project_Id; Current_Dir : String; When_No_Sources : Error_Warning; - Is_Config_File : Boolean); + Is_Config_File : Boolean; + Compiler_Driver_Mandatory : Boolean); -- Set all projects to not checked, then call Recursive_Check for the -- main project Project. Project is set to No_Project if errors occurred. -- Current_Dir is for optimization purposes, avoiding extra system calls. @@ -152,6 +153,7 @@ package body Prj.Proc is When_No_Sources : Error_Warning; Proc_Data : Processing_Data; Is_Config_File : Boolean; + Compiler_Driver_Mandatory : Boolean; end record; -- Data passed to Recursive_Check -- Current_Dir is for optimization purposes, avoiding extra system calls. @@ -283,7 +285,8 @@ package body Prj.Proc is Project : Project_Id; Current_Dir : String; When_No_Sources : Error_Warning; - Is_Config_File : Boolean) + Is_Config_File : Boolean; + Compiler_Driver_Mandatory : Boolean) is Dir : aliased String := Current_Dir; @@ -297,6 +300,7 @@ package body Prj.Proc is Data.Current_Dir := Dir'Unchecked_Access; Data.When_No_Sources := When_No_Sources; Data.Is_Config_File := Is_Config_File; + Data.Compiler_Driver_Mandatory := Compiler_Driver_Mandatory; Initialize (Data.Proc_Data); Check_All_Projects (Project, Data, Imported_First => True); @@ -1259,6 +1263,7 @@ package body Prj.Proc is Report_Error => Report_Error, When_No_Sources => When_No_Sources, Current_Dir => Current_Dir, + Compiler_Driver_Mandatory => True, Is_Config_File => Is_Config_File); end if; end Process; @@ -2313,7 +2318,8 @@ package body Prj.Proc is Report_Error : Put_Line_Access; When_No_Sources : Error_Warning := Error; Current_Dir : String; - Is_Config_File : Boolean) + Is_Config_File : Boolean; + Compiler_Driver_Mandatory : Boolean) is Obj_Dir : Path_Name_Type; Extending : Project_Id; @@ -2328,7 +2334,8 @@ package body Prj.Proc is if Project /= No_Project then Check (In_Tree, Project, Current_Dir, When_No_Sources, - Is_Config_File => Is_Config_File); + Is_Config_File => Is_Config_File, + Compiler_Driver_Mandatory => Compiler_Driver_Mandatory); end if; -- If main project is an extending all project, set the object @@ -2452,6 +2459,7 @@ package body Prj.Proc is Prj.Nmsc.Check (Project, Data.In_Tree, Error_Report, Data.When_No_Sources, Data.Current_Dir.all, Data.Proc_Data, + Compiler_Driver_Mandatory => Data.Compiler_Driver_Mandatory, Is_Config_File => Data.Is_Config_File); end Recursive_Check; diff --git a/gcc/ada/prj-proc.ads b/gcc/ada/prj-proc.ads index e15c8ef..72b4213 100644 --- a/gcc/ada/prj-proc.ads +++ b/gcc/ada/prj-proc.ads @@ -66,7 +66,8 @@ package Prj.Proc is Report_Error : Put_Line_Access; When_No_Sources : Error_Warning := Error; Current_Dir : String; - Is_Config_File : Boolean); + Is_Config_File : Boolean; + Compiler_Driver_Mandatory : Boolean); -- Perform the second phase of the processing, filling the rest of the -- project with the information extracted from the project tree. This phase -- requires that the configuration file has already been parsed (in fact diff --git a/gcc/ada/sem_ch10.adb b/gcc/ada/sem_ch10.adb index 04f6f99..efb0ca7 100644 --- a/gcc/ada/sem_ch10.adb +++ b/gcc/ada/sem_ch10.adb @@ -2375,11 +2375,19 @@ package body Sem_Ch10 is elsif Unit_Kind in N_Subprogram_Instantiation then - -- Instantiation node is replaced with a wrapper package. Retrieve - -- the visible subprogram created by the instance from corresponding - -- attribute of the wrapper. - - E_Name := Related_Instance (Defining_Entity (U)); + -- The visible subprogram is created during instantiation, and is + -- an attribute of the wrapper package. We retrieve the wrapper + -- package directly from the instantiation node. If the instance + -- is inlined the unit is still an instantiation. Otherwise it has + -- been rewritten as the declaration of the wrapper itself. + + if Nkind (U) in N_Subprogram_Instantiation then + E_Name := + Related_Instance + (Defining_Entity (Specification (Instance_Spec (U)))); + else + E_Name := Related_Instance (Defining_Entity (U)); + end if; elsif Unit_Kind = N_Package_Renaming_Declaration or else Unit_Kind in N_Generic_Renaming_Declaration |