aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArnaud Charlet <charlet@gcc.gnu.org>2009-06-23 11:57:45 +0200
committerArnaud Charlet <charlet@gcc.gnu.org>2009-06-23 11:57:45 +0200
commit1290ef1492d55f7131e4c7d15bfc4a2b5a7046e4 (patch)
tree63b071b08e39559bcd93745051792552ce1c32a4
parentd6a24cdbbf6412c8b716a9dfddefb0b6796222b6 (diff)
downloadgcc-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/ChangeLog14
-rw-r--r--gcc/ada/prj-conf.adb41
-rw-r--r--gcc/ada/prj-conf.ads8
-rw-r--r--gcc/ada/prj-nmsc.adb24
-rw-r--r--gcc/ada/prj-nmsc.ads7
-rw-r--r--gcc/ada/prj-proc.adb16
-rw-r--r--gcc/ada/prj-proc.ads3
-rw-r--r--gcc/ada/sem_ch10.adb18
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