]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/opts.c
i386.c (ix86_data_alignment): For compatibility with (incorrect) GCC 4.8 and earlier...
[thirdparty/gcc.git] / gcc / opts.c
CommitLineData
2772ef3e 1/* Command line option handling.
23a5b65a 2 Copyright (C) 2002-2014 Free Software Foundation, Inc.
2772ef3e
NB
3 Contributed by Neil Booth.
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9dcd6f09 9Software Foundation; either version 3, or (at your option) any later
2772ef3e
NB
10version.
11
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
16
17You should have received a copy of the GNU General Public License
9dcd6f09
NC
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
2772ef3e
NB
20
21#include "config.h"
22#include "system.h"
cf03fd63 23#include "intl.h"
2772ef3e 24#include "coretypes.h"
7d5a5747
MLI
25#include "opts.h"
26#include "options.h"
88a00ef7 27#include "tm.h" /* For STACK_CHECK_BUILTIN,
0df226a4
JM
28 STACK_CHECK_STATIC_BUILTIN, DEFAULT_GDB_EXTENSIONS,
29 DWARF2_DEBUGGING_INFO and DBX_DEBUGGING_INFO. */
d7b42618 30#include "flags.h"
903caebf 31#include "params.h"
de32c0cb 32#include "diagnostic.h"
4b84d650 33#include "diagnostic-color.h"
5f0f4a3b 34#include "opts-diagnostic.h"
88a00ef7 35#include "insn-attr-common.h"
677f3fa8 36#include "common/common-target.h"
2772ef3e 37
65d4f2cd
MLI
38static void set_Wstrict_aliasing (struct gcc_options *opts, int onoff);
39
a7d0d30f
JM
40/* Indexed by enum debug_info_type. */
41const char *const debug_type_names[] =
42{
43 "none", "stabs", "coff", "dwarf-2", "xcoff", "vms"
44};
45
39ef6592
LC
46/* Parse the -femit-struct-debug-detailed option value
47 and set the flag variables. */
48
49#define MATCH( prefix, string ) \
50 ((strncmp (prefix, string, sizeof prefix - 1) == 0) \
51 ? ((string += sizeof prefix - 1), 1) : 0)
52
53void
299404a1
JM
54set_struct_debug_option (struct gcc_options *opts, location_t loc,
55 const char *spec)
39ef6592
LC
56{
57 /* various labels for comparison */
0576d21f
JM
58 static const char dfn_lbl[] = "dfn:", dir_lbl[] = "dir:", ind_lbl[] = "ind:";
59 static const char ord_lbl[] = "ord:", gen_lbl[] = "gen:";
60 static const char none_lbl[] = "none", any_lbl[] = "any";
61 static const char base_lbl[] = "base", sys_lbl[] = "sys";
39ef6592
LC
62
63 enum debug_struct_file files = DINFO_STRUCT_FILE_ANY;
64 /* Default is to apply to as much as possible. */
65 enum debug_info_usage usage = DINFO_USAGE_NUM_ENUMS;
66 int ord = 1, gen = 1;
67
68 /* What usage? */
69 if (MATCH (dfn_lbl, spec))
70 usage = DINFO_USAGE_DFN;
71 else if (MATCH (dir_lbl, spec))
72 usage = DINFO_USAGE_DIR_USE;
73 else if (MATCH (ind_lbl, spec))
74 usage = DINFO_USAGE_IND_USE;
75
76 /* Generics or not? */
77 if (MATCH (ord_lbl, spec))
78 gen = 0;
79 else if (MATCH (gen_lbl, spec))
80 ord = 0;
81
82 /* What allowable environment? */
83 if (MATCH (none_lbl, spec))
84 files = DINFO_STRUCT_FILE_NONE;
85 else if (MATCH (any_lbl, spec))
86 files = DINFO_STRUCT_FILE_ANY;
87 else if (MATCH (sys_lbl, spec))
88 files = DINFO_STRUCT_FILE_SYS;
89 else if (MATCH (base_lbl, spec))
90 files = DINFO_STRUCT_FILE_BASE;
91 else
299404a1
JM
92 error_at (loc,
93 "argument %qs to %<-femit-struct-debug-detailed%> "
94 "not recognized",
95 spec);
39ef6592
LC
96
97 /* Effect the specification. */
98 if (usage == DINFO_USAGE_NUM_ENUMS)
99 {
100 if (ord)
101 {
69ccdddb
JM
102 opts->x_debug_struct_ordinary[DINFO_USAGE_DFN] = files;
103 opts->x_debug_struct_ordinary[DINFO_USAGE_DIR_USE] = files;
104 opts->x_debug_struct_ordinary[DINFO_USAGE_IND_USE] = files;
39ef6592
LC
105 }
106 if (gen)
107 {
69ccdddb
JM
108 opts->x_debug_struct_generic[DINFO_USAGE_DFN] = files;
109 opts->x_debug_struct_generic[DINFO_USAGE_DIR_USE] = files;
110 opts->x_debug_struct_generic[DINFO_USAGE_IND_USE] = files;
39ef6592
LC
111 }
112 }
113 else
114 {
115 if (ord)
69ccdddb 116 opts->x_debug_struct_ordinary[usage] = files;
39ef6592 117 if (gen)
69ccdddb 118 opts->x_debug_struct_generic[usage] = files;
39ef6592
LC
119 }
120
121 if (*spec == ',')
299404a1 122 set_struct_debug_option (opts, loc, spec+1);
39ef6592
LC
123 else
124 {
125 /* No more -femit-struct-debug-detailed specifications.
126 Do final checks. */
127 if (*spec != '\0')
299404a1
JM
128 error_at (loc,
129 "argument %qs to %<-femit-struct-debug-detailed%> unknown",
130 spec);
69ccdddb
JM
131 if (opts->x_debug_struct_ordinary[DINFO_USAGE_DIR_USE]
132 < opts->x_debug_struct_ordinary[DINFO_USAGE_IND_USE]
133 || opts->x_debug_struct_generic[DINFO_USAGE_DIR_USE]
134 < opts->x_debug_struct_generic[DINFO_USAGE_IND_USE])
299404a1
JM
135 error_at (loc,
136 "%<-femit-struct-debug-detailed=dir:...%> must allow "
137 "at least as much as "
138 "%<-femit-struct-debug-detailed=ind:...%>");
39ef6592
LC
139 }
140}
141
c98cd5bf
JM
142/* Strip off a legitimate source ending from the input string NAME of
143 length LEN. Rather than having to know the names used by all of
144 our front ends, we strip off an ending of a period followed by
145 up to five characters. (Java uses ".class".) */
146
147void
148strip_off_ending (char *name, int len)
149{
150 int i;
151 for (i = 2; i < 6 && len > i; i++)
152 {
153 if (name[len - i] == '.')
154 {
155 name[len - i] = '\0';
156 break;
157 }
158 }
159}
160
39ef6592
LC
161/* Find the base name of a path, stripping off both directories and
162 a single final extension. */
69ccdddb 163int
39ef6592
LC
164base_of_path (const char *path, const char **base_out)
165{
166 const char *base = path;
167 const char *dot = 0;
168 const char *p = path;
169 char c = *p;
170 while (c)
171 {
c3284718 172 if (IS_DIR_SEPARATOR (c))
39ef6592
LC
173 {
174 base = p + 1;
175 dot = 0;
176 }
177 else if (c == '.')
178 dot = p;
179 c = *++p;
180 }
181 if (!dot)
182 dot = p;
183 *base_out = base;
184 return dot - base;
185}
186
2cc98056
NB
187/* What to print when a switch has no documentation. */
188static const char undocumented_msg[] = N_("This switch lacks documentation");
189
8d5a7d1f 190typedef char *char_p; /* For DEF_VEC_P. */
8d5a7d1f 191
48476d13 192static void handle_param (struct gcc_options *opts,
299404a1
JM
193 struct gcc_options *opts_set, location_t loc,
194 const char *carg);
df38ffef 195static void set_debug_level (enum debug_info_type type, int extended,
0576d21f 196 const char *arg, struct gcc_options *opts,
299404a1
JM
197 struct gcc_options *opts_set,
198 location_t loc);
d5478783 199static void set_fast_math_flags (struct gcc_options *opts, int set);
299404a1
JM
200static void decode_d_option (const char *arg, struct gcc_options *opts,
201 location_t loc, diagnostic_context *dc);
d5478783
JM
202static void set_unsafe_math_optimizations_flags (struct gcc_options *opts,
203 int set);
a4d8c676
JM
204static void enable_warning_as_error (const char *arg, int value,
205 unsigned int lang_mask,
206 const struct cl_option_handlers *handlers,
c5fa0890
JM
207 struct gcc_options *opts,
208 struct gcc_options *opts_set,
a4d8c676
JM
209 location_t loc,
210 diagnostic_context *dc);
2772ef3e 211
5f20c657
JM
212/* Handle a back-end option; arguments and return value as for
213 handle_option. */
2772ef3e 214
c98cd5bf 215bool
46625112 216target_handle_option (struct gcc_options *opts,
d4d24ba4 217 struct gcc_options *opts_set,
46625112 218 const struct cl_decoded_option *decoded,
481e1176 219 unsigned int lang_mask ATTRIBUTE_UNUSED, int kind,
96e45421 220 location_t loc,
d5478783
JM
221 const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED,
222 diagnostic_context *dc)
5f20c657 223{
d5478783 224 gcc_assert (dc == global_dc);
5f20c657 225 gcc_assert (kind == DK_UNSPECIFIED);
677f3fa8 226 return targetm_common.handle_option (opts, opts_set, decoded, loc);
2772ef3e 227}
d7b42618 228
1ebc7e68 229/* Add comma-separated strings to a char_p vector. */
8d5a7d1f
ILT
230
231static void
6a1f6c9c 232add_comma_separated_to_vector (void **pvec, const char *arg)
8d5a7d1f
ILT
233{
234 char *tmp;
235 char *r;
236 char *w;
237 char *token_start;
9771b263
DN
238 vec<char_p> *v = (vec<char_p> *) *pvec;
239
240 vec_check_alloc (v, 1);
8d5a7d1f
ILT
241
242 /* We never free this string. */
243 tmp = xstrdup (arg);
244
245 r = tmp;
246 w = tmp;
247 token_start = tmp;
248
249 while (*r != '\0')
250 {
251 if (*r == ',')
252 {
253 *w++ = '\0';
254 ++r;
9771b263 255 v->safe_push (token_start);
8d5a7d1f
ILT
256 token_start = w;
257 }
258 if (*r == '\\' && r[1] == ',')
259 {
260 *w++ = ',';
261 r += 2;
262 }
263 else
264 *w++ = *r++;
265 }
266 if (*token_start != '\0')
9771b263 267 v->safe_push (token_start);
8d5a7d1f 268
9771b263 269 *pvec = v;
8d5a7d1f
ILT
270}
271
a75bfaa6
JM
272/* Initialize OPTS and OPTS_SET before using them in parsing options. */
273
274void
275init_options_struct (struct gcc_options *opts, struct gcc_options *opts_set)
276{
48476d13
JM
277 size_t num_params = get_num_compiler_params ();
278
dc357798
JJ
279 gcc_obstack_init (&opts_obstack);
280
a75bfaa6 281 *opts = global_options_init;
bf7b5747
ST
282
283 if (opts_set)
284 memset (opts_set, 0, sizeof (*opts_set));
a75bfaa6 285
48476d13 286 opts->x_param_values = XNEWVEC (int, num_params);
bf7b5747
ST
287
288 if (opts_set)
289 opts_set->x_param_values = XCNEWVEC (int, num_params);
290
48476d13
JM
291 init_param_values (opts->x_param_values);
292
a75bfaa6
JM
293 /* Initialize whether `char' is signed. */
294 opts->x_flag_signed_char = DEFAULT_SIGNED_CHAR;
295 /* Set this to a special "uninitialized" value. The actual default
296 is set after target options have been processed. */
297 opts->x_flag_short_enums = 2;
298
677f3fa8 299 /* Initialize target_flags before default_options_optimization
a75bfaa6 300 so the latter can modify it. */
677f3fa8 301 opts->x_target_flags = targetm_common.default_target_flags;
a75bfaa6
JM
302
303 /* Some targets have ABI-specified unwind tables. */
677f3fa8 304 opts->x_flag_unwind_tables = targetm_common.unwind_tables_default;
7e4aae92
JM
305
306 /* Some targets have other target-specific initialization. */
677f3fa8 307 targetm_common.option_init_struct (opts);
a75bfaa6
JM
308}
309
3020190e 310/* If indicated by the optimization level LEVEL (-Os if SIZE is set,
bf7a7185
RG
311 -Ofast if FAST is set, -Og if DEBUG is set), apply the option DEFAULT_OPT
312 to OPTS and OPTS_SET, diagnostic context DC, location LOC, with language
313 mask LANG_MASK and option handlers HANDLERS. */
3020190e
JM
314
315static void
316maybe_default_option (struct gcc_options *opts,
317 struct gcc_options *opts_set,
318 const struct default_options *default_opt,
bf7a7185 319 int level, bool size, bool fast, bool debug,
3020190e
JM
320 unsigned int lang_mask,
321 const struct cl_option_handlers *handlers,
a4d8c676 322 location_t loc,
3020190e
JM
323 diagnostic_context *dc)
324{
325 const struct cl_option *option = &cl_options[default_opt->opt_index];
326 bool enabled;
327
328 if (size)
329 gcc_assert (level == 2);
330 if (fast)
331 gcc_assert (level == 3);
bf7a7185
RG
332 if (debug)
333 gcc_assert (level == 1);
3020190e
JM
334
335 switch (default_opt->levels)
336 {
337 case OPT_LEVELS_ALL:
338 enabled = true;
339 break;
340
341 case OPT_LEVELS_0_ONLY:
342 enabled = (level == 0);
343 break;
344
345 case OPT_LEVELS_1_PLUS:
346 enabled = (level >= 1);
347 break;
348
349 case OPT_LEVELS_1_PLUS_SPEED_ONLY:
bf7a7185
RG
350 enabled = (level >= 1 && !size && !debug);
351 break;
352
353 case OPT_LEVELS_1_PLUS_NOT_DEBUG:
354 enabled = (level >= 1 && !debug);
3020190e
JM
355 break;
356
357 case OPT_LEVELS_2_PLUS:
358 enabled = (level >= 2);
359 break;
360
361 case OPT_LEVELS_2_PLUS_SPEED_ONLY:
bf7a7185 362 enabled = (level >= 2 && !size && !debug);
3020190e
JM
363 break;
364
365 case OPT_LEVELS_3_PLUS:
366 enabled = (level >= 3);
367 break;
368
369 case OPT_LEVELS_3_PLUS_AND_SIZE:
370 enabled = (level >= 3 || size);
371 break;
372
373 case OPT_LEVELS_SIZE:
374 enabled = size;
375 break;
376
377 case OPT_LEVELS_FAST:
378 enabled = fast;
379 break;
380
381 case OPT_LEVELS_NONE:
382 default:
383 gcc_unreachable ();
384 }
385
386 if (enabled)
387 handle_generated_option (opts, opts_set, default_opt->opt_index,
388 default_opt->arg, default_opt->value,
a4d8c676
JM
389 lang_mask, DK_UNSPECIFIED, loc,
390 handlers, dc);
3020190e 391 else if (default_opt->arg == NULL
300d83d9 392 && !option->cl_reject_negative)
3020190e
JM
393 handle_generated_option (opts, opts_set, default_opt->opt_index,
394 default_opt->arg, !default_opt->value,
a4d8c676
JM
395 lang_mask, DK_UNSPECIFIED, loc,
396 handlers, dc);
3020190e
JM
397}
398
399/* As indicated by the optimization level LEVEL (-Os if SIZE is set,
400 -Ofast if FAST is set), apply the options in array DEFAULT_OPTS to
a4d8c676
JM
401 OPTS and OPTS_SET, diagnostic context DC, location LOC, with
402 language mask LANG_MASK and option handlers HANDLERS. */
3020190e
JM
403
404static void
405maybe_default_options (struct gcc_options *opts,
406 struct gcc_options *opts_set,
407 const struct default_options *default_opts,
bf7a7185 408 int level, bool size, bool fast, bool debug,
3020190e
JM
409 unsigned int lang_mask,
410 const struct cl_option_handlers *handlers,
a4d8c676 411 location_t loc,
3020190e
JM
412 diagnostic_context *dc)
413{
414 size_t i;
415
416 for (i = 0; default_opts[i].levels != OPT_LEVELS_NONE; i++)
417 maybe_default_option (opts, opts_set, &default_opts[i],
bf7a7185
RG
418 level, size, fast, debug,
419 lang_mask, handlers, loc, dc);
3020190e
JM
420}
421
422/* Table of options enabled by default at different levels. */
423
424static const struct default_options default_options_table[] =
425 {
426 /* -O1 optimizations. */
427 { OPT_LEVELS_1_PLUS, OPT_fdefer_pop, NULL, 1 },
428#ifdef DELAY_SLOTS
429 { OPT_LEVELS_1_PLUS, OPT_fdelayed_branch, NULL, 1 },
430#endif
431 { OPT_LEVELS_1_PLUS, OPT_fguess_branch_probability, NULL, 1 },
432 { OPT_LEVELS_1_PLUS, OPT_fcprop_registers, NULL, 1 },
433 { OPT_LEVELS_1_PLUS, OPT_fforward_propagate, NULL, 1 },
434 { OPT_LEVELS_1_PLUS, OPT_fif_conversion, NULL, 1 },
435 { OPT_LEVELS_1_PLUS, OPT_fif_conversion2, NULL, 1 },
436 { OPT_LEVELS_1_PLUS, OPT_fipa_pure_const, NULL, 1 },
437 { OPT_LEVELS_1_PLUS, OPT_fipa_reference, NULL, 1 },
438 { OPT_LEVELS_1_PLUS, OPT_fipa_profile, NULL, 1 },
439 { OPT_LEVELS_1_PLUS, OPT_fmerge_constants, NULL, 1 },
484db665 440 { OPT_LEVELS_1_PLUS, OPT_fshrink_wrap, NULL, 1 },
3020190e
JM
441 { OPT_LEVELS_1_PLUS, OPT_fsplit_wide_types, NULL, 1 },
442 { OPT_LEVELS_1_PLUS, OPT_ftree_ccp, NULL, 1 },
443 { OPT_LEVELS_1_PLUS, OPT_ftree_bit_ccp, NULL, 1 },
444 { OPT_LEVELS_1_PLUS, OPT_ftree_dce, NULL, 1 },
445 { OPT_LEVELS_1_PLUS, OPT_ftree_dominator_opts, NULL, 1 },
446 { OPT_LEVELS_1_PLUS, OPT_ftree_dse, NULL, 1 },
447 { OPT_LEVELS_1_PLUS, OPT_ftree_ter, NULL, 1 },
bf7a7185 448 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_sra, NULL, 1 },
3020190e
JM
449 { OPT_LEVELS_1_PLUS, OPT_ftree_copyrename, NULL, 1 },
450 { OPT_LEVELS_1_PLUS, OPT_ftree_fre, NULL, 1 },
451 { OPT_LEVELS_1_PLUS, OPT_ftree_copy_prop, NULL, 1 },
452 { OPT_LEVELS_1_PLUS, OPT_ftree_sink, NULL, 1 },
453 { OPT_LEVELS_1_PLUS, OPT_ftree_ch, NULL, 1 },
454 { OPT_LEVELS_1_PLUS, OPT_fcombine_stack_adjustments, NULL, 1 },
e692f276 455 { OPT_LEVELS_1_PLUS, OPT_fcompare_elim, NULL, 1 },
75cfe445 456 { OPT_LEVELS_1_PLUS, OPT_ftree_slsr, NULL, 1 },
3020190e
JM
457
458 /* -O2 optimizations. */
459 { OPT_LEVELS_2_PLUS, OPT_finline_small_functions, NULL, 1 },
460 { OPT_LEVELS_2_PLUS, OPT_findirect_inlining, NULL, 1 },
461 { OPT_LEVELS_2_PLUS, OPT_fpartial_inlining, NULL, 1 },
462 { OPT_LEVELS_2_PLUS, OPT_fthread_jumps, NULL, 1 },
463 { OPT_LEVELS_2_PLUS, OPT_fcrossjumping, NULL, 1 },
464 { OPT_LEVELS_2_PLUS, OPT_foptimize_sibling_calls, NULL, 1 },
465 { OPT_LEVELS_2_PLUS, OPT_fcse_follow_jumps, NULL, 1 },
466 { OPT_LEVELS_2_PLUS, OPT_fgcse, NULL, 1 },
467 { OPT_LEVELS_2_PLUS, OPT_fexpensive_optimizations, NULL, 1 },
468 { OPT_LEVELS_2_PLUS, OPT_frerun_cse_after_loop, NULL, 1 },
469 { OPT_LEVELS_2_PLUS, OPT_fcaller_saves, NULL, 1 },
470 { OPT_LEVELS_2_PLUS, OPT_fpeephole2, NULL, 1 },
471#ifdef INSN_SCHEDULING
472 /* Only run the pre-regalloc scheduling pass if optimizing for speed. */
473 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_fschedule_insns, NULL, 1 },
474 { OPT_LEVELS_2_PLUS, OPT_fschedule_insns2, NULL, 1 },
475#endif
3020190e
JM
476 { OPT_LEVELS_2_PLUS, OPT_fstrict_aliasing, NULL, 1 },
477 { OPT_LEVELS_2_PLUS, OPT_fstrict_overflow, NULL, 1 },
478 { OPT_LEVELS_2_PLUS, OPT_freorder_blocks, NULL, 1 },
479 { OPT_LEVELS_2_PLUS, OPT_freorder_functions, NULL, 1 },
480 { OPT_LEVELS_2_PLUS, OPT_ftree_vrp, NULL, 1 },
481 { OPT_LEVELS_2_PLUS, OPT_ftree_builtin_call_dce, NULL, 1 },
482 { OPT_LEVELS_2_PLUS, OPT_ftree_pre, NULL, 1 },
483 { OPT_LEVELS_2_PLUS, OPT_ftree_switch_conversion, NULL, 1 },
484 { OPT_LEVELS_2_PLUS, OPT_fipa_cp, NULL, 1 },
05842ff5 485 { OPT_LEVELS_2_PLUS, OPT_fdevirtualize, NULL, 1 },
bbc9396b 486 { OPT_LEVELS_2_PLUS, OPT_fdevirtualize_speculatively, NULL, 1 },
3020190e
JM
487 { OPT_LEVELS_2_PLUS, OPT_fipa_sra, NULL, 1 },
488 { OPT_LEVELS_2_PLUS, OPT_falign_loops, NULL, 1 },
489 { OPT_LEVELS_2_PLUS, OPT_falign_jumps, NULL, 1 },
490 { OPT_LEVELS_2_PLUS, OPT_falign_labels, NULL, 1 },
491 { OPT_LEVELS_2_PLUS, OPT_falign_functions, NULL, 1 },
c9e93168 492 { OPT_LEVELS_2_PLUS, OPT_ftree_tail_merge, NULL, 1 },
d6d11272 493 { OPT_LEVELS_2_PLUS, OPT_fvect_cost_model_, NULL, VECT_COST_MODEL_CHEAP },
d8878031 494 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_foptimize_strlen, NULL, 1 },
372a6eb8 495 { OPT_LEVELS_2_PLUS, OPT_fhoist_adjacent_loads, NULL, 1 },
e9f67e62 496 { OPT_LEVELS_2_PLUS, OPT_fipa_sem_equality, NULL, 1 },
ae93744d 497 { OPT_LEVELS_2_PLUS, OPT_fisolate_erroneous_paths_dereference, NULL, 1 },
3020190e
JM
498
499 /* -O3 optimizations. */
500 { OPT_LEVELS_3_PLUS, OPT_ftree_loop_distribute_patterns, NULL, 1 },
501 { OPT_LEVELS_3_PLUS, OPT_fpredictive_commoning, NULL, 1 },
502 /* Inlining of functions reducing size is a good idea with -Os
503 regardless of them being declared inline. */
504 { OPT_LEVELS_3_PLUS_AND_SIZE, OPT_finline_functions, NULL, 1 },
bf7a7185 505 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_finline_functions_called_once, NULL, 1 },
3020190e
JM
506 { OPT_LEVELS_3_PLUS, OPT_funswitch_loops, NULL, 1 },
507 { OPT_LEVELS_3_PLUS, OPT_fgcse_after_reload, NULL, 1 },
ea0f3e87
XDL
508 { OPT_LEVELS_3_PLUS, OPT_ftree_loop_vectorize, NULL, 1 },
509 { OPT_LEVELS_3_PLUS, OPT_ftree_slp_vectorize, NULL, 1 },
d6d11272 510 { OPT_LEVELS_3_PLUS, OPT_fvect_cost_model_, NULL, VECT_COST_MODEL_DYNAMIC },
3020190e 511 { OPT_LEVELS_3_PLUS, OPT_fipa_cp_clone, NULL, 1 },
fa06ad0d 512 { OPT_LEVELS_3_PLUS, OPT_ftree_partial_pre, NULL, 1 },
3020190e
JM
513
514 /* -Ofast adds optimizations to -O3. */
515 { OPT_LEVELS_FAST, OPT_ffast_math, NULL, 1 },
516
517 { OPT_LEVELS_NONE, 0, NULL, 0 }
518 };
519
a75bfaa6
JM
520/* Default the options in OPTS and OPTS_SET based on the optimization
521 settings in DECODED_OPTIONS and DECODED_OPTIONS_COUNT. */
c98cd5bf 522void
a75bfaa6
JM
523default_options_optimization (struct gcc_options *opts,
524 struct gcc_options *opts_set,
525 struct cl_decoded_option *decoded_options,
3020190e 526 unsigned int decoded_options_count,
a4d8c676 527 location_t loc,
3020190e
JM
528 unsigned int lang_mask,
529 const struct cl_option_handlers *handlers,
530 diagnostic_context *dc)
a75bfaa6
JM
531{
532 unsigned int i;
ab442df7 533 int opt2;
9756310a
NB
534
535 /* Scan to see what optimization level has been specified. That will
536 determine the default value of many flags. */
a75bfaa6 537 for (i = 1; i < decoded_options_count; i++)
9756310a 538 {
a75bfaa6 539 struct cl_decoded_option *opt = &decoded_options[i];
6e2f1956 540 switch (opt->opt_index)
9756310a 541 {
6e2f1956
JM
542 case OPT_O:
543 if (*opt->arg == '\0')
be6d3f0e 544 {
3020190e
JM
545 opts->x_optimize = 1;
546 opts->x_optimize_size = 0;
0a8134ca 547 opts->x_optimize_fast = 0;
bf7a7185 548 opts->x_optimize_debug = 0;
9756310a
NB
549 }
550 else
551 {
6e2f1956
JM
552 const int optimize_val = integral_argument (opt->arg);
553 if (optimize_val == -1)
33879b9f
MP
554 error_at (loc, "argument to %<-O%> should be a non-negative "
555 "integer, %<g%>, %<s%> or %<fast%>");
6e2f1956 556 else
9756310a 557 {
3020190e
JM
558 opts->x_optimize = optimize_val;
559 if ((unsigned int) opts->x_optimize > 255)
560 opts->x_optimize = 255;
561 opts->x_optimize_size = 0;
0a8134ca 562 opts->x_optimize_fast = 0;
bf7a7185 563 opts->x_optimize_debug = 0;
9756310a
NB
564 }
565 }
6e2f1956
JM
566 break;
567
568 case OPT_Os:
3020190e 569 opts->x_optimize_size = 1;
6e2f1956
JM
570
571 /* Optimizing for size forces optimize to be 2. */
3020190e 572 opts->x_optimize = 2;
0a8134ca 573 opts->x_optimize_fast = 0;
bf7a7185 574 opts->x_optimize_debug = 0;
6e2f1956
JM
575 break;
576
577 case OPT_Ofast:
578 /* -Ofast only adds flags to -O3. */
3020190e
JM
579 opts->x_optimize_size = 0;
580 opts->x_optimize = 3;
0a8134ca 581 opts->x_optimize_fast = 1;
bf7a7185
RG
582 opts->x_optimize_debug = 0;
583 break;
584
585 case OPT_Og:
586 /* -Og selects optimization level 1. */
587 opts->x_optimize_size = 0;
588 opts->x_optimize = 1;
589 opts->x_optimize_fast = 0;
590 opts->x_optimize_debug = 1;
6e2f1956
JM
591 break;
592
593 default:
594 /* Ignore other options in this prescan. */
595 break;
9756310a
NB
596 }
597 }
b8698a0f 598
3020190e
JM
599 maybe_default_options (opts, opts_set, default_options_table,
600 opts->x_optimize, opts->x_optimize_size,
bf7a7185
RG
601 opts->x_optimize_fast, opts->x_optimize_debug,
602 lang_mask, handlers, loc, dc);
3020190e
JM
603
604 /* -O2 param settings. */
605 opt2 = (opts->x_optimize >= 2);
116cb604 606
ab442df7 607 /* Track fields in field-sensitive alias analysis. */
48476d13
JM
608 maybe_set_param_value
609 (PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE,
610 opt2 ? 100 : default_param_value (PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE),
611 opts->x_param_values, opts_set->x_param_values);
e9e0aa2c 612
b1fb9f56 613 /* For -O1 only do loop invariant motion for very small loops. */
48476d13
JM
614 maybe_set_param_value
615 (PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP,
616 opt2 ? default_param_value (PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP) : 1000,
617 opts->x_param_values, opts_set->x_param_values);
b1fb9f56 618
3020190e
JM
619 if (opts->x_optimize_size)
620 /* We want to crossjump as much as possible. */
621 maybe_set_param_value (PARAM_MIN_CROSSJUMP_INSNS, 1,
622 opts->x_param_values, opts_set->x_param_values);
ab442df7 623 else
128dc8e2 624 maybe_set_param_value (PARAM_MIN_CROSSJUMP_INSNS,
48476d13
JM
625 default_param_value (PARAM_MIN_CROSSJUMP_INSNS),
626 opts->x_param_values, opts_set->x_param_values);
f736cb3e 627
a75bfaa6 628 /* Allow default optimizations to be specified on a per-machine basis. */
3020190e 629 maybe_default_options (opts, opts_set,
677f3fa8 630 targetm_common.option_optimization_table,
3020190e 631 opts->x_optimize, opts->x_optimize_size,
bf7a7185
RG
632 opts->x_optimize_fast, opts->x_optimize_debug,
633 lang_mask, handlers, loc, dc);
a75bfaa6
JM
634}
635
299404a1
JM
636/* After all options at LOC have been read into OPTS and OPTS_SET,
637 finalize settings of those options and diagnose incompatible
a75bfaa6 638 combinations. */
c98cd5bf 639void
299404a1
JM
640finish_options (struct gcc_options *opts, struct gcc_options *opts_set,
641 location_t loc)
a75bfaa6 642{
a75bfaa6
JM
643 enum unwind_info_type ui_except;
644
d5478783 645 if (opts->x_dump_base_name && ! IS_ABSOLUTE_PATH (opts->x_dump_base_name))
e71da632 646 {
d5478783
JM
647 /* First try to make OPTS->X_DUMP_BASE_NAME relative to the
648 OPTS->X_DUMP_DIR_NAME directory. Then try to make
649 OPTS->X_DUMP_BASE_NAME relative to the OPTS->X_AUX_BASE_NAME
650 directory, typically the directory to contain the object
651 file. */
652 if (opts->x_dump_dir_name)
dc357798
JJ
653 opts->x_dump_base_name = opts_concat (opts->x_dump_dir_name,
654 opts->x_dump_base_name, NULL);
dd3b31fb
L
655 else if (opts->x_aux_base_name
656 && strcmp (opts->x_aux_base_name, HOST_BIT_BUCKET) != 0)
e71da632 657 {
d7fb0a6d
L
658 const char *aux_base;
659
d5478783
JM
660 base_of_path (opts->x_aux_base_name, &aux_base);
661 if (opts->x_aux_base_name != aux_base)
d7fb0a6d 662 {
d5478783 663 int dir_len = aux_base - opts->x_aux_base_name;
dc357798
JJ
664 char *new_dump_base_name
665 = XOBNEWVEC (&opts_obstack, char,
666 strlen (opts->x_dump_base_name) + dir_len + 1);
d7fb0a6d 667
d5478783
JM
668 /* Copy directory component from OPTS->X_AUX_BASE_NAME. */
669 memcpy (new_dump_base_name, opts->x_aux_base_name, dir_len);
670 /* Append existing OPTS->X_DUMP_BASE_NAME. */
671 strcpy (new_dump_base_name + dir_len, opts->x_dump_base_name);
672 opts->x_dump_base_name = new_dump_base_name;
d7fb0a6d 673 }
e71da632
MH
674 }
675 }
676
93a4f5e0
JJ
677 /* Handle related options for unit-at-a-time, toplevel-reorder, and
678 section-anchors. */
d5478783 679 if (!opts->x_flag_unit_at_a_time)
57b08d04 680 {
d5478783 681 if (opts->x_flag_section_anchors && opts_set->x_flag_section_anchors)
299404a1
JM
682 error_at (loc, "section anchors must be disabled when unit-at-a-time "
683 "is disabled");
d5478783
JM
684 opts->x_flag_section_anchors = 0;
685 if (opts->x_flag_toplevel_reorder == 1)
299404a1
JM
686 error_at (loc, "toplevel reorder must be disabled when unit-at-a-time "
687 "is disabled");
d5478783 688 opts->x_flag_toplevel_reorder = 0;
57b08d04 689 }
7ea6b6cf 690
ee777b71
AH
691 if (opts->x_flag_tm && opts->x_flag_non_call_exceptions)
692 sorry ("transactional memory is not supported with non-call exceptions");
693
5ffebee7
JJ
694 /* Unless the user has asked for section anchors, we disable toplevel
695 reordering at -O0 to disable transformations that might be surprising
696 to end users and to get -fno-toplevel-reorder tested. */
299404a1 697 if (!opts->x_optimize
d5478783
JM
698 && opts->x_flag_toplevel_reorder == 2
699 && !(opts->x_flag_section_anchors && opts_set->x_flag_section_anchors))
93a4f5e0 700 {
d5478783
JM
701 opts->x_flag_toplevel_reorder = 0;
702 opts->x_flag_section_anchors = 0;
93a4f5e0 703 }
d5478783 704 if (!opts->x_flag_toplevel_reorder)
57b08d04 705 {
d5478783 706 if (opts->x_flag_section_anchors && opts_set->x_flag_section_anchors)
299404a1
JM
707 error_at (loc, "section anchors must be disabled when toplevel reorder"
708 " is disabled");
d5478783 709 opts->x_flag_section_anchors = 0;
57b08d04
ST
710 }
711
299404a1 712 if (!opts->x_flag_opts_finished)
ab442df7 713 {
d5478783
JM
714 if (opts->x_flag_pie)
715 opts->x_flag_pic = opts->x_flag_pie;
716 if (opts->x_flag_pic && !opts->x_flag_pie)
717 opts->x_flag_shlib = 1;
b294a75e 718 opts->x_flag_opts_finished = true;
ab442df7 719 }
9756310a 720
299404a1 721 if (opts->x_optimize == 0)
9756310a
NB
722 {
723 /* Inlining does not work if not optimizing,
724 so force it not to be done. */
d5478783
JM
725 opts->x_warn_inline = 0;
726 opts->x_flag_no_inline = 1;
9756310a
NB
727 }
728
750054a2
CT
729 /* The optimization to partition hot and cold basic blocks into separate
730 sections of the .o and executable files does not work (currently)
e395963f 731 with exception handling. This is because there is no support for
d5478783
JM
732 generating unwind info. If opts->x_flag_exceptions is turned on
733 we need to turn off the partitioning optimization. */
750054a2 734
677f3fa8 735 ui_except = targetm_common.except_unwind_info (opts);
f0a0390e 736
d5478783
JM
737 if (opts->x_flag_exceptions
738 && opts->x_flag_reorder_blocks_and_partition
bf1431e3 739 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))
750054a2 740 {
32ad0f03
TJ
741 if (opts_set->x_flag_reorder_blocks_and_partition)
742 inform (loc,
743 "-freorder-blocks-and-partition does not work "
744 "with exceptions on this architecture");
d5478783
JM
745 opts->x_flag_reorder_blocks_and_partition = 0;
746 opts->x_flag_reorder_blocks = 1;
750054a2 747 }
c7466dee 748
e395963f
JW
749 /* If user requested unwind info, then turn off the partitioning
750 optimization. */
751
d5478783 752 if (opts->x_flag_unwind_tables
677f3fa8 753 && !targetm_common.unwind_tables_default
d5478783 754 && opts->x_flag_reorder_blocks_and_partition
bf1431e3 755 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))
e395963f 756 {
32ad0f03
TJ
757 if (opts_set->x_flag_reorder_blocks_and_partition)
758 inform (loc,
759 "-freorder-blocks-and-partition does not support "
760 "unwind info on this architecture");
d5478783
JM
761 opts->x_flag_reorder_blocks_and_partition = 0;
762 opts->x_flag_reorder_blocks = 1;
e395963f
JW
763 }
764
765 /* If the target requested unwind info, then turn off the partitioning
766 optimization with a different message. Likewise, if the target does not
767 support named sections. */
768
d5478783 769 if (opts->x_flag_reorder_blocks_and_partition
677f3fa8 770 && (!targetm_common.have_named_sections
d5478783 771 || (opts->x_flag_unwind_tables
677f3fa8 772 && targetm_common.unwind_tables_default
bf1431e3 773 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))))
c7466dee 774 {
32ad0f03
TJ
775 if (opts_set->x_flag_reorder_blocks_and_partition)
776 inform (loc,
777 "-freorder-blocks-and-partition does not work "
778 "on this architecture");
d5478783
JM
779 opts->x_flag_reorder_blocks_and_partition = 0;
780 opts->x_flag_reorder_blocks = 1;
c7466dee 781 }
ab442df7 782
940c4160
IS
783 if (opts->x_flag_reorder_blocks_and_partition
784 && !opts_set->x_flag_reorder_functions)
785 opts->x_flag_reorder_functions = 1;
786
e855c69d
AB
787 /* Pipelining of outer loops is only possible when general pipelining
788 capabilities are requested. */
d5478783
JM
789 if (!opts->x_flag_sel_sched_pipelining)
790 opts->x_flag_sel_sched_pipelining_outer_loops = 0;
e855c69d 791
d5478783 792 if (opts->x_flag_conserve_stack)
6a78eaa3 793 {
48476d13
JM
794 maybe_set_param_value (PARAM_LARGE_STACK_FRAME, 100,
795 opts->x_param_values, opts_set->x_param_values);
796 maybe_set_param_value (PARAM_STACK_FRAME_GROWTH, 40,
797 opts->x_param_values, opts_set->x_param_values);
6a78eaa3
JH
798 }
799
014d92e1 800 if (opts->x_flag_lto)
e3b8749b
RG
801 {
802#ifdef ENABLE_LTO
d5478783 803 opts->x_flag_generate_lto = 1;
e3b8749b
RG
804
805 /* When generating IL, do not operate in whole-program mode.
806 Otherwise, symbols will be privatized too early, causing link
807 errors later. */
d5478783 808 opts->x_flag_whole_program = 0;
e3b8749b 809#else
299404a1 810 error_at (loc, "LTO support has not been enabled in this configuration");
e3b8749b 811#endif
063d671d
JH
812 if (!opts->x_flag_fat_lto_objects
813 && (!HAVE_LTO_PLUGIN
814 || (opts_set->x_flag_use_linker_plugin
815 && !opts->x_flag_use_linker_plugin)))
e9f67e62
JH
816 {
817 if (opts_set->x_flag_fat_lto_objects)
063d671d 818 error_at (loc, "-fno-fat-lto-objects are supported only with linker plugin");
e9f67e62
JH
819 opts->x_flag_fat_lto_objects = 1;
820 }
821 }
014d92e1
JH
822 if ((opts->x_flag_lto_partition_balanced != 0) + (opts->x_flag_lto_partition_1to1 != 0)
823 + (opts->x_flag_lto_partition_none != 0) >= 1)
852e4bd2 824 {
014d92e1
JH
825 if ((opts->x_flag_lto_partition_balanced != 0)
826 + (opts->x_flag_lto_partition_1to1 != 0)
827 + (opts->x_flag_lto_partition_none != 0) > 1)
299404a1 828 error_at (loc, "only one -flto-partition value can be specified");
852e4bd2 829 }
e3b8749b 830
d5478783 831 /* We initialize opts->x_flag_split_stack to -1 so that targets can set a
7458026b 832 default value if they choose based on other options. */
d5478783
JM
833 if (opts->x_flag_split_stack == -1)
834 opts->x_flag_split_stack = 0;
835 else if (opts->x_flag_split_stack)
7458026b 836 {
677f3fa8 837 if (!targetm_common.supports_split_stack (true, opts))
7458026b 838 {
299404a1
JM
839 error_at (loc, "%<-fsplit-stack%> is not supported by "
840 "this compiler configuration");
d5478783 841 opts->x_flag_split_stack = 0;
7458026b
ILT
842 }
843 }
bfe068c3 844
d6d11272
XDL
845 /* Tune vectorization related parametees according to cost model. */
846 if (opts->x_flag_vect_cost_model == VECT_COST_MODEL_CHEAP)
847 {
848 maybe_set_param_value (PARAM_VECT_MAX_VERSION_FOR_ALIAS_CHECKS,
849 6, opts->x_param_values, opts_set->x_param_values);
850 maybe_set_param_value (PARAM_VECT_MAX_VERSION_FOR_ALIGNMENT_CHECKS,
851 0, opts->x_param_values, opts_set->x_param_values);
852 maybe_set_param_value (PARAM_VECT_MAX_PEELING_FOR_ALIGNMENT,
853 0, opts->x_param_values, opts_set->x_param_values);
854 }
855
bfe068c3
IR
856 /* Set PARAM_MAX_STORES_TO_SINK to 0 if either vectorization or if-conversion
857 is disabled. */
ea0f3e87
XDL
858 if ((!opts->x_flag_tree_loop_vectorize && !opts->x_flag_tree_slp_vectorize)
859 || !opts->x_flag_tree_loop_if_convert)
bfe068c3
IR
860 maybe_set_param_value (PARAM_MAX_STORES_TO_SINK, 0,
861 opts->x_param_values, opts_set->x_param_values);
e9f8dcf9 862
99ea153e
SA
863 /* The -gsplit-dwarf option requires -gpubnames. */
864 if (opts->x_dwarf_split_debug_info)
865 opts->x_debug_generate_pub_sections = 1;
9756310a
NB
866}
867
c662432e
NC
868#define LEFT_COLUMN 27
869
870/* Output ITEM, of length ITEM_WIDTH, in the left column,
871 followed by word-wrapped HELP in a second column. */
872static void
873wrap_help (const char *help,
874 const char *item,
875 unsigned int item_width,
876 unsigned int columns)
877{
878 unsigned int col_width = LEFT_COLUMN;
879 unsigned int remaining, room, len;
880
881 remaining = strlen (help);
882
883 do
884 {
885 room = columns - 3 - MAX (col_width, item_width);
886 if (room > columns)
887 room = 0;
888 len = remaining;
889
890 if (room < len)
891 {
892 unsigned int i;
893
894 for (i = 0; help[i]; i++)
895 {
896 if (i >= room && len != remaining)
897 break;
898 if (help[i] == ' ')
899 len = i;
900 else if ((help[i] == '-' || help[i] == '/')
901 && help[i + 1] != ' '
902 && i > 0 && ISALPHA (help[i - 1]))
903 len = i + 1;
904 }
905 }
906
c3284718 907 printf (" %-*.*s %.*s\n", col_width, item_width, item, len, help);
c662432e
NC
908 item_width = 0;
909 while (help[len] == ' ')
910 len++;
911 help += len;
912 remaining -= len;
913 }
914 while (remaining);
915}
916
917/* Print help for a specific front-end, etc. */
918static void
919print_filtered_help (unsigned int include_flags,
920 unsigned int exclude_flags,
921 unsigned int any_flags,
0576d21f 922 unsigned int columns,
e6d4b984
JM
923 struct gcc_options *opts,
924 unsigned int lang_mask)
c662432e
NC
925{
926 unsigned int i;
927 const char *help;
c662432e
NC
928 bool found = false;
929 bool displayed = false;
930
931 if (include_flags == CL_PARAMS)
932 {
933 for (i = 0; i < LAST_PARAM; i++)
934 {
935 const char *param = compiler_params[i].option;
936
937 help = compiler_params[i].help;
938 if (help == NULL || *help == '\0')
939 {
940 if (exclude_flags & CL_UNDOCUMENTED)
941 continue;
942 help = undocumented_msg;
943 }
944
945 /* Get the translation. */
946 help = _(help);
947
948 wrap_help (help, param, strlen (param), columns);
949 }
950 putchar ('\n');
951 return;
952 }
953
299404a1
JM
954 if (!opts->x_help_printed)
955 opts->x_help_printed = XCNEWVAR (char, cl_options_count);
c662432e 956
e6d4b984
JM
957 if (!opts->x_help_enum_printed)
958 opts->x_help_enum_printed = XCNEWVAR (char, cl_enums_count);
959
c662432e
NC
960 for (i = 0; i < cl_options_count; i++)
961 {
0576d21f 962 char new_help[128];
c662432e
NC
963 const struct cl_option *option = cl_options + i;
964 unsigned int len;
965 const char *opt;
966 const char *tab;
967
968 if (include_flags == 0
969 || ((option->flags & include_flags) != include_flags))
970 {
971 if ((option->flags & any_flags) == 0)
972 continue;
973 }
974
975 /* Skip unwanted switches. */
976 if ((option->flags & exclude_flags) != 0)
977 continue;
978
603349bf
JM
979 /* The driver currently prints its own help text. */
980 if ((option->flags & CL_DRIVER) != 0
981 && (option->flags & (((1U << cl_lang_count) - 1)
982 | CL_COMMON | CL_TARGET)) == 0)
983 continue;
984
c662432e
NC
985 found = true;
986 /* Skip switches that have already been printed. */
299404a1 987 if (opts->x_help_printed[i])
c662432e
NC
988 continue;
989
299404a1 990 opts->x_help_printed[i] = true;
c662432e
NC
991
992 help = option->help;
993 if (help == NULL)
994 {
995 if (exclude_flags & CL_UNDOCUMENTED)
996 continue;
997 help = undocumented_msg;
998 }
999
1000 /* Get the translation. */
1001 help = _(help);
1002
1003 /* Find the gap between the name of the
1004 option and its descriptive text. */
1005 tab = strchr (help, '\t');
1006 if (tab)
1007 {
1008 len = tab - help;
1009 opt = help;
1010 help = tab + 1;
1011 }
1012 else
1013 {
1014 opt = option->opt_text;
1015 len = strlen (opt);
1016 }
1017
1018 /* With the -Q option enabled we change the descriptive text associated
1019 with an option to be an indication of its current setting. */
a7d0d30f 1020 if (!opts->x_quiet_flag)
c662432e 1021 {
0576d21f 1022 void *flag_var = option_flag_var (i, opts);
46625112 1023
c662432e
NC
1024 if (len < (LEFT_COLUMN + 2))
1025 strcpy (new_help, "\t\t");
1026 else
1027 strcpy (new_help, "\t");
1028
21bf1558
JM
1029 if (flag_var != NULL
1030 && option->var_type != CLVC_DEFER)
c662432e
NC
1031 {
1032 if (option->flags & CL_JOINED)
1033 {
1034 if (option->var_type == CLVC_STRING)
1035 {
46625112 1036 if (* (const char **) flag_var != NULL)
c662432e
NC
1037 snprintf (new_help + strlen (new_help),
1038 sizeof (new_help) - strlen (new_help),
46625112 1039 * (const char **) flag_var);
c662432e 1040 }
e6d4b984
JM
1041 else if (option->var_type == CLVC_ENUM)
1042 {
1043 const struct cl_enum *e = &cl_enums[option->var_enum];
1044 int value;
1045 const char *arg = NULL;
1046
1047 value = e->get (flag_var);
1048 enum_value_to_arg (e->values, &arg, value, lang_mask);
1049 if (arg == NULL)
1050 arg = _("[default]");
1051 snprintf (new_help + strlen (new_help),
1052 sizeof (new_help) - strlen (new_help),
1053 arg);
1054 }
c662432e
NC
1055 else
1056 sprintf (new_help + strlen (new_help),
46625112 1057 "%#x", * (int *) flag_var);
c662432e
NC
1058 }
1059 else
0576d21f 1060 strcat (new_help, option_enabled (i, opts)
c662432e
NC
1061 ? _("[enabled]") : _("[disabled]"));
1062 }
1063
1064 help = new_help;
1065 }
1066
1067 wrap_help (help, opt, len, columns);
1068 displayed = true;
e6d4b984
JM
1069
1070 if (option->var_type == CLVC_ENUM
1071 && opts->x_help_enum_printed[option->var_enum] != 2)
1072 opts->x_help_enum_printed[option->var_enum] = 1;
c662432e
NC
1073 }
1074
1075 if (! found)
b3eaaf1a
NC
1076 {
1077 unsigned int langs = include_flags & CL_LANG_ALL;
1078
1079 if (langs == 0)
1080 printf (_(" No options with the desired characteristics were found\n"));
1081 else
1082 {
1083 unsigned int i;
1084
1085 /* PR 31349: Tell the user how to see all of the
1086 options supported by a specific front end. */
1087 for (i = 0; (1U << i) < CL_LANG_ALL; i ++)
1088 if ((1U << i) & langs)
1089 printf (_(" None found. Use --help=%s to show *all* the options supported by the %s front-end\n"),
1090 lang_names[i], lang_names[i]);
1091 }
b8698a0f 1092
b3eaaf1a 1093 }
c662432e
NC
1094 else if (! displayed)
1095 printf (_(" All options with the desired characteristics have already been displayed\n"));
1096
1097 putchar ('\n');
e6d4b984
JM
1098
1099 /* Print details of enumerated option arguments, if those
1100 enumerations have help text headings provided. If no help text
1101 is provided, presume that the possible values are listed in the
1102 help text for the relevant options. */
1103 for (i = 0; i < cl_enums_count; i++)
1104 {
1105 unsigned int j, pos;
1106
1107 if (opts->x_help_enum_printed[i] != 1)
1108 continue;
1109 if (cl_enums[i].help == NULL)
1110 continue;
1111 printf (" %s\n ", _(cl_enums[i].help));
1112 pos = 4;
1113 for (j = 0; cl_enums[i].values[j].arg != NULL; j++)
1114 {
1115 unsigned int len = strlen (cl_enums[i].values[j].arg);
1116
1117 if (pos > 4 && pos + 1 + len <= columns)
1118 {
1119 printf (" %s", cl_enums[i].values[j].arg);
1120 pos += 1 + len;
1121 }
1122 else
1123 {
1124 if (pos > 4)
1125 {
1126 printf ("\n ");
1127 pos = 4;
1128 }
1129 printf ("%s", cl_enums[i].values[j].arg);
1130 pos += len;
1131 }
1132 }
1133 printf ("\n\n");
1134 opts->x_help_enum_printed[i] = 2;
1135 }
c662432e
NC
1136}
1137
1138/* Display help for a specified type of option.
1139 The options must have ALL of the INCLUDE_FLAGS set
1140 ANY of the flags in the ANY_FLAGS set
0576d21f 1141 and NONE of the EXCLUDE_FLAGS set. The current option state is in
e6d4b984 1142 OPTS; LANG_MASK is used for interpreting enumerated option state. */
c662432e
NC
1143static void
1144print_specific_help (unsigned int include_flags,
1145 unsigned int exclude_flags,
0576d21f 1146 unsigned int any_flags,
e6d4b984
JM
1147 struct gcc_options *opts,
1148 unsigned int lang_mask)
c662432e
NC
1149{
1150 unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
1151 const char * description = NULL;
1152 const char * descrip_extra = "";
1153 size_t i;
1154 unsigned int flag;
c662432e
NC
1155
1156 /* Sanity check: Make sure that we do not have more
1157 languages than we have bits available to enumerate them. */
58265ea6 1158 gcc_assert ((1U << cl_lang_count) <= CL_MIN_OPTION_CLASS);
c662432e
NC
1159
1160 /* If we have not done so already, obtain
1161 the desired maximum width of the output. */
299404a1 1162 if (opts->x_help_columns == 0)
c662432e
NC
1163 {
1164 const char *p;
1165
71f3e391 1166 p = getenv ("COLUMNS");
c662432e
NC
1167 if (p != NULL)
1168 {
1169 int value = atoi (p);
1170
1171 if (value > 0)
299404a1 1172 opts->x_help_columns = value;
c662432e
NC
1173 }
1174
299404a1 1175 if (opts->x_help_columns == 0)
c662432e 1176 /* Use a reasonable default. */
299404a1 1177 opts->x_help_columns = 80;
c662432e
NC
1178 }
1179
1180 /* Decide upon the title for the options that we are going to display. */
1181 for (i = 0, flag = 1; flag <= CL_MAX_OPTION_CLASS; flag <<= 1, i ++)
1182 {
1183 switch (flag & include_flags)
1184 {
1185 case 0:
603349bf 1186 case CL_DRIVER:
c662432e
NC
1187 break;
1188
1189 case CL_TARGET:
1190 description = _("The following options are target specific");
1191 break;
1192 case CL_WARNING:
1193 description = _("The following options control compiler warning messages");
1194 break;
1195 case CL_OPTIMIZATION:
1196 description = _("The following options control optimizations");
1197 break;
1198 case CL_COMMON:
1199 description = _("The following options are language-independent");
1200 break;
1201 case CL_PARAMS:
1202 description = _("The --param option recognizes the following as parameters");
1203 break;
1204 default:
1205 if (i >= cl_lang_count)
1206 break;
0631b69f 1207 if (exclude_flags & all_langs_mask)
c01c261d 1208 description = _("The following options are specific to just the language ");
c662432e 1209 else
b5456e04 1210 description = _("The following options are supported by the language ");
b3eaaf1a 1211 descrip_extra = lang_names [i];
c662432e
NC
1212 break;
1213 }
1214 }
1215
1216 if (description == NULL)
1217 {
1218 if (any_flags == 0)
1219 {
0631b69f 1220 if (include_flags & CL_UNDOCUMENTED)
c662432e 1221 description = _("The following options are not documented");
0631b69f
RW
1222 else if (include_flags & CL_SEPARATE)
1223 description = _("The following options take separate arguments");
1224 else if (include_flags & CL_JOINED)
1225 description = _("The following options take joined arguments");
c662432e
NC
1226 else
1227 {
1228 internal_error ("unrecognized include_flags 0x%x passed to print_specific_help",
1229 include_flags);
1230 return;
1231 }
1232 }
1233 else
1234 {
1235 if (any_flags & all_langs_mask)
1236 description = _("The following options are language-related");
1237 else
1238 description = _("The following options are language-independent");
1239 }
1240 }
1241
1242 printf ("%s%s:\n", description, descrip_extra);
299404a1 1243 print_filtered_help (include_flags, exclude_flags, any_flags,
e6d4b984 1244 opts->x_help_columns, opts, lang_mask);
c662432e
NC
1245}
1246
d7b42618 1247/* Handle target- and language-independent options. Return zero to
50431bc4
ZD
1248 generate an "unknown option" message. Only options that need
1249 extra handling need to be listed here; if you simply want
481e1176 1250 DECODED->value assigned to a variable, it happens automatically. */
50431bc4 1251
c98cd5bf 1252bool
46625112 1253common_handle_option (struct gcc_options *opts,
d4d24ba4 1254 struct gcc_options *opts_set,
46625112 1255 const struct cl_decoded_option *decoded,
5f20c657 1256 unsigned int lang_mask, int kind ATTRIBUTE_UNUSED,
a4d8c676 1257 location_t loc,
d5478783
JM
1258 const struct cl_option_handlers *handlers,
1259 diagnostic_context *dc)
d7b42618 1260{
481e1176
JM
1261 size_t scode = decoded->opt_index;
1262 const char *arg = decoded->arg;
1263 int value = decoded->value;
d7b42618
NB
1264 enum opt_code code = (enum opt_code) scode;
1265
481e1176
JM
1266 gcc_assert (decoded->canonical_option_num_elements <= 2);
1267
d7b42618
NB
1268 switch (code)
1269 {
903caebf 1270 case OPT__param:
299404a1 1271 handle_param (opts, opts_set, loc, arg);
903caebf
NB
1272 break;
1273
c662432e
NC
1274 case OPT__help:
1275 {
1276 unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
1277 unsigned int undoc_mask;
1278 unsigned int i;
1279
a7d0d30f
JM
1280 if (lang_mask == CL_DRIVER)
1281 break;;
1282
d5478783
JM
1283 undoc_mask = ((opts->x_verbose_flag | opts->x_extra_warnings)
1284 ? 0
1285 : CL_UNDOCUMENTED);
c662432e
NC
1286 /* First display any single language specific options. */
1287 for (i = 0; i < cl_lang_count; i++)
1288 print_specific_help
e6d4b984
JM
1289 (1U << i, (all_langs_mask & (~ (1U << i))) | undoc_mask, 0, opts,
1290 lang_mask);
c662432e 1291 /* Next display any multi language specific options. */
e6d4b984 1292 print_specific_help (0, undoc_mask, all_langs_mask, opts, lang_mask);
c662432e
NC
1293 /* Then display any remaining, non-language options. */
1294 for (i = CL_MIN_OPTION_CLASS; i <= CL_MAX_OPTION_CLASS; i <<= 1)
603349bf 1295 if (i != CL_DRIVER)
e6d4b984 1296 print_specific_help (i, undoc_mask, 0, opts, lang_mask);
0576d21f 1297 opts->x_exit_after_options = true;
c662432e
NC
1298 break;
1299 }
1300
d185d268 1301 case OPT__target_help:
a7d0d30f
JM
1302 if (lang_mask == CL_DRIVER)
1303 break;
1304
e6d4b984 1305 print_specific_help (CL_TARGET, CL_UNDOCUMENTED, 0, opts, lang_mask);
0576d21f 1306 opts->x_exit_after_options = true;
d185d268
NB
1307 break;
1308
c662432e
NC
1309 case OPT__help_:
1310 {
1311 const char * a = arg;
1312 unsigned int include_flags = 0;
1313 /* Note - by default we include undocumented options when listing
1314 specific classes. If you only want to see documented options
fa10beec 1315 then add ",^undocumented" to the --help= option. E.g.:
c662432e
NC
1316
1317 --help=target,^undocumented */
1318 unsigned int exclude_flags = 0;
1319
a7d0d30f
JM
1320 if (lang_mask == CL_DRIVER)
1321 break;
1322
c662432e
NC
1323 /* Walk along the argument string, parsing each word in turn.
1324 The format is:
1325 arg = [^]{word}[,{arg}]
b5456e04
BM
1326 word = {optimizers|target|warnings|undocumented|
1327 params|common|<language>} */
c662432e
NC
1328 while (* a != 0)
1329 {
0576d21f 1330 static const struct
c662432e
NC
1331 {
1332 const char * string;
1333 unsigned int flag;
1334 }
1335 specifics[] =
1336 {
1337 { "optimizers", CL_OPTIMIZATION },
1338 { "target", CL_TARGET },
1339 { "warnings", CL_WARNING },
1340 { "undocumented", CL_UNDOCUMENTED },
1341 { "params", CL_PARAMS },
66811228
RW
1342 { "joined", CL_JOINED },
1343 { "separate", CL_SEPARATE },
b5456e04 1344 { "common", CL_COMMON },
c662432e
NC
1345 { NULL, 0 }
1346 };
1347 unsigned int * pflags;
86373e7e 1348 const char * comma;
b3eaaf1a 1349 unsigned int lang_flag, specific_flag;
c662432e
NC
1350 unsigned int len;
1351 unsigned int i;
1352
1353 if (* a == '^')
1354 {
1355 ++ a;
1356 pflags = & exclude_flags;
1357 }
1358 else
1359 pflags = & include_flags;
1360
1361 comma = strchr (a, ',');
1362 if (comma == NULL)
1363 len = strlen (a);
1364 else
1365 len = comma - a;
0631b69f
RW
1366 if (len == 0)
1367 {
1368 a = comma + 1;
1369 continue;
1370 }
c662432e 1371
b3eaaf1a
NC
1372 /* Check to see if the string matches an option class name. */
1373 for (i = 0, specific_flag = 0; specifics[i].string != NULL; i++)
c662432e
NC
1374 if (strncasecmp (a, specifics[i].string, len) == 0)
1375 {
b3eaaf1a
NC
1376 specific_flag = specifics[i].flag;
1377 break;
1378 }
0631b69f 1379
b3eaaf1a
NC
1380 /* Check to see if the string matches a language name.
1381 Note - we rely upon the alpha-sorted nature of the entries in
1382 the lang_names array, specifically that shorter names appear
fa10beec 1383 before their longer variants. (i.e. C before C++). That way
b3eaaf1a
NC
1384 when we are attempting to match --help=c for example we will
1385 match with C first and not C++. */
1386 for (i = 0, lang_flag = 0; i < cl_lang_count; i++)
1387 if (strncasecmp (a, lang_names[i], len) == 0)
1388 {
1389 lang_flag = 1U << i;
c662432e
NC
1390 break;
1391 }
1392
b3eaaf1a 1393 if (specific_flag != 0)
c662432e 1394 {
b3eaaf1a
NC
1395 if (lang_flag == 0)
1396 * pflags |= specific_flag;
1397 else
1398 {
1399 /* The option's argument matches both the start of a
1400 language name and the start of an option class name.
1401 We have a special case for when the user has
1402 specified "--help=c", but otherwise we have to issue
1403 a warning. */
1404 if (strncasecmp (a, "c", len) == 0)
1405 * pflags |= lang_flag;
1406 else
299404a1
JM
1407 warning_at (loc, 0,
1408 "--help argument %q.*s is ambiguous, "
1409 "please be more specific",
1410 len, a);
b3eaaf1a 1411 }
c662432e 1412 }
b3eaaf1a
NC
1413 else if (lang_flag != 0)
1414 * pflags |= lang_flag;
1415 else
299404a1
JM
1416 warning_at (loc, 0,
1417 "unrecognized argument to --help= option: %q.*s",
1418 len, a);
c662432e
NC
1419
1420 if (comma == NULL)
1421 break;
1422 a = comma + 1;
1423 }
1424
1425 if (include_flags)
e6d4b984
JM
1426 print_specific_help (include_flags, exclude_flags, 0, opts,
1427 lang_mask);
0576d21f 1428 opts->x_exit_after_options = true;
c662432e
NC
1429 break;
1430 }
1431
d185d268 1432 case OPT__version:
a7d0d30f
JM
1433 if (lang_mask == CL_DRIVER)
1434 break;
1435
0576d21f 1436 opts->x_exit_after_options = true;
d185d268
NB
1437 break;
1438
de5a5fa1
MP
1439 case OPT_fsanitize_:
1440 {
1441 const char *p = arg;
1442 while (*p != 0)
1443 {
1444 static const struct
1445 {
1446 const char *const name;
1447 unsigned int flag;
1448 size_t len;
1449 } spec[] =
1450 {
1451 { "address", SANITIZE_ADDRESS, sizeof "address" - 1 },
1452 { "thread", SANITIZE_THREAD, sizeof "thread" - 1 },
9065ada9 1453 { "leak", SANITIZE_LEAK, sizeof "leak" - 1 },
de5a5fa1
MP
1454 { "shift", SANITIZE_SHIFT, sizeof "shift" - 1 },
1455 { "integer-divide-by-zero", SANITIZE_DIVIDE,
1456 sizeof "integer-divide-by-zero" - 1 },
1457 { "undefined", SANITIZE_UNDEFINED, sizeof "undefined" - 1 },
1458 { "unreachable", SANITIZE_UNREACHABLE,
1459 sizeof "unreachable" - 1 },
b906f4ca 1460 { "vla-bound", SANITIZE_VLA, sizeof "vla-bound" - 1 },
0a508bb6 1461 { "return", SANITIZE_RETURN, sizeof "return" - 1 },
b9a55b13 1462 { "null", SANITIZE_NULL, sizeof "null" - 1 },
31e071ae
MP
1463 { "signed-integer-overflow", SANITIZE_SI_OVERFLOW,
1464 sizeof "signed-integer-overflow" -1 },
ac0ff9f2
JJ
1465 { "bool", SANITIZE_BOOL, sizeof "bool" - 1 },
1466 { "enum", SANITIZE_ENUM, sizeof "enum" - 1 },
de5a5fa1
MP
1467 { NULL, 0, 0 }
1468 };
1469 const char *comma;
1470 size_t len, i;
1471 bool found = false;
1472
1473 comma = strchr (p, ',');
1474 if (comma == NULL)
1475 len = strlen (p);
1476 else
1477 len = comma - p;
1478 if (len == 0)
1479 {
1480 p = comma + 1;
1481 continue;
1482 }
1483
1484 /* Check to see if the string matches an option class name. */
1485 for (i = 0; spec[i].name != NULL; ++i)
1486 if (len == spec[i].len
1487 && memcmp (p, spec[i].name, len) == 0)
1488 {
1489 /* Handle both -fsanitize and -fno-sanitize cases. */
1490 if (value)
1491 flag_sanitize |= spec[i].flag;
1492 else
1493 flag_sanitize &= ~spec[i].flag;
1494 found = true;
1495 break;
1496 }
1497
1498 if (! found)
1499 warning_at (loc, 0,
1500 "unrecognized argument to -fsanitize= option: %q.*s",
1501 (int) len, p);
1502
1503 if (comma == NULL)
1504 break;
1505 p = comma + 1;
1506 }
1507
b9a55b13
MP
1508 /* When instrumenting the pointers, we don't want to remove
1509 the null pointer checks. */
1510 if (flag_sanitize & SANITIZE_NULL)
1511 opts->x_flag_delete_null_pointer_checks = 0;
de5a5fa1
MP
1512 break;
1513 }
1514
903caebf
NB
1515 case OPT_O:
1516 case OPT_Os:
c3a02647 1517 case OPT_Ofast:
bf7a7185 1518 case OPT_Og:
903caebf
NB
1519 /* Currently handled in a prescan. */
1520 break;
1521
aee15221
RG
1522 case OPT_Werror:
1523 dc->warning_as_error_requested = value;
1524 break;
1525
79cf5994 1526 case OPT_Werror_:
a7d0d30f
JM
1527 if (lang_mask == CL_DRIVER)
1528 break;
1529
c5fa0890
JM
1530 enable_warning_as_error (arg, value, lang_mask, handlers,
1531 opts, opts_set, loc, dc);
79cf5994
DD
1532 break;
1533
e01cc6dc 1534 case OPT_Wlarger_than_:
d5478783
JM
1535 opts->x_larger_than_size = value;
1536 opts->x_warn_larger_than = value != -1;
e01cc6dc
NB
1537 break;
1538
5f0f4a3b 1539 case OPT_Wfatal_errors:
d5478783 1540 dc->fatal_errors = value;
5f0f4a3b
JM
1541 break;
1542
a214518f 1543 case OPT_Wframe_larger_than_:
d5478783
JM
1544 opts->x_frame_larger_than_size = value;
1545 opts->x_warn_frame_larger_than = value != -1;
a214518f
SP
1546 break;
1547
a11e0df4
EB
1548 case OPT_Wstack_usage_:
1549 opts->x_warn_stack_usage = value;
1550 opts->x_flag_stack_usage_info = value != -1;
1551 break;
1552
e01cc6dc 1553 case OPT_Wstrict_aliasing:
d5478783 1554 set_Wstrict_aliasing (opts, value);
e01cc6dc
NB
1555 break;
1556
6ac01510 1557 case OPT_Wstrict_overflow:
d5478783
JM
1558 opts->x_warn_strict_overflow = (value
1559 ? (int) WARN_STRICT_OVERFLOW_CONDITIONAL
1560 : 0);
6ac01510
ILT
1561 break;
1562
5f0f4a3b 1563 case OPT_Wsystem_headers:
d5478783 1564 dc->dc_warn_system_headers = value;
903caebf
NB
1565 break;
1566
d185d268 1567 case OPT_aux_info:
d5478783 1568 opts->x_flag_gen_aux_info = 1;
d185d268
NB
1569 break;
1570
1571 case OPT_auxbase_strip:
1572 {
1573 char *tmp = xstrdup (arg);
1574 strip_off_ending (tmp, strlen (tmp));
1575 if (tmp[0])
d5478783 1576 opts->x_aux_base_name = tmp;
fc429b48
TB
1577 else
1578 free (tmp);
d185d268
NB
1579 }
1580 break;
1581
1582 case OPT_d:
299404a1 1583 decode_d_option (arg, opts, loc, dc);
d185d268
NB
1584 break;
1585
058de654 1586 case OPT_fcall_used_:
058de654 1587 case OPT_fcall_saved_:
21bf1558 1588 /* Deferred. */
058de654 1589 break;
6fb5fa3c
DB
1590
1591 case OPT_fdbg_cnt_:
0a090f42 1592 case OPT_fdbg_cnt_list:
299404a1 1593 /* Deferred. */
0a090f42 1594 break;
058de654 1595
c8aea42c 1596 case OPT_fdebug_prefix_map_:
299404a1 1597 /* Deferred. */
c8aea42c
PB
1598 break;
1599
de32c0cb 1600 case OPT_fdiagnostics_show_location_:
e6d4b984 1601 diagnostic_prefixing_rule (dc) = (diagnostic_prefixing_rule_t) value;
de32c0cb 1602 break;
9fec0042
MLI
1603
1604 case OPT_fdiagnostics_show_caret:
1605 dc->show_caret = value;
1606 break;
de32c0cb 1607
4b84d650
JJ
1608 case OPT_fdiagnostics_color_:
1609 pp_show_color (dc->printer)
1610 = colorize_init ((diagnostic_color_rule_t) value);
1611 break;
1612
2098fe9e 1613 case OPT_fdiagnostics_show_option:
d5478783 1614 dc->show_option_requested = value;
2098fe9e
DD
1615 break;
1616
6de9cd9a 1617 case OPT_fdump_:
21bf1558 1618 /* Deferred. */
6de9cd9a
DN
1619 break;
1620
058de654 1621 case OPT_ffast_math:
d5478783 1622 set_fast_math_flags (opts, value);
058de654
NB
1623 break;
1624
a1a82611 1625 case OPT_funsafe_math_optimizations:
d5478783 1626 set_unsafe_math_optimizations_flags (opts, value);
a1a82611
RE
1627 break;
1628
058de654 1629 case OPT_ffixed_:
21bf1558 1630 /* Deferred. */
058de654
NB
1631 break;
1632
d302c9d6 1633 case OPT_finline_limit_:
48476d13
JM
1634 set_param_value ("max-inline-insns-single", value / 2,
1635 opts->x_param_values, opts_set->x_param_values);
1636 set_param_value ("max-inline-insns-auto", value / 2,
1637 opts->x_param_values, opts_set->x_param_values);
d302c9d6
NB
1638 break;
1639
8d5a7d1f 1640 case OPT_finstrument_functions_exclude_function_list_:
1ebc7e68 1641 add_comma_separated_to_vector
6a1f6c9c 1642 (&opts->x_flag_instrument_functions_exclude_functions, arg);
8d5a7d1f
ILT
1643 break;
1644
1645 case OPT_finstrument_functions_exclude_file_list_:
1ebc7e68 1646 add_comma_separated_to_vector
6a1f6c9c 1647 (&opts->x_flag_instrument_functions_exclude_files, arg);
8d5a7d1f
ILT
1648 break;
1649
de32c0cb 1650 case OPT_fmessage_length_:
d5478783 1651 pp_set_line_maximum_length (dc->printer, value);
9fec0042 1652 diagnostic_set_caret_max_width (dc, value);
de32c0cb
NB
1653 break;
1654
78c60e3d
SS
1655 case OPT_fopt_info:
1656 case OPT_fopt_info_:
1657 /* Deferred. */
1658 break;
1659
467cecf3
JB
1660 case OPT_fpack_struct_:
1661 if (value <= 0 || (value & (value - 1)) || value > 16)
299404a1
JM
1662 error_at (loc,
1663 "structure alignment must be a small power of two, not %d",
1664 value);
467cecf3 1665 else
299404a1 1666 opts->x_initial_max_fld_align = value;
467cecf3
JB
1667 break;
1668
68a607d8 1669 case OPT_fplugin_:
68a607d8 1670 case OPT_fplugin_arg_:
21bf1558 1671 /* Deferred. */
68a607d8
DN
1672 break;
1673
2f908293 1674 case OPT_fprofile_use_:
0576d21f 1675 opts->x_profile_data_prefix = xstrdup (arg);
d5478783 1676 opts->x_flag_profile_use = true;
2f908293
SP
1677 value = true;
1678 /* No break here - do -fprofile-use processing. */
a8a5f53a 1679 case OPT_fprofile_use:
d4d24ba4 1680 if (!opts_set->x_flag_branch_probabilities)
d5478783 1681 opts->x_flag_branch_probabilities = value;
d4d24ba4 1682 if (!opts_set->x_flag_profile_values)
d5478783 1683 opts->x_flag_profile_values = value;
d4d24ba4 1684 if (!opts_set->x_flag_unroll_loops)
d5478783 1685 opts->x_flag_unroll_loops = value;
d4d24ba4 1686 if (!opts_set->x_flag_peel_loops)
d5478783 1687 opts->x_flag_peel_loops = value;
d4d24ba4 1688 if (!opts_set->x_flag_tracer)
d5478783 1689 opts->x_flag_tracer = value;
d4d24ba4 1690 if (!opts_set->x_flag_value_profile_transformations)
d5478783 1691 opts->x_flag_value_profile_transformations = value;
d4d24ba4 1692 if (!opts_set->x_flag_inline_functions)
d5478783 1693 opts->x_flag_inline_functions = value;
d4d24ba4 1694 if (!opts_set->x_flag_ipa_cp)
d5478783 1695 opts->x_flag_ipa_cp = value;
d4d24ba4 1696 if (!opts_set->x_flag_ipa_cp_clone
d5478783
JM
1697 && value && opts->x_flag_ipa_cp)
1698 opts->x_flag_ipa_cp_clone = value;
d4d24ba4 1699 if (!opts_set->x_flag_predictive_commoning)
d5478783 1700 opts->x_flag_predictive_commoning = value;
d4d24ba4 1701 if (!opts_set->x_flag_unswitch_loops)
d5478783 1702 opts->x_flag_unswitch_loops = value;
d4d24ba4 1703 if (!opts_set->x_flag_gcse_after_reload)
d5478783 1704 opts->x_flag_gcse_after_reload = value;
ea0f3e87
XDL
1705 if (!opts_set->x_flag_tree_loop_vectorize
1706 && !opts_set->x_flag_tree_vectorize)
1707 opts->x_flag_tree_loop_vectorize = value;
1708 if (!opts_set->x_flag_tree_slp_vectorize
1709 && !opts_set->x_flag_tree_vectorize)
1710 opts->x_flag_tree_slp_vectorize = value;
f56f2d33 1711 if (!opts_set->x_flag_vect_cost_model)
d6d11272 1712 opts->x_flag_vect_cost_model = VECT_COST_MODEL_DYNAMIC;
f56f2d33
JH
1713 if (!opts_set->x_flag_tree_loop_distribute_patterns)
1714 opts->x_flag_tree_loop_distribute_patterns = value;
9cec31f4
ML
1715 if (!opts_set->x_flag_profile_reorder_functions)
1716 opts->x_flag_profile_reorder_functions = value;
bbc9396b 1717 /* Indirect call profiling should do all useful transformations
a88bf705 1718 speculative devirtualization does. */
bbc9396b
JH
1719 if (!opts_set->x_flag_devirtualize_speculatively
1720 && opts->x_flag_value_profile_transformations)
1721 opts->x_flag_devirtualize_speculatively = false;
a8a5f53a
JH
1722 break;
1723
2f908293 1724 case OPT_fprofile_generate_:
0576d21f 1725 opts->x_profile_data_prefix = xstrdup (arg);
2f908293
SP
1726 value = true;
1727 /* No break here - do -fprofile-generate processing. */
a8a5f53a 1728 case OPT_fprofile_generate:
d4d24ba4 1729 if (!opts_set->x_profile_arc_flag)
d5478783 1730 opts->x_profile_arc_flag = value;
d4d24ba4 1731 if (!opts_set->x_flag_profile_values)
d5478783 1732 opts->x_flag_profile_values = value;
d4d24ba4 1733 if (!opts_set->x_flag_inline_functions)
d5478783 1734 opts->x_flag_inline_functions = value;
b0223c3e
JH
1735 /* FIXME: Instrumentation we insert makes ipa-reference bitmaps
1736 quadratic. Disable the pass until better memory representation
1737 is done. */
a7d0d30f 1738 if (!opts_set->x_flag_ipa_reference && opts->x_in_lto_p)
b0223c3e 1739 opts->x_flag_ipa_reference = false;
a8a5f53a
JH
1740 break;
1741
ea0f3e87
XDL
1742 case OPT_ftree_vectorize:
1743 if (!opts_set->x_flag_tree_loop_vectorize)
1744 opts->x_flag_tree_loop_vectorize = value;
1745 if (!opts_set->x_flag_tree_slp_vectorize)
1746 opts->x_flag_tree_slp_vectorize = value;
1747 break;
5f0f4a3b 1748 case OPT_fshow_column:
d5478783 1749 dc->show_column = value;
5f0f4a3b
JM
1750 break;
1751
de32c0cb
NB
1752 case OPT_frandom_seed:
1753 /* The real switch is -fno-random-seed. */
1754 if (value)
5f20c657 1755 return false;
299404a1 1756 /* Deferred. */
de32c0cb
NB
1757 break;
1758
1759 case OPT_frandom_seed_:
299404a1 1760 /* Deferred. */
de32c0cb
NB
1761 break;
1762
de32c0cb
NB
1763 case OPT_fsched_verbose_:
1764#ifdef INSN_SCHEDULING
299404a1 1765 /* Handled with Var in common.opt. */
de32c0cb
NB
1766 break;
1767#else
5f20c657 1768 return false;
de32c0cb
NB
1769#endif
1770
569fa502 1771 case OPT_fsched_stalled_insns_:
d5478783
JM
1772 opts->x_flag_sched_stalled_insns = value;
1773 if (opts->x_flag_sched_stalled_insns == 0)
1774 opts->x_flag_sched_stalled_insns = -1;
569fa502
DN
1775 break;
1776
569fa502 1777 case OPT_fsched_stalled_insns_dep_:
d5478783 1778 opts->x_flag_sched_stalled_insns_dep = value;
569fa502 1779 break;
6ff3a151 1780
b38f3813
EB
1781 case OPT_fstack_check_:
1782 if (!strcmp (arg, "no"))
5e471ea6 1783 opts->x_flag_stack_check = NO_STACK_CHECK;
b38f3813
EB
1784 else if (!strcmp (arg, "generic"))
1785 /* This is the old stack checking method. */
5e471ea6 1786 opts->x_flag_stack_check = STACK_CHECK_BUILTIN
b38f3813
EB
1787 ? FULL_BUILTIN_STACK_CHECK
1788 : GENERIC_STACK_CHECK;
1789 else if (!strcmp (arg, "specific"))
1790 /* This is the new stack checking method. */
5e471ea6 1791 opts->x_flag_stack_check = STACK_CHECK_BUILTIN
b38f3813
EB
1792 ? FULL_BUILTIN_STACK_CHECK
1793 : STACK_CHECK_STATIC_BUILTIN
1794 ? STATIC_BUILTIN_STACK_CHECK
1795 : GENERIC_STACK_CHECK;
1796 else
299404a1 1797 warning_at (loc, 0, "unknown stack check parameter \"%s\"", arg);
b38f3813
EB
1798 break;
1799
de32c0cb
NB
1800 case OPT_fstack_limit:
1801 /* The real switch is -fno-stack-limit. */
1802 if (value)
5f20c657 1803 return false;
21bf1558 1804 /* Deferred. */
de32c0cb
NB
1805 break;
1806
058de654 1807 case OPT_fstack_limit_register_:
058de654 1808 case OPT_fstack_limit_symbol_:
21bf1558 1809 /* Deferred. */
058de654
NB
1810 break;
1811
a11e0df4
EB
1812 case OPT_fstack_usage:
1813 opts->x_flag_stack_usage = value;
1814 opts->x_flag_stack_usage_info = value != 0;
1815 break;
1816
e01cc6dc 1817 case OPT_g:
51b83fdd
CC
1818 /* -g by itself should force -g2. */
1819 if (*arg == '\0')
1820 set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, "2", opts, opts_set,
1821 loc);
1822 else
1823 set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, arg, opts, opts_set,
1824 loc);
df38ffef
NB
1825 break;
1826
1827 case OPT_gcoff:
299404a1 1828 set_debug_level (SDB_DEBUG, false, arg, opts, opts_set, loc);
df38ffef
NB
1829 break;
1830
6782438d 1831 case OPT_gdwarf:
f0defe58 1832 if (arg && strlen (arg) != 0)
6782438d
SKS
1833 {
1834 error_at (loc, "%<-gdwarf%s%> is ambiguous; "
1835 "use %<-gdwarf-%s%> for DWARF version "
1836 "or %<-gdwarf -g%s%> for debug level", arg, arg, arg);
1837 break;
1838 }
1839 else
f0defe58
SKS
1840 value = opts->x_dwarf_version;
1841
1842 /* FALLTHRU */
53b2323e 1843 case OPT_gdwarf_:
b5b8b0ac 1844 if (value < 2 || value > 4)
299404a1 1845 error_at (loc, "dwarf version %d is not supported", value);
53b2323e 1846 else
a7d0d30f 1847 opts->x_dwarf_version = value;
299404a1 1848 set_debug_level (DWARF2_DEBUG, false, "", opts, opts_set, loc);
df38ffef
NB
1849 break;
1850
99ea153e
SA
1851 case OPT_gsplit_dwarf:
1852 set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, "", opts, opts_set,
1853 loc);
1854 break;
1855
df38ffef 1856 case OPT_ggdb:
299404a1 1857 set_debug_level (NO_DEBUG, 2, arg, opts, opts_set, loc);
df38ffef
NB
1858 break;
1859
1860 case OPT_gstabs:
1861 case OPT_gstabs_:
299404a1
JM
1862 set_debug_level (DBX_DEBUG, code == OPT_gstabs_, arg, opts, opts_set,
1863 loc);
df38ffef
NB
1864 break;
1865
1866 case OPT_gvms:
299404a1 1867 set_debug_level (VMS_DEBUG, false, arg, opts, opts_set, loc);
df38ffef
NB
1868 break;
1869
1870 case OPT_gxcoff:
1871 case OPT_gxcoff_:
299404a1
JM
1872 set_debug_level (XCOFF_DEBUG, code == OPT_gxcoff_, arg, opts, opts_set,
1873 loc);
e01cc6dc
NB
1874 break;
1875
d185d268 1876 case OPT_pedantic_errors:
d5478783 1877 dc->pedantic_errors = 1;
9b095bf1
MLI
1878 control_warning_option (OPT_Wpedantic, DK_ERROR, value,
1879 loc, lang_mask,
1880 handlers, opts, opts_set,
1881 dc);
c04b6b38
RG
1882 break;
1883
014d92e1 1884 case OPT_flto:
595c8dfa 1885 opts->x_flag_lto = value ? "" : NULL;
e10909ce
AK
1886 break;
1887
5f0f4a3b 1888 case OPT_w:
d5478783 1889 dc->dc_inhibit_warnings = true;
5f0f4a3b
JM
1890 break;
1891
3a789837
NF
1892 case OPT_fmax_errors_:
1893 dc->max_errors = value;
1894 break;
1895
b352afba
NC
1896 case OPT_fuse_ld_bfd:
1897 case OPT_fuse_ld_gold:
da18ea94
RAE
1898 case OPT_fuse_linker_plugin:
1899 /* No-op. Used by the driver and passed to us because it starts with f.*/
1900 break;
1901
955f5a07
JJ
1902 case OPT_fwrapv:
1903 if (value)
1904 opts->x_flag_trapv = 0;
1905 break;
1906
1907 case OPT_ftrapv:
1908 if (value)
1909 opts->x_flag_wrapv = 0;
1910 break;
1911
50431bc4
ZD
1912 default:
1913 /* If the flag was handled in a standard way, assume the lack of
1914 processing here is intentional. */
46625112 1915 gcc_assert (option_flag_var (scode, opts));
0e61db61 1916 break;
d7b42618
NB
1917 }
1918
7d5a5747
MLI
1919 common_handle_option_auto (opts, opts_set, decoded, lang_mask, kind,
1920 loc, handlers, dc);
5f20c657 1921 return true;
d7b42618 1922}
903caebf
NB
1923
1924/* Handle --param NAME=VALUE. */
1925static void
48476d13 1926handle_param (struct gcc_options *opts, struct gcc_options *opts_set,
299404a1 1927 location_t loc, const char *carg)
903caebf
NB
1928{
1929 char *equal, *arg;
1930 int value;
1931
1932 arg = xstrdup (carg);
1933 equal = strchr (arg, '=');
1934 if (!equal)
299404a1
JM
1935 error_at (loc, "%s: --param arguments should be of the form NAME=VALUE",
1936 arg);
903caebf
NB
1937 else
1938 {
1939 value = integral_argument (equal + 1);
1940 if (value == -1)
299404a1 1941 error_at (loc, "invalid --param value %qs", equal + 1);
903caebf
NB
1942 else
1943 {
1944 *equal = '\0';
48476d13
JM
1945 set_param_value (arg, value,
1946 opts->x_param_values, opts_set->x_param_values);
903caebf
NB
1947 }
1948 }
1949
1950 free (arg);
1951}
1952
d5478783 1953/* Used to set the level of strict aliasing warnings in OPTS,
79bedddc
SR
1954 when no level is specified (i.e., when -Wstrict-aliasing, and not
1955 -Wstrict-aliasing=level was given).
1956 ONOFF is assumed to take value 1 when -Wstrict-aliasing is specified,
1957 and 0 otherwise. After calling this function, wstrict_aliasing will be
1958 set to the default value of -Wstrict_aliasing=level, currently 3. */
65d4f2cd 1959static void
d5478783 1960set_Wstrict_aliasing (struct gcc_options *opts, int onoff)
79bedddc
SR
1961{
1962 gcc_assert (onoff == 0 || onoff == 1);
1963 if (onoff != 0)
d5478783 1964 opts->x_warn_strict_aliasing = 3;
621b5ed6 1965 else
d5478783 1966 opts->x_warn_strict_aliasing = 0;
79bedddc
SR
1967}
1968
058de654
NB
1969/* The following routines are useful in setting all the flags that
1970 -ffast-math and -fno-fast-math imply. */
7bb3487f 1971static void
d5478783 1972set_fast_math_flags (struct gcc_options *opts, int set)
058de654 1973{
5e46b0c6
ILT
1974 if (!opts->frontend_set_flag_unsafe_math_optimizations)
1975 {
1976 opts->x_flag_unsafe_math_optimizations = set;
1977 set_unsafe_math_optimizations_flags (opts, set);
1978 }
1979 if (!opts->frontend_set_flag_finite_math_only)
1980 opts->x_flag_finite_math_only = set;
1981 if (!opts->frontend_set_flag_errno_math)
1982 opts->x_flag_errno_math = !set;
058de654 1983 if (set)
039c3d42 1984 {
5e46b0c6
ILT
1985 if (!opts->frontend_set_flag_signaling_nans)
1986 opts->x_flag_signaling_nans = 0;
1987 if (!opts->frontend_set_flag_rounding_math)
1988 opts->x_flag_rounding_math = 0;
1989 if (!opts->frontend_set_flag_cx_limited_range)
1990 opts->x_flag_cx_limited_range = 1;
039c3d42 1991 }
058de654
NB
1992}
1993
b8698a0f
L
1994/* When -funsafe-math-optimizations is set the following
1995 flags are set as well. */
7bb3487f 1996static void
d5478783 1997set_unsafe_math_optimizations_flags (struct gcc_options *opts, int set)
a1a82611 1998{
5e46b0c6
ILT
1999 if (!opts->frontend_set_flag_trapping_math)
2000 opts->x_flag_trapping_math = !set;
2001 if (!opts->frontend_set_flag_signed_zeros)
2002 opts->x_flag_signed_zeros = !set;
2003 if (!opts->frontend_set_flag_associative_math)
2004 opts->x_flag_associative_math = set;
2005 if (!opts->frontend_set_flag_reciprocal_math)
2006 opts->x_flag_reciprocal_math = set;
a1a82611
RE
2007}
2008
0576d21f 2009/* Return true iff flags in OPTS are set as if -ffast-math. */
058de654 2010bool
0576d21f 2011fast_math_flags_set_p (const struct gcc_options *opts)
058de654 2012{
0576d21f
JM
2013 return (!opts->x_flag_trapping_math
2014 && opts->x_flag_unsafe_math_optimizations
2015 && opts->x_flag_finite_math_only
2016 && !opts->x_flag_signed_zeros
2017 && !opts->x_flag_errno_math);
058de654 2018}
cf03fd63 2019
ab442df7
MM
2020/* Return true iff flags are set as if -ffast-math but using the flags stored
2021 in the struct cl_optimization structure. */
2022bool
2023fast_math_flags_struct_set_p (struct cl_optimization *opt)
2024{
e3339d0f
JM
2025 return (!opt->x_flag_trapping_math
2026 && opt->x_flag_unsafe_math_optimizations
2027 && opt->x_flag_finite_math_only
2028 && !opt->x_flag_signed_zeros
2029 && !opt->x_flag_errno_math);
ab442df7
MM
2030}
2031
0576d21f
JM
2032/* Handle a debug output -g switch for options OPTS
2033 (OPTS_SET->x_write_symbols storing whether a debug type was passed
299404a1
JM
2034 explicitly), location LOC. EXTENDED is true or false to support
2035 extended output (2 is special and means "-ggdb" was given). */
df38ffef 2036static void
0576d21f 2037set_debug_level (enum debug_info_type type, int extended, const char *arg,
299404a1
JM
2038 struct gcc_options *opts, struct gcc_options *opts_set,
2039 location_t loc)
df38ffef 2040{
0576d21f 2041 opts->x_use_gnu_debug_info_extensions = extended;
df38ffef
NB
2042
2043 if (type == NO_DEBUG)
2044 {
0576d21f 2045 if (opts->x_write_symbols == NO_DEBUG)
df38ffef 2046 {
0576d21f 2047 opts->x_write_symbols = PREFERRED_DEBUGGING_TYPE;
df38ffef
NB
2048
2049 if (extended == 2)
2050 {
2051#ifdef DWARF2_DEBUGGING_INFO
0576d21f 2052 opts->x_write_symbols = DWARF2_DEBUG;
df38ffef 2053#elif defined DBX_DEBUGGING_INFO
0576d21f 2054 opts->x_write_symbols = DBX_DEBUG;
df38ffef
NB
2055#endif
2056 }
2057
0576d21f 2058 if (opts->x_write_symbols == NO_DEBUG)
299404a1 2059 warning_at (loc, 0, "target system does not support debug output");
df38ffef
NB
2060 }
2061 }
2062 else
2063 {
2064 /* Does it conflict with an already selected type? */
0576d21f
JM
2065 if (opts_set->x_write_symbols != NO_DEBUG
2066 && opts->x_write_symbols != NO_DEBUG
2067 && type != opts->x_write_symbols)
299404a1
JM
2068 error_at (loc, "debug format \"%s\" conflicts with prior selection",
2069 debug_type_names[type]);
0576d21f
JM
2070 opts->x_write_symbols = type;
2071 opts_set->x_write_symbols = type;
df38ffef
NB
2072 }
2073
2074 /* A debug flag without a level defaults to level 2. */
2075 if (*arg == '\0')
2076 {
0576d21f
JM
2077 if (!opts->x_debug_info_level)
2078 opts->x_debug_info_level = DINFO_LEVEL_NORMAL;
df38ffef
NB
2079 }
2080 else
2081 {
32e8bb8e
ILT
2082 int argval = integral_argument (arg);
2083 if (argval == -1)
299404a1 2084 error_at (loc, "unrecognised debug output level \"%s\"", arg);
32e8bb8e 2085 else if (argval > 3)
299404a1 2086 error_at (loc, "debug output level %s is too high", arg);
32e8bb8e 2087 else
0576d21f 2088 opts->x_debug_info_level = (enum debug_info_levels) argval;
df38ffef
NB
2089 }
2090}
2091
299404a1
JM
2092/* Arrange to dump core on error for diagnostic context DC. (The
2093 regular error message is still printed first, except in the case of
2094 abort ().) */
75685792 2095
c98cd5bf 2096static void
299404a1 2097setup_core_dumping (diagnostic_context *dc)
75685792 2098{
c98cd5bf
JM
2099#ifdef SIGABRT
2100 signal (SIGABRT, SIG_DFL);
2101#endif
2102#if defined(HAVE_SETRLIMIT)
2103 {
2104 struct rlimit rlim;
2105 if (getrlimit (RLIMIT_CORE, &rlim) != 0)
2106 fatal_error ("getting core file size maximum limit: %m");
2107 rlim.rlim_cur = rlim.rlim_max;
2108 if (setrlimit (RLIMIT_CORE, &rlim) != 0)
2109 fatal_error ("setting core file size limit to maximum: %m");
2110 }
2111#endif
299404a1 2112 diagnostic_abort_on_error (dc);
75685792 2113}
5c60a017 2114
299404a1
JM
2115/* Parse a -d<ARG> command line switch for OPTS, location LOC,
2116 diagnostic context DC. */
5c60a017 2117
c98cd5bf 2118static void
299404a1
JM
2119decode_d_option (const char *arg, struct gcc_options *opts,
2120 location_t loc, diagnostic_context *dc)
5c60a017 2121{
c98cd5bf 2122 int c;
5c60a017 2123
c98cd5bf
JM
2124 while (*arg)
2125 switch (c = *arg++)
2126 {
2127 case 'A':
299404a1 2128 opts->x_flag_debug_asm = 1;
c98cd5bf
JM
2129 break;
2130 case 'p':
299404a1 2131 opts->x_flag_print_asm_name = 1;
c98cd5bf
JM
2132 break;
2133 case 'P':
299404a1
JM
2134 opts->x_flag_dump_rtl_in_asm = 1;
2135 opts->x_flag_print_asm_name = 1;
c98cd5bf 2136 break;
c98cd5bf 2137 case 'x':
299404a1 2138 opts->x_rtl_dump_and_exit = 1;
c98cd5bf
JM
2139 break;
2140 case 'D': /* These are handled by the preprocessor. */
2141 case 'I':
2142 case 'M':
2143 case 'N':
2144 case 'U':
2145 break;
2146 case 'H':
299404a1 2147 setup_core_dumping (dc);
c98cd5bf
JM
2148 break;
2149 case 'a':
299404a1 2150 opts->x_flag_dump_all_passed = true;
c98cd5bf 2151 break;
21bf1558 2152
c98cd5bf 2153 default:
299404a1 2154 warning_at (loc, 0, "unrecognized gcc debugging option: %c", c);
c98cd5bf
JM
2155 break;
2156 }
5c60a017 2157}
dc90f45b 2158
1ebe4b4f 2159/* Enable (or disable if VALUE is 0) a warning option ARG (language
c5fa0890
JM
2160 mask LANG_MASK, option handlers HANDLERS) as an error for option
2161 structures OPTS and OPTS_SET, diagnostic context DC (possibly
2162 NULL), location LOC. This is used by -Werror=. */
dc90f45b 2163
a4d8c676 2164static void
5f20c657 2165enable_warning_as_error (const char *arg, int value, unsigned int lang_mask,
1ebe4b4f 2166 const struct cl_option_handlers *handlers,
c5fa0890
JM
2167 struct gcc_options *opts,
2168 struct gcc_options *opts_set,
a4d8c676 2169 location_t loc, diagnostic_context *dc)
dc90f45b
MLI
2170{
2171 char *new_option;
2172 int option_index;
2173
2174 new_option = XNEWVEC (char, strlen (arg) + 2);
2175 new_option[0] = 'W';
2176 strcpy (new_option + 1, arg);
2177 option_index = find_opt (new_option, lang_mask);
6e2f1956 2178 if (option_index == OPT_SPECIAL_unknown)
dc90f45b 2179 {
299404a1 2180 error_at (loc, "-Werror=%s: no option -%s", arg, new_option);
dc90f45b
MLI
2181 }
2182 else
2183 {
87cf0651
SB
2184 const diagnostic_t kind = value ? DK_ERROR : DK_WARNING;
2185
c5fa0890
JM
2186 control_warning_option (option_index, (int) kind, value,
2187 loc, lang_mask,
2188 handlers, opts, opts_set, dc);
dc90f45b
MLI
2189 }
2190 free (new_option);
2191}
5f0f4a3b
JM
2192
2193/* Return malloced memory for the name of the option OPTION_INDEX
2194 which enabled a diagnostic (context CONTEXT), originally of type
2195 ORIG_DIAG_KIND but possibly converted to DIAG_KIND by options such
2196 as -Werror. */
2197
2198char *
2199option_name (diagnostic_context *context, int option_index,
2200 diagnostic_t orig_diag_kind, diagnostic_t diag_kind)
2201{
2202 if (option_index)
2203 {
2204 /* A warning classified as an error. */
2205 if ((orig_diag_kind == DK_WARNING || orig_diag_kind == DK_PEDWARN)
2206 && diag_kind == DK_ERROR)
2207 return concat (cl_options[OPT_Werror_].opt_text,
2208 /* Skip over "-W". */
2209 cl_options[option_index].opt_text + 2,
2210 NULL);
2211 /* A warning with option. */
2212 else
2213 return xstrdup (cl_options[option_index].opt_text);
2214 }
2215 /* A warning without option classified as an error. */
2216 else if (orig_diag_kind == DK_WARNING || orig_diag_kind == DK_PEDWARN
2217 || diag_kind == DK_WARNING)
2218 {
2219 if (context->warning_as_error_requested)
2220 return xstrdup (cl_options[OPT_Werror].opt_text);
2221 else
2222 return xstrdup (_("enabled by default"));
2223 }
2224 else
2225 return NULL;
2226}