summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorcharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>2007-04-06 09:19:38 +0000
committercharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>2007-04-06 09:19:38 +0000
commit703844c305585a8b88dd4a74d51f60ecf5c8ad2e (patch)
treef5cd92cf0c8355154424935e5aa51a46816033b9 /gcc
parentdb00d7ec391560a89dad3971bd426bfb3da0d209 (diff)
downloadgcc-703844c305585a8b88dd4a74d51f60ecf5c8ad2e.tar.gz
2007-04-06 Vincent Celier <celier@adacore.com>
* errutil.adb (Initialize): Initialize warnings table, if all warnings are suppressed, supply an initial dummy entry covering all possible source locations. * make.adb (Scan_Make_Arg): Reject options that should start with "--" and start with only one, such as "-RTS=none". (Collect_Arguments): Do not check for sources outside of projects. Do not collect arguments if project is externally built. (Compile_Sources): Do nothing, not even check if the source is up to date, if its project is externally built. (Compile): When compiling a predefined source, add -gnatpg as the second switch, after -c. (Compile_Sources): Allow compilation of Annex J renames without -a (Is_In_Object_Directory): Check if the ALI file is in the object even if there is no project extension. (Create_Binder_Mapping_File): Only put a unit in the mapping file for gnatbind if the ALI file effectively exists. (Initialize): Add the directory where gnatmake is invoked in front of the path if it is invoked from a bin directory, even without directory information, so that the correct GNAT tools will be used when spawned without directory information. * makeusg.adb: Change switch -S to -eS Add lines for new switches -we, -wn and -ws Add line for new switch -p * prj-proc.adb (Process): Set Success to False when Warning_Mode is Treat_As_Error and there are warnings. * switch-m.ads, switch-m.adb (Normalize_Compiler_Switches): Do not skip -gnatww Change gnatmake switch -S to -eS (Scan_Make_Switches): Code reorganisation. Process separately multi character switches and single character switches. (Scan_Make_Switches): New Boolean out parameter Success. Set Success to False when switch is not recognized by gnatmake. (Scan_Make_Switches): Set Setup_Projects True when -p or --create-missing-dirs is specified. * fname.adb (Is_Predefined_File_Name): Return True for annex J renamings Calendar, Machine_Code, Unchecked_Conversion and Unchecked_Deallocation only when Renamings_Included is True. * par.adb: Allow library units Calendar, Machine_Code, Unchecked_Conversion and Unchecked_Deallocation to be recompiled even when -gnatg is not specified. (P_Interface_Type_Definition): Remove the formal Is_Synchronized because there is no need to generate always a record_definition_node in case of synchronized interface types. (SIS_Entry_Active): Initialize global variable to False (P_Null_Exclusion): For AI-447: Add parameter Allow_Anonymous_In_95 to indicate cases where AI-447 says "not null" is legal. * makeutl.ads, makeutil.adb (Executable_Prefix_Path): New function * makegpr.adb (Check_Compilation_Needed): Take into account dependency files with with several lines starting with the object fileb name. (Scan_Arg): Set Setup_Projects True when -p or --create-missing-dirs is specified. (Initialize): Add the directory where gprmake is invoked in front of the path, if it is invoked from a bin directory or with directory information, so that the correct GNAT tools will be used when invoked directly. (Check_Compilation_Needed): Process correctly backslashes on Windows. * vms_data.ads: Update switches/qualifiers git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@123560 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/errutil.adb8
-rw-r--r--gcc/ada/fname.adb12
-rw-r--r--gcc/ada/make.adb316
-rw-r--r--gcc/ada/makegpr.adb353
-rw-r--r--gcc/ada/makeusg.adb29
-rw-r--r--gcc/ada/makeutl.adb65
-rw-r--r--gcc/ada/makeutl.ads7
-rw-r--r--gcc/ada/par.adb30
-rw-r--r--gcc/ada/prj-proc.adb11
-rw-r--r--gcc/ada/switch-m.adb404
-rw-r--r--gcc/ada/switch-m.ads18
-rw-r--r--gcc/ada/vms_data.ads292
12 files changed, 971 insertions, 574 deletions
diff --git a/gcc/ada/errutil.adb b/gcc/ada/errutil.adb
index b70f18d2ce8..25e18c1f032 100644
--- a/gcc/ada/errutil.adb
+++ b/gcc/ada/errutil.adb
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- Copyright (C) 1991-2005, Free Software Foundation, Inc. --
+-- Copyright (C) 1991-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- --
@@ -582,6 +582,12 @@ package body Errutil is
-- an initial dummy entry covering all possible source locations.
Warnings.Init;
+
+ if Warning_Mode = Suppress then
+ Warnings.Increment_Last;
+ Warnings.Table (Warnings.Last).Start := Source_Ptr'First;
+ Warnings.Table (Warnings.Last).Stop := Source_Ptr'Last;
+ end if;
end Initialize;
------------------------
diff --git a/gcc/ada/fname.adb b/gcc/ada/fname.adb
index 85a30d9239f..495d7493e6b 100644
--- a/gcc/ada/fname.adb
+++ b/gcc/ada/fname.adb
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- 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- --
@@ -120,22 +120,22 @@ package body Fname is
Predef_Names : constant array (1 .. 11) of Str8 :=
("ada ", -- Ada
- "calendar", -- Calendar
"interfac", -- Interfaces
"system ", -- System
- "machcode", -- Machine_Code
- "unchconv", -- Unchecked_Conversion
- "unchdeal", -- Unchecked_Deallocation
-- Remaining entries are only considered if Renamings_Included true
+ "calendar", -- Calendar
+ "machcode", -- Machine_Code
+ "unchconv", -- Unchecked_Conversion
+ "unchdeal", -- Unchecked_Deallocation
"directio", -- Direct_IO
"ioexcept", -- IO_Exceptions
"sequenio", -- Sequential_IO
"text_io "); -- Text_IO
Num_Entries : constant Natural :=
- 7 + 4 * Boolean'Pos (Renamings_Included);
+ 3 + 8 * Boolean'Pos (Renamings_Included);
begin
-- Remove extension (if present)
diff --git a/gcc/ada/make.adb b/gcc/ada/make.adb
index d24cc9f397a..c12cbc503b8 100644
--- a/gcc/ada/make.adb
+++ b/gcc/ada/make.adb
@@ -1811,21 +1811,16 @@ package body Make is
Path => Arguments_Path_Name,
In_Tree => Project_Tree);
- -- If the source is not a source of a project file, check if
- -- this is allowed.
+ -- If the source is not a source of a project file, add the
+ -- recorded arguments. Check will be done later if the source
+ -- need to be compiled that the switch -x has been used.
if Arguments_Project = No_Project then
- if not External_Unit_Compilation_Allowed then
- Make_Failed ("external source (", Source_File_Name,
- ") is not part of any project; cannot be " &
- "compiled without gnatmake switch -x");
- end if;
-
- -- If it is allowed, simply add the saved gcc switches
-
Add_Arguments (The_Saved_Gcc_Switches.all);
- else
+ elsif not Project_Tree.Projects.Table
+ (Arguments_Project).Externally_Built
+ then
-- We get the project directory for the relative path
-- switches and arguments.
@@ -2521,8 +2516,10 @@ package body Make is
begin
if Is_Predefined_File_Name (Fname, False) then
if Check_Readonly_Files then
+ Comp_Args (Comp_Args'First + 2 .. Comp_Last + 1) :=
+ Comp_Args (Comp_Args'First + 1 .. Comp_Last);
Comp_Last := Comp_Last + 1;
- Comp_Args (Comp_Last) := GNAT_Flag;
+ Comp_Args (Comp_Args'First + 1) := GNAT_Flag;
else
Make_Failed
@@ -2816,7 +2813,7 @@ package body Make is
elsif not Check_Readonly_Files
and then Full_Lib_File /= No_File
- and then Is_Internal_File_Name (Source_File)
+ and then Is_Internal_File_Name (Source_File, False)
then
if Force_Compilations then
Fail
@@ -2837,49 +2834,60 @@ package body Make is
else
Arguments_Collected := False;
- -- Don't waste any time if we have to recompile anyway
+ -- Do nothing if project of source is externally built
- Obj_Stamp := Empty_Time_Stamp;
- Need_To_Compile := Force_Compilations;
+ Collect_Arguments (Source_File, Source_Index, Args);
- if not Force_Compilations then
- Read_Only :=
- Full_Lib_File /= No_File
- and then not Check_Readonly_Files
- and then Is_Readonly_Library (Full_Lib_File);
- Check (Source_File, Source_Index, Args, Lib_File,
- Read_Only, ALI, Obj_File, Obj_Stamp);
- Need_To_Compile := (ALI = No_ALI_Id);
- end if;
-
- if not Need_To_Compile then
+ if Arguments_Project = No_Project
+ or else not Project_Tree.Projects.Table
+ (Arguments_Project).Externally_Built
+ then
+ -- Don't waste any time if we have to recompile anyway
+
+ Obj_Stamp := Empty_Time_Stamp;
+ Need_To_Compile := Force_Compilations;
+
+ if not Force_Compilations then
+ Read_Only :=
+ Full_Lib_File /= No_File
+ and then not Check_Readonly_Files
+ and then Is_Readonly_Library (Full_Lib_File);
+ Check (Source_File, Source_Index, Args, Lib_File,
+ Read_Only, ALI, Obj_File, Obj_Stamp);
+ Need_To_Compile := (ALI = No_ALI_Id);
+ end if;
- -- The ALI file is up-to-date. Record its Id
+ if not Need_To_Compile then
+ -- The ALI file is up-to-date. Record its Id
- Record_Good_ALI (ALI);
+ Record_Good_ALI (ALI);
- -- Record the time stamp of the most recent object file
- -- as long as no (re)compilations are needed.
+ -- Record the time stamp of the most recent object
+ -- file as long as no (re)compilations are needed.
- if First_Compiled_File = No_File
- and then (Most_Recent_Obj_File = No_File
- or else Obj_Stamp > Most_Recent_Obj_Stamp)
- then
- Most_Recent_Obj_File := Obj_File;
- Most_Recent_Obj_Stamp := Obj_Stamp;
- end if;
+ if First_Compiled_File = No_File
+ and then (Most_Recent_Obj_File = No_File
+ or else Obj_Stamp > Most_Recent_Obj_Stamp)
+ then
+ Most_Recent_Obj_File := Obj_File;
+ Most_Recent_Obj_Stamp := Obj_Stamp;
+ end if;
- else
- -- Do nothing if project of source is externally built
+ else
+ -- Check that switch -x has been used if a source
+ -- outside of project files need to be compiled.
- if not Arguments_Collected then
- Collect_Arguments (Source_File, Source_Index, Args);
- end if;
+ 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),
+ ") is not part of any project;"
+ & " cannot be compiled without" &
+ " gnatmake switch -x");
+ end if;
- if Arguments_Project = No_Project
- or else not Project_Tree.Projects.Table
- (Arguments_Project).Externally_Built
- then
-- Is this the first file we have to compile?
if First_Compiled_File = No_File then
@@ -3088,7 +3096,7 @@ package body Make is
Debug_Msg ("Skipping marked file:", Sfile);
elsif not Check_Readonly_Files
- and then Is_Internal_File_Name (Sfile)
+ and then Is_Internal_File_Name (Sfile, False)
then
Debug_Msg ("Skipping internal file:", Sfile);
@@ -3938,47 +3946,18 @@ package body Make is
and then
Project_Tree.Projects.Table
(ALI_Project).Extended_By = No_Project
- and then
- Project_Tree.Projects.Table
- (ALI_Project).Extends = No_Project
+ and then
+ Project_Tree.Projects.Table
+ (ALI_Project).Extends = No_Project
then
- -- First line is the unit name
-
- Get_Name_String (ALI_Unit);
- Name_Len := Name_Len + 1;
- Name_Buffer (Name_Len) := ASCII.LF;
- Bytes :=
- Write
- (Mapping_FD,
- Name_Buffer (1)'Address,
- Name_Len);
- OK := Bytes = Name_Len;
-
- exit when not OK;
-
- -- Second line it the ALI file name
-
- Get_Name_String (ALI_Name);
- Name_Len := Name_Len + 1;
- Name_Buffer (Name_Len) := ASCII.LF;
- Bytes :=
- Write
- (Mapping_FD,
- Name_Buffer (1)'Address,
- Name_Len);
- OK := Bytes = Name_Len;
-
- exit when not OK;
-
- -- Third line it the ALI path name, concatenation
- -- of either the library directory or the object
- -- directory with the ALI file name.
+ -- First check if the ALI file exists. If it does not,
+ -- do not put the unit in the mapping file.
declare
ALI : constant String :=
Get_Name_String (ALI_Name);
PD : Project_Data renames
- Project_Tree.Projects.Table (ALI_Project);
+ Project_Tree.Projects.Table (ALI_Project);
begin
-- For library projects, use the library directory,
@@ -4004,19 +3983,61 @@ package body Make is
Name_Len :=
Name_Len + ALI'Length + 1;
Name_Buffer (Name_Len) := ASCII.LF;
- Bytes :=
- Write
- (Mapping_FD,
- Name_Buffer (1)'Address,
- Name_Len);
- OK := Bytes = Name_Len;
- end;
- -- If OK is False, it means we were unable
- -- to write a line. No point in continuing
- -- with the other units.
+ declare
+ ALI_Path_Name : constant String :=
+ Name_Buffer (1 .. Name_Len);
- exit when not OK;
+ begin
+ if Is_Regular_File
+ (ALI_Path_Name (1 .. ALI_Path_Name'Last - 1))
+ then
+
+ -- First line is the unit name
+
+ Get_Name_String (ALI_Unit);
+ Name_Len := Name_Len + 1;
+ Name_Buffer (Name_Len) := ASCII.LF;
+ Bytes :=
+ Write
+ (Mapping_FD,
+ Name_Buffer (1)'Address,
+ Name_Len);
+ OK := Bytes = Name_Len;
+
+ exit when not OK;
+
+ -- Second line it the ALI file name
+
+ Get_Name_String (ALI_Name);
+ Name_Len := Name_Len + 1;
+ Name_Buffer (Name_Len) := ASCII.LF;
+ Bytes :=
+ Write
+ (Mapping_FD,
+ Name_Buffer (1)'Address,
+ Name_Len);
+ OK := Bytes = Name_Len;
+
+ exit when not OK;
+
+ -- Third line it the ALI path name.
+
+ Bytes :=
+ Write
+ (Mapping_FD,
+ ALI_Path_Name (1)'Address,
+ ALI_Path_Name'Length);
+ OK := Bytes = ALI_Path_Name'Length;
+
+ -- If OK is False, it means we were unable
+ -- to write a line. No point in continuing
+ -- with the other units.
+
+ exit when not OK;
+ end if;
+ end;
+ end;
end if;
end if;
end;
@@ -6086,34 +6107,45 @@ package body Make is
Mains.Delete;
-- Add the directory where gnatmake is invoked in front of the
- -- path, if gnatmake is invoked with directory information.
- -- Only do this if the platform is not VMS, where the notion of path
- -- does not really exist.
+ -- path, if gnatmake is invoked from a bin directory or with directory
+ -- information. Only do this if the platform is not VMS, where the
+ -- notion of path does not really exist.
if not OpenVMS then
declare
+ Prefix : constant String := Executable_Prefix_Path;
Command : constant String := Command_Name;
begin
- for Index in reverse Command'Range loop
- if Command (Index) = Directory_Separator then
- declare
- Absolute_Dir : constant String :=
- Normalize_Pathname
- (Command (Command'First .. Index));
-
- PATH : constant String :=
- Absolute_Dir &
- Path_Separator &
- Getenv ("PATH").all;
+ if Prefix'Length > 0 then
+ declare
+ PATH : constant String :=
+ Prefix & Directory_Separator & "bin" &
+ Path_Separator &
+ Getenv ("PATH").all;
+ begin
+ Setenv ("PATH", PATH);
+ end;
- begin
- Setenv ("PATH", PATH);
- end;
+ else
+ for Index in reverse Command'Range loop
+ if Command (Index) = Directory_Separator then
+ declare
+ Absolute_Dir : constant String :=
+ Normalize_Pathname
+ (Command (Command'First .. Index));
+ PATH : constant String :=
+ Absolute_Dir &
+ Path_Separator &
+ Getenv ("PATH").all;
+ begin
+ Setenv ("PATH", PATH);
+ end;
- exit;
- end if;
- end loop;
+ exit;
+ end if;
+ end loop;
+ end if;
end;
end if;
@@ -6541,13 +6573,7 @@ package body Make is
-- in its object directory. If it is not, return False, so that
-- the ALI file will not be skipped.
- -- If the source is not in an extending project, we fall back to
- -- the general case and return True at the end of the function.
-
- if Project /= No_Project
- and then Project_Tree.Projects.Table
- (Project).Extends /= No_Project
- then
+ if Project /= No_Project then
Data := Project_Tree.Projects.Table (Project);
declare
@@ -6843,6 +6869,8 @@ package body Make is
-------------------
procedure Scan_Make_Arg (Argv : String; And_Save : Boolean) is
+ Success : Boolean;
+
begin
pragma Assert (Argv'First = 1);
@@ -7098,7 +7126,7 @@ package body Make is
end if;
else
- Make_Failed ("unknown switch: ", Argv);
+ Scan_Make_Switches (Argv, Success);
end if;
-- If we have seen a regular switch process it
@@ -7108,6 +7136,15 @@ package body Make is
if Argv'Length = 1 then
Make_Failed ("switch character cannot be followed by a blank");
+ -- Incorrect switches that should start with "--"
+
+ elsif (Argv'Length > 5 and then Argv (1 .. 5) = "-RTS=")
+ or else (Argv'Length > 5 and then Argv (1 .. 5) = "-GCC=")
+ or else (Argv'Length > 10 and then Argv (1 .. 10) = "-GNATLINK=")
+ or else (Argv'Length > 10 and then Argv (1 .. 10) = "-GNATBIND=")
+ then
+ Make_Failed ("option ", Argv, " should start with '--'");
+
-- -I-
elsif Argv (2 .. Argv'Last) = "I-" then
@@ -7206,7 +7243,7 @@ package body Make is
"project file");
else
- Scan_Make_Switches (Argv);
+ Scan_Make_Switches (Argv, Success);
end if;
-- -d
@@ -7224,13 +7261,13 @@ package body Make is
"project file");
else
- Scan_Make_Switches (Argv);
+ Scan_Make_Switches (Argv, Success);
end if;
-- -j (need to save the result)
elsif Argv (2) = 'j' then
- Scan_Make_Switches (Argv);
+ Scan_Make_Switches (Argv, Success);
if And_Save then
Saved_Maximum_Processes := Maximum_Processes;
@@ -7365,29 +7402,16 @@ package body Make is
Add_Switch (Argv, Compiler, And_Save => And_Save);
Add_Switch (Argv, Binder, And_Save => And_Save);
- -- By default all switches with more than one character or one
- -- character switches are passed to the compiler with the
- -- exception of those tested below, which belong to make.
-
- elsif Argv (2) /= 'd'
- and then Argv (2) /= 'e'
- and then Argv (2 .. Argv'Last) /= "B"
- and then Argv (2 .. Argv'Last) /= "C"
- and then Argv (2 .. Argv'Last) /= "F"
- and then Argv (2 .. Argv'Last) /= "M"
- and then Argv (2 .. Argv'Last) /= "R"
- and then Argv (2 .. Argv'Last) /= "S"
- and then Argv (2 .. Argv'Last) /= "vl"
- and then Argv (2 .. Argv'Last) /= "vm"
- and then Argv (2 .. Argv'Last) /= "vh"
- and then (Argv'Length > 2 or else Argv (2) not in 'a' .. 'z')
- then
- Add_Switch (Argv, Compiler, And_Save => And_Save);
-
- -- All other options are handled by Scan_Make_Switches
+ -- All other switches are processed by Scan_Make_Switches.
+ -- If the call returns with Success = False, then the switch is
+ -- passed to the compiler.
else
- Scan_Make_Switches (Argv);
+ Scan_Make_Switches (Argv, Success);
+
+ if not Success then
+ Add_Switch (Argv, Compiler, And_Save => And_Save);
+ end if;
end if;
-- If not a switch it must be a file name
diff --git a/gcc/ada/makegpr.adb b/gcc/ada/makegpr.adb
index ea95216ceda..8ba177a9484 100644
--- a/gcc/ada/makegpr.adb
+++ b/gcc/ada/makegpr.adb
@@ -31,6 +31,7 @@ with Ada.Unchecked_Deallocation;
with Csets;
with Gnatvsn;
+with Hostparm; use Hostparm;
with GNAT.Directory_Operations; use GNAT.Directory_Operations;
with GNAT.Dynamic_Tables;
@@ -56,6 +57,10 @@ with Types; use Types;
package body Makegpr is
+ On_Windows : constant Boolean := Directory_Separator = '\';
+ -- True when on Windows. Used in Check_Compilation_Needed when processing
+ -- C/C++ dependency files for backslash handling.
+
Max_In_Archives : constant := 50;
-- The maximum number of arguments for a single invocation of the
-- Archive Indexer (ar).
@@ -1803,6 +1808,9 @@ package body Makegpr is
Start : Natural;
Finish : Natural;
+ Looping : Boolean := False;
+ -- Set to True at the end of the first Big_Loop
+
begin
-- Assume the worst, so that statement "return;" may be used if there
-- is any problem.
@@ -1881,179 +1889,213 @@ package body Makegpr is
return;
end if;
- declare
- End_Of_File_Reached : Boolean := False;
+ -- Loop Big_Loop is executed several times only when the dependency file
+ -- contains several times
+ -- <object file>: <source1> ...
+ -- When there is only one of such occurence, Big_Loop is exited
+ -- successfully at the beginning of the second loop.
- begin
- loop
- if End_Of_File (Dep_File) then
- End_Of_File_Reached := True;
- exit;
- end if;
+ Big_Loop :
+ loop
+ declare
+ End_Of_File_Reached : Boolean := False;
- Get_Line (Dep_File, Name_Buffer, Name_Len);
+ begin
+ loop
+ if End_Of_File (Dep_File) then
+ End_Of_File_Reached := True;
+ exit;
+ end if;
- exit when Name_Len > 0 and then Name_Buffer (1) /= '#';
- end loop;
+ Get_Line (Dep_File, Name_Buffer, Name_Len);
+
+ exit when Name_Len > 0 and then Name_Buffer (1) /= '#';
+ end loop;
- -- If dependency file contains only empty lines or comments, then
- -- dependencies are unknown, and the source needs to be recompiled.
+ -- If dependency file contains only empty lines or comments, then
+ -- dependencies are unknown, and the source needs to be
+ -- recompiled.
- if End_Of_File_Reached then
+ if End_Of_File_Reached then
+ -- If we have reached the end of file after the first loop,
+ -- there is nothing else to do.
+
+ exit Big_Loop when Looping;
+
+ if Verbose_Mode then
+ Write_Str (" -> dependency file ");
+ Write_Str (Dep_Name);
+ Write_Line (" is empty");
+ end if;
+
+ Close (Dep_File);
+ return;
+ end if;
+ end;
+
+ Start := 1;
+ Finish := Index (Name_Buffer (1 .. Name_Len), ": ");
+
+ -- First line must start with name of object file, followed by colon
+
+ if Finish = 0 or else
+ Name_Buffer (1 .. Finish - 1) /= Object_Name
+ then
if Verbose_Mode then
Write_Str (" -> dependency file ");
Write_Str (Dep_Name);
- Write_Line (" is empty");
+ Write_Line (" has wrong format");
end if;
Close (Dep_File);
return;
- end if;
- end;
- Start := 1;
- Finish := Index (Name_Buffer (1 .. Name_Len), ": ");
-
- -- First line must start with name of object file, followed by colon
-
- if Finish = 0 or else Name_Buffer (1 .. Finish - 1) /= Object_Name then
- if Verbose_Mode then
- Write_Str (" -> dependency file ");
- Write_Str (Dep_Name);
- Write_Line (" has wrong format");
- end if;
-
- Close (Dep_File);
- return;
+ else
+ Start := Finish + 2;
- else
- Start := Finish + 2;
+ -- Process each line
- -- Process each line
+ Line_Loop : loop
+ declare
+ Line : String := Name_Buffer (1 .. Name_Len);
+ Last : Natural := Name_Len;
- Line_Loop : loop
- declare
- Line : String := Name_Buffer (1 .. Name_Len);
- Last : Natural := Name_Len;
+ begin
+ Name_Loop : loop
- begin
- Name_Loop : loop
+ -- Find the beginning of the next source path name
- -- Find the beginning of the next source path name
+ while Start < Last and then Line (Start) = ' ' loop
+ Start := Start + 1;
+ end loop;
- while Start < Last and then Line (Start) = ' ' loop
- Start := Start + 1;
- end loop;
+ -- Go to next line when there is a continuation character
+ -- \ at the end of the line.
- -- Go to next line when there is a continuation character \
- -- at the end of the line.
+ exit Name_Loop when Start = Last
+ and then Line (Start) = '\';
- exit Name_Loop when Start = Last
- and then Line (Start) = '\';
+ -- We should not be at the end of the line, without
+ -- a continuation character \.
- -- We should not be at the end of the line, without
- -- a continuation character \.
+ if Start = Last then
+ if Verbose_Mode then
+ Write_Str (" -> dependency file ");
+ Write_Str (Dep_Name);
+ Write_Line (" has wrong format");
+ end if;
- if Start = Last then
- if Verbose_Mode then
- Write_Str (" -> dependency file ");
- Write_Str (Dep_Name);
- Write_Line (" has wrong format");
+ Close (Dep_File);
+ return;
end if;
- Close (Dep_File);
- return;
- end if;
-
- -- Look for the end of the source path name
-
- Finish := Start;
- while Finish < Last loop
- if Line (Finish) = '\' then
-
- -- When we are getting a '\' that is not the last
- -- character of the line, the next character is part
- -- of the path name, even if it is a space.
+ -- Look for the end of the source path name
+
+ Finish := Start;
+ while Finish < Last loop
+ if Line (Finish) = '\' then
+
+ -- On Windows, a '\' is part of the path name,
+ -- except when it is followed by another '\' or by
+ -- a space. On other platforms, when we are getting
+ -- a '\' that is not the last character of the
+ -- line, the next character is part of the path
+ -- name, even if it is a space.
+
+ if On_Windows and then
+ Line (Finish + 1) /= '\' and then
+ Line (Finish + 1) /= ' '
+ then
+ Finish := Finish + 1;
+
+ else
+ Line (Finish .. Last - 1) :=
+ Line (Finish + 1 .. Last);
+ Last := Last - 1;
+ end if;
- Line (Finish .. Last - 1) := Line (Finish + 1 .. Last);
- Last := Last - 1;
+ else
+ -- A space that is not preceded by '\' indicates
+ -- the end of the path name.
- else
- -- A space that is not preceded by '\' indicates the
- -- end of the path name.
+ exit when Line (Finish + 1) = ' ';
- exit when Line (Finish + 1) = ' ';
+ Finish := Finish + 1;
+ end if;
+ end loop;
- Finish := Finish + 1;
- end if;
- end loop;
+ -- Check this source
- -- Check this source
+ declare
+ Src_Name : constant String :=
+ Normalize_Pathname
+ (Name =>
+ Line (Start .. Finish),
+ Resolve_Links => False,
+ Case_Sensitive => False);
+ Src_TS : Time_Stamp_Type;
- declare
- Src_Name : constant String :=
- Normalize_Pathname
- (Name => Line (Start .. Finish),
- Resolve_Links => False,
- Case_Sensitive => False);
- Src_TS : Time_Stamp_Type;
+ begin
+ -- If it is original source, set
+ -- Source_In_Dependencies.
- begin
- -- If it is original source, set Source_In_Dependencies
+ if Src_Name = Source_Path then
+ Source_In_Dependencies := True;
+ end if;
- if Src_Name = Source_Path then
- Source_In_Dependencies := True;
- end if;
+ Name_Len := 0;
+ Add_Str_To_Name_Buffer (Src_Name);
+ Src_TS := File_Stamp (Name_Find);
- Name_Len := 0;
- Add_Str_To_Name_Buffer (Src_Name);
- Src_TS := File_Stamp (Name_Find);
+ -- If the source does not exist, we need to recompile
- -- If the source does not exist, we need to recompile
+ if Src_TS = Empty_Time_Stamp then
+ if Verbose_Mode then
+ Write_Str (" -> source ");
+ Write_Str (Src_Name);
+ Write_Line (" does not exist");
+ end if;
- if Src_TS = Empty_Time_Stamp then
- if Verbose_Mode then
- Write_Str (" -> source ");
- Write_Str (Src_Name);
- Write_Line (" does not exist");
- end if;
+ Close (Dep_File);
+ return;
- Close (Dep_File);
- return;
+ -- If the source has been modified after the object
+ -- file, we need to recompile.
- -- If the source has been modified after the object file,
- -- we need to recompile.
+ elsif Src_TS > Source.Object_TS then
+ if Verbose_Mode then
+ Write_Str (" -> source ");
+ Write_Str (Src_Name);
+ Write_Line
+ (" has time stamp later than object file");
+ end if;
- elsif Src_TS > Source.Object_TS then
- if Verbose_Mode then
- Write_Str (" -> source ");
- Write_Str (Src_Name);
- Write_Line
- (" has time stamp later than object file");
+ Close (Dep_File);
+ return;
end if;
+ end;
- Close (Dep_File);
- return;
- end if;
- end;
+ -- If the source path name ends the line, we are done
- -- If the source path name ends the line, we are done
+ exit Line_Loop when Finish = Last;
- exit Line_Loop when Finish = Last;
+ -- Go get the next source on the line
- -- Go get the next source on the line
+ Start := Finish + 1;
+ end loop Name_Loop;
+ end;
- Start := Finish + 1;
- end loop Name_Loop;
- end;
+ -- If we are here, we had a continuation character \ at the end
+ -- of the line, so we continue with the next line.
- -- If we are here, we had a continuation character \ at the end
- -- of the line, so we continue with the next line.
+ Get_Line (Dep_File, Name_Buffer, Name_Len);
+ Start := 1;
+ end loop Line_Loop;
+ end if;
- Get_Line (Dep_File, Name_Buffer, Name_Len);
- Start := 1;
- end loop Line_Loop;
- end if;
+ -- Set Looping at the end of the first loop
+ Looping := True;
+ end loop Big_Loop;
Close (Dep_File);
@@ -3271,6 +3313,51 @@ package body Makegpr is
Prj.Initialize (Project_Tree);
Mains.Delete;
+ -- Add the directory where gprmake is invoked in front of the path,
+ -- if gprmake is invoked from a bin directory or with directory
+ -- information. information. Only do this if the platform is not VMS,
+ -- where the notion of path does not really exist.
+
+ -- Below code shares nasty code duplication with make.adb code???
+
+ if not OpenVMS then
+ declare
+ Prefix : constant String := Executable_Prefix_Path;
+ Command : constant String := Command_Name;
+
+ begin
+ if Prefix'Length > 0 then
+ declare
+ PATH : constant String :=
+ Prefix & Directory_Separator & "bin" &
+ Path_Separator &
+ Getenv ("PATH").all;
+ begin
+ Setenv ("PATH", PATH);
+ end;
+
+ else
+ for Index in reverse Command'Range loop
+ if Command (Index) = Directory_Separator then
+ declare
+ Absolute_Dir : constant String :=
+ Normalize_Pathname
+ (Command (Command'First .. Index));
+ PATH : constant String :=
+ Absolute_Dir &
+ Path_Separator &
+ Getenv ("PATH").all;
+ begin
+ Setenv ("PATH", PATH);
+ end;
+
+ exit;
+ end if;
+ end loop;
+ end if;
+ end;
+ end if;
+
-- Set Name_Ide and Name_Compiler_Command
Name_Len := 0;
@@ -4107,6 +4194,9 @@ package body Makegpr is
Project_File_Name := new String'(Arg (3 .. Arg'Last));
end if;
+ elsif Arg = "-p" or else Arg = "--create-missing-dirs" then
+ Setup_Projects := True;
+
elsif Arg = "-q" then
Quiet_Output := True;
@@ -4193,11 +4283,7 @@ package body Makegpr is
Write_Str ("Usage: ");
Osint.Write_Program_Name;
Write_Str (" -P<project file> [opts] [name] {");
-
- for Lang in First_Language_Indexes loop
- Write_Str ("[-cargs:lang opts] ");
- end loop;
-
+ Write_Str ("[-cargs:lang opts] ");
Write_Str ("[-largs opts] [-gargs opts]}");
Write_Eol;
Write_Eol;
@@ -4230,6 +4316,11 @@ package body Makegpr is
Write_Str (" -o name Choose an alternate executable name");
Write_Eol;
+ -- Line for -p
+
+ Write_Str (" -p Create missing obj, lib and exec dirs");
+ Write_Eol;
+
-- Line for -P
Write_Str (" -Pproj Use GNAT Project File proj");
diff --git a/gcc/ada/makeusg.adb b/gcc/ada/makeusg.adb
index 5dc0604cd3b..027a4cfa473 100644
--- a/gcc/ada/makeusg.adb
+++ b/gcc/ada/makeusg.adb
@@ -99,6 +99,11 @@ begin
"project files");
Write_Eol;
+ -- Line for -eS
+
+ Write_Str (" -eS Echo commands to stdout instead of stderr");
+ Write_Eol;
+
-- Line for -f
Write_Str (" -f Force recompilations of non predefined units");
@@ -151,6 +156,11 @@ begin
Write_Str (" -o name Choose an alternate executable name");
Write_Eol;
+ -- Line for -p
+
+ Write_Str (" -p Create missing obj, lib and exec dirs");
+ Write_Eol;
+
-- Line for -P
Write_Str (" -Pproj Use GNAT Project File proj");
@@ -171,10 +181,6 @@ begin
Write_Str (" -s Recompile if compiler switches have changed");
Write_Eol;
- -- Line for -S
-
- Write_Str (" -S Echo commands to stdout instead of stderr");
-
-- Line for -u
Write_Str (" -u Unique compilation, only compile the given files");
@@ -195,6 +201,21 @@ begin
Write_Str (" -vPx Specify verbosity when parsing GNAT Project Files");
Write_Eol;
+ -- Line for -we
+
+ Write_Str (" -we treat all Warnings as Errors");
+ Write_Eol;
+
+ -- Line for -wn
+
+ Write_Str (" -wn Normal Warning mode (cancels -we/-ws)");
+ Write_Eol;
+
+ -- Line for -ws
+
+ Write_Str (" -ws Suppress all Warnings");
+ Write_Eol;
+
-- Line for -x
Write_Str (" -x " &
diff --git a/gcc/ada/makeutl.adb b/gcc/ada/makeutl.adb
index 4a7a0b9e9ce..a3d3c5bae46 100644
--- a/gcc/ada/makeutl.adb
+++ b/gcc/ada/makeutl.adb
@@ -24,6 +24,8 @@
-- --
------------------------------------------------------------------------------
+with Ada.Command_Line; use Ada.Command_Line;
+
with Namet; use Namet;
with Osint; use Osint;
with Prj.Ext;
@@ -31,6 +33,7 @@ with Prj.Util;
with Snames; use Snames;
with Table;
+with System.Case_Util; use System.Case_Util;
with System.HTable;
package body Makeutl is
@@ -117,6 +120,68 @@ package body Makeutl is
Marks.Reset;
end Delete_All_Marks;
+ ----------------------------
+ -- Executable_Prefix_Path --
+ ----------------------------
+
+ function Executable_Prefix_Path return String is
+ Exec_Name : constant String := Command_Name;
+
+ function Get_Install_Dir (S : String) return String;
+ -- S is the executable name preceeded by the absolute or relative
+ -- path, e.g. "c:\usr\bin\gcc.exe". Returns the absolute directory
+ -- where "bin" lies (in the example "C:\usr").
+ -- If the executable is not in a "bin" directory, return "".
+
+ ---------------------
+ -- Get_Install_Dir --
+ ---------------------
+
+ function Get_Install_Dir (S : String) return String is
+ Exec : String := S;
+ Path_Last : Integer := 0;
+
+ begin
+ for J in reverse Exec'Range loop
+ if Exec (J) = Directory_Separator then
+ Path_Last := J - 1;
+ exit;
+ end if;
+ end loop;
+
+ if Path_Last >= Exec'First + 2 then
+ To_Lower (Exec (Path_Last - 2 .. Path_Last));
+ end if;
+
+ if Path_Last < Exec'First + 2
+ or else Exec (Path_Last - 2 .. Path_Last) /= "bin"
+ or else (Path_Last - 3 >= Exec'First
+ and then Exec (Path_Last - 3) /= Directory_Separator)
+ then
+ return "";
+ end if;
+
+ return Normalize_Pathname (Exec (Exec'First .. Path_Last - 4));
+ end Get_Install_Dir;
+
+ -- Beginning of Executable_Prefix_Path
+
+ begin
+ -- First determine if a path prefix was placed in front of the
+ -- executable name.
+
+ for J in reverse Exec_Name'Range loop
+ if Exec_Name (J) = Directory_Separator then
+ return Get_Install_Dir (Exec_Name);
+ end if;
+ end loop;
+
+ -- If we get here, the user has typed the executable name with no
+ -- directory prefix.
+
+ return Get_Install_Dir (Locate_Exec_On_Path (Exec_Name).all);
+ end Executable_Prefix_Path;
+
----------
-- Hash --
----------
diff --git a/gcc/ada/makeutl.ads b/gcc/ada/makeutl.ads
index d69adb2f628..b2a75f770f5 100644
--- a/gcc/ada/makeutl.ads
+++ b/gcc/ada/makeutl.ads
@@ -6,7 +6,7 @@
-- --
-- S p e c --
-- --
--- Copyright (C) 2004-2005 Free Software Foundation, Inc. --
+-- Copyright (C) 2004-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- --
@@ -43,6 +43,11 @@ package Makeutl is
-- Find the index of a unit in a source file. Return zero if the file
-- is not a multi-unit source file.
+ function Executable_Prefix_Path return String;
+ -- Return the absolute path parent directory of the directory where the
+ -- current executable resides, if its directory is named "bin", otherwise
+ -- return an empty string.
+
function Is_External_Assignment (Argv : String) return Boolean;
-- Verify that an external assignment switch is syntactically correct
--
diff --git a/gcc/ada/par.adb b/gcc/ada/par.adb
index fabb9ea724f..bebc66970fd 100644
--- a/gcc/ada/par.adb
+++ b/gcc/ada/par.adb
@@ -142,7 +142,7 @@ is
-- whose body is required and has not yet been found. The prefix SIS
-- stands for "Subprogram IS" handling.
- SIS_Entry_Active : Boolean;
+ SIS_Entry_Active : Boolean := False;
-- Set True to indicate that an entry is active (i.e. that a subprogram
-- declaration has been encountered, and no body for this subprogram has
-- been encountered). The remaining fields are valid only if this is True.
@@ -605,22 +605,22 @@ is
-- declaration of this type for details.
function P_Interface_Type_Definition
- (Abstract_Present : Boolean;
- Is_Synchronized : Boolean) return Node_Id;
+ (Abstract_Present : Boolean) return Node_Id;
-- Ada 2005 (AI-251): Parse the interface type definition part. Abstract
-- Present indicates if the reserved word "abstract" has been previously
-- found. It is used to report an error message because interface types
- -- are by definition abstract tagged. Is_Synchronized is True in case of
- -- task interfaces, protected interfaces, and synchronized interfaces;
- -- it is used to generate a record_definition node. In the rest of cases
- -- (limited interfaces and interfaces) we generate a record_definition
+ -- are by definition abstract tagged. We generate a record_definition
-- node if the list of interfaces is empty; otherwise we generate a
-- derived_type_definition node (the first interface in this list is the
-- ancestor interface).
- function P_Null_Exclusion return Boolean;
- -- Ada 2005 (AI-231): Parse the null-excluding part. True indicates
- -- that the null-excluding part was present.
+ function P_Null_Exclusion
+ (Allow_Anonymous_In_95 : Boolean := False) return Boolean;
+ -- Ada 2005 (AI-231): Parse the null-excluding part. A True result
+ -- indicates that the null-excluding part was present.
+ -- Allow_Anonymous_In_95 is True if we are in a context that allows
+ -- anonymous access types in Ada 95, in which case "not null" is legal
+ -- if it precedes "access".
function P_Subtype_Indication
(Not_Null_Present : Boolean := False) return Node_Id;
@@ -1362,13 +1362,9 @@ begin
Name := Uname (Uname'First .. Uname'Last - 2);
- if Name = "ada" or else
- Name = "calendar" or else
- Name = "interfaces" or else
- Name = "system" or else
- Name = "machine_code" or else
- Name = "unchecked_conversion" or else
- Name = "unchecked_deallocation"
+ if Name = "ada" or else
+ Name = "interfaces" or else
+ Name = "system"
then
Error_Msg
("language defined units may not be recompiled",
diff --git a/gcc/ada/prj-proc.adb b/gcc/ada/prj-proc.adb
index 1c382ab5c40..443a3e80e0c 100644
--- a/gcc/ada/prj-proc.adb
+++ b/gcc/ada/prj-proc.adb
@@ -26,7 +26,7 @@
with Err_Vars; use Err_Vars;
with Namet; use Namet;
-with Opt;
+with Opt; use Opt;
with Osint; use Osint;
with Output; use Output;
with Prj.Attr; use Prj.Attr;
@@ -950,7 +950,7 @@ package body Prj.Proc is
Value := Prj.Ext.Value_Of (Name, Default);
if Value = No_Name then
- if not Opt.Quiet_Output then
+ if not Quiet_Output then
if Error_Report = null then
Error_Msg
("?undefined external reference",
@@ -1268,7 +1268,10 @@ package body Prj.Proc is
end loop;
end if;
- Success := Total_Errors_Detected = 0;
+ Success :=
+ Total_Errors_Detected = 0
+ and then
+ (Warning_Mode /= Treat_As_Error or else Warnings_Detected = 0);
end Process;
-------------------------------
@@ -2295,7 +2298,7 @@ package body Prj.Proc is
(Imported_Project_List).Next;
end loop;
- if Opt.Verbose_Mode then
+ if Verbose_Mode then
Write_Str ("Checking project file """);
Write_Str (Get_Name_String (Data.Name));
Write_Line ("""");
diff --git a/gcc/ada/switch-m.adb b/gcc/ada/switch-m.adb
index dc3fe569356..a9239608b0a 100644
--- a/gcc/ada/switch-m.adb
+++ b/gcc/ada/switch-m.adb
@@ -363,44 +363,40 @@ package body Switch.M is
C := Switch_Chars (Ptr);
Ptr := Ptr + 1;
- -- 'w' should be skipped in -gnatw
+ -- -gnatyMxxx
- if C /= 'w' or else Storing (First_Stored) /= 'w' then
-
- -- -gnatyMxxx
-
- if C = 'M'
- and then Storing (First_Stored) = 'y' then
- Last_Stored := First_Stored + 1;
- Storing (Last_Stored) := 'M';
-
- while Ptr <= Max loop
- C := Switch_Chars (Ptr);
- exit when C not in '0' .. '9';
- Last_Stored := Last_Stored + 1;
- Storing (Last_Stored) := C;
- Ptr := Ptr + 1;
- end loop;
-
- -- If there is no digit after -gnatyM,
- -- the switch is invalid.
+ if C = 'M' and then
+ Storing (First_Stored) = 'y'
+ then
+ Last_Stored := First_Stored + 1;
+ Storing (Last_Stored) := 'M';
- if Last_Stored = First_Stored + 1 then
- Last := 0;
- return;
+ while Ptr <= Max loop
+ C := Switch_Chars (Ptr);
+ exit when C not in '0' .. '9';
+ Last_Stored := Last_Stored + 1;
+ Storing (Last_Stored) := C;
+ Ptr := Ptr + 1;
+ end loop;
- else
- Add_Switch_Component
- (Storing (Storing'First .. Last_Stored));
- end if;
+ -- If there is no digit after -gnatyM,
+ -- the switch is invalid.
- -- All other switches are -gnatxx
+ if Last_Stored = First_Stored + 1 then
+ Last := 0;
+ return;
else
- Storing (First_Stored + 1) := C;
Add_Switch_Component
- (Storing (Storing'First .. First_Stored + 1));
+ (Storing (Storing'First .. Last_Stored));
end if;
+
+ -- All other switches are -gnatxx
+
+ else
+ Storing (First_Stored + 1) := C;
+ Add_Switch_Component
+ (Storing (Storing'First .. First_Stored + 1));
end if;
end loop;
@@ -481,12 +477,19 @@ package body Switch.M is
-- Scan_Make_Switches --
------------------------
- procedure Scan_Make_Switches (Switch_Chars : String) is
+ procedure Scan_Make_Switches
+ (Switch_Chars : String;
+ Success : out Boolean)
+ is
Ptr : Integer := Switch_Chars'First;
Max : constant Integer := Switch_Chars'Last;
C : Character := ' ';
begin
+ -- Assume a good switch
+
+ Success := True;
+
-- Skip past the initial character (must be the switch character)
if Ptr = Max then
@@ -496,70 +499,42 @@ package body Switch.M is
Ptr := Ptr + 1;
end if;
- -- A little check, "gnat" at the start of a switch is not allowed
- -- except for the compiler (where it was already removed)
+ -- A little check, "gnat" at the start of a switch is for the compiler
if Switch_Chars'Length >= Ptr + 3
and then Switch_Chars (Ptr .. Ptr + 3) = "gnat"
then
- Osint.Fail
- ("invalid switch: """, Switch_Chars, """ (gnat not needed here)");
+ Success := False;
+ return;
end if;
- -- Loop to scan through switches given in switch string
-
- Check_Switch : begin
- C := Switch_Chars (Ptr);
-
- -- Processing for a switch
-
- case C is
-
- when 'a' =>
- Ptr := Ptr + 1;
- Check_Readonly_Files := True;
-
- -- Processing for b switch
-
- when 'b' =>
- Ptr := Ptr + 1;
- Bind_Only := True;
- Make_Steps := True;
-
- -- Processing for B switch
+ C := Switch_Chars (Ptr);
- when 'B' =>
- Ptr := Ptr + 1;
- Build_Bind_And_Link_Full_Project := True;
-
- -- Processing for c switch
-
- when 'c' =>
- Ptr := Ptr + 1;
- Compile_Only := True;
- Make_Steps := True;
+ -- Multiple character switches
- -- Processing for C switch
+ if Switch_Chars'Length > 2 then
+ if Switch_Chars = "--create-missing-dirs" then
+ Setup_Projects := True;
- when 'C' =>
+ elsif C = 'v' and then Switch_Chars'Length = 3 then
Ptr := Ptr + 1;
- Create_Mapping_File := True;
-
- -- Processing for D switch
+ Verbose_Mode := True;
- when 'D' =>
- Ptr := Ptr + 1;
+ case Switch_Chars (Ptr) is
+ when 'l' =>
+ Verbosity_Level := Opt.Low;
- if Object_Directory_Present then
- Osint.Fail ("duplicate -D switch");
+ when 'm' =>
+ Verbosity_Level := Opt.Medium;
- else
- Object_Directory_Present := True;
- end if;
+ when 'h' =>
+ Verbosity_Level := Opt.High;
- -- Processing for d switch
+ when others =>
+ Success := False;
+ end case;
- when 'd' =>
+ elsif C = 'd' then
-- Note: for the debug switch, the remaining characters in this
-- switch field must all be debug flags, since all valid switch
@@ -580,17 +555,9 @@ package body Switch.M is
end if;
end loop;
- return;
-
- -- Processing for e switch
-
- when 'e' =>
+ elsif C = 'e' then
Ptr := Ptr + 1;
- if Ptr > Max then
- Bad_Switch (Switch_Chars);
- end if;
-
case Switch_Chars (Ptr) is
-- Processing for eI switch
@@ -599,164 +566,219 @@ package body Switch.M is
Ptr := Ptr + 1;
Scan_Pos (Switch_Chars, Max, Ptr, Main_Index, C);
+ if Ptr <= Max then
+ Bad_Switch (Switch_Chars);
+ end if;
+
-- Processing for eL switch
when 'L' =>
- Ptr := Ptr + 1;
- Follow_Links := True;
+ if Ptr /= Max then
+ Bad_Switch (Switch_Chars);
+
+ else
+ Follow_Links := True;
+ end if;
+
+ -- Processing for eS switch
+
+ when 'S' =>
+ if Ptr /= Max then
+ Bad_Switch (Switch_Chars);
+
+ else
+ Commands_To_Stdout := True;
+ end if;
when others =>
Bad_Switch (Switch_Chars);
end case;
- -- Processing for f switch
-
- when 'f' =>
+ elsif C = 'j' then
Ptr := Ptr + 1;
- Force_Compilations := True;
- -- Processing for F switch
+ declare
+ Max_Proc : Pos;
+ begin
+ Scan_Pos (Switch_Chars, Max, Ptr, Max_Proc, C);
- when 'F' =>
- Ptr := Ptr + 1;
- Full_Path_Name_For_Brief_Errors := True;
+ if Ptr <= Max then
+ Bad_Switch (Switch_Chars);
- -- Processing for h switch
+ else
+ Maximum_Processes := Positive (Max_Proc);
+ end if;
+ end;
- when 'h' =>
+ elsif C = 'w' and then Switch_Chars'Length = 3 then
Ptr := Ptr + 1;
- Usage_Requested := True;
- -- Processing for i switch
+ if Switch_Chars = "-we" then
+ Warning_Mode := Treat_As_Error;
- when 'i' =>
- Ptr := Ptr + 1;
- In_Place_Mode := True;
+ elsif Switch_Chars = "-wn" then
+ Warning_Mode := Normal;
- -- Processing for j switch
+ elsif Switch_Chars = "-ws" then
+ Warning_Mode := Suppress;
- when 'j' =>
- if Ptr = Max then
- Bad_Switch (Switch_Chars);
+ else
+ Success := False;
end if;
- Ptr := Ptr + 1;
+ else
+ Success := False;
+ end if;
- declare
- Max_Proc : Pos;
- begin
- Scan_Pos (Switch_Chars, Max, Ptr, Max_Proc, C);
- Maximum_Processes := Positive (Max_Proc);
- end;
+ -- Single-character switches
- -- Processing for k switch
+ else
+ Check_Switch : begin
- when 'k' =>
- Ptr := Ptr + 1;
- Keep_Going := True;
+ case C is
- -- Processing for l switch
+ when 'a' =>
+ Check_Readonly_Files := True;
- when 'l' =>
- Ptr := Ptr + 1;
- Link_Only := True;
- Make_Steps := True;
+ -- Processing for b switch
- when 'M' =>
- Ptr := Ptr + 1;
- List_Dependencies := True;
+ when 'b' =>
+ Bind_Only := True;
+ Make_Steps := True;
- -- Processing for n switch
+ -- Processing for B switch
- when 'n' =>
- Ptr := Ptr + 1;
- Do_Not_Execute := True;
+ when 'B' =>
+ Build_Bind_And_Link_Full_Project := True;
- -- Processing for o switch
+ -- Processing for c switch
- when 'o' =>
- Ptr := Ptr + 1;
+ when 'c' =>
+ Compile_Only := True;
+ Make_Steps := True;
- if Output_File_Name_Present then
- Osint.Fail ("duplicate -o switch");
- else
- Output_File_Name_Present := True;
- end if;
+ -- Processing for C switch
- -- Processing for q switch
+ when 'C' =>
+ Create_Mapping_File := True;
- when 'q' =>
- Ptr := Ptr + 1;
- Quiet_Output := True;
+ -- Processing for D switch
- -- Processing for R switch
+ when 'D' =>
+ if Object_Directory_Present then
+ Osint.Fail ("duplicate -D switch");
- when 'R' =>
- Ptr := Ptr + 1;
- Run_Path_Option := False;
+ else
+ Object_Directory_Present := True;
+ end if;
- -- Processing for s switch
+ -- Processing for f switch
- when 's' =>
- Ptr := Ptr + 1;
- Check_Switches := True;
+ when 'f' =>
+ Force_Compilations := True;
- -- Processing for S switch
+ -- Processing for F switch
- when 'S' =>
- Ptr := Ptr + 1;
- Commands_To_Stdout := True;
+ when 'F' =>
+ Full_Path_Name_For_Brief_Errors := True;
- -- Processing for v switch
+ -- Processing for h switch
- when 'v' =>
- Ptr := Ptr + 1;
- Verbose_Mode := True;
- Verbosity_Level := Opt.High;
+ when 'h' =>
+ Usage_Requested := True;
- if Ptr <= Max then
- case Switch_Chars (Ptr) is
- when 'l' =>
- Verbosity_Level := Opt.Low;
+ -- Processing for i switch
- when 'm' =>
- Verbosity_Level := Opt.Medium;
+ when 'i' =>
+ In_Place_Mode := True;
- when 'h' =>
- Verbosity_Level := Opt.High;
+ -- Processing for j switch
- when others =>
- Bad_Switch (Switch_Chars);
- end case;
+ when 'j' =>
+ -- -j not followed by a number is an error
- Ptr := Ptr + 1;
- end if;
+ Bad_Switch (Switch_Chars);
- -- Processing for x switch
+ -- Processing for k switch
- when 'x' =>
- Ptr := Ptr + 1;
- External_Unit_Compilation_Allowed := True;
+ when 'k' =>
+ Keep_Going := True;
- -- Processing for z switch
+ -- Processing for l switch
- when 'z' =>
- Ptr := Ptr + 1;
- No_Main_Subprogram := True;
+ when 'l' =>
+ Link_Only := True;
+ Make_Steps := True;
- -- Anything else is an error (illegal switch character)
+ -- Processing for M switch
- when others =>
- Bad_Switch (Switch_Chars);
+ when 'M' =>
+ List_Dependencies := True;
- end case;
+ -- Processing for n switch
- if Ptr <= Max then
- Bad_Switch (Switch_Chars);
- end if;
+ when 'n' =>
+ Do_Not_Execute := True;
+
+ -- Processing for o switch
+
+ when 'o' =>
+ if Output_File_Name_Present then
+ Osint.Fail ("duplicate -o switch");
+ else
+ Output_File_Name_Present := True;
+ end if;
+
+ -- Processing for p switch
+
+ when 'p' =>
+ Setup_Projects := True;
+
+ -- Processing for q switch
+
+ when 'q' =>
+ Quiet_Output := True;
+
+ -- Processing for R switch
+
+ when 'R' =>
+ Run_Path_Option := False;
- end Check_Switch;
+ -- Processing for s switch
+ when 's' =>
+ Ptr := Ptr + 1;
+ Check_Switches := True;
+
+ -- Processing for v switch
+
+ when 'v' =>
+ Verbose_Mode := True;
+ Verbosity_Level := Opt.High;
+
+ -- Processing for x switch
+
+ when 'x' =>
+ External_Unit_Compilation_Allowed := True;
+
+ -- Processing for z switch
+
+ when 'z' =>
+ No_Main_Subprogram := True;
+
+ -- Any other small letter is an illegal switch
+
+ when others =>
+ if C in 'a' .. 'z' then
+ Bad_Switch (Switch_Chars);
+
+ else
+ Success := False;
+ end if;
+
+ end case;
+ end Check_Switch;
+ end if;
end Scan_Make_Switches;
end Switch.M;
diff --git a/gcc/ada/switch-m.ads b/gcc/ada/switch-m.ads
index 5b4a9e6e267..fc073a00e02 100644
--- a/gcc/ada/switch-m.ads
+++ b/gcc/ada/switch-m.ads
@@ -6,7 +6,7 @@
-- --
-- S p e c --
-- --
--- Copyright (C) 2001 Free Software Foundation, Inc. --
+-- Copyright (C) 2001-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- --
@@ -34,14 +34,14 @@ with GNAT.OS_Lib; use GNAT.OS_Lib;
package Switch.M is
- procedure Scan_Make_Switches (Switch_Chars : String);
- -- Procedures to scan out binder switches stored in the given string.
- -- The first character is known to be a valid switch character, and there
- -- are no blanks or other switch terminator characters in the string, so
- -- the entire string should consist of valid switch characters, except that
- -- an optional terminating NUL character is allowed. A bad switch causes
- -- a fatal error exit and control does not return. The call also sets
- -- Usage_Requested to True if a ? switch is encountered.
+ procedure Scan_Make_Switches
+ (Switch_Chars : String;
+ Success : out Boolean);
+ -- Scan a gnatmake switch and act accordingly. For switches that are
+ -- recognized, Success is set to True. A switch that is not recognized and
+ -- consists of one small letter causes a fatal error exit and control does
+ -- not return. For all other not recognized switches, Success is set to
+ -- False, so that the switch may be passed to the compiler.
procedure Normalize_Compiler_Switches
(Switch_Chars : String;
diff --git a/gcc/ada/vms_data.ads b/gcc/ada/vms_data.ads
index e7e19efba1e..9aa3939a884 100644
--- a/gcc/ada/vms_data.ads
+++ b/gcc/ada/vms_data.ads
@@ -1961,6 +1961,8 @@ package VMS_Data is
"-gnaty9 " &
"ATTRIBUTE " &
"-gnatya " &
+ "ARRAY_INDEXES " &
+ "-gnatyA " &
"BLANKS " &
"-gnatyb " &
"COMMENTS " &
@@ -2030,6 +2032,12 @@ package VMS_Data is
-- underscore must be uppercase.
-- All other letters must be lowercase.
--
+ -- ARRAY_INDEXES Check indexes of array attributes.
+ -- For array attributes First, Last, Range,
+ -- or Length, the index number must be omitted
+ -- for one-dimensional arrays and is required
+ -- for multi-dimensional arrays.
+ --
-- BLANKS Blanks not allowed at statement end.
-- Trailing blanks are not allowed at the end of
-- statements. The purpose of this rule, together
@@ -4101,6 +4109,14 @@ package VMS_Data is
-- when the only modifications to a source file consist in
-- adding/removing comments, empty lines, spaces or tabs.
+ S_Make_Missing : aliased constant S := "/CREATE_MISSING_DIRS " &
+ "-p";
+ -- /NOCREATE_MISSING_DIRS (D)
+ -- /CREATE_MISSING_DIRS
+ --
+ -- When an object directory, a library directory or an exec directory
+ -- in missing, attempt to create the directory.
+
S_Make_Nolink : aliased constant S := "/NOLINK " &
"-c";
-- /NOLINK
@@ -4212,7 +4228,7 @@ package VMS_Data is
-- When looking for source files also look in the specified directories.
S_Make_Stand : aliased constant S := "/STANDARD_OUTPUT_FOR_COMMANDS " &
- "-S";
+ "-eS";
-- /NOSTANDARD_OUTPUT_FOR_COMMANDS (D)
-- /STANDARD_OUTPUT_FOR_COMMANDS
--
@@ -4286,6 +4302,7 @@ package VMS_Data is
S_Make_Med_Verb'Access,
S_Make_Mess 'Access,
S_Make_Minimal 'Access,
+ S_Make_Missing 'Access,
S_Make_Nolink 'Access,
S_Make_Nomain 'Access,
S_Make_Nonpro 'Access,
@@ -4993,6 +5010,36 @@ package VMS_Data is
-- used in the default dictionary file, are defined in the GNAT User's
-- Guide.
+ S_Pretty_Encoding : aliased constant S := "/RESULT_ENCODING=" &
+ "BRACKETS " &
+ "-Wb " &
+ "HEX_ESC " &
+ "-Wh " &
+ "UPPER_HALF " &
+ "-Wu " &
+ "SHIFT_JIS " &
+ "-Ws " &
+ "EUC " &
+ "-We " &
+ "UTF_8 " &
+ "-W8";
+ -- /RESULT_ENCODING[=encoding-option]
+ --
+ -- Specify the wide character encoding of the result file.
+ -- '=encoding-option' may be one of:
+ --
+ -- BRACKETS (D) Brackets encoding.
+ --
+ -- HEX_ESC Hex ESC encoding.
+ --
+ -- UPPER_HALF Upper half encoding.
+ --
+ -- SHIFT_JIS Shift-JIS encoding.
+ --
+ -- EUC EUC Encoding.
+ --
+ -- UTF_8 UTF-8 encoding.
+
S_Pretty_Files : aliased constant S := "/FILES=@" &
"-files=@";
-- /FILES=filename
@@ -5225,6 +5272,7 @@ package VMS_Data is
S_Pretty_Dico 'Access,
S_Pretty_Eol 'Access,
S_Pretty_Ext 'Access,
+ S_Pretty_Encoding 'Access,
S_Pretty_Files 'Access,
S_Pretty_Forced 'Access,
S_Pretty_Formfeed 'Access,
@@ -5249,69 +5297,6 @@ package VMS_Data is
S_Pretty_Verbose 'Access,
S_Pretty_Warnings 'Access);
- -----------------------------
- -- Switches for GNAT SETUP --
- -----------------------------
-
- S_Setup_Ext : aliased constant S := "/EXTERNAL_REFERENCE=" & '"' &
- "-X" & '"';
- -- /EXTERNAL_REFERENCE="name=val"
- --
- -- Specifies an external reference to the project manager. Useful only if
- -- /PROJECT_FILE is used.
- --
- -- Example:
- -- /EXTERNAL_REFERENCE="DEBUG=TRUE"
-
- S_Setup_Mess : aliased constant S := "/MESSAGES_PROJECT_FILE=" &
- "DEFAULT " &
- "-vP0 " &
- "MEDIUM " &
- "-vP1 " &
- "HIGH " &
- "-vP2";
- -- /MESSAGES_PROJECT_FILE[=messages-option]
- --
- -- Specifies the "verbosity" of the parsing of project files.
- -- messages-option may be one of the following:
- --
- -- DEFAULT (D) No messages are output if there is no error or warning.
- --
- -- MEDIUM A small number of messages are output.
- --
- -- HIGH A great number of messages are output, most of them not
- -- being useful for the user.
-
- S_Setup_Project : aliased constant S := "/PROJECT_FILE=<" &
- "-P>";
- -- /PROJECT_FILE=filename
- --
- -- Specifies the main project file to be used. The project files rooted
- -- at the main project file are parsed and non existing object
- -- directories, library directories and exec directories are created.
-
- S_Setup_Quiet : aliased constant S := "/QUIET " &
- "-q";
- -- /NOQUIET (D)
- -- /QUIET
- --
- -- Work quietly, only output warnings and errors.
-
- S_Setup_Verbose : aliased constant S := "/VERBOSE " &
- "-v";
- -- /NOVERBOSE (D)
- -- /VERBOSE
- --
- -- Verbose mode; GNAT PRETTY generates version information and then a
- -- trace of the actions it takes to produce or obtain the ASIS tree.
-
- Setup_Switches : aliased constant Switches :=
- (S_Setup_Ext 'Access,
- S_Setup_Mess 'Access,
- S_Setup_Project 'Access,
- S_Setup_Quiet 'Access,
- S_Setup_Verbose 'Access);
-
------------------------------
-- Switches for GNAT SHARED --
------------------------------
@@ -5390,6 +5375,185 @@ package VMS_Data is
S_Shared_Verb 'Access,
S_Shared_ZZZZZ 'Access);
+ -----------------------------
+ -- Switches for GNAT STACK --
+ -----------------------------
+
+ S_Stack_All : aliased constant S := "/ALL_SUBPROGRAMS " &
+ "-a";
+ -- /NOALL_SUBPROGRAMS (D)
+ -- /ALL_SUBPROGRAMS
+ --
+ -- Consider all subprograms as entry points.
+
+ S_Stack_All_Cycles : aliased constant S := "/ALL_CYCLES " &
+ "-ca";
+ -- /NOALL_CYCLES (D)
+ -- /ALL_CYCLES
+ --
+ -- Extract all possible cycles in the call graph.
+
+ S_Stack_All_Prjs : aliased constant S := "/ALL_PROJECTS " &
+ "-U";
+ -- /NOALL_PROJECTS (D)
+ -- /ALL_PROJECTS
+ --
+ -- When GNAT STACK is used with a Project File and no source is
+ -- specified, the underlying tool gnatstack is called for all the
+ -- units of all the Project Files in the project tree.
+
+ S_Stack_Debug : aliased constant S := "/DEBUG " &
+ "-g";
+ -- /NODEBUG (D)
+ -- /DEBUG
+ --
+ -- Generate internal debug information.
+
+ S_Stack_Directory : aliased constant S := "/DIRECTORY=*" &
+ "-aO*";
+ -- /DIRECTORY=(direc[,...])
+ --
+ -- When looking for .ci files look also in directories specified.
+
+ S_Stack_Entries : aliased constant S := "/ENTRIES=*" &
+ "-e*";
+ --
+ -- /ENTRY=(entry_point[,...])
+ --
+ -- Name of symbol to be used as entry point for the analysis.
+
+ S_Stack_Files : aliased constant S := "/FILES=@" &
+ "-files=@";
+ -- /FILES=filename
+ --
+ -- Take as arguments the files that are listed in the specified
+ -- text file.
+
+ S_Stack_Help : aliased constant S := "/HELP " &
+ "-h";
+ -- /NOHELP (D)
+ -- /HELP
+ --
+ -- Output a message explaining the usage of gnatstack.
+
+ S_Stack_List : aliased constant S := "/LIST=#" &
+ "-l#";
+ -- /LIST=nnn
+ --
+ -- Print the nnn subprograms requiring the biggest local stack usage. By
+ -- default none will be displayed.
+
+ S_Stack_Order : aliased constant S := "/ORDER=" &
+ "STACK " &
+ "-os " &
+ "ALPHABETICAL " &
+ "-oa";
+ -- /ORDER[=order-option]
+ --
+ -- Specifies the order for displaying the different call graphs.
+ -- order-option may be one of the following:
+ --
+ -- STACK (D) Select stack usage order
+ --
+ -- ALPHABETICAL Select alphabetical order
+
+ S_Stack_Path : aliased constant S := "/PATH " &
+ "-p";
+ -- /NOPATH (D)
+ -- /PATH
+ --
+ -- Print all the subprograms that make up the worst-case path for every
+ -- entry point.
+
+ S_Stack_Project : aliased constant S := "/PROJECT_FILE=<" &
+ "-P>";
+ -- /PROJECT_FILE=filename
+ --
+ -- Specifies the main project file to be used. The project files rooted
+ -- at the main project file will be parsed before the invocation of
+ -- gnatstack.
+
+ S_Stack_Output : aliased constant S := "/OUTPUT=@" &
+ "-f@";
+ -- /OUTPUT=filename
+ --
+ -- Name of the file containing the generated graph (VCG format).
+
+ S_Stack_Regexp : aliased constant S := "/EXPRESSION=|" &
+ "-r|";
+ --
+ -- /EXPRESSION=regular-expression
+ --
+ -- Any symbol matching the regular expression will be considered as a
+ -- potential entry point for the analysis.
+
+ S_Stack_Unbounded : aliased constant S := "/UNBOUNDED=#" &
+ "-d#";
+ -- /UNBOUNDED=nnn
+ --
+ -- Default stack size to be used for unbounded (dynamic) frames.
+
+ S_Stack_Unknown : aliased constant S := "/UNKNOWN=#" &
+ "-u#";
+ -- /UNKNOWN=nnn
+ --
+ -- Default stack size to be used for unknown (external) calls.
+
+ S_Stack_Verbose : aliased constant S := "/VERBOSE " &
+ "-v";
+ -- /NOVERBOSE (D)
+ -- /VERBOSE
+ --
+ -- Specifies the amount of information to be displayed about the
+ -- different subprograms. In verbose mode the full location of the
+ -- subprogram will be part of the output, as well as detailed information
+ -- about inaccurate data.
+
+ S_Stack_Warnings : aliased constant S := "/WARNINGS=" &
+ "ALL " &
+ "-Wa " &
+ "CYCLES " &
+ "-Wc " &
+ "UNBOUNDED " &
+ "-Wu " &
+ "EXTERNAL " &
+ "-We " &
+ "INDIRECT " &
+ "-Wi";
+ -- /WARNINGS[=(keyword[,...])]
+ --
+ -- The following keywords are supported:
+ --
+ -- ALL Turn on all optional warnings
+ --
+ -- CYCLES Turn on warnings for cycles
+ --
+ -- UNBOUNDED Turn on warnings for unbounded frames
+ --
+ -- EXTERNAL Turn on warnings for external calls
+ --
+ -- INDIRECT Turn on warnings for indirect calls
+
+ Stack_Switches : aliased constant Switches :=
+ (S_Stack_All 'Access,
+ S_Stack_All_Cycles 'Access,
+ S_Stack_All_Prjs 'Access,
+ S_Stack_Debug 'Access,
+ S_Stack_Directory 'Access,
+ S_Stack_Entries 'Access,
+ S_Stack_Files 'Access,
+ S_Stack_Help 'Access,
+ S_Stack_List 'Access,
+ S_Stack_Order 'Access,
+ S_Stack_Path 'Access,
+ S_Stack_Project 'Access,
+ S_Stack_Output 'Access,
+ S_Stack_Regexp 'Access,
+ S_Stack_Unbounded 'Access,
+ S_Stack_Unknown 'Access,
+ S_Stack_Verbose 'Access,
+ S_Stack_Warnings 'Access);
+
----------------------------
-- Switches for GNAT STUB --
----------------------------