OSDN Git Service

gcc/fortran/
[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, 59 Temple Place - Suite 330, Boston, MA
21 02111-1307, 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_option.source = 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
74   gfc_option.q_kind = gfc_default_double_kind;
75
76   flag_argument_noalias = 2;
77   flag_errno_math = 0;
78
79   gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
80     | GFC_STD_F2003 | GFC_STD_F95 | GFC_STD_F77 | GFC_STD_GNU;
81   gfc_option.warn_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
82     | GFC_STD_F2003;
83
84   gfc_option.warn_nonstd_intrinsics = 0;
85
86   return CL_F95;
87 }
88
89
90 /* Finalize commandline options.  */
91
92 bool
93 gfc_post_options (const char **pfilename)
94 {
95   const char *filename = *pfilename;
96
97   /* Verify the input file name.  */
98   if (!filename || strcmp (filename, "-") == 0)
99     {
100       filename = "";
101     }
102
103   gfc_option.source = filename;
104
105   flag_inline_trees = 1;
106
107   /* Use tree inlining.  */
108   if (!flag_no_inline)
109     flag_no_inline = 1;
110   if (flag_inline_functions)
111     flag_inline_trees = 2;
112
113   /* If -pedantic, warn about the use of GNU extensions.  */
114   if (pedantic && (gfc_option.allow_std & GFC_STD_GNU) != 0)
115     gfc_option.warn_std |= GFC_STD_GNU;
116
117   /* If the user didn't explicitly specify -f(no)-second-underscore we
118      use it if we're trying to be compatible with f2c, and not
119      otherwise.  */
120   if (gfc_option.flag_second_underscore == -1)
121     gfc_option.flag_second_underscore = gfc_option.flag_f2c;
122
123   return false;
124 }
125
126
127 /* Set the options for -Wall.  */
128
129 static void
130 set_Wall (void)
131 {
132
133   gfc_option.warn_aliasing = 1;
134   gfc_option.warn_line_truncation = 1;
135   gfc_option.warn_underflow = 1;
136   gfc_option.warn_surprising = 1;
137   gfc_option.warn_unused_labels = 1;
138   gfc_option.warn_nonstd_intrinsics = 1;
139
140   set_Wunused (1);
141   warn_return_type = 1;
142   warn_switch = 1;
143
144   /* We save the value of warn_uninitialized, since if they put
145      -Wuninitialized on the command line, we need to generate a
146      warning about not using it without also specifying -O.  */
147
148   if (warn_uninitialized != 1)
149     warn_uninitialized = 2;
150 }
151
152
153 static void
154 gfc_handle_module_path_options (const char *arg)
155 {
156
157   if (gfc_option.module_dir != NULL)
158     {
159       gfc_status ("gfortran: Only one -M option allowed\n");
160       exit (3);
161     }
162
163   if (arg == NULL)
164     {
165       gfc_status ("gfortran: Directory required after -M\n");
166       exit (3);
167     }
168
169   gfc_option.module_dir = (char *) gfc_getmem (strlen (arg) + 2);
170   strcpy (gfc_option.module_dir, arg);
171   strcat (gfc_option.module_dir, "/");
172 }
173
174 /* Handle command-line options.  Returns 0 if unrecognized, 1 if
175    recognized and handled.  */
176 int
177 gfc_handle_option (size_t scode, const char *arg, int value)
178 {
179   int result = 1;
180   enum opt_code code = (enum opt_code) scode;
181
182   /* Ignore file names.  */
183   if (code == N_OPTS)
184     return 1;
185
186   switch (code)
187     {
188     default:
189       result = 0;
190       break;
191
192     case OPT_Wall:
193       set_Wall ();
194       break;
195
196     case OPT_Waliasing:
197       gfc_option.warn_aliasing = value;
198       break;
199
200     case OPT_Wconversion:
201       gfc_option.warn_conversion = value;
202       break;
203
204     case OPT_Wimplicit_interface:
205       gfc_option.warn_implicit_interface = value;
206       break;
207
208     case OPT_Wline_truncation:
209       gfc_option.warn_line_truncation = value;
210       break;
211
212     case OPT_Wunderflow:
213       gfc_option.warn_underflow = value;
214       break;
215
216     case OPT_Wsurprising:
217       gfc_option.warn_surprising = value;
218       break;
219
220     case OPT_Wunused_labels:
221       gfc_option.warn_unused_labels = value;
222       break;
223
224     case OPT_ff2c:
225       gfc_option.flag_f2c = value;
226       break;
227
228     case OPT_fdollar_ok:
229       gfc_option.flag_dollar_ok = value;
230       break;
231
232     case OPT_fdump_parse_tree:
233       gfc_option.verbose = value;
234       break;
235
236     case OPT_ffixed_form:
237       gfc_option.source_form = FORM_FIXED;
238       break;
239
240     case OPT_ffree_form:
241       gfc_option.source_form = FORM_FREE;
242       break;
243
244     case OPT_funderscoring:
245       gfc_option.flag_underscoring = value;
246       break;
247
248     case OPT_fsecond_underscore:
249       gfc_option.flag_second_underscore = value;
250       break;
251
252     case OPT_fimplicit_none:
253       gfc_option.flag_implicit_none = value;
254       break;
255
256     case OPT_fmax_stack_var_size_:
257       gfc_option.flag_max_stack_var_size = value;
258       break;
259
260     case OPT_fmodule_private:
261       gfc_option.flag_module_access_private = value;
262       break;
263
264     case OPT_fno_backend:
265       gfc_option.flag_no_backend = value;
266       break;
267
268     case OPT_fpack_derived:
269       gfc_option.flag_pack_derived = value;
270       break;
271
272     case OPT_frepack_arrays:
273       gfc_option.flag_repack_arrays = value;
274       break;
275
276     case OPT_ffixed_line_length_none:
277       gfc_option.fixed_line_length = 0;
278       break;
279
280     case OPT_ffixed_line_length_:
281       if (value != 0 && value < 7)
282         gfc_fatal_error ("Fixed line length must be at least seven.");
283       gfc_option.fixed_line_length = value;
284       break;
285
286     case OPT_fmax_identifier_length_:
287       if (value > GFC_MAX_SYMBOL_LEN)
288         gfc_fatal_error ("Maximum supported idenitifier length is %d",
289                          GFC_MAX_SYMBOL_LEN);
290       gfc_option.max_identifier_length = value;
291       break;
292
293     case OPT_qkind_:
294       if (gfc_validate_kind (BT_REAL, value, true) < 0)
295         gfc_fatal_error ("Argument to -fqkind isn't a valid real kind");
296       gfc_option.q_kind = value;
297       break;
298
299     case OPT_fdefault_integer_8:
300       gfc_option.flag_default_integer = value;
301       break;
302
303     case OPT_fdefault_real_8:
304       gfc_option.flag_default_real = value;
305       break;
306
307     case OPT_fdefault_double_8:
308       gfc_option.flag_default_double = value;
309       break;
310
311     case OPT_I:
312       gfc_add_include_path (arg);
313       break;
314
315     case OPT_J:
316     case OPT_M:
317       gfc_handle_module_path_options (arg);
318       break;
319     
320     case OPT_std_f95:
321       gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F95 | GFC_STD_F77;
322       gfc_option.warn_std = GFC_STD_F95_OBS;
323       gfc_option.max_identifier_length = 31;
324       break;
325
326     case OPT_std_f2003:
327       gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F77 
328         | GFC_STD_F2003 | GFC_STD_F95;
329       gfc_option.warn_std = GFC_STD_F95_OBS;
330       gfc_option.max_identifier_length = 63;
331       break;
332
333     case OPT_std_gnu:
334       gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
335         | GFC_STD_F77 | GFC_STD_F95 | GFC_STD_F2003
336         | GFC_STD_GNU;
337       gfc_option.warn_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL;
338       break;
339
340     case OPT_Wnonstd_intrinsics:
341       gfc_option.warn_nonstd_intrinsics = 1;
342       break;
343     }
344
345   return result;
346 }