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