OSDN Git Service

8e8d6a889e017b267e55a09cca5648938e9b6bfe
[pf3gnuchains/gcc-fork.git] / gcc / fortran / options.c
1 /* Parse and display command line options.
2    Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation,
3    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
36 gfc_option_t gfc_option;
37
38
39 /* Get ready for options handling.  */
40
41 unsigned int
42 gfc_init_options (unsigned int argc ATTRIBUTE_UNUSED,
43                   const char **argv ATTRIBUTE_UNUSED)
44 {
45   gfc_source_file = NULL;
46   gfc_option.module_dir = NULL;
47   gfc_option.source_form = FORM_UNKNOWN;
48   gfc_option.fixed_line_length = 72;
49   gfc_option.max_identifier_length = GFC_MAX_SYMBOL_LEN;
50   gfc_option.verbose = 0;
51
52   gfc_option.warn_aliasing = 0;
53   gfc_option.warn_conversion = 0;
54   gfc_option.warn_implicit_interface = 0;
55   gfc_option.warn_line_truncation = 0;
56   gfc_option.warn_underflow = 1;
57   gfc_option.warn_surprising = 0;
58   gfc_option.warn_unused_labels = 0;
59
60   gfc_option.flag_default_double = 0;
61   gfc_option.flag_default_integer = 0;
62   gfc_option.flag_default_real = 0;
63   gfc_option.flag_dollar_ok = 0;
64   gfc_option.flag_underscoring = 1;
65   gfc_option.flag_f2c = 0;
66   gfc_option.flag_second_underscore = -1;
67   gfc_option.flag_implicit_none = 0;
68   gfc_option.flag_max_stack_var_size = 32768;
69   gfc_option.flag_module_access_private = 0;
70   gfc_option.flag_no_backend = 0;
71   gfc_option.flag_pack_derived = 0;
72   gfc_option.flag_repack_arrays = 0;
73   gfc_option.flag_automatic = 1;
74   gfc_option.flag_backslash = 1;
75   gfc_option.flag_d_lines = -1;
76
77   gfc_option.q_kind = gfc_default_double_kind;
78
79   flag_argument_noalias = 2;
80   flag_errno_math = 0;
81
82   gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
83     | GFC_STD_F2003 | GFC_STD_F95 | GFC_STD_F77 | GFC_STD_GNU
84     | GFC_STD_LEGACY;
85   gfc_option.warn_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
86     | GFC_STD_F2003 | GFC_STD_LEGACY;
87
88   gfc_option.warn_nonstd_intrinsics = 0;
89
90   return CL_F95;
91 }
92
93
94 /* Determine the source form from the filename extension.  We assume
95    case insensitivity.  */
96
97 static gfc_source_form
98 form_from_filename (const char *filename)
99 {
100
101   static const struct
102   {
103     const char *extension;
104     gfc_source_form form;
105   }
106   exttype[] =
107   {
108     {
109     ".f90", FORM_FREE}
110     ,
111     {
112     ".f95", FORM_FREE}
113     ,
114     {
115     ".f", FORM_FIXED}
116     ,
117     {
118     ".for", FORM_FIXED}
119     ,
120     {
121     "", FORM_UNKNOWN}
122   };            /* sentinel value */
123
124   gfc_source_form f_form;
125   const char *fileext;
126   int i;
127
128   /* Find end of file name.  Note, filename is either a NULL pointer or
129      a NUL terminated string.  */
130   i = 0;
131   while (filename[i] != '\0')
132     i++;
133
134   /* Find last period.  */
135   while (i >= 0 && (filename[i] != '.'))
136     i--;
137
138   /* Did we see a file extension?  */
139   if (i < 0)
140     return FORM_UNKNOWN; /* Nope  */
141
142   /* Get file extension and compare it to others.  */
143   fileext = &(filename[i]);
144
145   i = -1;
146   f_form = FORM_UNKNOWN;
147   do
148     {
149       i++;
150       if (strcasecmp (fileext, exttype[i].extension) == 0)
151         {
152           f_form = exttype[i].form;
153           break;
154         }
155     }
156   while (exttype[i].form != FORM_UNKNOWN);
157
158   return f_form;
159 }
160
161
162 /* Finalize commandline options.  */
163
164 bool
165 gfc_post_options (const char **pfilename)
166 {
167   const char *filename = *pfilename;
168
169   /* Verify the input file name.  */
170   if (!filename || strcmp (filename, "-") == 0)
171     {
172       filename = "";
173     }
174
175   gfc_source_file = filename;
176
177   /* Decide which form the file will be read in as.  */
178
179   if (gfc_option.source_form != FORM_UNKNOWN)
180     gfc_current_form = gfc_option.source_form;
181   else
182     {
183       gfc_current_form = form_from_filename (filename);
184
185       if (gfc_current_form == FORM_UNKNOWN)
186         {
187           gfc_current_form = FORM_FREE;
188           gfc_warning_now ("Reading file '%s' as free form.", 
189                            (filename[0] == '\0') ? "<stdin>" : filename); 
190         }
191     }
192
193   /* If the user specified -fd-lines-as-{code|comments} verify that we're
194      in fixed form.  */
195   if (gfc_current_form == FORM_FREE)
196     {
197       if (gfc_option.flag_d_lines == 0)
198         gfc_warning_now ("'-fd-lines-as-comments' has no effect "
199                          "in free form.");
200       else if (gfc_option.flag_d_lines == 1)
201         gfc_warning_now ("'-fd-lines-as-code' has no effect "
202                          "in free form.");
203     }
204
205   flag_inline_trees = 1;
206
207   /* Use tree inlining.  */
208   if (!flag_no_inline)
209     flag_no_inline = 1;
210   if (flag_inline_functions)
211     flag_inline_trees = 2;
212
213   /* If -pedantic, warn about the use of GNU extensions.  */
214   if (pedantic && (gfc_option.allow_std & GFC_STD_GNU) != 0)
215     gfc_option.warn_std |= GFC_STD_GNU;
216   /* -std=legacy -pedantic is effectively -std=gnu.  */
217   if (pedantic && (gfc_option.allow_std & GFC_STD_LEGACY) != 0)
218     gfc_option.warn_std |= GFC_STD_F95_OBS | GFC_STD_F95_DEL | GFC_STD_LEGACY;
219
220   /* If the user didn't explicitly specify -f(no)-second-underscore we
221      use it if we're trying to be compatible with f2c, and not
222      otherwise.  */
223   if (gfc_option.flag_second_underscore == -1)
224     gfc_option.flag_second_underscore = gfc_option.flag_f2c;
225
226   return false;
227 }
228
229
230 /* Set the options for -Wall.  */
231
232 static void
233 set_Wall (void)
234 {
235
236   gfc_option.warn_aliasing = 1;
237   gfc_option.warn_line_truncation = 1;
238   gfc_option.warn_underflow = 1;
239   gfc_option.warn_surprising = 1;
240   gfc_option.warn_unused_labels = 1;
241   gfc_option.warn_nonstd_intrinsics = 1;
242
243   set_Wunused (1);
244   warn_return_type = 1;
245   warn_switch = 1;
246
247   /* We save the value of warn_uninitialized, since if they put
248      -Wuninitialized on the command line, we need to generate a
249      warning about not using it without also specifying -O.  */
250
251   if (warn_uninitialized != 1)
252     warn_uninitialized = 2;
253 }
254
255
256 static void
257 gfc_handle_module_path_options (const char *arg)
258 {
259
260   if (gfc_option.module_dir != NULL)
261     {
262       gfc_status ("gfortran: Only one -M option allowed\n");
263       exit (3);
264     }
265
266   if (arg == NULL)
267     {
268       gfc_status ("gfortran: Directory required after -M\n");
269       exit (3);
270     }
271
272   gfc_option.module_dir = (char *) gfc_getmem (strlen (arg) + 2);
273   strcpy (gfc_option.module_dir, arg);
274   strcat (gfc_option.module_dir, "/");
275 }
276
277 /* Handle command-line options.  Returns 0 if unrecognized, 1 if
278    recognized and handled.  */
279 int
280 gfc_handle_option (size_t scode, const char *arg, int value)
281 {
282   int result = 1;
283   enum opt_code code = (enum opt_code) scode;
284
285   /* Ignore file names.  */
286   if (code == N_OPTS)
287     return 1;
288
289   switch (code)
290     {
291     default:
292       result = 0;
293       break;
294
295     case OPT_Wall:
296       set_Wall ();
297       break;
298
299     case OPT_Waliasing:
300       gfc_option.warn_aliasing = value;
301       break;
302
303     case OPT_Wconversion:
304       gfc_option.warn_conversion = value;
305       break;
306
307     case OPT_Wimplicit_interface:
308       gfc_option.warn_implicit_interface = value;
309       break;
310
311     case OPT_Wline_truncation:
312       gfc_option.warn_line_truncation = value;
313       break;
314
315     case OPT_Wunderflow:
316       gfc_option.warn_underflow = value;
317       break;
318
319     case OPT_Wsurprising:
320       gfc_option.warn_surprising = value;
321       break;
322
323     case OPT_Wunused_labels:
324       gfc_option.warn_unused_labels = value;
325       break;
326
327     case OPT_ff2c:
328       gfc_option.flag_f2c = value;
329       break;
330
331     case OPT_fdollar_ok:
332       gfc_option.flag_dollar_ok = value;
333       break;
334
335     case OPT_fautomatic:
336       gfc_option.flag_automatic = value;
337       break;
338
339     case OPT_fbackslash:
340       gfc_option.flag_backslash = value;
341       break;
342
343     case OPT_fd_lines_as_code:
344       gfc_option.flag_d_lines = 1;
345       break;
346
347     case OPT_fd_lines_as_comments:
348       gfc_option.flag_d_lines = 0;
349       break;
350
351     case OPT_fdump_parse_tree:
352       gfc_option.verbose = value;
353       break;
354
355     case OPT_ffixed_form:
356       gfc_option.source_form = FORM_FIXED;
357       break;
358
359     case OPT_ffree_form:
360       gfc_option.source_form = FORM_FREE;
361       break;
362
363     case OPT_funderscoring:
364       gfc_option.flag_underscoring = value;
365       break;
366
367     case OPT_fsecond_underscore:
368       gfc_option.flag_second_underscore = value;
369       break;
370
371     case OPT_fimplicit_none:
372       gfc_option.flag_implicit_none = value;
373       break;
374
375     case OPT_fmax_stack_var_size_:
376       gfc_option.flag_max_stack_var_size = value;
377       break;
378
379     case OPT_fmodule_private:
380       gfc_option.flag_module_access_private = value;
381       break;
382
383     case OPT_fno_backend:
384       gfc_option.flag_no_backend = value;
385       break;
386
387     case OPT_fpack_derived:
388       gfc_option.flag_pack_derived = value;
389       break;
390
391     case OPT_frepack_arrays:
392       gfc_option.flag_repack_arrays = value;
393       break;
394
395     case OPT_ffixed_line_length_none:
396       gfc_option.fixed_line_length = 0;
397       break;
398
399     case OPT_ffixed_line_length_:
400       if (value != 0 && value < 7)
401         gfc_fatal_error ("Fixed line length must be at least seven.");
402       gfc_option.fixed_line_length = value;
403       break;
404
405     case OPT_fmax_identifier_length_:
406       if (value > GFC_MAX_SYMBOL_LEN)
407         gfc_fatal_error ("Maximum supported idenitifier length is %d",
408                          GFC_MAX_SYMBOL_LEN);
409       gfc_option.max_identifier_length = value;
410       break;
411
412     case OPT_qkind_:
413       if (gfc_validate_kind (BT_REAL, value, true) < 0)
414         gfc_fatal_error ("Argument to -fqkind isn't a valid real kind");
415       gfc_option.q_kind = value;
416       break;
417
418     case OPT_fdefault_integer_8:
419       gfc_option.flag_default_integer = value;
420       break;
421
422     case OPT_fdefault_real_8:
423       gfc_option.flag_default_real = value;
424       break;
425
426     case OPT_fdefault_double_8:
427       gfc_option.flag_default_double = value;
428       break;
429
430     case OPT_I:
431       gfc_add_include_path (arg);
432       break;
433
434     case OPT_J:
435     case OPT_M:
436       gfc_handle_module_path_options (arg);
437       break;
438     
439     case OPT_std_f95:
440       gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F95 | GFC_STD_F77;
441       gfc_option.warn_std = GFC_STD_F95_OBS;
442       gfc_option.max_identifier_length = 31;
443       break;
444
445     case OPT_std_f2003:
446       gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F77 
447         | GFC_STD_F2003 | GFC_STD_F95;
448       gfc_option.warn_std = GFC_STD_F95_OBS;
449       gfc_option.max_identifier_length = 63;
450       break;
451
452     case OPT_std_gnu:
453       gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
454         | GFC_STD_F77 | GFC_STD_F95 | GFC_STD_F2003
455         | GFC_STD_GNU | GFC_STD_LEGACY;
456       gfc_option.warn_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
457         | GFC_STD_LEGACY;
458       break;
459
460     case OPT_std_legacy:
461       gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
462         | GFC_STD_F77 | GFC_STD_F95 | GFC_STD_F2003
463         | GFC_STD_GNU | GFC_STD_LEGACY;
464       gfc_option.warn_std = 0;
465       break;
466
467     case OPT_Wnonstd_intrinsics:
468       gfc_option.warn_nonstd_intrinsics = 1;
469       break;
470     }
471
472   return result;
473 }