OSDN Git Service

* gcc-interface/decl.c (make_type_from_size) <INTEGER_TYPE>: Just copy
[pf3gnuchains/gcc-fork.git] / gcc / ada / switch-m.adb
index b04672b..a7a8d19 100644 (file)
@@ -6,18 +6,17 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 2001-2002 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 --
 -- terms of the  GNU General Public License as published  by the Free Soft- --
--- ware  Foundation;  either version 2,  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- --
 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
 -- 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 --
--- Public License  distributed with GNAT;  see file COPYING.  If not, write --
--- to  the Free Software Foundation,  59 Temple Place - Suite 330,  Boston, --
--- MA 02111-1307, USA.                                                      --
+-- Public License  distributed with GNAT; see file COPYING3.  If not, go to --
+-- http://www.gnu.org/licenses for a complete copy of the license.          --
 --                                                                          --
 -- GNAT was originally developed  by the GNAT team at  New York University. --
 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
 ------------------------------------------------------------------------------
 
 with Debug;    use Debug;
+with Makeutl;  use Makeutl;
 with Osint;    use Osint;
 with Opt;      use Opt;
+with Prj;      use Prj;
+with Prj.Ext;  use Prj.Ext;
 with Table;
 
 package body Switch.M is
@@ -37,7 +39,7 @@ package body Switch.M is
       Table_Low_Bound      => 1,
       Table_Initial        => 20,
       Table_Increment      => 100,
-      Table_Name           => "Switch.C.Normalized_Switches");
+      Table_Name           => "Switch.M.Normalized_Switches");
    --  This table is used to keep the normalized switches, so that they may be
    --  reused for subsequent invocations of Normalize_Compiler_Switches with
    --  similar switches.
@@ -62,7 +64,6 @@ package body Switch.M is
       Max : constant Integer := Switch_Chars'Last;
       C   : Character := ' ';
 
-      First_Char   : Integer := Ptr;
       Storing      : String := Switch_Chars;
       First_Stored : Positive := Ptr + 1;
       Last_Stored  : Positive := First_Stored;
@@ -83,12 +84,13 @@ package body Switch.M is
          if Switches = null then
             Switches := new Argument_List (1 .. Initial_Number_Of_Switches);
 
-         --  otherwise, if Switches is full, extend it
+         --  Otherwise, if Switches is full, extend it
 
          elsif Last = Switches'Last then
             declare
