1 ------------------------------------------------------------------------------
3 -- GNAT COMPILER COMPONENTS --
9 -- Copyright (C) 2001-2008, Free Software Foundation, Inc. --
11 -- GNAT is free software; you can redistribute it and/or modify it under --
12 -- terms of the GNU General Public License as published by the Free Soft- --
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
16 -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
17 -- for more details. You should have received a copy of the GNU General --
18 -- Public License distributed with GNAT; see file COPYING3. If not, go to --
19 -- http://www.gnu.org/licenses for a complete copy of the license. --
21 -- GNAT was originally developed by the GNAT team at New York University. --
22 -- Extensive contributions were provided by Ada Core Technologies Inc. --
24 ------------------------------------------------------------------------------
26 with Debug
; use Debug
;
28 with Osint
; use Osint
;
30 with Prepcomp
; use Prepcomp
;
31 with Validsw
; use Validsw
;
32 with Sem_Warn
; use Sem_Warn
;
33 with Stylesw
; use Stylesw
;
35 with System
.OS_Lib
; use System
.OS_Lib
;
37 with System
.WCh_Con
; use System
.WCh_Con
;
39 package body Switch
.C
is
41 RTS_Specified
: String_Access
:= null;
42 -- Used to detect multiple use of --RTS= flag
44 -----------------------------
45 -- Scan_Front_End_Switches --
46 -----------------------------
48 procedure Scan_Front_End_Switches
(Switch_Chars
: String) is
49 First_Switch
: Boolean := True;
50 -- False for all but first switch
52 Max
: constant Natural := Switch_Chars
'Last;
57 Store_Switch
: Boolean;
58 -- For -gnatxx switches, the normal processing, signalled by this flag
59 -- being set to True, is to store the switch on exit from the case
60 -- statement, the switch stored is -gnat followed by the characters
61 -- from First_Char to Ptr-1. For cases like -gnaty, where the switch
62 -- is stored in separate pieces, this flag is set to False, and the
63 -- appropriate calls to Store_Compilation_Switch are made from within
66 First_Char
: Positive;
67 -- Marks start of switch to be stored
70 Ptr
:= Switch_Chars
'First;
72 -- Skip past the initial character (must be the switch character)
80 -- Handle switches that do not start with -gnat
83 or else Switch_Chars
(Ptr
.. Ptr
+ 3) /= "gnat"
85 -- There are two front-end switches that do not start with -gnat:
88 if Switch_Chars
(Ptr
) = 'I' then
90 -- Set flag Search_Directory_Present if switch is "-I" only:
91 -- the directory will be the next argument.
94 Search_Directory_Present
:= True;
100 -- Find out whether this is a -I- or regular -Ixxx switch
102 -- Note: -I switches are not recorded in the ALI file, since the
103 -- meaning of the program depends on the source files compiled,
104 -- not where they came from.
106 if Ptr
= Max
and then Switch_Chars
(Ptr
) = '-' then
107 Look_In_Primary_Dir
:= False;
109 Add_Src_Search_Dir
(Switch_Chars
(Ptr
.. Max
));
112 -- Processing of the --RTS switch. --RTS may have been modified by
113 -- gcc into -fRTS (for GCC targets).
116 and then (Switch_Chars
(Ptr
.. Ptr
+ 3) = "fRTS"
118 Switch_Chars
(Ptr
.. Ptr
+ 3) = "-RTS")
123 or else Switch_Chars
(Ptr
+ 3) /= '='
125 Osint
.Fail
("missing path for --RTS");
127 -- Check that this is the first time --RTS is specified or if
128 -- it is not the first time, the same path has been specified.
130 if RTS_Specified
= null then
131 RTS_Specified
:= new String'(Switch_Chars (Ptr + 4 .. Max));
134 RTS_Specified.all /= Switch_Chars (Ptr + 4 .. Max)
136 Osint.Fail ("--RTS cannot be specified multiple times");
139 -- Valid --RTS switch
141 Opt.No_Stdinc := True;
142 Opt.RTS_Switch := True;
146 (Switch_Chars (Ptr + 4 .. Max), Include);
150 (Switch_Chars (Ptr + 4 .. Max), Objects);
152 if RTS_Src_Path_Name /= null
153 and then RTS_Lib_Path_Name /= null
155 -- Store the -fRTS switch (Note: Store_Compilation_Switch
156 -- changes -fRTS back into --RTS for the actual output).
158 Store_Compilation_Switch (Switch_Chars);
160 elsif RTS_Src_Path_Name = null
161 and then RTS_Lib_Path_Name = null
163 Osint.Fail ("RTS path not valid: missing " &
164 "adainclude and adalib directories");
166 elsif RTS_Src_Path_Name = null then
167 Osint.Fail ("RTS path not valid: missing " &
168 "adainclude directory");
170 elsif RTS_Lib_Path_Name = null then
171 Osint.Fail ("RTS path not valid: missing " &
176 -- There are no other switches not starting with -gnat
179 Bad_Switch (Switch_Chars);
182 -- Case of switch starting with -gnat
187 -- Loop to scan through switches given in switch string
189 while Ptr <= Max loop
191 Store_Switch := True;
193 C := Switch_Chars (Ptr);
199 Assertions_Enabled := True;
200 Debug_Pragmas_Enabled := True;
202 -- Processing for A switch
206 Config_File := False;
208 -- Processing for b switch
212 Brief_Output := True;
214 -- Processing for B switch
218 Assume_No_Invalid_Values := True;
220 -- Processing for c switch
223 if not First_Switch then
225 ("-gnatc must be first if combined with other switches");
229 Operating_Mode := Check_Semantics;
233 Inspector_Mode := False;
236 -- Processing for d switch
239 Store_Switch := False;
242 -- Note: for the debug switch, the remaining characters in this
243 -- switch field must all be debug flags, since all valid switch
244 -- characters are also valid debug characters.
246 -- Loop to scan out debug flags
250 C := Switch_Chars (Ptr);
251 exit when C = ASCII.NUL or else C = '/' or else C = '-';
253 if C in '1' .. '9' or else
254 C in 'a
' .. 'z
' or else
258 Set_Dotted_Debug_Flag (C);
259 Store_Compilation_Switch ("-gnatd." & C);
261 -- ??? Change this when we use a non debug flag to
262 -- enable inspector mode.
266 -- Do not enable inspector mode in ASIS mode,
267 -- since the two switches are incompatible.
269 Inspector_Mode := False;
272 -- In inspector mode, we need back-end rep info
273 -- annotations and disable front-end inlining.
275 Back_Annotate_Rep_Info := True;
276 Front_End_Inlining := False;
281 Store_Compilation_Switch ("-gnatd" & C);
288 Bad_Switch ("-gnatd." & Switch_Chars (Ptr .. Max));
290 Bad_Switch ("-gnatd" & Switch_Chars (Ptr .. Max));
296 -- Processing for D switch
301 -- Scan optional integer line limit value
303 if Nat_Present (Switch_Chars, Max, Ptr) then
304 Scan_Nat (Switch_Chars, Max, Ptr, Sprint_Line_Limit, 'D
');
305 Sprint_Line_Limit := Nat'Max (Sprint_Line_Limit, 40);
308 -- Note: -gnatD also sets -gnatx (to turn off cross-reference
309 -- generation in the ali file) since otherwise this generation
310 -- gets confused by the "wrong" Sloc values put in the tree.
312 Debug_Generated_Code := True;
313 Xref_Active := False;
314 Set_Debug_Flag ('g
');
316 -- -gnate? (extended switches)
321 -- The -gnate? switches are all double character switches
322 -- so we must always have a character after the e.
325 Bad_Switch ("-gnate");
328 case Switch_Chars (Ptr) is
331 Store_Switch := False;
332 Enable_Switch_Storing;
335 -- -gnatec (configuration pragmas)
338 Store_Switch := False;
341 -- There may be an equal sign between -gnatec and
342 -- the path name of the config file.
344 if Ptr <= Max and then Switch_Chars (Ptr) = '=' then
349 Bad_Switch ("-gnatec");
353 Config_File_Name : constant String_Access :=
355 (Switch_Chars
(Ptr
.. Max
));
358 if Config_File_Names
= null then
360 new String_List
'(1 => Config_File_Name);
364 New_Names : constant String_List_Access :=
367 Config_File_Names'Length + 1);
370 for Index in Config_File_Names'Range loop
372 Config_File_Names (Index);
373 Config_File_Names (Index) := null;
376 New_Names (New_Names'Last) := Config_File_Name;
377 Free (Config_File_Names);
378 Config_File_Names := New_Names;
385 -- -gnateD switch (preprocessing symbol definition)
388 Store_Switch := False;
392 Bad_Switch ("-gnateD");
395 Add_Symbol_Definition (Switch_Chars (Ptr .. Max));
399 Store_Compilation_Switch
400 ("-gnateD" & Switch_Chars (Ptr .. Max));
403 -- -gnatef (full source path for brief error messages)
406 Store_Switch := False;
408 Full_Path_Name_For_Brief_Errors := True;
411 -- -gnateG (save preprocessor output)
415 Bad_Switch (Switch_Chars);
418 Generate_Processed_File := True;
421 -- -gnateI (index of unit in multi-unit source)
425 Scan_Pos (Switch_Chars, Max, Ptr, Multiple_Unit_Index, C);
427 -- -gnatem (mapping file)
430 Store_Switch := False;
433 -- There may be an equal sign between -gnatem and
434 -- the path name of the mapping file.
436 if Ptr <= Max and then Switch_Chars (Ptr) = '=' then
441 Bad_Switch ("-gnatem");
445 new String'(Switch_Chars
(Ptr
.. Max
));
448 -- -gnatep (preprocessing data file)
451 Store_Switch
:= False;
454 -- There may be an equal sign between -gnatep and
455 -- the path name of the mapping file.
457 if Ptr
<= Max
and then Switch_Chars
(Ptr
) = '=' then
462 Bad_Switch
("-gnatep");
465 Preprocessing_Data_File
:=
466 new String'(Switch_Chars (Ptr .. Max));
468 -- Store the switch, normalizing to -gnatep=
470 Store_Compilation_Switch
471 ("-gnatep=" & Preprocessing_Data_File.all);
476 Store_Switch := False;
477 Disable_Switch_Storing;
480 -- All other -gnate? switches are unassigned
483 Bad_Switch ("-gnate" & Switch_Chars (Ptr .. Max));
486 -- -gnatE (dynamic elaboration checks)
490 Dynamic_Elaboration_Checks := True;
492 -- -gnatf (full error messages)
496 All_Errors_Mode := True;
498 -- Processing for F switch
502 External_Name_Exp_Casing := Uppercase;
503 External_Name_Imp_Casing := Uppercase;
505 -- Processing for g switch
510 Identifier_Character_Set := 'n
';
511 System_Extend_Unit := Empty;
512 Warning_Mode := Treat_As_Error;
514 -- Set Ada 2005 mode explicitly. We don't want to rely on the
515 -- implicit setting here, since for example, we want
516 -- Preelaborate_05 treated as Preelaborate
518 Ada_Version := Ada_05;
519 Ada_Version_Explicit := Ada_Version;
521 -- Set default warnings for -gnatg
523 Check_Unreferenced := True;
524 Check_Unreferenced_Formals := True;
526 Constant_Condition_Warnings := True;
527 Implementation_Unit_Warnings := True;
528 Ineffective_Inline_Warnings := True;
529 Warn_On_Assertion_Failure := True;
530 Warn_On_Assumed_Low_Bound := True;
531 Warn_On_Bad_Fixed_Value := True;
532 Warn_On_Constant := True;
533 Warn_On_Export_Import := True;
534 Warn_On_Modified_Unread := True;
535 Warn_On_No_Value_Assigned := True;
536 Warn_On_Non_Local_Exception := False;
537 Warn_On_Obsolescent_Feature := True;
538 Warn_On_Redundant_Constructs := True;
539 Warn_On_Object_Renames_Function := True;
540 Warn_On_Unchecked_Conversion := True;
541 Warn_On_Unrecognized_Pragma := True;
543 Set_GNAT_Style_Check_Options;
545 -- Processing for G switch
549 Print_Generated_Code := True;
551 -- Scan optional integer line limit value
553 if Nat_Present (Switch_Chars, Max, Ptr) then
554 Scan_Nat (Switch_Chars, Max, Ptr, Sprint_Line_Limit, 'G
');
555 Sprint_Line_Limit := Nat'Max (Sprint_Line_Limit, 40);
558 -- Processing for h switch
562 Usage_Requested := True;
564 -- Processing for H switch
570 -- Processing for i switch
574 Bad_Switch ("-gnati");
578 C := Switch_Chars (Ptr);
588 Identifier_Character_Set := C;
592 Bad_Switch ("-gnati" & Switch_Chars (Ptr .. Max));
595 -- Processing for I switch
599 Ignore_Rep_Clauses := True;
601 -- Processing for j switch
605 Scan_Nat (Switch_Chars, Max, Ptr, Error_Msg_Line_Length, C);
607 -- Processing for k switch
612 (Switch_Chars, Max, Ptr, Maximum_File_Name_Length, C);
614 -- Processing for l switch
620 -- There may be an equal sign between -gnatl and a file name
622 if Ptr <= Max and then Switch_Chars (Ptr) = '=' then
624 Osint.Fail ("file name for -gnatl= is null");
626 Opt.Full_List_File_Name :=
627 new String'(Switch_Chars
(Ptr
+ 1 .. Max
));
632 -- Processing for L switch
636 Dump_Source_Text
:= True;
638 -- Processing for m switch
642 Scan_Nat
(Switch_Chars
, Max
, Ptr
, Maximum_Messages
, C
);
644 -- Processing for n switch
648 Inline_Active
:= True;
650 -- Processing for N switch
654 Inline_Active
:= True;
656 -- Do not enable front-end inlining in inspector mode, to
657 -- generate trees that can be converted to SCIL. We still
658 -- enable back-end inlining which is fine.
660 if not Inspector_Mode
then
661 Front_End_Inlining
:= True;
664 -- Processing for o switch
668 Suppress_Options
(Overflow_Check
) := False;
669 Opt
.Enable_Overflow_Checks
:= True;
671 -- Processing for O switch
674 Store_Switch
:= False;
676 Output_File_Name_Present
:= True;
678 -- Processing for p switch
683 -- Set all specific options as well as All_Checks in the
684 -- Suppress_Options array, excluding Elaboration_Check, since
685 -- this is treated specially because we do not want -gnatp to
686 -- disable static elaboration processing.
688 for J
in Suppress_Options
'Range loop
689 if J
/= Elaboration_Check
then
690 Suppress_Options
(J
) := True;
694 Validity_Checks_On
:= False;
695 Opt
.Suppress_Checks
:= True;
696 Opt
.Enable_Overflow_Checks
:= False;
698 -- Processing for P switch
702 Polling_Required
:= True;
704 -- Processing for q switch
708 Try_Semantics
:= True;
710 -- Processing for Q switch
714 Force_ALI_Tree_File
:= True;
715 Try_Semantics
:= True;
717 -- Processing for r switch
721 Treat_Restrictions_As_Warnings
:= True;
723 -- Processing for R switch
726 Back_Annotate_Rep_Info
:= True;
727 List_Representation_Info
:= 1;
730 while Ptr
<= Max
loop
731 C
:= Switch_Chars
(Ptr
);
733 if C
in '1' .. '3' then
734 List_Representation_Info
:=
735 Character'Pos (C
) - Character'Pos ('0');
737 elsif Switch_Chars
(Ptr
) = 's' then
738 List_Representation_Info_To_File
:= True;
740 elsif Switch_Chars
(Ptr
) = 'm' then
741 List_Representation_Info_Mechanisms
:= True;
744 Bad_Switch
("-gnatR" & Switch_Chars
(Ptr
.. Max
));
750 -- Processing for s switch
753 if not First_Switch
then
755 ("-gnats must be first if combined with other switches");
759 Operating_Mode
:= Check_Syntax
;
761 -- Processing for S switch
764 Print_Standard
:= True;
767 -- Processing for t switch
773 if Operating_Mode
= Check_Semantics
then
775 Inspector_Mode
:= False;
778 Back_Annotate_Rep_Info
:= True;
780 -- Processing for T switch
784 Scan_Pos
(Switch_Chars
, Max
, Ptr
, Table_Factor
, C
);
786 -- Processing for u switch
792 -- Processing for U switch
796 Unique_Error_Tag
:= True;
798 -- Processing for v switch
802 Verbose_Mode
:= True;
804 -- Processing for V switch
807 Store_Switch
:= False;
811 Bad_Switch
("-gnatV");
818 Set_Validity_Check_Options
819 (Switch_Chars
(Ptr
.. Max
), OK
, Ptr
);
822 Bad_Switch
("-gnatV" & Switch_Chars
(Ptr
.. Max
));
825 for Index
in First_Char
+ 1 .. Max
loop
826 Store_Compilation_Switch
827 ("-gnatV" & Switch_Chars
(Index
));
834 -- Processing for w switch
837 Store_Switch
:= False;
841 Bad_Switch
("-gnatw");
844 while Ptr
<= Max
loop
845 C
:= Switch_Chars
(Ptr
);
847 -- Case of dot switch
849 if C
= '.' and then Ptr
< Max
then
851 C
:= Switch_Chars
(Ptr
);
853 if Set_Dot_Warning_Switch
(C
) then
854 Store_Compilation_Switch
("-gnatw." & C
);
856 Bad_Switch
("-gnatw." & Switch_Chars
(Ptr
.. Max
));
859 -- Normal case, no dot
862 if Set_Warning_Switch
(C
) then
863 Store_Compilation_Switch
("-gnatw" & C
);
865 Bad_Switch
("-gnatw" & Switch_Chars
(Ptr
.. Max
));
874 -- Processing for W switch
880 Bad_Switch
("-gnatW");
884 Wide_Character_Encoding_Method
:=
885 Get_WC_Encoding_Method
(Switch_Chars
(Ptr
));
887 when Constraint_Error
=>
888 Bad_Switch
("-gnatW" & Switch_Chars
(Ptr
.. Max
));
891 Wide_Character_Encoding_Method_Specified
:= True;
893 Upper_Half_Encoding
:=
894 Wide_Character_Encoding_Method
in
895 WC_Upper_Half_Encoding_Method
;
899 -- Processing for x switch
903 Xref_Active
:= False;
905 -- Processing for X switch
909 Extensions_Allowed
:= True;
911 -- Processing for y switch
917 Set_Default_Style_Check_Options
;
920 Store_Switch
:= False;
926 Set_Style_Check_Options
927 (Switch_Chars
(Ptr
.. Max
), OK
, Ptr
);
931 ("bad -gnaty switch (" &
932 Style_Msg_Buf
(1 .. Style_Msg_Len
) & ')');
935 Ptr
:= First_Char
+ 1;
936 while Ptr
<= Max
loop
937 if Switch_Chars
(Ptr
) = 'M' then
942 or else Switch_Chars
(Ptr
) not in '0' .. '9';
945 Store_Compilation_Switch
946 ("-gnaty" & Switch_Chars
(First_Char
.. Ptr
- 1));
949 Store_Compilation_Switch
950 ("-gnaty" & Switch_Chars
(Ptr
));
957 -- Processing for z switch
962 -- Allowed for compiler only if this is the only
963 -- -z switch, we do not allow multiple occurrences
965 if Distribution_Stub_Mode
= No_Stubs
then
966 case Switch_Chars
(Ptr
) is
968 Distribution_Stub_Mode
:= Generate_Receiver_Stub_Body
;
971 Distribution_Stub_Mode
:= Generate_Caller_Stub_Body
;
974 Bad_Switch
("-gnatz" & Switch_Chars
(Ptr
.. Max
));
980 -- Processing for Z switch
985 ("-gnatZ is no longer supported: consider using --RTS=zcx");
987 -- Processing for 83 switch
991 Bad_Switch
("-gnat8");
996 if Switch_Chars
(Ptr
) /= '3' then
997 Bad_Switch
("-gnat8" & Switch_Chars
(Ptr
.. Max
));
1000 Ada_Version
:= Ada_83
;
1001 Ada_Version_Explicit
:= Ada_Version
;
1004 -- Processing for 95 switch
1008 Bad_Switch
("-gnat9");
1013 if Switch_Chars
(Ptr
) /= '5' then
1014 Bad_Switch
("-gnat9" & Switch_Chars
(Ptr
.. Max
));
1017 Ada_Version
:= Ada_95
;
1018 Ada_Version_Explicit
:= Ada_Version
;
1021 -- Processing for 05 switch
1025 Bad_Switch
("-gnat0");
1030 if Switch_Chars
(Ptr
) /= '5' then
1031 Bad_Switch
("-gnat0" & Switch_Chars
(Ptr
.. Max
));
1034 Ada_Version
:= Ada_05
;
1035 Ada_Version_Explicit
:= Ada_Version
;
1038 -- Ignore extra switch character
1043 -- Anything else is an error (illegal switch character)
1046 Bad_Switch
("-gnat" & Switch_Chars
(Ptr
.. Max
));
1049 if Store_Switch
then
1050 Store_Compilation_Switch
1051 ("-gnat" & Switch_Chars
(First_Char
.. Ptr
- 1));
1054 First_Switch
:= False;
1057 end Scan_Front_End_Switches
;