]> gcc.gnu.org Git - gcc.git/blame - gcc/fortran/options.c
lang.opt: Rearrange entries back into ASCII order.
[gcc.git] / gcc / fortran / options.c
CommitLineData
6de9cd9a 1/* Parse and display command line options.
6c7a4dfd
JJ
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006
3 Free Software Foundation, Inc.
6de9cd9a
DN
4 Contributed by Andy Vaught
5
9fc4d79b 6This file is part of GCC.
6de9cd9a 7
9fc4d79b
TS
8GCC is free software; you can redistribute it and/or modify it under
9the terms of the GNU General Public License as published by the Free
10Software Foundation; either version 2, or (at your option) any later
11version.
6de9cd9a 12
9fc4d79b
TS
13GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14WARRANTY; without even the implied warranty of MERCHANTABILITY or
15FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16for more details.
6de9cd9a
DN
17
18You should have received a copy of the GNU General Public License
9fc4d79b 19along with GCC; see the file COPYING. If not, write to the Free
ab57747b
KC
20Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
2102110-1301, USA. */
6de9cd9a 22
6de9cd9a
DN
23
24#include "config.h"
25#include "system.h"
26#include "coretypes.h"
27#include "tree.h"
28#include "flags.h"
29#include "intl.h"
30#include "opts.h"
31#include "options.h"
32#include "tree-inline.h"
33
34#include "gfortran.h"
25d8f0a2 35#include "target.h"
6de9cd9a
DN
36
37gfc_option_t gfc_option;
38
39
40/* Get ready for options handling. */
41
42unsigned int
43gfc_init_options (unsigned int argc ATTRIBUTE_UNUSED,
44 const char **argv ATTRIBUTE_UNUSED)
45{
e0bcf78c 46 gfc_source_file = NULL;
6de9cd9a
DN
47 gfc_option.module_dir = NULL;
48 gfc_option.source_form = FORM_UNKNOWN;
1dde8683
BM
49 gfc_option.fixed_line_length = 72;
50 gfc_option.free_line_length = 132;
5a06474c
JD
51 gfc_option.max_continue_fixed = 19;
52 gfc_option.max_continue_free = 39;
6de9cd9a
DN
53 gfc_option.max_identifier_length = GFC_MAX_SYMBOL_LEN;
54 gfc_option.verbose = 0;
55
56 gfc_option.warn_aliasing = 0;
3fbab549 57 gfc_option.warn_ampersand = 0;
6de9cd9a
DN
58 gfc_option.warn_conversion = 0;
59 gfc_option.warn_implicit_interface = 0;
60 gfc_option.warn_line_truncation = 0;
61 gfc_option.warn_surprising = 0;
840bd9f7
SK
62 gfc_option.warn_tabs = 1;
63 gfc_option.warn_underflow = 1;
3f139fcf 64 gfc_option.max_errors = 25;
6de9cd9a 65
a23eec13 66 gfc_option.flag_all_intrinsics = 0;
3ae9eb27
SK
67 gfc_option.flag_default_double = 0;
68 gfc_option.flag_default_integer = 0;
69 gfc_option.flag_default_real = 0;
6de9cd9a
DN
70 gfc_option.flag_dollar_ok = 0;
71 gfc_option.flag_underscoring = 1;
973ff4c0
TS
72 gfc_option.flag_f2c = 0;
73 gfc_option.flag_second_underscore = -1;
6de9cd9a
DN
74 gfc_option.flag_implicit_none = 0;
75 gfc_option.flag_max_stack_var_size = 32768;
54554825 76 gfc_option.flag_range_check = 1;
6de9cd9a
DN
77 gfc_option.flag_pack_derived = 0;
78 gfc_option.flag_repack_arrays = 0;
2d7c7df6 79 gfc_option.flag_preprocessed = 0;
ee5426a4 80 gfc_option.flag_automatic = 1;
131c66cd 81 gfc_option.flag_backslash = 1;
5a0aad31
FXC
82 gfc_option.flag_external_blas = 0;
83 gfc_option.blas_matmul_limit = 30;
83d890b9 84 gfc_option.flag_cray_pointer = 0;
e0bcf78c 85 gfc_option.flag_d_lines = -1;
6c7a4dfd 86 gfc_option.flag_openmp = 0;
6de9cd9a 87
944b8b35
FXC
88 gfc_option.fpe = 0;
89
0698a1d2
TM
90 /* Argument pointers cannot point to anything
91 but their argument. */
92 flag_argument_noalias = 3;
93
61e067cc 94 flag_errno_math = 0;
6de9cd9a
DN
95
96 gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
c0309c74
RS
97 | GFC_STD_F2003 | GFC_STD_F95 | GFC_STD_F77 | GFC_STD_GNU
98 | GFC_STD_LEGACY;
6de9cd9a 99 gfc_option.warn_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
cce283c7 100 | GFC_STD_LEGACY;
6de9cd9a 101
b7892582
JB
102 gfc_option.warn_nonstd_intrinsics = 0;
103
25d8f0a2
TS
104 /* -fshort-enums can be default on some targets. */
105 gfc_option.fshort_enums = targetm.default_short_enums ();
106
7f26dfa3 107 return CL_Fortran;
6de9cd9a
DN
108}
109
110
e0bcf78c
TS
111/* Determine the source form from the filename extension. We assume
112 case insensitivity. */
113
114static gfc_source_form
115form_from_filename (const char *filename)
116{
117
118 static const struct
119 {
120 const char *extension;
121 gfc_source_form form;
122 }
123 exttype[] =
124 {
125 {
126 ".f90", FORM_FREE}
127 ,
128 {
129 ".f95", FORM_FREE}
130 ,
131 {
132 ".f", FORM_FIXED}
133 ,
134 {
135 ".for", FORM_FIXED}
136 ,
137 {
138 "", FORM_UNKNOWN}
139 }; /* sentinel value */
140
141 gfc_source_form f_form;
142 const char *fileext;
143 int i;
144
145 /* Find end of file name. Note, filename is either a NULL pointer or
146 a NUL terminated string. */
147 i = 0;
148 while (filename[i] != '\0')
149 i++;
150
151 /* Find last period. */
152 while (i >= 0 && (filename[i] != '.'))
153 i--;
154
155 /* Did we see a file extension? */
156 if (i < 0)
157 return FORM_UNKNOWN; /* Nope */
158
159 /* Get file extension and compare it to others. */
160 fileext = &(filename[i]);
161
162 i = -1;
163 f_form = FORM_UNKNOWN;
164 do
165 {
166 i++;
167 if (strcasecmp (fileext, exttype[i].extension) == 0)
168 {
169 f_form = exttype[i].form;
170 break;
171 }
172 }
173 while (exttype[i].form != FORM_UNKNOWN);
174
175 return f_form;
176}
177
178
6de9cd9a
DN
179/* Finalize commandline options. */
180
181bool
182gfc_post_options (const char **pfilename)
183{
2d7c7df6 184 const char *filename = *pfilename, *canon_source_file = NULL;
b424a572
FXC
185 char *source_path;
186 int i;
6de9cd9a
DN
187
188 /* Verify the input file name. */
189 if (!filename || strcmp (filename, "-") == 0)
190 {
191 filename = "";
192 }
193
2d7c7df6
JJ
194 if (gfc_option.flag_preprocessed)
195 {
196 /* For preprocessed files, if the first tokens are of the form # NUM.
197 handle the directives so we know the original file name. */
198 gfc_source_file = gfc_read_orig_filename (filename, &canon_source_file);
199 if (gfc_source_file == NULL)
200 gfc_source_file = filename;
201 else
202 *pfilename = gfc_source_file;
203 }
204 else
205 gfc_source_file = filename;
206
207 if (canon_source_file == NULL)
208 canon_source_file = gfc_source_file;
e0bcf78c 209
b424a572
FXC
210 /* Adds the path where the source file is to the list of include files. */
211
2d7c7df6
JJ
212 i = strlen (canon_source_file);
213 while (i > 0 && !IS_DIR_SEPARATOR (canon_source_file[i]))
b424a572
FXC
214 i--;
215 if (i != 0)
216 {
217 source_path = alloca (i + 1);
2d7c7df6 218 memcpy (source_path, canon_source_file, i);
b424a572
FXC
219 source_path[i] = 0;
220 gfc_add_include_path (source_path);
221 }
222 else
223 gfc_add_include_path (".");
224
2d7c7df6
JJ
225 if (canon_source_file != gfc_source_file)
226 gfc_free ((void *) canon_source_file);
227
e0bcf78c
TS
228 /* Decide which form the file will be read in as. */
229
230 if (gfc_option.source_form != FORM_UNKNOWN)
231 gfc_current_form = gfc_option.source_form;
232 else
233 {
234 gfc_current_form = form_from_filename (filename);
235
236 if (gfc_current_form == FORM_UNKNOWN)
237 {
238 gfc_current_form = FORM_FREE;
239 gfc_warning_now ("Reading file '%s' as free form.",
2d7c7df6 240 (filename[0] == '\0') ? "<stdin>" : filename);
e0bcf78c
TS
241 }
242 }
243
244 /* If the user specified -fd-lines-as-{code|comments} verify that we're
245 in fixed form. */
246 if (gfc_current_form == FORM_FREE)
247 {
248 if (gfc_option.flag_d_lines == 0)
249 gfc_warning_now ("'-fd-lines-as-comments' has no effect "
250 "in free form.");
251 else if (gfc_option.flag_d_lines == 1)
252 gfc_warning_now ("'-fd-lines-as-code' has no effect "
253 "in free form.");
254 }
6de9cd9a
DN
255
256 flag_inline_trees = 1;
257
258 /* Use tree inlining. */
259 if (!flag_no_inline)
260 flag_no_inline = 1;
261 if (flag_inline_functions)
39afeb1a 262 flag_inline_trees = 2;
fc2d8429
RS
263
264 /* If -pedantic, warn about the use of GNU extensions. */
265 if (pedantic && (gfc_option.allow_std & GFC_STD_GNU) != 0)
266 gfc_option.warn_std |= GFC_STD_GNU;
c0309c74
RS
267 /* -std=legacy -pedantic is effectively -std=gnu. */
268 if (pedantic && (gfc_option.allow_std & GFC_STD_LEGACY) != 0)
269 gfc_option.warn_std |= GFC_STD_F95_OBS | GFC_STD_F95_DEL | GFC_STD_LEGACY;
fc2d8429 270
973ff4c0
TS
271 /* If the user didn't explicitly specify -f(no)-second-underscore we
272 use it if we're trying to be compatible with f2c, and not
273 otherwise. */
274 if (gfc_option.flag_second_underscore == -1)
275 gfc_option.flag_second_underscore = gfc_option.flag_f2c;
276
d05d9ac7
JJ
277 /* Implement -fno-automatic as -fmax-stack-var-size=0. */
278 if (!gfc_option.flag_automatic)
279 gfc_option.flag_max_stack_var_size = 0;
3fbab549
JD
280
281 if (pedantic)
282 gfc_option.warn_ampersand = 1;
d05d9ac7 283
73a5988f
SK
284 if (gfc_option.flag_all_intrinsics)
285 gfc_option.warn_nonstd_intrinsics = 0;
286
6de9cd9a
DN
287 return false;
288}
289
290
291/* Set the options for -Wall. */
292
293static void
294set_Wall (void)
295{
296
297 gfc_option.warn_aliasing = 1;
3fbab549 298 gfc_option.warn_ampersand = 1;
6de9cd9a 299 gfc_option.warn_line_truncation = 1;
840bd9f7 300 gfc_option.warn_nonstd_intrinsics = 1;
6de9cd9a 301 gfc_option.warn_surprising = 1;
840bd9f7
SK
302 gfc_option.warn_tabs = 0;
303 gfc_option.warn_underflow = 1;
2e5758e8 304
6de9cd9a
DN
305 set_Wunused (1);
306 warn_return_type = 1;
307 warn_switch = 1;
308
309 /* We save the value of warn_uninitialized, since if they put
310 -Wuninitialized on the command line, we need to generate a
311 warning about not using it without also specifying -O. */
312
313 if (warn_uninitialized != 1)
314 warn_uninitialized = 2;
315}
316
317
318static void
319gfc_handle_module_path_options (const char *arg)
320{
321
322 if (gfc_option.module_dir != NULL)
323 {
324 gfc_status ("gfortran: Only one -M option allowed\n");
325 exit (3);
326 }
327
328 if (arg == NULL)
329 {
330 gfc_status ("gfortran: Directory required after -M\n");
331 exit (3);
332 }
333
629ceb93 334 gfc_option.module_dir = (char *) gfc_getmem (strlen (arg) + 2);
6de9cd9a
DN
335 strcpy (gfc_option.module_dir, arg);
336 strcat (gfc_option.module_dir, "/");
337}
338
944b8b35
FXC
339static void
340gfc_handle_fpe_trap_option (const char *arg)
341{
342 int result, pos = 0, n;
343 static const char * const exception[] = { "invalid", "denormal", "zero",
344 "overflow", "underflow",
345 "precision", NULL };
346 static const int opt_exception[] = { GFC_FPE_INVALID, GFC_FPE_DENORMAL,
347 GFC_FPE_ZERO, GFC_FPE_OVERFLOW,
348 GFC_FPE_UNDERFLOW, GFC_FPE_PRECISION,
349 0 };
350
351 while (*arg)
352 {
353 while (*arg == ',')
354 arg++;
355 while (arg[pos] && arg[pos] != ',')
356 pos++;
357 result = 0;
358 for (n = 0; exception[n] != NULL; n++)
359 {
360 if (exception[n] && strncmp (exception[n], arg, pos) == 0)
361 {
362 gfc_option.fpe |= opt_exception[n];
363 arg += pos;
364 pos = 0;
365 result = 1;
366 break;
367 }
368 }
369 if (! result)
370 gfc_fatal_error ("Argument to -ffpe-trap is not valid: %s", arg);
371 }
372}
373
6de9cd9a
DN
374/* Handle command-line options. Returns 0 if unrecognized, 1 if
375 recognized and handled. */
376int
377gfc_handle_option (size_t scode, const char *arg, int value)
378{
379 int result = 1;
380 enum opt_code code = (enum opt_code) scode;
381
382 /* Ignore file names. */
383 if (code == N_OPTS)
384 return 1;
385
386 switch (code)
387 {
388 default:
389 result = 0;
390 break;
391
392 case OPT_Wall:
393 set_Wall ();
394 break;
395
396 case OPT_Waliasing:
397 gfc_option.warn_aliasing = value;
398 break;
399
3fbab549
JD
400 case OPT_Wampersand:
401 gfc_option.warn_ampersand = value;
402 break;
403
6de9cd9a
DN
404 case OPT_Wconversion:
405 gfc_option.warn_conversion = value;
406 break;
407
408 case OPT_Wimplicit_interface:
409 gfc_option.warn_implicit_interface = value;
410 break;
411
412 case OPT_Wline_truncation:
413 gfc_option.warn_line_truncation = value;
414 break;
415
416 case OPT_Wsurprising:
417 gfc_option.warn_surprising = value;
418 break;
419
840bd9f7
SK
420 case OPT_Wtabs:
421 gfc_option.warn_tabs = value;
422 break;
423
424 case OPT_Wunderflow:
425 gfc_option.warn_underflow = value;
426 break;
427
a23eec13
SK
428 case OPT_fall_intrinsics:
429 gfc_option.flag_all_intrinsics = 1;
430 break;
431
432 case OPT_fautomatic:
433 gfc_option.flag_automatic = value;
434 break;
435
436 case OPT_fbackslash:
437 gfc_option.flag_backslash = value;
438 break;
83d890b9
AL
439
440 case OPT_fcray_pointer:
441 gfc_option.flag_cray_pointer = value;
442 break;
6de9cd9a 443
973ff4c0
TS
444 case OPT_ff2c:
445 gfc_option.flag_f2c = value;
446 break;
447
6de9cd9a
DN
448 case OPT_fdollar_ok:
449 gfc_option.flag_dollar_ok = value;
450 break;
451
5a0aad31
FXC
452 case OPT_fexternal_blas:
453 gfc_option.flag_external_blas = value;
454 break;
455
456 case OPT_fblas_matmul_limit_:
457 gfc_option.blas_matmul_limit = value;
458 break;
459
e0bcf78c
TS
460 case OPT_fd_lines_as_code:
461 gfc_option.flag_d_lines = 1;
462 break;
463
464 case OPT_fd_lines_as_comments:
465 gfc_option.flag_d_lines = 0;
466 break;
467
6de9cd9a
DN
468 case OPT_fdump_parse_tree:
469 gfc_option.verbose = value;
470 break;
471
472 case OPT_ffixed_form:
473 gfc_option.source_form = FORM_FIXED;
474 break;
475
16ab8e74
BF
476 case OPT_ffixed_line_length_none:
477 gfc_option.fixed_line_length = 0;
478 break;
479
480 case OPT_ffixed_line_length_:
481 if (value != 0 && value < 7)
482 gfc_fatal_error ("Fixed line length must be at least seven.");
483 gfc_option.fixed_line_length = value;
484 break;
485
6de9cd9a
DN
486 case OPT_ffree_form:
487 gfc_option.source_form = FORM_FREE;
488 break;
489
6c7a4dfd
JJ
490 case OPT_fopenmp:
491 gfc_option.flag_openmp = value;
492 break;
493
16ab8e74
BF
494 case OPT_ffree_line_length_none:
495 gfc_option.free_line_length = 0;
496 break;
497
498 case OPT_ffree_line_length_:
499 gfc_option.free_line_length = value;
500 break;
501
6de9cd9a
DN
502 case OPT_funderscoring:
503 gfc_option.flag_underscoring = value;
504 break;
505
506 case OPT_fsecond_underscore:
507 gfc_option.flag_second_underscore = value;
508 break;
509
510 case OPT_fimplicit_none:
511 gfc_option.flag_implicit_none = value;
512 break;
513
3f139fcf
BM
514 case OPT_fmax_errors_:
515 gfc_option.max_errors = value;
516 break;
517
6de9cd9a
DN
518 case OPT_fmax_stack_var_size_:
519 gfc_option.flag_max_stack_var_size = value;
520 break;
521
54554825
JD
522 case OPT_frange_check:
523 gfc_option.flag_range_check = value;
524 break;
525
6de9cd9a
DN
526 case OPT_fpack_derived:
527 gfc_option.flag_pack_derived = value;
528 break;
529
530 case OPT_frepack_arrays:
531 gfc_option.flag_repack_arrays = value;
532 break;
533
2d7c7df6
JJ
534 case OPT_fpreprocessed:
535 gfc_option.flag_preprocessed = value;
536 break;
537
6de9cd9a
DN
538 case OPT_fmax_identifier_length_:
539 if (value > GFC_MAX_SYMBOL_LEN)
eb6d74fa 540 gfc_fatal_error ("Maximum supported identifier length is %d",
6de9cd9a
DN
541 GFC_MAX_SYMBOL_LEN);
542 gfc_option.max_identifier_length = value;
543 break;
544
3ae9eb27
SK
545 case OPT_fdefault_integer_8:
546 gfc_option.flag_default_integer = value;
6de9cd9a
DN
547 break;
548
3ae9eb27
SK
549 case OPT_fdefault_real_8:
550 gfc_option.flag_default_real = value;
6de9cd9a
DN
551 break;
552
3ae9eb27
SK
553 case OPT_fdefault_double_8:
554 gfc_option.flag_default_double = value;
6de9cd9a
DN
555 break;
556
557 case OPT_I:
558 gfc_add_include_path (arg);
559 break;
560
561 case OPT_J:
562 case OPT_M:
563 gfc_handle_module_path_options (arg);
2d0b4bcd 564 break;
6de9cd9a 565
944b8b35
FXC
566 case OPT_ffpe_trap_:
567 gfc_handle_fpe_trap_option (arg);
568 break;
569
6de9cd9a 570 case OPT_std_f95:
b7892582 571 gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F95 | GFC_STD_F77;
6de9cd9a
DN
572 gfc_option.warn_std = GFC_STD_F95_OBS;
573 gfc_option.max_identifier_length = 31;
3fbab549 574 gfc_option.warn_ampersand = 1;
840bd9f7 575 gfc_option.warn_tabs = 0;
6de9cd9a
DN
576 break;
577
578 case OPT_std_f2003:
b7892582
JB
579 gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F77
580 | GFC_STD_F2003 | GFC_STD_F95;
581 gfc_option.warn_std = GFC_STD_F95_OBS;
5a06474c
JD
582 gfc_option.max_continue_fixed = 255;
583 gfc_option.max_continue_free = 255;
6de9cd9a 584 gfc_option.max_identifier_length = 63;
3fbab549 585 gfc_option.warn_ampersand = 1;
6de9cd9a
DN
586 break;
587
588 case OPT_std_gnu:
589 gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
b7892582 590 | GFC_STD_F77 | GFC_STD_F95 | GFC_STD_F2003
c0309c74
RS
591 | GFC_STD_GNU | GFC_STD_LEGACY;
592 gfc_option.warn_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
593 | GFC_STD_LEGACY;
594 break;
595
596 case OPT_std_legacy:
597 gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
598 | GFC_STD_F77 | GFC_STD_F95 | GFC_STD_F2003
599 | GFC_STD_GNU | GFC_STD_LEGACY;
600 gfc_option.warn_std = 0;
b7892582
JB
601 break;
602
603 case OPT_Wnonstd_intrinsics:
73a5988f 604 gfc_option.warn_nonstd_intrinsics = value;
6de9cd9a 605 break;
25d8f0a2
TS
606
607 case OPT_fshort_enums:
608 gfc_option.fshort_enums = 1;
609 break;
eaa90d25
TK
610
611 case OPT_fconvert_little_endian:
612 gfc_option.convert = CONVERT_LITTLE;
613 break;
614
615 case OPT_fconvert_big_endian:
616 gfc_option.convert = CONVERT_BIG;
617 break;
618
619 case OPT_fconvert_native:
620 gfc_option.convert = CONVERT_NATIVE;
621 break;
622
623 case OPT_fconvert_swap:
624 gfc_option.convert = CONVERT_SWAP;
625 break;
d67ab5ee
TK
626
627 case OPT_frecord_marker_4:
628 gfc_option.record_marker = 4;
629 break;
630
631 case OPT_frecord_marker_8:
632 gfc_option.record_marker = 8;
633 break;
6de9cd9a
DN
634 }
635
636 return result;
637}
This page took 0.834345 seconds and 5 git commands to generate.