OSDN Git Service

2010-07-24 Tobias Burnus <burnus@net-b.de>
[pf3gnuchains/gcc-fork.git] / gcc / opts-common.c
1 /* Command line option handling.
2    Copyright (C) 2006, 2007, 2008, 2010 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3.  If not see
18 <http://www.gnu.org/licenses/>.  */
19
20 #include "config.h"
21 #include "system.h"
22 #include "intl.h"
23 #include "coretypes.h"
24 #include "opts.h"
25 #include "options.h"
26
27 /* Perform a binary search to find which option the command-line INPUT
28    matches.  Returns its index in the option array, and
29    OPT_SPECIAL_unknown on failure.
30
31    This routine is quite subtle.  A normal binary search is not good
32    enough because some options can be suffixed with an argument, and
33    multiple sub-matches can occur, e.g. input of "-pedantic" matching
34    the initial substring of "-pedantic-errors".
35
36    A more complicated example is -gstabs.  It should match "-g" with
37    an argument of "stabs".  Suppose, however, that the number and list
38    of switches are such that the binary search tests "-gen-decls"
39    before having tested "-g".  This doesn't match, and as "-gen-decls"
40    is less than "-gstabs", it will become the lower bound of the
41    binary search range, and "-g" will never be seen.  To resolve this
42    issue, 'optc-gen.awk' makes "-gen-decls" point, via the back_chain member,
43    to "-g" so that failed searches that end between "-gen-decls" and
44    the lexicographically subsequent switch know to go back and see if
45    "-g" causes a match (which it does in this example).
46
47    This search is done in such a way that the longest match for the
48    front end in question wins.  If there is no match for the current
49    front end, the longest match for a different front end is returned
50    (or N_OPTS if none) and the caller emits an error message.  */
51 size_t
52 find_opt (const char *input, int lang_mask)
53 {
54   size_t mn, mx, md, opt_len;
55   size_t match_wrong_lang;
56   int comp;
57
58   mn = 0;
59   mx = cl_options_count;
60
61   /* Find mn such this lexicographical inequality holds:
62      cl_options[mn] <= input < cl_options[mn + 1].  */
63   while (mx - mn > 1)
64     {
65       md = (mn + mx) / 2;
66       opt_len = cl_options[md].opt_len;
67       comp = strncmp (input, cl_options[md].opt_text + 1, opt_len);
68
69       if (comp < 0)
70         mx = md;
71       else
72         mn = md;
73     }
74
75   /* This is the switch that is the best match but for a different
76      front end, or OPT_SPECIAL_unknown if there is no match at all.  */
77   match_wrong_lang = OPT_SPECIAL_unknown;
78
79   /* Backtrace the chain of possible matches, returning the longest
80      one, if any, that fits best.  With current GCC switches, this
81      loop executes at most twice.  */
82   do
83     {
84       const struct cl_option *opt = &cl_options[mn];
85
86       /* Is the input either an exact match or a prefix that takes a
87          joined argument?  */
88       if (!strncmp (input, opt->opt_text + 1, opt->opt_len)
89           && (input[opt->opt_len] == '\0' || (opt->flags & CL_JOINED)))
90         {
91           /* If language is OK, return it.  */
92           if (opt->flags & lang_mask)
93             return mn;
94
95           /* If we haven't remembered a prior match, remember this
96              one.  Any prior match is necessarily better.  */
97           if (match_wrong_lang == OPT_SPECIAL_unknown)
98             match_wrong_lang = mn;
99         }
100
101       /* Try the next possibility.  This is cl_options_count if there
102          are no more.  */
103       mn = opt->back_chain;
104     }
105   while (mn != cl_options_count);
106
107   /* Return the best wrong match, or OPT_SPECIAL_unknown if none.  */
108   return match_wrong_lang;
109 }
110
111 /* If ARG is a non-negative integer made up solely of digits, return its
112    value, otherwise return -1.  */
113
114 int
115 integral_argument (const char *arg)
116 {
117   const char *p = arg;
118
119   while (*p && ISDIGIT (*p))
120     p++;
121
122   if (*p == '\0')
123     return atoi (arg);
124
125   return -1;
126 }
127
128 /* Decode the switch beginning at ARGV for the language indicated by
129    LANG_MASK, into the structure *DECODED.  Returns the number of
130    switches consumed.  */
131
132 static unsigned int
133 decode_cmdline_option (const char **argv, unsigned int lang_mask,
134                        struct cl_decoded_option *decoded)
135 {
136   size_t opt_index;
137   const char *opt, *arg = 0;
138   char *dup = 0;
139   int value = 1;
140   unsigned int result = 1;
141   const struct cl_option *option;
142   int errors = 0;
143
144   opt = argv[0];
145
146   opt_index = find_opt (opt + 1, lang_mask | CL_COMMON | CL_TARGET);
147   if (opt_index == OPT_SPECIAL_unknown
148       && (opt[1] == 'W' || opt[1] == 'f' || opt[1] == 'm')
149       && opt[2] == 'n' && opt[3] == 'o' && opt[4] == '-')
150     {
151       /* Drop the "no-" from negative switches.  */
152       size_t len = strlen (opt) - 3;
153
154       dup = XNEWVEC (char, len + 1);
155       dup[0] = '-';
156       dup[1] = opt[1];
157       memcpy (dup + 2, opt + 5, len - 2 + 1);
158       opt = dup;
159       value = 0;
160       opt_index = find_opt (opt + 1, lang_mask | CL_COMMON | CL_TARGET);
161     }
162
163   if (opt_index == OPT_SPECIAL_unknown)
164     {
165       arg = argv[0];
166       goto done;
167     }
168
169   option = &cl_options[opt_index];
170
171   /* Reject negative form of switches that don't take negatives as
172      unrecognized.  */
173   if (!value && (option->flags & CL_REJECT_NEGATIVE))
174     {
175       opt_index = OPT_SPECIAL_unknown;
176       arg = argv[0];
177       goto done;
178     }
179
180   /* Check to see if the option is disabled for this configuration.  */
181   if (option->flags & CL_DISABLED)
182     errors |= CL_ERR_DISABLED;
183
184   /* Sort out any argument the switch takes.  */
185   if (option->flags & CL_JOINED)
186     {
187       /* Have arg point to the original switch.  This is because
188          some code, such as disable_builtin_function, expects its
189          argument to be persistent until the program exits.  */
190       arg = argv[0] + cl_options[opt_index].opt_len + 1;
191       if (!value)
192         arg += strlen ("no-");
193
194       if (*arg == '\0' && !(option->flags & CL_MISSING_OK))
195         {
196           if (option->flags & CL_SEPARATE)
197             {
198               arg = argv[1];
199               result = 2;
200               if (arg == NULL)
201                 result = 1;
202             }
203           else
204             /* Missing argument.  */
205             arg = NULL;
206         }
207     }
208   else if (option->flags & CL_SEPARATE)
209     {
210       arg = argv[1];
211       result = 2;
212       if (arg == NULL)
213         result = 1;
214     }
215
216   /* Check if this is a switch for a different front end.  */
217   if (!(option->flags & (lang_mask | CL_COMMON | CL_TARGET)))
218     errors |= CL_ERR_WRONG_LANG;
219   else if ((option->flags & CL_TARGET)
220            && (option->flags & CL_LANG_ALL)
221            && !(option->flags & lang_mask))
222     /* Complain for target flag language mismatches if any languages
223        are specified.  */
224       errors |= CL_ERR_WRONG_LANG;
225
226   if (arg == NULL && (option->flags & (CL_JOINED | CL_SEPARATE)))
227     errors |= CL_ERR_MISSING_ARG;
228
229   /* If the switch takes an integer, convert it.  */
230   if (arg && (option->flags & CL_UINTEGER))
231     {
232       value = integral_argument (arg);
233       if (value == -1)
234         errors |= CL_ERR_UINT_ARG;
235     }
236
237  done:
238   if (dup)
239     free (dup);
240   decoded->opt_index = opt_index;
241   decoded->arg = arg;
242   decoded->value = value;
243   decoded->errors = errors;
244   switch (result)
245     {
246     case 1:
247       decoded->orig_option_with_args_text = argv[0];
248       break;
249     case 2:
250       decoded->orig_option_with_args_text = concat (argv[0], " ",
251                                                     argv[1], NULL);
252       break;
253     default:
254       gcc_unreachable ();
255     }
256   return result;
257 }
258
259 /* Decode command-line options (ARGC and ARGV being the arguments of
260    main) into an array, setting *DECODED_OPTIONS to a pointer to that
261    array and *DECODED_OPTIONS_COUNT to the number of entries in the
262    array.  The first entry in the array is always one for the program
263    name (OPT_SPECIAL_program_name).  LANG_MASK indicates the language
264    applicable for decoding.  Do not produce any diagnostics or set
265    state outside of these variables.  */
266
267 void
268 decode_cmdline_options_to_array (unsigned int argc, const char **argv, 
269                                  unsigned int lang_mask,
270                                  struct cl_decoded_option **decoded_options,
271                                  unsigned int *decoded_options_count)
272 {
273   unsigned int n, i;
274   struct cl_decoded_option *opt_array;
275   unsigned int num_decoded_options;
276
277   opt_array = XNEWVEC (struct cl_decoded_option, argc);
278
279   opt_array[0].opt_index = OPT_SPECIAL_program_name;
280   opt_array[0].arg = argv[0];
281   opt_array[0].orig_option_with_args_text = argv[0];
282   opt_array[0].value = 1;
283   opt_array[0].errors = 0;
284   num_decoded_options = 1;
285
286   for (i = 1; i < argc; i += n)
287     {
288       const char *opt = argv[i];
289
290       /* Interpret "-" or a non-switch as a file name.  */
291       if (opt[0] != '-' || opt[1] == '\0')
292         {
293           opt_array[num_decoded_options].opt_index = OPT_SPECIAL_input_file;
294           opt_array[num_decoded_options].arg = opt;
295           opt_array[num_decoded_options].orig_option_with_args_text = opt;
296           opt_array[num_decoded_options].value = 1;
297           opt_array[num_decoded_options].errors = 0;
298           num_decoded_options++;
299           n = 1;
300           continue;
301         }
302
303       n = decode_cmdline_option (argv + i, lang_mask,
304                                  &opt_array[num_decoded_options]);
305       num_decoded_options++;
306     }
307
308   opt_array = XRESIZEVEC (struct cl_decoded_option, opt_array,
309                           num_decoded_options);
310   *decoded_options = opt_array;
311   *decoded_options_count = num_decoded_options;
312 }
313
314 /* Return true if NEXT_OPT_IDX cancels OPT_IDX.  Return false if the
315    next one is the same as ORIG_NEXT_OPT_IDX.  */
316
317 static bool
318 cancel_option (int opt_idx, int next_opt_idx, int orig_next_opt_idx)
319 {
320   /* An option can be canceled by the same option or an option with
321      Negative.  */
322   if (cl_options [next_opt_idx].neg_index == opt_idx)
323     return true;
324
325   if (cl_options [next_opt_idx].neg_index != orig_next_opt_idx)
326     return cancel_option (opt_idx, cl_options [next_opt_idx].neg_index,
327                           orig_next_opt_idx);
328
329   return false;
330 }
331
332 /* Filter out options canceled by the ones after them.  */
333
334 void
335 prune_options (int *argcp, char ***argvp)
336 {
337   int argc = *argcp;
338   int *options = XNEWVEC (int, argc);
339   /* We will only return this replacement argv if we remove at least
340      one argument, so it does not need to be size (argc + 1) to
341      make room for the terminating NULL because we will always have
342      freed up at least one slot when we end up using it at all.  */
343   char **argv = XNEWVEC (char *, argc);
344   int i, arg_count, need_prune = 0;
345   const struct cl_option *option;
346   size_t opt_index;
347
348   /* Scan all arguments.  */
349   for (i = 1; i < argc; i++)
350     {
351       int value = 1;
352       const char *opt = (*argvp) [i];
353
354       opt_index = find_opt (opt + 1, -1);
355       if (opt_index == OPT_SPECIAL_unknown
356           && (opt[1] == 'W' || opt[1] == 'f' || opt[1] == 'm')
357           && opt[2] == 'n' && opt[3] == 'o' && opt[4] == '-')
358         {
359           char *dup;
360
361           /* Drop the "no-" from negative switches.  */
362           size_t len = strlen (opt) - 3;
363
364           dup = XNEWVEC (char, len + 1);
365           dup[0] = '-';
366           dup[1] = opt[1];
367           memcpy (dup + 2, opt + 5, len - 2 + 1);
368           opt = dup;
369           value = 0;
370           opt_index = find_opt (opt + 1, -1);
371           free (dup);
372         }
373
374       if (opt_index == OPT_SPECIAL_unknown)
375         {
376 cont:
377           options [i] = 0;
378           continue;
379         }
380
381       option = &cl_options[opt_index];
382       if (option->neg_index < 0)
383         goto cont;
384
385       /* Skip joined switches.  */
386       if ((option->flags & CL_JOINED))
387         goto cont;
388
389       /* Reject negative form of switches that don't take negatives as
390          unrecognized.  */
391       if (!value && (option->flags & CL_REJECT_NEGATIVE))
392         goto cont;
393
394       options [i] = (int) opt_index;
395       need_prune |= options [i];
396     }
397
398   if (!need_prune)
399     goto done;
400
401   /* Remove arguments which are negated by others after them.  */
402   argv [0] = (*argvp) [0];
403   arg_count = 1;
404   for (i = 1; i < argc; i++)
405     {
406       int j, opt_idx;
407
408       opt_idx = options [i];
409       if (opt_idx)
410         {
411           int next_opt_idx;
412           for (j = i + 1; j < argc; j++)
413             {
414               next_opt_idx = options [j];
415               if (next_opt_idx
416                   && cancel_option (opt_idx, next_opt_idx,
417                                     next_opt_idx))
418                 break;
419             }
420         }
421       else
422         goto keep;
423
424       if (j == argc)
425         {
426 keep:
427           argv [arg_count] = (*argvp) [i];
428           arg_count++;
429         }
430     }
431
432   if (arg_count != argc)
433     {
434       *argcp = arg_count;
435       *argvp = argv;
436       /* Add NULL-termination.  Guaranteed not to overflow because
437          arg_count here can only be less than argc.  */
438       argv[arg_count] = 0;
439     }
440   else
441     {
442 done:
443       free (argv);
444     }
445
446   free (options);
447 }