OSDN Git Service

f0135bd7f95c006886cf3a9bb84e046d69bc89a7
[pf3gnuchains/gcc-fork.git] / gcc / fortran / options.c
1 /* Parse and display command line options.
2    Copyright (C) 2000, 2001, 2002, 2003, 2004 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 #include <string.h>
24 #include <stdlib.h>
25
26 #include "config.h"
27 #include "system.h"
28 #include "coretypes.h"
29 #include "tree.h"
30 #include "flags.h"
31 #include "intl.h"
32 #include "opts.h"
33 #include "options.h"
34 #include "tree-inline.h"
35
36 #include "gfortran.h"
37
38 gfc_option_t gfc_option;
39
40
41 /* Get ready for options handling.  */
42
43 unsigned int
44 gfc_init_options (unsigned int argc ATTRIBUTE_UNUSED,
45                   const char **argv ATTRIBUTE_UNUSED)
46 {
47
48   gfc_option.source = NULL;
49   gfc_option.module_dir = NULL;
50   gfc_option.source_form = FORM_UNKNOWN;
51   gfc_option.fixed_line_length = 72;
52   gfc_option.max_identifier_length = GFC_MAX_SYMBOL_LEN;
53   gfc_option.verbose = 0;
54
55   gfc_option.warn_aliasing = 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_unused_labels = 0;
61
62   gfc_option.flag_dollar_ok = 0;
63   gfc_option.flag_underscoring = 1;
64   gfc_option.flag_second_underscore = 1;
65   gfc_option.flag_implicit_none = 0;
66   gfc_option.flag_max_stack_var_size = 32768;
67   gfc_option.flag_module_access_private = 0;
68   gfc_option.flag_no_backend = 0;
69   gfc_option.flag_pack_derived = 0;
70   gfc_option.flag_repack_arrays = 0;
71
72   gfc_option.q_kind = gfc_default_double_kind ();
73   gfc_option.i8 = 0;
74   gfc_option.r8 = 0;
75   gfc_option.d8 = 0;
76
77   flag_argument_noalias = 2;
78
79   gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
80     | GFC_STD_F2003_OBS | GFC_STD_F2003_DEL | GFC_STD_F2003 | GFC_STD_GNU;
81   gfc_option.warn_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
82     | GFC_STD_F2003 | GFC_STD_GNU;
83
84   return CL_F95;
85 }
86
87
88 /* Finalize commandline options.  */
89
90 bool
91 gfc_post_options (const char **pfilename)
92 {
93   const char *filename = *pfilename;
94
95   /* Verify the input file name.  */
96   if (!filename || strcmp (filename, "-") == 0)
97     {
98       filename = "";
99     }
100
101   gfc_option.source = filename;
102
103   flag_inline_trees = 1;
104
105   /* Use tree inlining.  */
106   if (!flag_no_inline)
107     flag_no_inline = 1;
108   if (flag_inline_functions)
109     {
110       flag_inline_trees = 2;
111       flag_inline_functions = 0;
112     }
113   
114   return false;
115 }
116
117
118 /* Set the options for -Wall.  */
119
120 static void
121 set_Wall (void)
122 {
123
124   gfc_option.warn_aliasing = 1;
125   gfc_option.warn_line_truncation = 1;
126   gfc_option.warn_surprising = 1;
127   gfc_option.warn_unused_labels = 1;
128
129   set_Wunused (1);
130   warn_return_type = 1;
131   warn_switch = 1;
132
133   /* We save the value of warn_uninitialized, since if they put
134      -Wuninitialized on the command line, we need to generate a
135      warning about not using it without also specifying -O.  */
136
137   if (warn_uninitialized != 1)
138     warn_uninitialized = 2;
139 }
140
141
142 static void
143 gfc_handle_module_path_options (const char *arg)
144 {
145
146   if (gfc_option.module_dir != NULL)
147     {
148       gfc_status ("gfortran: Only one -M option allowed\n");
149       exit (3);
150     }
151
152   if (arg == NULL)
153     {
154       gfc_status ("gfortran: Directory required after -M\n");
155       exit (3);
156     }
157
158   gfc_option.module_dir = (char *) gfc_getmem (strlen (arg) + 2);
159   strcpy (gfc_option.module_dir, arg);
160   strcat (gfc_option.module_dir, "/");
161 }
162
163 /* Handle command-line options.  Returns 0 if unrecognized, 1 if
164    recognized and handled.  */
165 int
166 gfc_handle_option (size_t scode, const char *arg, int value)
167 {
168   int result = 1;
169   enum opt_code code = (enum opt_code) scode;
170
171   /* Ignore file names.  */
172   if (code == N_OPTS)
173     return 1;
174
175   switch (code)
176     {
177     default:
178       result = 0;
179       break;
180
181     case OPT_Wall:
182       set_Wall ();
183       break;
184
185     case OPT_Waliasing:
186       gfc_option.warn_aliasing = value;
187       break;
188
189     case OPT_Wconversion:
190       gfc_option.warn_conversion = value;
191       break;
192
193     case OPT_Wimplicit_interface:
194       gfc_option.warn_implicit_interface = value;
195       break;
196
197     case OPT_Wline_truncation:
198       gfc_option.warn_line_truncation = value;
199       break;
200
201     case OPT_Wsurprising:
202       gfc_option.warn_surprising = value;
203       break;
204
205     case OPT_Wunused_labels:
206       gfc_option.warn_unused_labels = value;
207       break;
208
209     case OPT_fdollar_ok:
210       gfc_option.flag_dollar_ok = value;
211       break;
212
213     case OPT_fdump_parse_tree:
214       gfc_option.verbose = value;
215       break;
216
217     case OPT_ffixed_form:
218       gfc_option.source_form = FORM_FIXED;
219       break;
220
221     case OPT_ffree_form:
222       gfc_option.source_form = FORM_FREE;
223       break;
224
225     case OPT_funderscoring:
226       gfc_option.flag_underscoring = value;
227       break;
228
229     case OPT_fsecond_underscore:
230       gfc_option.flag_second_underscore = value;
231       break;
232
233     case OPT_fimplicit_none:
234       gfc_option.flag_implicit_none = value;
235       break;
236
237     case OPT_fmax_stack_var_size_:
238       gfc_option.flag_max_stack_var_size = value;
239       break;
240
241     case OPT_fmodule_private:
242       gfc_option.flag_module_access_private = value;
243       break;
244
245     case OPT_fno_backend:
246       gfc_option.flag_no_backend = value;
247       break;
248
249     case OPT_fpack_derived:
250       gfc_option.flag_pack_derived = value;
251       break;
252
253     case OPT_frepack_arrays:
254       gfc_option.flag_repack_arrays = value;
255       break;
256
257     case OPT_ffixed_line_length_80:
258       gfc_option.fixed_line_length = 80;
259       break;
260
261     case OPT_ffixed_line_length_132:
262       gfc_option.fixed_line_length = 132;
263       break;
264
265     case OPT_fmax_identifier_length_:
266       if (value > GFC_MAX_SYMBOL_LEN)
267         gfc_fatal_error ("Maximum supported idenitifier length is %d",
268                          GFC_MAX_SYMBOL_LEN);
269       gfc_option.max_identifier_length = value;
270       break;
271
272     case OPT_qkind_:
273       if (gfc_validate_kind (BT_REAL, value) < 0)
274         gfc_fatal_error ("Argument to -fqkind isn't a valid real kind");
275       gfc_option.q_kind = value;
276       break;
277
278     case OPT_i8:
279       gfc_option.i8 = value;
280       break;
281
282     case OPT_r8:
283       gfc_option.r8 = value;
284       break;
285
286     case OPT_d8:
287       gfc_option.d8 = value;
288       break;
289
290     case OPT_I:
291       gfc_add_include_path (arg);
292       break;
293
294     case OPT_J:
295     case OPT_M:
296       gfc_handle_module_path_options (arg);
297     
298     case OPT_std_f95:
299       gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F2003_OBS
300         | GFC_STD_F2003_DEL;
301       gfc_option.warn_std = GFC_STD_F95_OBS;
302       gfc_option.max_identifier_length = 31;
303       break;
304
305     case OPT_std_f2003:
306       gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F2003_OBS
307         | GFC_STD_F2003;
308       gfc_option.warn_std = GFC_STD_F95_OBS | GFC_STD_F2003_OBS;
309       gfc_option.max_identifier_length = 63;
310       break;
311
312     case OPT_std_gnu:
313       gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
314         | GFC_STD_F2003_OBS | GFC_STD_F2003_DEL | GFC_STD_F2003 | GFC_STD_GNU;
315       gfc_option.warn_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
316         | GFC_STD_F2003_OBS | GFC_STD_F2003_DEL | GFC_STD_GNU;
317       break;
318     }
319
320   return result;
321 }