xref: /dragonfly/contrib/gcc-4.7/gcc/opts-common.c (revision abf903a5)
1 /* Command line option handling.
2    Copyright (C) 2006, 2007, 2008, 2010, 2011 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 "flags.h"
26 #include "diagnostic.h"
27 
28 static void prune_options (struct cl_decoded_option **, unsigned int *);
29 
30 /* Perform a binary search to find which option the command-line INPUT
31    matches.  Returns its index in the option array, and
32    OPT_SPECIAL_unknown on failure.
33 
34    This routine is quite subtle.  A normal binary search is not good
35    enough because some options can be suffixed with an argument, and
36    multiple sub-matches can occur, e.g. input of "-pedantic" matching
37    the initial substring of "-pedantic-errors".
38 
39    A more complicated example is -gstabs.  It should match "-g" with
40    an argument of "stabs".  Suppose, however, that the number and list
41    of switches are such that the binary search tests "-gen-decls"
42    before having tested "-g".  This doesn't match, and as "-gen-decls"
43    is less than "-gstabs", it will become the lower bound of the
44    binary search range, and "-g" will never be seen.  To resolve this
45    issue, 'optc-gen.awk' makes "-gen-decls" point, via the back_chain member,
46    to "-g" so that failed searches that end between "-gen-decls" and
47    the lexicographically subsequent switch know to go back and see if
48    "-g" causes a match (which it does in this example).
49 
50    This search is done in such a way that the longest match for the
51    front end in question wins.  If there is no match for the current
52    front end, the longest match for a different front end is returned
53    (or N_OPTS if none) and the caller emits an error message.  */
54 size_t
55 find_opt (const char *input, unsigned int lang_mask)
56 {
57   size_t mn, mn_orig, mx, md, opt_len;
58   size_t match_wrong_lang;
59   int comp;
60 
61   mn = 0;
62   mx = cl_options_count;
63 
64   /* Find mn such this lexicographical inequality holds:
65      cl_options[mn] <= input < cl_options[mn + 1].  */
66   while (mx - mn > 1)
67     {
68       md = (mn + mx) / 2;
69       opt_len = cl_options[md].opt_len;
70       comp = strncmp (input, cl_options[md].opt_text + 1, opt_len);
71 
72       if (comp < 0)
73 	mx = md;
74       else
75 	mn = md;
76     }
77 
78   mn_orig = mn;
79 
80   /* This is the switch that is the best match but for a different
81      front end, or OPT_SPECIAL_unknown if there is no match at all.  */
82   match_wrong_lang = OPT_SPECIAL_unknown;
83 
84   /* Backtrace the chain of possible matches, returning the longest
85      one, if any, that fits best.  With current GCC switches, this
86      loop executes at most twice.  */
87   do
88     {
89       const struct cl_option *opt = &cl_options[mn];
90 
91       /* Is the input either an exact match or a prefix that takes a
92 	 joined argument?  */
93       if (!strncmp (input, opt->opt_text + 1, opt->opt_len)
94 	  && (input[opt->opt_len] == '\0' || (opt->flags & CL_JOINED)))
95 	{
96 	  /* If language is OK, return it.  */
97 	  if (opt->flags & lang_mask)
98 	    return mn;
99 
100 	  /* If we haven't remembered a prior match, remember this
101 	     one.  Any prior match is necessarily better.  */
102 	  if (match_wrong_lang == OPT_SPECIAL_unknown)
103 	    match_wrong_lang = mn;
104 	}
105 
106       /* Try the next possibility.  This is cl_options_count if there
107 	 are no more.  */
108       mn = opt->back_chain;
109     }
110   while (mn != cl_options_count);
111 
112   if (match_wrong_lang == OPT_SPECIAL_unknown && input[0] == '-')
113     {
114       /* Long options, starting "--", may be abbreviated if the
115 	 abbreviation is unambiguous.  This only applies to options
116 	 not taking a joined argument, and abbreviations of "--option"
117 	 are permitted even if there is a variant "--option=".  */
118       size_t mnc = mn_orig + 1;
119       size_t cmp_len = strlen (input);
120       while (mnc < cl_options_count
121 	     && strncmp (input, cl_options[mnc].opt_text + 1, cmp_len) == 0)
122 	{
123 	  /* Option matching this abbreviation.  OK if it is the first
124 	     match and that does not take a joined argument, or the
125 	     second match, taking a joined argument and with only '='
126 	     added to the first match; otherwise considered
127 	     ambiguous.  */
128 	  if (mnc == mn_orig + 1
129 	      && !(cl_options[mnc].flags & CL_JOINED))
130 	    match_wrong_lang = mnc;
131 	  else if (mnc == mn_orig + 2
132 		   && match_wrong_lang == mn_orig + 1
133 		   && (cl_options[mnc].flags & CL_JOINED)
134 		   && (cl_options[mnc].opt_len
135 		       == cl_options[mn_orig + 1].opt_len + 1)
136 		   && strncmp (cl_options[mnc].opt_text + 1,
137 			       cl_options[mn_orig + 1].opt_text + 1,
138 			       cl_options[mn_orig + 1].opt_len) == 0)
139 	    ; /* OK, as long as there are no more matches.  */
140 	  else
141 	    return OPT_SPECIAL_unknown;
142 	  mnc++;
143 	}
144     }
145 
146   /* Return the best wrong match, or OPT_SPECIAL_unknown if none.  */
147   return match_wrong_lang;
148 }
149 
150 /* If ARG is a non-negative integer made up solely of digits, return its
151    value, otherwise return -1.  */
152 
153 int
154 integral_argument (const char *arg)
155 {
156   const char *p = arg;
157 
158   while (*p && ISDIGIT (*p))
159     p++;
160 
161   if (*p == '\0')
162     return atoi (arg);
163 
164   return -1;
165 }
166 
167 /* Return whether OPTION is OK for the language given by
168    LANG_MASK.  */
169 static bool
170 option_ok_for_language (const struct cl_option *option,
171 			unsigned int lang_mask)
172 {
173   if (!(option->flags & lang_mask))
174     return false;
175   else if ((option->flags & CL_TARGET)
176 	   && (option->flags & (CL_LANG_ALL | CL_DRIVER))
177 	   && !(option->flags & (lang_mask & ~CL_COMMON & ~CL_TARGET)))
178     /* Complain for target flag language mismatches if any languages
179        are specified.  */
180     return false;
181   return true;
182 }
183 
184 /* Return whether ENUM_ARG is OK for the language given by
185    LANG_MASK.  */
186 
187 static bool
188 enum_arg_ok_for_language (const struct cl_enum_arg *enum_arg,
189 			  unsigned int lang_mask)
190 {
191   return (lang_mask & CL_DRIVER) || !(enum_arg->flags & CL_ENUM_DRIVER_ONLY);
192 }
193 
194 /* Look up ARG in ENUM_ARGS for language LANG_MASK, returning true and
195    storing the value in *VALUE if found, and returning false without
196    modifying *VALUE if not found.  */
197 
198 static bool
199 enum_arg_to_value (const struct cl_enum_arg *enum_args,
200 		   const char *arg, int *value, unsigned int lang_mask)
201 {
202   unsigned int i;
203 
204   for (i = 0; enum_args[i].arg != NULL; i++)
205     if (strcmp (arg, enum_args[i].arg) == 0
206 	&& enum_arg_ok_for_language (&enum_args[i], lang_mask))
207       {
208 	*value = enum_args[i].value;
209 	return true;
210       }
211 
212   return false;
213 }
214 
215 /* Look up ARG in the enum used by option OPT_INDEX for language
216    LANG_MASK, returning true and storing the value in *VALUE if found,
217    and returning false without modifying *VALUE if not found.  */
218 
219 bool
220 opt_enum_arg_to_value (size_t opt_index, const char *arg, int *value,
221 		       unsigned int lang_mask)
222 {
223   const struct cl_option *option = &cl_options[opt_index];
224 
225   gcc_assert (option->var_type == CLVC_ENUM);
226 
227   return enum_arg_to_value (cl_enums[option->var_enum].values, arg,
228 			    value, lang_mask);
229 }
230 
231 /* Look of VALUE in ENUM_ARGS for language LANG_MASK and store the
232    corresponding string in *ARGP, returning true if the found string
233    was marked as canonical, false otherwise.  If VALUE is not found
234    (which may be the case for uninitialized values if the relevant
235    option has not been passed), set *ARGP to NULL and return
236    false.  */
237 
238 bool
239 enum_value_to_arg (const struct cl_enum_arg *enum_args,
240 		   const char **argp, int value, unsigned int lang_mask)
241 {
242   unsigned int i;
243 
244   for (i = 0; enum_args[i].arg != NULL; i++)
245     if (enum_args[i].value == value
246 	&& (enum_args[i].flags & CL_ENUM_CANONICAL)
247 	&& enum_arg_ok_for_language (&enum_args[i], lang_mask))
248       {
249 	*argp = enum_args[i].arg;
250 	return true;
251       }
252 
253   for (i = 0; enum_args[i].arg != NULL; i++)
254     if (enum_args[i].value == value
255 	&& enum_arg_ok_for_language (&enum_args[i], lang_mask))
256       {
257 	*argp = enum_args[i].arg;
258 	return false;
259       }
260 
261   *argp = NULL;
262   return false;
263 }
264 
265 /* Fill in the canonical option part of *DECODED with an option
266    described by OPT_INDEX, ARG and VALUE.  */
267 
268 static void
269 generate_canonical_option (size_t opt_index, const char *arg, int value,
270 			   struct cl_decoded_option *decoded)
271 {
272   const struct cl_option *option = &cl_options[opt_index];
273   const char *opt_text = option->opt_text;
274 
275   if (value == 0
276       && !option->cl_reject_negative
277       && (opt_text[1] == 'W' || opt_text[1] == 'f' || opt_text[1] == 'm'))
278     {
279       char *t = XNEWVEC (char, option->opt_len + 5);
280       t[0] = '-';
281       t[1] = opt_text[1];
282       t[2] = 'n';
283       t[3] = 'o';
284       t[4] = '-';
285       memcpy (t + 5, opt_text + 2, option->opt_len);
286       opt_text = t;
287     }
288 
289   decoded->canonical_option[2] = NULL;
290   decoded->canonical_option[3] = NULL;
291 
292   if (arg)
293     {
294       if ((option->flags & CL_SEPARATE)
295 	  && !option->cl_separate_alias)
296 	{
297 	  decoded->canonical_option[0] = opt_text;
298 	  decoded->canonical_option[1] = arg;
299 	  decoded->canonical_option_num_elements = 2;
300 	}
301       else
302 	{
303 	  gcc_assert (option->flags & CL_JOINED);
304 	  decoded->canonical_option[0] = concat (opt_text, arg, NULL);
305 	  decoded->canonical_option[1] = NULL;
306 	  decoded->canonical_option_num_elements = 1;
307 	  if (opt_text != option->opt_text)
308 	    free (CONST_CAST (char *, opt_text));
309 	}
310     }
311   else
312     {
313       decoded->canonical_option[0] = opt_text;
314       decoded->canonical_option[1] = NULL;
315       decoded->canonical_option_num_elements = 1;
316     }
317 }
318 
319 /* Structure describing mappings from options on the command line to
320    options to look up with find_opt.  */
321 struct option_map
322 {
323   /* Prefix of the option on the command line.  */
324   const char *opt0;
325   /* If two argv elements are considered to be merged into one option,
326      prefix for the second element, otherwise NULL.  */
327   const char *opt1;
328   /* The new prefix to map to.  */
329   const char *new_prefix;
330   /* Whether at least one character is needed following opt1 or opt0
331      for this mapping to be used.  (--optimize= is valid for -O, but
332      --warn- is not valid for -W.)  */
333   bool another_char_needed;
334   /* Whether the original option is a negated form of the option
335      resulting from this map.  */
336   bool negated;
337 };
338 static const struct option_map option_map[] =
339   {
340     { "-Wno-", NULL, "-W", false, true },
341     { "-fno-", NULL, "-f", false, true },
342     { "-mno-", NULL, "-m", false, true },
343     { "--debug=", NULL, "-g", false, false },
344     { "--machine-", NULL, "-m", true, false },
345     { "--machine-no-", NULL, "-m", false, true },
346     { "--machine=", NULL, "-m", false, false },
347     { "--machine=no-", NULL, "-m", false, true },
348     { "--machine", "", "-m", false, false },
349     { "--machine", "no-", "-m", false, true },
350     { "--optimize=", NULL, "-O", false, false },
351     { "--std=", NULL, "-std=", false, false },
352     { "--std", "", "-std=", false, false },
353     { "--warn-", NULL, "-W", true, false },
354     { "--warn-no-", NULL, "-W", false, true },
355     { "--", NULL, "-f", true, false },
356     { "--no-", NULL, "-f", false, true }
357   };
358 
359 /* Decode the switch beginning at ARGV for the language indicated by
360    LANG_MASK (including CL_COMMON and CL_TARGET if applicable), into
361    the structure *DECODED.  Returns the number of switches
362    consumed.  */
363 
364 static unsigned int
365 decode_cmdline_option (const char **argv, unsigned int lang_mask,
366 		       struct cl_decoded_option *decoded)
367 {
368   size_t opt_index;
369   const char *arg = 0;
370   int value = 1;
371   unsigned int result = 1, i, extra_args, separate_args = 0;
372   int adjust_len = 0;
373   size_t total_len;
374   char *p;
375   const struct cl_option *option;
376   int errors = 0;
377   const char *warn_message = NULL;
378   bool separate_arg_flag;
379   bool joined_arg_flag;
380   bool have_separate_arg = false;
381 
382   extra_args = 0;
383 
384   opt_index = find_opt (argv[0] + 1, lang_mask);
385   i = 0;
386   while (opt_index == OPT_SPECIAL_unknown
387 	 && i < ARRAY_SIZE (option_map))
388     {
389       const char *opt0 = option_map[i].opt0;
390       const char *opt1 = option_map[i].opt1;
391       const char *new_prefix = option_map[i].new_prefix;
392       bool another_char_needed = option_map[i].another_char_needed;
393       size_t opt0_len = strlen (opt0);
394       size_t opt1_len = (opt1 == NULL ? 0 : strlen (opt1));
395       size_t optn_len = (opt1 == NULL ? opt0_len : opt1_len);
396       size_t new_prefix_len = strlen (new_prefix);
397 
398       extra_args = (opt1 == NULL ? 0 : 1);
399       value = !option_map[i].negated;
400 
401       if (strncmp (argv[0], opt0, opt0_len) == 0
402 	  && (opt1 == NULL
403 	      || (argv[1] != NULL && strncmp (argv[1], opt1, opt1_len) == 0))
404 	  && (!another_char_needed
405 	      || argv[extra_args][optn_len] != 0))
406 	{
407 	  size_t arglen = strlen (argv[extra_args]);
408 	  char *dup;
409 
410 	  adjust_len = (int) optn_len - (int) new_prefix_len;
411 	  dup = XNEWVEC (char, arglen + 1 - adjust_len);
412 	  memcpy (dup, new_prefix, new_prefix_len);
413 	  memcpy (dup + new_prefix_len, argv[extra_args] + optn_len,
414 		  arglen - optn_len + 1);
415 	  opt_index = find_opt (dup + 1, lang_mask);
416 	  free (dup);
417 	}
418       i++;
419     }
420 
421   if (opt_index == OPT_SPECIAL_unknown)
422     {
423       arg = argv[0];
424       extra_args = 0;
425       value = 1;
426       goto done;
427     }
428 
429   option = &cl_options[opt_index];
430 
431   /* Reject negative form of switches that don't take negatives as
432      unrecognized.  */
433   if (!value && option->cl_reject_negative)
434     {
435       opt_index = OPT_SPECIAL_unknown;
436       errors |= CL_ERR_NEGATIVE;
437       arg = argv[0];
438       goto done;
439     }
440 
441   result = extra_args + 1;
442   warn_message = option->warn_message;
443 
444   /* Check to see if the option is disabled for this configuration.  */
445   if (option->cl_disabled)
446     errors |= CL_ERR_DISABLED;
447 
448   /* Determine whether there may be a separate argument based on
449      whether this option is being processed for the driver, and, if
450      so, how many such arguments.  */
451   separate_arg_flag = ((option->flags & CL_SEPARATE)
452 		       && !(option->cl_no_driver_arg
453 			    && (lang_mask & CL_DRIVER)));
454   separate_args = (separate_arg_flag
455 		   ? option->cl_separate_nargs + 1
456 		   : 0);
457   joined_arg_flag = (option->flags & CL_JOINED) != 0;
458 
459   /* Sort out any argument the switch takes.  */
460   if (joined_arg_flag)
461     {
462       /* Have arg point to the original switch.  This is because
463 	 some code, such as disable_builtin_function, expects its
464 	 argument to be persistent until the program exits.  */
465       arg = argv[extra_args] + cl_options[opt_index].opt_len + 1 + adjust_len;
466 
467       if (*arg == '\0' && !option->cl_missing_ok)
468 	{
469 	  if (separate_arg_flag)
470 	    {
471 	      arg = argv[extra_args + 1];
472 	      result = extra_args + 2;
473 	      if (arg == NULL)
474 		result = extra_args + 1;
475 	      else
476 		have_separate_arg = true;
477 	    }
478 	  else
479 	    /* Missing argument.  */
480 	    arg = NULL;
481 	}
482     }
483   else if (separate_arg_flag)
484     {
485       arg = argv[extra_args + 1];
486       for (i = 0; i < separate_args; i++)
487 	if (argv[extra_args + 1 + i] == NULL)
488 	  {
489 	    errors |= CL_ERR_MISSING_ARG;
490 	    break;
491 	  }
492       result = extra_args + 1 + i;
493       if (arg != NULL)
494 	have_separate_arg = true;
495     }
496 
497   if (arg == NULL && (separate_arg_flag || joined_arg_flag))
498     errors |= CL_ERR_MISSING_ARG;
499 
500   /* Is this option an alias (or an ignored option, marked as an alias
501      of OPT_SPECIAL_ignore)?  */
502   if (option->alias_target != N_OPTS
503       && (!option->cl_separate_alias || have_separate_arg))
504     {
505       size_t new_opt_index = option->alias_target;
506 
507       if (new_opt_index == OPT_SPECIAL_ignore)
508 	{
509 	  gcc_assert (option->alias_arg == NULL);
510 	  gcc_assert (option->neg_alias_arg == NULL);
511 	  opt_index = new_opt_index;
512 	  arg = NULL;
513 	  value = 1;
514 	}
515       else
516 	{
517 	  const struct cl_option *new_option = &cl_options[new_opt_index];
518 
519 	  /* The new option must not be an alias itself.  */
520 	  gcc_assert (new_option->alias_target == N_OPTS
521 		      || new_option->cl_separate_alias);
522 
523 	  if (option->neg_alias_arg)
524 	    {
525 	      gcc_assert (option->alias_arg != NULL);
526 	      gcc_assert (arg == NULL);
527 	      gcc_assert (!option->cl_negative_alias);
528 	      if (value)
529 		arg = option->alias_arg;
530 	      else
531 		arg = option->neg_alias_arg;
532 	      value = 1;
533 	    }
534 	  else if (option->alias_arg)
535 	    {
536 	      gcc_assert (value == 1);
537 	      gcc_assert (arg == NULL);
538 	      gcc_assert (!option->cl_negative_alias);
539 	      arg = option->alias_arg;
540 	    }
541 
542 	  if (option->cl_negative_alias)
543 	    value = !value;
544 
545 	  opt_index = new_opt_index;
546 	  option = new_option;
547 
548 	  if (value == 0)
549 	    gcc_assert (!option->cl_reject_negative);
550 
551 	  /* Recompute what arguments are allowed.  */
552 	  separate_arg_flag = ((option->flags & CL_SEPARATE)
553 			       && !(option->cl_no_driver_arg
554 				    && (lang_mask & CL_DRIVER)));
555 	  joined_arg_flag = (option->flags & CL_JOINED) != 0;
556 
557 	  if (separate_args > 1 || option->cl_separate_nargs)
558 	    gcc_assert (separate_args
559 			== (unsigned int) option->cl_separate_nargs + 1);
560 
561 	  if (!(errors & CL_ERR_MISSING_ARG))
562 	    {
563 	      if (separate_arg_flag || joined_arg_flag)
564 		{
565 		  if (option->cl_missing_ok && arg == NULL)
566 		    arg = "";
567 		  gcc_assert (arg != NULL);
568 		}
569 	      else
570 		gcc_assert (arg == NULL);
571 	    }
572 
573 	  /* Recheck for warnings and disabled options.  */
574 	  if (option->warn_message)
575 	    {
576 	      gcc_assert (warn_message == NULL);
577 	      warn_message = option->warn_message;
578 	    }
579 	  if (option->cl_disabled)
580 	    errors |= CL_ERR_DISABLED;
581 	}
582     }
583 
584   /* Check if this is a switch for a different front end.  */
585   if (!option_ok_for_language (option, lang_mask))
586     errors |= CL_ERR_WRONG_LANG;
587 
588   /* Convert the argument to lowercase if appropriate.  */
589   if (arg && option->cl_tolower)
590     {
591       size_t j;
592       size_t len = strlen (arg);
593       char *arg_lower = XNEWVEC (char, len + 1);
594 
595       for (j = 0; j < len; j++)
596 	arg_lower[j] = TOLOWER ((unsigned char) arg[j]);
597       arg_lower[len] = 0;
598       arg = arg_lower;
599     }
600 
601   /* If the switch takes an integer, convert it.  */
602   if (arg && option->cl_uinteger)
603     {
604       value = integral_argument (arg);
605       if (value == -1)
606 	errors |= CL_ERR_UINT_ARG;
607     }
608 
609   /* If the switch takes an enumerated argument, convert it.  */
610   if (arg && (option->var_type == CLVC_ENUM))
611     {
612       const struct cl_enum *e = &cl_enums[option->var_enum];
613 
614       gcc_assert (value == 1);
615       if (enum_arg_to_value (e->values, arg, &value, lang_mask))
616 	{
617 	  const char *carg = NULL;
618 
619 	  if (enum_value_to_arg (e->values, &carg, value, lang_mask))
620 	    arg = carg;
621 	  gcc_assert (carg != NULL);
622 	}
623       else
624 	errors |= CL_ERR_ENUM_ARG;
625     }
626 
627  done:
628   decoded->opt_index = opt_index;
629   decoded->arg = arg;
630   decoded->value = value;
631   decoded->errors = errors;
632   decoded->warn_message = warn_message;
633 
634   if (opt_index == OPT_SPECIAL_unknown)
635     gcc_assert (result == 1);
636 
637   gcc_assert (result >= 1 && result <= ARRAY_SIZE (decoded->canonical_option));
638   decoded->canonical_option_num_elements = result;
639   total_len = 0;
640   for (i = 0; i < ARRAY_SIZE (decoded->canonical_option); i++)
641     {
642       if (i < result)
643 	{
644 	  size_t len;
645 	  if (opt_index == OPT_SPECIAL_unknown)
646 	    decoded->canonical_option[i] = argv[i];
647 	  else
648 	    decoded->canonical_option[i] = NULL;
649 	  len = strlen (argv[i]);
650 	  /* If the argument is an empty string, we will print it as "" in
651 	     orig_option_with_args_text.  */
652 	  total_len += (len != 0 ? len : 2) + 1;
653 	}
654       else
655 	decoded->canonical_option[i] = NULL;
656     }
657   if (opt_index != OPT_SPECIAL_unknown && opt_index != OPT_SPECIAL_ignore)
658     {
659       generate_canonical_option (opt_index, arg, value, decoded);
660       if (separate_args > 1)
661 	{
662 	  for (i = 0; i < separate_args; i++)
663 	    {
664 	      if (argv[extra_args + 1 + i] == NULL)
665 		  break;
666 	      else
667 		decoded->canonical_option[1 + i] = argv[extra_args + 1 + i];
668 	    }
669 	  gcc_assert (result == 1 + i);
670 	  decoded->canonical_option_num_elements = result;
671 	}
672     }
673   decoded->orig_option_with_args_text = p = XNEWVEC (char, total_len);
674   for (i = 0; i < result; i++)
675     {
676       size_t len = strlen (argv[i]);
677 
678       /* Print the empty string verbally.  */
679       if (len == 0)
680 	{
681 	  *p++ = '"';
682 	  *p++ = '"';
683 	}
684       else
685 	memcpy (p, argv[i], len);
686       p += len;
687       if (i == result - 1)
688 	*p++ = 0;
689       else
690 	*p++ = ' ';
691     }
692 
693   return result;
694 }
695 
696 /* Decode command-line options (ARGC and ARGV being the arguments of
697    main) into an array, setting *DECODED_OPTIONS to a pointer to that
698    array and *DECODED_OPTIONS_COUNT to the number of entries in the
699    array.  The first entry in the array is always one for the program
700    name (OPT_SPECIAL_program_name).  LANG_MASK indicates the language
701    flags applicable for decoding (including CL_COMMON and CL_TARGET if
702    those options should be considered applicable).  Do not produce any
703    diagnostics or set state outside of these variables.  */
704 
705 void
706 decode_cmdline_options_to_array (unsigned int argc, const char **argv,
707 				 unsigned int lang_mask,
708 				 struct cl_decoded_option **decoded_options,
709 				 unsigned int *decoded_options_count)
710 {
711   unsigned int n, i;
712   struct cl_decoded_option *opt_array;
713   unsigned int num_decoded_options;
714 
715   opt_array = XNEWVEC (struct cl_decoded_option, argc);
716 
717   opt_array[0].opt_index = OPT_SPECIAL_program_name;
718   opt_array[0].warn_message = NULL;
719   opt_array[0].arg = argv[0];
720   opt_array[0].orig_option_with_args_text = argv[0];
721   opt_array[0].canonical_option_num_elements = 1;
722   opt_array[0].canonical_option[0] = argv[0];
723   opt_array[0].canonical_option[1] = NULL;
724   opt_array[0].canonical_option[2] = NULL;
725   opt_array[0].canonical_option[3] = NULL;
726   opt_array[0].value = 1;
727   opt_array[0].errors = 0;
728   num_decoded_options = 1;
729 
730   for (i = 1; i < argc; i += n)
731     {
732       const char *opt = argv[i];
733 
734       /* Interpret "-" or a non-switch as a file name.  */
735       if (opt[0] != '-' || opt[1] == '\0')
736 	{
737 	  generate_option_input_file (opt, &opt_array[num_decoded_options]);
738 	  num_decoded_options++;
739 	  n = 1;
740 	  continue;
741 	}
742 
743       n = decode_cmdline_option (argv + i, lang_mask,
744 				 &opt_array[num_decoded_options]);
745       num_decoded_options++;
746     }
747 
748   *decoded_options = opt_array;
749   *decoded_options_count = num_decoded_options;
750   prune_options (decoded_options, decoded_options_count);
751 }
752 
753 /* Return true if NEXT_OPT_IDX cancels OPT_IDX.  Return false if the
754    next one is the same as ORIG_NEXT_OPT_IDX.  */
755 
756 static bool
757 cancel_option (int opt_idx, int next_opt_idx, int orig_next_opt_idx)
758 {
759   /* An option can be canceled by the same option or an option with
760      Negative.  */
761   if (cl_options [next_opt_idx].neg_index == opt_idx)
762     return true;
763 
764   if (cl_options [next_opt_idx].neg_index != orig_next_opt_idx)
765     return cancel_option (opt_idx, cl_options [next_opt_idx].neg_index,
766 			  orig_next_opt_idx);
767 
768   return false;
769 }
770 
771 /* Filter out options canceled by the ones after them.  */
772 
773 static void
774 prune_options (struct cl_decoded_option **decoded_options,
775 	       unsigned int *decoded_options_count)
776 {
777   unsigned int old_decoded_options_count = *decoded_options_count;
778   struct cl_decoded_option *old_decoded_options = *decoded_options;
779   unsigned int new_decoded_options_count;
780   struct cl_decoded_option *new_decoded_options
781     = XNEWVEC (struct cl_decoded_option, old_decoded_options_count);
782   unsigned int i;
783   const struct cl_option *option;
784 
785   /* Remove arguments which are negated by others after them.  */
786   new_decoded_options_count = 0;
787   for (i = 0; i < old_decoded_options_count; i++)
788     {
789       unsigned int j, opt_idx, next_opt_idx;
790 
791       if (old_decoded_options[i].errors & ~CL_ERR_WRONG_LANG)
792 	goto keep;
793 
794       opt_idx = old_decoded_options[i].opt_index;
795       switch (opt_idx)
796 	{
797 	case OPT_SPECIAL_unknown:
798 	case OPT_SPECIAL_ignore:
799 	case OPT_SPECIAL_program_name:
800 	case OPT_SPECIAL_input_file:
801 	  goto keep;
802 
803 	default:
804 	  gcc_assert (opt_idx < cl_options_count);
805 	  option = &cl_options[opt_idx];
806 	  if (option->neg_index < 0)
807 	    goto keep;
808 
809 	  /* Skip joined switches.  */
810 	  if ((option->flags & CL_JOINED))
811 	    goto keep;
812 
813 	  for (j = i + 1; j < old_decoded_options_count; j++)
814 	    {
815 	      if (old_decoded_options[j].errors & ~CL_ERR_WRONG_LANG)
816 		continue;
817 	      next_opt_idx = old_decoded_options[j].opt_index;
818 	      if (next_opt_idx >= cl_options_count)
819 		continue;
820 	      if (cl_options[next_opt_idx].neg_index < 0)
821 		continue;
822 	      if ((cl_options[next_opt_idx].flags & CL_JOINED))
823 		  continue;
824 	      if (cancel_option (opt_idx, next_opt_idx, next_opt_idx))
825 		break;
826 	    }
827 	  if (j == old_decoded_options_count)
828 	    {
829 keep:
830 	      new_decoded_options[new_decoded_options_count]
831 		= old_decoded_options[i];
832 	      new_decoded_options_count++;
833 	    }
834 	  break;
835 	}
836     }
837 
838   free (old_decoded_options);
839   new_decoded_options = XRESIZEVEC (struct cl_decoded_option,
840 				    new_decoded_options,
841 				    new_decoded_options_count);
842   *decoded_options = new_decoded_options;
843   *decoded_options_count = new_decoded_options_count;
844 }
845 
846 /* Handle option DECODED for the language indicated by LANG_MASK,
847    using the handlers in HANDLERS and setting fields in OPTS and
848    OPTS_SET.  KIND is the diagnostic_t if this is a diagnostics
849    option, DK_UNSPECIFIED otherwise, and LOC is the location of the
850    option for options from the source file, UNKNOWN_LOCATION
851    otherwise.  GENERATED_P is true for an option generated as part of
852    processing another option or otherwise generated internally, false
853    for one explicitly passed by the user.  Returns false if the switch
854    was invalid.  DC is the diagnostic context for options affecting
855    diagnostics state, or NULL.  */
856 
857 static bool
858 handle_option (struct gcc_options *opts,
859 	       struct gcc_options *opts_set,
860 	       const struct cl_decoded_option *decoded,
861 	       unsigned int lang_mask, int kind, location_t loc,
862 	       const struct cl_option_handlers *handlers,
863 	       bool generated_p, diagnostic_context *dc)
864 {
865   size_t opt_index = decoded->opt_index;
866   const char *arg = decoded->arg;
867   int value = decoded->value;
868   const struct cl_option *option = &cl_options[opt_index];
869   void *flag_var = option_flag_var (opt_index, opts);
870   size_t i;
871 
872   if (flag_var)
873     set_option (opts, (generated_p ? NULL : opts_set),
874 		opt_index, value, arg, kind, loc, dc);
875 
876   for (i = 0; i < handlers->num_handlers; i++)
877     if (option->flags & handlers->handlers[i].mask)
878       {
879 	if (!handlers->handlers[i].handler (opts, opts_set, decoded,
880 					    lang_mask, kind, loc,
881 					    handlers, dc))
882 	  return false;
883       }
884 
885   return true;
886 }
887 
888 /* Like handle_option, but OPT_INDEX, ARG and VALUE describe the
889    option instead of DECODED.  This is used for callbacks when one
890    option implies another instead of an option being decoded from the
891    command line.  */
892 
893 bool
894 handle_generated_option (struct gcc_options *opts,
895 			 struct gcc_options *opts_set,
896 			 size_t opt_index, const char *arg, int value,
897 			 unsigned int lang_mask, int kind, location_t loc,
898 			 const struct cl_option_handlers *handlers,
899 			 diagnostic_context *dc)
900 {
901   struct cl_decoded_option decoded;
902 
903   generate_option (opt_index, arg, value, lang_mask, &decoded);
904   return handle_option (opts, opts_set, &decoded, lang_mask, kind, loc,
905 			handlers, true, dc);
906 }
907 
908 /* Fill in *DECODED with an option described by OPT_INDEX, ARG and
909    VALUE for a front end using LANG_MASK.  This is used when the
910    compiler generates options internally.  */
911 
912 void
913 generate_option (size_t opt_index, const char *arg, int value,
914 		 unsigned int lang_mask, struct cl_decoded_option *decoded)
915 {
916   const struct cl_option *option = &cl_options[opt_index];
917 
918   decoded->opt_index = opt_index;
919   decoded->warn_message = NULL;
920   decoded->arg = arg;
921   decoded->value = value;
922   decoded->errors = (option_ok_for_language (option, lang_mask)
923 		     ? 0
924 		     : CL_ERR_WRONG_LANG);
925 
926   generate_canonical_option (opt_index, arg, value, decoded);
927   switch (decoded->canonical_option_num_elements)
928     {
929     case 1:
930       decoded->orig_option_with_args_text = decoded->canonical_option[0];
931       break;
932 
933     case 2:
934       decoded->orig_option_with_args_text
935 	= concat (decoded->canonical_option[0], " ",
936 		  decoded->canonical_option[1], NULL);
937       break;
938 
939     default:
940       gcc_unreachable ();
941     }
942 }
943 
944 /* Fill in *DECODED with an option for input file FILE.  */
945 
946 void
947 generate_option_input_file (const char *file,
948 			    struct cl_decoded_option *decoded)
949 {
950   decoded->opt_index = OPT_SPECIAL_input_file;
951   decoded->warn_message = NULL;
952   decoded->arg = file;
953   decoded->orig_option_with_args_text = file;
954   decoded->canonical_option_num_elements = 1;
955   decoded->canonical_option[0] = file;
956   decoded->canonical_option[1] = NULL;
957   decoded->canonical_option[2] = NULL;
958   decoded->canonical_option[3] = NULL;
959   decoded->value = 1;
960   decoded->errors = 0;
961 }
962 
963 /* Handle the switch DECODED (location LOC) for the language indicated
964    by LANG_MASK, using the handlers in *HANDLERS and setting fields in
965    OPTS and OPTS_SET and using diagnostic context DC (if not NULL) for
966    diagnostic options.  */
967 
968 void
969 read_cmdline_option (struct gcc_options *opts,
970 		     struct gcc_options *opts_set,
971 		     struct cl_decoded_option *decoded,
972 		     location_t loc,
973 		     unsigned int lang_mask,
974 		     const struct cl_option_handlers *handlers,
975 		     diagnostic_context *dc)
976 {
977   const struct cl_option *option;
978   const char *opt = decoded->orig_option_with_args_text;
979 
980   if (decoded->warn_message)
981     warning_at (loc, 0, decoded->warn_message, opt);
982 
983   if (decoded->opt_index == OPT_SPECIAL_unknown)
984     {
985       if (handlers->unknown_option_callback (decoded))
986 	error_at (loc, "unrecognized command line option %qs", decoded->arg);
987       return;
988     }
989 
990   if (decoded->opt_index == OPT_SPECIAL_ignore)
991     return;
992 
993   option = &cl_options[decoded->opt_index];
994 
995   if (decoded->errors & CL_ERR_DISABLED)
996     {
997       error_at (loc, "command line option %qs"
998 		" is not supported by this configuration", opt);
999       return;
1000     }
1001 
1002   if (decoded->errors & CL_ERR_MISSING_ARG)
1003     {
1004       if (option->missing_argument_error)
1005 	error_at (loc, option->missing_argument_error, opt);
1006       else
1007 	error_at (loc, "missing argument to %qs", opt);
1008       return;
1009     }
1010 
1011   if (decoded->errors & CL_ERR_UINT_ARG)
1012     {
1013       error_at (loc, "argument to %qs should be a non-negative integer",
1014 		option->opt_text);
1015       return;
1016     }
1017 
1018   if (decoded->errors & CL_ERR_ENUM_ARG)
1019     {
1020       const struct cl_enum *e = &cl_enums[option->var_enum];
1021       unsigned int i;
1022       size_t len;
1023       char *s, *p;
1024 
1025       if (e->unknown_error)
1026 	error_at (loc, e->unknown_error, decoded->arg);
1027       else
1028 	error_at (loc, "unrecognized argument in option %qs", opt);
1029 
1030       len = 0;
1031       for (i = 0; e->values[i].arg != NULL; i++)
1032 	len += strlen (e->values[i].arg) + 1;
1033 
1034       s = XALLOCAVEC (char, len);
1035       p = s;
1036       for (i = 0; e->values[i].arg != NULL; i++)
1037 	{
1038 	  size_t arglen = strlen (e->values[i].arg);
1039 	  memcpy (p, e->values[i].arg, arglen);
1040 	  p[arglen] = ' ';
1041 	  p += arglen + 1;
1042 	}
1043       p[-1] = 0;
1044       inform (loc, "valid arguments to %qs are: %s", option->opt_text, s);
1045       return;
1046     }
1047 
1048   if (decoded->errors & CL_ERR_WRONG_LANG)
1049     {
1050       handlers->wrong_lang_callback (decoded, lang_mask);
1051       return;
1052     }
1053 
1054   gcc_assert (!decoded->errors);
1055 
1056   if (!handle_option (opts, opts_set, decoded, lang_mask, DK_UNSPECIFIED,
1057 		      loc, handlers, false, dc))
1058     error_at (loc, "unrecognized command line option %qs", opt);
1059 }
1060 
1061 /* Set any field in OPTS, and OPTS_SET if not NULL, for option
1062    OPT_INDEX according to VALUE and ARG, diagnostic kind KIND,
1063    location LOC, using diagnostic context DC if not NULL for
1064    diagnostic classification.  */
1065 
1066 void
1067 set_option (struct gcc_options *opts, struct gcc_options *opts_set,
1068 	    int opt_index, int value, const char *arg, int kind,
1069 	    location_t loc, diagnostic_context *dc)
1070 {
1071   const struct cl_option *option = &cl_options[opt_index];
1072   void *flag_var = option_flag_var (opt_index, opts);
1073   void *set_flag_var = NULL;
1074 
1075   if (!flag_var)
1076     return;
1077 
1078   if (opts_set != NULL)
1079     set_flag_var = option_flag_var (opt_index, opts_set);
1080 
1081   switch (option->var_type)
1082     {
1083     case CLVC_BOOLEAN:
1084 	*(int *) flag_var = value;
1085 	if (set_flag_var)
1086 	  *(int *) set_flag_var = 1;
1087 	break;
1088 
1089     case CLVC_EQUAL:
1090 	if (option->cl_host_wide_int)
1091 	  *(HOST_WIDE_INT *) flag_var = (value
1092 					 ? option->var_value
1093 					 : !option->var_value);
1094 	else
1095 	  *(int *) flag_var = (value
1096 			       ? option->var_value
1097 			       : !option->var_value);
1098 	if (set_flag_var)
1099 	  *(int *) set_flag_var = 1;
1100 	break;
1101 
1102     case CLVC_BIT_CLEAR:
1103     case CLVC_BIT_SET:
1104 	if ((value != 0) == (option->var_type == CLVC_BIT_SET))
1105 	  {
1106 	    if (option->cl_host_wide_int)
1107 	      *(HOST_WIDE_INT *) flag_var |= option->var_value;
1108 	    else
1109 	      *(int *) flag_var |= option->var_value;
1110 	  }
1111 	else
1112 	  {
1113 	    if (option->cl_host_wide_int)
1114 	      *(HOST_WIDE_INT *) flag_var &= ~option->var_value;
1115 	    else
1116 	      *(int *) flag_var &= ~option->var_value;
1117 	  }
1118 	if (set_flag_var)
1119 	  {
1120 	    if (option->cl_host_wide_int)
1121 	      *(HOST_WIDE_INT *) set_flag_var |= option->var_value;
1122 	    else
1123 	      *(int *) set_flag_var |= option->var_value;
1124 	  }
1125 	break;
1126 
1127     case CLVC_STRING:
1128 	*(const char **) flag_var = arg;
1129 	if (set_flag_var)
1130 	  *(const char **) set_flag_var = "";
1131 	break;
1132 
1133     case CLVC_ENUM:
1134       {
1135 	const struct cl_enum *e = &cl_enums[option->var_enum];
1136 
1137 	e->set (flag_var, value);
1138 	if (set_flag_var)
1139 	  e->set (set_flag_var, 1);
1140       }
1141       break;
1142 
1143     case CLVC_DEFER:
1144 	{
1145 	  VEC(cl_deferred_option,heap) *vec
1146 	    = (VEC(cl_deferred_option,heap) *) *(void **) flag_var;
1147 	  cl_deferred_option *p;
1148 
1149 	  p = VEC_safe_push (cl_deferred_option, heap, vec, NULL);
1150 	  p->opt_index = opt_index;
1151 	  p->arg = arg;
1152 	  p->value = value;
1153 	  *(void **) flag_var = vec;
1154 	  if (set_flag_var)
1155 	    *(void **) set_flag_var = vec;
1156 	}
1157 	break;
1158     }
1159 
1160   if ((diagnostic_t) kind != DK_UNSPECIFIED
1161       && dc != NULL)
1162     diagnostic_classify_diagnostic (dc, opt_index, (diagnostic_t) kind, loc);
1163 }
1164 
1165 /* Return the address of the flag variable for option OPT_INDEX in
1166    options structure OPTS, or NULL if there is no flag variable.  */
1167 
1168 void *
1169 option_flag_var (int opt_index, struct gcc_options *opts)
1170 {
1171   const struct cl_option *option = &cl_options[opt_index];
1172 
1173   if (option->flag_var_offset == (unsigned short) -1)
1174     return NULL;
1175   return (void *)(((char *) opts) + option->flag_var_offset);
1176 }
1177 
1178 /* Return 1 if option OPT_IDX is enabled in OPTS, 0 if it is disabled,
1179    or -1 if it isn't a simple on-off switch.  */
1180 
1181 int
1182 option_enabled (int opt_idx, void *opts)
1183 {
1184   const struct cl_option *option = &(cl_options[opt_idx]);
1185   struct gcc_options *optsg = (struct gcc_options *) opts;
1186   void *flag_var = option_flag_var (opt_idx, optsg);
1187 
1188   if (flag_var)
1189     switch (option->var_type)
1190       {
1191       case CLVC_BOOLEAN:
1192 	return *(int *) flag_var != 0;
1193 
1194       case CLVC_EQUAL:
1195 	if (option->cl_host_wide_int)
1196 	  return *(HOST_WIDE_INT *) flag_var == option->var_value;
1197 	else
1198 	  return *(int *) flag_var == option->var_value;
1199 
1200       case CLVC_BIT_CLEAR:
1201 	if (option->cl_host_wide_int)
1202 	  return (*(HOST_WIDE_INT *) flag_var & option->var_value) == 0;
1203 	else
1204 	  return (*(int *) flag_var & option->var_value) == 0;
1205 
1206       case CLVC_BIT_SET:
1207 	if (option->cl_host_wide_int)
1208 	  return (*(HOST_WIDE_INT *) flag_var & option->var_value) != 0;
1209 	else
1210 	  return (*(int *) flag_var & option->var_value) != 0;
1211 
1212       case CLVC_STRING:
1213       case CLVC_ENUM:
1214       case CLVC_DEFER:
1215 	break;
1216       }
1217   return -1;
1218 }
1219 
1220 /* Fill STATE with the current state of option OPTION in OPTS.  Return
1221    true if there is some state to store.  */
1222 
1223 bool
1224 get_option_state (struct gcc_options *opts, int option,
1225 		  struct cl_option_state *state)
1226 {
1227   void *flag_var = option_flag_var (option, opts);
1228 
1229   if (flag_var == 0)
1230     return false;
1231 
1232   switch (cl_options[option].var_type)
1233     {
1234     case CLVC_BOOLEAN:
1235     case CLVC_EQUAL:
1236       state->data = flag_var;
1237       state->size = (cl_options[option].cl_host_wide_int
1238 		     ? sizeof (HOST_WIDE_INT)
1239 		     : sizeof (int));
1240       break;
1241 
1242     case CLVC_BIT_CLEAR:
1243     case CLVC_BIT_SET:
1244       state->ch = option_enabled (option, opts);
1245       state->data = &state->ch;
1246       state->size = 1;
1247       break;
1248 
1249     case CLVC_STRING:
1250       state->data = *(const char **) flag_var;
1251       if (state->data == 0)
1252 	state->data = "";
1253       state->size = strlen ((const char *) state->data) + 1;
1254       break;
1255 
1256     case CLVC_ENUM:
1257       state->data = flag_var;
1258       state->size = cl_enums[cl_options[option].var_enum].var_size;
1259       break;
1260 
1261     case CLVC_DEFER:
1262       return false;
1263     }
1264   return true;
1265 }
1266 
1267 /* Set a warning option OPT_INDEX (language mask LANG_MASK, option
1268    handlers HANDLERS) to have diagnostic kind KIND for option
1269    structures OPTS and OPTS_SET and diagnostic context DC (possibly
1270    NULL), at location LOC (UNKNOWN_LOCATION for -Werror=).  If IMPLY,
1271    the warning option in question is implied at this point.  This is
1272    used by -Werror= and #pragma GCC diagnostic.  */
1273 
1274 void
1275 control_warning_option (unsigned int opt_index, int kind, bool imply,
1276 			location_t loc, unsigned int lang_mask,
1277 			const struct cl_option_handlers *handlers,
1278 			struct gcc_options *opts,
1279 			struct gcc_options *opts_set,
1280 			diagnostic_context *dc)
1281 {
1282   if (cl_options[opt_index].alias_target != N_OPTS)
1283     opt_index = cl_options[opt_index].alias_target;
1284   if (opt_index == OPT_SPECIAL_ignore)
1285     return;
1286   if (dc)
1287     diagnostic_classify_diagnostic (dc, opt_index, (diagnostic_t) kind, loc);
1288   if (imply)
1289     {
1290       /* -Werror=foo implies -Wfoo.  */
1291       if (cl_options[opt_index].var_type == CLVC_BOOLEAN)
1292 	handle_generated_option (opts, opts_set,
1293 				 opt_index, NULL, 1, lang_mask,
1294 				 kind, loc, handlers, dc);
1295     }
1296 }
1297