OSDN Git Service

2008-07-10 Peter Maydell <pmaydell@chiark.greenend.org.uk>
[pf3gnuchains/gcc-fork.git] / gcc / opts.c
1 /* Command line option handling.
2    Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008
3    Free Software Foundation, Inc.
4    Contributed by Neil Booth.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "intl.h"
25 #include "coretypes.h"
26 #include "tm.h"
27 #include "tree.h"
28 #include "rtl.h"
29 #include "ggc.h"
30 #include "output.h"
31 #include "langhooks.h"
32 #include "opts.h"
33 #include "options.h"
34 #include "flags.h"
35 #include "toplev.h"
36 #include "params.h"
37 #include "diagnostic.h"
38 #include "tm_p.h"               /* For OPTIMIZATION_OPTIONS.  */
39 #include "insn-attr.h"          /* For INSN_SCHEDULING.  */
40 #include "target.h"
41 #include "tree-pass.h"
42 #include "dbgcnt.h"
43 #include "debug.h"
44
45 /* Value of the -G xx switch, and whether it was passed or not.  */
46 unsigned HOST_WIDE_INT g_switch_value;
47 bool g_switch_set;
48
49 /* True if we should exit after parsing options.  */
50 bool exit_after_options;
51
52 /* Print various extra warnings.  -W/-Wextra.  */
53 bool extra_warnings;
54
55 /* True to warn about any objects definitions whose size is larger
56    than N bytes.  Also want about function definitions whose returned
57    values are larger than N bytes, where N is `larger_than_size'.  */
58 bool warn_larger_than;
59 HOST_WIDE_INT larger_than_size;
60
61 /* True to warn about any function whose frame size is larger
62  * than N bytes. */
63 bool warn_frame_larger_than;
64 HOST_WIDE_INT frame_larger_than_size;
65
66 /* Hack for cooperation between set_Wunused and set_Wextra.  */
67 static bool maybe_warn_unused_parameter;
68
69 /* Type(s) of debugging information we are producing (if any).  See
70    flags.h for the definitions of the different possible types of
71    debugging information.  */
72 enum debug_info_type write_symbols = NO_DEBUG;
73
74 /* Level of debugging information we are producing.  See flags.h for
75    the definitions of the different possible levels.  */
76 enum debug_info_level debug_info_level = DINFO_LEVEL_NONE;
77
78 /* A major contribution to object and executable size is debug
79    information size.  A major contribution to debug information size
80    is struct descriptions replicated in several object files. The
81    following flags attempt to reduce this information.  The basic
82    idea is to not emit struct debugging information in the current
83    compilation unit when that information will be generated by
84    another compilation unit.
85
86    Debug information for a struct defined in the current source
87    file should be generated in the object file.  Likewise the
88    debug information for a struct defined in a header should be
89    generated in the object file of the corresponding source file.
90    Both of these case are handled when the base name of the file of
91    the struct definition matches the base name of the source file
92    of the current compilation unit.  This matching emits minimal
93    struct debugging information.
94
95    The base file name matching rule above will fail to emit debug
96    information for structs defined in system headers.  So a second
97    category of files includes system headers in addition to files
98    with matching bases.
99
100    The remaining types of files are library headers and application
101    headers.  We cannot currently distinguish these two types.  */
102
103 enum debug_struct_file
104 {
105   DINFO_STRUCT_FILE_NONE,   /* Debug no structs. */
106   DINFO_STRUCT_FILE_BASE,   /* Debug structs defined in files with the
107                                same base name as the compilation unit. */
108   DINFO_STRUCT_FILE_SYS,    /* Also debug structs defined in system
109                                header files.  */
110   DINFO_STRUCT_FILE_ANY     /* Debug structs defined in all files. */
111 };
112
113 /* Generic structs (e.g. templates not explicitly specialized)
114    may not have a compilation unit associated with them, and so
115    may need to be treated differently from ordinary structs.
116
117    Structs only handled by reference (indirectly), will also usually
118    not need as much debugging information.  */
119
120 static enum debug_struct_file debug_struct_ordinary[DINFO_USAGE_NUM_ENUMS]
121   = { DINFO_STRUCT_FILE_ANY, DINFO_STRUCT_FILE_ANY, DINFO_STRUCT_FILE_ANY };
122 static enum debug_struct_file debug_struct_generic[DINFO_USAGE_NUM_ENUMS]
123   = { DINFO_STRUCT_FILE_ANY, DINFO_STRUCT_FILE_ANY, DINFO_STRUCT_FILE_ANY };
124
125 /* Parse the -femit-struct-debug-detailed option value
126    and set the flag variables. */
127
128 #define MATCH( prefix, string ) \
129   ((strncmp (prefix, string, sizeof prefix - 1) == 0) \
130    ? ((string += sizeof prefix - 1), 1) : 0)
131
132 void
133 set_struct_debug_option (const char *spec)
134 {
135   /* various labels for comparison */
136   static char dfn_lbl[] = "dfn:", dir_lbl[] = "dir:", ind_lbl[] = "ind:";
137   static char ord_lbl[] = "ord:", gen_lbl[] = "gen:";
138   static char none_lbl[] = "none", any_lbl[] = "any";
139   static char base_lbl[] = "base", sys_lbl[] = "sys";
140
141   enum debug_struct_file files = DINFO_STRUCT_FILE_ANY;
142   /* Default is to apply to as much as possible. */
143   enum debug_info_usage usage = DINFO_USAGE_NUM_ENUMS;
144   int ord = 1, gen = 1;
145
146   /* What usage? */
147   if (MATCH (dfn_lbl, spec))
148     usage = DINFO_USAGE_DFN;
149   else if (MATCH (dir_lbl, spec))
150     usage = DINFO_USAGE_DIR_USE;
151   else if (MATCH (ind_lbl, spec))
152     usage = DINFO_USAGE_IND_USE;
153
154   /* Generics or not? */
155   if (MATCH (ord_lbl, spec))
156     gen = 0;
157   else if (MATCH (gen_lbl, spec))
158     ord = 0;
159
160   /* What allowable environment? */
161   if (MATCH (none_lbl, spec))
162     files = DINFO_STRUCT_FILE_NONE;
163   else if (MATCH (any_lbl, spec))
164     files = DINFO_STRUCT_FILE_ANY;
165   else if (MATCH (sys_lbl, spec))
166     files = DINFO_STRUCT_FILE_SYS;
167   else if (MATCH (base_lbl, spec))
168     files = DINFO_STRUCT_FILE_BASE;
169   else
170     error ("argument %qs to %<-femit-struct-debug-detailed%> not recognized",
171            spec);
172
173   /* Effect the specification. */
174   if (usage == DINFO_USAGE_NUM_ENUMS)
175     {
176       if (ord)
177         {
178           debug_struct_ordinary[DINFO_USAGE_DFN] = files;
179           debug_struct_ordinary[DINFO_USAGE_DIR_USE] = files;
180           debug_struct_ordinary[DINFO_USAGE_IND_USE] = files;
181         }
182       if (gen)
183         {
184           debug_struct_generic[DINFO_USAGE_DFN] = files;
185           debug_struct_generic[DINFO_USAGE_DIR_USE] = files;
186           debug_struct_generic[DINFO_USAGE_IND_USE] = files;
187         }
188     }
189   else
190     {
191       if (ord)
192         debug_struct_ordinary[usage] = files;
193       if (gen)
194         debug_struct_generic[usage] = files;
195     }
196
197   if (*spec == ',')
198     set_struct_debug_option (spec+1);
199   else
200     {
201       /* No more -femit-struct-debug-detailed specifications.
202          Do final checks. */
203       if (*spec != '\0')
204         error ("argument %qs to %<-femit-struct-debug-detailed%> unknown",
205                spec);
206       if (debug_struct_ordinary[DINFO_USAGE_DIR_USE]
207                 < debug_struct_ordinary[DINFO_USAGE_IND_USE]
208           || debug_struct_generic[DINFO_USAGE_DIR_USE]
209                 < debug_struct_generic[DINFO_USAGE_IND_USE])
210         error ("%<-femit-struct-debug-detailed=dir:...%> must allow at least"
211                " as much as %<-femit-struct-debug-detailed=ind:...%>");
212     }
213 }
214
215 /* Find the base name of a path, stripping off both directories and
216    a single final extension. */
217 static int
218 base_of_path (const char *path, const char **base_out)
219 {
220   const char *base = path;
221   const char *dot = 0;
222   const char *p = path;
223   char c = *p;
224   while (c)
225     {
226       if (IS_DIR_SEPARATOR(c))
227         {
228           base = p + 1;
229           dot = 0;
230         }
231       else if (c == '.')
232         dot = p;
233       c = *++p;
234     }
235   if (!dot)
236     dot = p;
237   *base_out = base;
238   return dot - base;
239 }
240
241 /* Match the base name of a file to the base name of a compilation unit. */
242
243 static const char *main_input_basename;
244 static int main_input_baselength;
245
246 static int
247 matches_main_base (const char *path)
248 {
249   /* Cache the last query. */
250   static const char *last_path = NULL;
251   static int last_match = 0;
252   if (path != last_path)
253     {
254       const char *base;
255       int length = base_of_path (path, &base);
256       last_path = path;
257       last_match = (length == main_input_baselength
258                     && memcmp (base, main_input_basename, length) == 0);
259     }
260   return last_match;
261 }
262
263 #ifdef DEBUG_DEBUG_STRUCT
264
265 static int
266 dump_struct_debug (tree type, enum debug_info_usage usage,
267                    enum debug_struct_file criterion, int generic,
268                    int matches, int result)
269 {
270   /* Find the type name. */
271   tree type_decl = TYPE_STUB_DECL (type);
272   tree t = type_decl;
273   const char *name = 0;
274   if (TREE_CODE (t) == TYPE_DECL)
275     t = DECL_NAME (t);
276   if (t)
277     name = IDENTIFIER_POINTER (t);
278
279   fprintf (stderr, "    struct %d %s %s %s %s %d %p %s\n",
280            criterion,
281            DECL_IN_SYSTEM_HEADER (type_decl) ? "sys" : "usr",
282            matches ? "bas" : "hdr",
283            generic ? "gen" : "ord",
284            usage == DINFO_USAGE_DFN ? ";" :
285              usage == DINFO_USAGE_DIR_USE ? "." : "*",
286            result,
287            (void*) type_decl, name);
288   return result;
289 }
290 #define DUMP_GSTRUCT(type, usage, criterion, generic, matches, result) \
291   dump_struct_debug (type, usage, criterion, generic, matches, result)
292
293 #else
294
295 #define DUMP_GSTRUCT(type, usage, criterion, generic, matches, result) \
296   (result)
297
298 #endif
299
300
301 bool
302 should_emit_struct_debug (tree type, enum debug_info_usage usage)
303 {
304   enum debug_struct_file criterion;
305   tree type_decl;
306   bool generic = lang_hooks.types.generic_p (type);
307
308   if (generic)
309     criterion = debug_struct_generic[usage];
310   else
311     criterion = debug_struct_ordinary[usage];
312
313   if (criterion == DINFO_STRUCT_FILE_NONE)
314     return DUMP_GSTRUCT (type, usage, criterion, generic, false, false);
315   if (criterion == DINFO_STRUCT_FILE_ANY)
316     return DUMP_GSTRUCT (type, usage, criterion, generic, false, true);
317
318   type_decl = TYPE_STUB_DECL (type);
319
320   if (criterion == DINFO_STRUCT_FILE_SYS && DECL_IN_SYSTEM_HEADER (type_decl))
321     return DUMP_GSTRUCT (type, usage, criterion, generic, false, true);
322
323   if (matches_main_base (DECL_SOURCE_FILE (type_decl)))
324     return DUMP_GSTRUCT (type, usage, criterion, generic, true, true);
325   return DUMP_GSTRUCT (type, usage, criterion, generic, false, false);
326 }
327
328 /* Nonzero means use GNU-only extensions in the generated symbolic
329    debugging information.  Currently, this only has an effect when
330    write_symbols is set to DBX_DEBUG, XCOFF_DEBUG, or DWARF_DEBUG.  */
331 bool use_gnu_debug_info_extensions;
332
333 /* The default visibility for all symbols (unless overridden) */
334 enum symbol_visibility default_visibility = VISIBILITY_DEFAULT;
335
336 /* Disable unit-at-a-time for frontends that might be still broken in this
337    respect.  */
338
339 bool no_unit_at_a_time_default;
340
341 /* Global visibility options.  */
342 struct visibility_flags visibility_options;
343
344 /* What to print when a switch has no documentation.  */
345 #ifdef ENABLE_CHECKING
346 static const char undocumented_msg[] = N_("This switch lacks documentation");
347 #else
348 static const char undocumented_msg[] = "";
349 #endif
350
351 /* Used for bookkeeping on whether user set these flags so
352    -fprofile-use/-fprofile-generate does not use them.  */
353 static bool profile_arc_flag_set, flag_profile_values_set;
354 static bool flag_unroll_loops_set, flag_tracer_set;
355 static bool flag_value_profile_transformations_set;
356 static bool flag_peel_loops_set, flag_branch_probabilities_set;
357 static bool flag_inline_functions_set;
358
359 /* Functions excluded from profiling.  */
360
361 typedef char *char_p; /* For DEF_VEC_P.  */
362 DEF_VEC_P(char_p);
363 DEF_VEC_ALLOC_P(char_p,heap);
364
365 static VEC(char_p,heap) *flag_instrument_functions_exclude_functions;
366 static VEC(char_p,heap) *flag_instrument_functions_exclude_files;
367
368 typedef const char *const_char_p; /* For DEF_VEC_P.  */
369 DEF_VEC_P(const_char_p);
370 DEF_VEC_ALLOC_P(const_char_p,heap);
371
372 static VEC(const_char_p,heap) *ignored_options;
373
374 /* Function calls disallowed under -Wdisallowed-function-list=...  */
375 static VEC(char_p,heap) *warning_disallowed_functions;
376
377 /* If -Wdisallowed-function-list=...  */
378 bool warn_disallowed_functions = false;
379
380 /* Input file names.  */
381 const char **in_fnames;
382 unsigned num_in_fnames;
383
384 static int common_handle_option (size_t scode, const char *arg, int value,
385                                  unsigned int lang_mask);
386 static void handle_param (const char *);
387 static void set_Wextra (int);
388 static unsigned int handle_option (const char **argv, unsigned int lang_mask);
389 static char *write_langs (unsigned int lang_mask);
390 static void complain_wrong_lang (const char *, const struct cl_option *,
391                                  unsigned int lang_mask);
392 static void handle_options (unsigned int, const char **, unsigned int);
393 static void set_debug_level (enum debug_info_type type, int extended,
394                              const char *arg);
395
396 /* If ARG is a non-negative integer made up solely of digits, return its
397    value, otherwise return -1.  */
398 static int
399 integral_argument (const char *arg)
400 {
401   const char *p = arg;
402
403   while (*p && ISDIGIT (*p))
404     p++;
405
406   if (*p == '\0')
407     return atoi (arg);
408
409   return -1;
410 }
411
412 /* Return a malloced slash-separated list of languages in MASK.  */
413 static char *
414 write_langs (unsigned int mask)
415 {
416   unsigned int n = 0, len = 0;
417   const char *lang_name;
418   char *result;
419
420   for (n = 0; (lang_name = lang_names[n]) != 0; n++)
421     if (mask & (1U << n))
422       len += strlen (lang_name) + 1;
423
424   result = XNEWVEC (char, len);
425   len = 0;
426   for (n = 0; (lang_name = lang_names[n]) != 0; n++)
427     if (mask & (1U << n))
428       {
429         if (len)
430           result[len++] = '/';
431         strcpy (result + len, lang_name);
432         len += strlen (lang_name);
433       }
434
435   result[len] = 0;
436
437   return result;
438 }
439
440 /* Complain that switch OPT_INDEX does not apply to this front end.  */
441 static void
442 complain_wrong_lang (const char *text, const struct cl_option *option,
443                      unsigned int lang_mask)
444 {
445   char *ok_langs, *bad_lang;
446
447   ok_langs = write_langs (option->flags);
448   bad_lang = write_langs (lang_mask);
449
450   /* Eventually this should become a hard error IMO.  */
451   warning (0, "command line option \"%s\" is valid for %s but not for %s",
452            text, ok_langs, bad_lang);
453
454   free (ok_langs);
455   free (bad_lang);
456 }
457
458 /* Buffer the unknown option described by the string OPT.  Currently,
459    we only complain about unknown -Wno-* options if they may have
460    prevented a diagnostic. Otherwise, we just ignore them.
461    Note that if we do complain, it is only as a warning, not an error;
462    passing the compiler an unrecognised -Wno-* option should never
463    change whether the compilation succeeds or fails.  */
464
465 static void postpone_unknown_option_warning(const char *opt)
466 {
467   VEC_safe_push (const_char_p, heap, ignored_options, opt);
468 }
469
470 /* Produce a warning for each option previously buffered.  */
471
472 void print_ignored_options (void)
473 {
474   location_t saved_loc = input_location;
475
476   input_location = 0;
477
478   while (!VEC_empty (const_char_p, ignored_options))
479     {
480       const char *opt;
481       opt = VEC_pop (const_char_p, ignored_options);
482       warning (0, "unrecognized command line option \"%s\"", opt);
483     }
484
485   input_location = saved_loc;
486 }
487
488 /* Handle the switch beginning at ARGV for the language indicated by
489    LANG_MASK.  Returns the number of switches consumed.  */
490 static unsigned int
491 handle_option (const char **argv, unsigned int lang_mask)
492 {
493   size_t opt_index;
494   const char *opt, *arg = 0;
495   char *dup = 0;
496   int value = 1;
497   unsigned int result = 0;
498   const struct cl_option *option;
499
500   opt = argv[0];
501
502   opt_index = find_opt (opt + 1, lang_mask | CL_COMMON | CL_TARGET);
503   if (opt_index == cl_options_count
504       && (opt[1] == 'W' || opt[1] == 'f' || opt[1] == 'm')
505       && opt[2] == 'n' && opt[3] == 'o' && opt[4] == '-')
506     {
507       /* Drop the "no-" from negative switches.  */
508       size_t len = strlen (opt) - 3;
509
510       dup = XNEWVEC (char, len + 1);
511       dup[0] = '-';
512       dup[1] = opt[1];
513       memcpy (dup + 2, opt + 5, len - 2 + 1);
514       opt = dup;
515       value = 0;
516       opt_index = find_opt (opt + 1, lang_mask | CL_COMMON | CL_TARGET);
517       if (opt_index == cl_options_count && opt[1] == 'W')
518         {
519           /* We don't generate warnings for unknown -Wno-* options
520              unless we issue diagnostics.  */
521           postpone_unknown_option_warning (argv[0]);
522           result = 1;
523           goto done;
524         }
525     }
526
527   if (opt_index == cl_options_count)
528     goto done;
529
530   option = &cl_options[opt_index];
531
532   /* Reject negative form of switches that don't take negatives as
533      unrecognized.  */
534   if (!value && (option->flags & CL_REJECT_NEGATIVE))
535     goto done;
536
537   /* We've recognized this switch.  */
538   result = 1;
539
540   /* Check to see if the option is disabled for this configuration.  */
541   if (option->flags & CL_DISABLED)
542     {
543       error ("command line option %qs"
544              " is not supported by this configuration", opt);
545       goto done;
546     }
547
548   /* Sort out any argument the switch takes.  */
549   if (option->flags & CL_JOINED)
550     {
551       /* Have arg point to the original switch.  This is because
552          some code, such as disable_builtin_function, expects its
553          argument to be persistent until the program exits.  */
554       arg = argv[0] + cl_options[opt_index].opt_len + 1;
555       if (!value)
556         arg += strlen ("no-");
557
558       if (*arg == '\0' && !(option->flags & CL_MISSING_OK))
559         {
560           if (option->flags & CL_SEPARATE)
561             {
562               arg = argv[1];
563               result = 2;
564             }
565           else
566             /* Missing argument.  */
567             arg = NULL;
568         }
569     }
570   else if (option->flags & CL_SEPARATE)
571     {
572       arg = argv[1];
573       result = 2;
574     }
575
576   /* Now we've swallowed any potential argument, complain if this
577      is a switch for a different front end.  */
578   if (!(option->flags & (lang_mask | CL_COMMON | CL_TARGET)))
579     {
580       complain_wrong_lang (argv[0], option, lang_mask);
581       goto done;
582     }
583   else if ((option->flags & CL_TARGET)
584            && (option->flags & CL_LANG_ALL)
585            && !(option->flags & lang_mask))
586     {
587       /* Complain for target flag language mismatches if any languages
588          are specified.  */
589       complain_wrong_lang (argv[0], option, lang_mask);
590       goto done;
591     }
592
593   if (arg == NULL && (option->flags & (CL_JOINED | CL_SEPARATE)))
594     {
595       if (!lang_hooks.missing_argument (opt, opt_index))
596         error ("missing argument to \"%s\"", opt);
597       goto done;
598     }
599
600   /* If the switch takes an integer, convert it.  */
601   if (arg && (option->flags & CL_UINTEGER))
602     {
603       value = integral_argument (arg);
604       if (value == -1)
605         {
606           error ("argument to \"%s\" should be a non-negative integer",
607                  option->opt_text);
608           goto done;
609         }
610     }
611
612   if (option->flag_var)
613     switch (option->var_type)
614       {
615       case CLVC_BOOLEAN:
616         *(int *) option->flag_var = value;
617         break;
618
619       case CLVC_EQUAL:
620         *(int *) option->flag_var = (value
621                                      ? option->var_value
622                                      : !option->var_value);
623         break;
624
625       case CLVC_BIT_CLEAR:
626       case CLVC_BIT_SET:
627         if ((value != 0) == (option->var_type == CLVC_BIT_SET))
628           *(int *) option->flag_var |= option->var_value;
629         else
630           *(int *) option->flag_var &= ~option->var_value;
631         if (option->flag_var == &target_flags)
632           target_flags_explicit |= option->var_value;
633         break;
634
635       case CLVC_STRING:
636         *(const char **) option->flag_var = arg;
637         break;
638       }
639
640   if (option->flags & lang_mask)
641     if (lang_hooks.handle_option (opt_index, arg, value) == 0)
642       result = 0;
643
644   if (result && (option->flags & CL_COMMON))
645     if (common_handle_option (opt_index, arg, value, lang_mask) == 0)
646       result = 0;
647
648   if (result && (option->flags & CL_TARGET))
649     if (!targetm.handle_option (opt_index, arg, value))
650       result = 0;
651
652  done:
653   if (dup)
654     free (dup);
655   return result;
656 }
657
658 /* Handle FILENAME from the command line.  */
659 static void
660 add_input_filename (const char *filename)
661 {
662   num_in_fnames++;
663   in_fnames = XRESIZEVEC (const char *, in_fnames, num_in_fnames);
664   in_fnames[num_in_fnames - 1] = filename;
665 }
666
667 /* Add comma-separated strings to a char_p vector.  */
668
669 static void
670 add_comma_separated_to_vector (VEC(char_p,heap) **pvec, const char* arg)
671 {
672   char *tmp;
673   char *r;
674   char *w;
675   char *token_start;
676
677   /* We never free this string.  */
678   tmp = xstrdup (arg);
679
680   r = tmp;
681   w = tmp;
682   token_start = tmp;
683
684   while (*r != '\0')
685     {
686       if (*r == ',')
687         {
688           *w++ = '\0';
689           ++r;
690           VEC_safe_push (char_p, heap, *pvec, token_start);
691           token_start = w;
692         }
693       if (*r == '\\' && r[1] == ',')
694         {
695           *w++ = ',';
696           r += 2;
697         }
698       else
699         *w++ = *r++;
700     }
701   if (*token_start != '\0')
702     VEC_safe_push (char_p, heap, *pvec, token_start);
703 }
704
705 /* Return whether we should exclude FNDECL from instrumentation.  */
706
707 bool
708 flag_instrument_functions_exclude_p (tree fndecl)
709 {
710   if (VEC_length (char_p, flag_instrument_functions_exclude_functions) > 0)
711     {
712       const char *name;
713       int i;
714       char *s;
715
716       name = lang_hooks.decl_printable_name (fndecl, 0);
717       for (i = 0;
718            VEC_iterate (char_p, flag_instrument_functions_exclude_functions,
719                         i, s);
720            ++i)
721         {
722           if (strstr (name, s) != NULL)
723             return true;
724         }
725     }
726
727   if (VEC_length (char_p, flag_instrument_functions_exclude_files) > 0)
728     {
729       const char *name;
730       int i;
731       char *s;
732
733       name = DECL_SOURCE_FILE (fndecl);
734       for (i = 0;
735            VEC_iterate (char_p, flag_instrument_functions_exclude_files, i, s);
736            ++i)
737         {
738           if (strstr (name, s) != NULL)
739             return true;
740         }
741     }
742
743   return false;
744 }
745
746
747 /* Return whether this function call is disallowed.  */
748 void
749 warn_if_disallowed_function_p (const_tree exp)
750 {
751   if (TREE_CODE(exp) == CALL_EXPR
752       && VEC_length (char_p, warning_disallowed_functions) > 0)
753     {
754       int i;
755       char *s;
756       const char *fnname =
757           IDENTIFIER_POINTER (DECL_NAME (get_callee_fndecl (exp)));
758       for (i = 0; VEC_iterate (char_p, warning_disallowed_functions, i, s);
759            ++i)
760         {
761           if (strcmp (fnname, s) == 0)
762             {
763               warning (OPT_Wdisallowed_function_list_,
764                        "disallowed call to %qs", fnname);
765               break;
766             }
767         }
768     }
769 }
770
771 /* Decode and handle the vector of command line options.  LANG_MASK
772    contains has a single bit set representing the current
773    language.  */
774 static void
775 handle_options (unsigned int argc, const char **argv, unsigned int lang_mask)
776 {
777   unsigned int n, i;
778
779   for (i = 1; i < argc; i += n)
780     {
781       const char *opt = argv[i];
782
783       /* Interpret "-" or a non-switch as a file name.  */
784       if (opt[0] != '-' || opt[1] == '\0')
785         {
786           if (main_input_filename == NULL)
787             {
788               main_input_filename = opt;
789               main_input_baselength
790                 = base_of_path (main_input_filename, &main_input_basename);
791             }
792           add_input_filename (opt);
793           n = 1;
794           continue;
795         }
796
797       n = handle_option (argv + i, lang_mask);
798
799       if (!n)
800         {
801           n = 1;
802           error ("unrecognized command line option \"%s\"", opt);
803         }
804     }
805 }
806
807 /* Parse command line options and set default flag values.  Do minimal
808    options processing.  */
809 void
810 decode_options (unsigned int argc, const char **argv)
811 {
812   unsigned int i, lang_mask;
813
814   /* Perform language-specific options initialization.  */
815   lang_mask = lang_hooks.init_options (argc, argv);
816
817   lang_hooks.initialize_diagnostics (global_dc);
818
819   /* Scan to see what optimization level has been specified.  That will
820      determine the default value of many flags.  */
821   for (i = 1; i < argc; i++)
822     {
823       if (!strcmp (argv[i], "-O"))
824         {
825           optimize = 1;
826           optimize_size = 0;
827         }
828       else if (argv[i][0] == '-' && argv[i][1] == 'O')
829         {
830           /* Handle -Os, -O2, -O3, -O69, ...  */
831           const char *p = &argv[i][2];
832
833           if ((p[0] == 's') && (p[1] == 0))
834             {
835               optimize_size = 1;
836
837               /* Optimizing for size forces optimize to be 2.  */
838               optimize = 2;
839             }
840           else
841             {
842               const int optimize_val = read_integral_parameter (p, p - 2, -1);
843               if (optimize_val != -1)
844                 {
845                   optimize = optimize_val;
846                   optimize_size = 0;
847                 }
848             }
849         }
850     }
851
852   if (!optimize)
853     {
854       flag_merge_constants = 0;
855     }
856
857   if (!no_unit_at_a_time_default)
858     {
859       flag_unit_at_a_time = 1;
860       if (!optimize)
861         flag_toplevel_reorder = 0;
862     }
863
864   if (optimize >= 1)
865     {
866       flag_defer_pop = 1;
867 #ifdef DELAY_SLOTS
868       flag_delayed_branch = 1;
869 #endif
870 #ifdef CAN_DEBUG_WITHOUT_FP
871       flag_omit_frame_pointer = 1;
872 #endif
873       flag_guess_branch_prob = 1;
874       flag_cprop_registers = 1;
875       flag_if_conversion = 1;
876       flag_if_conversion2 = 1;
877       flag_ipa_pure_const = 1;
878       flag_ipa_reference = 1;
879       flag_split_wide_types = 1;
880       flag_tree_ccp = 1;
881       flag_tree_dce = 1;
882       flag_tree_dom = 1;
883       flag_tree_dse = 1;
884       flag_tree_ter = 1;
885       flag_tree_sra = 1;
886       flag_tree_copyrename = 1;
887       flag_tree_fre = 1;
888       flag_tree_copy_prop = 1;
889       flag_tree_sink = 1;
890
891       if (!optimize_size)
892         {
893           /* Loop header copying usually increases size of the code.  This used
894              not to be true, since quite often it is possible to verify that
895              the condition is satisfied in the first iteration and therefore
896              to eliminate it.  Jump threading handles these cases now.  */
897           flag_tree_ch = 1;
898         }
899     }
900
901   if (optimize >= 2)
902     {
903       flag_inline_small_functions = 1;
904       flag_thread_jumps = 1;
905       flag_crossjumping = 1;
906       flag_optimize_sibling_calls = 1;
907       flag_forward_propagate = 1;
908       flag_cse_follow_jumps = 1;
909       flag_gcse = 1;
910       flag_expensive_optimizations = 1;
911       flag_rerun_cse_after_loop = 1;
912       flag_caller_saves = 1;
913       flag_peephole2 = 1;
914 #ifdef INSN_SCHEDULING
915       flag_schedule_insns = 1;
916       flag_schedule_insns_after_reload = 1;
917 #endif
918       flag_regmove = 1;
919       flag_strict_aliasing = 1;
920       flag_strict_overflow = 1;
921       flag_delete_null_pointer_checks = 1;
922       flag_reorder_blocks = 1;
923       flag_reorder_functions = 1;
924       flag_tree_store_ccp = 1;
925       flag_tree_vrp = 1;
926       flag_tree_switch_conversion = 1;
927
928       if (!optimize_size)
929         {
930           /* Conditional DCE generates bigger code.  */
931           flag_tree_builtin_call_dce = 1;
932           /* PRE tends to generate bigger code.  */
933           flag_tree_pre = 1;
934         }
935
936       /* Allow more virtual operators to increase alias precision.  */
937       set_param_value ("max-aliased-vops", 500);
938
939       /* Track fields in field-sensitive alias analysis.  */
940       set_param_value ("max-fields-for-field-sensitive", 100);
941     }
942
943   if (optimize >= 3)
944     {
945       flag_predictive_commoning = 1;
946       flag_inline_functions = 1;
947       flag_unswitch_loops = 1;
948       flag_gcse_after_reload = 1;
949       flag_tree_vectorize = 1;
950
951       /* Allow even more virtual operators.  */
952       set_param_value ("max-aliased-vops", 1000);
953       set_param_value ("avg-aliased-vops", 3);
954     }
955
956   if (optimize < 2 || optimize_size)
957     {
958       align_loops = 1;
959       align_jumps = 1;
960       align_labels = 1;
961       align_functions = 1;
962
963       /* Don't reorder blocks when optimizing for size because extra
964          jump insns may be created; also barrier may create extra padding.
965
966          More correctly we should have a block reordering mode that tried
967          to minimize the combined size of all the jumps.  This would more
968          or less automatically remove extra jumps, but would also try to
969          use more short jumps instead of long jumps.  */
970       flag_reorder_blocks = 0;
971       flag_reorder_blocks_and_partition = 0;
972     }
973
974   if (optimize_size)
975     {
976       /* Inlining of functions reducing size is a good idea regardless
977          of them being declared inline.  */
978       flag_inline_functions = 1;
979
980       /* We want to crossjump as much as possible.  */
981       set_param_value ("min-crossjump-insns", 1);
982     }
983
984   /* Initialize whether `char' is signed.  */
985   flag_signed_char = DEFAULT_SIGNED_CHAR;
986   /* Set this to a special "uninitialized" value.  The actual default is set
987      after target options have been processed.  */
988   flag_short_enums = 2;
989
990   /* Initialize target_flags before OPTIMIZATION_OPTIONS so the latter can
991      modify it.  */
992   target_flags = targetm.default_target_flags;
993
994   /* Some targets have ABI-specified unwind tables.  */
995   flag_unwind_tables = targetm.unwind_tables_default;
996
997 #ifdef OPTIMIZATION_OPTIONS
998   /* Allow default optimizations to be specified on a per-machine basis.  */
999   OPTIMIZATION_OPTIONS (optimize, optimize_size);
1000 #endif
1001
1002   handle_options (argc, argv, lang_mask);
1003
1004   if (flag_pie)
1005     flag_pic = flag_pie;
1006   if (flag_pic && !flag_pie)
1007     flag_shlib = 1;
1008
1009   if (flag_no_inline == 2)
1010     flag_no_inline = 0;
1011   else
1012     flag_really_no_inline = flag_no_inline;
1013
1014   /* Set flag_no_inline before the post_options () hook.  The C front
1015      ends use it to determine tree inlining defaults.  FIXME: such
1016      code should be lang-independent when all front ends use tree
1017      inlining, in which case it, and this condition, should be moved
1018      to the top of process_options() instead.  */
1019   if (optimize == 0)
1020     {
1021       /* Inlining does not work if not optimizing,
1022          so force it not to be done.  */
1023       flag_no_inline = 1;
1024       warn_inline = 0;
1025
1026       /* The c_decode_option function and decode_option hook set
1027          this to `2' if -Wall is used, so we can avoid giving out
1028          lots of errors for people who don't realize what -Wall does.  */
1029       if (warn_uninitialized == 1)
1030         warning (OPT_Wuninitialized,
1031                  "-Wuninitialized is not supported without -O");
1032     }
1033
1034   if (flag_really_no_inline == 2)
1035     flag_really_no_inline = flag_no_inline;
1036
1037   /* Inlining of functions called just once will only work if we can look
1038      at the complete translation unit.  */
1039   if (flag_inline_functions_called_once && !flag_unit_at_a_time)
1040     {
1041       flag_inline_functions_called_once = 0;
1042       warning (OPT_Wdisabled_optimization,
1043                "-funit-at-a-time is required for inlining of functions "
1044                "that are only called once");
1045     }
1046
1047   /* The optimization to partition hot and cold basic blocks into separate
1048      sections of the .o and executable files does not work (currently)
1049      with exception handling.  This is because there is no support for
1050      generating unwind info.  If flag_exceptions is turned on we need to
1051      turn off the partitioning optimization.  */
1052
1053   if (flag_exceptions && flag_reorder_blocks_and_partition)
1054     {
1055       inform
1056             ("-freorder-blocks-and-partition does not work with exceptions");
1057       flag_reorder_blocks_and_partition = 0;
1058       flag_reorder_blocks = 1;
1059     }
1060
1061   /* If user requested unwind info, then turn off the partitioning
1062      optimization.  */
1063
1064   if (flag_unwind_tables && ! targetm.unwind_tables_default
1065       && flag_reorder_blocks_and_partition)
1066     {
1067       inform ("-freorder-blocks-and-partition does not support unwind info");
1068       flag_reorder_blocks_and_partition = 0;
1069       flag_reorder_blocks = 1;
1070     }
1071
1072   /* If the target requested unwind info, then turn off the partitioning
1073      optimization with a different message.  Likewise, if the target does not
1074      support named sections.  */
1075
1076   if (flag_reorder_blocks_and_partition
1077       && (!targetm.have_named_sections
1078           || (flag_unwind_tables && targetm.unwind_tables_default)))
1079     {
1080       inform
1081        ("-freorder-blocks-and-partition does not work on this architecture");
1082       flag_reorder_blocks_and_partition = 0;
1083       flag_reorder_blocks = 1;
1084     }
1085 }
1086
1087 #define LEFT_COLUMN     27
1088
1089 /* Output ITEM, of length ITEM_WIDTH, in the left column,
1090    followed by word-wrapped HELP in a second column.  */
1091 static void
1092 wrap_help (const char *help,
1093            const char *item,
1094            unsigned int item_width,
1095            unsigned int columns)
1096 {
1097   unsigned int col_width = LEFT_COLUMN;
1098   unsigned int remaining, room, len;
1099
1100   remaining = strlen (help);
1101
1102   do
1103     {
1104       room = columns - 3 - MAX (col_width, item_width);
1105       if (room > columns)
1106         room = 0;
1107       len = remaining;
1108
1109       if (room < len)
1110         {
1111           unsigned int i;
1112
1113           for (i = 0; help[i]; i++)
1114             {
1115               if (i >= room && len != remaining)
1116                 break;
1117               if (help[i] == ' ')
1118                 len = i;
1119               else if ((help[i] == '-' || help[i] == '/')
1120                        && help[i + 1] != ' '
1121                        && i > 0 && ISALPHA (help[i - 1]))
1122                 len = i + 1;
1123             }
1124         }
1125
1126       printf( "  %-*.*s %.*s\n", col_width, item_width, item, len, help);
1127       item_width = 0;
1128       while (help[len] == ' ')
1129         len++;
1130       help += len;
1131       remaining -= len;
1132     }
1133   while (remaining);
1134 }
1135
1136 /* Print help for a specific front-end, etc.  */
1137 static void
1138 print_filtered_help (unsigned int include_flags,
1139                      unsigned int exclude_flags,
1140                      unsigned int any_flags,
1141                      unsigned int columns)
1142 {
1143   unsigned int i;
1144   const char *help;
1145   static char *printed = NULL;
1146   bool found = false;
1147   bool displayed = false;
1148
1149   if (include_flags == CL_PARAMS)
1150     {
1151       for (i = 0; i < LAST_PARAM; i++)
1152         {
1153           const char *param = compiler_params[i].option;
1154
1155           help = compiler_params[i].help;
1156           if (help == NULL || *help == '\0')
1157             {
1158               if (exclude_flags & CL_UNDOCUMENTED)
1159                 continue;
1160               help = undocumented_msg;
1161             }
1162
1163           /* Get the translation.  */
1164           help = _(help);
1165
1166           wrap_help (help, param, strlen (param), columns);
1167         }
1168       putchar ('\n');
1169       return;
1170     }
1171
1172   if (!printed)
1173     printed = XCNEWVAR (char, cl_options_count);
1174
1175   for (i = 0; i < cl_options_count; i++)
1176     {
1177       static char new_help[128];
1178       const struct cl_option *option = cl_options + i;
1179       unsigned int len;
1180       const char *opt;
1181       const char *tab;
1182
1183       if (include_flags == 0
1184           || ((option->flags & include_flags) != include_flags))
1185         {
1186           if ((option->flags & any_flags) == 0)
1187             continue;
1188         }
1189
1190       /* Skip unwanted switches.  */
1191       if ((option->flags & exclude_flags) != 0)
1192         continue;
1193
1194       found = true;
1195       /* Skip switches that have already been printed.  */
1196       if (printed[i])
1197         continue;
1198
1199       printed[i] = true;
1200
1201       help = option->help;
1202       if (help == NULL)
1203         {
1204           if (exclude_flags & CL_UNDOCUMENTED)
1205             continue;
1206           help = undocumented_msg;
1207         }
1208
1209       /* Get the translation.  */
1210       help = _(help);
1211
1212       /* Find the gap between the name of the
1213          option and its descriptive text.  */
1214       tab = strchr (help, '\t');
1215       if (tab)
1216         {
1217           len = tab - help;
1218           opt = help;
1219           help = tab + 1;
1220         }
1221       else
1222         {
1223           opt = option->opt_text;
1224           len = strlen (opt);
1225         }
1226
1227       /* With the -Q option enabled we change the descriptive text associated
1228          with an option to be an indication of its current setting.  */
1229       if (!quiet_flag)
1230         {
1231           if (len < (LEFT_COLUMN + 2))
1232             strcpy (new_help, "\t\t");
1233           else
1234             strcpy (new_help, "\t");
1235
1236           if (option->flag_var != NULL)
1237             {
1238               if (option->flags & CL_JOINED)
1239                 {
1240                   if (option->var_type == CLVC_STRING)
1241                     {
1242                       if (* (const char **) option->flag_var != NULL)
1243                         snprintf (new_help + strlen (new_help),
1244                                   sizeof (new_help) - strlen (new_help),
1245                                   * (const char **) option->flag_var);
1246                     }
1247                   else
1248                     sprintf (new_help + strlen (new_help),
1249                              "%#x", * (int *) option->flag_var);
1250                 }
1251               else
1252                 strcat (new_help, option_enabled (i)
1253                         ? _("[enabled]") : _("[disabled]"));
1254             }
1255
1256           help = new_help;
1257         }
1258
1259       wrap_help (help, opt, len, columns);
1260       displayed = true;
1261     }
1262
1263   if (! found)
1264     {
1265       unsigned int langs = include_flags & CL_LANG_ALL;
1266
1267       if (langs == 0)
1268         printf (_(" No options with the desired characteristics were found\n"));
1269       else
1270         {
1271           unsigned int i;
1272
1273           /* PR 31349: Tell the user how to see all of the
1274              options supported by a specific front end.  */
1275           for (i = 0; (1U << i) < CL_LANG_ALL; i ++)
1276             if ((1U << i) & langs)
1277               printf (_(" None found.  Use --help=%s to show *all* the options supported by the %s front-end\n"),
1278                       lang_names[i], lang_names[i]);
1279         }
1280         
1281     }
1282   else if (! displayed)
1283     printf (_(" All options with the desired characteristics have already been displayed\n"));
1284
1285   putchar ('\n');
1286 }
1287
1288 /* Display help for a specified type of option.
1289    The options must have ALL of the INCLUDE_FLAGS set
1290    ANY of the flags in the ANY_FLAGS set
1291    and NONE of the EXCLUDE_FLAGS set.  */
1292 static void
1293 print_specific_help (unsigned int include_flags,
1294                      unsigned int exclude_flags,
1295                      unsigned int any_flags)
1296 {
1297   unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
1298   const char * description = NULL;
1299   const char * descrip_extra = "";
1300   size_t i;
1301   unsigned int flag;
1302   static unsigned int columns = 0;
1303
1304   /* Sanity check: Make sure that we do not have more
1305      languages than we have bits available to enumerate them.  */
1306   gcc_assert ((1U << cl_lang_count) < CL_MIN_OPTION_CLASS);
1307
1308   /* If we have not done so already, obtain
1309      the desired maximum width of the output.  */
1310   if (columns == 0)
1311     {
1312       const char *p;
1313
1314       GET_ENVIRONMENT (p, "COLUMNS");
1315       if (p != NULL)
1316         {
1317           int value = atoi (p);
1318
1319           if (value > 0)
1320             columns = value;
1321         }
1322
1323       if (columns == 0)
1324         /* Use a reasonable default.  */
1325         columns = 80;
1326     }
1327
1328   /* Decide upon the title for the options that we are going to display.  */
1329   for (i = 0, flag = 1; flag <= CL_MAX_OPTION_CLASS; flag <<= 1, i ++)
1330     {
1331       switch (flag & include_flags)
1332         {
1333         case 0:
1334           break;
1335
1336         case CL_TARGET:
1337           description = _("The following options are target specific");
1338           break;
1339         case CL_WARNING:
1340           description = _("The following options control compiler warning messages");
1341           break;
1342         case CL_OPTIMIZATION:
1343           description = _("The following options control optimizations");
1344           break;
1345         case CL_COMMON:
1346           description = _("The following options are language-independent");
1347           break;
1348         case CL_PARAMS:
1349           description = _("The --param option recognizes the following as parameters");
1350           break;
1351         default:
1352           if (i >= cl_lang_count)
1353             break;
1354           if ((exclude_flags & ((1U << cl_lang_count) - 1)) != 0)
1355             description = _("The following options are specific to just the language ");
1356           else
1357             description = _("The following options are supported by the language ");
1358           descrip_extra = lang_names [i];
1359           break;
1360         }
1361     }
1362
1363   if (description == NULL)
1364     {
1365       if (any_flags == 0)
1366         {
1367           if (include_flags == CL_UNDOCUMENTED)
1368             description = _("The following options are not documented");
1369           else
1370             {
1371               internal_error ("unrecognized include_flags 0x%x passed to print_specific_help",
1372                               include_flags);
1373               return;
1374             }
1375         }
1376       else
1377         {
1378           if (any_flags & all_langs_mask)
1379             description = _("The following options are language-related");
1380           else
1381             description = _("The following options are language-independent");
1382         }
1383     }
1384
1385   printf ("%s%s:\n", description, descrip_extra);
1386   print_filtered_help (include_flags, exclude_flags, any_flags, columns);
1387 }
1388
1389 /* Handle target- and language-independent options.  Return zero to
1390    generate an "unknown option" message.  Only options that need
1391    extra handling need to be listed here; if you simply want
1392    VALUE assigned to a variable, it happens automatically.  */
1393
1394 static int
1395 common_handle_option (size_t scode, const char *arg, int value,
1396                       unsigned int lang_mask)
1397 {
1398   static bool verbose = false;
1399   enum opt_code code = (enum opt_code) scode;
1400
1401   switch (code)
1402     {
1403     case OPT__param:
1404       handle_param (arg);
1405       break;
1406
1407     case OPT_v:
1408       verbose = true;
1409       break;
1410
1411     case OPT_fhelp:
1412     case OPT__help:
1413       {
1414         unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
1415         unsigned int undoc_mask;
1416         unsigned int i;
1417
1418         undoc_mask = (verbose | extra_warnings) ? 0 : CL_UNDOCUMENTED;
1419         /* First display any single language specific options.  */
1420         for (i = 0; i < cl_lang_count; i++)
1421           print_specific_help
1422             (1U << i, (all_langs_mask & (~ (1U << i))) | undoc_mask, 0);
1423         /* Next display any multi language specific options.  */
1424         print_specific_help (0, undoc_mask, all_langs_mask);
1425         /* Then display any remaining, non-language options.  */
1426         for (i = CL_MIN_OPTION_CLASS; i <= CL_MAX_OPTION_CLASS; i <<= 1)
1427           print_specific_help (i, undoc_mask, 0);
1428         exit_after_options = true;
1429         break;
1430       }
1431
1432     case OPT_ftarget_help:
1433     case OPT__target_help:
1434       print_specific_help (CL_TARGET, CL_UNDOCUMENTED, 0);
1435       exit_after_options = true;
1436
1437       /* Allow the target a chance to give the user some additional information.  */
1438       if (targetm.target_help)
1439         targetm.target_help ();
1440       break;
1441
1442     case OPT_fhelp_:
1443     case OPT__help_:
1444       {
1445         const char * a = arg;
1446         unsigned int include_flags = 0;
1447         /* Note - by default we include undocumented options when listing
1448            specific classes.  If you only want to see documented options
1449            then add ",^undocumented" to the --help= option.  E.g.:
1450
1451            --help=target,^undocumented  */
1452         unsigned int exclude_flags = 0;
1453
1454         /* Walk along the argument string, parsing each word in turn.
1455            The format is:
1456            arg = [^]{word}[,{arg}]
1457            word = {optimizers|target|warnings|undocumented|
1458                    params|common|<language>}  */
1459         while (* a != 0)
1460           {
1461             static struct
1462             {
1463               const char * string;
1464               unsigned int flag;
1465             }
1466             specifics[] =
1467             {
1468               { "optimizers", CL_OPTIMIZATION },
1469               { "target", CL_TARGET },
1470               { "warnings", CL_WARNING },
1471               { "undocumented", CL_UNDOCUMENTED },
1472               { "params", CL_PARAMS },
1473               { "joined", CL_JOINED },
1474               { "separate", CL_SEPARATE },
1475               { "common", CL_COMMON },
1476               { NULL, 0 }
1477             };
1478             unsigned int * pflags;
1479             char * comma;
1480             unsigned int lang_flag, specific_flag;
1481             unsigned int len;
1482             unsigned int i;
1483
1484             if (* a == '^')
1485               {
1486                 ++ a;
1487                 pflags = & exclude_flags;
1488               }
1489             else
1490               pflags = & include_flags;
1491
1492             comma = strchr (a, ',');
1493             if (comma == NULL)
1494               len = strlen (a);
1495             else
1496               len = comma - a;
1497
1498             /* Check to see if the string matches an option class name.  */
1499             for (i = 0, specific_flag = 0; specifics[i].string != NULL; i++)
1500               if (strncasecmp (a, specifics[i].string, len) == 0)
1501                 {
1502                   specific_flag = specifics[i].flag;
1503                   break;
1504                 }
1505             
1506             /* Check to see if the string matches a language name.
1507                Note - we rely upon the alpha-sorted nature of the entries in
1508                the lang_names array, specifically that shorter names appear
1509                before their longer variants.  (i.e. C before C++).  That way
1510                when we are attempting to match --help=c for example we will
1511                match with C first and not C++.  */
1512             for (i = 0, lang_flag = 0; i < cl_lang_count; i++)
1513               if (strncasecmp (a, lang_names[i], len) == 0)
1514                 {
1515                   lang_flag = 1U << i;
1516                   break;
1517                 }
1518
1519             if (specific_flag != 0)
1520               {
1521                 if (lang_flag == 0)
1522                   * pflags |= specific_flag;
1523                 else
1524                   {
1525                     /* The option's argument matches both the start of a
1526                        language name and the start of an option class name.
1527                        We have a special case for when the user has
1528                        specified "--help=c", but otherwise we have to issue
1529                        a warning.  */
1530                     if (strncasecmp (a, "c", len) == 0)
1531                       * pflags |= lang_flag;
1532                     else
1533                       fnotice (stderr,
1534                                "warning: --help argument %.*s is ambiguous, please be more specific\n",
1535                                len, a);
1536                   }
1537               }
1538             else if (lang_flag != 0)
1539               * pflags |= lang_flag;
1540             else
1541               fnotice (stderr,
1542                        "warning: unrecognized argument to --help= option: %.*s\n",
1543                        len, a);
1544
1545             if (comma == NULL)
1546               break;
1547             a = comma + 1;
1548           }
1549
1550         if (include_flags)
1551           print_specific_help (include_flags, exclude_flags, 0);
1552         exit_after_options = true;
1553         break;
1554       }
1555
1556     case OPT__version:
1557       print_version (stderr, "");
1558       exit_after_options = true;
1559       break;
1560
1561     case OPT_G:
1562       g_switch_value = value;
1563       g_switch_set = true;
1564       break;
1565
1566     case OPT_O:
1567     case OPT_Os:
1568       /* Currently handled in a prescan.  */
1569       break;
1570
1571     case OPT_W:
1572       /* For backward compatibility, -W is the same as -Wextra.  */
1573       set_Wextra (value);
1574       break;
1575
1576     case OPT_Wdisallowed_function_list_:
1577       warn_disallowed_functions = true;
1578       add_comma_separated_to_vector
1579         (&warning_disallowed_functions, arg);
1580       break;
1581
1582     case OPT_Werror_:
1583       enable_warning_as_error (arg, value, lang_mask);
1584       break;
1585
1586     case OPT_Wextra:
1587       set_Wextra (value);
1588       break;
1589
1590     case OPT_Wlarger_than_:
1591       /* This form corresponds to -Wlarger-than-.  
1592          Kept for backward compatibility. 
1593          Don't use it as the first argument of warning().  */
1594
1595     case OPT_Wlarger_than_eq:
1596       larger_than_size = value;
1597       warn_larger_than = value != -1;
1598       break;
1599
1600     case OPT_Wframe_larger_than_:
1601       frame_larger_than_size = value;
1602       warn_frame_larger_than = value != -1;
1603       break;
1604
1605     case OPT_Wstrict_aliasing:
1606       set_Wstrict_aliasing (value);
1607       break;
1608
1609     case OPT_Wstrict_aliasing_:
1610       warn_strict_aliasing = value;
1611       break;
1612
1613     case OPT_Wstrict_overflow:
1614       warn_strict_overflow = (value
1615                               ? (int) WARN_STRICT_OVERFLOW_CONDITIONAL
1616                               : 0);
1617       break;
1618
1619     case OPT_Wstrict_overflow_:
1620       warn_strict_overflow = value;
1621       break;
1622
1623     case OPT_Wunused:
1624       set_Wunused (value);
1625       break;
1626
1627     case OPT_aux_info:
1628     case OPT_aux_info_:
1629       aux_info_file_name = arg;
1630       flag_gen_aux_info = 1;
1631       break;
1632
1633     case OPT_auxbase:
1634       aux_base_name = arg;
1635       break;
1636
1637     case OPT_auxbase_strip:
1638       {
1639         char *tmp = xstrdup (arg);
1640         strip_off_ending (tmp, strlen (tmp));
1641         if (tmp[0])
1642           aux_base_name = tmp;
1643       }
1644       break;
1645
1646     case OPT_d:
1647       decode_d_option (arg);
1648       break;
1649
1650     case OPT_dumpbase:
1651       dump_base_name = arg;
1652       break;
1653
1654     case OPT_falign_functions_:
1655       align_functions = value;
1656       break;
1657
1658     case OPT_falign_jumps_:
1659       align_jumps = value;
1660       break;
1661
1662     case OPT_falign_labels_:
1663       align_labels = value;
1664       break;
1665
1666     case OPT_falign_loops_:
1667       align_loops = value;
1668       break;
1669
1670     case OPT_fbranch_probabilities:
1671       flag_branch_probabilities_set = true;
1672       break;
1673
1674     case OPT_fcall_used_:
1675       fix_register (arg, 0, 1);
1676       break;
1677
1678     case OPT_fcall_saved_:
1679       fix_register (arg, 0, 0);
1680       break;
1681
1682     case OPT_fdbg_cnt_:
1683       dbg_cnt_process_opt (arg);
1684       break;
1685
1686     case OPT_fdbg_cnt_list:
1687       dbg_cnt_list_all_counters ();
1688       break;
1689
1690     case OPT_fdebug_prefix_map_:
1691       add_debug_prefix_map (arg);
1692       break;
1693
1694     case OPT_fdiagnostics_show_location_:
1695       if (!strcmp (arg, "once"))
1696         diagnostic_prefixing_rule (global_dc) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
1697       else if (!strcmp (arg, "every-line"))
1698         diagnostic_prefixing_rule (global_dc)
1699           = DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE;
1700       else
1701         return 0;
1702       break;
1703
1704     case OPT_fdiagnostics_show_option:
1705       global_dc->show_option_requested = true;
1706       break;
1707
1708     case OPT_fdump_:
1709       if (!dump_switch_p (arg))
1710         return 0;
1711       break;
1712
1713     case OPT_ffast_math:
1714       set_fast_math_flags (value);
1715       break;
1716
1717     case OPT_funsafe_math_optimizations:
1718       set_unsafe_math_optimizations_flags (value);
1719       break;
1720
1721     case OPT_ffixed_:
1722       fix_register (arg, 1, 1);
1723       break;
1724
1725     case OPT_finline_limit_:
1726     case OPT_finline_limit_eq:
1727       set_param_value ("max-inline-insns-single", value / 2);
1728       set_param_value ("max-inline-insns-auto", value / 2);
1729       break;
1730
1731     case OPT_finstrument_functions_exclude_function_list_:
1732       add_comma_separated_to_vector
1733         (&flag_instrument_functions_exclude_functions, arg);
1734       break;
1735
1736     case OPT_finstrument_functions_exclude_file_list_:
1737       add_comma_separated_to_vector
1738         (&flag_instrument_functions_exclude_files, arg);
1739       break;
1740
1741     case OPT_fmessage_length_:
1742       pp_set_line_maximum_length (global_dc->printer, value);
1743       break;
1744
1745     case OPT_fpack_struct_:
1746       if (value <= 0 || (value & (value - 1)) || value > 16)
1747         error ("structure alignment must be a small power of two, not %d", value);
1748       else
1749         {
1750           initial_max_fld_align = value;
1751           maximum_field_alignment = value * BITS_PER_UNIT;
1752         }
1753       break;
1754
1755     case OPT_fpeel_loops:
1756       flag_peel_loops_set = true;
1757       break;
1758
1759     case OPT_fprofile_arcs:
1760       profile_arc_flag_set = true;
1761       break;
1762
1763     case OPT_finline_functions:
1764       flag_inline_functions_set = true;
1765       break;
1766
1767     case OPT_fprofile_dir_:
1768       profile_data_prefix = xstrdup (arg);
1769       break;
1770
1771     case OPT_fprofile_use_:
1772       profile_data_prefix = xstrdup (arg);
1773       flag_profile_use = true;
1774       value = true;
1775       /* No break here - do -fprofile-use processing. */
1776     case OPT_fprofile_use:
1777       if (!flag_branch_probabilities_set)
1778         flag_branch_probabilities = value;
1779       if (!flag_profile_values_set)
1780         flag_profile_values = value;
1781       if (!flag_unroll_loops_set)
1782         flag_unroll_loops = value;
1783       if (!flag_peel_loops_set)
1784         flag_peel_loops = value;
1785       if (!flag_tracer_set)
1786         flag_tracer = value;
1787       if (!flag_value_profile_transformations_set)
1788         flag_value_profile_transformations = value;
1789       if (!flag_inline_functions_set)
1790         flag_inline_functions = value;
1791       break;
1792
1793     case OPT_fprofile_generate_:
1794       profile_data_prefix = xstrdup (arg);
1795       value = true;
1796       /* No break here - do -fprofile-generate processing. */
1797     case OPT_fprofile_generate:
1798       if (!profile_arc_flag_set)
1799         profile_arc_flag = value;
1800       if (!flag_profile_values_set)
1801         flag_profile_values = value;
1802       if (!flag_value_profile_transformations_set)
1803         flag_value_profile_transformations = value;
1804       if (!flag_inline_functions_set)
1805         flag_inline_functions = value;
1806       break;
1807
1808     case OPT_fprofile_values:
1809       flag_profile_values_set = true;
1810       break;
1811
1812     case OPT_fvisibility_:
1813       {
1814         if (!strcmp(arg, "default"))
1815           default_visibility = VISIBILITY_DEFAULT;
1816         else if (!strcmp(arg, "internal"))
1817           default_visibility = VISIBILITY_INTERNAL;
1818         else if (!strcmp(arg, "hidden"))
1819           default_visibility = VISIBILITY_HIDDEN;
1820         else if (!strcmp(arg, "protected"))
1821           default_visibility = VISIBILITY_PROTECTED;
1822         else
1823           error ("unrecognized visibility value \"%s\"", arg);
1824       }
1825       break;
1826
1827     case OPT_fvpt:
1828       flag_value_profile_transformations_set = true;
1829       break;
1830
1831     case OPT_frandom_seed:
1832       /* The real switch is -fno-random-seed.  */
1833       if (value)
1834         return 0;
1835       set_random_seed (NULL);
1836       break;
1837
1838     case OPT_frandom_seed_:
1839       set_random_seed (arg);
1840       break;
1841
1842     case OPT_fsched_verbose_:
1843 #ifdef INSN_SCHEDULING
1844       fix_sched_param ("verbose", arg);
1845       break;
1846 #else
1847       return 0;
1848 #endif
1849
1850     case OPT_fsched_stalled_insns_:
1851       flag_sched_stalled_insns = value;
1852       if (flag_sched_stalled_insns == 0)
1853         flag_sched_stalled_insns = -1;
1854       break;
1855
1856     case OPT_fsched_stalled_insns_dep_:
1857       flag_sched_stalled_insns_dep = value;
1858       break;
1859
1860     case OPT_fstack_limit:
1861       /* The real switch is -fno-stack-limit.  */
1862       if (value)
1863         return 0;
1864       stack_limit_rtx = NULL_RTX;
1865       break;
1866
1867     case OPT_fstack_limit_register_:
1868       {
1869         int reg = decode_reg_name (arg);
1870         if (reg < 0)
1871           error ("unrecognized register name \"%s\"", arg);
1872         else
1873           stack_limit_rtx = gen_rtx_REG (Pmode, reg);
1874       }
1875       break;
1876
1877     case OPT_fstack_limit_symbol_:
1878       stack_limit_rtx = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (arg));
1879       break;
1880
1881     case OPT_ftree_vectorizer_verbose_:
1882       vect_set_verbosity_level (arg);
1883       break;
1884
1885     case OPT_ftls_model_:
1886       if (!strcmp (arg, "global-dynamic"))
1887         flag_tls_default = TLS_MODEL_GLOBAL_DYNAMIC;
1888       else if (!strcmp (arg, "local-dynamic"))
1889         flag_tls_default = TLS_MODEL_LOCAL_DYNAMIC;
1890       else if (!strcmp (arg, "initial-exec"))
1891         flag_tls_default = TLS_MODEL_INITIAL_EXEC;
1892       else if (!strcmp (arg, "local-exec"))
1893         flag_tls_default = TLS_MODEL_LOCAL_EXEC;
1894       else
1895         warning (0, "unknown tls-model \"%s\"", arg);
1896       break;
1897
1898     case OPT_ftracer:
1899       flag_tracer_set = true;
1900       break;
1901
1902     case OPT_funroll_loops:
1903       flag_unroll_loops_set = true;
1904       break;
1905
1906     case OPT_g:
1907       set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, arg);
1908       break;
1909
1910     case OPT_gcoff:
1911       set_debug_level (SDB_DEBUG, false, arg);
1912       break;
1913
1914     case OPT_gdwarf_2:
1915       set_debug_level (DWARF2_DEBUG, false, arg);
1916       break;
1917
1918     case OPT_ggdb:
1919       set_debug_level (NO_DEBUG, 2, arg);
1920       break;
1921
1922     case OPT_gstabs:
1923     case OPT_gstabs_:
1924       set_debug_level (DBX_DEBUG, code == OPT_gstabs_, arg);
1925       break;
1926
1927     case OPT_gvms:
1928       set_debug_level (VMS_DEBUG, false, arg);
1929       break;
1930
1931     case OPT_gxcoff:
1932     case OPT_gxcoff_:
1933       set_debug_level (XCOFF_DEBUG, code == OPT_gxcoff_, arg);
1934       break;
1935
1936     case OPT_o:
1937       asm_file_name = arg;
1938       break;
1939
1940     case OPT_pedantic_errors:
1941       flag_pedantic_errors = pedantic = 1;
1942       break;
1943
1944     case OPT_floop_optimize:
1945     case OPT_frerun_loop_opt:
1946     case OPT_fstrength_reduce:
1947     case OPT_ftree_store_copy_prop:
1948     case OPT_fforce_addr:
1949     case OPT_ftree_salias:
1950       /* These are no-ops, preserved for backward compatibility.  */
1951       break;
1952
1953     default:
1954       /* If the flag was handled in a standard way, assume the lack of
1955          processing here is intentional.  */
1956       gcc_assert (cl_options[scode].flag_var);
1957       break;
1958     }
1959
1960   return 1;
1961 }
1962
1963 /* Handle --param NAME=VALUE.  */
1964 static void
1965 handle_param (const char *carg)
1966 {
1967   char *equal, *arg;
1968   int value;
1969
1970   arg = xstrdup (carg);
1971   equal = strchr (arg, '=');
1972   if (!equal)
1973     error ("%s: --param arguments should be of the form NAME=VALUE", arg);
1974   else
1975     {
1976       value = integral_argument (equal + 1);
1977       if (value == -1)
1978         error ("invalid --param value %qs", equal + 1);
1979       else
1980         {
1981           *equal = '\0';
1982           set_param_value (arg, value);
1983         }
1984     }
1985
1986   free (arg);
1987 }
1988
1989 /* Handle -W and -Wextra.  */
1990 static void
1991 set_Wextra (int setting)
1992 {
1993   extra_warnings = setting;
1994   warn_unused_parameter = (setting && maybe_warn_unused_parameter);
1995
1996   /* We save the value of warn_uninitialized, since if they put
1997      -Wuninitialized on the command line, we need to generate a
1998      warning about not using it without also specifying -O.  */
1999   if (setting == 0)
2000     warn_uninitialized = 0;
2001   else if (warn_uninitialized != 1)
2002     warn_uninitialized = 2;
2003 }
2004
2005 /* Initialize unused warning flags.  */
2006 void
2007 set_Wunused (int setting)
2008 {
2009   warn_unused_function = setting;
2010   warn_unused_label = setting;
2011   /* Unused function parameter warnings are reported when either
2012      ``-Wextra -Wunused'' or ``-Wunused-parameter'' is specified.
2013      Thus, if -Wextra has already been seen, set warn_unused_parameter;
2014      otherwise set maybe_warn_extra_parameter, which will be picked up
2015      by set_Wextra.  */
2016   maybe_warn_unused_parameter = setting;
2017   warn_unused_parameter = (setting && extra_warnings);
2018   warn_unused_variable = setting;
2019   warn_unused_value = setting;
2020 }
2021
2022 /* Used to set the level of strict aliasing warnings, 
2023    when no level is specified (i.e., when -Wstrict-aliasing, and not
2024    -Wstrict-aliasing=level was given).
2025    ONOFF is assumed to take value 1 when -Wstrict-aliasing is specified,
2026    and 0 otherwise.  After calling this function, wstrict_aliasing will be
2027    set to the default value of -Wstrict_aliasing=level, currently 3.  */
2028 void
2029 set_Wstrict_aliasing (int onoff)
2030 {
2031   gcc_assert (onoff == 0 || onoff == 1);
2032   if (onoff != 0)
2033     warn_strict_aliasing = 3;
2034   else
2035     warn_strict_aliasing = 0;
2036 }
2037
2038 /* The following routines are useful in setting all the flags that
2039    -ffast-math and -fno-fast-math imply.  */
2040 void
2041 set_fast_math_flags (int set)
2042 {
2043   flag_unsafe_math_optimizations = set;
2044   set_unsafe_math_optimizations_flags (set);
2045   flag_finite_math_only = set;
2046   flag_errno_math = !set;
2047   if (set)
2048     {
2049       flag_signaling_nans = 0;
2050       flag_rounding_math = 0;
2051       flag_cx_limited_range = 1;
2052     }
2053 }
2054
2055 /* When -funsafe-math-optimizations is set the following 
2056    flags are set as well.  */ 
2057 void
2058 set_unsafe_math_optimizations_flags (int set)
2059 {
2060   flag_trapping_math = !set;
2061   flag_signed_zeros = !set;
2062   flag_associative_math = set;
2063   flag_reciprocal_math = set;
2064 }
2065
2066 /* Return true iff flags are set as if -ffast-math.  */
2067 bool
2068 fast_math_flags_set_p (void)
2069 {
2070   return (!flag_trapping_math
2071           && flag_unsafe_math_optimizations
2072           && flag_finite_math_only
2073           && !flag_signed_zeros
2074           && !flag_errno_math);
2075 }
2076
2077 /* Handle a debug output -g switch.  EXTENDED is true or false to support
2078    extended output (2 is special and means "-ggdb" was given).  */
2079 static void
2080 set_debug_level (enum debug_info_type type, int extended, const char *arg)
2081 {
2082   static bool type_explicit;
2083
2084   use_gnu_debug_info_extensions = extended;
2085
2086   if (type == NO_DEBUG)
2087     {
2088       if (write_symbols == NO_DEBUG)
2089         {
2090           write_symbols = PREFERRED_DEBUGGING_TYPE;
2091
2092           if (extended == 2)
2093             {
2094 #ifdef DWARF2_DEBUGGING_INFO
2095               write_symbols = DWARF2_DEBUG;
2096 #elif defined DBX_DEBUGGING_INFO
2097               write_symbols = DBX_DEBUG;
2098 #endif
2099             }
2100
2101           if (write_symbols == NO_DEBUG)
2102             warning (0, "target system does not support debug output");
2103         }
2104     }
2105   else
2106     {
2107       /* Does it conflict with an already selected type?  */
2108       if (type_explicit && write_symbols != NO_DEBUG && type != write_symbols)
2109         error ("debug format \"%s\" conflicts with prior selection",
2110                debug_type_names[type]);
2111       write_symbols = type;
2112       type_explicit = true;
2113     }
2114
2115   /* A debug flag without a level defaults to level 2.  */
2116   if (*arg == '\0')
2117     {
2118       if (!debug_info_level)
2119         debug_info_level = 2;
2120     }
2121   else
2122     {
2123       debug_info_level = integral_argument (arg);
2124       if (debug_info_level == (unsigned int) -1)
2125         error ("unrecognised debug output level \"%s\"", arg);
2126       else if (debug_info_level > 3)
2127         error ("debug output level %s is too high", arg);
2128     }
2129 }
2130
2131 /* Return 1 if OPTION is enabled, 0 if it is disabled, or -1 if it isn't
2132    a simple on-off switch.  */
2133
2134 int
2135 option_enabled (int opt_idx)
2136 {
2137   const struct cl_option *option = &(cl_options[opt_idx]);
2138
2139   if (option->flag_var)
2140     switch (option->var_type)
2141       {
2142       case CLVC_BOOLEAN:
2143         return *(int *) option->flag_var != 0;
2144
2145       case CLVC_EQUAL:
2146         return *(int *) option->flag_var == option->var_value;
2147
2148       case CLVC_BIT_CLEAR:
2149         return (*(int *) option->flag_var & option->var_value) == 0;
2150
2151       case CLVC_BIT_SET:
2152         return (*(int *) option->flag_var & option->var_value) != 0;
2153
2154       case CLVC_STRING:
2155         break;
2156       }
2157   return -1;
2158 }
2159
2160 /* Fill STATE with the current state of option OPTION.  Return true if
2161    there is some state to store.  */
2162
2163 bool
2164 get_option_state (int option, struct cl_option_state *state)
2165 {
2166   if (cl_options[option].flag_var == 0)
2167     return false;
2168
2169   switch (cl_options[option].var_type)
2170     {
2171     case CLVC_BOOLEAN:
2172     case CLVC_EQUAL:
2173       state->data = cl_options[option].flag_var;
2174       state->size = sizeof (int);
2175       break;
2176
2177     case CLVC_BIT_CLEAR:
2178     case CLVC_BIT_SET:
2179       state->ch = option_enabled (option);
2180       state->data = &state->ch;
2181       state->size = 1;
2182       break;
2183
2184     case CLVC_STRING:
2185       state->data = *(const char **) cl_options[option].flag_var;
2186       if (state->data == 0)
2187         state->data = "";
2188       state->size = strlen ((const char *) state->data) + 1;
2189       break;
2190     }
2191   return true;
2192 }
2193
2194 /* Enable a warning option as an error.  This is used by -Werror= and
2195    also by legacy Werror-implicit-function-declaration.  */
2196
2197 void
2198 enable_warning_as_error (const char *arg, int value, unsigned int lang_mask)
2199 {
2200   char *new_option;
2201   int option_index;
2202
2203   new_option = XNEWVEC (char, strlen (arg) + 2);
2204   new_option[0] = 'W';
2205   strcpy (new_option + 1, arg);
2206   option_index = find_opt (new_option, lang_mask);
2207   if (option_index == N_OPTS)
2208     {
2209       error ("-Werror=%s: No option -%s", arg, new_option);
2210     }
2211   else
2212     {
2213       int kind = value ? DK_ERROR : DK_WARNING;
2214       diagnostic_classify_diagnostic (global_dc, option_index, kind);
2215       
2216       /* -Werror=foo implies -Wfoo.  */
2217       if (cl_options[option_index].var_type == CLVC_BOOLEAN
2218           && cl_options[option_index].flag_var
2219           && kind == DK_ERROR)
2220         *(int *) cl_options[option_index].flag_var = 1;
2221     }
2222   free (new_option);
2223 }