]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/opts.c
config.host: Add x-aix to host_xmake_file.
[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
93a4f5e0
JJ
1011 /* Handle related options for unit-at-a-time, toplevel-reorder, and
1012 section-anchors. */
57b08d04
ST
1013 if (!flag_unit_at_a_time)
1014 {
93a4f5e0
JJ
1015 if (flag_section_anchors == 1)
1016 error ("Section anchors must be disabled when unit-at-a-time "
1017 "is disabled.");
57b08d04 1018 flag_section_anchors = 0;
93a4f5e0
JJ
1019 if (flag_toplevel_reorder == 1)
1020 error ("Toplevel reorder must be disabled when unit-at-a-time "
1021 "is disabled.");
57b08d04
ST
1022 flag_toplevel_reorder = 0;
1023 }
5ffebee7
JJ
1024 /* Unless the user has asked for section anchors, we disable toplevel
1025 reordering at -O0 to disable transformations that might be surprising
1026 to end users and to get -fno-toplevel-reorder tested. */
1027 if (!optimize && flag_toplevel_reorder == 2 && flag_section_anchors != 1)
93a4f5e0 1028 {
5ffebee7
JJ
1029 flag_toplevel_reorder = 0;
1030 flag_section_anchors = 0;
93a4f5e0
JJ
1031 }
1032 if (!flag_toplevel_reorder)
57b08d04
ST
1033 {
1034 if (flag_section_anchors == 1)
93a4f5e0
JJ
1035 error ("section anchors must be disabled when toplevel reorder"
1036 " is disabled");
57b08d04
ST
1037 flag_section_anchors = 0;
1038 }
1039
ab442df7
MM
1040 if (first_time_p)
1041 {
1042 if (flag_pie)
1043 flag_pic = flag_pie;
1044 if (flag_pic && !flag_pie)
1045 flag_shlib = 1;
ab442df7 1046 }
9756310a 1047
9756310a
NB
1048 if (optimize == 0)
1049 {
1050 /* Inlining does not work if not optimizing,
1051 so force it not to be done. */
9756310a 1052 warn_inline = 0;
e90acd93 1053 flag_no_inline = 1;
9756310a
NB
1054 }
1055
750054a2
CT
1056 /* The optimization to partition hot and cold basic blocks into separate
1057 sections of the .o and executable files does not work (currently)
e395963f
JW
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
750054a2
CT
1060 turn off the partitioning optimization. */
1061
1062 if (flag_exceptions && flag_reorder_blocks_and_partition)
1063 {
1f5b3869
MLI
1064 inform (input_location,
1065 "-freorder-blocks-and-partition does not work with exceptions");
750054a2
CT
1066 flag_reorder_blocks_and_partition = 0;
1067 flag_reorder_blocks = 1;
1068 }
c7466dee 1069
e395963f
JW
1070 /* If user requested unwind info, then turn off the partitioning
1071 optimization. */
1072
1073 if (flag_unwind_tables && ! targetm.unwind_tables_default
1074 && flag_reorder_blocks_and_partition)
1075 {
1f5b3869 1076 inform (input_location, "-freorder-blocks-and-partition does not support unwind info");
e395963f
JW
1077 flag_reorder_blocks_and_partition = 0;
1078 flag_reorder_blocks = 1;
1079 }
1080
1081 /* If the target requested unwind info, then turn off the partitioning
1082 optimization with a different message. Likewise, if the target does not
1083 support named sections. */
1084
c7466dee 1085 if (flag_reorder_blocks_and_partition
e395963f
JW
1086 && (!targetm.have_named_sections
1087 || (flag_unwind_tables && targetm.unwind_tables_default)))
c7466dee 1088 {
1f5b3869
MLI
1089 inform (input_location,
1090 "-freorder-blocks-and-partition does not work on this architecture");
c7466dee
CT
1091 flag_reorder_blocks_and_partition = 0;
1092 flag_reorder_blocks = 1;
1093 }
ab442df7 1094
e855c69d
AB
1095 /* Pipelining of outer loops is only possible when general pipelining
1096 capabilities are requested. */
1097 if (!flag_sel_sched_pipelining)
1098 flag_sel_sched_pipelining_outer_loops = 0;
1099
058e97ec
VM
1100#ifndef IRA_COVER_CLASSES
1101 if (flag_ira)
1102 {
69abac81 1103 inform (input_location, "-fira does not work on this architecture");
058e97ec
VM
1104 flag_ira = 0;
1105 }
1106#endif
1107
ab442df7
MM
1108 /* Save the current optimization options if this is the first call. */
1109 if (first_time_p)
1110 {
1111 optimization_default_node = build_optimization_node ();
1112 optimization_current_node = optimization_default_node;
1113 first_time_p = false;
1114 }
9756310a
NB
1115}
1116
c662432e
NC
1117#define LEFT_COLUMN 27
1118
1119/* Output ITEM, of length ITEM_WIDTH, in the left column,
1120 followed by word-wrapped HELP in a second column. */
1121static void
1122wrap_help (const char *help,
1123 const char *item,
1124 unsigned int item_width,
1125 unsigned int columns)
1126{
1127 unsigned int col_width = LEFT_COLUMN;
1128 unsigned int remaining, room, len;
1129
1130 remaining = strlen (help);
1131
1132 do
1133 {
1134 room = columns - 3 - MAX (col_width, item_width);
1135 if (room > columns)
1136 room = 0;
1137 len = remaining;
1138
1139 if (room < len)
1140 {
1141 unsigned int i;
1142
1143 for (i = 0; help[i]; i++)
1144 {
1145 if (i >= room && len != remaining)
1146 break;
1147 if (help[i] == ' ')
1148 len = i;
1149 else if ((help[i] == '-' || help[i] == '/')
1150 && help[i + 1] != ' '
1151 && i > 0 && ISALPHA (help[i - 1]))
1152 len = i + 1;
1153 }
1154 }
1155
1156 printf( " %-*.*s %.*s\n", col_width, item_width, item, len, help);
1157 item_width = 0;
1158 while (help[len] == ' ')
1159 len++;
1160 help += len;
1161 remaining -= len;
1162 }
1163 while (remaining);
1164}
1165
1166/* Print help for a specific front-end, etc. */
1167static void
1168print_filtered_help (unsigned int include_flags,
1169 unsigned int exclude_flags,
1170 unsigned int any_flags,
1171 unsigned int columns)
1172{
1173 unsigned int i;
1174 const char *help;
1175 static char *printed = NULL;
1176 bool found = false;
1177 bool displayed = false;
1178
1179 if (include_flags == CL_PARAMS)
1180 {
1181 for (i = 0; i < LAST_PARAM; i++)
1182 {
1183 const char *param = compiler_params[i].option;
1184
1185 help = compiler_params[i].help;
1186 if (help == NULL || *help == '\0')
1187 {
1188 if (exclude_flags & CL_UNDOCUMENTED)
1189 continue;
1190 help = undocumented_msg;
1191 }
1192
1193 /* Get the translation. */
1194 help = _(help);
1195
1196 wrap_help (help, param, strlen (param), columns);
1197 }
1198 putchar ('\n');
1199 return;
1200 }
1201
1202 if (!printed)
d3bfe4de 1203 printed = XCNEWVAR (char, cl_options_count);
c662432e
NC
1204
1205 for (i = 0; i < cl_options_count; i++)
1206 {
1207 static char new_help[128];
1208 const struct cl_option *option = cl_options + i;
1209 unsigned int len;
1210 const char *opt;
1211 const char *tab;
1212
1213 if (include_flags == 0
1214 || ((option->flags & include_flags) != include_flags))
1215 {
1216 if ((option->flags & any_flags) == 0)
1217 continue;
1218 }
1219
1220 /* Skip unwanted switches. */
1221 if ((option->flags & exclude_flags) != 0)
1222 continue;
1223
1224 found = true;
1225 /* Skip switches that have already been printed. */
1226 if (printed[i])
1227 continue;
1228
1229 printed[i] = true;
1230
1231 help = option->help;
1232 if (help == NULL)
1233 {
1234 if (exclude_flags & CL_UNDOCUMENTED)
1235 continue;
1236 help = undocumented_msg;
1237 }
1238
1239 /* Get the translation. */
1240 help = _(help);
1241
1242 /* Find the gap between the name of the
1243 option and its descriptive text. */
1244 tab = strchr (help, '\t');
1245 if (tab)
1246 {
1247 len = tab - help;
1248 opt = help;
1249 help = tab + 1;
1250 }
1251 else
1252 {
1253 opt = option->opt_text;
1254 len = strlen (opt);
1255 }
1256
1257 /* With the -Q option enabled we change the descriptive text associated
1258 with an option to be an indication of its current setting. */
1259 if (!quiet_flag)
1260 {
1261 if (len < (LEFT_COLUMN + 2))
1262 strcpy (new_help, "\t\t");
1263 else
1264 strcpy (new_help, "\t");
1265
1266 if (option->flag_var != NULL)
1267 {
1268 if (option->flags & CL_JOINED)
1269 {
1270 if (option->var_type == CLVC_STRING)
1271 {
1272 if (* (const char **) option->flag_var != NULL)
1273 snprintf (new_help + strlen (new_help),
1274 sizeof (new_help) - strlen (new_help),
1275 * (const char **) option->flag_var);
1276 }
1277 else
1278 sprintf (new_help + strlen (new_help),
1279 "%#x", * (int *) option->flag_var);
1280 }
1281 else
1282 strcat (new_help, option_enabled (i)
1283 ? _("[enabled]") : _("[disabled]"));
1284 }
1285
1286 help = new_help;
1287 }
1288
1289 wrap_help (help, opt, len, columns);
1290 displayed = true;
1291 }
1292
1293 if (! found)
b3eaaf1a
NC
1294 {
1295 unsigned int langs = include_flags & CL_LANG_ALL;
1296
1297 if (langs == 0)
1298 printf (_(" No options with the desired characteristics were found\n"));
1299 else
1300 {
1301 unsigned int i;
1302
1303 /* PR 31349: Tell the user how to see all of the
1304 options supported by a specific front end. */
1305 for (i = 0; (1U << i) < CL_LANG_ALL; i ++)
1306 if ((1U << i) & langs)
1307 printf (_(" None found. Use --help=%s to show *all* the options supported by the %s front-end\n"),
1308 lang_names[i], lang_names[i]);
1309 }
1310
1311 }
c662432e
NC
1312 else if (! displayed)
1313 printf (_(" All options with the desired characteristics have already been displayed\n"));
1314
1315 putchar ('\n');
1316}
1317
1318/* Display help for a specified type of option.
1319 The options must have ALL of the INCLUDE_FLAGS set
1320 ANY of the flags in the ANY_FLAGS set
1321 and NONE of the EXCLUDE_FLAGS set. */
1322static void
1323print_specific_help (unsigned int include_flags,
1324 unsigned int exclude_flags,
1325 unsigned int any_flags)
1326{
1327 unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
1328 const char * description = NULL;
1329 const char * descrip_extra = "";
1330 size_t i;
1331 unsigned int flag;
1332 static unsigned int columns = 0;
1333
1334 /* Sanity check: Make sure that we do not have more
1335 languages than we have bits available to enumerate them. */
1336 gcc_assert ((1U << cl_lang_count) < CL_MIN_OPTION_CLASS);
1337
1338 /* If we have not done so already, obtain
1339 the desired maximum width of the output. */
1340 if (columns == 0)
1341 {
1342 const char *p;
1343
1344 GET_ENVIRONMENT (p, "COLUMNS");
1345 if (p != NULL)
1346 {
1347 int value = atoi (p);
1348
1349 if (value > 0)
1350 columns = value;
1351 }
1352
1353 if (columns == 0)
1354 /* Use a reasonable default. */
1355 columns = 80;
1356 }
1357
1358 /* Decide upon the title for the options that we are going to display. */
1359 for (i = 0, flag = 1; flag <= CL_MAX_OPTION_CLASS; flag <<= 1, i ++)
1360 {
1361 switch (flag & include_flags)
1362 {
1363 case 0:
1364 break;
1365
1366 case CL_TARGET:
1367 description = _("The following options are target specific");
1368 break;
1369 case CL_WARNING:
1370 description = _("The following options control compiler warning messages");
1371 break;
1372 case CL_OPTIMIZATION:
1373 description = _("The following options control optimizations");
1374 break;
1375 case CL_COMMON:
1376 description = _("The following options are language-independent");
1377 break;
1378 case CL_PARAMS:
1379 description = _("The --param option recognizes the following as parameters");
1380 break;
1381 default:
1382 if (i >= cl_lang_count)
1383 break;
1384 if ((exclude_flags & ((1U << cl_lang_count) - 1)) != 0)
c01c261d 1385 description = _("The following options are specific to just the language ");
c662432e 1386 else
b5456e04 1387 description = _("The following options are supported by the language ");
b3eaaf1a 1388 descrip_extra = lang_names [i];
c662432e
NC
1389 break;
1390 }
1391 }
1392
1393 if (description == NULL)
1394 {
1395 if (any_flags == 0)
1396 {
1397 if (include_flags == CL_UNDOCUMENTED)
1398 description = _("The following options are not documented");
1399 else
1400 {
1401 internal_error ("unrecognized include_flags 0x%x passed to print_specific_help",
1402 include_flags);
1403 return;
1404 }
1405 }
1406 else
1407 {
1408 if (any_flags & all_langs_mask)
1409 description = _("The following options are language-related");
1410 else
1411 description = _("The following options are language-independent");
1412 }
1413 }
1414
1415 printf ("%s%s:\n", description, descrip_extra);
1416 print_filtered_help (include_flags, exclude_flags, any_flags, columns);
1417}
1418
d7b42618 1419/* Handle target- and language-independent options. Return zero to
50431bc4
ZD
1420 generate an "unknown option" message. Only options that need
1421 extra handling need to be listed here; if you simply want
1422 VALUE assigned to a variable, it happens automatically. */
1423
d7b42618 1424static int
79cf5994
DD
1425common_handle_option (size_t scode, const char *arg, int value,
1426 unsigned int lang_mask)
d7b42618 1427{
b3eaaf1a 1428 static bool verbose = false;
d7b42618
NB
1429 enum opt_code code = (enum opt_code) scode;
1430
d7b42618
NB
1431 switch (code)
1432 {
903caebf
NB
1433 case OPT__param:
1434 handle_param (arg);
1435 break;
1436
b3eaaf1a
NC
1437 case OPT_v:
1438 verbose = true;
1439 break;
1440
c662432e
NC
1441 case OPT_fhelp:
1442 case OPT__help:
1443 {
1444 unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
1445 unsigned int undoc_mask;
1446 unsigned int i;
1447
b3eaaf1a 1448 undoc_mask = (verbose | extra_warnings) ? 0 : CL_UNDOCUMENTED;
c662432e
NC
1449 /* First display any single language specific options. */
1450 for (i = 0; i < cl_lang_count; i++)
1451 print_specific_help
1452 (1U << i, (all_langs_mask & (~ (1U << i))) | undoc_mask, 0);
1453 /* Next display any multi language specific options. */
1454 print_specific_help (0, undoc_mask, all_langs_mask);
1455 /* Then display any remaining, non-language options. */
1456 for (i = CL_MIN_OPTION_CLASS; i <= CL_MAX_OPTION_CLASS; i <<= 1)
1457 print_specific_help (i, undoc_mask, 0);
1458 exit_after_options = true;
1459 break;
1460 }
1461
1462 case OPT_ftarget_help:
d185d268 1463 case OPT__target_help:
c662432e 1464 print_specific_help (CL_TARGET, CL_UNDOCUMENTED, 0);
d185d268 1465 exit_after_options = true;
67e6ba46
NC
1466
1467 /* Allow the target a chance to give the user some additional information. */
1468 if (targetm.target_help)
1469 targetm.target_help ();
d185d268
NB
1470 break;
1471
c662432e
NC
1472 case OPT_fhelp_:
1473 case OPT__help_:
1474 {
1475 const char * a = arg;
1476 unsigned int include_flags = 0;
1477 /* Note - by default we include undocumented options when listing
1478 specific classes. If you only want to see documented options
fa10beec 1479 then add ",^undocumented" to the --help= option. E.g.:
c662432e
NC
1480
1481 --help=target,^undocumented */
1482 unsigned int exclude_flags = 0;
1483
1484 /* Walk along the argument string, parsing each word in turn.
1485 The format is:
1486 arg = [^]{word}[,{arg}]
b5456e04
BM
1487 word = {optimizers|target|warnings|undocumented|
1488 params|common|<language>} */
c662432e
NC
1489 while (* a != 0)
1490 {
1491 static struct
1492 {
1493 const char * string;
1494 unsigned int flag;
1495 }
1496 specifics[] =
1497 {
1498 { "optimizers", CL_OPTIMIZATION },
1499 { "target", CL_TARGET },
1500 { "warnings", CL_WARNING },
1501 { "undocumented", CL_UNDOCUMENTED },
1502 { "params", CL_PARAMS },
1503 { "joined", CL_JOINED },
1504 { "separate", CL_SEPARATE },
b5456e04 1505 { "common", CL_COMMON },
c662432e
NC
1506 { NULL, 0 }
1507 };
1508 unsigned int * pflags;
1509 char * comma;
b3eaaf1a 1510 unsigned int lang_flag, specific_flag;
c662432e
NC
1511 unsigned int len;
1512 unsigned int i;
1513
1514 if (* a == '^')
1515 {
1516 ++ a;
1517 pflags = & exclude_flags;
1518 }
1519 else
1520 pflags = & include_flags;
1521
1522 comma = strchr (a, ',');
1523 if (comma == NULL)
1524 len = strlen (a);
1525 else
1526 len = comma - a;
1527
b3eaaf1a
NC
1528 /* Check to see if the string matches an option class name. */
1529 for (i = 0, specific_flag = 0; specifics[i].string != NULL; i++)
c662432e
NC
1530 if (strncasecmp (a, specifics[i].string, len) == 0)
1531 {
b3eaaf1a
NC
1532 specific_flag = specifics[i].flag;
1533 break;
1534 }
1535
1536 /* Check to see if the string matches a language name.
1537 Note - we rely upon the alpha-sorted nature of the entries in
1538 the lang_names array, specifically that shorter names appear
fa10beec 1539 before their longer variants. (i.e. C before C++). That way
b3eaaf1a
NC
1540 when we are attempting to match --help=c for example we will
1541 match with C first and not C++. */
1542 for (i = 0, lang_flag = 0; i < cl_lang_count; i++)
1543 if (strncasecmp (a, lang_names[i], len) == 0)
1544 {
1545 lang_flag = 1U << i;
c662432e
NC
1546 break;
1547 }
1548
b3eaaf1a 1549 if (specific_flag != 0)
c662432e 1550 {
b3eaaf1a
NC
1551 if (lang_flag == 0)
1552 * pflags |= specific_flag;
1553 else
1554 {
1555 /* The option's argument matches both the start of a
1556 language name and the start of an option class name.
1557 We have a special case for when the user has
1558 specified "--help=c", but otherwise we have to issue
1559 a warning. */
1560 if (strncasecmp (a, "c", len) == 0)
1561 * pflags |= lang_flag;
1562 else
1563 fnotice (stderr,
1564 "warning: --help argument %.*s is ambiguous, please be more specific\n",
1565 len, a);
1566 }
c662432e 1567 }
b3eaaf1a
NC
1568 else if (lang_flag != 0)
1569 * pflags |= lang_flag;
1570 else
1571 fnotice (stderr,
1572 "warning: unrecognized argument to --help= option: %.*s\n",
1573 len, a);
c662432e
NC
1574
1575 if (comma == NULL)
1576 break;
1577 a = comma + 1;
1578 }
1579
1580 if (include_flags)
1581 print_specific_help (include_flags, exclude_flags, 0);
1582 exit_after_options = true;
1583 break;
1584 }
1585
d185d268
NB
1586 case OPT__version:
1587 print_version (stderr, "");
1588 exit_after_options = true;
1589 break;
1590
1591 case OPT_G:
7b086b11 1592 g_switch_value = value;
d185d268
NB
1593 g_switch_set = true;
1594 break;
1595
903caebf
NB
1596 case OPT_O:
1597 case OPT_Os:
1598 /* Currently handled in a prescan. */
1599 break;
1600
1601 case OPT_W:
1602 /* For backward compatibility, -W is the same as -Wextra. */
1603 set_Wextra (value);
1604 break;
1605
1ebc7e68
RA
1606 case OPT_Wdisallowed_function_list_:
1607 warn_disallowed_functions = true;
1608 add_comma_separated_to_vector
1609 (&warning_disallowed_functions, arg);
1610 break;
1611
79cf5994 1612 case OPT_Werror_:
dc90f45b 1613 enable_warning_as_error (arg, value, lang_mask);
79cf5994
DD
1614 break;
1615
903caebf
NB
1616 case OPT_Wextra:
1617 set_Wextra (value);
1618 break;
1619
e01cc6dc 1620 case OPT_Wlarger_than_:
e8fc888d
MLI
1621 /* This form corresponds to -Wlarger-than-.
1622 Kept for backward compatibility.
1623 Don't use it as the first argument of warning(). */
1624
1625 case OPT_Wlarger_than_eq:
e01cc6dc
NB
1626 larger_than_size = value;
1627 warn_larger_than = value != -1;
1628 break;
1629
a214518f
SP
1630 case OPT_Wframe_larger_than_:
1631 frame_larger_than_size = value;
1632 warn_frame_larger_than = value != -1;
1633 break;
1634
e01cc6dc 1635 case OPT_Wstrict_aliasing:
79bedddc
SR
1636 set_Wstrict_aliasing (value);
1637 break;
1638
5399d643 1639 case OPT_Wstrict_aliasing_:
e01cc6dc
NB
1640 warn_strict_aliasing = value;
1641 break;
1642
6ac01510 1643 case OPT_Wstrict_overflow:
4d4362c8
ILT
1644 warn_strict_overflow = (value
1645 ? (int) WARN_STRICT_OVERFLOW_CONDITIONAL
1646 : 0);
1647 break;
1648
6ac01510
ILT
1649 case OPT_Wstrict_overflow_:
1650 warn_strict_overflow = value;
1651 break;
1652
903caebf 1653 case OPT_Wunused:
e73f7547 1654 warn_unused = value;
903caebf
NB
1655 break;
1656
d185d268
NB
1657 case OPT_aux_info:
1658 case OPT_aux_info_:
1659 aux_info_file_name = arg;
1660 flag_gen_aux_info = 1;
1661 break;
1662
1663 case OPT_auxbase:
1664 aux_base_name = arg;
1665 break;
1666
1667 case OPT_auxbase_strip:
1668 {
1669 char *tmp = xstrdup (arg);
1670 strip_off_ending (tmp, strlen (tmp));
1671 if (tmp[0])
1672 aux_base_name = tmp;
1673 }
1674 break;
1675
1676 case OPT_d:
1677 decode_d_option (arg);
1678 break;
1679
1680 case OPT_dumpbase:
1681 dump_base_name = arg;
1682 break;
1683
0fcd5dda
NB
1684 case OPT_falign_functions_:
1685 align_functions = value;
1686 break;
1687
0fcd5dda
NB
1688 case OPT_falign_jumps_:
1689 align_jumps = value;
1690 break;
1691
0fcd5dda
NB
1692 case OPT_falign_labels_:
1693 align_labels = value;
1694 break;
1695
0fcd5dda
NB
1696 case OPT_falign_loops_:
1697 align_loops = value;
1698 break;
1699
6ff3a151 1700 case OPT_fbranch_probabilities:
a8a5f53a 1701 flag_branch_probabilities_set = true;
1194fc79
R
1702 break;
1703
058de654
NB
1704 case OPT_fcall_used_:
1705 fix_register (arg, 0, 1);
1706 break;
1707
1708 case OPT_fcall_saved_:
1709 fix_register (arg, 0, 0);
1710 break;
6fb5fa3c
DB
1711
1712 case OPT_fdbg_cnt_:
1713 dbg_cnt_process_opt (arg);
1714 break;
0a090f42
SP
1715
1716 case OPT_fdbg_cnt_list:
1717 dbg_cnt_list_all_counters ();
1718 break;
058de654 1719
c8aea42c
PB
1720 case OPT_fdebug_prefix_map_:
1721 add_debug_prefix_map (arg);
1722 break;
1723
de32c0cb
NB
1724 case OPT_fdiagnostics_show_location_:
1725 if (!strcmp (arg, "once"))
1726 diagnostic_prefixing_rule (global_dc) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
1727 else if (!strcmp (arg, "every-line"))
1728 diagnostic_prefixing_rule (global_dc)
1729 = DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE;
1730 else
1731 return 0;
1732 break;
1733
2098fe9e
DD
1734 case OPT_fdiagnostics_show_option:
1735 global_dc->show_option_requested = true;
1736 break;
1737
6de9cd9a
DN
1738 case OPT_fdump_:
1739 if (!dump_switch_p (arg))
1740 return 0;
1741 break;
1742
058de654
NB
1743 case OPT_ffast_math:
1744 set_fast_math_flags (value);
1745 break;
1746
a1a82611
RE
1747 case OPT_funsafe_math_optimizations:
1748 set_unsafe_math_optimizations_flags (value);
1749 break;
1750
058de654
NB
1751 case OPT_ffixed_:
1752 fix_register (arg, 1, 1);
1753 break;
1754
d302c9d6
NB
1755 case OPT_finline_limit_:
1756 case OPT_finline_limit_eq:
d302c9d6
NB
1757 set_param_value ("max-inline-insns-single", value / 2);
1758 set_param_value ("max-inline-insns-auto", value / 2);
d302c9d6
NB
1759 break;
1760
8d5a7d1f 1761 case OPT_finstrument_functions_exclude_function_list_:
1ebc7e68 1762 add_comma_separated_to_vector
8d5a7d1f
ILT
1763 (&flag_instrument_functions_exclude_functions, arg);
1764 break;
1765
1766 case OPT_finstrument_functions_exclude_file_list_:
1ebc7e68 1767 add_comma_separated_to_vector
8d5a7d1f
ILT
1768 (&flag_instrument_functions_exclude_files, arg);
1769 break;
1770
de32c0cb 1771 case OPT_fmessage_length_:
b6fe0bb8 1772 pp_set_line_maximum_length (global_dc->printer, value);
de32c0cb
NB
1773 break;
1774
467cecf3
JB
1775 case OPT_fpack_struct_:
1776 if (value <= 0 || (value & (value - 1)) || value > 16)
c662432e 1777 error ("structure alignment must be a small power of two, not %d", value);
467cecf3
JB
1778 else
1779 {
1780 initial_max_fld_align = value;
1781 maximum_field_alignment = value * BITS_PER_UNIT;
1782 }
1783 break;
1784
de32c0cb 1785 case OPT_fpeel_loops:
a8a5f53a 1786 flag_peel_loops_set = true;
6ff3a151
NB
1787 break;
1788
1789 case OPT_fprofile_arcs:
a8a5f53a 1790 profile_arc_flag_set = true;
6ff3a151
NB
1791 break;
1792
4d4b8cb9
JH
1793 case OPT_finline_functions:
1794 flag_inline_functions_set = true;
1795 break;
1796
2f908293
SP
1797 case OPT_fprofile_dir_:
1798 profile_data_prefix = xstrdup (arg);
1799 break;
1800
1801 case OPT_fprofile_use_:
1802 profile_data_prefix = xstrdup (arg);
1803 flag_profile_use = true;
1804 value = true;
1805 /* No break here - do -fprofile-use processing. */
a8a5f53a
JH
1806 case OPT_fprofile_use:
1807 if (!flag_branch_probabilities_set)
1808 flag_branch_probabilities = value;
1809 if (!flag_profile_values_set)
1810 flag_profile_values = value;
1811 if (!flag_unroll_loops_set)
1812 flag_unroll_loops = value;
1813 if (!flag_peel_loops_set)
1814 flag_peel_loops = value;
1815 if (!flag_tracer_set)
1816 flag_tracer = value;
1817 if (!flag_value_profile_transformations_set)
1818 flag_value_profile_transformations = value;
4d4b8cb9
JH
1819 if (!flag_inline_functions_set)
1820 flag_inline_functions = value;
ca30a539
JH
1821 if (!flag_ipa_cp_set)
1822 flag_ipa_cp = value;
1823 if (!flag_ipa_cp_clone_set
1824 && value && flag_ipa_cp)
1825 flag_ipa_cp_clone = value;
8bcf15f6
JH
1826 if (!flag_predictive_commoning_set)
1827 flag_predictive_commoning = value;
1828 if (!flag_unswitch_loops_set)
1829 flag_unswitch_loops = value;
1830 if (!flag_gcse_after_reload_set)
1831 flag_gcse_after_reload = value;
a8a5f53a
JH
1832 break;
1833
2f908293
SP
1834 case OPT_fprofile_generate_:
1835 profile_data_prefix = xstrdup (arg);
1836 value = true;
1837 /* No break here - do -fprofile-generate processing. */
a8a5f53a
JH
1838 case OPT_fprofile_generate:
1839 if (!profile_arc_flag_set)
1840 profile_arc_flag = value;
1841 if (!flag_profile_values_set)
1842 flag_profile_values = value;
1843 if (!flag_value_profile_transformations_set)
1844 flag_value_profile_transformations = value;
6b956c95
JH
1845 if (!flag_inline_functions_set)
1846 flag_inline_functions = value;
a8a5f53a
JH
1847 break;
1848
fca9dc00 1849 case OPT_fprofile_values:
a8a5f53a 1850 flag_profile_values_set = true;
fca9dc00
ZD
1851 break;
1852
d7afec4b
ND
1853 case OPT_fvisibility_:
1854 {
1855 if (!strcmp(arg, "default"))
1856 default_visibility = VISIBILITY_DEFAULT;
1857 else if (!strcmp(arg, "internal"))
1858 default_visibility = VISIBILITY_INTERNAL;
1859 else if (!strcmp(arg, "hidden"))
1860 default_visibility = VISIBILITY_HIDDEN;
1861 else if (!strcmp(arg, "protected"))
1862 default_visibility = VISIBILITY_PROTECTED;
1863 else
cc9795d4 1864 error ("unrecognized visibility value \"%s\"", arg);
d7afec4b
ND
1865 }
1866 break;
1867
fca9dc00 1868 case OPT_fvpt:
6d9901e7
ZD
1869 flag_value_profile_transformations_set = true;
1870 break;
1871
de32c0cb
NB
1872 case OPT_frandom_seed:
1873 /* The real switch is -fno-random-seed. */
1874 if (value)
1875 return 0;
403d4851 1876 set_random_seed (NULL);
de32c0cb
NB
1877 break;
1878
1879 case OPT_frandom_seed_:
403d4851 1880 set_random_seed (arg);
de32c0cb
NB
1881 break;
1882
e855c69d
AB
1883 case OPT_fselective_scheduling:
1884 case OPT_fselective_scheduling2:
1885 sel_sched_switch_set = true;
1886 break;
1887
de32c0cb
NB
1888 case OPT_fsched_verbose_:
1889#ifdef INSN_SCHEDULING
1890 fix_sched_param ("verbose", arg);
1891 break;
1892#else
1893 return 0;
1894#endif
1895
569fa502
DN
1896 case OPT_fsched_stalled_insns_:
1897 flag_sched_stalled_insns = value;
1898 if (flag_sched_stalled_insns == 0)
1899 flag_sched_stalled_insns = -1;
1900 break;
1901
569fa502
DN
1902 case OPT_fsched_stalled_insns_dep_:
1903 flag_sched_stalled_insns_dep = value;
1904 break;
6ff3a151 1905
b38f3813
EB
1906 case OPT_fstack_check_:
1907 if (!strcmp (arg, "no"))
1908 flag_stack_check = NO_STACK_CHECK;
1909 else if (!strcmp (arg, "generic"))
1910 /* This is the old stack checking method. */
1911 flag_stack_check = STACK_CHECK_BUILTIN
1912 ? FULL_BUILTIN_STACK_CHECK
1913 : GENERIC_STACK_CHECK;
1914 else if (!strcmp (arg, "specific"))
1915 /* This is the new stack checking method. */
1916 flag_stack_check = STACK_CHECK_BUILTIN
1917 ? FULL_BUILTIN_STACK_CHECK
1918 : STACK_CHECK_STATIC_BUILTIN
1919 ? STATIC_BUILTIN_STACK_CHECK
1920 : GENERIC_STACK_CHECK;
1921 else
1922 warning (0, "unknown stack check parameter \"%s\"", arg);
1923 break;
1924
1925 case OPT_fstack_check:
1926 /* This is the same as the "specific" mode above. */
1927 if (value)
1928 flag_stack_check = STACK_CHECK_BUILTIN
1929 ? FULL_BUILTIN_STACK_CHECK
1930 : STACK_CHECK_STATIC_BUILTIN
1931 ? STATIC_BUILTIN_STACK_CHECK
1932 : GENERIC_STACK_CHECK;
1933 else
1934 flag_stack_check = NO_STACK_CHECK;
1935 break;
1936
de32c0cb
NB
1937 case OPT_fstack_limit:
1938 /* The real switch is -fno-stack-limit. */
1939 if (value)
1940 return 0;
1941 stack_limit_rtx = NULL_RTX;
1942 break;
1943
058de654
NB
1944 case OPT_fstack_limit_register_:
1945 {
1946 int reg = decode_reg_name (arg);
1947 if (reg < 0)
1948 error ("unrecognized register name \"%s\"", arg);
1949 else
1950 stack_limit_rtx = gen_rtx_REG (Pmode, reg);
1951 }
1952 break;
1953
1954 case OPT_fstack_limit_symbol_:
1955 stack_limit_rtx = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (arg));
1956 break;
1957
c866976a
LB
1958 case OPT_ftree_vectorizer_verbose_:
1959 vect_set_verbosity_level (arg);
1960 break;
1961
058de654
NB
1962 case OPT_ftls_model_:
1963 if (!strcmp (arg, "global-dynamic"))
1964 flag_tls_default = TLS_MODEL_GLOBAL_DYNAMIC;
1965 else if (!strcmp (arg, "local-dynamic"))
1966 flag_tls_default = TLS_MODEL_LOCAL_DYNAMIC;
1967 else if (!strcmp (arg, "initial-exec"))
1968 flag_tls_default = TLS_MODEL_INITIAL_EXEC;
1969 else if (!strcmp (arg, "local-exec"))
1970 flag_tls_default = TLS_MODEL_LOCAL_EXEC;
1971 else
d4ee4d25 1972 warning (0, "unknown tls-model \"%s\"", arg);
058de654
NB
1973 break;
1974
058e97ec
VM
1975 case OPT_fira_algorithm_:
1976 if (!strcmp (arg, "regional"))
1977 flag_ira_algorithm = IRA_ALGORITHM_REGIONAL;
1978 else if (!strcmp (arg, "CB"))
1979 flag_ira_algorithm = IRA_ALGORITHM_CB;
1980 else if (!strcmp (arg, "mixed"))
1981 flag_ira_algorithm = IRA_ALGORITHM_MIXED;
1982 else
1983 warning (0, "unknown ira algorithm \"%s\"", arg);
1984 break;
1985
1986 case OPT_fira_verbose_:
1987 flag_ira_verbose = value;
1988 break;
1989
de32c0cb 1990 case OPT_ftracer:
a8a5f53a 1991 flag_tracer_set = true;
6de9cd9a
DN
1992 break;
1993
ca30a539
JH
1994 case OPT_fipa_cp:
1995 flag_ipa_cp_set = true;
1996 break;
1997
1998 case OPT_fipa_cp_clone:
1999 flag_ipa_cp_clone_set = true;
2000 break;
2001
8bcf15f6
JH
2002 case OPT_fpredictive_commoning:
2003 flag_predictive_commoning_set = true;
2004 break;
2005
2006 case OPT_funswitch_loops:
2007 flag_unswitch_loops_set = true;
2008 break;
2009
2010 case OPT_fgcse_after_reload:
2011 flag_gcse_after_reload_set = true;
2012 break;
2013
de32c0cb 2014 case OPT_funroll_loops:
a8a5f53a 2015 flag_unroll_loops_set = true;
6ff3a151
NB
2016 break;
2017
e01cc6dc 2018 case OPT_g:
df38ffef
NB
2019 set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, arg);
2020 break;
2021
2022 case OPT_gcoff:
2023 set_debug_level (SDB_DEBUG, false, arg);
2024 break;
2025
df38ffef
NB
2026 case OPT_gdwarf_2:
2027 set_debug_level (DWARF2_DEBUG, false, arg);
2028 break;
2029
2030 case OPT_ggdb:
2031 set_debug_level (NO_DEBUG, 2, arg);
2032 break;
2033
2034 case OPT_gstabs:
2035 case OPT_gstabs_:
2036 set_debug_level (DBX_DEBUG, code == OPT_gstabs_, arg);
2037 break;
2038
2039 case OPT_gvms:
2040 set_debug_level (VMS_DEBUG, false, arg);
2041 break;
2042
2043 case OPT_gxcoff:
2044 case OPT_gxcoff_:
2045 set_debug_level (XCOFF_DEBUG, code == OPT_gxcoff_, arg);
e01cc6dc
NB
2046 break;
2047
d185d268
NB
2048 case OPT_o:
2049 asm_file_name = arg;
2050 break;
2051
d185d268
NB
2052 case OPT_pedantic_errors:
2053 flag_pedantic_errors = pedantic = 1;
2054 break;
2055
efa1cdf0
ZD
2056 case OPT_floop_optimize:
2057 case OPT_frerun_loop_opt:
2058 case OPT_fstrength_reduce:
e9033855 2059 case OPT_ftree_store_copy_prop:
aad89cd0 2060 case OPT_fforce_addr:
1353232d 2061 case OPT_ftree_salias:
37aaba15 2062 case OPT_ftree_store_ccp:
c0220ea4 2063 /* These are no-ops, preserved for backward compatibility. */
efa1cdf0
ZD
2064 break;
2065
50431bc4
ZD
2066 default:
2067 /* If the flag was handled in a standard way, assume the lack of
2068 processing here is intentional. */
0e61db61
NS
2069 gcc_assert (cl_options[scode].flag_var);
2070 break;
d7b42618
NB
2071 }
2072
2073 return 1;
2074}
903caebf
NB
2075
2076/* Handle --param NAME=VALUE. */
2077static void
2078handle_param (const char *carg)
2079{
2080 char *equal, *arg;
2081 int value;
2082
2083 arg = xstrdup (carg);
2084 equal = strchr (arg, '=');
2085 if (!equal)
2086 error ("%s: --param arguments should be of the form NAME=VALUE", arg);
2087 else
2088 {
2089 value = integral_argument (equal + 1);
2090 if (value == -1)
9e637a26 2091 error ("invalid --param value %qs", equal + 1);
903caebf
NB
2092 else
2093 {
2094 *equal = '\0';
2095 set_param_value (arg, value);
2096 }
2097 }
2098
2099 free (arg);
2100}
2101
2102/* Handle -W and -Wextra. */
2103static void
2104set_Wextra (int setting)
2105{
2106 extra_warnings = setting;
903caebf
NB
2107
2108 /* We save the value of warn_uninitialized, since if they put
2109 -Wuninitialized on the command line, we need to generate a
2110 warning about not using it without also specifying -O. */
2111 if (setting == 0)
2112 warn_uninitialized = 0;
2113 else if (warn_uninitialized != 1)
2114 warn_uninitialized = 2;
2115}
2116
79bedddc
SR
2117/* Used to set the level of strict aliasing warnings,
2118 when no level is specified (i.e., when -Wstrict-aliasing, and not
2119 -Wstrict-aliasing=level was given).
2120 ONOFF is assumed to take value 1 when -Wstrict-aliasing is specified,
2121 and 0 otherwise. After calling this function, wstrict_aliasing will be
2122 set to the default value of -Wstrict_aliasing=level, currently 3. */
2123void
2124set_Wstrict_aliasing (int onoff)
2125{
2126 gcc_assert (onoff == 0 || onoff == 1);
2127 if (onoff != 0)
2128 warn_strict_aliasing = 3;
621b5ed6
RG
2129 else
2130 warn_strict_aliasing = 0;
79bedddc
SR
2131}
2132
058de654
NB
2133/* The following routines are useful in setting all the flags that
2134 -ffast-math and -fno-fast-math imply. */
2135void
2136set_fast_math_flags (int set)
2137{
058de654 2138 flag_unsafe_math_optimizations = set;
c5edab65 2139 set_unsafe_math_optimizations_flags (set);
058de654
NB
2140 flag_finite_math_only = set;
2141 flag_errno_math = !set;
2142 if (set)
039c3d42
RS
2143 {
2144 flag_signaling_nans = 0;
2145 flag_rounding_math = 0;
c7463669 2146 flag_cx_limited_range = 1;
039c3d42 2147 }
058de654
NB
2148}
2149
a1a82611
RE
2150/* When -funsafe-math-optimizations is set the following
2151 flags are set as well. */
2152void
2153set_unsafe_math_optimizations_flags (int set)
2154{
c5edab65
EB
2155 flag_trapping_math = !set;
2156 flag_signed_zeros = !set;
a1a82611 2157 flag_associative_math = set;
c5edab65 2158 flag_reciprocal_math = set;
a1a82611
RE
2159}
2160
058de654
NB
2161/* Return true iff flags are set as if -ffast-math. */
2162bool
2163fast_math_flags_set_p (void)
2164{
2165 return (!flag_trapping_math
2166 && flag_unsafe_math_optimizations
2167 && flag_finite_math_only
db02da79 2168 && !flag_signed_zeros
058de654
NB
2169 && !flag_errno_math);
2170}
cf03fd63 2171
ab442df7
MM
2172/* Return true iff flags are set as if -ffast-math but using the flags stored
2173 in the struct cl_optimization structure. */
2174bool
2175fast_math_flags_struct_set_p (struct cl_optimization *opt)
2176{
2177 return (!opt->flag_trapping_math
2178 && opt->flag_unsafe_math_optimizations
2179 && opt->flag_finite_math_only
2180 && !opt->flag_signed_zeros
2181 && !opt->flag_errno_math);
2182}
2183
df38ffef
NB
2184/* Handle a debug output -g switch. EXTENDED is true or false to support
2185 extended output (2 is special and means "-ggdb" was given). */
2186static void
2187set_debug_level (enum debug_info_type type, int extended, const char *arg)
2188{
2189 static bool type_explicit;
2190
2191 use_gnu_debug_info_extensions = extended;
2192
2193 if (type == NO_DEBUG)
2194 {
2195 if (write_symbols == NO_DEBUG)
2196 {
2197 write_symbols = PREFERRED_DEBUGGING_TYPE;
2198
2199 if (extended == 2)
2200 {
2201#ifdef DWARF2_DEBUGGING_INFO
2202 write_symbols = DWARF2_DEBUG;
2203#elif defined DBX_DEBUGGING_INFO
2204 write_symbols = DBX_DEBUG;
2205#endif
2206 }
2207
2208 if (write_symbols == NO_DEBUG)
d4ee4d25 2209 warning (0, "target system does not support debug output");
df38ffef
NB
2210 }
2211 }
2212 else
2213 {
2214 /* Does it conflict with an already selected type? */
2215 if (type_explicit && write_symbols != NO_DEBUG && type != write_symbols)
2216 error ("debug format \"%s\" conflicts with prior selection",
2217 debug_type_names[type]);
2218 write_symbols = type;
2219 type_explicit = true;
2220 }
2221
2222 /* A debug flag without a level defaults to level 2. */
2223 if (*arg == '\0')
2224 {
2225 if (!debug_info_level)
2226 debug_info_level = 2;
2227 }
2228 else
2229 {
2230 debug_info_level = integral_argument (arg);
2231 if (debug_info_level == (unsigned int) -1)
2232 error ("unrecognised debug output level \"%s\"", arg);
2233 else if (debug_info_level > 3)
2234 error ("debug output level %s is too high", arg);
2235 }
2236}
2237
75685792
RS
2238/* Return 1 if OPTION is enabled, 0 if it is disabled, or -1 if it isn't
2239 a simple on-off switch. */
2240
2241int
ccf08a6e 2242option_enabled (int opt_idx)
75685792 2243{
ccf08a6e 2244 const struct cl_option *option = &(cl_options[opt_idx]);
c662432e 2245
75685792 2246 if (option->flag_var)
55bea00a 2247 switch (option->var_type)
75685792
RS
2248 {
2249 case CLVC_BOOLEAN:
55bea00a 2250 return *(int *) option->flag_var != 0;
75685792
RS
2251
2252 case CLVC_EQUAL:
55bea00a 2253 return *(int *) option->flag_var == option->var_value;
75685792
RS
2254
2255 case CLVC_BIT_CLEAR:
55bea00a 2256 return (*(int *) option->flag_var & option->var_value) == 0;
75685792
RS
2257
2258 case CLVC_BIT_SET:
55bea00a
RS
2259 return (*(int *) option->flag_var & option->var_value) != 0;
2260
2261 case CLVC_STRING:
2262 break;
75685792
RS
2263 }
2264 return -1;
2265}
5c60a017
RS
2266
2267/* Fill STATE with the current state of option OPTION. Return true if
2268 there is some state to store. */
2269
2270bool
2271get_option_state (int option, struct cl_option_state *state)
2272{
2273 if (cl_options[option].flag_var == 0)
2274 return false;
2275
2276 switch (cl_options[option].var_type)
2277 {
2278 case CLVC_BOOLEAN:
2279 case CLVC_EQUAL:
2280 state->data = cl_options[option].flag_var;
2281 state->size = sizeof (int);
2282 break;
2283
2284 case CLVC_BIT_CLEAR:
2285 case CLVC_BIT_SET:
2286 state->ch = option_enabled (option);
2287 state->data = &state->ch;
2288 state->size = 1;
2289 break;
2290
2291 case CLVC_STRING:
2292 state->data = *(const char **) cl_options[option].flag_var;
2293 if (state->data == 0)
2294 state->data = "";
d3bfe4de 2295 state->size = strlen ((const char *) state->data) + 1;
5c60a017
RS
2296 break;
2297 }
2298 return true;
2299}
dc90f45b
MLI
2300
2301/* Enable a warning option as an error. This is used by -Werror= and
2302 also by legacy Werror-implicit-function-declaration. */
2303
2304void
2305enable_warning_as_error (const char *arg, int value, unsigned int lang_mask)
2306{
2307 char *new_option;
2308 int option_index;
2309
2310 new_option = XNEWVEC (char, strlen (arg) + 2);
2311 new_option[0] = 'W';
2312 strcpy (new_option + 1, arg);
2313 option_index = find_opt (new_option, lang_mask);
2314 if (option_index == N_OPTS)
2315 {
2316 error ("-Werror=%s: No option -%s", arg, new_option);
2317 }
2318 else
2319 {
2320 int kind = value ? DK_ERROR : DK_WARNING;
2321 diagnostic_classify_diagnostic (global_dc, option_index, kind);
2322
2323 /* -Werror=foo implies -Wfoo. */
2324 if (cl_options[option_index].var_type == CLVC_BOOLEAN
2325 && cl_options[option_index].flag_var
2326 && kind == DK_ERROR)
2327 *(int *) cl_options[option_index].flag_var = 1;
2328 }
2329 free (new_option);
2330}