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