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