OSDN Git Service

PR fortran/27553
[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
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
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"
35 #include "target.h"
36
37 gfc_option_t gfc_option;
38
39
40 /* Get ready for options handling.  */
41
42 unsigned int
43 gfc_init_options (unsigned int argc ATTRIBUTE_UNUSED,
44                   const char **argv ATTRIBUTE_UNUSED)
45 {
46   gfc_source_file = NULL;
47   gfc_option.module_dir = NULL;
48   gfc_option.source_form = FORM_UNKNOWN;
49   gfc_option.fixed_line_length = -1;
50   gfc_option.free_line_length = -1;
51   gfc_option.max_identifier_length = GFC_MAX_SYMBOL_LEN;
52   gfc_option.verbose = 0;
53
54   gfc_option.warn_aliasing = 0;
55   gfc_option.warn_ampersand = 0;
56   gfc_option.warn_conversion = 0;
57   gfc_option.warn_implicit_interface = 0;
58   gfc_option.warn_line_truncation = 0;
59   gfc_option.warn_surprising = 0;
60   gfc_option.warn_tabs = 1;
61   gfc_option.warn_underflow = 1;
62   gfc_option.warn_unused_labels = 0;
63
64   gfc_option.flag_all_intrinsics = 0;
65   gfc_option.flag_default_double = 0;
66   gfc_option.flag_default_integer = 0;
67   gfc_option.flag_default_real = 0;
68   gfc_option.flag_dollar_ok = 0;
69   gfc_option.flag_underscoring = 1;
70   gfc_option.flag_f2c = 0;
71   gfc_option.flag_second_underscore = -1;
72   gfc_option.flag_implicit_none = 0;
73   gfc_option.flag_max_stack_var_size = 32768;
74   gfc_option.flag_module_access_private = 0;
75   gfc_option.flag_no_backend = 0;
76   gfc_option.flag_pack_derived = 0;
77   gfc_option.flag_repack_arrays = 0;
78   gfc_option.flag_preprocessed = 0;
79   gfc_option.flag_automatic = 1;
80   gfc_option.flag_backslash = 1;
81   gfc_option.flag_cray_pointer = 0;
82   gfc_option.flag_d_lines = -1;
83   gfc_option.flag_openmp = 0;
84
85   gfc_option.q_kind = gfc_default_double_kind;
86
87   gfc_option.fpe = 0;
88
89   /* Argument pointers cannot point to anything
90      but their argument.  */
91   flag_argument_noalias = 3;
92
93   flag_errno_math = 0;
94
95   gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
96     | GFC_STD_F2003 | GFC_STD_F95 | GFC_STD_F77 | GFC_STD_GNU
97     | GFC_STD_LEGACY;
98   gfc_option.warn_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
99     | GFC_STD_LEGACY;
100
101   gfc_option.warn_nonstd_intrinsics = 0;
102
103   /* -fshort-enums can be default on some targets.  */
104   gfc_option.fshort_enums = targetm.default_short_enums ();
105
106   return CL_Fortran;
107 }
108
109
110 /* Determine the source form from the filename extension.  We assume
111    case insensitivity.  */
112
113 static gfc_source_form
114 form_from_filename (const char *filename)
115 {
116
117   static const struct
118   {
119     const char *extension;
120     gfc_source_form form;
121   }
122   exttype[] =
123   {
124     {
125     ".f90", FORM_FREE}
126     ,
127     {
128     ".f95", FORM_FREE}
129     ,
130     {
131     ".f", FORM_FIXED}
132     ,
133     {
134     ".for", FORM_FIXED}
135     ,
136     {
137     "", FORM_UNKNOWN}
138   };            /* sentinel value */
139
140   gfc_source_form f_form;
141   const char *fileext;
142   int i;
143
144   /* Find end of file name.  Note, filename is either a NULL pointer or
145      a NUL terminated string.  */
146   i = 0;
147   while (filename[i] != '\0')
148     i++;
149
150   /* Find last period.  */
151   while (i >= 0 && (filename[i] != '.'))
152     i--;
153
154   /* Did we see a file extension?  */
155   if (i < 0)
156     return FORM_UNKNOWN; /* Nope  */
157
158   /* Get file extension and compare it to others.  */
159   fileext = &(filename[i]);
160
161   i = -1;
162   f_form = FORM_UNKNOWN;
163   do
164     {
165       i++;
166       if (strcasecmp (fileext, exttype[i].extension) == 0)
167         {
168           f_form = exttype[i].form;
169           break;
170         }
171     }
172   while (exttype[i].form != FORM_UNKNOWN);
173
174   return f_form;
175 }
176
177
178 /* Finalize commandline options.  */
179
180 bool
181 gfc_post_options (const char **pfilename)
182 {
183   const char *filename = *pfilename, *canon_source_file = NULL;
184   char *source_path;
185   int i;
186
187   /* Verify the input file name.  */
188   if (!filename || strcmp (filename, "-") == 0)
189     {
190       filename = "";
191     }
192
193   if (gfc_option.flag_preprocessed)
194     {
195       /* For preprocessed files, if the first tokens are of the form # NUM.
196          handle the directives so we know the original file name.  */
197       gfc_source_file = gfc_read_orig_filename (filename, &canon_source_file);
198       if (gfc_source_file == NULL)
199         gfc_source_file = filename;
200       else
201         *pfilename = gfc_source_file;
202     }
203   else
204     gfc_source_file = filename;
205
206   if (canon_source_file == NULL)
207     canon_source_file = gfc_source_file;
208
209   /* Adds the path where the source file is to the list of include files.  */
210
211   i = strlen (canon_source_file);
212   while (i > 0 && !IS_DIR_SEPARATOR (canon_source_file[i]))
213     i--;
214   if (i != 0)
215     {
216       source_path = alloca (i + 1);
217       memcpy (source_path, canon_source_file, i);
218       source_path[i] = 0;
219       gfc_add_include_path (source_path);
220     }
221   else
222     gfc_add_include_path (".");
223
224   if (canon_source_file != gfc_source_file)
225     gfc_free ((void *) canon_source_file);
226
227   /* Decide which form the file will be read in as.  */
228
229   if (gfc_option.source_form != FORM_UNKNOWN)
230     gfc_current_form = gfc_option.source_form;
231   else
232     {
233       gfc_current_form = form_from_filename (filename);
234
235       if (gfc_current_form == FORM_UNKNOWN)
236         {
237           gfc_current_form = FORM_FREE;
238           gfc_warning_now ("Reading file '%s' as free form.", 
239                            (filename[0] == '\0') ? "<stdin>" : filename);
240         }
241     }
242
243   /* If the user specified -fd-lines-as-{code|comments} verify that we're
244      in fixed form.  */
245   if (gfc_current_form == FORM_FREE)
246     {
247       if (gfc_option.flag_d_lines == 0)
248         gfc_warning_now ("'-fd-lines-as-comments' has no effect "
249                          "in free form.");
250       else if (gfc_option.flag_d_lines == 1)
251         gfc_warning_now ("'-fd-lines-as-code' has no effect "
252                          "in free form.");
253     }
254
255   flag_inline_trees = 1;
256
257   /* Use tree inlining.  */
258   if (!flag_no_inline)
259     flag_no_inline = 1;
260   if (flag_inline_functions)
261     flag_inline_trees = 2;
262
263   /* If -pedantic, warn about the use of GNU extensions.  */
264   if (pedantic && (gfc_option.allow_std & GFC_STD_GNU) != 0)
265     gfc_option.warn_std |= GFC_STD_GNU;
266   /* -std=legacy -pedantic is effectively -std=gnu.  */
267   if (pedantic && (gfc_option.allow_std & GFC_STD_LEGACY) != 0)
268     gfc_option.warn_std |= GFC_STD_F95_OBS | GFC_STD_F95_DEL | GFC_STD_LEGACY;
269
270   /* If the user didn't explicitly specify -f(no)-second-underscore we
271      use it if we're trying to be compatible with f2c, and not
272      otherwise.  */
273   if (gfc_option.flag_second_underscore == -1)
274     gfc_option.flag_second_underscore = gfc_option.flag_f2c;
275
276   /* Implement -fno-automatic as -fmax-stack-var-size=0.  */
277   if (!gfc_option.flag_automatic)
278     gfc_option.flag_max_stack_var_size = 0;
279   
280   if (pedantic)
281     gfc_option.warn_ampersand = 1;
282
283   if (gfc_option.flag_all_intrinsics)
284     gfc_option.warn_nonstd_intrinsics = 0;
285
286   return false;
287 }
288
289
290 /* Set the options for -Wall.  */
291
292 static void
293 set_Wall (void)
294 {
295
296   gfc_option.warn_aliasing = 1;
297   gfc_option.warn_ampersand = 1;
298   gfc_option.warn_line_truncation = 1;
299   gfc_option.warn_nonstd_intrinsics = 1;
300   gfc_option.warn_surprising = 1;
301   gfc_option.warn_tabs = 0;
302   gfc_option.warn_underflow = 1;
303   gfc_option.warn_unused_labels = 1;
304  
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
318 static void
319 gfc_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
334   gfc_option.module_dir = (char *) gfc_getmem (strlen (arg) + 2);
335   strcpy (gfc_option.module_dir, arg);
336   strcat (gfc_option.module_dir, "/");
337 }
338
339 static void
340 gfc_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
374 /* Handle command-line options.  Returns 0 if unrecognized, 1 if
375    recognized and handled.  */
376 int
377 gfc_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
400     case OPT_Wampersand:
401       gfc_option.warn_ampersand = value;
402       break;
403
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
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
428     case OPT_Wunused_labels:
429       gfc_option.warn_unused_labels = value;
430       break;
431
432     case OPT_fall_intrinsics:
433       gfc_option.flag_all_intrinsics = 1;
434       break;
435
436     case OPT_fautomatic:
437       gfc_option.flag_automatic = value;
438       break;
439
440     case OPT_fbackslash:
441       gfc_option.flag_backslash = value;
442       break;
443       
444     case OPT_fcray_pointer:
445       gfc_option.flag_cray_pointer = value;
446       break;
447
448     case OPT_ff2c:
449       gfc_option.flag_f2c = value;
450       break;
451
452     case OPT_fdollar_ok:
453       gfc_option.flag_dollar_ok = value;
454       break;
455
456     case OPT_fd_lines_as_code:
457       gfc_option.flag_d_lines = 1;
458       break;
459
460     case OPT_fd_lines_as_comments:
461       gfc_option.flag_d_lines = 0;
462       break;
463
464     case OPT_fdump_parse_tree:
465       gfc_option.verbose = value;
466       break;
467
468     case OPT_ffixed_form:
469       gfc_option.source_form = FORM_FIXED;
470       break;
471
472     case OPT_ffixed_line_length_none:
473       gfc_option.fixed_line_length = 0;
474       break;
475
476     case OPT_ffixed_line_length_:
477       if (value != 0 && value < 7)
478         gfc_fatal_error ("Fixed line length must be at least seven.");
479       gfc_option.fixed_line_length = value;
480       break;
481
482     case OPT_ffree_form:
483       gfc_option.source_form = FORM_FREE;
484       break;
485
486     case OPT_fopenmp:
487       gfc_option.flag_openmp = value;
488       break;
489
490     case OPT_ffree_line_length_none:
491       gfc_option.free_line_length = 0;
492       break;
493
494     case OPT_ffree_line_length_:
495       gfc_option.free_line_length = value;
496       break;
497
498     case OPT_funderscoring:
499       gfc_option.flag_underscoring = value;
500       break;
501
502     case OPT_fsecond_underscore:
503       gfc_option.flag_second_underscore = value;
504       break;
505
506     case OPT_fimplicit_none:
507       gfc_option.flag_implicit_none = value;
508       break;
509
510     case OPT_fmax_stack_var_size_:
511       gfc_option.flag_max_stack_var_size = value;
512       break;
513
514     case OPT_fmodule_private:
515       gfc_option.flag_module_access_private = value;
516       break;
517
518     case OPT_fno_backend:
519       gfc_option.flag_no_backend = value;
520       break;
521
522     case OPT_fpack_derived:
523       gfc_option.flag_pack_derived = value;
524       break;
525
526     case OPT_frepack_arrays:
527       gfc_option.flag_repack_arrays = value;
528       break;
529
530     case OPT_fpreprocessed:
531       gfc_option.flag_preprocessed = value;
532       break;
533
534     case OPT_fmax_identifier_length_:
535       if (value > GFC_MAX_SYMBOL_LEN)
536         gfc_fatal_error ("Maximum supported idenitifier length is %d",
537                          GFC_MAX_SYMBOL_LEN);
538       gfc_option.max_identifier_length = value;
539       break;
540
541     case OPT_qkind_:
542       if (gfc_validate_kind (BT_REAL, value, true) < 0)
543         gfc_fatal_error ("Argument to -fqkind isn't a valid real kind");
544       gfc_option.q_kind = value;
545       break;
546
547     case OPT_fdefault_integer_8:
548       gfc_option.flag_default_integer = value;
549       break;
550
551     case OPT_fdefault_real_8:
552       gfc_option.flag_default_real = value;
553       break;
554
555     case OPT_fdefault_double_8:
556       gfc_option.flag_default_double = value;
557       break;
558
559     case OPT_I:
560       gfc_add_include_path (arg);
561       break;
562
563     case OPT_J:
564     case OPT_M:
565       gfc_handle_module_path_options (arg);
566       break;
567     
568     case OPT_ffpe_trap_:
569       gfc_handle_fpe_trap_option (arg);
570       break;
571
572     case OPT_std_f95:
573       gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F95 | GFC_STD_F77;
574       gfc_option.warn_std = GFC_STD_F95_OBS;
575       gfc_option.max_identifier_length = 31;
576       gfc_option.warn_ampersand = 1;
577       gfc_option.warn_tabs = 0;
578       break;
579
580     case OPT_std_f2003:
581       gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F77 
582         | GFC_STD_F2003 | GFC_STD_F95;
583       gfc_option.warn_std = GFC_STD_F95_OBS;
584       gfc_option.max_identifier_length = 63;
585       gfc_option.warn_ampersand = 1;
586       break;
587
588     case OPT_std_gnu:
589       gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
590         | GFC_STD_F77 | GFC_STD_F95 | GFC_STD_F2003
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;
601       break;
602
603     case OPT_Wnonstd_intrinsics:
604       gfc_option.warn_nonstd_intrinsics = value;
605       break;
606
607     case OPT_fshort_enums:
608       gfc_option.fshort_enums = 1;
609       break;
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;
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;
634     }
635
636   return result;
637 }