annotate gcc/ada/switch-m.adb @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 ------------------------------------------------------------------------------
kono
parents:
diff changeset
2 -- --
kono
parents:
diff changeset
3 -- GNAT COMPILER COMPONENTS --
kono
parents:
diff changeset
4 -- --
kono
parents:
diff changeset
5 -- S W I T C H - M --
kono
parents:
diff changeset
6 -- --
kono
parents:
diff changeset
7 -- B o d y --
kono
parents:
diff changeset
8 -- --
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
9 -- Copyright (C) 2001-2018, Free Software Foundation, Inc. --
111
kono
parents:
diff changeset
10 -- --
kono
parents:
diff changeset
11 -- GNAT is free software; you can redistribute it and/or modify it under --
kono
parents:
diff changeset
12 -- terms of the GNU General Public License as published by the Free Soft- --
kono
parents:
diff changeset
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
kono
parents:
diff changeset
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
kono
parents:
diff changeset
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
kono
parents:
diff changeset
16 -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
kono
parents:
diff changeset
17 -- for more details. You should have received a copy of the GNU General --
kono
parents:
diff changeset
18 -- Public License distributed with GNAT; see file COPYING3. If not, go to --
kono
parents:
diff changeset
19 -- http://www.gnu.org/licenses for a complete copy of the license. --
kono
parents:
diff changeset
20 -- --
kono
parents:
diff changeset
21 -- GNAT was originally developed by the GNAT team at New York University. --
kono
parents:
diff changeset
22 -- Extensive contributions were provided by Ada Core Technologies Inc. --
kono
parents:
diff changeset
23 -- --
kono
parents:
diff changeset
24 ------------------------------------------------------------------------------
kono
parents:
diff changeset
25
kono
parents:
diff changeset
26 with Debug; use Debug;
kono
parents:
diff changeset
27 with Osint; use Osint;
kono
parents:
diff changeset
28 with Opt; use Opt;
kono
parents:
diff changeset
29 with Table;
kono
parents:
diff changeset
30
kono
parents:
diff changeset
31 with System.Multiprocessors; use System.Multiprocessors;
kono
parents:
diff changeset
32
kono
parents:
diff changeset
33 package body Switch.M is
kono
parents:
diff changeset
34
kono
parents:
diff changeset
35 package Normalized_Switches is new Table.Table
kono
parents:
diff changeset
36 (Table_Component_Type => String_Access,
kono
parents:
diff changeset
37 Table_Index_Type => Integer,
kono
parents:
diff changeset
38 Table_Low_Bound => 1,
kono
parents:
diff changeset
39 Table_Initial => 20,
kono
parents:
diff changeset
40 Table_Increment => 100,
kono
parents:
diff changeset
41 Table_Name => "Switch.M.Normalized_Switches");
kono
parents:
diff changeset
42 -- This table is used to keep the normalized switches, so that they may be
kono
parents:
diff changeset
43 -- reused for subsequent invocations of Normalize_Compiler_Switches with
kono
parents:
diff changeset
44 -- similar switches.
kono
parents:
diff changeset
45
kono
parents:
diff changeset
46 Initial_Number_Of_Switches : constant := 10;
kono
parents:
diff changeset
47
kono
parents:
diff changeset
48 Global_Switches : Argument_List_Access := null;
kono
parents:
diff changeset
49 -- Used by function Normalize_Compiler_Switches
kono
parents:
diff changeset
50
kono
parents:
diff changeset
51 Subdirs_Option : constant String := "--subdirs=";
kono
parents:
diff changeset
52
kono
parents:
diff changeset
53 ---------------------------------
kono
parents:
diff changeset
54 -- Normalize_Compiler_Switches --
kono
parents:
diff changeset
55 ---------------------------------
kono
parents:
diff changeset
56
kono
parents:
diff changeset
57 procedure Normalize_Compiler_Switches
kono
parents:
diff changeset
58 (Switch_Chars : String;
kono
parents:
diff changeset
59 Switches : in out Argument_List_Access;
kono
parents:
diff changeset
60 Last : out Natural)
kono
parents:
diff changeset
61 is
kono
parents:
diff changeset
62 Switch_Starts_With_Gnat : Boolean;
kono
parents:
diff changeset
63
kono
parents:
diff changeset
64 Ptr : Integer := Switch_Chars'First;
kono
parents:
diff changeset
65 Max : constant Integer := Switch_Chars'Last;
kono
parents:
diff changeset
66 C : Character := ' ';
kono
parents:
diff changeset
67
kono
parents:
diff changeset
68 Storing : String := Switch_Chars;
kono
parents:
diff changeset
69 First_Stored : Positive := Ptr + 1;
kono
parents:
diff changeset
70 Last_Stored : Positive := First_Stored;
kono
parents:
diff changeset
71
kono
parents:
diff changeset
72 procedure Add_Switch_Component (S : String);
kono
parents:
diff changeset
73 -- Add a new String_Access component in Switches. If a string equal
kono
parents:
diff changeset
74 -- to S is already stored in the table Normalized_Switches, use it.
kono
parents:
diff changeset
75 -- Otherwise add a new component to the table.
kono
parents:
diff changeset
76
kono
parents:
diff changeset
77 --------------------------
kono
parents:
diff changeset
78 -- Add_Switch_Component --
kono
parents:
diff changeset
79 --------------------------
kono
parents:
diff changeset
80
kono
parents:
diff changeset
81 procedure Add_Switch_Component (S : String) is
kono
parents:
diff changeset
82 begin
kono
parents:
diff changeset
83 -- If Switches is null, allocate a new array
kono
parents:
diff changeset
84
kono
parents:
diff changeset
85 if Switches = null then
kono
parents:
diff changeset
86 Switches := new Argument_List (1 .. Initial_Number_Of_Switches);
kono
parents:
diff changeset
87
kono
parents:
diff changeset
88 -- Otherwise, if Switches is full, extend it
kono
parents:
diff changeset
89
kono
parents:
diff changeset
90 elsif Last = Switches'Last then
kono
parents:
diff changeset
91 declare
kono
parents:
diff changeset
92 New_Switches : constant Argument_List_Access :=
kono
parents:
diff changeset
93 new Argument_List
kono
parents:
diff changeset
94 (1 .. Switches'Length + Switches'Length);
kono
parents:
diff changeset
95 begin
kono
parents:
diff changeset
96 New_Switches (1 .. Switches'Length) := Switches.all;
kono
parents:
diff changeset
97 Last := Switches'Length;
kono
parents:
diff changeset
98 Switches := New_Switches;
kono
parents:
diff changeset
99 end;
kono
parents:
diff changeset
100 end if;
kono
parents:
diff changeset
101
kono
parents:
diff changeset
102 -- If this is the first switch, Last designates the first component
kono
parents:
diff changeset
103
kono
parents:
diff changeset
104 if Last = 0 then
kono
parents:
diff changeset
105 Last := Switches'First;
kono
parents:
diff changeset
106 else
kono
parents:
diff changeset
107 Last := Last + 1;
kono
parents:
diff changeset
108 end if;
kono
parents:
diff changeset
109
kono
parents:
diff changeset
110 -- Look into the table Normalized_Switches for a similar string.
kono
parents:
diff changeset
111 -- If one is found, put it at the added component, and return.
kono
parents:
diff changeset
112
kono
parents:
diff changeset
113 for Index in 1 .. Normalized_Switches.Last loop
kono
parents:
diff changeset
114 if S = Normalized_Switches.Table (Index).all then
kono
parents:
diff changeset
115 Switches (Last) := Normalized_Switches.Table (Index);
kono
parents:
diff changeset
116 return;
kono
parents:
diff changeset
117 end if;
kono
parents:
diff changeset
118 end loop;
kono
parents:
diff changeset
119
kono
parents:
diff changeset
120 -- No string equal to S was found in the table Normalized_Switches.
kono
parents:
diff changeset
121 -- Add a new component in the table.
kono
parents:
diff changeset
122
kono
parents:
diff changeset
123 Switches (Last) := new String'(S);
kono
parents:
diff changeset
124 Normalized_Switches.Append (Switches (Last));
kono
parents:
diff changeset
125 end Add_Switch_Component;
kono
parents:
diff changeset
126
kono
parents:
diff changeset
127 -- Start of processing for Normalize_Compiler_Switches
kono
parents:
diff changeset
128
kono
parents:
diff changeset
129 begin
kono
parents:
diff changeset
130 Last := 0;
kono
parents:
diff changeset
131
kono
parents:
diff changeset
132 if Ptr = Max or else Switch_Chars (Ptr) /= '-' then
kono
parents:
diff changeset
133 return;
kono
parents:
diff changeset
134 end if;
kono
parents:
diff changeset
135
kono
parents:
diff changeset
136 Ptr := Ptr + 1;
kono
parents:
diff changeset
137
kono
parents:
diff changeset
138 Switch_Starts_With_Gnat :=
kono
parents:
diff changeset
139 Ptr + 3 <= Max and then Switch_Chars (Ptr .. Ptr + 3) = "gnat";
kono
parents:
diff changeset
140
kono
parents:
diff changeset
141 if Switch_Starts_With_Gnat then
kono
parents:
diff changeset
142 Ptr := Ptr + 4;
kono
parents:
diff changeset
143 First_Stored := Ptr;
kono
parents:
diff changeset
144 end if;
kono
parents:
diff changeset
145
kono
parents:
diff changeset
146 while Ptr <= Max loop
kono
parents:
diff changeset
147 C := Switch_Chars (Ptr);
kono
parents:
diff changeset
148
kono
parents:
diff changeset
149 -- Processing for a switch
kono
parents:
diff changeset
150
kono
parents:
diff changeset
151 case Switch_Starts_With_Gnat is
kono
parents:
diff changeset
152 when False =>
kono
parents:
diff changeset
153
kono
parents:
diff changeset
154 -- All switches that don't start with -gnat stay as is,
kono
parents:
diff changeset
155 -- except -pg, -Wall, -k8, -w
kono
parents:
diff changeset
156
kono
parents:
diff changeset
157 if Switch_Chars = "-pg" or else Switch_Chars = "-p" then
kono
parents:
diff changeset
158
kono
parents:
diff changeset
159 -- The gcc driver converts -pg to -p, so that is what
kono
parents:
diff changeset
160 -- is stored in the ALI file.
kono
parents:
diff changeset
161
kono
parents:
diff changeset
162 Add_Switch_Component ("-p");
kono
parents:
diff changeset
163
kono
parents:
diff changeset
164 elsif Switch_Chars = "-Wall" then
kono
parents:
diff changeset
165
kono
parents:
diff changeset
166 -- The gcc driver adds -gnatwa when -Wall is used
kono
parents:
diff changeset
167
kono
parents:
diff changeset
168 Add_Switch_Component ("-gnatwa");
kono
parents:
diff changeset
169 Add_Switch_Component ("-Wall");
kono
parents:
diff changeset
170
kono
parents:
diff changeset
171 elsif Switch_Chars = "-k8" then
kono
parents:
diff changeset
172
kono
parents:
diff changeset
173 -- The gcc driver transforms -k8 into -gnatk8
kono
parents:
diff changeset
174
kono
parents:
diff changeset
175 Add_Switch_Component ("-gnatk8");
kono
parents:
diff changeset
176
kono
parents:
diff changeset
177 elsif Switch_Chars = "-w" then
kono
parents:
diff changeset
178
kono
parents:
diff changeset
179 -- The gcc driver adds -gnatws when -w is used
kono
parents:
diff changeset
180
kono
parents:
diff changeset
181 Add_Switch_Component ("-gnatws");
kono
parents:
diff changeset
182 Add_Switch_Component ("-w");
kono
parents:
diff changeset
183
kono
parents:
diff changeset
184 elsif Switch_Chars'Length > 6
kono
parents:
diff changeset
185 and then
kono
parents:
diff changeset
186 Switch_Chars (Switch_Chars'First .. Switch_Chars'First + 5)
kono
parents:
diff changeset
187 = "--RTS="
kono
parents:
diff changeset
188 then
kono
parents:
diff changeset
189 Add_Switch_Component (Switch_Chars);
kono
parents:
diff changeset
190
kono
parents:
diff changeset
191 -- When --RTS=mtp is used, the gcc driver adds -mrtp
kono
parents:
diff changeset
192
kono
parents:
diff changeset
193 if Switch_Chars = "--RTS=mtp" then
kono
parents:
diff changeset
194 Add_Switch_Component ("-mrtp");
kono
parents:
diff changeset
195 end if;
kono
parents:
diff changeset
196
kono
parents:
diff changeset
197 -- Special case for -fstack-check (alias for
kono
parents:
diff changeset
198 -- -fstack-check=specific)
kono
parents:
diff changeset
199
kono
parents:
diff changeset
200 elsif Switch_Chars = "-fstack-check" then
kono
parents:
diff changeset
201 Add_Switch_Component ("-fstack-check=specific");
kono
parents:
diff changeset
202
kono
parents:
diff changeset
203 -- Take only into account switches that are transmitted to
kono
parents:
diff changeset
204 -- gnat1 by the gcc driver and stored by gnat1 in the ALI file.
kono
parents:
diff changeset
205
kono
parents:
diff changeset
206 else
kono
parents:
diff changeset
207 case C is
kono
parents:
diff changeset
208 when 'O' | 'W' | 'w' | 'f' | 'd' | 'g' | 'm' =>
kono
parents:
diff changeset
209 Add_Switch_Component (Switch_Chars);
kono
parents:
diff changeset
210
kono
parents:
diff changeset
211 when others =>
kono
parents:
diff changeset
212 null;
kono
parents:
diff changeset
213 end case;
kono
parents:
diff changeset
214 end if;
kono
parents:
diff changeset
215
kono
parents:
diff changeset
216 return;
kono
parents:
diff changeset
217
kono
parents:
diff changeset
218 when True =>
kono
parents:
diff changeset
219 case C is
kono
parents:
diff changeset
220
kono
parents:
diff changeset
221 -- One-letter switches
kono
parents:
diff changeset
222
kono
parents:
diff changeset
223 when 'a' | 'A' | 'b' | 'B' | 'c' | 'C' | 'E' | 'f' | 'F'
kono
parents:
diff changeset
224 | 'g' | 'h' | 'H' | 'I' | 'L' | 'N' | 'p' | 'P' | 'q'
kono
parents:
diff changeset
225 | 'Q' | 'r' | 's' | 'S' | 't' | 'u' | 'U' | 'v' | 'x'
kono
parents:
diff changeset
226 | 'X' | 'Z'
kono
parents:
diff changeset
227 =>
kono
parents:
diff changeset
228 Storing (First_Stored) := C;
kono
parents:
diff changeset
229 Add_Switch_Component
kono
parents:
diff changeset
230 (Storing (Storing'First .. First_Stored));
kono
parents:
diff changeset
231 Ptr := Ptr + 1;
kono
parents:
diff changeset
232
kono
parents:
diff changeset
233 -- One-letter switches followed by a positive number
kono
parents:
diff changeset
234
kono
parents:
diff changeset
235 when 'D' | 'G' | 'j' | 'k' | 'm' | 'T' =>
kono
parents:
diff changeset
236 Storing (First_Stored) := C;
kono
parents:
diff changeset
237 Last_Stored := First_Stored;
kono
parents:
diff changeset
238
kono
parents:
diff changeset
239 if Ptr <= Max and then Switch_Chars (Ptr) = '=' then
kono
parents:
diff changeset
240 Ptr := Ptr + 1;
kono
parents:
diff changeset
241 end if;
kono
parents:
diff changeset
242
kono
parents:
diff changeset
243 loop
kono
parents:
diff changeset
244 Ptr := Ptr + 1;
kono
parents:
diff changeset
245 exit when Ptr > Max
kono
parents:
diff changeset
246 or else Switch_Chars (Ptr) not in '0' .. '9';
kono
parents:
diff changeset
247 Last_Stored := Last_Stored + 1;
kono
parents:
diff changeset
248 Storing (Last_Stored) := Switch_Chars (Ptr);
kono
parents:
diff changeset
249 end loop;
kono
parents:
diff changeset
250
kono
parents:
diff changeset
251 Add_Switch_Component
kono
parents:
diff changeset
252 (Storing (Storing'First .. Last_Stored));
kono
parents:
diff changeset
253
kono
parents:
diff changeset
254 when 'd' =>
kono
parents:
diff changeset
255 Storing (First_Stored) := 'd';
kono
parents:
diff changeset
256
kono
parents:
diff changeset
257 while Ptr < Max loop
kono
parents:
diff changeset
258 Ptr := Ptr + 1;
kono
parents:
diff changeset
259 C := Switch_Chars (Ptr);
kono
parents:
diff changeset
260 exit when C = ASCII.NUL or else C = '/'
kono
parents:
diff changeset
261 or else C = '-';
kono
parents:
diff changeset
262
kono
parents:
diff changeset
263 if C in '1' .. '9' or else
kono
parents:
diff changeset
264 C in 'a' .. 'z' or else
kono
parents:
diff changeset
265 C in 'A' .. 'Z'
kono
parents:
diff changeset
266 then
kono
parents:
diff changeset
267 Storing (First_Stored + 1) := C;
kono
parents:
diff changeset
268 Add_Switch_Component
kono
parents:
diff changeset
269 (Storing (Storing'First .. First_Stored + 1));
kono
parents:
diff changeset
270
kono
parents:
diff changeset
271 else
kono
parents:
diff changeset
272 Last := 0;
kono
parents:
diff changeset
273 return;
kono
parents:
diff changeset
274 end if;
kono
parents:
diff changeset
275 end loop;
kono
parents:
diff changeset
276
kono
parents:
diff changeset
277 return;
kono
parents:
diff changeset
278
kono
parents:
diff changeset
279 when 'e' =>
kono
parents:
diff changeset
280
kono
parents:
diff changeset
281 -- Some of the gnate... switches are not stored
kono
parents:
diff changeset
282
kono
parents:
diff changeset
283 Storing (First_Stored) := 'e';
kono
parents:
diff changeset
284 Ptr := Ptr + 1;
kono
parents:
diff changeset
285
kono
parents:
diff changeset
286 if Ptr > Max then
kono
parents:
diff changeset
287 Last := 0;
kono
parents:
diff changeset
288 return;
kono
parents:
diff changeset
289
kono
parents:
diff changeset
290 else
kono
parents:
diff changeset
291 case Switch_Chars (Ptr) is
kono
parents:
diff changeset
292 when 'A' =>
kono
parents:
diff changeset
293 Ptr := Ptr + 1;
kono
parents:
diff changeset
294 Add_Switch_Component ("-gnateA");
kono
parents:
diff changeset
295
kono
parents:
diff changeset
296 when 'D' =>
kono
parents:
diff changeset
297 Storing (First_Stored + 1 ..
kono
parents:
diff changeset
298 First_Stored + Max - Ptr + 1) :=
kono
parents:
diff changeset
299 Switch_Chars (Ptr .. Max);
kono
parents:
diff changeset
300 Add_Switch_Component
kono
parents:
diff changeset
301 (Storing (Storing'First ..
kono
parents:
diff changeset
302 First_Stored + Max - Ptr + 1));
kono
parents:
diff changeset
303 Ptr := Max + 1;
kono
parents:
diff changeset
304
kono
parents:
diff changeset
305 when 'E' | 'F' | 'G' | 'S' | 'u' | 'V' | 'Y' =>
kono
parents:
diff changeset
306 Add_Switch_Component
kono
parents:
diff changeset
307 ("-gnate" & Switch_Chars (Ptr));
kono
parents:
diff changeset
308 Ptr := Ptr + 1;
kono
parents:
diff changeset
309
kono
parents:
diff changeset
310 when 'i' | 'I' =>
kono
parents:
diff changeset
311 declare
kono
parents:
diff changeset
312 First : constant Positive := Ptr;
kono
parents:
diff changeset
313
kono
parents:
diff changeset
314 begin
kono
parents:
diff changeset
315 Ptr := Ptr + 1;
kono
parents:
diff changeset
316
kono
parents:
diff changeset
317 if Ptr <= Max and then
kono
parents:
diff changeset
318 Switch_Chars (Ptr) = '='
kono
parents:
diff changeset
319 then
kono
parents:
diff changeset
320 Ptr := Ptr + 1;
kono
parents:
diff changeset
321 end if;
kono
parents:
diff changeset
322
kono
parents:
diff changeset
323 while Ptr <= Max and then
kono
parents:
diff changeset
324 Switch_Chars (Ptr) in '0' .. '9'
kono
parents:
diff changeset
325 loop
kono
parents:
diff changeset
326 Ptr := Ptr + 1;
kono
parents:
diff changeset
327 end loop;
kono
parents:
diff changeset
328
kono
parents:
diff changeset
329 Storing (First_Stored + 1 ..
kono
parents:
diff changeset
330 First_Stored + Ptr - First) :=
kono
parents:
diff changeset
331 Switch_Chars (First .. Ptr - 1);
kono
parents:
diff changeset
332 Add_Switch_Component
kono
parents:
diff changeset
333 (Storing (Storing'First ..
kono
parents:
diff changeset
334 First_Stored + Ptr - First));
kono
parents:
diff changeset
335 end;
kono
parents:
diff changeset
336
kono
parents:
diff changeset
337 when 'l' =>
kono
parents:
diff changeset
338 Ptr := Ptr + 1;
kono
parents:
diff changeset
339 Add_Switch_Component ("-gnatel");
kono
parents:
diff changeset
340
kono
parents:
diff changeset
341 when 'L' =>
kono
parents:
diff changeset
342 Ptr := Ptr + 1;
kono
parents:
diff changeset
343 Add_Switch_Component ("-gnateL");
kono
parents:
diff changeset
344
kono
parents:
diff changeset
345 when 'p' =>
kono
parents:
diff changeset
346 Ptr := Ptr + 1;
kono
parents:
diff changeset
347
kono
parents:
diff changeset
348 if Ptr = Max then
kono
parents:
diff changeset
349 Last := 0;
kono
parents:
diff changeset
350 return;
kono
parents:
diff changeset
351 end if;
kono
parents:
diff changeset
352
kono
parents:
diff changeset
353 if Switch_Chars (Ptr) = '=' then
kono
parents:
diff changeset
354 Ptr := Ptr + 1;
kono
parents:
diff changeset
355 end if;
kono
parents:
diff changeset
356
kono
parents:
diff changeset
357 -- To normalize, always put a '=' after
kono
parents:
diff changeset
358 -- -gnatep. Because that could lengthen the
kono
parents:
diff changeset
359 -- switch string, declare a local variable.
kono
parents:
diff changeset
360
kono
parents:
diff changeset
361 declare
kono
parents:
diff changeset
362 To_Store : String (1 .. Max - Ptr + 9);
kono
parents:
diff changeset
363 begin
kono
parents:
diff changeset
364 To_Store (1 .. 8) := "-gnatep=";
kono
parents:
diff changeset
365 To_Store (9 .. Max - Ptr + 9) :=
kono
parents:
diff changeset
366 Switch_Chars (Ptr .. Max);
kono
parents:
diff changeset
367 Add_Switch_Component (To_Store);
kono
parents:
diff changeset
368 end;
kono
parents:
diff changeset
369
kono
parents:
diff changeset
370 return;
kono
parents:
diff changeset
371
kono
parents:
diff changeset
372 when others =>
kono
parents:
diff changeset
373 Last := 0;
kono
parents:
diff changeset
374 return;
kono
parents:
diff changeset
375 end case;
kono
parents:
diff changeset
376 end if;
kono
parents:
diff changeset
377
kono
parents:
diff changeset
378 when 'i' =>
kono
parents:
diff changeset
379 Storing (First_Stored) := 'i';
kono
parents:
diff changeset
380
kono
parents:
diff changeset
381 Ptr := Ptr + 1;
kono
parents:
diff changeset
382
kono
parents:
diff changeset
383 if Ptr > Max then
kono
parents:
diff changeset
384 Last := 0;
kono
parents:
diff changeset
385 return;
kono
parents:
diff changeset
386 end if;
kono
parents:
diff changeset
387
kono
parents:
diff changeset
388 C := Switch_Chars (Ptr);
kono
parents:
diff changeset
389
kono
parents:
diff changeset
390 if C in '1' .. '5'
kono
parents:
diff changeset
391 or else C = '8'
kono
parents:
diff changeset
392 or else C = 'p'
kono
parents:
diff changeset
393 or else C = 'f'
kono
parents:
diff changeset
394 or else C = 'n'
kono
parents:
diff changeset
395 or else C = 'w'
kono
parents:
diff changeset
396 then
kono
parents:
diff changeset
397 Storing (First_Stored + 1) := C;
kono
parents:
diff changeset
398 Add_Switch_Component
kono
parents:
diff changeset
399 (Storing (Storing'First .. First_Stored + 1));
kono
parents:
diff changeset
400 Ptr := Ptr + 1;
kono
parents:
diff changeset
401
kono
parents:
diff changeset
402 else
kono
parents:
diff changeset
403 Last := 0;
kono
parents:
diff changeset
404 return;
kono
parents:
diff changeset
405 end if;
kono
parents:
diff changeset
406
kono
parents:
diff changeset
407 -- -gnatl may be -gnatl=<file name>
kono
parents:
diff changeset
408
kono
parents:
diff changeset
409 when 'l' =>
kono
parents:
diff changeset
410 Ptr := Ptr + 1;
kono
parents:
diff changeset
411
kono
parents:
diff changeset
412 if Ptr > Max or else Switch_Chars (Ptr) /= '=' then
kono
parents:
diff changeset
413 Add_Switch_Component ("-gnatl");
kono
parents:
diff changeset
414
kono
parents:
diff changeset
415 else
kono
parents:
diff changeset
416 Add_Switch_Component
kono
parents:
diff changeset
417 ("-gnatl" & Switch_Chars (Ptr .. Max));
kono
parents:
diff changeset
418 return;
kono
parents:
diff changeset
419 end if;
kono
parents:
diff changeset
420
kono
parents:
diff changeset
421 -- -gnatn may be -gnatn, -gnatn1, or -gnatn2
kono
parents:
diff changeset
422
kono
parents:
diff changeset
423 when 'n' =>
kono
parents:
diff changeset
424 Last_Stored := First_Stored;
kono
parents:
diff changeset
425 Storing (Last_Stored) := 'n';
kono
parents:
diff changeset
426 Ptr := Ptr + 1;
kono
parents:
diff changeset
427
kono
parents:
diff changeset
428 if Ptr <= Max
kono
parents:
diff changeset
429 and then Switch_Chars (Ptr) in '1' .. '2'
kono
parents:
diff changeset
430 then
kono
parents:
diff changeset
431 Last_Stored := Last_Stored + 1;
kono
parents:
diff changeset
432 Storing (Last_Stored) := Switch_Chars (Ptr);
kono
parents:
diff changeset
433 Ptr := Ptr + 1;
kono
parents:
diff changeset
434 end if;
kono
parents:
diff changeset
435
kono
parents:
diff changeset
436 Add_Switch_Component
kono
parents:
diff changeset
437 (Storing (Storing'First .. Last_Stored));
kono
parents:
diff changeset
438
kono
parents:
diff changeset
439 -- -gnato may be -gnatox or -gnatoxx, with x=0/1/2/3
kono
parents:
diff changeset
440
kono
parents:
diff changeset
441 when 'o' =>
kono
parents:
diff changeset
442 Last_Stored := First_Stored;
kono
parents:
diff changeset
443 Storing (Last_Stored) := 'o';
kono
parents:
diff changeset
444 Ptr := Ptr + 1;
kono
parents:
diff changeset
445
kono
parents:
diff changeset
446 if Ptr <= Max
kono
parents:
diff changeset
447 and then Switch_Chars (Ptr) in '0' .. '3'
kono
parents:
diff changeset
448 then
kono
parents:
diff changeset
449 Last_Stored := Last_Stored + 1;
kono
parents:
diff changeset
450 Storing (Last_Stored) := Switch_Chars (Ptr);
kono
parents:
diff changeset
451 Ptr := Ptr + 1;
kono
parents:
diff changeset
452
kono
parents:
diff changeset
453 if Ptr <= Max
kono
parents:
diff changeset
454 and then Switch_Chars (Ptr) in '0' .. '3'
kono
parents:
diff changeset
455 then
kono
parents:
diff changeset
456 Last_Stored := Last_Stored + 1;
kono
parents:
diff changeset
457 Storing (Last_Stored) := Switch_Chars (Ptr);
kono
parents:
diff changeset
458 Ptr := Ptr + 1;
kono
parents:
diff changeset
459 end if;
kono
parents:
diff changeset
460 end if;
kono
parents:
diff changeset
461
kono
parents:
diff changeset
462 Add_Switch_Component
kono
parents:
diff changeset
463 (Storing (Storing'First .. Last_Stored));
kono
parents:
diff changeset
464
kono
parents:
diff changeset
465 -- -gnatR may be followed by '0', '1', '2' or '3',
kono
parents:
diff changeset
466 -- then by 's'
kono
parents:
diff changeset
467
kono
parents:
diff changeset
468 when 'R' =>
kono
parents:
diff changeset
469 Last_Stored := First_Stored;
kono
parents:
diff changeset
470 Storing (Last_Stored) := 'R';
kono
parents:
diff changeset
471 Ptr := Ptr + 1;
kono
parents:
diff changeset
472
kono
parents:
diff changeset
473 if Ptr <= Max
kono
parents:
diff changeset
474 and then Switch_Chars (Ptr) in '0' .. '9'
kono
parents:
diff changeset
475 then
kono
parents:
diff changeset
476 C := Switch_Chars (Ptr);
kono
parents:
diff changeset
477
kono
parents:
diff changeset
478 if C in '4' .. '9' then
kono
parents:
diff changeset
479 Last := 0;
kono
parents:
diff changeset
480 return;
kono
parents:
diff changeset
481
kono
parents:
diff changeset
482 else
kono
parents:
diff changeset
483 Last_Stored := Last_Stored + 1;
kono
parents:
diff changeset
484 Storing (Last_Stored) := C;
kono
parents:
diff changeset
485 Ptr := Ptr + 1;
kono
parents:
diff changeset
486
kono
parents:
diff changeset
487 if Ptr <= Max
kono
parents:
diff changeset
488 and then Switch_Chars (Ptr) = 's'
kono
parents:
diff changeset
489 then
kono
parents:
diff changeset
490 Last_Stored := Last_Stored + 1;
kono
parents:
diff changeset
491 Storing (Last_Stored) := 's';
kono
parents:
diff changeset
492 Ptr := Ptr + 1;
kono
parents:
diff changeset
493 end if;
kono
parents:
diff changeset
494 end if;
kono
parents:
diff changeset
495 end if;
kono
parents:
diff changeset
496
kono
parents:
diff changeset
497 Add_Switch_Component
kono
parents:
diff changeset
498 (Storing (Storing'First .. Last_Stored));
kono
parents:
diff changeset
499
kono
parents:
diff changeset
500 -- -gnatWx, x = 'h'. 'u', 's', 'e', '8' or 'b'
kono
parents:
diff changeset
501
kono
parents:
diff changeset
502 when 'W' =>
kono
parents:
diff changeset
503 Storing (First_Stored) := 'W';
kono
parents:
diff changeset
504 Ptr := Ptr + 1;
kono
parents:
diff changeset
505
kono
parents:
diff changeset
506 if Ptr <= Max then
kono
parents:
diff changeset
507 case Switch_Chars (Ptr) is
kono
parents:
diff changeset
508 when 'h' | 'u' | 's' | 'e' | '8' | 'b' =>
kono
parents:
diff changeset
509 Storing (First_Stored + 1) := Switch_Chars (Ptr);
kono
parents:
diff changeset
510 Add_Switch_Component
kono
parents:
diff changeset
511 (Storing (Storing'First .. First_Stored + 1));
kono
parents:
diff changeset
512 Ptr := Ptr + 1;
kono
parents:
diff changeset
513
kono
parents:
diff changeset
514 when others =>
kono
parents:
diff changeset
515 Last := 0;
kono
parents:
diff changeset
516 return;
kono
parents:
diff changeset
517 end case;
kono
parents:
diff changeset
518 end if;
kono
parents:
diff changeset
519
kono
parents:
diff changeset
520 -- Multiple switches
kono
parents:
diff changeset
521
kono
parents:
diff changeset
522 when 'V' | 'w' | 'y' =>
kono
parents:
diff changeset
523 Storing (First_Stored) := C;
kono
parents:
diff changeset
524 Ptr := Ptr + 1;
kono
parents:
diff changeset
525
kono
parents:
diff changeset
526 if Ptr > Max then
kono
parents:
diff changeset
527 if C = 'y' then
kono
parents:
diff changeset
528 Add_Switch_Component
kono
parents:
diff changeset
529 (Storing (Storing'First .. First_Stored));
kono
parents:
diff changeset
530
kono
parents:
diff changeset
531 else
kono
parents:
diff changeset
532 Last := 0;
kono
parents:
diff changeset
533 return;
kono
parents:
diff changeset
534 end if;
kono
parents:
diff changeset
535 end if;
kono
parents:
diff changeset
536
kono
parents:
diff changeset
537 -- Loop through remaining switch characters in string
kono
parents:
diff changeset
538
kono
parents:
diff changeset
539 while Ptr <= Max loop
kono
parents:
diff changeset
540 C := Switch_Chars (Ptr);
kono
parents:
diff changeset
541 Ptr := Ptr + 1;
kono
parents:
diff changeset
542
kono
parents:
diff changeset
543 -- -gnatyMxxx
kono
parents:
diff changeset
544
kono
parents:
diff changeset
545 if C = 'M' and then Storing (First_Stored) = 'y' then
kono
parents:
diff changeset
546 Last_Stored := First_Stored + 1;
kono
parents:
diff changeset
547 Storing (Last_Stored) := 'M';
kono
parents:
diff changeset
548 while Ptr <= Max loop
kono
parents:
diff changeset
549 C := Switch_Chars (Ptr);
kono
parents:
diff changeset
550 exit when C not in '0' .. '9';
kono
parents:
diff changeset
551 Last_Stored := Last_Stored + 1;
kono
parents:
diff changeset
552 Storing (Last_Stored) := C;
kono
parents:
diff changeset
553 Ptr := Ptr + 1;
kono
parents:
diff changeset
554 end loop;
kono
parents:
diff changeset
555
kono
parents:
diff changeset
556 -- If there is no digit after -gnatyM,
kono
parents:
diff changeset
557 -- the switch is invalid.
kono
parents:
diff changeset
558
kono
parents:
diff changeset
559 if Last_Stored = First_Stored + 1 then
kono
parents:
diff changeset
560 Last := 0;
kono
parents:
diff changeset
561 return;
kono
parents:
diff changeset
562
kono
parents:
diff changeset
563 else
kono
parents:
diff changeset
564 Add_Switch_Component
kono
parents:
diff changeset
565 (Storing (Storing'First .. Last_Stored));
kono
parents:
diff changeset
566 end if;
kono
parents:
diff changeset
567
kono
parents:
diff changeset
568 -- --gnatx.x
kono
parents:
diff changeset
569
kono
parents:
diff changeset
570 elsif C = '.' and then Ptr <= Max then
kono
parents:
diff changeset
571 Storing (First_Stored + 1) := '.';
kono
parents:
diff changeset
572 Storing (First_Stored + 2) := Switch_Chars (Ptr);
kono
parents:
diff changeset
573 Ptr := Ptr + 1;
kono
parents:
diff changeset
574 Add_Switch_Component
kono
parents:
diff changeset
575 (Storing (Storing'First .. First_Stored + 2));
kono
parents:
diff changeset
576
kono
parents:
diff changeset
577 -- All other switches are -gnatxx
kono
parents:
diff changeset
578
kono
parents:
diff changeset
579 else
kono
parents:
diff changeset
580 Storing (First_Stored + 1) := C;
kono
parents:
diff changeset
581 Add_Switch_Component
kono
parents:
diff changeset
582 (Storing (Storing'First .. First_Stored + 1));
kono
parents:
diff changeset
583 end if;
kono
parents:
diff changeset
584 end loop;
kono
parents:
diff changeset
585
kono
parents:
diff changeset
586 -- -gnat95 -gnat05
kono
parents:
diff changeset
587
kono
parents:
diff changeset
588 when '0' | '9' =>
kono
parents:
diff changeset
589 Last_Stored := First_Stored;
kono
parents:
diff changeset
590 Storing (Last_Stored) := C;
kono
parents:
diff changeset
591 Ptr := Ptr + 1;
kono
parents:
diff changeset
592
kono
parents:
diff changeset
593 if Ptr /= Max or else Switch_Chars (Ptr) /= '5' then
kono
parents:
diff changeset
594
kono
parents:
diff changeset
595 -- Invalid switch
kono
parents:
diff changeset
596
kono
parents:
diff changeset
597 Last := 0;
kono
parents:
diff changeset
598 return;
kono
parents:
diff changeset
599
kono
parents:
diff changeset
600 else
kono
parents:
diff changeset
601 Last_Stored := Last_Stored + 1;
kono
parents:
diff changeset
602 Storing (Last_Stored) := '5';
kono
parents:
diff changeset
603 Add_Switch_Component
kono
parents:
diff changeset
604 (Storing (Storing'First .. Last_Stored));
kono
parents:
diff changeset
605 Ptr := Ptr + 1;
kono
parents:
diff changeset
606 end if;
kono
parents:
diff changeset
607
kono
parents:
diff changeset
608 -- -gnat12
kono
parents:
diff changeset
609
kono
parents:
diff changeset
610 when '1' =>
kono
parents:
diff changeset
611 Last_Stored := First_Stored;
kono
parents:
diff changeset
612 Storing (Last_Stored) := C;
kono
parents:
diff changeset
613 Ptr := Ptr + 1;
kono
parents:
diff changeset
614
kono
parents:
diff changeset
615 if Ptr /= Max or else Switch_Chars (Ptr) /= '2' then
kono
parents:
diff changeset
616
kono
parents:
diff changeset
617 -- Invalid switch
kono
parents:
diff changeset
618
kono
parents:
diff changeset
619 Last := 0;
kono
parents:
diff changeset
620 return;
kono
parents:
diff changeset
621
kono
parents:
diff changeset
622 else
kono
parents:
diff changeset
623 Last_Stored := Last_Stored + 1;
kono
parents:
diff changeset
624 Storing (Last_Stored) := '2';
kono
parents:
diff changeset
625 Add_Switch_Component
kono
parents:
diff changeset
626 (Storing (Storing'First .. Last_Stored));
kono
parents:
diff changeset
627 Ptr := Ptr + 1;
kono
parents:
diff changeset
628 end if;
kono
parents:
diff changeset
629
kono
parents:
diff changeset
630 -- -gnat2005 -gnat2012
kono
parents:
diff changeset
631
kono
parents:
diff changeset
632 when '2' =>
kono
parents:
diff changeset
633 if Ptr + 3 /= Max then
kono
parents:
diff changeset
634 Last := 0;
kono
parents:
diff changeset
635 return;
kono
parents:
diff changeset
636
kono
parents:
diff changeset
637 elsif Switch_Chars (Ptr + 1 .. Ptr + 3) = "005" then
kono
parents:
diff changeset
638 Last_Stored := First_Stored + 3;
kono
parents:
diff changeset
639 Storing (First_Stored .. Last_Stored) := "2005";
kono
parents:
diff changeset
640 Add_Switch_Component
kono
parents:
diff changeset
641 (Storing (Storing'First .. Last_Stored));
kono
parents:
diff changeset
642 Ptr := Max + 1;
kono
parents:
diff changeset
643
kono
parents:
diff changeset
644 elsif Switch_Chars (Ptr + 1 .. Ptr + 3) = "012" then
kono
parents:
diff changeset
645 Last_Stored := First_Stored + 3;
kono
parents:
diff changeset
646 Storing (First_Stored .. Last_Stored) := "2012";
kono
parents:
diff changeset
647 Add_Switch_Component
kono
parents:
diff changeset
648 (Storing (Storing'First .. Last_Stored));
kono
parents:
diff changeset
649 Ptr := Max + 1;
kono
parents:
diff changeset
650
kono
parents:
diff changeset
651 else
kono
parents:
diff changeset
652
kono
parents:
diff changeset
653 -- Invalid switch
kono
parents:
diff changeset
654
kono
parents:
diff changeset
655 Last := 0;
kono
parents:
diff changeset
656 return;
kono
parents:
diff changeset
657
kono
parents:
diff changeset
658 end if;
kono
parents:
diff changeset
659
kono
parents:
diff changeset
660 -- -gnat83
kono
parents:
diff changeset
661
kono
parents:
diff changeset
662 when '8' =>
kono
parents:
diff changeset
663 Last_Stored := First_Stored;
kono
parents:
diff changeset
664 Storing (Last_Stored) := '8';
kono
parents:
diff changeset
665 Ptr := Ptr + 1;
kono
parents:
diff changeset
666
kono
parents:
diff changeset
667 if Ptr /= Max or else Switch_Chars (Ptr) /= '3' then
kono
parents:
diff changeset
668
kono
parents:
diff changeset
669 -- Invalid switch
kono
parents:
diff changeset
670
kono
parents:
diff changeset
671 Last := 0;
kono
parents:
diff changeset
672 return;
kono
parents:
diff changeset
673
kono
parents:
diff changeset
674 else
kono
parents:
diff changeset
675 Last_Stored := Last_Stored + 1;
kono
parents:
diff changeset
676 Storing (Last_Stored) := '3';
kono
parents:
diff changeset
677 Add_Switch_Component
kono
parents:
diff changeset
678 (Storing (Storing'First .. Last_Stored));
kono
parents:
diff changeset
679 Ptr := Ptr + 1;
kono
parents:
diff changeset
680 end if;
kono
parents:
diff changeset
681
kono
parents:
diff changeset
682 -- Not a valid switch
kono
parents:
diff changeset
683
kono
parents:
diff changeset
684 when others =>
kono
parents:
diff changeset
685 Last := 0;
kono
parents:
diff changeset
686 return;
kono
parents:
diff changeset
687 end case;
kono
parents:
diff changeset
688 end case;
kono
parents:
diff changeset
689 end loop;
kono
parents:
diff changeset
690 end Normalize_Compiler_Switches;
kono
parents:
diff changeset
691
kono
parents:
diff changeset
692 function Normalize_Compiler_Switches
kono
parents:
diff changeset
693 (Switch_Chars : String) return Argument_List
kono
parents:
diff changeset
694 is
kono
parents:
diff changeset
695 Last : Natural;
kono
parents:
diff changeset
696
kono
parents:
diff changeset
697 begin
kono
parents:
diff changeset
698 Normalize_Compiler_Switches (Switch_Chars, Global_Switches, Last);
kono
parents:
diff changeset
699
kono
parents:
diff changeset
700 if Last = 0 then
kono
parents:
diff changeset
701 return (1 .. 0 => null);
kono
parents:
diff changeset
702 else
kono
parents:
diff changeset
703 return Global_Switches (Global_Switches'First .. Last);
kono
parents:
diff changeset
704 end if;
kono
parents:
diff changeset
705 end Normalize_Compiler_Switches;
kono
parents:
diff changeset
706
kono
parents:
diff changeset
707 ------------------------
kono
parents:
diff changeset
708 -- Scan_Make_Switches --
kono
parents:
diff changeset
709 ------------------------
kono
parents:
diff changeset
710
kono
parents:
diff changeset
711 procedure Scan_Make_Switches
kono
parents:
diff changeset
712 (Switch_Chars : String;
kono
parents:
diff changeset
713 Success : out Boolean)
kono
parents:
diff changeset
714 is
kono
parents:
diff changeset
715 Ptr : Integer := Switch_Chars'First;
kono
parents:
diff changeset
716 Max : constant Integer := Switch_Chars'Last;
kono
parents:
diff changeset
717 C : Character := ' ';
kono
parents:
diff changeset
718
kono
parents:
diff changeset
719 begin
kono
parents:
diff changeset
720 -- Assume a good switch
kono
parents:
diff changeset
721
kono
parents:
diff changeset
722 Success := True;
kono
parents:
diff changeset
723
kono
parents:
diff changeset
724 -- Skip past the initial character (must be the switch character)
kono
parents:
diff changeset
725
kono
parents:
diff changeset
726 if Ptr = Max then
kono
parents:
diff changeset
727 Bad_Switch (Switch_Chars);
kono
parents:
diff changeset
728
kono
parents:
diff changeset
729 else
kono
parents:
diff changeset
730 Ptr := Ptr + 1;
kono
parents:
diff changeset
731 end if;
kono
parents:
diff changeset
732
kono
parents:
diff changeset
733 -- A little check, "gnat" at the start of a switch is for the compiler
kono
parents:
diff changeset
734
kono
parents:
diff changeset
735 if Switch_Chars'Length >= Ptr + 3
kono
parents:
diff changeset
736 and then Switch_Chars (Ptr .. Ptr + 3) = "gnat"
kono
parents:
diff changeset
737 then
kono
parents:
diff changeset
738 Success := False;
kono
parents:
diff changeset
739 return;
kono
parents:
diff changeset
740 end if;
kono
parents:
diff changeset
741
kono
parents:
diff changeset
742 C := Switch_Chars (Ptr);
kono
parents:
diff changeset
743
kono
parents:
diff changeset
744 -- Multiple character switches
kono
parents:
diff changeset
745
kono
parents:
diff changeset
746 -- To preserve building gnat_util, it is not possible to use the
kono
parents:
diff changeset
747 -- constant Strings declare in Make_Util, as Make_Util is not in
kono
parents:
diff changeset
748 -- gnat_util.
kono
parents:
diff changeset
749
kono
parents:
diff changeset
750 if Switch_Chars'Length > 2 then
kono
parents:
diff changeset
751 if Switch_Chars = "--create-missing-dirs" then
kono
parents:
diff changeset
752 Setup_Projects := True;
kono
parents:
diff changeset
753
kono
parents:
diff changeset
754 elsif Switch_Chars'Length > Subdirs_Option'Length
kono
parents:
diff changeset
755 and then
kono
parents:
diff changeset
756 Switch_Chars
kono
parents:
diff changeset
757 (Switch_Chars'First ..
kono
parents:
diff changeset
758 Switch_Chars'First + Subdirs_Option'Length - 1) =
kono
parents:
diff changeset
759 Subdirs_Option
kono
parents:
diff changeset
760 then
kono
parents:
diff changeset
761 Subdirs :=
kono
parents:
diff changeset
762 new String'(Switch_Chars
kono
parents:
diff changeset
763 (Switch_Chars'First + Subdirs_Option'Length ..
kono
parents:
diff changeset
764 Switch_Chars'Last));
kono
parents:
diff changeset
765
kono
parents:
diff changeset
766 elsif Switch_Chars = "--unchecked-shared-lib-imports" then
kono
parents:
diff changeset
767 Opt.Unchecked_Shared_Lib_Imports := True;
kono
parents:
diff changeset
768
kono
parents:
diff changeset
769 elsif Switch_Chars = "--single-compile-per-obj-dir" then
kono
parents:
diff changeset
770 Opt.One_Compilation_Per_Obj_Dir := True;
kono
parents:
diff changeset
771
kono
parents:
diff changeset
772 elsif Switch_Chars = "--no-exit-message" then
kono
parents:
diff changeset
773 Opt.No_Exit_Message := True;
kono
parents:
diff changeset
774
kono
parents:
diff changeset
775 elsif Switch_Chars = "--keep-temp-files" then
kono
parents:
diff changeset
776 Opt.Keep_Temporary_Files := True;
kono
parents:
diff changeset
777
kono
parents:
diff changeset
778 elsif Switch_Chars (Ptr) = '-' then
kono
parents:
diff changeset
779 Bad_Switch (Switch_Chars);
kono
parents:
diff changeset
780
kono
parents:
diff changeset
781 elsif Switch_Chars'Length > 3
kono
parents:
diff changeset
782 and then Switch_Chars (Ptr .. Ptr + 1) = "aP"
kono
parents:
diff changeset
783 then
kono
parents:
diff changeset
784 null;
kono
parents:
diff changeset
785 -- This is only used by gprbuild
kono
parents:
diff changeset
786
kono
parents:
diff changeset
787 elsif C = 'v' and then Switch_Chars'Length = 3 then
kono
parents:
diff changeset
788 Ptr := Ptr + 1;
kono
parents:
diff changeset
789 Verbose_Mode := True;
kono
parents:
diff changeset
790
kono
parents:
diff changeset
791 case Switch_Chars (Ptr) is
kono
parents:
diff changeset
792 when 'l' => Verbosity_Level := Opt.Low;
kono
parents:
diff changeset
793 when 'm' => Verbosity_Level := Opt.Medium;
kono
parents:
diff changeset
794 when 'h' => Verbosity_Level := Opt.High;
kono
parents:
diff changeset
795 when others => Success := False;
kono
parents:
diff changeset
796 end case;
kono
parents:
diff changeset
797
kono
parents:
diff changeset
798 elsif C = 'd' then
kono
parents:
diff changeset
799
kono
parents:
diff changeset
800 -- Note: for the debug switch, the remaining characters in this
kono
parents:
diff changeset
801 -- switch field must all be debug flags, since all valid switch
kono
parents:
diff changeset
802 -- characters are also valid debug characters. This switch is not
kono
parents:
diff changeset
803 -- documented on purpose because it is only used by the
kono
parents:
diff changeset
804 -- implementors.
kono
parents:
diff changeset
805
kono
parents:
diff changeset
806 -- Loop to scan out debug flags
kono
parents:
diff changeset
807
kono
parents:
diff changeset
808 while Ptr < Max loop
kono
parents:
diff changeset
809 Ptr := Ptr + 1;
kono
parents:
diff changeset
810 C := Switch_Chars (Ptr);
kono
parents:
diff changeset
811
kono
parents:
diff changeset
812 if C in 'a' .. 'z' or else C in 'A' .. 'Z' then
kono
parents:
diff changeset
813 Set_Debug_Flag (C);
kono
parents:
diff changeset
814 else
kono
parents:
diff changeset
815 Bad_Switch (Switch_Chars);
kono
parents:
diff changeset
816 end if;
kono
parents:
diff changeset
817 end loop;
kono
parents:
diff changeset
818
kono
parents:
diff changeset
819 elsif C = 'e' then
kono
parents:
diff changeset
820 Ptr := Ptr + 1;
kono
parents:
diff changeset
821
kono
parents:
diff changeset
822 case Switch_Chars (Ptr) is
kono
parents:
diff changeset
823
kono
parents:
diff changeset
824 -- Processing for eI switch
kono
parents:
diff changeset
825
kono
parents:
diff changeset
826 when 'I' =>
kono
parents:
diff changeset
827 Ptr := Ptr + 1;
kono
parents:
diff changeset
828 Scan_Pos (Switch_Chars, Max, Ptr, Main_Index, C);
kono
parents:
diff changeset
829
kono
parents:
diff changeset
830 if Ptr <= Max then
kono
parents:
diff changeset
831 Bad_Switch (Switch_Chars);
kono
parents:
diff changeset
832 end if;
kono
parents:
diff changeset
833
kono
parents:
diff changeset
834 -- Processing for eL switch
kono
parents:
diff changeset
835
kono
parents:
diff changeset
836 when 'L' =>
kono
parents:
diff changeset
837 if Ptr /= Max then
kono
parents:
diff changeset
838 Bad_Switch (Switch_Chars);
kono
parents:
diff changeset
839
kono
parents:
diff changeset
840 else
kono
parents:
diff changeset
841 Follow_Links_For_Files := True;
kono
parents:
diff changeset
842 Follow_Links_For_Dirs := True;
kono
parents:
diff changeset
843 end if;
kono
parents:
diff changeset
844
kono
parents:
diff changeset
845 -- Processing for eS switch
kono
parents:
diff changeset
846
kono
parents:
diff changeset
847 when 'S' =>
kono
parents:
diff changeset
848 if Ptr /= Max then
kono
parents:
diff changeset
849 Bad_Switch (Switch_Chars);
kono
parents:
diff changeset
850
kono
parents:
diff changeset
851 else
kono
parents:
diff changeset
852 Commands_To_Stdout := True;
kono
parents:
diff changeset
853 end if;
kono
parents:
diff changeset
854
kono
parents:
diff changeset
855 when others =>
kono
parents:
diff changeset
856 Bad_Switch (Switch_Chars);
kono
parents:
diff changeset
857 end case;
kono
parents:
diff changeset
858
kono
parents:
diff changeset
859 elsif C = 'j' then
kono
parents:
diff changeset
860 Ptr := Ptr + 1;
kono
parents:
diff changeset
861
kono
parents:
diff changeset
862 declare
kono
parents:
diff changeset
863 Max_Proc : Nat;
kono
parents:
diff changeset
864
kono
parents:
diff changeset
865 begin
kono
parents:
diff changeset
866 Scan_Nat (Switch_Chars, Max, Ptr, Max_Proc, C);
kono
parents:
diff changeset
867
kono
parents:
diff changeset
868 if Ptr <= Max then
kono
parents:
diff changeset
869 Bad_Switch (Switch_Chars);
kono
parents:
diff changeset
870
kono
parents:
diff changeset
871 else
kono
parents:
diff changeset
872 if Max_Proc = 0 then
kono
parents:
diff changeset
873 Max_Proc := Nat (Number_Of_CPUs);
kono
parents:
diff changeset
874
kono
parents:
diff changeset
875 if Max_Proc = 0 then
kono
parents:
diff changeset
876 Max_Proc := 1;
kono
parents:
diff changeset
877 end if;
kono
parents:
diff changeset
878 end if;
kono
parents:
diff changeset
879
kono
parents:
diff changeset
880 Maximum_Processes := Positive (Max_Proc);
kono
parents:
diff changeset
881 end if;
kono
parents:
diff changeset
882 end;
kono
parents:
diff changeset
883
kono
parents:
diff changeset
884 elsif C = 'w' and then Switch_Chars'Length = 3 then
kono
parents:
diff changeset
885 Ptr := Ptr + 1;
kono
parents:
diff changeset
886
kono
parents:
diff changeset
887 if Switch_Chars = "-we" then
kono
parents:
diff changeset
888 Warning_Mode := Treat_As_Error;
kono
parents:
diff changeset
889
kono
parents:
diff changeset
890 elsif Switch_Chars = "-wn" then
kono
parents:
diff changeset
891 Warning_Mode := Normal;
kono
parents:
diff changeset
892
kono
parents:
diff changeset
893 elsif Switch_Chars = "-ws" then
kono
parents:
diff changeset
894 Warning_Mode := Suppress;
kono
parents:
diff changeset
895
kono
parents:
diff changeset
896 else
kono
parents:
diff changeset
897 Success := False;
kono
parents:
diff changeset
898 end if;
kono
parents:
diff changeset
899
kono
parents:
diff changeset
900 else
kono
parents:
diff changeset
901 Success := False;
kono
parents:
diff changeset
902 end if;
kono
parents:
diff changeset
903
kono
parents:
diff changeset
904 -- Single-character switches
kono
parents:
diff changeset
905
kono
parents:
diff changeset
906 else
kono
parents:
diff changeset
907 Check_Switch : begin
kono
parents:
diff changeset
908 case C is
kono
parents:
diff changeset
909 when 'a' =>
kono
parents:
diff changeset
910 Check_Readonly_Files := True;
kono
parents:
diff changeset
911
kono
parents:
diff changeset
912 -- Processing for b switch
kono
parents:
diff changeset
913
kono
parents:
diff changeset
914 when 'b' =>
kono
parents:
diff changeset
915 Bind_Only := True;
kono
parents:
diff changeset
916 Make_Steps := True;
kono
parents:
diff changeset
917
kono
parents:
diff changeset
918 -- Processing for B switch
kono
parents:
diff changeset
919
kono
parents:
diff changeset
920 when 'B' =>
kono
parents:
diff changeset
921 Build_Bind_And_Link_Full_Project := True;
kono
parents:
diff changeset
922
kono
parents:
diff changeset
923 -- Processing for c switch
kono
parents:
diff changeset
924
kono
parents:
diff changeset
925 when 'c' =>
kono
parents:
diff changeset
926 Compile_Only := True;
kono
parents:
diff changeset
927 Make_Steps := True;
kono
parents:
diff changeset
928
kono
parents:
diff changeset
929 -- Processing for C switch
kono
parents:
diff changeset
930
kono
parents:
diff changeset
931 when 'C' =>
kono
parents:
diff changeset
932 Opt.Create_Mapping_File := True;
kono
parents:
diff changeset
933
kono
parents:
diff changeset
934 -- Processing for D switch
kono
parents:
diff changeset
935
kono
parents:
diff changeset
936 when 'D' =>
kono
parents:
diff changeset
937 if Object_Directory_Present then
kono
parents:
diff changeset
938 Osint.Fail ("duplicate -D switch");
kono
parents:
diff changeset
939
kono
parents:
diff changeset
940 else
kono
parents:
diff changeset
941 Object_Directory_Present := True;
kono
parents:
diff changeset
942 end if;
kono
parents:
diff changeset
943
kono
parents:
diff changeset
944 -- Processing for f switch
kono
parents:
diff changeset
945
kono
parents:
diff changeset
946 when 'f' =>
kono
parents:
diff changeset
947 Force_Compilations := True;
kono
parents:
diff changeset
948
kono
parents:
diff changeset
949 -- Processing for F switch
kono
parents:
diff changeset
950
kono
parents:
diff changeset
951 when 'F' =>
kono
parents:
diff changeset
952 Full_Path_Name_For_Brief_Errors := True;
kono
parents:
diff changeset
953
kono
parents:
diff changeset
954 -- Processing for h switch
kono
parents:
diff changeset
955
kono
parents:
diff changeset
956 when 'h' =>
kono
parents:
diff changeset
957 Usage_Requested := True;
kono
parents:
diff changeset
958
kono
parents:
diff changeset
959 -- Processing for i switch
kono
parents:
diff changeset
960
kono
parents:
diff changeset
961 when 'i' =>
kono
parents:
diff changeset
962 In_Place_Mode := True;
kono
parents:
diff changeset
963
kono
parents:
diff changeset
964 -- Processing for j switch
kono
parents:
diff changeset
965
kono
parents:
diff changeset
966 when 'j' =>
kono
parents:
diff changeset
967 -- -j not followed by a number is an error
kono
parents:
diff changeset
968
kono
parents:
diff changeset
969 Bad_Switch (Switch_Chars);
kono
parents:
diff changeset
970
kono
parents:
diff changeset
971 -- Processing for k switch
kono
parents:
diff changeset
972
kono
parents:
diff changeset
973 when 'k' =>
kono
parents:
diff changeset
974 Keep_Going := True;
kono
parents:
diff changeset
975
kono
parents:
diff changeset
976 -- Processing for l switch
kono
parents:
diff changeset
977
kono
parents:
diff changeset
978 when 'l' =>
kono
parents:
diff changeset
979 Link_Only := True;
kono
parents:
diff changeset
980 Make_Steps := True;
kono
parents:
diff changeset
981
kono
parents:
diff changeset
982 -- Processing for M switch
kono
parents:
diff changeset
983
kono
parents:
diff changeset
984 when 'M' =>
kono
parents:
diff changeset
985 List_Dependencies := True;
kono
parents:
diff changeset
986
kono
parents:
diff changeset
987 -- Processing for n switch
kono
parents:
diff changeset
988
kono
parents:
diff changeset
989 when 'n' =>
kono
parents:
diff changeset
990 Do_Not_Execute := True;
kono
parents:
diff changeset
991
kono
parents:
diff changeset
992 -- Processing for o switch
kono
parents:
diff changeset
993
kono
parents:
diff changeset
994 when 'o' =>
kono
parents:
diff changeset
995 if Output_File_Name_Present then
kono
parents:
diff changeset
996 Osint.Fail ("duplicate -o switch");
kono
parents:
diff changeset
997 else
kono
parents:
diff changeset
998 Output_File_Name_Present := True;
kono
parents:
diff changeset
999 end if;
kono
parents:
diff changeset
1000
kono
parents:
diff changeset
1001 -- Processing for p switch
kono
parents:
diff changeset
1002
kono
parents:
diff changeset
1003 when 'p' =>
kono
parents:
diff changeset
1004 Setup_Projects := True;
kono
parents:
diff changeset
1005
kono
parents:
diff changeset
1006 -- Processing for q switch
kono
parents:
diff changeset
1007
kono
parents:
diff changeset
1008 when 'q' =>
kono
parents:
diff changeset
1009 Quiet_Output := True;
kono
parents:
diff changeset
1010
kono
parents:
diff changeset
1011 -- Processing for R switch
kono
parents:
diff changeset
1012
kono
parents:
diff changeset
1013 when 'R' =>
kono
parents:
diff changeset
1014 Run_Path_Option := False;
kono
parents:
diff changeset
1015
kono
parents:
diff changeset
1016 -- Processing for s switch
kono
parents:
diff changeset
1017
kono
parents:
diff changeset
1018 when 's' =>
kono
parents:
diff changeset
1019 Ptr := Ptr + 1;
kono
parents:
diff changeset
1020 Check_Switches := True;
kono
parents:
diff changeset
1021
kono
parents:
diff changeset
1022 -- Processing for v switch
kono
parents:
diff changeset
1023
kono
parents:
diff changeset
1024 when 'v' =>
kono
parents:
diff changeset
1025 Verbose_Mode := True;
kono
parents:
diff changeset
1026 Verbosity_Level := Opt.High;
kono
parents:
diff changeset
1027
kono
parents:
diff changeset
1028 -- Processing for x switch
kono
parents:
diff changeset
1029
kono
parents:
diff changeset
1030 when 'x' =>
kono
parents:
diff changeset
1031 External_Unit_Compilation_Allowed := True;
kono
parents:
diff changeset
1032 Use_Include_Path_File := True;
kono
parents:
diff changeset
1033
kono
parents:
diff changeset
1034 -- Processing for z switch
kono
parents:
diff changeset
1035
kono
parents:
diff changeset
1036 when 'z' =>
kono
parents:
diff changeset
1037 No_Main_Subprogram := True;
kono
parents:
diff changeset
1038
kono
parents:
diff changeset
1039 -- Any other small letter is an illegal switch
kono
parents:
diff changeset
1040
kono
parents:
diff changeset
1041 when others =>
kono
parents:
diff changeset
1042 if C in 'a' .. 'z' then
kono
parents:
diff changeset
1043 Bad_Switch (Switch_Chars);
kono
parents:
diff changeset
1044
kono
parents:
diff changeset
1045 else
kono
parents:
diff changeset
1046 Success := False;
kono
parents:
diff changeset
1047 end if;
kono
parents:
diff changeset
1048 end case;
kono
parents:
diff changeset
1049 end Check_Switch;
kono
parents:
diff changeset
1050 end if;
kono
parents:
diff changeset
1051 end Scan_Make_Switches;
kono
parents:
diff changeset
1052
kono
parents:
diff changeset
1053 end Switch.M;