OSDN Git Service

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