-               New_Switches : Argument_List_Access := new Argument_List
-                 (1 .. Switches'Length + Switches'Length);
+               New_Switches : constant Argument_List_Access :=
+                                new Argument_List
+                                      (1 .. Switches'Length + Switches'Length);
             begin
                New_Switches (1 .. Switches'Length) := Switches.all;
                Last := Switches'Length;
@@ -97,9 +99,9 @@ package body Switch.M is
          end if;
 
          --  If this is the first switch, Last designates the first component
+
          if Last = 0 then
             Last := Switches'First;
-
          else
             Last := Last + 1;
          end if;
@@ -118,9 +120,7 @@ package body Switch.M is
          --  Add a new component in the table.
 
          Switches (Last) := new String'(S);
-         Normalized_Switches.Increment_Last;
-         Normalized_Switches.Table (Normalized_Switches.Last) :=
-           Switches (Last);
+         Normalized_Switches.Append (Switches (Last));
       end Add_Switch_Component;
 
    --  Start of processing for Normalize_Compiler_Switches
@@ -143,7 +143,6 @@ package body Switch.M is
       end if;
 
       while Ptr <= Max loop
-         First_Char := Ptr;
          C := Switch_Chars (Ptr);
 
          --  Processing for a switch
@@ -151,9 +150,63 @@ package body Switch.M is
          case Switch_Starts_With_Gnat is
 
             when False =>
-               --  All switches that don't start with -gnat stay as is
 
-               Add_Switch_Component (Switch_Chars);
+               --  All switches that don't start with -gnat stay as is,
+               --  except -pg, -Wall, -k8, -w
+
+               if Switch_Chars = "-pg" or else Switch_Chars = "-p" then
+
+                  --  The gcc driver converts -pg to -p, so that is what
+                  --  is stored in the ALI file.
+
+                  Add_Switch_Component ("-p");
+
+               elsif Switch_Chars = "-Wall" then
+
+                  --  The gcc driver adds -gnatwa when -Wall is used
+
+                  Add_Switch_Component ("-gnatwa");
+                  Add_Switch_Component ("-Wall");
+
+               elsif Switch_Chars = "-k8" then
+
+                  --  The gcc driver transforms -k8 into -gnatk8
+
+                  Add_Switch_Component ("-gnatk8");
+
+               elsif Switch_Chars = "-w" then
+
+                  --  The gcc driver adds -gnatws when -w is used
+
+                  Add_Switch_Component ("-gnatws");
+                  Add_Switch_Component ("-w");
+
+               elsif Switch_Chars'Length > 6
+                 and then
+                   Switch_Chars (Switch_Chars'First .. Switch_Chars'First + 5)
+                                                             = "--RTS="
+               then
+                  Add_Switch_Component (Switch_Chars);
+
+                  --  When --RTS=mtp is used, the gcc driver adds -mrtp
+
+                  if Switch_Chars = "--RTS=mtp" then
+                     Add_Switch_Component ("-mrtp");
+                  end if;
+
+               --  Take only into account switches that are transmitted to
+               --  gnat1 by the gcc driver and stored by gnat1 in the ALI file.
+
+               else
+                  case C is
+                     when 'O' | 'W' | 'w' | 'f' | 'd' | 'g' | 'm' =>
+                        Add_Switch_Component (Switch_Chars);
+
+                     when others =>
+                        null;
+                  end case;
+               end if;
+
                return;
 
             when True =>
@@ -162,7 +215,7 @@ package body Switch.M is
 
                   --  One-letter switches
 
-                  when 'a' | 'A' | 'b' | 'c' | 'C' | 'D' | 'E' | 'f' |
+                  when 'a' | 'A' | 'b' | 'c' | 'D' | 'E' | 'f' |
                     'F' | 'g' | 'h' | 'H' | 'k' | 'l' | 'L' | 'n' | 'N' |
                     'o' | 'O' | 'p' | 'P' | 'q' | 'Q' | 'r' | 's' | 't' |
                     'u' | 'U' | 'v' | 'x' | 'X' | 'Z' =>
@@ -214,8 +267,62 @@ package body Switch.M is
                      return;
 
                   when 'e' =>
-                     --  None of the -gnate switches (-gnatec and -gnatem)
-                     --  need to be store in an ALI file.
+
+                     --  Store -gnateD, -gnatep= and -gnateG in the ALI file.
+                     --  The other -gnate switches do not need to be stored.
+
+                     Storing (First_Stored) := 'e';
+                     Ptr := Ptr + 1;
+
+                     if Ptr > Max
+                       or else (Switch_Chars (Ptr) /= 'D'
+                                 and then Switch_Chars (Ptr) /= 'G'
+                                 and then Switch_Chars (Ptr) /= 'p')
+                     then
+                        Last := 0;
+                        return;
+                     end if;
+
+                     --  Processing for -gnateD
+
+                     if Switch_Chars (Ptr) = 'D' then
+                        Storing (First_Stored + 1 ..
+                                 First_Stored + Max - Ptr + 1) :=
+                          Switch_Chars (Ptr .. Max);
+                        Add_Switch_Component
+                          (Storing (Storing'First ..
+                                      First_Stored + Max - Ptr + 1));
+
+                     --  Processing for -gnatep=
+
+                     elsif Switch_Chars (Ptr) = 'p' then
+                        Ptr := Ptr + 1;
+
+                        if Ptr = Max then
+                           Last := 0;
+                           return;
+                        end if;
+
+                        if Switch_Chars (Ptr) = '=' then
+                           Ptr := Ptr + 1;
+                        end if;
+
+                        --  To normalize, always put a '=' after -gnatep.
+                        --  Because that could lengthen the switch string,
+                        --  declare a local variable.
+
+                        declare
+                           To_Store : String (1 .. Max - Ptr + 9);
+                        begin
+                           To_Store (1 .. 8) := "-gnatep=";
+                           To_Store (9 .. Max - Ptr + 9) :=
+                             Switch_Chars (Ptr .. Max);
+                           Add_Switch_Component (To_Store);
+                        end;
+
+                     elsif Switch_Chars (Ptr) = 'G' then
+                        Add_Switch_Component ("-gnateG");
+                     end if;
 
                      return;
 
@@ -271,7 +378,8 @@ package body Switch.M is
                            Ptr := Ptr + 1;
 
                            if Ptr <= Max
-                             and then Switch_Chars (Ptr) = 's' then
+                             and then Switch_Chars (Ptr) = 's'
+                           then
                               Last_Stored := Last_Stored + 1;
                               Storing (Last_Stored) := 's';
                               Ptr := Ptr + 1;
@@ -299,51 +407,99 @@ package body Switch.M is
                         end if;
                      end if;
 
+                     --  Loop through remaining switch characters in string
+
                      while Ptr <= Max loop
                         C := Switch_Chars (Ptr);
                         Ptr := Ptr + 1;
 
-                        --  'w' should be skipped in -gnatw
-
-                        if C /= 'w' or else Storing (First_Stored) /= 'w' then
+                        --  -gnatyMxxx
 
-                           --  -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 C = 'M'
-                             and then Storing (First_Stored) = 'y' then
-                              Last_Stored := First_Stored + 1;
-                              Storing (Last_Stored) := 'M';
+                           --  If there is no digit after -gnatyM,
+                           --  the switch is invalid.
 
-                              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 Last_Stored = First_Stored + 1 then
+                              Last := 0;
+                              return;
 
-                              --  If there is no digit after -gnatyM,
-                              --  the switch is invalid.
+                           else
+                              Add_Switch_Component
+                                (Storing (Storing'First .. Last_Stored));
+                           end if;
 
-                              if Last_Stored = First_Stored + 1 then
-                                 Last := 0;
-                                 return;
+                        --  --gnatx.x
 
-                              else
-                                 Add_Switch_Component
-                                   (Storing (Storing'First .. Last_Stored));
-                              end if;
+                        elsif C = '.' and then Ptr <= Max then
+                           Storing (First_Stored + 1) := '.';
+                           Storing (First_Stored + 2) := Switch_Chars (Ptr);
+                           Ptr := Ptr + 1;
+                           Add_Switch_Component
+                             (Storing (Storing'First .. First_Stored + 2));
 
-                           --  All other switches are -gnatxx
+                        --  All other switches are -gnatxx
 
-                           else
-                              Storing (First_Stored + 1) := C;
-                              Add_Switch_Component
-                                (Storing (Storing'First .. First_Stored + 1));
-                           end if;
+                        else
+                           Storing (First_Stored + 1) := C;
+                           Add_Switch_Component
+                             (Storing (Storing'First .. First_Stored + 1));
                         end if;
                      end loop;
 
+                  --  -gnat95 -gnat05
+
+                  when '0' | '9' =>
+                     Last_Stored := First_Stored;
+                     Storing (Last_Stored) := C;
+                     Ptr := Ptr + 1;
+
+                     if Ptr /= Max or else Switch_Chars (Ptr) /= '5' then
+
+                        --  Invalid switch
+
+                        Last := 0;
+                        return;
+
+                     else
+                        Last_Stored := Last_Stored + 1;
+                        Storing (Last_Stored) := '5';
+                        Add_Switch_Component
+                          (Storing (Storing'First .. Last_Stored));
+                        Ptr := Ptr + 1;
+                     end if;
+
+                  --  -gnat83
+
+                  when '8' =>
+                     Last_Stored := First_Stored;
+                     Storing (Last_Stored) := '8';
+                     Ptr := Ptr + 1;
+
+                     if Ptr /= Max or else Switch_Chars (Ptr) /= '3' then
+
+                        --  Invalid switch
+
+                        Last := 0;
+                        return;
+
+                     else
+                        Last_Stored := Last_Stored + 1;
+                        Storing (Last_Stored) := '3';
+                        Add_Switch_Component
+                          (Storing (Storing'First .. Last_Stored));
+                        Ptr := Ptr + 1;
+                     end if;
+
                   --  Not a valid switch
 
                   when others =>
@@ -357,8 +513,7 @@ package body Switch.M is
    end Normalize_Compiler_Switches;
 
    function Normalize_Compiler_Switches
-     (Switch_Chars : String)
-      return         Argument_List
+     (Switch_Chars : String) return Argument_List
    is
       Last : Natural;
 
@@ -367,76 +522,97 @@ package body Switch.M is
 
       if Last = 0 then
          return (1 .. 0 => null);
-
       else
          return Global_Switches (Global_Switches'First .. Last);
       end if;
-
    end Normalize_Compiler_Switches;
 
    ------------------------
    -- Scan_Make_Switches --
    ------------------------
 
-   procedure Scan_Make_Switches (Switch_Chars : String) is
-      Ptr : Integer := Switch_Chars'First;
-      Max : Integer := Switch_Chars'Last;
-      C   : Character := ' ';
+   procedure Scan_Make_Switches
+     (Project_Node_Tree : Prj.Tree.Project_Node_Tree_Ref;
+      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
-         raise Bad_Switch;
+         Bad_Switch (Switch_Chars);
 
       else
          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
-
-      while Ptr <= Max loop
-         C := Switch_Chars (Ptr);
-
-         --  Processing for a switch
-
-         case C is
-
-         when 'a' =>
+      C := Switch_Chars (Ptr);
+
+      --  Multiple character switches
+
+      if Switch_Chars'Length > 2 then
+         if Switch_Chars = "--create-missing-dirs" then
+            Setup_Projects := True;
+
+         elsif Switch_Chars'Length > Subdirs_Option'Length
+           and then
+             Switch_Chars
+               (Switch_Chars'First ..
+                Switch_Chars'First + Subdirs_Option'Length - 1) =
+                                                            Subdirs_Option
+         then
+            Subdirs :=
+              new String'
+                (Switch_Chars
+                  (Switch_Chars'First + Subdirs_Option'Length ..
+                   Switch_Chars'Last));
+
+         elsif Switch_Chars (Ptr) = '-' then
+            Bad_Switch (Switch_Chars);
+
+         elsif Switch_Chars'Length > 3
+           and then Switch_Chars (Ptr .. Ptr + 1) = "aP"
+         then
+            Add_Search_Project_Directory
+              (Project_Node_Tree,
+               Switch_Chars (Ptr + 2 .. Switch_Chars'Last));
+
+         elsif C = 'v' and then Switch_Chars'Length = 3 then
             Ptr := Ptr + 1;
-            Check_Readonly_Files := True;
-
-         --  Processing for b switch
-
-         when 'b' =>
-            Ptr := Ptr + 1;
-            Bind_Only := True;
-
-         --  Processing for c switch
+            Verbose_Mode := True;
 
-         when 'c' =>
-            Ptr := Ptr + 1;
-            Compile_Only := True;
+            case Switch_Chars (Ptr) is
+               when 'l' =>
+                  Verbosity_Level := Opt.Low;
 
-         --  Processing for C switch
+               when 'm' =>
+                  Verbosity_Level := Opt.Medium;
 
-         when 'C' =>
-            Ptr := Ptr + 1;
-            Create_Mapping_File := True;
+               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
@@ -449,141 +625,239 @@ package body Switch.M is
             while Ptr < Max loop
                Ptr := Ptr + 1;
                C := Switch_Chars (Ptr);
-               exit when C = ASCII.NUL or else C = '/' or else C = '-';
 
-               if C in '1' .. '9' or else
-                  C in 'a' .. 'z' or else
-                  C in 'A' .. 'Z'
-               then
+               if C in 'a' .. 'z' or else C in 'A' .. 'Z' then
                   Set_Debug_Flag (C);
                else
-                  raise Bad_Switch;
+                  Bad_Switch (Switch_Chars);
                end if;
             end loop;
 
-            --  Make sure Zero_Cost_Exceptions is set if gnatdX set. This
-            --  is for backwards compatibility with old versions and usage.
+         elsif C = 'e' then
+            Ptr := Ptr + 1;
 
-            if Debug_Flag_XX then
-               Zero_Cost_Exceptions_Set := True;
-               Zero_Cost_Exceptions_Val := True;
-            end if;
+            case Switch_Chars (Ptr) is
 
-            return;
+               --  Processing for eI switch
 
-         --  Processing for f switch
+               when 'I' =>
+                  Ptr := Ptr + 1;
+                  Scan_Pos (Switch_Chars, Max, Ptr, Main_Index, C);
 
-         when 'f' =>
-            Ptr := Ptr + 1;
-            Force_Compilations := True;
+                  if Ptr <= Max then
+                     Bad_Switch (Switch_Chars);
+                  end if;
 
-         --  Processing for h switch
+               --  Processing for eL switch
 
-         when 'h' =>
-            Ptr := Ptr + 1;
-            Usage_Requested := True;
+               when 'L' =>
+                  if Ptr /= Max then
+                     Bad_Switch (Switch_Chars);
 
-         --  Processing for i switch
+                  else
+                     Follow_Links_For_Files := True;
+                     Follow_Links_For_Dirs  := True;
+                  end if;
 
-         when 'i' =>
-            Ptr := Ptr + 1;
-            In_Place_Mode := True;
+               --  Processing for eS switch
+
+               when 'S' =>
+                  if Ptr /= Max then
+                     Bad_Switch (Switch_Chars);
 
-         --  Processing for j switch
+                  else
+                     Commands_To_Stdout := True;
+                  end if;
 
-         when 'j' =>
+               when others =>
+                  Bad_Switch (Switch_Chars);
+            end case;
+
+         elsif C = 'j' then
             Ptr := Ptr + 1;
 
             declare
                Max_Proc : Pos;
             begin
-               Scan_Pos (Switch_Chars, Max, Ptr, Max_Proc);
-               Maximum_Processes := Positive (Max_Proc);
-            end;
+               Scan_Pos (Switch_Chars, Max, Ptr, Max_Proc, C);
 
-         --  Processing for k switch
+               if Ptr <= Max then
+                  Bad_Switch (Switch_Chars);
 
-         when 'k' =>
+               else
+                  Maximum_Processes := Positive (Max_Proc);
+               end if;
+            end;
+
+         elsif C = 'w' and then Switch_Chars'Length = 3 then
             Ptr := Ptr + 1;
-            Keep_Going := True;
 
-         --  Processing for l switch
+            if Switch_Chars = "-we" then
+               Warning_Mode := Treat_As_Error;
 
-         when 'l' =>
-            Ptr := Ptr + 1;
-            Link_Only := True;
+            elsif Switch_Chars = "-wn" then
+               Warning_Mode := Normal;
 
-         when 'M' =>
-            Ptr := Ptr + 1;
-            List_Dependencies := True;
+            elsif Switch_Chars = "-ws" then
+               Warning_Mode  := Suppress;
 
-         --  Processing for n switch
+            else
+               Success := False;
+            end if;
 
-         when 'n' =>
-            Ptr := Ptr + 1;
-            Do_Not_Execute := True;
+         else
+            Success := False;
+         end if;
 
-         --  Processing for o switch
+      --  Single-character switches
 
-         when 'o' =>
-            Ptr := Ptr + 1;
+      else
+         Check_Switch : begin
 
-            if Output_File_Name_Present then
-               raise Too_Many_Output_Files;
-            else
-               Output_File_Name_Present := True;
-            end if;
+            case C is
 
-         --  Processing for q switch
+               when 'a' =>
+                  Check_Readonly_Files := True;
 
-         when 'q' =>
-            Ptr := Ptr + 1;
-            Quiet_Output := True;
+               --  Processing for b switch
 
-         --  Processing for s switch
+               when 'b' =>
+                  Bind_Only  := True;
+                  Make_Steps := True;
 
-         when 's' =>
-            Ptr := Ptr + 1;
-            Check_Switches := True;
+               --  Processing for B switch
 
-         --  Processing for v switch
+               when 'B' =>
+                  Build_Bind_And_Link_Full_Project := True;
 
-         when 'v' =>
-            Ptr := Ptr + 1;
-            Verbose_Mode := True;
+               --  Processing for c switch
 
-         --  Processing for z switch
+               when 'c' =>
+                  Compile_Only := True;
+                  Make_Steps   := True;
 
-         when 'z' =>
-            Ptr := Ptr + 1;
-            No_Main_Subprogram := True;
+               --  Processing for C switch
 
-         --  Ignore extra switch character
+               when 'C' =>
+                  Create_Mapping_File := True;
 
-         when '/' | '-' =>
-            Ptr := Ptr + 1;
+               --  Processing for D switch
 
-         --  Anything else is an error (illegal switch character)
+               when 'D' =>
+                  if Object_Directory_Present then
+                     Osint.Fail ("duplicate -D switch");
 
-         when others =>
-            raise Bad_Switch;
+                  else
+                     Object_Directory_Present := True;
+                  end if;
 
-         end case;
-      end loop;
+               --  Processing for f switch
+
+               when 'f' =>
+                  Force_Compilations := True;
+
+               --  Processing for F switch
+
+               when 'F' =>
+                  Full_Path_Name_For_Brief_Errors := True;
+
+               --  Processing for h switch
+
+               when 'h' =>
+                  Usage_Requested := True;
+
+               --  Processing for i switch
+
+               when 'i' =>
+                  In_Place_Mode := True;
+
+               --  Processing for j switch
+
+               when 'j' =>
+                  --  -j not followed by a number is an error
+
+                  Bad_Switch (Switch_Chars);
+
+               --  Processing for k switch
+
+               when 'k' =>
+                  Keep_Going := True;
 
-   exception
-      when Bad_Switch =>
-         Osint.Fail ("invalid switch: ", (1 => C));
+               --  Processing for l switch
 
-      when Bad_Switch_Value =>
-         Osint.Fail ("numeric value too big for switch: ", (1 => C));
+               when 'l' =>
+                  Link_Only  := True;
+                  Make_Steps := True;
 
-      when Missing_Switch_Value =>
-         Osint.Fail ("missing numeric value for switch: ", (1 => C));
+               --  Processing for M switch
 
-      when Too_Many_Output_Files =>
-         Osint.Fail ("duplicate -o switch");
+               when 'M' =>
+                  List_Dependencies := True;
 
+               --  Processing for n switch
+
+               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;
+
+               --  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;