aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada
diff options
context:
space:
mode:
authorArnaud Charlet <charlet@gcc.gnu.org>2007-06-06 12:37:41 +0200
committerArnaud Charlet <charlet@gcc.gnu.org>2007-06-06 12:37:41 +0200
commitd3cc6a322691df8a2732ec4ee5b0957caa057316 (patch)
treea8498719c9b6fae7520643f6460dafa368f13ec6 /gcc/ada
parent437bae3f742fc7f73ca0755a9e23c503aea872e1 (diff)
downloadgcc-d3cc6a322691df8a2732ec4ee5b0957caa057316.zip
gcc-d3cc6a322691df8a2732ec4ee5b0957caa057316.tar.gz
gcc-d3cc6a322691df8a2732ec4ee5b0957caa057316.tar.bz2
lib-writ.adb: Handle Convention_CIL in addition to Convention_Java, since both are separated.
2007-04-20 Arnaud Charlet <charlet@adacore.com> Vincent Celier <celier@adacore.com> * lib-writ.adb: Handle Convention_CIL in addition to Convention_Java, since both are separated. Add support for imported CIL packages. Add further special handling of "value_type" for CIL. Add special handling of pragma Import for CIL. * make.ads, make.adb: When switch -eS is used, direct all outputs to standard output instead of standard error, except errors. (Absolute_Path): Use untouched casing for the parent directory. (Add_Library_Search_Dir): Use the untouched directory name. (Add_Source_Search_Dir): Idem. (Change_To_Object_Directory): Update output to use proper casing. (Create_Binder_Mapping_File): Use the untouched filename to set ALI_Name. (Gnatmake): Use untouched library and executable directory names. (Insert_Project_Sources): Use untouched filename for spec and body. (Is_In_Object_Directory): Use untouched object directory. (Mark_Directory): Idem. (Collect_Arguments_And_Compile): Ensure that Full_Source_File always contains the non-canonical filename in all cases. (Change_To_Object_Directory): In verbose mode, display the name of the object directory we're changing to. (Compile_Sources): Make sure, when a project file is used, to compile the body of the unit, when there is one, even when only the spec is recorded in an ALI file. (Gcc_Switches, Binder_Switches, Linker_Switches): Tables moved from the spec to the body. (Report_Compilation_Failed): New procedure (Bind, Display_Commands, Compile_Sources, Initialize, Scan_Make_Arg): procedures moved from the spec to the body. (Extract_Failure): Removed, not used Replace explicit raises of exception Bind_Failed and Link_Failed with calls to Make_Failed with the proper message. Replace explicit raises of exception Compilation_Failed with calls to procedure Report_Compilation_Failed. (Initialize): Create mapping files unconditionally when using project files. * sem_mech.adb: (Name_CIL, Name_CIL_Constructor, Convention_CIL, Pragma_CIL_Constructor): New names. * targparm.ads, targparm.adb (Compiler_System_Version): Removed, no longer used. (Get_Target_Parameters): Relax checks on system.ads validity. Add handling of two new system flags: JVM and CLI. From-SVN: r125432
Diffstat (limited to 'gcc/ada')
-rw-r--r--gcc/ada/lib-writ.adb21
-rw-r--r--gcc/ada/make.adb956
-rw-r--r--gcc/ada/make.ads250
-rw-r--r--gcc/ada/sem_mech.adb6
-rw-r--r--gcc/ada/targparm.adb47
-rw-r--r--gcc/ada/targparm.ads43
6 files changed, 693 insertions, 630 deletions
diff --git a/gcc/ada/lib-writ.adb b/gcc/ada/lib-writ.adb
index 14c62f0..d62b70d 100644
--- a/gcc/ada/lib-writ.adb
+++ b/gcc/ada/lib-writ.adb
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- Copyright (C) 1992-2006, Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2007, 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- --
@@ -33,7 +33,6 @@ with Fname; use Fname;
with Fname.UF; use Fname.UF;
with Lib.Util; use Lib.Util;
with Lib.Xref; use Lib.Xref;
-with Namet; use Namet;
with Nlists; use Nlists;
with Gnatvsn; use Gnatvsn;
with Opt; use Opt;
@@ -45,6 +44,7 @@ with Rident; use Rident;
with Scn; use Scn;
with Sinfo; use Sinfo;
with Sinput; use Sinput;
+with Snames; use Snames;
with Stringt; use Stringt;
with Tbuild; use Tbuild;
with Uname; use Uname;
@@ -71,8 +71,8 @@ package body Lib.Writ is
Units.Increment_Last;
Units.Table (Units.Last) :=
(Unit_File_Name => File_Name (S),
- Unit_Name => No_Name,
- Expected_Unit => No_Name,
+ Unit_Name => No_Unit_Name,
+ Expected_Unit => No_Unit_Name,
Source_Index => S,
Cunit => Empty,
Cunit_Entity => Empty,
@@ -427,7 +427,16 @@ package body Lib.Writ is
(Declaration_Node
(Body_Entity (Uent))))))
then
- Write_Info_Str (" EE");
+ if Convention (Uent) = Convention_CIL then
+
+ -- Special case for generic CIL packages which never have
+ -- elaboration code
+
+ Write_Info_Str (" NE");
+
+ else
+ Write_Info_Str (" EE");
+ end if;
end if;
if Has_No_Elaboration_Code (Unode) then
@@ -672,7 +681,7 @@ package body Lib.Writ is
-- For preproc. data and def. files, there is no Unit_Name,
-- check for that first.
- if Unit_Name (J) /= No_Name
+ if Unit_Name (J) /= No_Unit_Name
and then (With_Flags (J) or else Unit_Name (J) = Pname)
then
Num_Withs := Num_Withs + 1;
diff --git a/gcc/ada/make.adb b/gcc/ada/make.adb
index c12cbc5..7fe2d28 100644
--- a/gcc/ada/make.adb
+++ b/gcc/ada/make.adb
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- Copyright (C) 1992-2006, Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2007, 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- --
@@ -54,15 +54,18 @@ with Sinput.P;
with Snames; use Snames;
with Switch; use Switch;
with Switch.M; use Switch.M;
-with Targparm;
+with Targparm; use Targparm;
+with Table;
with Tempdir;
+with Types; use Types;
with Ada.Exceptions; use Ada.Exceptions;
with Ada.Command_Line; use Ada.Command_Line;
with GNAT.Directory_Operations; use GNAT.Directory_Operations;
-with GNAT.Case_Util; use GNAT.Case_Util;
+with System.Case_Util; use System.Case_Util;
+with System.OS_Lib; use System.OS_Lib;
with System.HTable;
package body Make is
@@ -123,7 +126,7 @@ package body Make is
procedure Insert_Q
(Source_File : File_Name_Type;
- Source_Unit : Unit_Name_Type := No_Name;
+ Source_Unit : Unit_Name_Type := No_Unit_Name;
Index : Int := 0);
-- Inserts Source_File at the end of Q. Provide Source_Unit when possible
-- for external use (gnatdist). Provide index for multi-unit sources.
@@ -176,13 +179,40 @@ package body Make is
package Q is new Table.Table (
Table_Component_Type => Q_Record,
- Table_Index_Type => Natural,
+ Table_Index_Type => Integer,
Table_Low_Bound => 0,
Table_Initial => 4000,
Table_Increment => 100,
Table_Name => "Make.Q");
-- This is the actual Q
+ -- The 3 following packages are used to store gcc, gnatbind and gnatlink
+ -- switches found in the project files.
+
+ package Gcc_Switches is new Table.Table (
+ Table_Component_Type => String_Access,
+ Table_Index_Type => Integer,
+ Table_Low_Bound => 1,
+ Table_Initial => 20,
+ Table_Increment => 100,
+ Table_Name => "Make.Gcc_Switches");
+
+ package Binder_Switches is new Table.Table (
+ Table_Component_Type => String_Access,
+ Table_Index_Type => Integer,
+ Table_Low_Bound => 1,
+ Table_Initial => 20,
+ Table_Increment => 100,
+ Table_Name => "Make.Binder_Switches");
+
+ package Linker_Switches is new Table.Table (
+ Table_Component_Type => String_Access,
+ Table_Index_Type => Integer,
+ Table_Low_Bound => 1,
+ Table_Initial => 20,
+ Table_Increment => 100,
+ Table_Name => "Make.Linker_Switches");
+
-- The following instantiations and variables are necessary to save what
-- is found on the command line, in case there is a project file specified.
@@ -279,7 +309,7 @@ package body Make is
Main_Project : Prj.Project_Id := No_Project;
-- The project id of the main project file, if any
- Project_Object_Directory : Project_Id := No_Project;
+ Project_Of_Current_Object_Directory : Project_Id := No_Project;
-- The object directory of the project for the last compilation. Avoid
-- calling Change_Dir if the current working directory is already this
-- directory
@@ -399,30 +429,30 @@ package body Make is
type Header_Num is range 1 .. Max_Header;
-- Header_Num for the hash table Obsoleted below
- function Hash (F : Name_Id) return Header_Num;
+ function Hash (F : File_Name_Type) return Header_Num;
-- Hash function for the hash table Obsoleted below
package Obsoleted is new System.HTable.Simple_HTable
(Header_Num => Header_Num,
Element => Boolean,
No_Element => False,
- Key => Name_Id,
+ Key => File_Name_Type,
Hash => Hash,
Equal => "=");
-- A hash table to keep all files that have been compiled, to detect
-- if an executable is up to date or not.
- procedure Enter_Into_Obsoleted (F : Name_Id);
+ procedure Enter_Into_Obsoleted (F : File_Name_Type);
-- Enter a file name, without directory information, into the hash table
-- Obsoleted.
- function Is_In_Obsoleted (F : Name_Id) return Boolean;
+ function Is_In_Obsoleted (F : File_Name_Type) return Boolean;
-- Check if a file name, without directory information, has already been
-- entered into the hash table Obsoleted.
type Dependency is record
- This : Name_Id;
- Depends_On : Name_Id;
+ This : File_Name_Type;
+ Depends_On : File_Name_Type;
end record;
-- Components of table Dependencies below
@@ -434,10 +464,7 @@ package body Make is
Table_Increment => 100,
Table_Name => "Make.Dependencies");
-- A table to keep dependencies, to be able to decide if an executable
- -- is obsolete.
-
- procedure Add_Dependency (S : Name_Id; On : Name_Id);
- -- Add one entry in table Dependencies
+ -- is obsolete. More explanation needed ???
----------------------------
-- Arguments and Switches --
@@ -485,8 +512,10 @@ package body Make is
-- no additional ALI files should be scanned between the two calls (i.e.
-- between the call to Compile_Sources and List_Depend.)
- procedure Inform (N : Name_Id := No_Name; Msg : String);
- -- Prints out the program name followed by a colon, N and S
+ procedure Inform (N : Name_Id; Msg : String);
+ procedure Inform (N : File_Name_Type; Msg : String);
+ procedure Inform (Msg : String);
+ -- Prints out the program name followed by a colon, N (if present) and Msg
procedure List_Bad_Compilations;
-- Prints out the list of all files for which the compilation failed
@@ -498,6 +527,13 @@ package body Make is
S2 : String := "";
Prefix : String := " -> ";
Minimum_Verbosity : Verbosity_Level_Type := Opt.Low);
+ procedure Verbose_Msg
+ (N1 : File_Name_Type;
+ S1 : String;
+ N2 : File_Name_Type := No_File;
+ S2 : String := "";
+ Prefix : String := " -> ";
+ Minimum_Verbosity : Verbosity_Level_Type := Opt.Low);
-- If the verbose flag (Verbose_Mode) is set and the verbosity level is
-- at least equal to Minimum_Verbosity, then print Prefix to standard
-- output followed by N1 and S1. If N2 /= No_Name then N2 is printed after
@@ -511,6 +547,8 @@ package body Make is
-- Set Usage_Needed to False.
procedure Debug_Msg (S : String; N : Name_Id);
+ procedure Debug_Msg (S : String; N : File_Name_Type);
+ procedure Debug_Msg (S : String; N : Unit_Name_Type);
-- If Debug.Debug_Flag_W is set outputs string S followed by name N
procedure Recursive_Compute_Depth
@@ -554,7 +592,7 @@ package body Make is
-- Check what steps (Compile, Bind, Link) must be executed.
-- Set the step flags accordingly.
- function In_Ada_Lib_Dir (File : File_Name_Type) return Boolean;
+ function In_Ada_Lib_Dir (File : File_Name_Type) return Boolean;
-- Get directory prefix of this file and get lib mark stored in name
-- table for this directory. Then check if an Ada lib mark has been set.
@@ -577,7 +615,7 @@ package body Make is
-- compiler.
function Switches_Of
- (Source_File : Name_Id;
+ (Source_File : File_Name_Type;
Source_File_Name : String;
Source_Index : Int;
Naming : Naming_Data;
@@ -612,11 +650,11 @@ package body Make is
-- Given by the command line. Will be used, if non null
Gcc_Path : String_Access :=
- GNAT.OS_Lib.Locate_Exec_On_Path (Gcc.all);
+ System.OS_Lib.Locate_Exec_On_Path (Gcc.all);
Gnatbind_Path : String_Access :=
- GNAT.OS_Lib.Locate_Exec_On_Path (Gnatbind.all);
+ System.OS_Lib.Locate_Exec_On_Path (Gnatbind.all);
Gnatlink_Path : String_Access :=
- GNAT.OS_Lib.Locate_Exec_On_Path (Gnatlink.all);
+ System.OS_Lib.Locate_Exec_On_Path (Gnatlink.all);
-- Path for compiler, binder, linker programs, defaulted now for gnatdist.
-- Changed later if overridden on command line.
@@ -721,14 +759,17 @@ package body Make is
-- Displays Program followed by the arguments in Args if variable
-- Display_Executed_Programs is set. The lower bound of Args must be 1.
+ procedure Report_Compilation_Failed;
+ -- Delete all temporary files and fail graciously
+
-----------------
-- Mapping files
-----------------
- type Temp_File_Names is
- array (Project_Id range <>, Positive range <>) of Name_Id;
+ type Temp_Path_Names is
+ array (Project_Id range <>, Positive range <>) of Path_Name_Type;
- type Temp_Files_Ptr is access Temp_File_Names;
+ type Temp_Path_Ptr is access Temp_Path_Names;
type Indices is array (Project_Id range <>) of Natural;
@@ -739,7 +780,7 @@ package body Make is
type Free_Indices_Ptr is access Free_File_Indices;
- The_Mapping_File_Names : Temp_Files_Ptr;
+ The_Mapping_File_Names : Temp_Path_Ptr;
-- For each project, the name ids of the temporary mapping files used
Last_Mapping_File_Names : Indices_Ptr;
@@ -771,6 +812,186 @@ package body Make is
procedure Delete_All_Temp_Files;
-- Delete all temp files (config files, mapping files, path files)
+ -------------------------------------------------
+ -- Subprogram declarations moved from the spec --
+ -------------------------------------------------
+
+ procedure Bind (ALI_File : File_Name_Type; Args : Argument_List);
+ -- Binds ALI_File. Args are the arguments to pass to the binder.
+ -- Args must have a lower bound of 1.
+
+ procedure Display_Commands (Display : Boolean := True);
+ -- The default behavior of Make commands (Compile_Sources, Bind, Link)
+ -- is to display them on stderr. This behavior can be changed repeatedly
+ -- by invoking this procedure.
+
+ -- If a compilation, bind or link failed one of the following 3 exceptions
+ -- is raised. These need to be handled by the calling routines.
+
+ procedure Compile_Sources
+ (Main_Source : File_Name_Type;
+ Args : Argument_List;
+ First_Compiled_File : out File_Name_Type;
+ Most_Recent_Obj_File : out File_Name_Type;
+ Most_Recent_Obj_Stamp : out Time_Stamp_Type;
+ Main_Unit : out Boolean;
+ Compilation_Failures : out Natural;
+ Main_Index : Int := 0;
+ Check_Readonly_Files : Boolean := False;
+ Do_Not_Execute : Boolean := False;
+ Force_Compilations : Boolean := False;
+ Keep_Going : Boolean := False;
+ In_Place_Mode : Boolean := False;
+ Initialize_ALI_Data : Boolean := True;
+ Max_Process : Positive := 1);
+ -- Compile_Sources will recursively compile all the sources needed by
+ -- Main_Source. Before calling this routine make sure Namet has been
+ -- initialized. This routine can be called repeatedly with different
+ -- Main_Source file as long as all the source (-I flags), library
+ -- (-B flags) and ada library (-A flags) search paths between calls are
+ -- *exactly* the same. The default directory must also be the same.
+ --
+ -- Args contains the arguments to use during the compilations.
+ -- The lower bound of Args must be 1.
+ --
+ -- First_Compiled_File is set to the name of the first file that is
+ -- compiled or that needs to be compiled. This is set to No_Name if no
+ -- compilations were needed.
+ --
+ -- Most_Recent_Obj_File is set to the full name of the most recent
+ -- object file found when no compilations are needed, that is when
+ -- First_Compiled_File is set to No_Name. When First_Compiled_File
+ -- is set then Most_Recent_Obj_File is set to No_Name.
+ --
+ -- Most_Recent_Obj_Stamp is the time stamp of Most_Recent_Obj_File.
+ --
+ -- Main_Unit is set to True if Main_Source can be a main unit.
+ -- If Do_Not_Execute is False and First_Compiled_File /= No_Name
+ -- the value of Main_Unit is always False.
+ -- Is this used any more??? It is certainly not used by gnatmake???
+ --
+ -- Compilation_Failures is a count of compilation failures. This count
+ -- is used to extract compilation failure reports with Extract_Failure.
+ --
+ -- Main_Index, when not zero, is the index of the main unit in source
+ -- file Main_Source which is a multi-unit source.
+ -- Zero indicates that Main_Source is a single unit source file.
+ --
+ -- Check_Readonly_Files set it to True to compile source files
+ -- which library files are read-only. When compiling GNAT predefined
+ -- files the "-gnatg" flag is used.
+ --
+ -- Do_Not_Execute set it to True to find out the first source that
+ -- needs to be recompiled, but without recompiling it. This file is
+ -- saved in First_Compiled_File.
+ --
+ -- Force_Compilations forces all compilations no matter what but
+ -- recompiles read-only files only if Check_Readonly_Files
+ -- is set.
+ --
+ -- Keep_Going when True keep compiling even in the presence of
+ -- compilation errors.
+ --
+ -- In_Place_Mode when True save library/object files in their object
+ -- directory if they already exist; otherwise, in the source directory.
+ --
+ -- Initialize_ALI_Data set it to True when you want to initialize ALI
+ -- data-structures. This is what you should do most of the time.
+ -- (especially the first time around when you call this routine).
+ -- This parameter is set to False to preserve previously recorded
+ -- ALI file data.
+ --
+ -- Max_Process is the maximum number of processes that should be spawned
+ -- to carry out compilations.
+ --
+ -- Flags in Package Opt Affecting Compile_Sources
+ -- -----------------------------------------------
+ --
+ -- Check_Object_Consistency set it to False to omit all consistency
+ -- checks between an .ali file and its corresponding object file.
+ -- When this flag is set to true, every time an .ali is read,
+ -- package Osint checks that the corresponding object file
+ -- exists and is more recent than the .ali.
+ --
+ -- Use of Name Table Info
+ -- ----------------------
+ --
+ -- All file names manipulated by Compile_Sources are entered into the
+ -- Names table. The Byte field of a source file is used to mark it.
+ --
+ -- Calling Compile_Sources Several Times
+ -- -------------------------------------
+ --
+ -- Upon return from Compile_Sources all the ALI data structures are left
+ -- intact for further browsing. HOWEVER upon entry to this routine ALI
+ -- data structures are re-initialized if parameter Initialize_ALI_Data
+ -- above is set to true. Typically this is what you want the first time
+ -- you call Compile_Sources. You should not load an ali file, call this
+ -- routine with flag Initialize_ALI_Data set to True and then expect
+ -- that ALI information to be around after the call. Note that the first
+ -- time you call Compile_Sources you better set Initialize_ALI_Data to
+ -- True unless you have called Initialize_ALI yourself.
+ --
+ -- Compile_Sources ALGORITHM : Compile_Sources (Main_Source)
+ -- -------------------------
+ --
+ -- 1. Insert Main_Source in a Queue (Q) and mark it.
+ --
+ -- 2. Let unit.adb be the file at the head of the Q. If unit.adb is
+ -- missing but its corresponding ali file is in an Ada library directory
+ -- (see below) then, remove unit.adb from the Q and goto step 4.
+ -- Otherwise, look at the files under the D (dependency) section of
+ -- unit.ali. If unit.ali does not exist or some of the time stamps do
+ -- not match, (re)compile unit.adb.
+ --
+ -- An Ada library directory is a directory containing Ada specs, ali
+ -- and object files but no source files for the bodies. An Ada library
+ -- directory is communicated to gnatmake by means of some switch so that
+ -- gnatmake can skip the sources whole ali are in that directory.
+ -- There are two reasons for skipping the sources in this case. Firstly,
+ -- Ada libraries typically come without full sources but binding and
+ -- linking against those libraries is still possible. Secondly, it would
+ -- be very wasteful for gnatmake to systematically check the consistency
+ -- of every external Ada library used in a program. The binder is
+ -- already in charge of catching any potential inconsistencies.
+ --
+ -- 3. Look into the W section of unit.ali and insert into the Q all
+ -- unmarked source files. Mark all files newly inserted in the Q.
+ -- Specifically, assuming that the W section looks like
+ --
+ -- W types%s types.adb types.ali
+ -- W unchecked_deallocation%s
+ -- W xref_tab%s xref_tab.adb xref_tab.ali
+ --
+ -- Then xref_tab.adb and types.adb are inserted in the Q if they are not
+ -- already marked.
+ -- Note that there is no file listed under W unchecked_deallocation%s
+ -- so no generic body should ever be explicitly compiled (unless the
+ -- Main_Source at the start was a generic body).
+ --
+ -- 4. Repeat steps 2 and 3 above until the Q is empty
+ --
+ -- Note that the above algorithm works because the units withed in
+ -- subunits are transitively included in the W section (with section) of
+ -- the main unit. Likewise the withed units in a generic body needed
+ -- during a compilation are also transitively included in the W section
+ -- of the originally compiled file.
+
+ procedure Initialize;
+ -- Performs default and package initialization. Therefore,
+ -- Compile_Sources can be called by an external unit.
+
+ procedure Link
+ (ALI_File : File_Name_Type;
+ Args : Argument_List;
+ Success : out Boolean);
+ -- Links ALI_File. Args are the arguments to pass to the linker.
+ -- Args must have a lower bound of 1. Success indicates if the link
+ -- succeeded or not.
+
+ procedure Scan_Make_Arg (Argv : String; And_Save : Boolean);
+ -- Scan make arguments. Argv is a single argument to be processed
+
-------------------
-- Add_Arguments --
-------------------
@@ -797,16 +1018,6 @@ package body Make is
Last_Argument := Last_Argument + Args'Length;
end Add_Arguments;
- --------------------
- -- Add_Dependency --
- --------------------
-
- procedure Add_Dependency (S : Name_Id; On : Name_Id) is
- begin
- Dependencies.Increment_Last;
- Dependencies.Table (Dependencies.Last) := (S, On);
- end Add_Dependency;
-
----------------------------
-- Add_Library_Search_Dir --
----------------------------
@@ -817,15 +1028,13 @@ package body Make is
is
begin
if On_Command_Line then
- Add_Lib_Search_Dir
- (Normalize_Pathname (Path));
+ Add_Lib_Search_Dir (Normalize_Pathname (Path));
else
Get_Name_String
- (Project_Tree.Projects.Table (Main_Project).Directory);
+ (Project_Tree.Projects.Table (Main_Project).Display_Directory);
Add_Lib_Search_Dir
- (Normalize_Pathname
- (Path, Name_Buffer (1 .. Name_Len)));
+ (Normalize_Pathname (Path, Name_Buffer (1 .. Name_Len)));
end if;
end Add_Library_Search_Dir;
@@ -871,15 +1080,13 @@ package body Make is
is
begin
if On_Command_Line then
- Add_Src_Search_Dir
- (Normalize_Pathname (Path));
+ Add_Src_Search_Dir (Normalize_Pathname (Path));
else
Get_Name_String
- (Project_Tree.Projects.Table (Main_Project).Directory);
+ (Project_Tree.Projects.Table (Main_Project).Display_Directory);
Add_Src_Search_Dir
- (Normalize_Pathname
- (Path, Name_Buffer (1 .. Name_Len)));
+ (Normalize_Pathname (Path, Name_Buffer (1 .. Name_Len)));
end if;
end Add_Source_Search_Dir;
@@ -1027,8 +1234,7 @@ package body Make is
Switch_List := Switches.Values;
while Switch_List /= Nil_String loop
- Element :=
- Project_Tree.String_Elements.Table (Switch_List);
+ Element := Project_Tree.String_Elements.Table (Switch_List);
Get_Name_String (Element.Value);
if Name_Len > 0 then
@@ -1109,7 +1315,7 @@ package body Make is
Bind_Last := Bind_Last + 1;
Bind_Args (Bind_Last) := new String'(Name_Buffer (1 .. Name_Len));
- GNAT.OS_Lib.Normalize_Arguments (Bind_Args (Args'First .. Bind_Last));
+ System.OS_Lib.Normalize_Arguments (Bind_Args (Args'First .. Bind_Last));
Display (Gnatbind.all, Bind_Args (Args'First .. Bind_Last));
@@ -1117,11 +1323,11 @@ package body Make is
Make_Failed ("error, unable to locate ", Gnatbind.all);
end if;
- GNAT.OS_Lib.Spawn
+ System.OS_Lib.Spawn
(Gnatbind_Path.all, Bind_Args (Args'First .. Bind_Last), Success);
if not Success then
- raise Bind_Failed;
+ Make_Failed ("*** bind failed.");
end if;
end Bind;
@@ -1130,7 +1336,8 @@ package body Make is
--------------------------------
procedure Change_To_Object_Directory (Project : Project_Id) is
- Actual_Project : Project_Id;
+ Actual_Project : Project_Id;
+ Object_Directory : Path_Name_Type;
begin
-- For sources outside of any project, compilation occurs in the object
@@ -1145,17 +1352,24 @@ package body Make is
-- Nothing to do if the current working directory is already the correct
-- object directory.
- if Project_Object_Directory /= Actual_Project then
- Project_Object_Directory := Actual_Project;
+ if Project_Of_Current_Object_Directory /= Actual_Project then
+ Project_Of_Current_Object_Directory := Actual_Project;
+ Object_Directory :=
+ Project_Tree.Projects.Table (Actual_Project).Object_Directory;
-- Set the working directory to the object directory of the actual
-- project.
- Change_Dir
- (Get_Name_String
- (Project_Tree.Projects.Table
- (Actual_Project).Object_Directory));
+ if Verbose_Mode then
+ Write_Str ("Changing to object directory of """);
+ Write_Name
+ (Project_Tree.Projects.Table (Actual_Project).Display_Name);
+ Write_Str (""": """);
+ Write_Name (Object_Directory);
+ Write_Line ("""");
+ end if;
+ Change_Dir (Get_Name_String (Object_Directory));
end if;
exception
@@ -1209,7 +1423,7 @@ package body Make is
function New_Spec (Uname : Unit_Name_Type) return Boolean;
-- Uname is the name of the spec or body of some ada unit. This
-- function returns True if the Uname is the name of a body which has
- -- a spec not mentioned inali file A. If True is returned
+ -- a spec not mentioned in ALI file A. If True is returned
-- Spec_File_Name above is set to the name of this spec file.
--------------
@@ -1310,7 +1524,7 @@ package body Make is
-- appear in the Sdep section of Lib_File, New_Spec contains the file
-- name of this new spec.
- Source_Name : Name_Id;
+ Source_Name : File_Name_Type;
Text : Text_Buffer_Ptr;
Prev_Switch : String_Access;
@@ -1733,7 +1947,7 @@ package body Make is
-- Process linker options from the ALI files
for Opt in 1 .. Linker_Options.Last loop
- Check_File (Linker_Options.Table (Opt).Name);
+ Check_File (File_Name_Type (Linker_Options.Table (Opt).Name));
end loop;
-- Process options given on the command line
@@ -1831,8 +2045,7 @@ package body Make is
while Data.Extended_By /= No_Project loop
Arguments_Project := Data.Extended_By;
- Data :=
- Project_Tree.Projects.Table (Arguments_Project);
+ Data := Project_Tree.Projects.Table (Arguments_Project);
end loop;
-- If building a dynamic or relocatable library, compile with
@@ -1856,8 +2069,8 @@ package body Make is
Data;
end if;
- -- We now look for package Compiler
- -- and get the switches from this package.
+ -- We now look for package Compiler and get the switches from
+ -- this package.
Compiler_Package :=
Prj.Util.Value_Of
@@ -1867,17 +2080,18 @@ package body Make is
if Compiler_Package /= No_Package then
- -- If package Gnatmake.Compiler exists, we get
- -- the specific switches for the current source,
- -- or the global switches, if any.
+ -- If package Gnatmake.Compiler exists, we get the specific
+ -- switches for the current source, or the global switches,
+ -- if any.
- Switches := Switches_Of
- (Source_File => Source_File,
- Source_File_Name => Source_File_Name,
- Source_Index => Source_Index,
- Naming => Data.Naming,
- In_Package => Compiler_Package,
- Allow_ALI => False);
+ Switches :=
+ Switches_Of
+ (Source_File => Source_File,
+ Source_File_Name => Source_File_Name,
+ Source_Index => Source_Index,
+ Naming => Data.Naming,
+ In_Package => Compiler_Package,
+ Allow_ALI => False);
end if;
@@ -1978,8 +2192,8 @@ package body Make is
procedure Compile_Sources
(Main_Source : File_Name_Type;
Args : Argument_List;
- First_Compiled_File : out Name_Id;
- Most_Recent_Obj_File : out Name_Id;
+ First_Compiled_File : out File_Name_Type;
+ Most_Recent_Obj_File : out File_Name_Type;
Most_Recent_Obj_Stamp : out Time_Stamp_Type;
Main_Unit : out Boolean;
Compilation_Failures : out Natural;
@@ -2035,6 +2249,9 @@ package body Make is
Sfile : File_Name_Type;
-- Contains the source file of the units withed by Source_File
+ Uname : Unit_Name_Type;
+ -- Contains the unit name of the units withed by Source_File
+
ALI : ALI_Id;
-- ALI Id of the current ALI file
@@ -2097,14 +2314,14 @@ package body Make is
-- Collect arguments from project file (if any) and compile
function Compile
- (S : Name_Id;
- L : Name_Id;
+ (S : File_Name_Type;
+ L : File_Name_Type;
Source_Index : Int;
Args : Argument_List) return Process_Id;
- -- Compiles S using Args. If S is a GNAT predefined source
- -- "-gnatpg" is added to Args. Non blocking call. L corresponds to the
- -- expected library file name. Process_Id of the process spawned to
- -- execute the compile.
+ -- Compiles S using Args. If S is a GNAT predefined source "-gnatpg" is
+ -- added to Args. Non blocking call. L corresponds to the expected
+ -- library file name. Process_Id of the process spawned to execute the
+ -- compilation.
package Good_ALI is new Table.Table (
Table_Component_Type => ALI_Id,
@@ -2172,10 +2389,10 @@ package body Make is
procedure Await_Compile
(Sfile : out File_Name_Type;
Afile : out File_Name_Type;
- Uname : out File_Name_Type;
+ Uname : out Unit_Name_Type;
OK : out Boolean)
is
- Pid : Process_Id;
+ Pid : Process_Id;
Project : Project_Id;
begin
@@ -2183,7 +2400,7 @@ package body Make is
Sfile := No_File;
Afile := No_File;
- Uname := No_Name;
+ Uname := No_Unit_Name;
OK := False;
-- The loop here is a work-around for a problem on VMS; in some
@@ -2262,7 +2479,7 @@ package body Make is
if not Targparm.Suppress_Standard_Library_On_Target then
declare
- Sfile : Name_Id;
+ Sfile : File_Name_Type;
Add_It : Boolean := True;
begin
@@ -2350,8 +2567,7 @@ package body Make is
if not Project_Tree.Projects.Table
(Arguments_Project).Externally_Built
then
- Prj.Env.Set_Ada_Paths
- (Arguments_Project, Project_Tree, True);
+ Prj.Env.Set_Ada_Paths (Arguments_Project, Project_Tree, True);
if not Unique_Compile
and then MLib.Tgt.Support_For_Libraries /= MLib.Tgt.None
@@ -2395,6 +2611,11 @@ package body Make is
Pid := Compile (Arguments_Path_Name, Lib_File, Source_Index,
Arguments (1 .. Last_Argument));
+
+ -- Register compiled unit into Full_Source_File as this is the
+ -- variable used to report errors.
+
+ Full_Source_File := Arguments_Path_Name;
Process_Created := True;
end if;
@@ -2417,8 +2638,8 @@ package body Make is
-------------
function Compile
- (S : Name_Id;
- L : Name_Id;
+ (S : File_Name_Type;
+ L : File_Name_Type;
Source_Index : Int;
Args : Argument_List) return Process_Id
is
@@ -2427,7 +2648,7 @@ package body Make is
Comp_Last : Integer;
Arg_Index : Integer;
- function Ada_File_Name (Name : Name_Id) return Boolean;
+ function Ada_File_Name (Name : File_Name_Type) return Boolean;
-- Returns True if Name is the name of an ada source file
-- (i.e. suffix is .ads or .adb)
@@ -2435,7 +2656,7 @@ package body Make is
-- Ada_File_Name --
-------------------
- function Ada_File_Name (Name : Name_Id) return Boolean is
+ function Ada_File_Name (Name : File_Name_Type) return Boolean is
begin
Get_Name_String (Name);
return
@@ -2552,9 +2773,9 @@ package body Make is
end;
end if;
- if Source_Index /= 0 or else
- L /= Strip_Directory (L) or else
- Object_Directory_Path /= null
+ if Source_Index /= 0
+ or else L /= Strip_Directory (L)
+ or else Object_Directory_Path /= null
then
-- Build -o argument
@@ -2596,7 +2817,8 @@ package body Make is
Comp_Last := Comp_Last + 1;
Comp_Args (Comp_Last) := new String'(Name_Buffer (1 .. Name_Len));
- GNAT.OS_Lib.Normalize_Arguments (Comp_Args (Args'First .. Comp_Last));
+ System.OS_Lib.Normalize_Arguments
+ (Comp_Args (Args'First .. Comp_Last));
Comp_Last := Comp_Last + 1;
Comp_Args (Comp_Last) := new String'("-gnatez");
@@ -2608,7 +2830,7 @@ package body Make is
end if;
return
- GNAT.OS_Lib.Non_Blocking_Spawn
+ System.OS_Lib.Non_Blocking_Spawn
(Gcc_Path.all, Comp_Args (Args'First .. Comp_Last));
end Compile;
@@ -2697,7 +2919,6 @@ package body Make is
-- Package and Queue initializations
Good_ALI.Init;
- Output.Set_Standard_Error;
if First_Q_Initialization then
Init_Q;
@@ -2877,9 +3098,9 @@ package body Make is
-- Check that switch -x has been used if a source
-- outside of project files need to be compiled.
- if Main_Project /= No_Project and then
- Arguments_Project = No_Project and then
- not External_Unit_Compilation_Allowed
+ if Main_Project /= No_Project
+ and then Arguments_Project = No_Project
+ and then not External_Unit_Compilation_Allowed
then
Make_Failed ("external source (",
Get_Name_String (Source_File),
@@ -2929,6 +3150,7 @@ package body Make is
if Process_Created then
if Pid = Invalid_Pid then
Record_Failure (Full_Source_File, Source_Unit);
+
else
Add_Process
(Pid,
@@ -3078,7 +3300,49 @@ package body Make is
Units.Table (J).First_With .. Units.Table (J).Last_With
loop
Sfile := Withs.Table (K).Sfile;
- Add_Dependency (ALIs.Table (ALI).Sfile, Sfile);
+ Uname := Withs.Table (K).Uname;
+
+ -- If project files are used, find the proper source
+ -- to compile, in case Sfile is the spec, but there
+ -- is a body.
+
+ if Main_Project /= No_Project then
+ declare
+ Unit_Name : Name_Id;
+ Uid : Prj.Unit_Id;
+ Udata : Unit_Data;
+
+ begin
+ Get_Name_String (Uname);
+ Name_Len := Name_Len - 2;
+ Unit_Name := Name_Find;
+ Uid :=
+ Units_Htable.Get
+ (Project_Tree.Units_HT, Unit_Name);
+
+ if Uid /= Prj.No_Unit then
+ Udata := Project_Tree.Units.Table (Uid);
+
+ if Udata.File_Names (Body_Part).Name /=
+ No_File
+ then
+ Sfile := Udata.File_Names (Body_Part).Name;
+ Source_Index :=
+ Udata.File_Names (Body_Part).Index;
+
+ elsif Udata.File_Names (Specification).Name /=
+ No_File
+ then
+ Sfile :=
+ Udata.File_Names (Specification).Name;
+ Source_Index :=
+ Udata.File_Names (Specification).Index;
+ end if;
+ end if;
+ end;
+ end if;
+
+ Dependencies.Append ((ALIs.Table (ALI).Sfile, Sfile));
if Is_In_Obsoleted (Sfile) then
Executable_Obsolete := True;
@@ -3101,8 +3365,7 @@ package body Make is
Debug_Msg ("Skipping internal file:", Sfile);
else
- Insert_Q
- (Sfile, Withs.Table (K).Uname, Source_Index);
+ Insert_Q (Sfile, Uname, Source_Index);
Mark (Sfile, Source_Index);
end if;
end if;
@@ -3244,7 +3507,7 @@ package body Make is
Last : Natural := 0;
function Absolute_Path
- (Path : Name_Id;
+ (Path : File_Name_Type;
Project : Project_Id) return String;
-- Returns an absolute path for a configuration pragmas file
@@ -3253,7 +3516,7 @@ package body Make is
-------------------
function Absolute_Path
- (Path : Name_Id;
+ (Path : File_Name_Type;
Project : Project_Id) return String
is
begin
@@ -3271,7 +3534,7 @@ package body Make is
Parent_Directory : constant String :=
Get_Name_String
(Project_Tree.Projects.Table
- (Project).Directory);
+ (Project).Display_Directory);
begin
if Parent_Directory (Parent_Directory'Last) =
@@ -3294,7 +3557,7 @@ package body Make is
(For_Project, Main_Project, Project_Tree);
if Project_Tree.Projects.Table
- (For_Project).Config_File_Name /= No_Name
+ (For_Project).Config_File_Name /= No_Path
then
Temporary_Config_File :=
Project_Tree.Projects.Table (For_Project).Config_File_Temp;
@@ -3334,7 +3597,9 @@ package body Make is
declare
Path : constant String :=
Absolute_Path
- (Global_Attribute.Value, Global_Attribute.Project);
+ (File_Name_Type (Global_Attribute.Value),
+ Global_Attribute.Project);
+
begin
if not Is_Regular_File (Path) then
Make_Failed
@@ -3371,7 +3636,9 @@ package body Make is
declare
Path : constant String :=
Absolute_Path
- (Local_Attribute.Value, Local_Attribute.Project);
+ (File_Name_Type (Local_Attribute.Value),
+ Local_Attribute.Project);
+
begin
if not Is_Regular_File (Path) then
Make_Failed
@@ -3402,6 +3669,16 @@ package body Make is
end if;
end Debug_Msg;
+ procedure Debug_Msg (S : String; N : File_Name_Type) is
+ begin
+ Debug_Msg (S, Name_Id (N));
+ end Debug_Msg;
+
+ procedure Debug_Msg (S : String; N : Unit_Name_Type) is
+ begin
+ Debug_Msg (S, Name_Id (N));
+ end Debug_Msg;
+
---------------------------
-- Delete_All_Temp_Files --
---------------------------
@@ -3472,7 +3749,7 @@ package body Make is
Project_Tree.Projects.Table (Project).
Config_Checked := False;
Project_Tree.Projects.Table (Project).
- Config_File_Name := No_Name;
+ Config_File_Name := No_Path;
Project_Tree.Projects.Table (Project).
Config_File_Temp := False;
end if;
@@ -3489,10 +3766,6 @@ package body Make is
pragma Assert (Args'First = 1);
if Display_Executed_Programs then
- if Commands_To_Stdout then
- Set_Standard_Output;
- end if;
-
Write_Str (Program);
for J in Args'Range loop
@@ -3540,7 +3813,6 @@ package body Make is
end loop;
Write_Eol;
- Set_Standard_Error;
end if;
end Display;
@@ -3580,12 +3852,13 @@ package body Make is
-- Enter_Into_Obsoleted --
--------------------------
- procedure Enter_Into_Obsoleted (F : Name_Id) is
+ procedure Enter_Into_Obsoleted (F : File_Name_Type) is
Name : constant String := Get_Name_String (F);
- First : Natural := Name'Last;
- F2 : Name_Id := F;
+ First : Natural;
+ F2 : File_Name_Type;
begin
+ First := Name'Last;
while First > Name'First
and then Name (First - 1) /= Directory_Separator
and then Name (First - 1) /= '/'
@@ -3597,28 +3870,14 @@ package body Make is
Name_Len := 0;
Add_Str_To_Name_Buffer (Name (First .. Name'Last));
F2 := Name_Find;
+ else
+ F2 := F;
end if;
Debug_Msg ("New entry in Obsoleted table:", F2);
Obsoleted.Set (F2, True);
end Enter_Into_Obsoleted;
- ---------------------
- -- Extract_Failure --
- ---------------------
-
- procedure Extract_Failure
- (File : out File_Name_Type;
- Unit : out Unit_Name_Type;
- Found : out Boolean)
- is
- begin
- File := Bad_Compilation.Table (Bad_Compilation.Last).File;
- Unit := Bad_Compilation.Table (Bad_Compilation.Last).Unit;
- Found := Bad_Compilation.Table (Bad_Compilation.Last).Found;
- Bad_Compilation.Decrement_Last;
- end Extract_Failure;
-
--------------------
-- Extract_From_Q --
--------------------
@@ -3690,7 +3949,7 @@ package body Make is
-- Set to True when there are Stand-Alone Libraries, so that gnatbind
-- is invoked with the -F switch to force checking of elaboration flags.
- Mapping_Path : Name_Id := No_Name;
+ Mapping_Path : Path_Name_Type := No_Path;
-- The path name of the mapping file
Discard : Boolean;
@@ -3808,6 +4067,7 @@ package body Make is
if Normed_Path /= Proj_Path then
if Verbose_Mode then
+ Set_Standard_Error;
Write_Str (Normed_Path);
Write_Str (" /= ");
Write_Line (Proj_Path);
@@ -3863,19 +4123,19 @@ package body Make is
Mapping_FD : File_Descriptor := Invalid_FD;
-- A File Descriptor for an eventual mapping file
- ALI_Unit : Name_Id := No_Name;
+ ALI_Unit : Unit_Name_Type := No_Unit_Name;
-- The unit name of an ALI file
- ALI_Name : Name_Id := No_Name;
+ ALI_Name : File_Name_Type := No_File;
-- The file name of the ALI file
- ALI_Project : Project_Id := No_Project;
+ ALI_Project : Project_Id := No_Project;
-- The project of the ALI file
- Bytes : Integer;
- OK : Boolean := True;
+ Bytes : Integer;
+ OK : Boolean := True;
- Status : Boolean;
+ Status : Boolean;
-- For call to Close
begin
@@ -3889,49 +4149,46 @@ package body Make is
Unit_Table.Last (Project_Tree.Units)
loop
declare
- Unit : constant Unit_Data :=
- Project_Tree.Units.Table (J);
+ Unit : constant Unit_Data := Project_Tree.Units.Table (J);
+
begin
if Unit.Name /= No_Name then
-- If there is a body, put it in the mapping
- if Unit.File_Names (Body_Part).Name /= No_Name
+ if Unit.File_Names (Body_Part).Name /= No_File
and then Unit.File_Names (Body_Part).Project
/= No_Project
then
Get_Name_String (Unit.Name);
- Name_Buffer
- (Name_Len + 1 .. Name_Len + 2) := "%b";
+ Name_Buffer (Name_Len + 1 .. Name_Len + 2) := "%b";
Name_Len := Name_Len + 2;
ALI_Unit := Name_Find;
ALI_Name :=
Lib_File_Name
- (Unit.File_Names (Body_Part).Name);
+ (Unit.File_Names (Body_Part).Display_Name);
ALI_Project :=
Unit.File_Names (Body_Part).Project;
-- Otherwise, if there is a spec, put it
-- in the mapping.
- elsif Unit.File_Names (Specification).Name
- /= No_Name
- and then Unit.File_Names
- (Specification).Project
- /= No_Project
+ elsif Unit.File_Names (Specification).Name /= No_File
+ and then Unit.File_Names (Specification).Project /=
+ No_Project
then
Get_Name_String (Unit.Name);
- Name_Buffer
- (Name_Len + 1 .. Name_Len + 2) := "%s";
+ Name_Buffer (Name_Len + 1 .. Name_Len + 2) := "%s";
Name_Len := Name_Len + 2;
ALI_Unit := Name_Find;
- ALI_Name := Lib_File_Name
- (Unit.File_Names (Specification).Name);
+ ALI_Name :=
+ Lib_File_Name
+ (Unit.File_Names (Specification).Display_Name);
ALI_Project :=
Unit.File_Names (Specification).Project;
else
- ALI_Name := No_Name;
+ ALI_Name := No_File;
end if;
-- If we have something to put in the mapping
@@ -3942,7 +4199,7 @@ package body Make is
-- ended project obj dir as well as in the
-- extending project obj dir.
- if ALI_Name /= No_Name
+ if ALI_Name /= No_File
and then
Project_Tree.Projects.Table
(ALI_Project).Extended_By = No_Project
@@ -4021,7 +4278,7 @@ package body Make is
exit when not OK;
- -- Third line it the ALI path name.
+ -- Third line it the ALI path name
Bytes :=
Write
@@ -4081,17 +4338,6 @@ package body Make is
Failed_Links.Set_Last (0);
Successful_Links.Set_Last (0);
- if Hostparm.Java_VM then
- Gcc := new String'("jgnat");
- Gnatbind := new String'("jgnatbind");
- Gnatlink := new String'("jgnatlink");
-
- -- Do not check for an object file (".o") when compiling to
- -- Java bytecode since ".class" files are generated instead.
-
- Check_Object_Consistency := False;
- end if;
-
-- Special case when switch -B was specified
if Build_Bind_And_Link_Full_Project then
@@ -4178,7 +4424,7 @@ package body Make is
declare
Value : String_List_Id :=
- Project_Tree.Projects.Table (Main_Project).Mains;
+ Project_Tree.Projects.Table (Main_Project).Mains;
begin
-- The attribute Main is an empty list or not specified,
@@ -4389,7 +4635,7 @@ package body Make is
Do_Not_Execute := True;
end if;
- -- Note that Osint.Next_Main_Source will always return the (possibly
+ -- Note that Osint.M.Next_Main_Source will always return the (possibly
-- abbreviated file) without any directory information.
Main_Source_File := Next_Main_Source;
@@ -4439,11 +4685,11 @@ package body Make is
if Main_Project /= No_Project then
if Project_Tree.Projects.Table
- (Main_Project).Object_Directory /= No_Name
+ (Main_Project).Object_Directory /= No_Path
then
-- Change current directory to object directory of main project
- Project_Object_Directory := No_Project;
+ Project_Of_Current_Object_Directory := No_Project;
Change_To_Object_Directory (Main_Project);
end if;
@@ -4466,25 +4712,26 @@ package body Make is
not Unique_Compile);
The_Packages : constant Package_Id :=
- Project_Tree.Projects.Table (Main_Project).Decl.Packages;
+ Project_Tree.Projects.Table
+ (Main_Project).Decl.Packages;
Builder_Package : constant Prj.Package_Id :=
- Prj.Util.Value_Of
- (Name => Name_Builder,
- In_Packages => The_Packages,
- In_Tree => Project_Tree);
+ Prj.Util.Value_Of
+ (Name => Name_Builder,
+ In_Packages => The_Packages,
+ In_Tree => Project_Tree);
Binder_Package : constant Prj.Package_Id :=
- Prj.Util.Value_Of
- (Name => Name_Binder,
- In_Packages => The_Packages,
- In_Tree => Project_Tree);
+ Prj.Util.Value_Of
+ (Name => Name_Binder,
+ In_Packages => The_Packages,
+ In_Tree => Project_Tree);
Linker_Package : constant Prj.Package_Id :=
- Prj.Util.Value_Of
- (Name => Name_Linker,
- In_Packages => The_Packages,
- In_Tree => Project_Tree);
+ Prj.Util.Value_Of
+ (Name => Name_Linker,
+ In_Packages => The_Packages,
+ In_Tree => Project_Tree);
begin
-- We fail if we cannot find the main source file
@@ -4655,12 +4902,36 @@ package body Make is
begin
Targparm.Get_Target_Parameters;
-
exception
when Unrecoverable_Error =>
Make_Failed ("*** make failed.");
end;
+ -- Special processing for VM targets
+
+ if Targparm.VM_Target /= No_VM then
+
+ -- Do not check for an object file (".o") when compiling to VM
+ -- machine since ".class" files are generated instead.
+
+ Check_Object_Consistency := False;
+
+ -- Set proper processing commands
+
+ case Targparm.VM_Target is
+ when Targparm.JVM_Target =>
+ Gcc := new String'("jgnat");
+ Gnatbind := new String'("jgnatbind");
+ Gnatlink := new String'("jgnatlink");
+
+ when Targparm.CLI_Target =>
+ Gcc := new String'("dotnet-gnatcompile");
+
+ when Targparm.No_VM =>
+ raise Program_Error;
+ end case;
+ end if;
+
Display_Commands (not Quiet_Output);
Check_Steps;
@@ -4684,14 +4955,13 @@ package body Make is
and then (not Project_Tree.Projects.Table
(Proj).Externally_Built);
- if Project_Tree.Projects.Table
- (Proj).Need_To_Build_Lib
- then
+ if Project_Tree.Projects.Table (Proj).Need_To_Build_Lib then
+
-- If there is no object directory, then it will be
-- impossible to build the library. So fail immediately.
- if Project_Tree.Projects.Table
- (Proj).Object_Directory = No_Name
+ if Project_Tree.Projects.Table (Proj).Object_Directory =
+ No_Path
then
Make_Failed
("no object files to build library for project """,
@@ -4729,7 +4999,7 @@ package body Make is
if Saved_Linker_Switches.Table (J).all = Output_Flag.all then
declare
Exec_File_Name : constant String :=
- Saved_Linker_Switches.Table (J + 1).all;
+ Saved_Linker_Switches.Table (J + 1).all;
begin
if not Is_Absolute_Path (Exec_File_Name) then
@@ -4762,9 +5032,9 @@ package body Make is
declare
Dir_Path : constant String_Access :=
- new String'(Get_Name_String
- (Project_Tree.Projects.Table
- (Main_Project).Directory));
+ new String'(Get_Name_String
+ (Project_Tree.Projects.Table
+ (Main_Project).Directory));
begin
for J in 1 .. Binder_Switches.Last loop
Test_If_Relative_Path
@@ -4865,9 +5135,9 @@ package body Make is
Gnatlink := Saved_Gnatlink;
end if;
- Gcc_Path := GNAT.OS_Lib.Locate_Exec_On_Path (Gcc.all);
- Gnatbind_Path := GNAT.OS_Lib.Locate_Exec_On_Path (Gnatbind.all);
- Gnatlink_Path := GNAT.OS_Lib.Locate_Exec_On_Path (Gnatlink.all);
+ Gcc_Path := System.OS_Lib.Locate_Exec_On_Path (Gcc.all);
+ Gnatbind_Path := System.OS_Lib.Locate_Exec_On_Path (Gnatbind.all);
+ Gnatlink_Path := System.OS_Lib.Locate_Exec_On_Path (Gnatlink.all);
-- If we have specified -j switch both from the project file
-- and on the command line, the one from the command line takes
@@ -4881,7 +5151,7 @@ package body Make is
-- number of compilation processed, for each possible project.
The_Mapping_File_Names :=
- new Temp_File_Names
+ new Temp_Path_Names
(No_Project .. Project_Table.Last (Project_Tree.Projects),
1 .. Saved_Maximum_Processes);
Last_Mapping_File_Names :=
@@ -4966,13 +5236,13 @@ package body Make is
if Main_Project /= No_Project then
declare
Exec_File_Name : constant String :=
- Get_Name_String (Executable);
+ Get_Name_String (Executable);
begin
if not Is_Absolute_Path (Exec_File_Name) then
Get_Name_String (Project_Tree.Projects.Table
- (Main_Project).Exec_Directory);
+ (Main_Project).Display_Exec_Dir);
if
Name_Buffer (Name_Len) /= Directory_Separator
@@ -4995,16 +5265,16 @@ package body Make is
if Do_Compile_Step then
Recursive_Compilation_Step : declare
- Args : Argument_List (1 .. Gcc_Switches.Last);
+ Args : Argument_List (1 .. Gcc_Switches.Last);
- First_Compiled_File : Name_Id;
- Youngest_Obj_File : Name_Id;
+ First_Compiled_File : File_Name_Type;
+ Youngest_Obj_File : File_Name_Type;
Youngest_Obj_Stamp : Time_Stamp_Type;
- Executable_Stamp : Time_Stamp_Type;
+ Executable_Stamp : Time_Stamp_Type;
-- Executable is the final executable program
- Library_Rebuilt : Boolean := False;
+ Library_Rebuilt : Boolean := False;
begin
for J in 1 .. Gcc_Switches.Last loop
@@ -5047,7 +5317,7 @@ package body Make is
goto Next_Main;
else
List_Bad_Compilations;
- raise Compilation_Failed;
+ Report_Compilation_Failed;
end if;
end if;
@@ -5076,7 +5346,7 @@ package body Make is
--------------------------
procedure Add_To_Library_Projs (Proj : Project_Id) is
- Prj : Project_Id;
+ Prj : Project_Id;
begin
Library_Projs.Increment_Last;
@@ -5269,10 +5539,10 @@ package body Make is
-- since there is currently no simple way to check the
-- up-to-date status of objects
- if not Hostparm.Java_VM
+ if Targparm.VM_Target = No_VM
and then First_Compiled_File = No_File
then
- Executable_Stamp := File_Stamp (Executable);
+ Executable_Stamp := File_Stamp (Executable);
if not Executable_Obsolete then
Executable_Obsolete :=
@@ -5327,9 +5597,7 @@ package body Make is
elsif Youngest_Obj_Stamp (1) = ' ' then
Verbose_Msg
- (Youngest_Obj_File,
- "missing.",
- Prefix => " ");
+ (Youngest_Obj_File, "missing.", Prefix => " ");
elsif Youngest_Obj_Stamp > Executable_Stamp then
Verbose_Msg
@@ -5340,8 +5608,7 @@ package body Make is
else
Verbose_Msg
- (Executable, "needs to be rebuild.",
- Prefix => " ");
+ (Executable, "needs to be rebuilt", Prefix => " ");
end if;
end if;
@@ -5402,8 +5669,7 @@ package body Make is
-- Check if there are shared libraries, so that gnatbind is
-- called with -shared. Check also if gnatbind is called with
-- -shared, so that gnatlink is called with -shared-libgcc
- -- for GCC version 3 and above, ensuring that the shared
- -- version of libgcc will be used.
+ -- ensuring that the shared version of libgcc will be used.
if Main_Project /= No_Project
and then MLib.Tgt.Support_For_Libraries /= MLib.Tgt.None
@@ -5434,9 +5700,9 @@ package body Make is
end if;
-- If there are shared libraries, invoke gnatlink with
- -- -shared-libgcc if GCC version is 3 or more.
+ -- -shared-libgcc.
- if Shared_Libs and then GCC_Version >= 3 then
+ if Shared_Libs then
Link_With_Shared_Libgcc := Shared_Libgcc_Switch'Access;
end if;
@@ -5477,7 +5743,7 @@ package body Make is
-- file, if one was created.
if not Debug.Debug_Flag_N
- and then Mapping_Path /= No_Name
+ and then Mapping_Path /= No_Path
then
Delete_File (Get_Name_String (Mapping_Path), Discard);
end if;
@@ -5490,7 +5756,7 @@ package body Make is
-- If -dn was not specified, delete the temporary mapping file,
-- if one was created.
- if not Debug.Debug_Flag_N and then Mapping_Path /= No_Name then
+ if not Debug.Debug_Flag_N and then Mapping_Path /= No_Path then
Delete_File (Get_Name_String (Mapping_Path), Discard);
end if;
end Bind_Step;
@@ -5498,13 +5764,13 @@ package body Make is
if Do_Link_Step then
Link_Step : declare
- There_Are_Libraries : Boolean := False;
Linker_Switches_Last : constant Integer := Linker_Switches.Last;
- Path_Option : constant String_Access :=
- MLib.Linker_Library_Path_Option;
- Current : Natural;
- Proj2 : Project_Id;
- Depth : Natural;
+ Path_Option : constant String_Access :=
+ MLib.Linker_Library_Path_Option;
+ There_Are_Libraries : Boolean := False;
+ Current : Natural;
+ Proj2 : Project_Id;
+ Depth : Natural;
begin
if not Run_Path_Option then
@@ -5530,8 +5796,7 @@ package body Make is
-- Add this project to table Library_Projs
There_Are_Libraries := True;
- Depth :=
- Project_Tree.Projects.Table (Proj1).Depth;
+ Depth := Project_Tree.Projects.Table (Proj1).Depth;
Library_Projs.Increment_Last;
Current := Library_Projs.Last;
@@ -5560,7 +5825,7 @@ package body Make is
new String'
(Get_Name_String
(Project_Tree.Projects.Table
- (Proj1).Library_Dir));
+ (Proj1).Display_Library_Dir));
end if;
end if;
end loop;
@@ -5574,7 +5839,7 @@ package body Make is
Get_Name_String
(Project_Tree.Projects.Table
(Library_Projs.Table (Index)).
- Library_Dir));
+ Display_Library_Dir));
-- Add the -l switch
@@ -5712,25 +5977,34 @@ package body Make is
-- And invoke the linker
+ declare
+ Success : Boolean := False;
begin
Link (Main_ALI_File,
Link_With_Shared_Libgcc.all &
- Args (Args'First .. Last_Arg));
- Successful_Links.Increment_Last;
- Successful_Links.Table (Successful_Links.Last) :=
- Main_ALI_File;
+ Args (Args'First .. Last_Arg),
+ Success);
- exception
- when Link_Failed =>
- if Osint.Number_Of_Files = 1 or not Keep_Going then
- raise;
+ if Success then
+ Successful_Links.Increment_Last;
+ Successful_Links.Table (Successful_Links.Last) :=
+ Main_ALI_File;
- else
- Write_Line ("*** link failed");
- Failed_Links.Increment_Last;
- Failed_Links.Table (Failed_Links.Last) :=
- Main_ALI_File;
+ elsif Osint.Number_Of_Files = 1 or not Keep_Going then
+ Make_Failed ("*** link failed.");
+
+ else
+ Set_Standard_Error;
+ Write_Line ("*** link failed");
+
+ if Commands_To_Stdout then
+ Set_Standard_Output;
end if;
+
+ Failed_Links.Increment_Last;
+ Failed_Links.Table (Failed_Links.Last) :=
+ Main_ALI_File;
+ end if;
end;
end;
@@ -5924,20 +6198,26 @@ package body Make is
Write_Line (""" succeeded.");
end loop;
+ Set_Standard_Error;
+
for Index in 1 .. Failed_Links.Last loop
Write_Str ("Linking of """);
Write_Str (Get_Name_String (Failed_Links.Table (Index)));
Write_Line (""" failed.");
end loop;
+ if Commands_To_Stdout then
+ Set_Standard_Output;
+ end if;
+
if Total_Compilation_Failures = 0 then
- raise Compilation_Failed;
+ Report_Compilation_Failed;
end if;
end if;
if Total_Compilation_Failures /= 0 then
List_Bad_Compilations;
- raise Compilation_Failed;
+ Report_Compilation_Failed;
end if;
-- Delete the temporary mapping file that was created if we are
@@ -5948,24 +6228,9 @@ package body Make is
Prj.Env.Delete_All_Path_Files (Project_Tree);
end if;
- Exit_Program (E_Success);
-
exception
- when Bind_Failed =>
- Make_Failed ("*** bind failed.");
-
- when Compilation_Failed =>
- if not Debug.Debug_Flag_N then
- Delete_Mapping_Files;
- Prj.Env.Delete_All_Path_Files (Project_Tree);
- end if;
-
- Exit_Program (E_Fatal);
-
- when Link_Failed =>
- Make_Failed ("*** link failed.");
-
when X : others =>
+ Set_Standard_Error;
Write_Line (Exception_Information (X));
Make_Failed ("INTERNAL ERROR. Please report.");
end Gnatmake;
@@ -5974,7 +6239,7 @@ package body Make is
-- Hash --
----------
- function Hash (F : Name_Id) return Header_Num is
+ function Hash (F : File_Name_Type) return Header_Num is
begin
return Header_Num (1 + F mod Max_Header);
end Hash;
@@ -5984,8 +6249,8 @@ package body Make is
--------------------
function In_Ada_Lib_Dir (File : File_Name_Type) return Boolean is
- D : constant Name_Id := Get_Directory (File);
- B : constant Byte := Get_Name_Table_Byte (D);
+ D : constant File_Name_Type := Get_Directory (File);
+ B : constant Byte := Get_Name_Table_Byte (D);
begin
return (B and Ada_Lib_Dir) /= 0;
end In_Ada_Lib_Dir;
@@ -5994,7 +6259,7 @@ package body Make is
-- Inform --
------------
- procedure Inform (N : Name_Id := No_Name; Msg : String) is
+ procedure Inform (N : Name_Id; Msg : String) is
begin
Osint.Write_Program_Name;
@@ -6010,6 +6275,19 @@ package body Make is
Write_Eol;
end Inform;
+ procedure Inform (N : File_Name_Type; Msg : String) is
+ begin
+ Inform (Name_Id (N), Msg);
+ end Inform;
+
+ procedure Inform (Msg : String) is
+ begin
+ Osint.Write_Program_Name;
+ Write_Str (": ");
+ Write_Str (Msg);
+ Write_Eol;
+ end Inform;
+
-----------------------
-- Init_Mapping_File --
-----------------------
@@ -6018,8 +6296,7 @@ package body Make is
(Project : Project_Id;
File_Index : in out Natural)
is
- FD : File_Descriptor;
-
+ FD : File_Descriptor;
Status : Boolean;
-- For call to Close
@@ -6155,6 +6432,10 @@ package body Make is
Scan_Make_Arg (Argument (Next_Arg), And_Save => True);
end loop Scan_Args;
+ if Commands_To_Stdout then
+ Set_Standard_Output;
+ end if;
+
if Usage_Requested then
Usage;
end if;
@@ -6209,7 +6490,7 @@ package body Make is
if Verbose_Mode then
Write_Eol;
- Write_Str ("Parsing Project File """);
+ Write_Str ("Parsing project file """);
Write_Str (Project_File_Name.all);
Write_Str (""".");
Write_Eol;
@@ -6237,9 +6518,11 @@ package body Make is
Make_Failed ("""", Project_File_Name.all, """ processing failed");
end if;
+ Create_Mapping_File := True;
+
if Verbose_Mode then
Write_Eol;
- Write_Str ("Parsing of Project File """);
+ Write_Str ("Parsing of project file """);
Write_Str (Project_File_Name.all);
Write_Str (""" is finished.");
Write_Eol;
@@ -6297,8 +6580,7 @@ package body Make is
-- Make sure no project object directory is recorded
- Project_Object_Directory := No_Project;
-
+ Project_Of_Current_Object_Directory := No_Project;
end Initialize;
----------------------------
@@ -6312,7 +6594,7 @@ package body Make is
is
Put_In_Q : Boolean := Into_Q;
Unit : Unit_Data;
- Sfile : Name_Id;
+ Sfile : File_Name_Type;
Extending : constant Boolean :=
Project_Tree.Projects.Table
@@ -6359,12 +6641,12 @@ package body Make is
Unit_Table.Last (Project_Tree.Units)
loop
Unit := Project_Tree.Units.Table (Id);
- Sfile := No_Name;
+ Sfile := No_File;
-- If there is a source for the body, and the body has not been
-- locally removed,
- if Unit.File_Names (Body_Part).Name /= No_Name
+ if Unit.File_Names (Body_Part).Name /= No_File
and then Unit.File_Names (Body_Part).Path /= Slash
then
-- And it is a source for the specified project
@@ -6374,7 +6656,7 @@ package body Make is
-- If we don't have a spec, we cannot consider the source
-- if it is a subunit
- if Unit.File_Names (Specification).Name = No_Name then
+ if Unit.File_Names (Specification).Name = No_File then
declare
Src_Ind : Source_File_Index;
@@ -6383,8 +6665,8 @@ package body Make is
-- (Atree, Sinfo, ...). So, we pretend that it is a
-- project file, and we use Sinput.P.
- -- Source_File_Is_Subunit is just scanning through
- -- the file until it finds one of the reserved words
+ -- Source_File_Is_Subunit is just scanning through the
+ -- file until it finds one of the reserved words
-- separate, procedure, function, generic or package.
-- Fortunately, these Ada reserved words are also
-- reserved for project files.
@@ -6397,18 +6679,18 @@ package body Make is
-- If it is a subunit, discard it
if Sinput.P.Source_File_Is_Subunit (Src_Ind) then
- Sfile := No_Name;
+ Sfile := No_File;
else
- Sfile := Unit.File_Names (Body_Part).Name;
+ Sfile := Unit.File_Names (Body_Part).Display_Name;
end if;
end;
else
- Sfile := Unit.File_Names (Body_Part).Name;
+ Sfile := Unit.File_Names (Body_Part).Display_Name;
end if;
end if;
- elsif Unit.File_Names (Specification).Name /= No_Name
+ elsif Unit.File_Names (Specification).Name /= No_File
and then Unit.File_Names (Specification).Path /= Slash
and then Check_Project (Unit.File_Names (Specification).Project)
then
@@ -6416,7 +6698,7 @@ package body Make is
-- for the spec which has not been locally removed, then we take
-- this one.
- Sfile := Unit.File_Names (Specification).Name;
+ Sfile := Unit.File_Names (Specification).Display_Name;
end if;
-- If Put_In_Q is True, we insert into the Q
@@ -6433,7 +6715,7 @@ package body Make is
-- And of course, we only insert in the Q if the source is not
-- marked.
- if Sfile /= No_Name and then not Is_Marked (Sfile) then
+ if Sfile /= No_File and then not Is_Marked (Sfile) then
if Verbose_Mode then
Write_Str ("Adding """);
Write_Str (Get_Name_String (Sfile));
@@ -6444,7 +6726,7 @@ package body Make is
Mark (Sfile);
end if;
- elsif Sfile /= No_Name then
+ elsif Sfile /= No_File then
-- If Put_In_Q is False, we add the source as it it were specified
-- on the command line, and we set Put_In_Q to True, so that the
@@ -6476,7 +6758,7 @@ package body Make is
procedure Insert_Q
(Source_File : File_Name_Type;
- Source_Unit : Unit_Name_Type := No_Name;
+ Source_Unit : Unit_Name_Type := No_Unit_Name;
Index : Int := 0)
is
begin
@@ -6504,7 +6786,7 @@ package body Make is
-- Is_In_Obsoleted --
---------------------
- function Is_In_Obsoleted (F : Name_Id) return Boolean is
+ function Is_In_Obsoleted (F : File_Name_Type) return Boolean is
begin
if F = No_File then
return False;
@@ -6512,10 +6794,11 @@ package body Make is
else
declare
Name : constant String := Get_Name_String (F);
- First : Natural := Name'Last;
- F2 : Name_Id := F;
+ First : Natural;
+ F2 : File_Name_Type;
begin
+ First := Name'Last;
while First > Name'First
and then Name (First - 1) /= Directory_Separator
and then Name (First - 1) /= '/'
@@ -6527,6 +6810,8 @@ package body Make is
Name_Len := 0;
Add_Str_To_Name_Buffer (Name (First .. Name'Last));
F2 := Name_Find;
+ else
+ F2 := F;
end if;
return Obsoleted.Get (F2);
@@ -6551,8 +6836,8 @@ package body Make is
Source_File_Name : constant String :=
Get_Name_String (Source_File);
Saved_Verbosity : constant Verbosity := Current_Verbosity;
- Project : Project_Id := No_Project;
- Path_Name : Name_Id := No_Name;
+ Project : Project_Id := No_Project;
+ Path_Name : File_Name_Type := No_File;
Data : Project_Data;
begin
@@ -6561,8 +6846,7 @@ package body Make is
-- messages.
Current_Verbosity := Default;
- Prj.Env.
- Get_Reference
+ Prj.Env.Get_Reference
(Source_File_Name => Source_File_Name,
Project => Project,
In_Tree => Project_Tree,
@@ -6580,7 +6864,7 @@ package body Make is
Object_Directory : constant String :=
Normalize_Pathname
(Get_Name_String
- (Data.Object_Directory));
+ (Data.Display_Object_Dir));
Olast : Natural := Object_Directory'Last;
@@ -6620,9 +6904,12 @@ package body Make is
-- Link --
----------
- procedure Link (ALI_File : File_Name_Type; Args : Argument_List) is
+ procedure Link
+ (ALI_File : File_Name_Type;
+ Args : Argument_List;
+ Success : out Boolean)
+ is
Link_Args : Argument_List (1 .. Args'Length + 1);
- Success : Boolean;
begin
Get_Name_String (ALI_File);
@@ -6630,7 +6917,7 @@ package body Make is
Link_Args (2 .. Args'Length + 1) := Args;
- GNAT.OS_Lib.Normalize_Arguments (Link_Args);
+ System.OS_Lib.Normalize_Arguments (Link_Args);
Display (Gnatlink.all, Link_Args);
@@ -6638,11 +6925,7 @@ package body Make is
Make_Failed ("error, unable to locate ", Gnatlink.all);
end if;
- GNAT.OS_Lib.Spawn (Gnatlink_Path.all, Link_Args, Success);
-
- if not Success then
- raise Link_Failed;
- end if;
+ System.OS_Lib.Spawn (Gnatlink_Path.all, Link_Args, Success);
end Link;
---------------------------
@@ -6667,9 +6950,9 @@ package body Make is
-----------------
procedure List_Depend is
- Lib_Name : Name_Id;
- Obj_Name : Name_Id;
- Src_Name : Name_Id;
+ Lib_Name : File_Name_Type;
+ Obj_Name : File_Name_Type;
+ Src_Name : File_Name_Type;
Len : Natural;
Line_Pos : Natural;
@@ -6726,7 +7009,9 @@ package body Make is
Write_Eol;
end loop;
- Set_Standard_Error;
+ if not Commands_To_Stdout then
+ Set_Standard_Error;
+ end if;
end List_Depend;
-----------------
@@ -6754,8 +7039,7 @@ package body Make is
begin
if On_Command_Line then
declare
- Real_Path : constant String :=
- Normalize_Pathname (Dir);
+ Real_Path : constant String := Normalize_Pathname (Dir);
begin
if Real_Path'Length = 0 then
@@ -6772,9 +7056,9 @@ package body Make is
declare
Real_Path : constant String :=
Normalize_Pathname
- (Dir,
- Get_Name_String
- (Project_Tree.Projects.Table (Main_Project).Directory));
+ (Dir, Get_Name_String
+ (Project_Tree.Projects.Table
+ (Main_Project).Display_Directory));
begin
if Real_Path'Length = 0 then
@@ -6839,7 +7123,7 @@ package body Make is
List := Project_Tree.Project_Lists.Table (List).Next;
Recursive_Compute_Depth
(Project => Proj,
- Depth => Depth + 1);
+ Depth => Depth + 1);
end loop;
-- Visit a project being extended, if any
@@ -6853,12 +7137,27 @@ package body Make is
Project_Tree.Projects.Table (Project).Seen := False;
end Recursive_Compute_Depth;
+ -------------------------------
+ -- Report_Compilation_Failed --
+ -------------------------------
+
+ procedure Report_Compilation_Failed is
+ begin
+ if not Debug.Debug_Flag_N then
+ Delete_Mapping_Files;
+ Prj.Env.Delete_All_Path_Files (Project_Tree);
+ end if;
+
+ Exit_Program (E_Fatal);
+ end Report_Compilation_Failed;
+
-----------------------
-- Sigint_Intercpted --
-----------------------
procedure Sigint_Intercepted is
begin
+ Set_Standard_Error;
Write_Line ("*** Interrupted ***");
Delete_All_Temp_Files;
OS_Exit (1);
@@ -7297,7 +7596,7 @@ package body Make is
then
Unique_Compile_All_Projects := True;
Unique_Compile := True;
- Compile_Only := True;
+ Compile_Only := True;
Do_Bind_Step := False;
Do_Link_Step := False;
@@ -7381,8 +7680,8 @@ package body Make is
Operating_Mode := Check_Semantics;
Check_Object_Consistency := False;
Compile_Only := True;
- Do_Bind_Step := False;
- Do_Link_Step := False;
+ Do_Bind_Step := False;
+ Do_Link_Step := False;
elsif Argv (2 .. Argv'Last) = "nostdlib" then
@@ -7427,7 +7726,7 @@ package body Make is
-----------------
function Switches_Of
- (Source_File : Name_Id;
+ (Source_File : File_Name_Type;
Source_File_Name : String;
Source_Index : Int;
Naming : Naming_Data;
@@ -7455,7 +7754,7 @@ package body Make is
begin
Switches :=
Prj.Util.Value_Of
- (Index => Source_File,
+ (Index => Name_Id (Source_File),
Src_Index => Source_Index,
In_Array => Switches_Array,
In_Tree => Project_Tree);
@@ -7580,6 +7879,19 @@ package body Make is
Write_Eol;
end Verbose_Msg;
+ procedure Verbose_Msg
+ (N1 : File_Name_Type;
+ S1 : String;
+ N2 : File_Name_Type := No_File;
+ S2 : String := "";
+ Prefix : String := " -> ";
+ Minimum_Verbosity : Verbosity_Level_Type := Opt.Low)
+ is
+ begin
+ Verbose_Msg
+ (Name_Id (N1), S1, Name_Id (N2), S2, Prefix, Minimum_Verbosity);
+ end Verbose_Msg;
+
begin
-- Make sure that in case of failure, the temp files will be deleted
diff --git a/gcc/ada/make.ads b/gcc/ada/make.ads
index aba233d..1c92c99 100644
--- a/gcc/ada/make.ads
+++ b/gcc/ada/make.ads
@@ -6,7 +6,7 @@
-- --
-- S p e c --
-- --
--- Copyright (C) 1992-2005, Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2006, 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- --
@@ -25,254 +25,12 @@
------------------------------------------------------------------------------
-- The following package implements the facilities to recursively
--- compile (a la make), bind and/or link a set of sources. This package
--- gives the individual routines for performing such tasks as well as
--- the routine gnatmake below that puts it all together.
-
-with Table;
-with Types; use Types;
-
-with GNAT.OS_Lib; use GNAT.OS_Lib;
+-- compile (a la make), bind and/or link a set of sources.
package Make is
- -- The 3 following packages are used to store gcc, gnatbind and gnatbl
- -- switches passed on the gnatmake or gnatdist command line.
- -- Note that the lower bounds definitely need to be 1 to match the
- -- requirement that the argument array prepared for Spawn must have
- -- a lower bound of 1.
-
- package Gcc_Switches is new Table.Table (
- Table_Component_Type => String_Access,
- Table_Index_Type => Integer,
- Table_Low_Bound => 1,
- Table_Initial => 20,
- Table_Increment => 100,
- Table_Name => "Make.Gcc_Switches");
-
- package Binder_Switches is new Table.Table (
- Table_Component_Type => String_Access,
- Table_Index_Type => Integer,
- Table_Low_Bound => 1,
- Table_Initial => 20,
- Table_Increment => 100,
- Table_Name => "Make.Binder_Switches");
-
- package Linker_Switches is new Table.Table (
- Table_Component_Type => String_Access,
- Table_Index_Type => Integer,
- Table_Low_Bound => 1,
- Table_Initial => 20,
- Table_Increment => 100,
- Table_Name => "Make.Linker_Switches");
-
- procedure Display_Commands (Display : Boolean := True);
- -- The default behavior of Make commands (Compile_Sources, Bind, Link)
- -- is to display them on stderr. This behavior can be changed repeatedly
- -- by invoking this procedure.
-
- -- If a compilation, bind or link failed one of the following 3 exceptions
- -- is raised. These need to be handled by the calling routines.
-
- Compilation_Failed : exception;
- -- Raised by Compile_Sources if a compilation failed
-
- Bind_Failed : exception;
- -- Raised by Bind below if the bind failed
-
- Link_Failed : exception;
- -- Raised by Link below if the link failed
-
- procedure Bind (ALI_File : File_Name_Type; Args : Argument_List);
- -- Binds ALI_File. Args are the arguments to pass to the binder.
- -- Args must have a lower bound of 1.
-
- procedure Link (ALI_File : File_Name_Type; Args : Argument_List);
- -- Links ALI_File. Args are the arguments to pass to the linker.
- -- Args must have a lower bound of 1.
-
- procedure Initialize;
- -- Performs default and package initialization. Therefore,
- -- Compile_Sources can be called by an external unit.
-
- procedure Scan_Make_Arg (Argv : String; And_Save : Boolean);
- -- Scan make arguments. Argv is a single argument to be processed
-
- procedure Extract_Failure
- (File : out File_Name_Type;
- Unit : out Unit_Name_Type;
- Found : out Boolean);
- -- Extracts the first failure report from Bad_Compilation table
-
- procedure Compile_Sources
- (Main_Source : File_Name_Type;
- Args : Argument_List;
- First_Compiled_File : out Name_Id;
- Most_Recent_Obj_File : out Name_Id;
- Most_Recent_Obj_Stamp : out Time_Stamp_Type;
- Main_Unit : out Boolean;
- Compilation_Failures : out Natural;
- Main_Index : Int := 0;
- Check_Readonly_Files : Boolean := False;
- Do_Not_Execute : Boolean := False;
- Force_Compilations : Boolean := False;
- Keep_Going : Boolean := False;
- In_Place_Mode : Boolean := False;
- Initialize_ALI_Data : Boolean := True;
- Max_Process : Positive := 1);
- -- Compile_Sources will recursively compile all the sources needed by
- -- Main_Source. Before calling this routine make sure Namet has been
- -- initialized. This routine can be called repeatedly with different
- -- Main_Source file as long as all the source (-I flags), library
- -- (-B flags) and ada library (-A flags) search paths between calls are
- -- *exactly* the same. The default directory must also be the same.
- --
- -- Args contains the arguments to use during the compilations.
- -- The lower bound of Args must be 1.
- --
- -- First_Compiled_File is set to the name of the first file that is
- -- compiled or that needs to be compiled. This is set to No_Name if no
- -- compilations were needed.
- --
- -- Most_Recent_Obj_File is set to the full name of the most recent
- -- object file found when no compilations are needed, that is when
- -- First_Compiled_File is set to No_Name. When First_Compiled_File
- -- is set then Most_Recent_Obj_File is set to No_Name.
- --
- -- Most_Recent_Obj_Stamp is the time stamp of Most_Recent_Obj_File.
- --
- -- Main_Unit is set to True if Main_Source can be a main unit.
- -- If Do_Not_Execute is False and First_Compiled_File /= No_Name
- -- the value of Main_Unit is always False.
- -- Is this used any more??? It is certainly not used by gnatmake???
- --
- -- Compilation_Failures is a count of compilation failures. This count
- -- is used to extract compilation failure reports with Extract_Failure.
- --
- -- Main_Index, when not zero, is the index of the main unit in source
- -- file Main_Source which is a multi-unit source.
- -- Zero indicates that Main_Source is a single unit source file.
- --
- -- Check_Readonly_Files set it to True to compile source files
- -- which library files are read-only. When compiling GNAT predefined
- -- files the "-gnatg" flag is used.
- --
- -- Do_Not_Execute set it to True to find out the first source that
- -- needs to be recompiled, but without recompiling it. This file is
- -- saved in First_Compiled_File.
- --
- -- Force_Compilations forces all compilations no matter what but
- -- recompiles read-only files only if Check_Readonly_Files
- -- is set.
- --
- -- Keep_Going when True keep compiling even in the presence of
- -- compilation errors.
- --
- -- In_Place_Mode when True save library/object files in their object
- -- directory if they already exist; otherwise, in the source directory.
- --
- -- Initialize_ALI_Data set it to True when you want to initialize ALI
- -- data-structures. This is what you should do most of the time.
- -- (especially the first time around when you call this routine).
- -- This parameter is set to False to preserve previously recorded
- -- ALI file data.
- --
- -- Max_Process is the maximum number of processes that should be spawned
- -- to carry out compilations.
- --
- -- Flags in Package Opt Affecting Compile_Sources
- -- -----------------------------------------------
- --
- -- Check_Object_Consistency set it to False to omit all consistency
- -- checks between an .ali file and its corresponding object file.
- -- When this flag is set to true, every time an .ali is read,
- -- package Osint checks that the corresponding object file
- -- exists and is more recent than the .ali.
- --
- -- Use of Name Table Info
- -- ----------------------
- --
- -- All file names manipulated by Compile_Sources are entered into the
- -- Names table. The Byte field of a source file is used to mark it.
- --
- -- Calling Compile_Sources Several Times
- -- -------------------------------------
- --
- -- Upon return from Compile_Sources all the ALI data structures are left
- -- intact for further browsing. HOWEVER upon entry to this routine ALI
- -- data structures are re-initialized if parameter Initialize_ALI_Data
- -- above is set to true. Typically this is what you want the first time
- -- you call Compile_Sources. You should not load an ali file, call this
- -- routine with flag Initialize_ALI_Data set to True and then expect
- -- that ALI information to be around after the call. Note that the first
- -- time you call Compile_Sources you better set Initialize_ALI_Data to
- -- True unless you have called Initialize_ALI yourself.
- --
- -- Compile_Sources ALGORITHM : Compile_Sources (Main_Source)
- -- -------------------------
- --
- -- 1. Insert Main_Source in a Queue (Q) and mark it.
- --
- -- 2. Let unit.adb be the file at the head of the Q. If unit.adb is
- -- missing but its corresponding ali file is in an Ada library directory
- -- (see below) then, remove unit.adb from the Q and goto step 4.
- -- Otherwise, look at the files under the D (dependency) section of
- -- unit.ali. If unit.ali does not exist or some of the time stamps do
- -- not match, (re)compile unit.adb.
- --
- -- An Ada library directory is a directory containing Ada specs, ali
- -- and object files but no source files for the bodies. An Ada library
- -- directory is communicated to gnatmake by means of some switch so that
- -- gnatmake can skip the sources whole ali are in that directory.
- -- There are two reasons for skipping the sources in this case. Firstly,
- -- Ada libraries typically come without full sources but binding and
- -- linking against those libraries is still possible. Secondly, it would
- -- be very wasteful for gnatmake to systematically check the consistency
- -- of every external Ada library used in a program. The binder is
- -- already in charge of catching any potential inconsistencies.
- --
- -- 3. Look into the W section of unit.ali and insert into the Q all
- -- unmarked source files. Mark all files newly inserted in the Q.
- -- Specifically, assuming that the W section looks like
- --
- -- W types%s types.adb types.ali
- -- W unchecked_deallocation%s
- -- W xref_tab%s xref_tab.adb xref_tab.ali
- --
- -- Then xref_tab.adb and types.adb are inserted in the Q if they are not
- -- already marked.
- -- Note that there is no file listed under W unchecked_deallocation%s
- -- so no generic body should ever be explicitly compiled (unless the
- -- Main_Source at the start was a generic body).
- --
- -- 4. Repeat steps 2 and 3 above until the Q is empty
- --
- -- Note that the above algorithm works because the units withed in
- -- subunits are transitively included in the W section (with section) of
- -- the main unit. Likewise the withed units in a generic body needed
- -- during a compilation are also transitively included in the W section
- -- of the originally compiled file.
-
procedure Gnatmake;
- -- The driver of gnatmake. This routine puts it all together.
- -- This utility can be used to automatically (re)compile (using
- -- Compile_Sources), bind (using Bind) and link (using Link) a set of
- -- ada sources. For more information on gnatmake and its precise usage
- -- please refer to the gnat documentation.
- --
- -- Flags in Package Opt Affecting Gnatmake
- -- ---------------------------------------
- --
- -- Check_Readonly_Files: True when -a present in command line
- -- Check_Object_Consistency: Set to True by Gnatmake
- -- Compile_Only: True when -c present in command line
- -- Force_Compilations: True when -f present in command line
- -- Maximum_Processes: Number of processes given by -jnum
- -- Keep_Going: True when -k present in command line
- -- List_Dependencies: True when -l present in command line
- -- Do_Not_Execute True when -n present in command line
- -- Quiet_Output: True when -q present in command line
- -- Minimal_Recompilation: True when -m present in command line
- -- Verbose_Mode: True when -v present in command line
+ -- The driver of gnatmake. For more information on gnatmake and its
+ -- precise usage please refer to the gnat documentation.
end Make;
diff --git a/gcc/ada/sem_mech.adb b/gcc/ada/sem_mech.adb
index c3fd42a..8dd5f3f 100644
--- a/gcc/ada/sem_mech.adb
+++ b/gcc/ada/sem_mech.adb
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- Copyright (C) 1996-2003 Free Software Foundation, Inc. --
+-- Copyright (C) 1996-2007, 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- --
@@ -27,13 +27,14 @@
with Atree; use Atree;
with Einfo; use Einfo;
with Errout; use Errout;
-with Targparm; use Targparm;
+with Namet; use Namet;
with Nlists; use Nlists;
with Sem; use Sem;
with Sem_Util; use Sem_Util;
with Sinfo; use Sinfo;
with Snames; use Snames;
with Stand; use Stand;
+with Targparm; use Targparm;
package body Sem_Mech is
@@ -274,6 +275,7 @@ package body Sem_Mech is
when Convention_Assembler |
Convention_C |
+ Convention_CIL |
Convention_CPP |
Convention_Java |
Convention_Stdcall =>
diff --git a/gcc/ada/targparm.adb b/gcc/ada/targparm.adb
index 6f3ffe3..b24dfb0 100644
--- a/gcc/ada/targparm.adb
+++ b/gcc/ada/targparm.adb
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- Copyright (C) 1999-2006, Free Software Foundation, Inc. --
+-- Copyright (C) 1999-2007, 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- --
@@ -25,7 +25,6 @@
------------------------------------------------------------------------------
with Csets; use Csets;
-with Namet; use Namet;
with Opt; use Opt;
with Osint; use Osint;
with Output; use Output;
@@ -44,13 +43,14 @@ package body Targparm is
BDC, -- Backend_Divide_Checks
BOC, -- Backend_Overflow_Checks
CLA, -- Command_Line_Args
+ CLI, -- CLI (.NET)
CRT, -- Configurable_Run_Times
- CSV, -- Compiler_System_Version
D32, -- Duration_32_Bits
DEN, -- Denorm
EXS, -- Exit_Status_Supported
FEL, -- Frontend_Layout
FFO, -- Fractional_Fixed_Ops
+ JVM, -- JVM
MOV, -- Machine_Overflows
MRN, -- Machine_Rounds
PAS, -- Preallocated_Stacks
@@ -68,9 +68,6 @@ package body Targparm is
ZCD, -- ZCX_By_Default
ZCG); -- GCC_ZCX_Support
- subtype Targparm_Tags_OK is Targparm_Tags range AAM .. ZCG;
- -- Range excluding obsolete entries
-
Targparm_Flags : array (Targparm_Tags) of Boolean := (others => False);
-- Flag is set True if corresponding parameter is scanned
@@ -80,13 +77,14 @@ package body Targparm is
BDC_Str : aliased constant Source_Buffer := "Backend_Divide_Checks";
BOC_Str : aliased constant Source_Buffer := "Backend_Overflow_Checks";
CLA_Str : aliased constant Source_Buffer := "Command_Line_Args";
+ CLI_Str : aliased constant Source_Buffer := "CLI";
CRT_Str : aliased constant Source_Buffer := "Configurable_Run_Time";
- CSV_Str : aliased constant Source_Buffer := "Compiler_System_Version";
D32_Str : aliased constant Source_Buffer := "Duration_32_Bits";
DEN_Str : aliased constant Source_Buffer := "Denorm";
EXS_Str : aliased constant Source_Buffer := "Exit_Status_Supported";
FEL_Str : aliased constant Source_Buffer := "Frontend_Layout";
FFO_Str : aliased constant Source_Buffer := "Fractional_Fixed_Ops";
+ JVM_Str : aliased constant Source_Buffer := "JVM";
MOV_Str : aliased constant Source_Buffer := "Machine_Overflows";
MRN_Str : aliased constant Source_Buffer := "Machine_Rounds";
PAS_Str : aliased constant Source_Buffer := "Preallocated_Stacks";
@@ -113,13 +111,14 @@ package body Targparm is
BDC_Str'Access,
BOC_Str'Access,
CLA_Str'Access,
+ CLI_Str'Access,
CRT_Str'Access,
- CSV_Str'Access,
D32_Str'Access,
DEN_Str'Access,
EXS_Str'Access,
FEL_Str'Access,
FFO_Str'Access,
+ JVM_Str'Access,
MOV_Str'Access,
MRN_Str'Access,
PAS_Str'Access,
@@ -549,13 +548,22 @@ package body Targparm is
when BDC => Backend_Divide_Checks_On_Target := Result;
when BOC => Backend_Overflow_Checks_On_Target := Result;
when CLA => Command_Line_Args_On_Target := Result;
+ when CLI =>
+ if Result then
+ VM_Target := CLI_Target;
+ end if;
+
when CRT => Configurable_Run_Time_On_Target := Result;
- when CSV => Compiler_System_Version := Result;
when D32 => Duration_32_Bits_On_Target := Result;
when DEN => Denorm_On_Target := Result;
when EXS => Exit_Status_Supported_On_Target := Result;
when FEL => Frontend_Layout_On_Target := Result;
when FFO => Fractional_Fixed_Ops_On_Target := Result;
+ when JVM =>
+ if Result then
+ VM_Target := JVM_Target;
+ end if;
+
when MOV => Machine_Overflows_On_Target := Result;
when MRN => Machine_Rounds_On_Target := Result;
when PAS => Preallocated_Stacks_On_Target := Result;
@@ -614,27 +622,6 @@ package body Targparm is
Multi_Unit_Index_Character := '$';
end if;
- -- Check no missing target parameter settings (skip for compiler vsn)
-
- if not Compiler_System_Version then
- for K in Targparm_Tags_OK loop
- if not Targparm_Flags (K) then
- Set_Standard_Error;
- Write_Line
- ("fatal error: system.ads is incorrectly formatted");
- Write_Str ("missing line for parameter: ");
-
- for J in Targparm_Str (K)'Range loop
- Write_Char (Targparm_Str (K).all (J));
- end loop;
-
- Write_Eol;
- Set_Standard_Output;
- Fatal := True;
- end if;
- end loop;
- end if;
-
if Fatal then
raise Unrecoverable_Error;
end if;
diff --git a/gcc/ada/targparm.ads b/gcc/ada/targparm.ads
index 465e6b7..7f17dd5 100644
--- a/gcc/ada/targparm.ads
+++ b/gcc/ada/targparm.ads
@@ -6,7 +6,7 @@
-- --
-- S p e c --
-- --
--- Copyright (C) 1999-2006, Free Software Foundation, Inc. --
+-- Copyright (C) 1999-2007, 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- --
@@ -77,6 +77,7 @@
-- only item in this category is whether type Address is private.
with Rident; use Rident;
+with Namet; use Namet;
with Types; use Types;
package Targparm is
@@ -166,11 +167,11 @@ package Targparm is
--------------------------
Executable_Extension_On_Target : Name_Id := No_Name;
- -- Executable extension on the target.
- -- This name is useful for setting the executable extension in a
- -- dynamic way, e.g. depending on the run-time used, rather than
- -- using a configure-time macro as done by Get_Target_Executable_Suffix.
- -- If not set (No_Name), use GNAT.OS_Lib.Get_Target_Executable_Suffix.
+ -- Executable extension on the target. This name is useful for setting
+ -- the executable extension in a dynamic way, e.g. depending on the
+ -- run time used, rather than using a configure-time macro as done by
+ -- Get_Target_Executable_Suffix. If not set (No_Name), instead use
+ -- System.OS_Lib.Get_Target_Executable_Suffix.
-----------------------
-- Target Parameters --
@@ -187,24 +188,14 @@ package Targparm is
-- text buffer containing the source of the system package.
-- The default values here are used if no value is found in system.ads.
- -- This should normally happen only if the special version of system.ads
- -- used by the compiler itself is in use. The default values are suitable
- -- for use by the compiler itself in normal environments. This approach
- -- allows the possibility of new versions of the compiler (possibly with
- -- new system parameters added) being used to compile older versions of
- -- the compiler sources. This is not guaranteed to work, but often will
- -- and by setting appropriate default values, we make it more likely that
- -- this can succeed.
-
- Compiler_System_Version : Boolean := True;
- -- This is set False in all target dependent versions of System. In the
- -- compiler default version, it is omitted entirely, meaning that the
- -- above default value of True will be set. If the flag is False, then
- -- the scanning circuits in the body of this package do an error check to
- -- ensure that all parameters other than this one are specified and not
- -- defaulted. If the parameter is set True, then this check is omitted,
- -- and any parameters not present in system.ads are left set to their
- -- default value as described above.
+ -- This should normally happen if the special version of system.ads used
+ -- by the compiler itself is in use or if the value is only relevant to
+ -- a particular target (e.g. OpenVMS, AAMP). The default values are
+ -- suitable for use in normal environments. This approach allows the
+ -- possibility of new versions of the compiler (possibly with new system
+ -- parameters added) being used to compile older versions of the compiler
+ -- sources, as well as avoiding duplicating values in all system-*.ads
+ -- files for flags that are used on a few platforms only.
----------------------------
-- Special Target Control --
@@ -220,6 +211,10 @@ package Targparm is
OpenVMS_On_Target : Boolean := False;
-- Set to True if target is OpenVMS
+ type Virtual_Machine_Kind is (No_VM, JVM_Target, CLI_Target);
+ VM_Target : Virtual_Machine_Kind := No_VM;
+ -- Kind of virtual machine targetted
+
-------------------------------
-- Backend Arithmetic Checks --
-------------------------------