------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
-- --
|
-- --
|
-- GNAT COMPILER COMPONENTS --
|
-- GNAT COMPILER COMPONENTS --
|
-- --
|
-- --
|
-- S W I T C H - C --
|
-- S W I T C H - C --
|
-- --
|
-- --
|
-- B o d y --
|
-- B o d y --
|
-- --
|
-- --
|
-- Copyright (C) 2001-2009, Free Software Foundation, Inc. --
|
-- Copyright (C) 2001-2009, Free Software Foundation, Inc. --
|
-- --
|
-- --
|
-- GNAT is free software; you can redistribute it and/or modify it under --
|
-- 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- --
|
-- terms of the GNU General Public License as published by the Free Soft- --
|
-- ware Foundation; either version 3, or (at your option) any later ver- --
|
-- ware Foundation; either version 3, or (at your option) any later ver- --
|
-- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
|
-- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
|
-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
|
-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
|
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
|
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
|
-- for more details. You should have received a copy of the GNU General --
|
-- for more details. You should have received a copy of the GNU General --
|
-- Public License distributed with GNAT; see file COPYING3. If not, go to --
|
-- Public License distributed with GNAT; see file COPYING3. If not, go to --
|
-- http://www.gnu.org/licenses for a complete copy of the license. --
|
-- http://www.gnu.org/licenses for a complete copy of the license. --
|
-- --
|
-- --
|
-- GNAT was originally developed by the GNAT team at New York University. --
|
-- GNAT was originally developed by the GNAT team at New York University. --
|
-- Extensive contributions were provided by Ada Core Technologies Inc. --
|
-- Extensive contributions were provided by Ada Core Technologies Inc. --
|
-- --
|
-- --
|
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
|
|
with Debug; use Debug;
|
with Debug; use Debug;
|
with Lib; use Lib;
|
with Lib; use Lib;
|
with Osint; use Osint;
|
with Osint; use Osint;
|
with Opt; use Opt;
|
with Opt; use Opt;
|
with Prepcomp; use Prepcomp;
|
with Prepcomp; use Prepcomp;
|
with Validsw; use Validsw;
|
with Validsw; use Validsw;
|
with Sem_Warn; use Sem_Warn;
|
with Sem_Warn; use Sem_Warn;
|
with Stylesw; use Stylesw;
|
with Stylesw; use Stylesw;
|
|
|
with System.OS_Lib; use System.OS_Lib;
|
with System.OS_Lib; use System.OS_Lib;
|
|
|
with System.WCh_Con; use System.WCh_Con;
|
with System.WCh_Con; use System.WCh_Con;
|
|
|
package body Switch.C is
|
package body Switch.C is
|
|
|
RTS_Specified : String_Access := null;
|
RTS_Specified : String_Access := null;
|
-- Used to detect multiple use of --RTS= flag
|
-- Used to detect multiple use of --RTS= flag
|
|
|
-----------------------------
|
-----------------------------
|
-- Scan_Front_End_Switches --
|
-- Scan_Front_End_Switches --
|
-----------------------------
|
-----------------------------
|
|
|
procedure Scan_Front_End_Switches (Switch_Chars : String) is
|
procedure Scan_Front_End_Switches (Switch_Chars : String) is
|
First_Switch : Boolean := True;
|
First_Switch : Boolean := True;
|
-- False for all but first switch
|
-- False for all but first switch
|
|
|
Max : constant Natural := Switch_Chars'Last;
|
Max : constant Natural := Switch_Chars'Last;
|
Ptr : Natural;
|
Ptr : Natural;
|
C : Character := ' ';
|
C : Character := ' ';
|
Dot : Boolean;
|
Dot : Boolean;
|
|
|
Store_Switch : Boolean;
|
Store_Switch : Boolean;
|
-- For -gnatxx switches, the normal processing, signalled by this flag
|
-- For -gnatxx switches, the normal processing, signalled by this flag
|
-- being set to True, is to store the switch on exit from the case
|
-- being set to True, is to store the switch on exit from the case
|
-- statement, the switch stored is -gnat followed by the characters
|
-- statement, the switch stored is -gnat followed by the characters
|
-- from First_Char to Ptr-1. For cases like -gnaty, where the switch
|
-- from First_Char to Ptr-1. For cases like -gnaty, where the switch
|
-- is stored in separate pieces, this flag is set to False, and the
|
-- is stored in separate pieces, this flag is set to False, and the
|
-- appropriate calls to Store_Compilation_Switch are made from within
|
-- appropriate calls to Store_Compilation_Switch are made from within
|
-- the case branch.
|
-- the case branch.
|
|
|
First_Char : Positive;
|
First_Char : Positive;
|
-- Marks start of switch to be stored
|
-- Marks start of switch to be stored
|
|
|
begin
|
begin
|
Ptr := Switch_Chars'First;
|
Ptr := Switch_Chars'First;
|
|
|
-- Skip past the initial character (must be the switch character)
|
-- Skip past the initial character (must be the switch character)
|
|
|
if Ptr = Max then
|
if Ptr = Max then
|
Bad_Switch (C);
|
Bad_Switch (C);
|
else
|
else
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
end if;
|
end if;
|
|
|
-- Handle switches that do not start with -gnat
|
-- Handle switches that do not start with -gnat
|
|
|
if Ptr + 3 > Max
|
if Ptr + 3 > Max
|
or else Switch_Chars (Ptr .. Ptr + 3) /= "gnat"
|
or else Switch_Chars (Ptr .. Ptr + 3) /= "gnat"
|
then
|
then
|
-- There are two front-end switches that do not start with -gnat:
|
-- There are two front-end switches that do not start with -gnat:
|
-- -I, --RTS
|
-- -I, --RTS
|
|
|
if Switch_Chars (Ptr) = 'I' then
|
if Switch_Chars (Ptr) = 'I' then
|
|
|
-- Set flag Search_Directory_Present if switch is "-I" only:
|
-- Set flag Search_Directory_Present if switch is "-I" only:
|
-- the directory will be the next argument.
|
-- the directory will be the next argument.
|
|
|
if Ptr = Max then
|
if Ptr = Max then
|
Search_Directory_Present := True;
|
Search_Directory_Present := True;
|
return;
|
return;
|
end if;
|
end if;
|
|
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
|
|
-- Find out whether this is a -I- or regular -Ixxx switch
|
-- Find out whether this is a -I- or regular -Ixxx switch
|
|
|
-- Note: -I switches are not recorded in the ALI file, since the
|
-- Note: -I switches are not recorded in the ALI file, since the
|
-- meaning of the program depends on the source files compiled,
|
-- meaning of the program depends on the source files compiled,
|
-- not where they came from.
|
-- not where they came from.
|
|
|
if Ptr = Max and then Switch_Chars (Ptr) = '-' then
|
if Ptr = Max and then Switch_Chars (Ptr) = '-' then
|
Look_In_Primary_Dir := False;
|
Look_In_Primary_Dir := False;
|
else
|
else
|
Add_Src_Search_Dir (Switch_Chars (Ptr .. Max));
|
Add_Src_Search_Dir (Switch_Chars (Ptr .. Max));
|
end if;
|
end if;
|
|
|
-- Processing of the --RTS switch. --RTS may have been modified by
|
-- Processing of the --RTS switch. --RTS may have been modified by
|
-- gcc into -fRTS (for GCC targets).
|
-- gcc into -fRTS (for GCC targets).
|
|
|
elsif Ptr + 3 <= Max
|
elsif Ptr + 3 <= Max
|
and then (Switch_Chars (Ptr .. Ptr + 3) = "fRTS"
|
and then (Switch_Chars (Ptr .. Ptr + 3) = "fRTS"
|
or else
|
or else
|
Switch_Chars (Ptr .. Ptr + 3) = "-RTS")
|
Switch_Chars (Ptr .. Ptr + 3) = "-RTS")
|
then
|
then
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
|
|
if Ptr + 4 > Max
|
if Ptr + 4 > Max
|
or else Switch_Chars (Ptr + 3) /= '='
|
or else Switch_Chars (Ptr + 3) /= '='
|
then
|
then
|
Osint.Fail ("missing path for --RTS");
|
Osint.Fail ("missing path for --RTS");
|
else
|
else
|
-- Check that this is the first time --RTS is specified or if
|
-- Check that this is the first time --RTS is specified or if
|
-- it is not the first time, the same path has been specified.
|
-- it is not the first time, the same path has been specified.
|
|
|
if RTS_Specified = null then
|
if RTS_Specified = null then
|
RTS_Specified := new String'(Switch_Chars (Ptr + 4 .. Max));
|
RTS_Specified := new String'(Switch_Chars (Ptr + 4 .. Max));
|
|
|
elsif
|
elsif
|
RTS_Specified.all /= Switch_Chars (Ptr + 4 .. Max)
|
RTS_Specified.all /= Switch_Chars (Ptr + 4 .. Max)
|
then
|
then
|
Osint.Fail ("--RTS cannot be specified multiple times");
|
Osint.Fail ("--RTS cannot be specified multiple times");
|
end if;
|
end if;
|
|
|
-- Valid --RTS switch
|
-- Valid --RTS switch
|
|
|
Opt.No_Stdinc := True;
|
Opt.No_Stdinc := True;
|
Opt.RTS_Switch := True;
|
Opt.RTS_Switch := True;
|
|
|
RTS_Src_Path_Name :=
|
RTS_Src_Path_Name :=
|
Get_RTS_Search_Dir
|
Get_RTS_Search_Dir
|
(Switch_Chars (Ptr + 4 .. Max), Include);
|
(Switch_Chars (Ptr + 4 .. Max), Include);
|
|
|
RTS_Lib_Path_Name :=
|
RTS_Lib_Path_Name :=
|
Get_RTS_Search_Dir
|
Get_RTS_Search_Dir
|
(Switch_Chars (Ptr + 4 .. Max), Objects);
|
(Switch_Chars (Ptr + 4 .. Max), Objects);
|
|
|
if RTS_Src_Path_Name /= null
|
if RTS_Src_Path_Name /= null
|
and then RTS_Lib_Path_Name /= null
|
and then RTS_Lib_Path_Name /= null
|
then
|
then
|
-- Store the -fRTS switch (Note: Store_Compilation_Switch
|
-- Store the -fRTS switch (Note: Store_Compilation_Switch
|
-- changes -fRTS back into --RTS for the actual output).
|
-- changes -fRTS back into --RTS for the actual output).
|
|
|
Store_Compilation_Switch (Switch_Chars);
|
Store_Compilation_Switch (Switch_Chars);
|
|
|
elsif RTS_Src_Path_Name = null
|
elsif RTS_Src_Path_Name = null
|
and then RTS_Lib_Path_Name = null
|
and then RTS_Lib_Path_Name = null
|
then
|
then
|
Osint.Fail ("RTS path not valid: missing " &
|
Osint.Fail ("RTS path not valid: missing " &
|
"adainclude and adalib directories");
|
"adainclude and adalib directories");
|
|
|
elsif RTS_Src_Path_Name = null then
|
elsif RTS_Src_Path_Name = null then
|
Osint.Fail ("RTS path not valid: missing " &
|
Osint.Fail ("RTS path not valid: missing " &
|
"adainclude directory");
|
"adainclude directory");
|
|
|
elsif RTS_Lib_Path_Name = null then
|
elsif RTS_Lib_Path_Name = null then
|
Osint.Fail ("RTS path not valid: missing " &
|
Osint.Fail ("RTS path not valid: missing " &
|
"adalib directory");
|
"adalib directory");
|
end if;
|
end if;
|
end if;
|
end if;
|
|
|
-- There are no other switches not starting with -gnat
|
-- There are no other switches not starting with -gnat
|
|
|
else
|
else
|
Bad_Switch (Switch_Chars);
|
Bad_Switch (Switch_Chars);
|
end if;
|
end if;
|
|
|
-- Case of switch starting with -gnat
|
-- Case of switch starting with -gnat
|
|
|
else
|
else
|
Ptr := Ptr + 4;
|
Ptr := Ptr + 4;
|
|
|
-- Loop to scan through switches given in switch string
|
-- Loop to scan through switches given in switch string
|
|
|
while Ptr <= Max loop
|
while Ptr <= Max loop
|
First_Char := Ptr;
|
First_Char := Ptr;
|
Store_Switch := True;
|
Store_Switch := True;
|
|
|
C := Switch_Chars (Ptr);
|
C := Switch_Chars (Ptr);
|
|
|
case C is
|
case C is
|
|
|
when 'a' =>
|
when 'a' =>
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
Assertions_Enabled := True;
|
Assertions_Enabled := True;
|
Debug_Pragmas_Enabled := True;
|
Debug_Pragmas_Enabled := True;
|
|
|
-- Processing for A switch
|
-- Processing for A switch
|
|
|
when 'A' =>
|
when 'A' =>
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
Config_File := False;
|
Config_File := False;
|
|
|
-- Processing for b switch
|
-- Processing for b switch
|
|
|
when 'b' =>
|
when 'b' =>
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
Brief_Output := True;
|
Brief_Output := True;
|
|
|
-- Processing for B switch
|
-- Processing for B switch
|
|
|
when 'B' =>
|
when 'B' =>
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
Assume_No_Invalid_Values := True;
|
Assume_No_Invalid_Values := True;
|
|
|
-- Processing for c switch
|
-- Processing for c switch
|
|
|
when 'c' =>
|
when 'c' =>
|
if not First_Switch then
|
if not First_Switch then
|
Osint.Fail
|
Osint.Fail
|
("-gnatc must be first if combined with other switches");
|
("-gnatc must be first if combined with other switches");
|
end if;
|
end if;
|
|
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
Operating_Mode := Check_Semantics;
|
Operating_Mode := Check_Semantics;
|
|
|
-- Processing for C switch
|
-- Processing for C switch
|
|
|
when 'C' =>
|
when 'C' =>
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
CodePeer_Mode := True;
|
CodePeer_Mode := True;
|
|
|
-- Processing for d switch
|
-- Processing for d switch
|
|
|
when 'd' =>
|
when 'd' =>
|
Store_Switch := False;
|
Store_Switch := False;
|
Dot := False;
|
Dot := False;
|
|
|
-- Note: for the debug switch, the remaining characters in this
|
-- Note: for the debug switch, the remaining characters in this
|
-- switch field must all be debug flags, since all valid switch
|
-- switch field must all be debug flags, since all valid switch
|
-- characters are also valid debug characters.
|
-- characters are also valid debug characters.
|
|
|
-- Loop to scan out debug flags
|
-- Loop to scan out debug flags
|
|
|
while Ptr < Max loop
|
while Ptr < Max loop
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
C := Switch_Chars (Ptr);
|
C := Switch_Chars (Ptr);
|
exit when C = ASCII.NUL or else C = '/' or else C = '-';
|
exit when C = ASCII.NUL or else C = '/' or else C = '-';
|
|
|
if C in '1' .. '9' or else
|
if C in '1' .. '9' or else
|
C in 'a' .. 'z' or else
|
C in 'a' .. 'z' or else
|
C in 'A' .. 'Z'
|
C in 'A' .. 'Z'
|
then
|
then
|
if Dot then
|
if Dot then
|
Set_Dotted_Debug_Flag (C);
|
Set_Dotted_Debug_Flag (C);
|
Store_Compilation_Switch ("-gnatd." & C);
|
Store_Compilation_Switch ("-gnatd." & C);
|
else
|
else
|
Set_Debug_Flag (C);
|
Set_Debug_Flag (C);
|
Store_Compilation_Switch ("-gnatd" & C);
|
Store_Compilation_Switch ("-gnatd" & C);
|
end if;
|
end if;
|
|
|
elsif C = '.' then
|
elsif C = '.' then
|
Dot := True;
|
Dot := True;
|
|
|
elsif Dot then
|
elsif Dot then
|
Bad_Switch ("-gnatd." & Switch_Chars (Ptr .. Max));
|
Bad_Switch ("-gnatd." & Switch_Chars (Ptr .. Max));
|
else
|
else
|
Bad_Switch ("-gnatd" & Switch_Chars (Ptr .. Max));
|
Bad_Switch ("-gnatd" & Switch_Chars (Ptr .. Max));
|
end if;
|
end if;
|
end loop;
|
end loop;
|
|
|
return;
|
return;
|
|
|
-- Processing for D switch
|
-- Processing for D switch
|
|
|
when 'D' =>
|
when 'D' =>
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
|
|
-- Scan optional integer line limit value
|
-- Scan optional integer line limit value
|
|
|
if Nat_Present (Switch_Chars, Max, Ptr) then
|
if Nat_Present (Switch_Chars, Max, Ptr) then
|
Scan_Nat (Switch_Chars, Max, Ptr, Sprint_Line_Limit, 'D');
|
Scan_Nat (Switch_Chars, Max, Ptr, Sprint_Line_Limit, 'D');
|
Sprint_Line_Limit := Nat'Max (Sprint_Line_Limit, 40);
|
Sprint_Line_Limit := Nat'Max (Sprint_Line_Limit, 40);
|
end if;
|
end if;
|
|
|
-- Note: -gnatD also sets -gnatx (to turn off cross-reference
|
-- Note: -gnatD also sets -gnatx (to turn off cross-reference
|
-- generation in the ali file) since otherwise this generation
|
-- generation in the ali file) since otherwise this generation
|
-- gets confused by the "wrong" Sloc values put in the tree.
|
-- gets confused by the "wrong" Sloc values put in the tree.
|
|
|
Debug_Generated_Code := True;
|
Debug_Generated_Code := True;
|
Xref_Active := False;
|
Xref_Active := False;
|
Set_Debug_Flag ('g');
|
Set_Debug_Flag ('g');
|
|
|
-- -gnate? (extended switches)
|
-- -gnate? (extended switches)
|
|
|
when 'e' =>
|
when 'e' =>
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
|
|
-- The -gnate? switches are all double character switches
|
-- The -gnate? switches are all double character switches
|
-- so we must always have a character after the e.
|
-- so we must always have a character after the e.
|
|
|
if Ptr > Max then
|
if Ptr > Max then
|
Bad_Switch ("-gnate");
|
Bad_Switch ("-gnate");
|
end if;
|
end if;
|
|
|
case Switch_Chars (Ptr) is
|
case Switch_Chars (Ptr) is
|
|
|
-- -gnatea (initial delimiter of explicit switches)
|
-- -gnatea (initial delimiter of explicit switches)
|
|
|
-- All switches that come before -gnatea have been added by
|
-- All switches that come before -gnatea have been added by
|
-- the GCC driver and are not stored in the ALI file.
|
-- the GCC driver and are not stored in the ALI file.
|
-- See also -gnatez below.
|
-- See also -gnatez below.
|
|
|
when 'a' =>
|
when 'a' =>
|
Store_Switch := False;
|
Store_Switch := False;
|
Enable_Switch_Storing;
|
Enable_Switch_Storing;
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
|
|
-- -gnatec (configuration pragmas)
|
-- -gnatec (configuration pragmas)
|
|
|
when 'c' =>
|
when 'c' =>
|
Store_Switch := False;
|
Store_Switch := False;
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
|
|
-- There may be an equal sign between -gnatec and
|
-- There may be an equal sign between -gnatec and
|
-- the path name of the config file.
|
-- the path name of the config file.
|
|
|
if Ptr <= Max and then Switch_Chars (Ptr) = '=' then
|
if Ptr <= Max and then Switch_Chars (Ptr) = '=' then
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
end if;
|
end if;
|
|
|
if Ptr > Max then
|
if Ptr > Max then
|
Bad_Switch ("-gnatec");
|
Bad_Switch ("-gnatec");
|
end if;
|
end if;
|
|
|
declare
|
declare
|
Config_File_Name : constant String_Access :=
|
Config_File_Name : constant String_Access :=
|
new String'
|
new String'
|
(Switch_Chars (Ptr .. Max));
|
(Switch_Chars (Ptr .. Max));
|
|
|
begin
|
begin
|
if Config_File_Names = null then
|
if Config_File_Names = null then
|
Config_File_Names :=
|
Config_File_Names :=
|
new String_List'(1 => Config_File_Name);
|
new String_List'(1 => Config_File_Name);
|
|
|
else
|
else
|
declare
|
declare
|
New_Names : constant String_List_Access :=
|
New_Names : constant String_List_Access :=
|
new String_List
|
new String_List
|
(1 ..
|
(1 ..
|
Config_File_Names'Length + 1);
|
Config_File_Names'Length + 1);
|
|
|
begin
|
begin
|
for Index in Config_File_Names'Range loop
|
for Index in Config_File_Names'Range loop
|
New_Names (Index) :=
|
New_Names (Index) :=
|
Config_File_Names (Index);
|
Config_File_Names (Index);
|
Config_File_Names (Index) := null;
|
Config_File_Names (Index) := null;
|
end loop;
|
end loop;
|
|
|
New_Names (New_Names'Last) := Config_File_Name;
|
New_Names (New_Names'Last) := Config_File_Name;
|
Free (Config_File_Names);
|
Free (Config_File_Names);
|
Config_File_Names := New_Names;
|
Config_File_Names := New_Names;
|
end;
|
end;
|
end if;
|
end if;
|
end;
|
end;
|
|
|
return;
|
return;
|
|
|
-- -gnateC switch (CodePeer SCIL generation)
|
-- -gnateC switch (CodePeer SCIL generation)
|
|
|
-- Not enabled for now, keep it for later???
|
-- Not enabled for now, keep it for later???
|
-- use -gnatd.I only for now
|
-- use -gnatd.I only for now
|
|
|
-- when 'C' =>
|
-- when 'C' =>
|
-- Ptr := Ptr + 1;
|
-- Ptr := Ptr + 1;
|
-- Generate_SCIL := True;
|
-- Generate_SCIL := True;
|
|
|
-- -gnateD switch (preprocessing symbol definition)
|
-- -gnateD switch (preprocessing symbol definition)
|
|
|
when 'D' =>
|
when 'D' =>
|
Store_Switch := False;
|
Store_Switch := False;
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
|
|
if Ptr > Max then
|
if Ptr > Max then
|
Bad_Switch ("-gnateD");
|
Bad_Switch ("-gnateD");
|
end if;
|
end if;
|
|
|
Add_Symbol_Definition (Switch_Chars (Ptr .. Max));
|
Add_Symbol_Definition (Switch_Chars (Ptr .. Max));
|
|
|
-- Store the switch
|
-- Store the switch
|
|
|
Store_Compilation_Switch
|
Store_Compilation_Switch
|
("-gnateD" & Switch_Chars (Ptr .. Max));
|
("-gnateD" & Switch_Chars (Ptr .. Max));
|
Ptr := Max + 1;
|
Ptr := Max + 1;
|
|
|
-- -gnatef (full source path for brief error messages)
|
-- -gnatef (full source path for brief error messages)
|
|
|
when 'f' =>
|
when 'f' =>
|
Store_Switch := False;
|
Store_Switch := False;
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
Full_Path_Name_For_Brief_Errors := True;
|
Full_Path_Name_For_Brief_Errors := True;
|
|
|
-- -gnateG (save preprocessor output)
|
-- -gnateG (save preprocessor output)
|
|
|
when 'G' =>
|
when 'G' =>
|
Generate_Processed_File := True;
|
Generate_Processed_File := True;
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
|
|
-- -gnateI (index of unit in multi-unit source)
|
-- -gnateI (index of unit in multi-unit source)
|
|
|
when 'I' =>
|
when 'I' =>
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
Scan_Pos (Switch_Chars, Max, Ptr, Multiple_Unit_Index, C);
|
Scan_Pos (Switch_Chars, Max, Ptr, Multiple_Unit_Index, C);
|
|
|
-- -gnatem (mapping file)
|
-- -gnatem (mapping file)
|
|
|
when 'm' =>
|
when 'm' =>
|
Store_Switch := False;
|
Store_Switch := False;
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
|
|
-- There may be an equal sign between -gnatem and
|
-- There may be an equal sign between -gnatem and
|
-- the path name of the mapping file.
|
-- the path name of the mapping file.
|
|
|
if Ptr <= Max and then Switch_Chars (Ptr) = '=' then
|
if Ptr <= Max and then Switch_Chars (Ptr) = '=' then
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
end if;
|
end if;
|
|
|
if Ptr > Max then
|
if Ptr > Max then
|
Bad_Switch ("-gnatem");
|
Bad_Switch ("-gnatem");
|
end if;
|
end if;
|
|
|
Mapping_File_Name :=
|
Mapping_File_Name :=
|
new String'(Switch_Chars (Ptr .. Max));
|
new String'(Switch_Chars (Ptr .. Max));
|
return;
|
return;
|
|
|
-- -gnatep (preprocessing data file)
|
-- -gnatep (preprocessing data file)
|
|
|
when 'p' =>
|
when 'p' =>
|
Store_Switch := False;
|
Store_Switch := False;
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
|
|
-- There may be an equal sign between -gnatep and
|
-- There may be an equal sign between -gnatep and
|
-- the path name of the mapping file.
|
-- the path name of the mapping file.
|
|
|
if Ptr <= Max and then Switch_Chars (Ptr) = '=' then
|
if Ptr <= Max and then Switch_Chars (Ptr) = '=' then
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
end if;
|
end if;
|
|
|
if Ptr > Max then
|
if Ptr > Max then
|
Bad_Switch ("-gnatep");
|
Bad_Switch ("-gnatep");
|
end if;
|
end if;
|
|
|
Preprocessing_Data_File :=
|
Preprocessing_Data_File :=
|
new String'(Switch_Chars (Ptr .. Max));
|
new String'(Switch_Chars (Ptr .. Max));
|
|
|
-- Store the switch, normalizing to -gnatep=
|
-- Store the switch, normalizing to -gnatep=
|
|
|
Store_Compilation_Switch
|
Store_Compilation_Switch
|
("-gnatep=" & Preprocessing_Data_File.all);
|
("-gnatep=" & Preprocessing_Data_File.all);
|
|
|
Ptr := Max + 1;
|
Ptr := Max + 1;
|
|
|
-- -gnatez (final delimiter of explicit switches)
|
-- -gnatez (final delimiter of explicit switches)
|
|
|
-- All switches that come after -gnatez have been added by
|
-- All switches that come after -gnatez have been added by
|
-- the GCC driver and are not stored in the ALI file. See
|
-- the GCC driver and are not stored in the ALI file. See
|
-- also -gnatea above.
|
-- also -gnatea above.
|
|
|
when 'z' =>
|
when 'z' =>
|
Store_Switch := False;
|
Store_Switch := False;
|
Disable_Switch_Storing;
|
Disable_Switch_Storing;
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
|
|
-- -gnateS (generate SCO information)
|
-- -gnateS (generate SCO information)
|
|
|
-- Include Source Coverage Obligation information in ALI
|
-- Include Source Coverage Obligation information in ALI
|
-- files for the benefit of source coverage analysis tools
|
-- files for the benefit of source coverage analysis tools
|
-- (xcov).
|
-- (xcov).
|
|
|
when 'S' =>
|
when 'S' =>
|
Generate_SCO := True;
|
Generate_SCO := True;
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
|
|
-- All other -gnate? switches are unassigned
|
-- All other -gnate? switches are unassigned
|
|
|
when others =>
|
when others =>
|
Bad_Switch ("-gnate" & Switch_Chars (Ptr .. Max));
|
Bad_Switch ("-gnate" & Switch_Chars (Ptr .. Max));
|
end case;
|
end case;
|
|
|
-- -gnatE (dynamic elaboration checks)
|
-- -gnatE (dynamic elaboration checks)
|
|
|
when 'E' =>
|
when 'E' =>
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
Dynamic_Elaboration_Checks := True;
|
Dynamic_Elaboration_Checks := True;
|
|
|
-- -gnatf (full error messages)
|
-- -gnatf (full error messages)
|
|
|
when 'f' =>
|
when 'f' =>
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
All_Errors_Mode := True;
|
All_Errors_Mode := True;
|
|
|
-- Processing for F switch
|
-- Processing for F switch
|
|
|
when 'F' =>
|
when 'F' =>
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
External_Name_Exp_Casing := Uppercase;
|
External_Name_Exp_Casing := Uppercase;
|
External_Name_Imp_Casing := Uppercase;
|
External_Name_Imp_Casing := Uppercase;
|
|
|
-- Processing for g switch
|
-- Processing for g switch
|
|
|
when 'g' =>
|
when 'g' =>
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
GNAT_Mode := True;
|
GNAT_Mode := True;
|
Identifier_Character_Set := 'n';
|
Identifier_Character_Set := 'n';
|
System_Extend_Unit := Empty;
|
System_Extend_Unit := Empty;
|
Warning_Mode := Treat_As_Error;
|
Warning_Mode := Treat_As_Error;
|
|
|
-- Set Ada 2005 mode explicitly. We don't want to rely on the
|
-- Set Ada 2005 mode explicitly. We don't want to rely on the
|
-- implicit setting here, since for example, we want
|
-- implicit setting here, since for example, we want
|
-- Preelaborate_05 treated as Preelaborate
|
-- Preelaborate_05 treated as Preelaborate
|
|
|
Ada_Version := Ada_05;
|
Ada_Version := Ada_05;
|
Ada_Version_Explicit := Ada_Version;
|
Ada_Version_Explicit := Ada_Version;
|
|
|
-- Set default warnings and style checks for -gnatg
|
-- Set default warnings and style checks for -gnatg
|
|
|
Set_GNAT_Mode_Warnings;
|
Set_GNAT_Mode_Warnings;
|
Set_GNAT_Style_Check_Options;
|
Set_GNAT_Style_Check_Options;
|
|
|
-- Processing for G switch
|
-- Processing for G switch
|
|
|
when 'G' =>
|
when 'G' =>
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
Print_Generated_Code := True;
|
Print_Generated_Code := True;
|
|
|
-- Scan optional integer line limit value
|
-- Scan optional integer line limit value
|
|
|
if Nat_Present (Switch_Chars, Max, Ptr) then
|
if Nat_Present (Switch_Chars, Max, Ptr) then
|
Scan_Nat (Switch_Chars, Max, Ptr, Sprint_Line_Limit, 'G');
|
Scan_Nat (Switch_Chars, Max, Ptr, Sprint_Line_Limit, 'G');
|
Sprint_Line_Limit := Nat'Max (Sprint_Line_Limit, 40);
|
Sprint_Line_Limit := Nat'Max (Sprint_Line_Limit, 40);
|
end if;
|
end if;
|
|
|
-- Processing for h switch
|
-- Processing for h switch
|
|
|
when 'h' =>
|
when 'h' =>
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
Usage_Requested := True;
|
Usage_Requested := True;
|
|
|
-- Processing for H switch
|
-- Processing for H switch
|
|
|
when 'H' =>
|
when 'H' =>
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
HLO_Active := True;
|
HLO_Active := True;
|
|
|
-- Processing for i switch
|
-- Processing for i switch
|
|
|
when 'i' =>
|
when 'i' =>
|
if Ptr = Max then
|
if Ptr = Max then
|
Bad_Switch ("-gnati");
|
Bad_Switch ("-gnati");
|
end if;
|
end if;
|
|
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
C := Switch_Chars (Ptr);
|
C := Switch_Chars (Ptr);
|
|
|
if C in '1' .. '5'
|
if C in '1' .. '5'
|
or else C = '8'
|
or else C = '8'
|
or else C = '9'
|
or else C = '9'
|
or else C = 'p'
|
or else C = 'p'
|
or else C = 'f'
|
or else C = 'f'
|
or else C = 'n'
|
or else C = 'n'
|
or else C = 'w'
|
or else C = 'w'
|
then
|
then
|
Identifier_Character_Set := C;
|
Identifier_Character_Set := C;
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
|
|
else
|
else
|
Bad_Switch ("-gnati" & Switch_Chars (Ptr .. Max));
|
Bad_Switch ("-gnati" & Switch_Chars (Ptr .. Max));
|
end if;
|
end if;
|
|
|
-- Processing for I switch
|
-- Processing for I switch
|
|
|
when 'I' =>
|
when 'I' =>
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
Ignore_Rep_Clauses := True;
|
Ignore_Rep_Clauses := True;
|
|
|
-- Processing for j switch
|
-- Processing for j switch
|
|
|
when 'j' =>
|
when 'j' =>
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
Scan_Nat (Switch_Chars, Max, Ptr, Error_Msg_Line_Length, C);
|
Scan_Nat (Switch_Chars, Max, Ptr, Error_Msg_Line_Length, C);
|
|
|
-- Processing for k switch
|
-- Processing for k switch
|
|
|
when 'k' =>
|
when 'k' =>
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
Scan_Pos
|
Scan_Pos
|
(Switch_Chars, Max, Ptr, Maximum_File_Name_Length, C);
|
(Switch_Chars, Max, Ptr, Maximum_File_Name_Length, C);
|
|
|
-- Processing for l switch
|
-- Processing for l switch
|
|
|
when 'l' =>
|
when 'l' =>
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
Full_List := True;
|
Full_List := True;
|
|
|
-- There may be an equal sign between -gnatl and a file name
|
-- There may be an equal sign between -gnatl and a file name
|
|
|
if Ptr <= Max and then Switch_Chars (Ptr) = '=' then
|
if Ptr <= Max and then Switch_Chars (Ptr) = '=' then
|
if Ptr = Max then
|
if Ptr = Max then
|
Osint.Fail ("file name for -gnatl= is null");
|
Osint.Fail ("file name for -gnatl= is null");
|
else
|
else
|
Opt.Full_List_File_Name :=
|
Opt.Full_List_File_Name :=
|
new String'(Switch_Chars (Ptr + 1 .. Max));
|
new String'(Switch_Chars (Ptr + 1 .. Max));
|
Ptr := Max + 1;
|
Ptr := Max + 1;
|
end if;
|
end if;
|
end if;
|
end if;
|
|
|
-- Processing for L switch
|
-- Processing for L switch
|
|
|
when 'L' =>
|
when 'L' =>
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
Dump_Source_Text := True;
|
Dump_Source_Text := True;
|
|
|
-- Processing for m switch
|
-- Processing for m switch
|
|
|
when 'm' =>
|
when 'm' =>
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
Scan_Nat (Switch_Chars, Max, Ptr, Maximum_Messages, C);
|
Scan_Nat (Switch_Chars, Max, Ptr, Maximum_Messages, C);
|
|
|
-- Processing for n switch
|
-- Processing for n switch
|
|
|
when 'n' =>
|
when 'n' =>
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
Inline_Active := True;
|
Inline_Active := True;
|
|
|
-- Processing for N switch
|
-- Processing for N switch
|
|
|
when 'N' =>
|
when 'N' =>
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
Inline_Active := True;
|
Inline_Active := True;
|
Front_End_Inlining := True;
|
Front_End_Inlining := True;
|
|
|
-- Processing for o switch
|
-- Processing for o switch
|
|
|
when 'o' =>
|
when 'o' =>
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
Suppress_Options (Overflow_Check) := False;
|
Suppress_Options (Overflow_Check) := False;
|
Opt.Enable_Overflow_Checks := True;
|
Opt.Enable_Overflow_Checks := True;
|
|
|
-- Processing for O switch
|
-- Processing for O switch
|
|
|
when 'O' =>
|
when 'O' =>
|
Store_Switch := False;
|
Store_Switch := False;
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
Output_File_Name_Present := True;
|
Output_File_Name_Present := True;
|
|
|
-- Processing for p switch
|
-- Processing for p switch
|
|
|
when 'p' =>
|
when 'p' =>
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
|
|
-- Set all specific options as well as All_Checks in the
|
-- Set all specific options as well as All_Checks in the
|
-- Suppress_Options array, excluding Elaboration_Check, since
|
-- Suppress_Options array, excluding Elaboration_Check, since
|
-- this is treated specially because we do not want -gnatp to
|
-- this is treated specially because we do not want -gnatp to
|
-- disable static elaboration processing.
|
-- disable static elaboration processing.
|
|
|
for J in Suppress_Options'Range loop
|
for J in Suppress_Options'Range loop
|
if J /= Elaboration_Check then
|
if J /= Elaboration_Check then
|
Suppress_Options (J) := True;
|
Suppress_Options (J) := True;
|
end if;
|
end if;
|
end loop;
|
end loop;
|
|
|
Validity_Checks_On := False;
|
Validity_Checks_On := False;
|
Opt.Suppress_Checks := True;
|
Opt.Suppress_Checks := True;
|
Opt.Enable_Overflow_Checks := False;
|
Opt.Enable_Overflow_Checks := False;
|
|
|
-- Processing for P switch
|
-- Processing for P switch
|
|
|
when 'P' =>
|
when 'P' =>
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
Polling_Required := True;
|
Polling_Required := True;
|
|
|
-- Processing for q switch
|
-- Processing for q switch
|
|
|
when 'q' =>
|
when 'q' =>
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
Try_Semantics := True;
|
Try_Semantics := True;
|
|
|
-- Processing for Q switch
|
-- Processing for Q switch
|
|
|
when 'Q' =>
|
when 'Q' =>
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
Force_ALI_Tree_File := True;
|
Force_ALI_Tree_File := True;
|
Try_Semantics := True;
|
Try_Semantics := True;
|
|
|
-- Processing for r switch
|
-- Processing for r switch
|
|
|
when 'r' =>
|
when 'r' =>
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
Treat_Restrictions_As_Warnings := True;
|
Treat_Restrictions_As_Warnings := True;
|
|
|
-- Processing for R switch
|
-- Processing for R switch
|
|
|
when 'R' =>
|
when 'R' =>
|
Back_Annotate_Rep_Info := True;
|
Back_Annotate_Rep_Info := True;
|
List_Representation_Info := 1;
|
List_Representation_Info := 1;
|
|
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
while Ptr <= Max loop
|
while Ptr <= Max loop
|
C := Switch_Chars (Ptr);
|
C := Switch_Chars (Ptr);
|
|
|
if C in '1' .. '3' then
|
if C in '1' .. '3' then
|
List_Representation_Info :=
|
List_Representation_Info :=
|
Character'Pos (C) - Character'Pos ('0');
|
Character'Pos (C) - Character'Pos ('0');
|
|
|
elsif Switch_Chars (Ptr) = 's' then
|
elsif Switch_Chars (Ptr) = 's' then
|
List_Representation_Info_To_File := True;
|
List_Representation_Info_To_File := True;
|
|
|
elsif Switch_Chars (Ptr) = 'm' then
|
elsif Switch_Chars (Ptr) = 'm' then
|
List_Representation_Info_Mechanisms := True;
|
List_Representation_Info_Mechanisms := True;
|
|
|
else
|
else
|
Bad_Switch ("-gnatR" & Switch_Chars (Ptr .. Max));
|
Bad_Switch ("-gnatR" & Switch_Chars (Ptr .. Max));
|
end if;
|
end if;
|
|
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
end loop;
|
end loop;
|
|
|
-- Processing for s switch
|
-- Processing for s switch
|
|
|
when 's' =>
|
when 's' =>
|
if not First_Switch then
|
if not First_Switch then
|
Osint.Fail
|
Osint.Fail
|
("-gnats must be first if combined with other switches");
|
("-gnats must be first if combined with other switches");
|
end if;
|
end if;
|
|
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
Operating_Mode := Check_Syntax;
|
Operating_Mode := Check_Syntax;
|
|
|
-- Processing for S switch
|
-- Processing for S switch
|
|
|
when 'S' =>
|
when 'S' =>
|
Print_Standard := True;
|
Print_Standard := True;
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
|
|
-- Processing for t switch
|
-- Processing for t switch
|
|
|
when 't' =>
|
when 't' =>
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
Tree_Output := True;
|
Tree_Output := True;
|
Back_Annotate_Rep_Info := True;
|
Back_Annotate_Rep_Info := True;
|
|
|
-- Processing for T switch
|
-- Processing for T switch
|
|
|
when 'T' =>
|
when 'T' =>
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
Scan_Pos (Switch_Chars, Max, Ptr, Table_Factor, C);
|
Scan_Pos (Switch_Chars, Max, Ptr, Table_Factor, C);
|
|
|
-- Processing for u switch
|
-- Processing for u switch
|
|
|
when 'u' =>
|
when 'u' =>
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
List_Units := True;
|
List_Units := True;
|
|
|
-- Processing for U switch
|
-- Processing for U switch
|
|
|
when 'U' =>
|
when 'U' =>
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
Unique_Error_Tag := True;
|
Unique_Error_Tag := True;
|
|
|
-- Processing for v switch
|
-- Processing for v switch
|
|
|
when 'v' =>
|
when 'v' =>
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
Verbose_Mode := True;
|
Verbose_Mode := True;
|
|
|
-- Processing for V switch
|
-- Processing for V switch
|
|
|
when 'V' =>
|
when 'V' =>
|
Store_Switch := False;
|
Store_Switch := False;
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
|
|
if Ptr > Max then
|
if Ptr > Max then
|
Bad_Switch ("-gnatV");
|
Bad_Switch ("-gnatV");
|
|
|
else
|
else
|
declare
|
declare
|
OK : Boolean;
|
OK : Boolean;
|
|
|
begin
|
begin
|
Set_Validity_Check_Options
|
Set_Validity_Check_Options
|
(Switch_Chars (Ptr .. Max), OK, Ptr);
|
(Switch_Chars (Ptr .. Max), OK, Ptr);
|
|
|
if not OK then
|
if not OK then
|
Bad_Switch ("-gnatV" & Switch_Chars (Ptr .. Max));
|
Bad_Switch ("-gnatV" & Switch_Chars (Ptr .. Max));
|
end if;
|
end if;
|
|
|
for Index in First_Char + 1 .. Max loop
|
for Index in First_Char + 1 .. Max loop
|
Store_Compilation_Switch
|
Store_Compilation_Switch
|
("-gnatV" & Switch_Chars (Index));
|
("-gnatV" & Switch_Chars (Index));
|
end loop;
|
end loop;
|
end;
|
end;
|
end if;
|
end if;
|
|
|
Ptr := Max + 1;
|
Ptr := Max + 1;
|
|
|
-- Processing for w switch
|
-- Processing for w switch
|
|
|
when 'w' =>
|
when 'w' =>
|
Store_Switch := False;
|
Store_Switch := False;
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
|
|
if Ptr > Max then
|
if Ptr > Max then
|
Bad_Switch ("-gnatw");
|
Bad_Switch ("-gnatw");
|
end if;
|
end if;
|
|
|
while Ptr <= Max loop
|
while Ptr <= Max loop
|
C := Switch_Chars (Ptr);
|
C := Switch_Chars (Ptr);
|
|
|
-- Case of dot switch
|
-- Case of dot switch
|
|
|
if C = '.' and then Ptr < Max then
|
if C = '.' and then Ptr < Max then
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
C := Switch_Chars (Ptr);
|
C := Switch_Chars (Ptr);
|
|
|
if Set_Dot_Warning_Switch (C) then
|
if Set_Dot_Warning_Switch (C) then
|
Store_Compilation_Switch ("-gnatw." & C);
|
Store_Compilation_Switch ("-gnatw." & C);
|
else
|
else
|
Bad_Switch ("-gnatw." & Switch_Chars (Ptr .. Max));
|
Bad_Switch ("-gnatw." & Switch_Chars (Ptr .. Max));
|
end if;
|
end if;
|
|
|
-- Normal case, no dot
|
-- Normal case, no dot
|
|
|
else
|
else
|
if Set_Warning_Switch (C) then
|
if Set_Warning_Switch (C) then
|
Store_Compilation_Switch ("-gnatw" & C);
|
Store_Compilation_Switch ("-gnatw" & C);
|
else
|
else
|
Bad_Switch ("-gnatw" & Switch_Chars (Ptr .. Max));
|
Bad_Switch ("-gnatw" & Switch_Chars (Ptr .. Max));
|
end if;
|
end if;
|
end if;
|
end if;
|
|
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
end loop;
|
end loop;
|
|
|
return;
|
return;
|
|
|
-- Processing for W switch
|
-- Processing for W switch
|
|
|
when 'W' =>
|
when 'W' =>
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
|
|
if Ptr > Max then
|
if Ptr > Max then
|
Bad_Switch ("-gnatW");
|
Bad_Switch ("-gnatW");
|
end if;
|
end if;
|
|
|
begin
|
begin
|
Wide_Character_Encoding_Method :=
|
Wide_Character_Encoding_Method :=
|
Get_WC_Encoding_Method (Switch_Chars (Ptr));
|
Get_WC_Encoding_Method (Switch_Chars (Ptr));
|
exception
|
exception
|
when Constraint_Error =>
|
when Constraint_Error =>
|
Bad_Switch ("-gnatW" & Switch_Chars (Ptr .. Max));
|
Bad_Switch ("-gnatW" & Switch_Chars (Ptr .. Max));
|
end;
|
end;
|
|
|
Wide_Character_Encoding_Method_Specified := True;
|
Wide_Character_Encoding_Method_Specified := True;
|
|
|
Upper_Half_Encoding :=
|
Upper_Half_Encoding :=
|
Wide_Character_Encoding_Method in
|
Wide_Character_Encoding_Method in
|
WC_Upper_Half_Encoding_Method;
|
WC_Upper_Half_Encoding_Method;
|
|
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
|
|
-- Processing for x switch
|
-- Processing for x switch
|
|
|
when 'x' =>
|
when 'x' =>
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
Xref_Active := False;
|
Xref_Active := False;
|
|
|
-- Processing for X switch
|
-- Processing for X switch
|
|
|
when 'X' =>
|
when 'X' =>
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
Extensions_Allowed := True;
|
Extensions_Allowed := True;
|
|
|
-- Processing for y switch
|
-- Processing for y switch
|
|
|
when 'y' =>
|
when 'y' =>
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
|
|
if Ptr > Max then
|
if Ptr > Max then
|
Set_Default_Style_Check_Options;
|
Set_Default_Style_Check_Options;
|
|
|
else
|
else
|
Store_Switch := False;
|
Store_Switch := False;
|
|
|
declare
|
declare
|
OK : Boolean;
|
OK : Boolean;
|
|
|
begin
|
begin
|
Set_Style_Check_Options
|
Set_Style_Check_Options
|
(Switch_Chars (Ptr .. Max), OK, Ptr);
|
(Switch_Chars (Ptr .. Max), OK, Ptr);
|
|
|
if not OK then
|
if not OK then
|
Osint.Fail
|
Osint.Fail
|
("bad -gnaty switch (" &
|
("bad -gnaty switch (" &
|
Style_Msg_Buf (1 .. Style_Msg_Len) & ')');
|
Style_Msg_Buf (1 .. Style_Msg_Len) & ')');
|
end if;
|
end if;
|
|
|
Ptr := First_Char + 1;
|
Ptr := First_Char + 1;
|
while Ptr <= Max loop
|
while Ptr <= Max loop
|
if Switch_Chars (Ptr) = 'M' then
|
if Switch_Chars (Ptr) = 'M' then
|
First_Char := Ptr;
|
First_Char := Ptr;
|
loop
|
loop
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
exit when Ptr > Max
|
exit when Ptr > Max
|
or else Switch_Chars (Ptr) not in '0' .. '9';
|
or else Switch_Chars (Ptr) not in '0' .. '9';
|
end loop;
|
end loop;
|
|
|
Store_Compilation_Switch
|
Store_Compilation_Switch
|
("-gnaty" & Switch_Chars (First_Char .. Ptr - 1));
|
("-gnaty" & Switch_Chars (First_Char .. Ptr - 1));
|
|
|
else
|
else
|
Store_Compilation_Switch
|
Store_Compilation_Switch
|
("-gnaty" & Switch_Chars (Ptr));
|
("-gnaty" & Switch_Chars (Ptr));
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
end if;
|
end if;
|
end loop;
|
end loop;
|
end;
|
end;
|
end if;
|
end if;
|
|
|
-- Processing for z switch
|
-- Processing for z switch
|
|
|
when 'z' =>
|
when 'z' =>
|
-- -gnatz must be the first and only switch in Switch_Chars,
|
-- -gnatz must be the first and only switch in Switch_Chars,
|
-- and is a two-letter switch.
|
-- and is a two-letter switch.
|
|
|
if Ptr /= Switch_Chars'First + 5
|
if Ptr /= Switch_Chars'First + 5
|
or else (Max - Ptr + 1) > 2
|
or else (Max - Ptr + 1) > 2
|
then
|
then
|
Osint.Fail
|
Osint.Fail
|
("-gnatz* may not be combined with other switches");
|
("-gnatz* may not be combined with other switches");
|
end if;
|
end if;
|
|
|
if Ptr = Max then
|
if Ptr = Max then
|
Bad_Switch ("-gnatz");
|
Bad_Switch ("-gnatz");
|
end if;
|
end if;
|
|
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
|
|
-- Only one occurrence of -gnat* is permitted
|
-- Only one occurrence of -gnat* is permitted
|
|
|
if Distribution_Stub_Mode = No_Stubs then
|
if Distribution_Stub_Mode = No_Stubs then
|
case Switch_Chars (Ptr) is
|
case Switch_Chars (Ptr) is
|
when 'r' =>
|
when 'r' =>
|
Distribution_Stub_Mode := Generate_Receiver_Stub_Body;
|
Distribution_Stub_Mode := Generate_Receiver_Stub_Body;
|
|
|
when 'c' =>
|
when 'c' =>
|
Distribution_Stub_Mode := Generate_Caller_Stub_Body;
|
Distribution_Stub_Mode := Generate_Caller_Stub_Body;
|
|
|
when others =>
|
when others =>
|
Bad_Switch ("-gnatz" & Switch_Chars (Ptr .. Max));
|
Bad_Switch ("-gnatz" & Switch_Chars (Ptr .. Max));
|
end case;
|
end case;
|
|
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
|
|
else
|
else
|
Osint.Fail ("only one -gnatz* switch allowed");
|
Osint.Fail ("only one -gnatz* switch allowed");
|
end if;
|
end if;
|
|
|
-- Processing for Z switch
|
-- Processing for Z switch
|
|
|
when 'Z' =>
|
when 'Z' =>
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
Osint.Fail
|
Osint.Fail
|
("-gnatZ is no longer supported: consider using --RTS=zcx");
|
("-gnatZ is no longer supported: consider using --RTS=zcx");
|
|
|
-- Processing for 83 switch
|
-- Processing for 83 switch
|
|
|
when '8' =>
|
when '8' =>
|
if Ptr = Max then
|
if Ptr = Max then
|
Bad_Switch ("-gnat8");
|
Bad_Switch ("-gnat8");
|
end if;
|
end if;
|
|
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
|
|
if Switch_Chars (Ptr) /= '3' then
|
if Switch_Chars (Ptr) /= '3' then
|
Bad_Switch ("-gnat8" & Switch_Chars (Ptr .. Max));
|
Bad_Switch ("-gnat8" & Switch_Chars (Ptr .. Max));
|
else
|
else
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
Ada_Version := Ada_83;
|
Ada_Version := Ada_83;
|
Ada_Version_Explicit := Ada_Version;
|
Ada_Version_Explicit := Ada_Version;
|
end if;
|
end if;
|
|
|
-- Processing for 95 switch
|
-- Processing for 95 switch
|
|
|
when '9' =>
|
when '9' =>
|
if Ptr = Max then
|
if Ptr = Max then
|
Bad_Switch ("-gnat9");
|
Bad_Switch ("-gnat9");
|
end if;
|
end if;
|
|
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
|
|
if Switch_Chars (Ptr) /= '5' then
|
if Switch_Chars (Ptr) /= '5' then
|
Bad_Switch ("-gnat9" & Switch_Chars (Ptr .. Max));
|
Bad_Switch ("-gnat9" & Switch_Chars (Ptr .. Max));
|
else
|
else
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
Ada_Version := Ada_95;
|
Ada_Version := Ada_95;
|
Ada_Version_Explicit := Ada_Version;
|
Ada_Version_Explicit := Ada_Version;
|
end if;
|
end if;
|
|
|
-- Processing for 05 switch
|
-- Processing for 05 switch
|
|
|
when '0' =>
|
when '0' =>
|
if Ptr = Max then
|
if Ptr = Max then
|
Bad_Switch ("-gnat0");
|
Bad_Switch ("-gnat0");
|
end if;
|
end if;
|
|
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
|
|
if Switch_Chars (Ptr) /= '5' then
|
if Switch_Chars (Ptr) /= '5' then
|
Bad_Switch ("-gnat0" & Switch_Chars (Ptr .. Max));
|
Bad_Switch ("-gnat0" & Switch_Chars (Ptr .. Max));
|
else
|
else
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
Ada_Version := Ada_05;
|
Ada_Version := Ada_05;
|
Ada_Version_Explicit := Ada_Version;
|
Ada_Version_Explicit := Ada_Version;
|
end if;
|
end if;
|
|
|
-- Ignore extra switch character
|
-- Ignore extra switch character
|
|
|
when '/' | '-' =>
|
when '/' | '-' =>
|
Ptr := Ptr + 1;
|
Ptr := Ptr + 1;
|
|
|
-- Anything else is an error (illegal switch character)
|
-- Anything else is an error (illegal switch character)
|
|
|
when others =>
|
when others =>
|
Bad_Switch ("-gnat" & Switch_Chars (Ptr .. Max));
|
Bad_Switch ("-gnat" & Switch_Chars (Ptr .. Max));
|
end case;
|
end case;
|
|
|
if Store_Switch then
|
if Store_Switch then
|
Store_Compilation_Switch
|
Store_Compilation_Switch
|
("-gnat" & Switch_Chars (First_Char .. Ptr - 1));
|
("-gnat" & Switch_Chars (First_Char .. Ptr - 1));
|
end if;
|
end if;
|
|
|
First_Switch := False;
|
First_Switch := False;
|
end loop;
|
end loop;
|
end if;
|
end if;
|
end Scan_Front_End_Switches;
|
end Scan_Front_End_Switches;
|
|
|
end Switch.C;
|
end Switch.C;
|
|
|