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