1/* Command line option handling.
2   Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
3   Free Software Foundation, Inc.
4   Contributed by Neil Booth.
5
6This file is part of GCC.
7
8GCC is free software; you can redistribute it and/or modify it under
9the terms of the GNU General Public License as published by the Free
10Software Foundation; either version 3, or (at your option) any later
11version.
12
13GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14WARRANTY; without even the implied warranty of MERCHANTABILITY or
15FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16for more details.
17
18You should have received a copy of the GNU General Public License
19along 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 "expr.h"
30#include "ggc.h"
31#include "output.h"
32#include "langhooks.h"
33#include "opts.h"
34#include "options.h"
35#include "flags.h"
36#include "toplev.h"
37#include "params.h"
38#include "diagnostic.h"
39#include "tm_p.h"		/* For OPTIMIZATION_OPTIONS.  */
40#include "insn-attr.h"		/* For INSN_SCHEDULING.  */
41#include "target.h"
42#include "tree-pass.h"
43#include "dbgcnt.h"
44#include "debug.h"
45#include "plugin.h"
46#include "except.h"
47#include "lto-streamer.h"
48
49/* Value of the -G xx switch, and whether it was passed or not.  */
50unsigned HOST_WIDE_INT g_switch_value;
51bool g_switch_set;
52
53/* Same for selective scheduling.  */
54bool sel_sched_switch_set;
55
56/* True if we should exit after parsing options.  */
57bool exit_after_options;
58
59/* True to warn about any objects definitions whose size is larger
60   than N bytes.  Also want about function definitions whose returned
61   values are larger than N bytes, where N is `larger_than_size'.  */
62bool warn_larger_than;
63HOST_WIDE_INT larger_than_size;
64
65/* True to warn about any function whose frame size is larger
66 * than N bytes. */
67bool warn_frame_larger_than;
68HOST_WIDE_INT frame_larger_than_size;
69
70/* Type(s) of debugging information we are producing (if any).  See
71   flags.h for the definitions of the different possible types of
72   debugging information.  */
73enum debug_info_type write_symbols = NO_DEBUG;
74
75/* Level of debugging information we are producing.  See flags.h for
76   the definitions of the different possible levels.  */
77enum debug_info_level debug_info_level = DINFO_LEVEL_NONE;
78
79/* A major contribution to object and executable size is debug
80   information size.  A major contribution to debug information size
81   is struct descriptions replicated in several object files. The
82   following flags attempt to reduce this information.  The basic
83   idea is to not emit struct debugging information in the current
84   compilation unit when that information will be generated by
85   another compilation unit.
86
87   Debug information for a struct defined in the current source
88   file should be generated in the object file.  Likewise the
89   debug information for a struct defined in a header should be
90   generated in the object file of the corresponding source file.
91   Both of these case are handled when the base name of the file of
92   the struct definition matches the base name of the source file
93   of the current compilation unit.  This matching emits minimal
94   struct debugging information.
95
96   The base file name matching rule above will fail to emit debug
97   information for structs defined in system headers.  So a second
98   category of files includes system headers in addition to files
99   with matching bases.
100
101   The remaining types of files are library headers and application
102   headers.  We cannot currently distinguish these two types.  */
103
104enum debug_struct_file
105{
106  DINFO_STRUCT_FILE_NONE,   /* Debug no structs. */
107  DINFO_STRUCT_FILE_BASE,   /* Debug structs defined in files with the
108                               same base name as the compilation unit. */
109  DINFO_STRUCT_FILE_SYS,    /* Also debug structs defined in system
110                               header files.  */
111  DINFO_STRUCT_FILE_ANY     /* Debug structs defined in all files. */
112};
113
114/* Generic structs (e.g. templates not explicitly specialized)
115   may not have a compilation unit associated with them, and so
116   may need to be treated differently from ordinary structs.
117
118   Structs only handled by reference (indirectly), will also usually
119   not need as much debugging information.  */
120
121static enum debug_struct_file debug_struct_ordinary[DINFO_USAGE_NUM_ENUMS]
122  = { DINFO_STRUCT_FILE_ANY, DINFO_STRUCT_FILE_ANY, DINFO_STRUCT_FILE_ANY };
123static enum debug_struct_file debug_struct_generic[DINFO_USAGE_NUM_ENUMS]
124  = { DINFO_STRUCT_FILE_ANY, DINFO_STRUCT_FILE_ANY, DINFO_STRUCT_FILE_ANY };
125
126/* Parse the -femit-struct-debug-detailed option value
127   and set the flag variables. */
128
129#define MATCH( prefix, string ) \
130  ((strncmp (prefix, string, sizeof prefix - 1) == 0) \
131   ? ((string += sizeof prefix - 1), 1) : 0)
132
133void
134set_struct_debug_option (const char *spec)
135{
136  /* various labels for comparison */
137  static char dfn_lbl[] = "dfn:", dir_lbl[] = "dir:", ind_lbl[] = "ind:";
138  static char ord_lbl[] = "ord:", gen_lbl[] = "gen:";
139  static char none_lbl[] = "none", any_lbl[] = "any";
140  static char base_lbl[] = "base", sys_lbl[] = "sys";
141
142  enum debug_struct_file files = DINFO_STRUCT_FILE_ANY;
143  /* Default is to apply to as much as possible. */
144  enum debug_info_usage usage = DINFO_USAGE_NUM_ENUMS;
145  int ord = 1, gen = 1;
146
147  /* What usage? */
148  if (MATCH (dfn_lbl, spec))
149    usage = DINFO_USAGE_DFN;
150  else if (MATCH (dir_lbl, spec))
151    usage = DINFO_USAGE_DIR_USE;
152  else if (MATCH (ind_lbl, spec))
153    usage = DINFO_USAGE_IND_USE;
154
155  /* Generics or not? */
156  if (MATCH (ord_lbl, spec))
157    gen = 0;
158  else if (MATCH (gen_lbl, spec))
159    ord = 0;
160
161  /* What allowable environment? */
162  if (MATCH (none_lbl, spec))
163    files = DINFO_STRUCT_FILE_NONE;
164  else if (MATCH (any_lbl, spec))
165    files = DINFO_STRUCT_FILE_ANY;
166  else if (MATCH (sys_lbl, spec))
167    files = DINFO_STRUCT_FILE_SYS;
168  else if (MATCH (base_lbl, spec))
169    files = DINFO_STRUCT_FILE_BASE;
170  else
171    error ("argument %qs to %<-femit-struct-debug-detailed%> not recognized",
172           spec);
173
174  /* Effect the specification. */
175  if (usage == DINFO_USAGE_NUM_ENUMS)
176    {
177      if (ord)
178        {
179          debug_struct_ordinary[DINFO_USAGE_DFN] = files;
180          debug_struct_ordinary[DINFO_USAGE_DIR_USE] = files;
181          debug_struct_ordinary[DINFO_USAGE_IND_USE] = files;
182        }
183      if (gen)
184        {
185          debug_struct_generic[DINFO_USAGE_DFN] = files;
186          debug_struct_generic[DINFO_USAGE_DIR_USE] = files;
187          debug_struct_generic[DINFO_USAGE_IND_USE] = files;
188        }
189    }
190  else
191    {
192      if (ord)
193        debug_struct_ordinary[usage] = files;
194      if (gen)
195        debug_struct_generic[usage] = files;
196    }
197
198  if (*spec == ',')
199    set_struct_debug_option (spec+1);
200  else
201    {
202      /* No more -femit-struct-debug-detailed specifications.
203         Do final checks. */
204      if (*spec != '\0')
205	error ("argument %qs to %<-femit-struct-debug-detailed%> unknown",
206               spec);
207      if (debug_struct_ordinary[DINFO_USAGE_DIR_USE]
208		< debug_struct_ordinary[DINFO_USAGE_IND_USE]
209	  || debug_struct_generic[DINFO_USAGE_DIR_USE]
210		< debug_struct_generic[DINFO_USAGE_IND_USE])
211	error ("%<-femit-struct-debug-detailed=dir:...%> must allow at least"
212               " as much as %<-femit-struct-debug-detailed=ind:...%>");
213    }
214}
215
216/* Find the base name of a path, stripping off both directories and
217   a single final extension. */
218static int
219base_of_path (const char *path, const char **base_out)
220{
221  const char *base = path;
222  const char *dot = 0;
223  const char *p = path;
224  char c = *p;
225  while (c)
226    {
227      if (IS_DIR_SEPARATOR(c))
228        {
229          base = p + 1;
230          dot = 0;
231        }
232      else if (c == '.')
233        dot = p;
234      c = *++p;
235    }
236  if (!dot)
237    dot = p;
238  *base_out = base;
239  return dot - base;
240}
241
242/* Match the base name of a file to the base name of a compilation unit. */
243
244static const char *main_input_basename;
245static int main_input_baselength;
246
247static int
248matches_main_base (const char *path)
249{
250  /* Cache the last query. */
251  static const char *last_path = NULL;
252  static int last_match = 0;
253  if (path != last_path)
254    {
255      const char *base;
256      int length = base_of_path (path, &base);
257      last_path = path;
258      last_match = (length == main_input_baselength
259                    && memcmp (base, main_input_basename, length) == 0);
260    }
261  return last_match;
262}
263
264#ifdef DEBUG_DEBUG_STRUCT
265
266static int
267dump_struct_debug (tree type, enum debug_info_usage usage,
268		   enum debug_struct_file criterion, int generic,
269		   int matches, int result)
270{
271  /* Find the type name. */
272  tree type_decl = TYPE_STUB_DECL (type);
273  tree t = type_decl;
274  const char *name = 0;
275  if (TREE_CODE (t) == TYPE_DECL)
276    t = DECL_NAME (t);
277  if (t)
278    name = IDENTIFIER_POINTER (t);
279
280  fprintf (stderr, "	struct %d %s %s %s %s %d %p %s\n",
281	   criterion,
282           DECL_IN_SYSTEM_HEADER (type_decl) ? "sys" : "usr",
283           matches ? "bas" : "hdr",
284           generic ? "gen" : "ord",
285           usage == DINFO_USAGE_DFN ? ";" :
286             usage == DINFO_USAGE_DIR_USE ? "." : "*",
287           result,
288           (void*) type_decl, name);
289  return result;
290}
291#define DUMP_GSTRUCT(type, usage, criterion, generic, matches, result) \
292  dump_struct_debug (type, usage, criterion, generic, matches, result)
293
294#else
295
296#define DUMP_GSTRUCT(type, usage, criterion, generic, matches, result) \
297  (result)
298
299#endif
300
301
302bool
303should_emit_struct_debug (tree type, enum debug_info_usage usage)
304{
305  enum debug_struct_file criterion;
306  tree type_decl;
307  bool generic = lang_hooks.types.generic_p (type);
308
309  if (generic)
310    criterion = debug_struct_generic[usage];
311  else
312    criterion = debug_struct_ordinary[usage];
313
314  if (criterion == DINFO_STRUCT_FILE_NONE)
315    return DUMP_GSTRUCT (type, usage, criterion, generic, false, false);
316  if (criterion == DINFO_STRUCT_FILE_ANY)
317    return DUMP_GSTRUCT (type, usage, criterion, generic, false, true);
318
319  type_decl = TYPE_STUB_DECL (type);
320
321  if (criterion == DINFO_STRUCT_FILE_SYS && DECL_IN_SYSTEM_HEADER (type_decl))
322    return DUMP_GSTRUCT (type, usage, criterion, generic, false, true);
323
324  if (matches_main_base (DECL_SOURCE_FILE (type_decl)))
325    return DUMP_GSTRUCT (type, usage, criterion, generic, true, true);
326  return DUMP_GSTRUCT (type, usage, criterion, generic, false, false);
327}
328
329/* Nonzero means use GNU-only extensions in the generated symbolic
330   debugging information.  Currently, this only has an effect when
331   write_symbols is set to DBX_DEBUG, XCOFF_DEBUG, or DWARF_DEBUG.  */
332bool use_gnu_debug_info_extensions;
333
334/* The default visibility for all symbols (unless overridden) */
335enum symbol_visibility default_visibility = VISIBILITY_DEFAULT;
336
337/* Global visibility options.  */
338struct visibility_flags visibility_options;
339
340/* What to print when a switch has no documentation.  */
341static const char undocumented_msg[] = N_("This switch lacks documentation");
342
343/* Used for bookkeeping on whether user set these flags so
344   -fprofile-use/-fprofile-generate does not use them.  */
345static bool profile_arc_flag_set, flag_profile_values_set;
346static bool flag_unroll_loops_set, flag_tracer_set;
347static bool flag_value_profile_transformations_set;
348static bool flag_peel_loops_set, flag_branch_probabilities_set;
349static bool flag_inline_functions_set, flag_ipa_cp_set, flag_ipa_cp_clone_set;
350static bool flag_predictive_commoning_set, flag_unswitch_loops_set, flag_gcse_after_reload_set;
351
352/* Functions excluded from profiling.  */
353
354typedef char *char_p; /* For DEF_VEC_P.  */
355DEF_VEC_P(char_p);
356DEF_VEC_ALLOC_P(char_p,heap);
357
358static VEC(char_p,heap) *flag_instrument_functions_exclude_functions;
359static VEC(char_p,heap) *flag_instrument_functions_exclude_files;
360
361typedef const char *const_char_p; /* For DEF_VEC_P.  */
362DEF_VEC_P(const_char_p);
363DEF_VEC_ALLOC_P(const_char_p,heap);
364
365static VEC(const_char_p,heap) *ignored_options;
366
367/* Language specific warning pass for unused results.  */
368bool flag_warn_unused_result = false;
369
370/* Input file names.  */
371const char **in_fnames;
372unsigned num_in_fnames;
373
374static int common_handle_option (size_t scode, const char *arg, int value,
375				 unsigned int lang_mask);
376static void handle_param (const char *);
377static unsigned int handle_option (const char **argv, unsigned int lang_mask);
378static char *write_langs (unsigned int lang_mask);
379static void complain_wrong_lang (const char *, const struct cl_option *,
380				 unsigned int lang_mask);
381static void handle_options (unsigned int, const char **, unsigned int);
382static void set_debug_level (enum debug_info_type type, int extended,
383			     const char *arg);
384
385/* If ARG is a non-negative integer made up solely of digits, return its
386   value, otherwise return -1.  */
387static int
388integral_argument (const char *arg)
389{
390  const char *p = arg;
391
392  while (*p && ISDIGIT (*p))
393    p++;
394
395  if (*p == '\0')
396    return atoi (arg);
397
398  return -1;
399}
400
401/* Return a malloced slash-separated list of languages in MASK.  */
402static char *
403write_langs (unsigned int mask)
404{
405  unsigned int n = 0, len = 0;
406  const char *lang_name;
407  char *result;
408
409  for (n = 0; (lang_name = lang_names[n]) != 0; n++)
410    if (mask & (1U << n))
411      len += strlen (lang_name) + 1;
412
413  result = XNEWVEC (char, len);
414  len = 0;
415  for (n = 0; (lang_name = lang_names[n]) != 0; n++)
416    if (mask & (1U << n))
417      {
418	if (len)
419	  result[len++] = '/';
420	strcpy (result + len, lang_name);
421	len += strlen (lang_name);
422      }
423
424  result[len] = 0;
425
426  return result;
427}
428
429/* Complain that switch OPT_INDEX does not apply to this front end.  */
430static void
431complain_wrong_lang (const char *text, const struct cl_option *option,
432		     unsigned int lang_mask)
433{
434  char *ok_langs, *bad_lang;
435
436  /* The LTO front end inherits all the options from the first front
437     end that was used.  However, not all the original front end
438     options make sense in LTO.
439
440     A real solution would be to filter this in collect2, but collect2
441     does not have access to all the option attributes to know what to
442     filter.  So, in lto1 we silently accept inherited flags and do
443     nothing about it.  */
444  if (lang_mask & CL_LTO)
445    return;
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
465static 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
472void 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.  */
490static unsigned int
491handle_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    set_option (option, value, arg);
614
615  if (option->flags & lang_mask)
616    {
617      if (lang_hooks.handle_option (opt_index, arg, value) == 0)
618	result = 0;
619#ifdef ENABLE_LTO
620      else
621	lto_register_user_option (opt_index, arg, value, lang_mask);
622#endif
623    }
624
625  if (result && (option->flags & CL_COMMON))
626    {
627      if (common_handle_option (opt_index, arg, value, lang_mask) == 0)
628	result = 0;
629#ifdef ENABLE_LTO
630      else
631	lto_register_user_option (opt_index, arg, value, CL_COMMON);
632#endif
633    }
634
635  if (result && (option->flags & CL_TARGET))
636    {
637      if (!targetm.handle_option (opt_index, arg, value))
638	result = 0;
639#ifdef ENABLE_LTO
640      else
641	lto_register_user_option (opt_index, arg, value, CL_TARGET);
642#endif
643    }
644
645 done:
646  if (dup)
647    free (dup);
648  return result;
649}
650
651/* Handle FILENAME from the command line.  */
652static void
653add_input_filename (const char *filename)
654{
655  num_in_fnames++;
656  in_fnames = XRESIZEVEC (const char *, in_fnames, num_in_fnames);
657  in_fnames[num_in_fnames - 1] = filename;
658}
659
660/* Add comma-separated strings to a char_p vector.  */
661
662static void
663add_comma_separated_to_vector (VEC(char_p,heap) **pvec, 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
700bool
701flag_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
740/* Decode and handle the vector of command line options.  LANG_MASK
741   contains has a single bit set representing the current
742   language.  */
743static void
744handle_options (unsigned int argc, const char **argv, unsigned int lang_mask)
745{
746  unsigned int n, i;
747
748  for (i = 1; i < argc; i += n)
749    {
750      const char *opt = argv[i];
751
752      /* Interpret "-" or a non-switch as a file name.  */
753      if (opt[0] != '-' || opt[1] == '\0')
754	{
755	  if (main_input_filename == NULL)
756	    {
757	      main_input_filename = opt;
758	      main_input_baselength
759		= base_of_path (main_input_filename, &main_input_basename);
760	    }
761	  add_input_filename (opt);
762	  n = 1;
763	  continue;
764	}
765
766      n = handle_option (argv + i, lang_mask);
767
768      if (!n)
769	{
770	  n = 1;
771	  error ("unrecognized command line option \"%s\"", opt);
772	}
773    }
774}
775
776/* Parse command line options and set default flag values.  Do minimal
777   options processing.  */
778void
779decode_options (unsigned int argc, const char **argv)
780{
781  static bool first_time_p = true;
782  static int initial_min_crossjump_insns;
783  static int initial_max_fields_for_field_sensitive;
784  static int initial_loop_invariant_max_bbs_in_loop;
785  static unsigned int initial_lang_mask;
786
787  unsigned int i, lang_mask;
788  int opt1;
789  int opt2;
790  int opt3;
791  int opt1_max;
792
793  if (first_time_p)
794    {
795      /* Perform language-specific options initialization.  */
796      initial_lang_mask = lang_mask = lang_hooks.init_options (argc, argv);
797
798      lang_hooks.initialize_diagnostics (global_dc);
799
800      /* Save initial values of parameters we reset.  */
801      initial_min_crossjump_insns
802	= compiler_params[PARAM_MIN_CROSSJUMP_INSNS].value;
803      initial_max_fields_for_field_sensitive
804	= compiler_params[PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE].value;
805      initial_loop_invariant_max_bbs_in_loop
806	= compiler_params[PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP].value;
807    }
808  else
809    lang_mask = initial_lang_mask;
810
811  /* Scan to see what optimization level has been specified.  That will
812     determine the default value of many flags.  */
813  for (i = 1; i < argc; i++)
814    {
815      if (!strcmp (argv[i], "-O"))
816	{
817	  optimize = 1;
818	  optimize_size = 0;
819	}
820      else if (argv[i][0] == '-' && argv[i][1] == 'O')
821	{
822	  /* Handle -Os, -O2, -O3, -O69, ...  */
823	  const char *p = &argv[i][2];
824
825	  if ((p[0] == 's') && (p[1] == 0))
826	    {
827	      optimize_size = 1;
828
829	      /* Optimizing for size forces optimize to be 2.  */
830	      optimize = 2;
831	    }
832	  else
833	    {
834	      const int optimize_val = read_integral_parameter (p, p - 2, -1);
835	      if (optimize_val != -1)
836		{
837		  optimize = optimize_val;
838		  if ((unsigned int) optimize > 255)
839		    optimize = 255;
840		  optimize_size = 0;
841		}
842	    }
843	}
844    }
845
846  /* Use priority coloring if cover classes is not defined for the
847     target.  */
848  if (targetm.ira_cover_classes == NULL)
849    flag_ira_algorithm = IRA_ALGORITHM_PRIORITY;
850
851  /* -O1 optimizations.  */
852  opt1 = (optimize >= 1);
853  flag_defer_pop = opt1;
854#ifdef DELAY_SLOTS
855  flag_delayed_branch = opt1;
856#endif
857#ifdef CAN_DEBUG_WITHOUT_FP
858  flag_omit_frame_pointer = opt1;
859#endif
860  flag_guess_branch_prob = opt1;
861  flag_cprop_registers = opt1;
862  flag_forward_propagate = opt1;
863  flag_if_conversion = opt1;
864  flag_if_conversion2 = opt1;
865  flag_ipa_pure_const = opt1;
866  flag_ipa_reference = opt1;
867  flag_merge_constants = opt1;
868  flag_split_wide_types = opt1;
869  flag_tree_ccp = opt1;
870  flag_tree_dce = opt1;
871  flag_tree_dom = opt1;
872  flag_tree_dse = opt1;
873  flag_tree_ter = opt1;
874  flag_tree_sra = opt1;
875  flag_tree_copyrename = opt1;
876  flag_tree_fre = opt1;
877  flag_tree_copy_prop = opt1;
878  flag_tree_sink = opt1;
879  flag_tree_ch = opt1;
880
881  /* -O2 optimizations.  */
882  opt2 = (optimize >= 2);
883  flag_inline_small_functions = opt2;
884  flag_indirect_inlining = opt2;
885  flag_thread_jumps = opt2;
886  flag_crossjumping = opt2;
887  flag_optimize_sibling_calls = opt2;
888  flag_cse_follow_jumps = opt2;
889  flag_gcse = opt2;
890  flag_expensive_optimizations = opt2;
891  flag_rerun_cse_after_loop = opt2;
892  flag_caller_saves = opt2;
893  flag_peephole2 = opt2;
894#ifdef INSN_SCHEDULING
895  /* Only run the pre-regalloc scheduling pass if optimizing for speed.  */
896  flag_schedule_insns = opt2 && ! optimize_size;
897  flag_schedule_insns_after_reload = opt2;
898#endif
899  flag_regmove = opt2;
900  flag_strict_aliasing = opt2;
901  flag_strict_overflow = opt2;
902  flag_reorder_blocks = opt2;
903  flag_reorder_functions = opt2;
904  flag_tree_vrp = opt2;
905  flag_tree_builtin_call_dce = opt2;
906  flag_tree_pre = opt2;
907  flag_tree_switch_conversion = opt2;
908  flag_ipa_cp = opt2;
909  flag_ipa_sra = opt2;
910
911  /* Track fields in field-sensitive alias analysis.  */
912  set_param_value ("max-fields-for-field-sensitive",
913		   (opt2) ? 100 : initial_max_fields_for_field_sensitive);
914
915  /* For -O1 only do loop invariant motion for very small loops.  */
916  set_param_value ("loop-invariant-max-bbs-in-loop",
917		   (opt2) ? initial_loop_invariant_max_bbs_in_loop : 1000);
918
919  /* -O3 optimizations.  */
920  opt3 = (optimize >= 3);
921  flag_predictive_commoning = opt3;
922  flag_inline_functions = opt3;
923  flag_unswitch_loops = opt3;
924  flag_gcse_after_reload = opt3;
925  flag_tree_vectorize = opt3;
926  flag_ipa_cp_clone = opt3;
927  if (flag_ipa_cp_clone)
928    flag_ipa_cp = 1;
929
930  /* Just -O1/-O0 optimizations.  */
931  opt1_max = (optimize <= 1);
932  align_loops = opt1_max;
933  align_jumps = opt1_max;
934  align_labels = opt1_max;
935  align_functions = opt1_max;
936
937  if (optimize_size)
938    {
939      /* Inlining of functions reducing size is a good idea regardless of them
940	 being declared inline.  */
941      flag_inline_functions = 1;
942
943      /* Basic optimization options.  */
944      optimize_size = 1;
945      if (optimize > 2)
946	optimize = 2;
947
948      /* We want to crossjump as much as possible.  */
949      set_param_value ("min-crossjump-insns", 1);
950    }
951  else
952    set_param_value ("min-crossjump-insns", initial_min_crossjump_insns);
953
954  if (first_time_p)
955    {
956      /* Initialize whether `char' is signed.  */
957      flag_signed_char = DEFAULT_SIGNED_CHAR;
958      /* Set this to a special "uninitialized" value.  The actual default is
959	 set after target options have been processed.  */
960      flag_short_enums = 2;
961
962      /* Initialize target_flags before OPTIMIZATION_OPTIONS so the latter can
963	 modify it.  */
964      target_flags = targetm.default_target_flags;
965
966      /* Some targets have ABI-specified unwind tables.  */
967      flag_unwind_tables = targetm.unwind_tables_default;
968    }
969
970#ifdef ENABLE_LTO
971  /* Clear any options currently held for LTO.  */
972  lto_clear_user_options ();
973#endif
974
975#ifdef OPTIMIZATION_OPTIONS
976  /* Allow default optimizations to be specified on a per-machine basis.  */
977  OPTIMIZATION_OPTIONS (optimize, optimize_size);
978#endif
979
980  handle_options (argc, argv, lang_mask);
981
982  if (dump_base_name && ! IS_ABSOLUTE_PATH (dump_base_name))
983    {
984      /* First try to make DUMP_BASE_NAME relative to the DUMP_DIR_NAME
985	 directory.  Then try to make DUMP_BASE_NAME relative to the
986	 AUX_BASE_NAME directory, typically the directory to contain
987	 the object file.  */
988      if (dump_dir_name)
989	dump_base_name = concat (dump_dir_name, dump_base_name, NULL);
990      else if (aux_base_name)
991	{
992	  const char *aux_base;
993
994	  base_of_path (aux_base_name, &aux_base);
995	  if (aux_base_name != aux_base)
996	    {
997	      int dir_len = aux_base - aux_base_name;
998	      char *new_dump_base_name =
999		XNEWVEC (char, strlen(dump_base_name) + dir_len + 1);
1000
1001	      /* Copy directory component from AUX_BASE_NAME.  */
1002	      memcpy (new_dump_base_name, aux_base_name, dir_len);
1003	      /* Append existing DUMP_BASE_NAME.  */
1004	      strcpy (new_dump_base_name + dir_len, dump_base_name);
1005	      dump_base_name = new_dump_base_name;
1006	    }
1007	}
1008    }
1009
1010  /* Handle related options for unit-at-a-time, toplevel-reorder, and
1011     section-anchors.  */
1012  if (!flag_unit_at_a_time)
1013    {
1014      if (flag_section_anchors == 1)
1015	error ("Section anchors must be disabled when unit-at-a-time "
1016	       "is disabled.");
1017      flag_section_anchors = 0;
1018      if (flag_toplevel_reorder == 1)
1019	error ("Toplevel reorder must be disabled when unit-at-a-time "
1020	       "is disabled.");
1021      flag_toplevel_reorder = 0;
1022    }
1023  /* Unless the user has asked for section anchors, we disable toplevel
1024     reordering at -O0 to disable transformations that might be surprising
1025     to end users and to get -fno-toplevel-reorder tested.  */
1026  if (!optimize && flag_toplevel_reorder == 2 && flag_section_anchors != 1)
1027    {
1028      flag_toplevel_reorder = 0;
1029      flag_section_anchors = 0;
1030    }
1031  if (!flag_toplevel_reorder)
1032    {
1033      if (flag_section_anchors == 1)
1034	error ("section anchors must be disabled when toplevel reorder"
1035	       " is disabled");
1036      flag_section_anchors = 0;
1037    }
1038
1039  if (first_time_p)
1040    {
1041      if (flag_pie)
1042	flag_pic = flag_pie;
1043      if (flag_pic && !flag_pie)
1044	flag_shlib = 1;
1045      first_time_p = false;
1046    }
1047
1048  if (optimize == 0)
1049    {
1050      /* Inlining does not work if not optimizing,
1051	 so force it not to be done.  */
1052      warn_inline = 0;
1053      flag_no_inline = 1;
1054    }
1055
1056  /* The optimization to partition hot and cold basic blocks into separate
1057     sections of the .o and executable files does not work (currently)
1058     with exception handling.  This is because there is no support for
1059     generating unwind info.  If flag_exceptions is turned on we need to
1060     turn off the partitioning optimization.  */
1061
1062  if (flag_exceptions && flag_reorder_blocks_and_partition
1063      && (USING_SJLJ_EXCEPTIONS
1064#ifdef TARGET_UNWIND_INFO
1065	  || 1
1066#endif
1067	 ))
1068    {
1069      inform (input_location,
1070	      "-freorder-blocks-and-partition does not work with exceptions on this architecture");
1071      flag_reorder_blocks_and_partition = 0;
1072      flag_reorder_blocks = 1;
1073    }
1074
1075  /* If user requested unwind info, then turn off the partitioning
1076     optimization.  */
1077
1078  if (flag_unwind_tables && ! targetm.unwind_tables_default
1079      && flag_reorder_blocks_and_partition
1080      && (USING_SJLJ_EXCEPTIONS
1081#ifdef TARGET_UNWIND_INFO
1082	  || 1
1083#endif
1084	 ))
1085    {
1086      inform (input_location,
1087	      "-freorder-blocks-and-partition does not support unwind info on this architecture");
1088      flag_reorder_blocks_and_partition = 0;
1089      flag_reorder_blocks = 1;
1090    }
1091
1092  /* If the target requested unwind info, then turn off the partitioning
1093     optimization with a different message.  Likewise, if the target does not
1094     support named sections.  */
1095
1096  if (flag_reorder_blocks_and_partition
1097      && (!targetm.have_named_sections
1098	  || (flag_unwind_tables && targetm.unwind_tables_default
1099	      && (USING_SJLJ_EXCEPTIONS
1100#ifdef TARGET_UNWIND_INFO
1101		  || 1
1102#endif
1103		 ))))
1104    {
1105      inform (input_location,
1106	      "-freorder-blocks-and-partition does not work on this architecture");
1107      flag_reorder_blocks_and_partition = 0;
1108      flag_reorder_blocks = 1;
1109    }
1110
1111  /* Pipelining of outer loops is only possible when general pipelining
1112     capabilities are requested.  */
1113  if (!flag_sel_sched_pipelining)
1114    flag_sel_sched_pipelining_outer_loops = 0;
1115
1116  if (!targetm.ira_cover_classes
1117      && flag_ira_algorithm == IRA_ALGORITHM_CB)
1118    {
1119      inform (input_location,
1120	      "-fira-algorithm=CB does not work on this architecture");
1121      flag_ira_algorithm = IRA_ALGORITHM_PRIORITY;
1122    }
1123
1124  if (flag_conserve_stack)
1125    {
1126      if (!PARAM_SET_P (PARAM_LARGE_STACK_FRAME))
1127        PARAM_VALUE (PARAM_LARGE_STACK_FRAME) = 100;
1128      if (!PARAM_SET_P (PARAM_STACK_FRAME_GROWTH))
1129        PARAM_VALUE (PARAM_STACK_FRAME_GROWTH) = 40;
1130    }
1131
1132  if (flag_lto || flag_whopr)
1133    {
1134#ifdef ENABLE_LTO
1135      flag_generate_lto = 1;
1136
1137      /* When generating IL, do not operate in whole-program mode.
1138	 Otherwise, symbols will be privatized too early, causing link
1139	 errors later.  */
1140      flag_whole_program = 0;
1141#else
1142      error ("LTO support has not been enabled in this configuration");
1143#endif
1144    }
1145
1146  /* Reconcile -flto and -fwhopr.  Set additional flags as appropriate and
1147     check option consistency.  */
1148  if (flag_lto && flag_whopr)
1149    error ("-flto and -fwhopr are mutually exclusive");
1150}
1151
1152#define LEFT_COLUMN	27
1153
1154/* Output ITEM, of length ITEM_WIDTH, in the left column,
1155   followed by word-wrapped HELP in a second column.  */
1156static void
1157wrap_help (const char *help,
1158	   const char *item,
1159	   unsigned int item_width,
1160	   unsigned int columns)
1161{
1162  unsigned int col_width = LEFT_COLUMN;
1163  unsigned int remaining, room, len;
1164
1165  remaining = strlen (help);
1166
1167  do
1168    {
1169      room = columns - 3 - MAX (col_width, item_width);
1170      if (room > columns)
1171	room = 0;
1172      len = remaining;
1173
1174      if (room < len)
1175	{
1176	  unsigned int i;
1177
1178	  for (i = 0; help[i]; i++)
1179	    {
1180	      if (i >= room && len != remaining)
1181		break;
1182	      if (help[i] == ' ')
1183		len = i;
1184	      else if ((help[i] == '-' || help[i] == '/')
1185		       && help[i + 1] != ' '
1186		       && i > 0 && ISALPHA (help[i - 1]))
1187		len = i + 1;
1188	    }
1189	}
1190
1191      printf( "  %-*.*s %.*s\n", col_width, item_width, item, len, help);
1192      item_width = 0;
1193      while (help[len] == ' ')
1194	len++;
1195      help += len;
1196      remaining -= len;
1197    }
1198  while (remaining);
1199}
1200
1201/* Print help for a specific front-end, etc.  */
1202static void
1203print_filtered_help (unsigned int include_flags,
1204		     unsigned int exclude_flags,
1205		     unsigned int any_flags,
1206		     unsigned int columns)
1207{
1208  unsigned int i;
1209  const char *help;
1210  static char *printed = NULL;
1211  bool found = false;
1212  bool displayed = false;
1213
1214  if (include_flags == CL_PARAMS)
1215    {
1216      for (i = 0; i < LAST_PARAM; i++)
1217	{
1218	  const char *param = compiler_params[i].option;
1219
1220	  help = compiler_params[i].help;
1221	  if (help == NULL || *help == '\0')
1222	    {
1223	      if (exclude_flags & CL_UNDOCUMENTED)
1224		continue;
1225	      help = undocumented_msg;
1226	    }
1227
1228	  /* Get the translation.  */
1229	  help = _(help);
1230
1231	  wrap_help (help, param, strlen (param), columns);
1232	}
1233      putchar ('\n');
1234      return;
1235    }
1236
1237  if (!printed)
1238    printed = XCNEWVAR (char, cl_options_count);
1239
1240  for (i = 0; i < cl_options_count; i++)
1241    {
1242      static char new_help[128];
1243      const struct cl_option *option = cl_options + i;
1244      unsigned int len;
1245      const char *opt;
1246      const char *tab;
1247
1248      if (include_flags == 0
1249	  || ((option->flags & include_flags) != include_flags))
1250	{
1251	  if ((option->flags & any_flags) == 0)
1252	    continue;
1253	}
1254
1255      /* Skip unwanted switches.  */
1256      if ((option->flags & exclude_flags) != 0)
1257	continue;
1258
1259      found = true;
1260      /* Skip switches that have already been printed.  */
1261      if (printed[i])
1262	continue;
1263
1264      printed[i] = true;
1265
1266      help = option->help;
1267      if (help == NULL)
1268	{
1269	  if (exclude_flags & CL_UNDOCUMENTED)
1270	    continue;
1271	  help = undocumented_msg;
1272	}
1273
1274      /* Get the translation.  */
1275      help = _(help);
1276
1277      /* Find the gap between the name of the
1278	 option and its descriptive text.  */
1279      tab = strchr (help, '\t');
1280      if (tab)
1281	{
1282	  len = tab - help;
1283	  opt = help;
1284	  help = tab + 1;
1285	}
1286      else
1287	{
1288	  opt = option->opt_text;
1289	  len = strlen (opt);
1290	}
1291
1292      /* With the -Q option enabled we change the descriptive text associated
1293	 with an option to be an indication of its current setting.  */
1294      if (!quiet_flag)
1295	{
1296	  if (len < (LEFT_COLUMN + 2))
1297	    strcpy (new_help, "\t\t");
1298	  else
1299	    strcpy (new_help, "\t");
1300
1301	  if (option->flag_var != NULL)
1302	    {
1303	      if (option->flags & CL_JOINED)
1304		{
1305		  if (option->var_type == CLVC_STRING)
1306		    {
1307		      if (* (const char **) option->flag_var != NULL)
1308			snprintf (new_help + strlen (new_help),
1309				  sizeof (new_help) - strlen (new_help),
1310				  * (const char **) option->flag_var);
1311		    }
1312		  else
1313		    sprintf (new_help + strlen (new_help),
1314			     "%#x", * (int *) option->flag_var);
1315		}
1316	      else
1317		strcat (new_help, option_enabled (i)
1318			? _("[enabled]") : _("[disabled]"));
1319	    }
1320
1321	  help = new_help;
1322	}
1323
1324      wrap_help (help, opt, len, columns);
1325      displayed = true;
1326    }
1327
1328  if (! found)
1329    {
1330      unsigned int langs = include_flags & CL_LANG_ALL;
1331
1332      if (langs == 0)
1333	printf (_(" No options with the desired characteristics were found\n"));
1334      else
1335	{
1336	  unsigned int i;
1337
1338	  /* PR 31349: Tell the user how to see all of the
1339	     options supported by a specific front end.  */
1340	  for (i = 0; (1U << i) < CL_LANG_ALL; i ++)
1341	    if ((1U << i) & langs)
1342	      printf (_(" None found.  Use --help=%s to show *all* the options supported by the %s front-end\n"),
1343		      lang_names[i], lang_names[i]);
1344	}
1345
1346    }
1347  else if (! displayed)
1348    printf (_(" All options with the desired characteristics have already been displayed\n"));
1349
1350  putchar ('\n');
1351}
1352
1353/* Display help for a specified type of option.
1354   The options must have ALL of the INCLUDE_FLAGS set
1355   ANY of the flags in the ANY_FLAGS set
1356   and NONE of the EXCLUDE_FLAGS set.  */
1357static void
1358print_specific_help (unsigned int include_flags,
1359		     unsigned int exclude_flags,
1360		     unsigned int any_flags)
1361{
1362  unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
1363  const char * description = NULL;
1364  const char * descrip_extra = "";
1365  size_t i;
1366  unsigned int flag;
1367  static unsigned int columns = 0;
1368
1369  /* Sanity check: Make sure that we do not have more
1370     languages than we have bits available to enumerate them.  */
1371  gcc_assert ((1U << cl_lang_count) < CL_MIN_OPTION_CLASS);
1372
1373  /* If we have not done so already, obtain
1374     the desired maximum width of the output.  */
1375  if (columns == 0)
1376    {
1377      const char *p;
1378
1379      GET_ENVIRONMENT (p, "COLUMNS");
1380      if (p != NULL)
1381	{
1382	  int value = atoi (p);
1383
1384	  if (value > 0)
1385	    columns = value;
1386	}
1387
1388      if (columns == 0)
1389	/* Use a reasonable default.  */
1390	columns = 80;
1391    }
1392
1393  /* Decide upon the title for the options that we are going to display.  */
1394  for (i = 0, flag = 1; flag <= CL_MAX_OPTION_CLASS; flag <<= 1, i ++)
1395    {
1396      switch (flag & include_flags)
1397	{
1398	case 0:
1399	  break;
1400
1401	case CL_TARGET:
1402	  description = _("The following options are target specific");
1403	  break;
1404	case CL_WARNING:
1405	  description = _("The following options control compiler warning messages");
1406	  break;
1407	case CL_OPTIMIZATION:
1408	  description = _("The following options control optimizations");
1409	  break;
1410	case CL_COMMON:
1411	  description = _("The following options are language-independent");
1412	  break;
1413	case CL_PARAMS:
1414	  description = _("The --param option recognizes the following as parameters");
1415	  break;
1416	default:
1417	  if (i >= cl_lang_count)
1418	    break;
1419	  if (exclude_flags & all_langs_mask)
1420	    description = _("The following options are specific to just the language ");
1421	  else
1422	    description = _("The following options are supported by the language ");
1423	  descrip_extra = lang_names [i];
1424	  break;
1425	}
1426    }
1427
1428  if (description == NULL)
1429    {
1430      if (any_flags == 0)
1431	{
1432	  if (include_flags & CL_UNDOCUMENTED)
1433	    description = _("The following options are not documented");
1434	  else if (include_flags & CL_SEPARATE)
1435	    description = _("The following options take separate arguments");
1436	  else if (include_flags & CL_JOINED)
1437	    description = _("The following options take joined arguments");
1438	  else
1439	    {
1440	      internal_error ("unrecognized include_flags 0x%x passed to print_specific_help",
1441			      include_flags);
1442	      return;
1443	    }
1444	}
1445      else
1446	{
1447	  if (any_flags & all_langs_mask)
1448	    description = _("The following options are language-related");
1449	  else
1450	    description = _("The following options are language-independent");
1451	}
1452    }
1453
1454  printf ("%s%s:\n", description, descrip_extra);
1455  print_filtered_help (include_flags, exclude_flags, any_flags, columns);
1456}
1457
1458/* Handle target- and language-independent options.  Return zero to
1459   generate an "unknown option" message.  Only options that need
1460   extra handling need to be listed here; if you simply want
1461   VALUE assigned to a variable, it happens automatically.  */
1462
1463static int
1464common_handle_option (size_t scode, const char *arg, int value,
1465		      unsigned int lang_mask)
1466{
1467  static bool verbose = false;
1468  enum opt_code code = (enum opt_code) scode;
1469
1470  switch (code)
1471    {
1472    case OPT__param:
1473      handle_param (arg);
1474      break;
1475
1476    case OPT_v:
1477      verbose = true;
1478      break;
1479
1480    case OPT_fhelp:
1481    case OPT__help:
1482      {
1483	unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
1484	unsigned int undoc_mask;
1485	unsigned int i;
1486
1487	undoc_mask = (verbose | extra_warnings) ? 0 : CL_UNDOCUMENTED;
1488	/* First display any single language specific options.  */
1489	for (i = 0; i < cl_lang_count; i++)
1490	  print_specific_help
1491	    (1U << i, (all_langs_mask & (~ (1U << i))) | undoc_mask, 0);
1492	/* Next display any multi language specific options.  */
1493	print_specific_help (0, undoc_mask, all_langs_mask);
1494	/* Then display any remaining, non-language options.  */
1495	for (i = CL_MIN_OPTION_CLASS; i <= CL_MAX_OPTION_CLASS; i <<= 1)
1496	  print_specific_help (i, undoc_mask, 0);
1497	exit_after_options = true;
1498	break;
1499      }
1500
1501    case OPT_ftarget_help:
1502    case OPT__target_help:
1503      print_specific_help (CL_TARGET, CL_UNDOCUMENTED, 0);
1504      exit_after_options = true;
1505
1506      /* Allow the target a chance to give the user some additional information.  */
1507      if (targetm.target_help)
1508	targetm.target_help ();
1509      break;
1510
1511    case OPT_fhelp_:
1512    case OPT__help_:
1513      {
1514	const char * a = arg;
1515	unsigned int include_flags = 0;
1516	/* Note - by default we include undocumented options when listing
1517	   specific classes.  If you only want to see documented options
1518	   then add ",^undocumented" to the --help= option.  E.g.:
1519
1520	   --help=target,^undocumented  */
1521	unsigned int exclude_flags = 0;
1522
1523	/* Walk along the argument string, parsing each word in turn.
1524	   The format is:
1525	   arg = [^]{word}[,{arg}]
1526	   word = {optimizers|target|warnings|undocumented|
1527		   params|common|<language>}  */
1528	while (* a != 0)
1529	  {
1530	    static struct
1531	    {
1532	      const char * string;
1533	      unsigned int flag;
1534	    }
1535	    specifics[] =
1536	    {
1537	      { "optimizers", CL_OPTIMIZATION },
1538	      { "target", CL_TARGET },
1539	      { "warnings", CL_WARNING },
1540	      { "undocumented", CL_UNDOCUMENTED },
1541	      { "params", CL_PARAMS },
1542	      { "joined", CL_JOINED },
1543	      { "separate", CL_SEPARATE },
1544	      { "common", CL_COMMON },
1545	      { NULL, 0 }
1546	    };
1547	    unsigned int * pflags;
1548	    const char * comma;
1549	    unsigned int lang_flag, specific_flag;
1550	    unsigned int len;
1551	    unsigned int i;
1552
1553	    if (* a == '^')
1554	      {
1555		++ a;
1556		pflags = & exclude_flags;
1557	      }
1558	    else
1559	      pflags = & include_flags;
1560
1561	    comma = strchr (a, ',');
1562	    if (comma == NULL)
1563	      len = strlen (a);
1564	    else
1565	      len = comma - a;
1566	    if (len == 0)
1567	      {
1568		a = comma + 1;
1569		continue;
1570	      }
1571
1572	    /* Check to see if the string matches an option class name.  */
1573	    for (i = 0, specific_flag = 0; specifics[i].string != NULL; i++)
1574	      if (strncasecmp (a, specifics[i].string, len) == 0)
1575		{
1576		  specific_flag = specifics[i].flag;
1577		  break;
1578		}
1579
1580	    /* Check to see if the string matches a language name.
1581	       Note - we rely upon the alpha-sorted nature of the entries in
1582	       the lang_names array, specifically that shorter names appear
1583	       before their longer variants.  (i.e. C before C++).  That way
1584	       when we are attempting to match --help=c for example we will
1585	       match with C first and not C++.  */
1586	    for (i = 0, lang_flag = 0; i < cl_lang_count; i++)
1587	      if (strncasecmp (a, lang_names[i], len) == 0)
1588		{
1589		  lang_flag = 1U << i;
1590		  break;
1591		}
1592
1593	    if (specific_flag != 0)
1594	      {
1595		if (lang_flag == 0)
1596		  * pflags |= specific_flag;
1597		else
1598		  {
1599		    /* The option's argument matches both the start of a
1600		       language name and the start of an option class name.
1601		       We have a special case for when the user has
1602		       specified "--help=c", but otherwise we have to issue
1603		       a warning.  */
1604		    if (strncasecmp (a, "c", len) == 0)
1605		      * pflags |= lang_flag;
1606		    else
1607		      fnotice (stderr,
1608			       "warning: --help argument %.*s is ambiguous, please be more specific\n",
1609			       len, a);
1610		  }
1611	      }
1612	    else if (lang_flag != 0)
1613	      * pflags |= lang_flag;
1614	    else
1615	      fnotice (stderr,
1616		       "warning: unrecognized argument to --help= option: %.*s\n",
1617		       len, a);
1618
1619	    if (comma == NULL)
1620	      break;
1621	    a = comma + 1;
1622	  }
1623
1624	if (include_flags)
1625	  print_specific_help (include_flags, exclude_flags, 0);
1626	exit_after_options = true;
1627	break;
1628      }
1629
1630    case OPT_fversion:
1631    case OPT__version:
1632      exit_after_options = true;
1633      break;
1634
1635    case OPT_G:
1636      g_switch_value = value;
1637      g_switch_set = true;
1638      break;
1639
1640    case OPT_O:
1641    case OPT_Os:
1642      /* Currently handled in a prescan.  */
1643      break;
1644
1645    case OPT_Werror_:
1646      enable_warning_as_error (arg, value, lang_mask);
1647      break;
1648
1649    case OPT_Wlarger_than_:
1650      /* This form corresponds to -Wlarger-than-.
1651	 Kept for backward compatibility.
1652	 Don't use it as the first argument of warning().  */
1653
1654    case OPT_Wlarger_than_eq:
1655      larger_than_size = value;
1656      warn_larger_than = value != -1;
1657      break;
1658
1659    case OPT_Wframe_larger_than_:
1660      frame_larger_than_size = value;
1661      warn_frame_larger_than = value != -1;
1662      break;
1663
1664    case OPT_Wstrict_aliasing:
1665      set_Wstrict_aliasing (value);
1666      break;
1667
1668    case OPT_Wstrict_aliasing_:
1669      warn_strict_aliasing = value;
1670      break;
1671
1672    case OPT_Wstrict_overflow:
1673      warn_strict_overflow = (value
1674			      ? (int) WARN_STRICT_OVERFLOW_CONDITIONAL
1675			      : 0);
1676      break;
1677
1678    case OPT_Wstrict_overflow_:
1679      warn_strict_overflow = value;
1680      break;
1681
1682    case OPT_Wunused:
1683      warn_unused = value;
1684      break;
1685
1686    case OPT_aux_info:
1687    case OPT_aux_info_:
1688      aux_info_file_name = arg;
1689      flag_gen_aux_info = 1;
1690      break;
1691
1692    case OPT_auxbase:
1693      aux_base_name = arg;
1694      break;
1695
1696    case OPT_auxbase_strip:
1697      {
1698	char *tmp = xstrdup (arg);
1699	strip_off_ending (tmp, strlen (tmp));
1700	if (tmp[0])
1701	  aux_base_name = tmp;
1702      }
1703      break;
1704
1705    case OPT_d:
1706      decode_d_option (arg);
1707      break;
1708
1709    case OPT_dumpbase:
1710      dump_base_name = arg;
1711      break;
1712
1713    case OPT_dumpdir:
1714      dump_dir_name = arg;
1715      break;
1716
1717    case OPT_falign_functions_:
1718      align_functions = value;
1719      break;
1720
1721    case OPT_falign_jumps_:
1722      align_jumps = value;
1723      break;
1724
1725    case OPT_falign_labels_:
1726      align_labels = value;
1727      break;
1728
1729    case OPT_falign_loops_:
1730      align_loops = value;
1731      break;
1732
1733    case OPT_fbranch_probabilities:
1734      flag_branch_probabilities_set = true;
1735      break;
1736
1737    case OPT_fcall_used_:
1738      fix_register (arg, 0, 1);
1739      break;
1740
1741    case OPT_fcall_saved_:
1742      fix_register (arg, 0, 0);
1743      break;
1744
1745    case OPT_fdbg_cnt_:
1746      dbg_cnt_process_opt (arg);
1747      break;
1748
1749    case OPT_fdbg_cnt_list:
1750      dbg_cnt_list_all_counters ();
1751      break;
1752
1753    case OPT_fdebug_prefix_map_:
1754      add_debug_prefix_map (arg);
1755      break;
1756
1757    case OPT_fdiagnostics_show_location_:
1758      if (!strcmp (arg, "once"))
1759	diagnostic_prefixing_rule (global_dc) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
1760      else if (!strcmp (arg, "every-line"))
1761	diagnostic_prefixing_rule (global_dc)
1762	  = DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE;
1763      else
1764	return 0;
1765      break;
1766
1767    case OPT_fdiagnostics_show_option:
1768      global_dc->show_option_requested = true;
1769      break;
1770
1771    case OPT_fdump_:
1772      if (!dump_switch_p (arg))
1773	return 0;
1774      break;
1775
1776    case OPT_fexcess_precision_:
1777      if (!strcmp (arg, "fast"))
1778	flag_excess_precision_cmdline = EXCESS_PRECISION_FAST;
1779      else if (!strcmp (arg, "standard"))
1780	flag_excess_precision_cmdline = EXCESS_PRECISION_STANDARD;
1781      else
1782	error ("unknown excess precision style \"%s\"", arg);
1783      break;
1784
1785    case OPT_ffast_math:
1786      set_fast_math_flags (value);
1787      break;
1788
1789    case OPT_funsafe_math_optimizations:
1790      set_unsafe_math_optimizations_flags (value);
1791      break;
1792
1793    case OPT_ffixed_:
1794      fix_register (arg, 1, 1);
1795      break;
1796
1797    case OPT_finline_limit_:
1798    case OPT_finline_limit_eq:
1799      set_param_value ("max-inline-insns-single", value / 2);
1800      set_param_value ("max-inline-insns-auto", value / 2);
1801      break;
1802
1803    case OPT_finstrument_functions_exclude_function_list_:
1804      add_comma_separated_to_vector
1805	(&flag_instrument_functions_exclude_functions, arg);
1806      break;
1807
1808    case OPT_finstrument_functions_exclude_file_list_:
1809      add_comma_separated_to_vector
1810	(&flag_instrument_functions_exclude_files, arg);
1811      break;
1812
1813    case OPT_fmessage_length_:
1814      pp_set_line_maximum_length (global_dc->printer, value);
1815      break;
1816
1817    case OPT_fpack_struct_:
1818      if (value <= 0 || (value & (value - 1)) || value > 16)
1819	error ("structure alignment must be a small power of two, not %d", value);
1820      else
1821	{
1822	  initial_max_fld_align = value;
1823	  maximum_field_alignment = value * BITS_PER_UNIT;
1824	}
1825      break;
1826
1827    case OPT_fpeel_loops:
1828      flag_peel_loops_set = true;
1829      break;
1830
1831    case OPT_fplugin_:
1832#ifdef ENABLE_PLUGIN
1833      add_new_plugin (arg);
1834#else
1835      error ("Plugin support is disabled.  Configure with --enable-plugin.");
1836#endif
1837      break;
1838
1839    case OPT_fplugin_arg_:
1840#ifdef ENABLE_PLUGIN
1841      parse_plugin_arg_opt (arg);
1842#else
1843      error ("Plugin support is disabled.  Configure with --enable-plugin.");
1844#endif
1845      break;
1846
1847    case OPT_fprofile_arcs:
1848      profile_arc_flag_set = true;
1849      break;
1850
1851    case OPT_finline_functions:
1852      flag_inline_functions_set = true;
1853      break;
1854
1855    case OPT_fprofile_dir_:
1856      profile_data_prefix = xstrdup (arg);
1857      break;
1858
1859    case OPT_fprofile_use_:
1860      profile_data_prefix = xstrdup (arg);
1861      flag_profile_use = true;
1862      value = true;
1863      /* No break here - do -fprofile-use processing. */
1864    case OPT_fprofile_use:
1865      if (!flag_branch_probabilities_set)
1866        flag_branch_probabilities = value;
1867      if (!flag_profile_values_set)
1868        flag_profile_values = value;
1869      if (!flag_unroll_loops_set)
1870        flag_unroll_loops = value;
1871      if (!flag_peel_loops_set)
1872        flag_peel_loops = value;
1873      if (!flag_tracer_set)
1874        flag_tracer = value;
1875      if (!flag_value_profile_transformations_set)
1876        flag_value_profile_transformations = value;
1877      if (!flag_inline_functions_set)
1878        flag_inline_functions = value;
1879      if (!flag_ipa_cp_set)
1880        flag_ipa_cp = value;
1881      if (!flag_ipa_cp_clone_set
1882	  && value && flag_ipa_cp)
1883	flag_ipa_cp_clone = value;
1884      if (!flag_predictive_commoning_set)
1885	flag_predictive_commoning = value;
1886      if (!flag_unswitch_loops_set)
1887	flag_unswitch_loops = value;
1888      if (!flag_gcse_after_reload_set)
1889	flag_gcse_after_reload = value;
1890      break;
1891
1892    case OPT_fprofile_generate_:
1893      profile_data_prefix = xstrdup (arg);
1894      value = true;
1895      /* No break here - do -fprofile-generate processing. */
1896    case OPT_fprofile_generate:
1897      if (!profile_arc_flag_set)
1898        profile_arc_flag = value;
1899      if (!flag_profile_values_set)
1900        flag_profile_values = value;
1901      if (!flag_value_profile_transformations_set)
1902        flag_value_profile_transformations = value;
1903      if (!flag_inline_functions_set)
1904        flag_inline_functions = value;
1905      break;
1906
1907    case OPT_fprofile_values:
1908      flag_profile_values_set = true;
1909      break;
1910
1911    case OPT_fvisibility_:
1912      {
1913        if (!strcmp(arg, "default"))
1914          default_visibility = VISIBILITY_DEFAULT;
1915        else if (!strcmp(arg, "internal"))
1916          default_visibility = VISIBILITY_INTERNAL;
1917        else if (!strcmp(arg, "hidden"))
1918          default_visibility = VISIBILITY_HIDDEN;
1919        else if (!strcmp(arg, "protected"))
1920          default_visibility = VISIBILITY_PROTECTED;
1921        else
1922          error ("unrecognized visibility value \"%s\"", arg);
1923      }
1924      break;
1925
1926    case OPT_fvpt:
1927      flag_value_profile_transformations_set = true;
1928      break;
1929
1930    case OPT_frandom_seed:
1931      /* The real switch is -fno-random-seed.  */
1932      if (value)
1933	return 0;
1934      set_random_seed (NULL);
1935      break;
1936
1937    case OPT_frandom_seed_:
1938      set_random_seed (arg);
1939      break;
1940
1941    case OPT_fselective_scheduling:
1942    case OPT_fselective_scheduling2:
1943      sel_sched_switch_set = true;
1944      break;
1945
1946    case OPT_fsched_verbose_:
1947#ifdef INSN_SCHEDULING
1948      fix_sched_param ("verbose", arg);
1949      break;
1950#else
1951      return 0;
1952#endif
1953
1954    case OPT_fsched_stalled_insns_:
1955      flag_sched_stalled_insns = value;
1956      if (flag_sched_stalled_insns == 0)
1957	flag_sched_stalled_insns = -1;
1958      break;
1959
1960    case OPT_fsched_stalled_insns_dep_:
1961      flag_sched_stalled_insns_dep = value;
1962      break;
1963
1964    case OPT_fstack_check_:
1965      if (!strcmp (arg, "no"))
1966	flag_stack_check = NO_STACK_CHECK;
1967      else if (!strcmp (arg, "generic"))
1968	/* This is the old stack checking method.  */
1969	flag_stack_check = STACK_CHECK_BUILTIN
1970			   ? FULL_BUILTIN_STACK_CHECK
1971			   : GENERIC_STACK_CHECK;
1972      else if (!strcmp (arg, "specific"))
1973	/* This is the new stack checking method.  */
1974	flag_stack_check = STACK_CHECK_BUILTIN
1975			   ? FULL_BUILTIN_STACK_CHECK
1976			   : STACK_CHECK_STATIC_BUILTIN
1977			     ? STATIC_BUILTIN_STACK_CHECK
1978			     : GENERIC_STACK_CHECK;
1979      else
1980	warning (0, "unknown stack check parameter \"%s\"", arg);
1981      break;
1982
1983    case OPT_fstack_check:
1984      /* This is the same as the "specific" mode above.  */
1985      if (value)
1986	flag_stack_check = STACK_CHECK_BUILTIN
1987			   ? FULL_BUILTIN_STACK_CHECK
1988			   : STACK_CHECK_STATIC_BUILTIN
1989			     ? STATIC_BUILTIN_STACK_CHECK
1990			     : GENERIC_STACK_CHECK;
1991      else
1992	flag_stack_check = NO_STACK_CHECK;
1993      break;
1994
1995    case OPT_fstack_limit:
1996      /* The real switch is -fno-stack-limit.  */
1997      if (value)
1998	return 0;
1999      stack_limit_rtx = NULL_RTX;
2000      break;
2001
2002    case OPT_fstack_limit_register_:
2003      {
2004	int reg = decode_reg_name (arg);
2005	if (reg < 0)
2006	  error ("unrecognized register name \"%s\"", arg);
2007	else
2008	  stack_limit_rtx = gen_rtx_REG (Pmode, reg);
2009      }
2010      break;
2011
2012    case OPT_fstack_limit_symbol_:
2013      stack_limit_rtx = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (arg));
2014      break;
2015
2016    case OPT_ftree_vectorizer_verbose_:
2017      vect_set_verbosity_level (arg);
2018      break;
2019
2020    case OPT_ftls_model_:
2021      if (!strcmp (arg, "global-dynamic"))
2022	flag_tls_default = TLS_MODEL_GLOBAL_DYNAMIC;
2023      else if (!strcmp (arg, "local-dynamic"))
2024	flag_tls_default = TLS_MODEL_LOCAL_DYNAMIC;
2025      else if (!strcmp (arg, "initial-exec"))
2026	flag_tls_default = TLS_MODEL_INITIAL_EXEC;
2027      else if (!strcmp (arg, "local-exec"))
2028	flag_tls_default = TLS_MODEL_LOCAL_EXEC;
2029      else
2030	warning (0, "unknown tls-model \"%s\"", arg);
2031      break;
2032
2033    case OPT_fira_algorithm_:
2034      if (!strcmp (arg, "CB"))
2035	flag_ira_algorithm = IRA_ALGORITHM_CB;
2036      else if (!strcmp (arg, "priority"))
2037	flag_ira_algorithm = IRA_ALGORITHM_PRIORITY;
2038      else
2039	warning (0, "unknown ira algorithm \"%s\"", arg);
2040      break;
2041
2042    case OPT_fira_region_:
2043      if (!strcmp (arg, "one"))
2044	flag_ira_region = IRA_REGION_ONE;
2045      else if (!strcmp (arg, "all"))
2046	flag_ira_region = IRA_REGION_ALL;
2047      else if (!strcmp (arg, "mixed"))
2048	flag_ira_region = IRA_REGION_MIXED;
2049      else
2050	warning (0, "unknown ira region \"%s\"", arg);
2051      break;
2052
2053    case OPT_fira_verbose_:
2054      flag_ira_verbose = value;
2055      break;
2056
2057    case OPT_ftracer:
2058      flag_tracer_set = true;
2059      break;
2060
2061    case OPT_fipa_cp:
2062      flag_ipa_cp_set = true;
2063      break;
2064
2065    case OPT_fipa_cp_clone:
2066      flag_ipa_cp_clone_set = true;
2067      break;
2068
2069    case OPT_fpredictive_commoning:
2070      flag_predictive_commoning_set = true;
2071      break;
2072
2073    case OPT_funswitch_loops:
2074      flag_unswitch_loops_set = true;
2075      break;
2076
2077    case OPT_fgcse_after_reload:
2078      flag_gcse_after_reload_set = true;
2079      break;
2080
2081    case OPT_funroll_loops:
2082      flag_unroll_loops_set = true;
2083      break;
2084
2085    case OPT_g:
2086      set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, arg);
2087      break;
2088
2089    case OPT_gcoff:
2090      set_debug_level (SDB_DEBUG, false, arg);
2091      break;
2092
2093    case OPT_gdwarf_:
2094      if (value < 2 || value > 4)
2095	error ("dwarf version %d is not supported", value);
2096      else
2097	dwarf_version = value;
2098      set_debug_level (DWARF2_DEBUG, false, "");
2099      break;
2100
2101    case OPT_ggdb:
2102      set_debug_level (NO_DEBUG, 2, arg);
2103      break;
2104
2105    case OPT_gstabs:
2106    case OPT_gstabs_:
2107      set_debug_level (DBX_DEBUG, code == OPT_gstabs_, arg);
2108      break;
2109
2110    case OPT_gvms:
2111      set_debug_level (VMS_DEBUG, false, arg);
2112      break;
2113
2114    case OPT_gxcoff:
2115    case OPT_gxcoff_:
2116      set_debug_level (XCOFF_DEBUG, code == OPT_gxcoff_, arg);
2117      break;
2118
2119    case OPT_o:
2120      asm_file_name = arg;
2121      break;
2122
2123    case OPT_pedantic_errors:
2124      flag_pedantic_errors = pedantic = 1;
2125      break;
2126
2127    case OPT_fsee:
2128    case OPT_fcse_skip_blocks:
2129    case OPT_floop_optimize:
2130    case OPT_frerun_loop_opt:
2131    case OPT_fsched2_use_traces:
2132    case OPT_fstrength_reduce:
2133    case OPT_ftree_store_copy_prop:
2134    case OPT_fforce_addr:
2135    case OPT_ftree_salias:
2136    case OPT_ftree_store_ccp:
2137    case OPT_Wunreachable_code:
2138      /* These are no-ops, preserved for backward compatibility.  */
2139      break;
2140
2141    case OPT_fuse_linker_plugin:
2142      /* No-op. Used by the driver and passed to us because it starts with f.*/
2143      break;
2144
2145    default:
2146      /* If the flag was handled in a standard way, assume the lack of
2147	 processing here is intentional.  */
2148      gcc_assert (cl_options[scode].flag_var);
2149      break;
2150    }
2151
2152  return 1;
2153}
2154
2155/* Handle --param NAME=VALUE.  */
2156static void
2157handle_param (const char *carg)
2158{
2159  char *equal, *arg;
2160  int value;
2161
2162  arg = xstrdup (carg);
2163  equal = strchr (arg, '=');
2164  if (!equal)
2165    error ("%s: --param arguments should be of the form NAME=VALUE", arg);
2166  else
2167    {
2168      value = integral_argument (equal + 1);
2169      if (value == -1)
2170	error ("invalid --param value %qs", equal + 1);
2171      else
2172	{
2173	  *equal = '\0';
2174	  set_param_value (arg, value);
2175	}
2176    }
2177
2178  free (arg);
2179}
2180
2181/* Used to set the level of strict aliasing warnings,
2182   when no level is specified (i.e., when -Wstrict-aliasing, and not
2183   -Wstrict-aliasing=level was given).
2184   ONOFF is assumed to take value 1 when -Wstrict-aliasing is specified,
2185   and 0 otherwise.  After calling this function, wstrict_aliasing will be
2186   set to the default value of -Wstrict_aliasing=level, currently 3.  */
2187void
2188set_Wstrict_aliasing (int onoff)
2189{
2190  gcc_assert (onoff == 0 || onoff == 1);
2191  if (onoff != 0)
2192    warn_strict_aliasing = 3;
2193  else
2194    warn_strict_aliasing = 0;
2195}
2196
2197/* The following routines are useful in setting all the flags that
2198   -ffast-math and -fno-fast-math imply.  */
2199void
2200set_fast_math_flags (int set)
2201{
2202  flag_unsafe_math_optimizations = set;
2203  set_unsafe_math_optimizations_flags (set);
2204  flag_finite_math_only = set;
2205  flag_errno_math = !set;
2206  if (set)
2207    {
2208      flag_signaling_nans = 0;
2209      flag_rounding_math = 0;
2210      flag_cx_limited_range = 1;
2211    }
2212}
2213
2214/* When -funsafe-math-optimizations is set the following
2215   flags are set as well.  */
2216void
2217set_unsafe_math_optimizations_flags (int set)
2218{
2219  flag_trapping_math = !set;
2220  flag_signed_zeros = !set;
2221  flag_associative_math = set;
2222  flag_reciprocal_math = set;
2223}
2224
2225/* Return true iff flags are set as if -ffast-math.  */
2226bool
2227fast_math_flags_set_p (void)
2228{
2229  return (!flag_trapping_math
2230	  && flag_unsafe_math_optimizations
2231	  && flag_finite_math_only
2232	  && !flag_signed_zeros
2233	  && !flag_errno_math);
2234}
2235
2236/* Return true iff flags are set as if -ffast-math but using the flags stored
2237   in the struct cl_optimization structure.  */
2238bool
2239fast_math_flags_struct_set_p (struct cl_optimization *opt)
2240{
2241  return (!opt->flag_trapping_math
2242	  && opt->flag_unsafe_math_optimizations
2243	  && opt->flag_finite_math_only
2244	  && !opt->flag_signed_zeros
2245	  && !opt->flag_errno_math);
2246}
2247
2248/* Handle a debug output -g switch.  EXTENDED is true or false to support
2249   extended output (2 is special and means "-ggdb" was given).  */
2250static void
2251set_debug_level (enum debug_info_type type, int extended, const char *arg)
2252{
2253  static bool type_explicit;
2254
2255  use_gnu_debug_info_extensions = extended;
2256
2257  if (type == NO_DEBUG)
2258    {
2259      if (write_symbols == NO_DEBUG)
2260	{
2261	  write_symbols = PREFERRED_DEBUGGING_TYPE;
2262
2263	  if (extended == 2)
2264	    {
2265#ifdef DWARF2_DEBUGGING_INFO
2266	      write_symbols = DWARF2_DEBUG;
2267#elif defined DBX_DEBUGGING_INFO
2268	      write_symbols = DBX_DEBUG;
2269#endif
2270	    }
2271
2272	  if (write_symbols == NO_DEBUG)
2273	    warning (0, "target system does not support debug output");
2274	}
2275    }
2276  else
2277    {
2278      /* Does it conflict with an already selected type?  */
2279      if (type_explicit && write_symbols != NO_DEBUG && type != write_symbols)
2280	error ("debug format \"%s\" conflicts with prior selection",
2281	       debug_type_names[type]);
2282      write_symbols = type;
2283      type_explicit = true;
2284    }
2285
2286  /* A debug flag without a level defaults to level 2.  */
2287  if (*arg == '\0')
2288    {
2289      if (!debug_info_level)
2290	debug_info_level = DINFO_LEVEL_NORMAL;
2291    }
2292  else
2293    {
2294      int argval = integral_argument (arg);
2295      if (argval == -1)
2296	error ("unrecognised debug output level \"%s\"", arg);
2297      else if (argval > 3)
2298	error ("debug output level %s is too high", arg);
2299      else
2300	debug_info_level = (enum debug_info_level) argval;
2301    }
2302}
2303
2304/* Return 1 if OPTION is enabled, 0 if it is disabled, or -1 if it isn't
2305   a simple on-off switch.  */
2306
2307int
2308option_enabled (int opt_idx)
2309{
2310  const struct cl_option *option = &(cl_options[opt_idx]);
2311
2312  if (option->flag_var)
2313    switch (option->var_type)
2314      {
2315      case CLVC_BOOLEAN:
2316	return *(int *) option->flag_var != 0;
2317
2318      case CLVC_EQUAL:
2319	return *(int *) option->flag_var == option->var_value;
2320
2321      case CLVC_BIT_CLEAR:
2322	return (*(int *) option->flag_var & option->var_value) == 0;
2323
2324      case CLVC_BIT_SET:
2325	return (*(int *) option->flag_var & option->var_value) != 0;
2326
2327      case CLVC_STRING:
2328	break;
2329      }
2330  return -1;
2331}
2332
2333/* Fill STATE with the current state of option OPTION.  Return true if
2334   there is some state to store.  */
2335
2336bool
2337get_option_state (int option, struct cl_option_state *state)
2338{
2339  if (cl_options[option].flag_var == 0)
2340    return false;
2341
2342  switch (cl_options[option].var_type)
2343    {
2344    case CLVC_BOOLEAN:
2345    case CLVC_EQUAL:
2346      state->data = cl_options[option].flag_var;
2347      state->size = sizeof (int);
2348      break;
2349
2350    case CLVC_BIT_CLEAR:
2351    case CLVC_BIT_SET:
2352      state->ch = option_enabled (option);
2353      state->data = &state->ch;
2354      state->size = 1;
2355      break;
2356
2357    case CLVC_STRING:
2358      state->data = *(const char **) cl_options[option].flag_var;
2359      if (state->data == 0)
2360	state->data = "";
2361      state->size = strlen ((const char *) state->data) + 1;
2362      break;
2363    }
2364  return true;
2365}
2366
2367/* Set *OPTION according to VALUE and ARG.  */
2368
2369void
2370set_option (const struct cl_option *option, int value, const char *arg)
2371{
2372  if (!option->flag_var)
2373    return;
2374
2375  switch (option->var_type)
2376    {
2377    case CLVC_BOOLEAN:
2378	*(int *) option->flag_var = value;
2379	break;
2380
2381    case CLVC_EQUAL:
2382	*(int *) option->flag_var = (value
2383				     ? option->var_value
2384				     : !option->var_value);
2385	break;
2386
2387    case CLVC_BIT_CLEAR:
2388    case CLVC_BIT_SET:
2389	if ((value != 0) == (option->var_type == CLVC_BIT_SET))
2390	  *(int *) option->flag_var |= option->var_value;
2391	else
2392	  *(int *) option->flag_var &= ~option->var_value;
2393	if (option->flag_var == &target_flags)
2394	  target_flags_explicit |= option->var_value;
2395	break;
2396
2397    case CLVC_STRING:
2398	*(const char **) option->flag_var = arg;
2399	break;
2400    }
2401}
2402
2403/* Enable a warning option as an error.  This is used by -Werror= and
2404   also by legacy Werror-implicit-function-declaration.  */
2405
2406void
2407enable_warning_as_error (const char *arg, int value, unsigned int lang_mask)
2408{
2409  char *new_option;
2410  int option_index;
2411
2412  new_option = XNEWVEC (char, strlen (arg) + 2);
2413  new_option[0] = 'W';
2414  strcpy (new_option + 1, arg);
2415  option_index = find_opt (new_option, lang_mask);
2416  if (option_index == N_OPTS)
2417    {
2418      error ("-Werror=%s: No option -%s", arg, new_option);
2419    }
2420  else
2421    {
2422      diagnostic_t kind = value ? DK_ERROR : DK_WARNING;
2423      diagnostic_classify_diagnostic (global_dc, option_index, kind);
2424
2425      /* -Werror=foo implies -Wfoo.  */
2426      if (cl_options[option_index].var_type == CLVC_BOOLEAN
2427	  && cl_options[option_index].flag_var
2428	  && kind == DK_ERROR)
2429	*(int *) cl_options[option_index].flag_var = 1;
2430    }
2431  free (new_option);
2432}
2433