]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/opts-global.c
Update copyright years.
[thirdparty/gcc.git] / gcc / opts-global.c
CommitLineData
21bf1558
JM
1/* Command line option handling. Code involving global state that
2 should not be shared with the driver.
85ec4feb 3 Copyright (C) 2002-2018 Free Software Foundation, Inc.
21bf1558
JM
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
9Software Foundation; either version 3, or (at your option) any later
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
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
20
21#include "config.h"
22#include "system.h"
23#include "coretypes.h"
957060b5 24#include "backend.h"
957060b5
AM
25#include "rtl.h"
26#include "tree.h"
957060b5 27#include "tree-pass.h"
c98cd5bf 28#include "diagnostic.h"
21bf1558
JM
29#include "opts.h"
30#include "flags.h"
c98cd5bf 31#include "langhooks.h"
299404a1
JM
32#include "dbgcnt.h"
33#include "debug.h"
21bf1558
JM
34#include "output.h"
35#include "plugin.h"
c98cd5bf 36#include "toplev.h"
47e0da37 37#include "context.h"
314e6352
ML
38#include "stringpool.h"
39#include "attribs.h"
fd960af2 40#include "asan.h"
21bf1558 41
c98cd5bf 42typedef const char *const_char_p; /* For DEF_VEC_P. */
c98cd5bf 43
9771b263 44static vec<const_char_p> ignored_options;
c98cd5bf
JM
45
46/* Input file names. */
47const char **in_fnames;
48unsigned num_in_fnames;
49
50/* Return a malloced slash-separated list of languages in MASK. */
51
c1822f9c 52char *
c98cd5bf
JM
53write_langs (unsigned int mask)
54{
55 unsigned int n = 0, len = 0;
56 const char *lang_name;
57 char *result;
58
59 for (n = 0; (lang_name = lang_names[n]) != 0; n++)
60 if (mask & (1U << n))
61 len += strlen (lang_name) + 1;
62
63 result = XNEWVEC (char, len);
64 len = 0;
65 for (n = 0; (lang_name = lang_names[n]) != 0; n++)
66 if (mask & (1U << n))
67 {
68 if (len)
69 result[len++] = '/';
70 strcpy (result + len, lang_name);
71 len += strlen (lang_name);
72 }
73
74 result[len] = 0;
75
76 return result;
77}
78
79/* Complain that switch DECODED does not apply to this front end (mask
80 LANG_MASK). */
81
82static void
83complain_wrong_lang (const struct cl_decoded_option *decoded,
84 unsigned int lang_mask)
85{
86 const struct cl_option *option = &cl_options[decoded->opt_index];
87 const char *text = decoded->orig_option_with_args_text;
88 char *ok_langs = NULL, *bad_lang = NULL;
89 unsigned int opt_flags = option->flags;
90
91 if (!lang_hooks.complain_wrong_lang_p (option))
92 return;
93
94 opt_flags &= ((1U << cl_lang_count) - 1) | CL_DRIVER;
95 if (opt_flags != CL_DRIVER)
96 ok_langs = write_langs (opt_flags);
97 if (lang_mask != CL_DRIVER)
98 bad_lang = write_langs (lang_mask);
99
100 if (opt_flags == CL_DRIVER)
101 error ("command line option %qs is valid for the driver but not for %s",
102 text, bad_lang);
103 else if (lang_mask == CL_DRIVER)
104 gcc_unreachable ();
105 else
106 /* Eventually this should become a hard error IMO. */
107 warning (0, "command line option %qs is valid for %s but not for %s",
108 text, ok_langs, bad_lang);
109
110 free (ok_langs);
111 free (bad_lang);
112}
113
114/* Buffer the unknown option described by the string OPT. Currently,
115 we only complain about unknown -Wno-* options if they may have
116 prevented a diagnostic. Otherwise, we just ignore them. Note that
117 if we do complain, it is only as a warning, not an error; passing
778e02fd 118 the compiler an unrecognized -Wno-* option should never change
c98cd5bf
JM
119 whether the compilation succeeds or fails. */
120
121static void
122postpone_unknown_option_warning (const char *opt)
123{
9771b263 124 ignored_options.safe_push (opt);
c98cd5bf
JM
125}
126
127/* Produce a warning for each option previously buffered. */
128
129void
130print_ignored_options (void)
131{
9771b263 132 while (!ignored_options.is_empty ())
c98cd5bf
JM
133 {
134 const char *opt;
135
9771b263 136 opt = ignored_options.pop ();
c98cd5bf 137 warning_at (UNKNOWN_LOCATION, 0,
778e02fd 138 "unrecognized command line option %qs", opt);
c98cd5bf
JM
139 }
140}
141
142/* Handle an unknown option DECODED, returning true if an error should
143 be given. */
144
145static bool
146unknown_option_callback (const struct cl_decoded_option *decoded)
147{
148 const char *opt = decoded->arg;
149
150 if (opt[1] == 'W' && opt[2] == 'n' && opt[3] == 'o' && opt[4] == '-'
151 && !(decoded->errors & CL_ERR_NEGATIVE))
152 {
153 /* We don't generate warnings for unknown -Wno-* options unless
154 we issue diagnostics. */
155 postpone_unknown_option_warning (opt);
156 return false;
157 }
158 else
159 return true;
160}
161
c98cd5bf
JM
162/* Handle a front-end option; arguments and return value as for
163 handle_option. */
164
165static bool
166lang_handle_option (struct gcc_options *opts,
167 struct gcc_options *opts_set,
168 const struct cl_decoded_option *decoded,
169 unsigned int lang_mask ATTRIBUTE_UNUSED, int kind,
170 location_t loc,
171 const struct cl_option_handlers *handlers,
130fcab0
ML
172 diagnostic_context *dc,
173 void (*) (void))
c98cd5bf
JM
174{
175 gcc_assert (opts == &global_options);
176 gcc_assert (opts_set == &global_options_set);
177 gcc_assert (dc == global_dc);
178 gcc_assert (decoded->canonical_option_num_elements <= 2);
179 return lang_hooks.handle_option (decoded->opt_index, decoded->arg,
180 decoded->value, kind, loc, handlers);
181}
182
183/* Handle FILENAME from the command line. */
184
185static void
186add_input_filename (const char *filename)
187{
188 num_in_fnames++;
189 in_fnames = XRESIZEVEC (const char *, in_fnames, num_in_fnames);
190 in_fnames[num_in_fnames - 1] = filename;
191}
192
193/* Handle the vector of command line options (located at LOC), storing
194 the results of processing DECODED_OPTIONS and DECODED_OPTIONS_COUNT
195 in OPTS and OPTS_SET and using DC for diagnostic state. LANG_MASK
196 contains has a single bit set representing the current language.
197 HANDLERS describes what functions to call for the options. */
198
199static void
200read_cmdline_options (struct gcc_options *opts, struct gcc_options *opts_set,
201 struct cl_decoded_option *decoded_options,
202 unsigned int decoded_options_count,
203 location_t loc,
204 unsigned int lang_mask,
205 const struct cl_option_handlers *handlers,
206 diagnostic_context *dc)
207{
208 unsigned int i;
209
210 for (i = 1; i < decoded_options_count; i++)
211 {
212 if (decoded_options[i].opt_index == OPT_SPECIAL_input_file)
213 {
214 /* Input files should only ever appear on the main command
215 line. */
216 gcc_assert (opts == &global_options);
217 gcc_assert (opts_set == &global_options_set);
218
a803773f 219 if (opts->x_main_input_filename == NULL)
c98cd5bf 220 {
a803773f
JM
221 opts->x_main_input_filename = decoded_options[i].arg;
222 opts->x_main_input_baselength
223 = base_of_path (opts->x_main_input_filename,
224 &opts->x_main_input_basename);
c98cd5bf
JM
225 }
226 add_input_filename (decoded_options[i].arg);
227 continue;
228 }
229
230 read_cmdline_option (opts, opts_set,
231 decoded_options + i, loc, lang_mask, handlers,
232 dc);
233 }
234}
235
236/* Language mask determined at initialization. */
237static unsigned int initial_lang_mask;
238
239/* Initialize global options-related settings at start-up. */
240
241void
242init_options_once (void)
243{
244 /* Perform language-specific options initialization. */
245 initial_lang_mask = lang_hooks.option_lang_mask ();
246
247 lang_hooks.initialize_diagnostics (global_dc);
97aa8bb6
MLI
248 /* ??? Ideally, we should do this earlier and the FEs will override
249 it if desired (none do it so far). However, the way the FEs
250 construct their pretty-printers means that all previous settings
251 are overriden. */
252 diagnostic_color_init (global_dc);
c98cd5bf
JM
253}
254
255/* Decode command-line options to an array, like
256 decode_cmdline_options_to_array and with the same arguments but
257 using the default lang_mask. */
258
259void
260decode_cmdline_options_to_array_default_mask (unsigned int argc,
261 const char **argv,
262 struct cl_decoded_option **decoded_options,
263 unsigned int *decoded_options_count)
264{
265 decode_cmdline_options_to_array (argc, argv,
266 initial_lang_mask | CL_COMMON | CL_TARGET,
267 decoded_options, decoded_options_count);
268}
269
270/* Set *HANDLERS to the default set of option handlers for use in the
271 compilers proper (not the driver). */
272void
130fcab0
ML
273set_default_handlers (struct cl_option_handlers *handlers,
274 void (*target_option_override_hook) (void))
c98cd5bf
JM
275{
276 handlers->unknown_option_callback = unknown_option_callback;
277 handlers->wrong_lang_callback = complain_wrong_lang;
130fcab0 278 handlers->target_option_override_hook = target_option_override_hook;
c98cd5bf
JM
279 handlers->num_handlers = 3;
280 handlers->handlers[0].handler = lang_handle_option;
281 handlers->handlers[0].mask = initial_lang_mask;
282 handlers->handlers[1].handler = common_handle_option;
283 handlers->handlers[1].mask = CL_COMMON;
284 handlers->handlers[2].handler = target_handle_option;
285 handlers->handlers[2].mask = CL_TARGET;
286}
287
288/* Parse command line options and set default flag values. Do minimal
289 options processing. The decoded options are in *DECODED_OPTIONS
290 and *DECODED_OPTIONS_COUNT; settings go in OPTS, OPTS_SET and DC;
291 the options are located at LOC. */
292void
293decode_options (struct gcc_options *opts, struct gcc_options *opts_set,
294 struct cl_decoded_option *decoded_options,
295 unsigned int decoded_options_count,
130fcab0
ML
296 location_t loc, diagnostic_context *dc,
297 void (*target_option_override_hook) (void))
c98cd5bf
JM
298{
299 struct cl_option_handlers handlers;
300
301 unsigned int lang_mask;
302
303 lang_mask = initial_lang_mask;
304
130fcab0 305 set_default_handlers (&handlers, target_option_override_hook);
c98cd5bf 306
c98cd5bf
JM
307 default_options_optimization (opts, opts_set,
308 decoded_options, decoded_options_count,
309 loc, lang_mask, &handlers, dc);
310
c98cd5bf
JM
311 read_cmdline_options (opts, opts_set,
312 decoded_options, decoded_options_count,
313 loc, lang_mask,
314 &handlers, dc);
315
299404a1 316 finish_options (opts, opts_set, loc);
c98cd5bf
JM
317}
318
ecf835e9
KN
319/* Hold command-line options associated with stack limitation. */
320const char *opt_fstack_limit_symbol_arg = NULL;
321int opt_fstack_limit_register_no = -1;
322
c98cd5bf
JM
323/* Process common options that have been deferred until after the
324 handlers have been called for all options. */
325
21bf1558
JM
326void
327handle_common_deferred_options (void)
328{
329 unsigned int i;
330 cl_deferred_option *opt;
9771b263
DN
331 vec<cl_deferred_option> v;
332
333 if (common_deferred_options)
334 v = *((vec<cl_deferred_option> *) common_deferred_options);
335 else
6e1aa848 336 v = vNULL;
21bf1558 337
299404a1
JM
338 if (flag_dump_all_passed)
339 enable_rtl_dump_file ();
340
78c60e3d
SS
341 if (flag_opt_info)
342 opt_info_switch_p (NULL);
343
9771b263 344 FOR_EACH_VEC_ELT (v, i, opt)
21bf1558
JM
345 {
346 switch (opt->opt_index)
347 {
348 case OPT_fcall_used_:
349 fix_register (opt->arg, 0, 1);
350 break;
351
352 case OPT_fcall_saved_:
353 fix_register (opt->arg, 0, 0);
354 break;
355
299404a1
JM
356 case OPT_fdbg_cnt_:
357 dbg_cnt_process_opt (opt->arg);
358 break;
359
360 case OPT_fdbg_cnt_list:
361 dbg_cnt_list_all_counters ();
362 break;
363
364 case OPT_fdebug_prefix_map_:
365 add_debug_prefix_map (opt->arg);
366 break;
367
21bf1558 368 case OPT_fdump_:
47e0da37 369 if (!g->get_dumps ()->dump_switch_p (opt->arg))
21bf1558
JM
370 error ("unrecognized command line option %<-fdump-%s%>", opt->arg);
371 break;
372
78c60e3d
SS
373 case OPT_fopt_info_:
374 if (!opt_info_switch_p (opt->arg))
2b4e6bf1 375 error ("unrecognized command line option %<-fopt-info-%s%>",
78c60e3d
SS
376 opt->arg);
377 break;
378
226c52aa
XDL
379 case OPT_fenable_:
380 case OPT_fdisable_:
381 if (opt->opt_index == OPT_fenable_)
382 enable_pass (opt->arg);
383 else
384 disable_pass (opt->arg);
385 break;
386
21bf1558
JM
387 case OPT_ffixed_:
388 /* Deferred. */
389 fix_register (opt->arg, 1, 1);
390 break;
391
392 case OPT_fplugin_:
393#ifdef ENABLE_PLUGIN
394 add_new_plugin (opt->arg);
395#else
396 error ("plugin support is disabled; configure with --enable-plugin");
397#endif
398 break;
399
400 case OPT_fplugin_arg_:
401#ifdef ENABLE_PLUGIN
402 parse_plugin_arg_opt (opt->arg);
403#else
404 error ("plugin support is disabled; configure with --enable-plugin");
405#endif
406 break;
407
299404a1
JM
408 case OPT_frandom_seed:
409 /* The real switch is -fno-random-seed. */
410 if (!opt->value)
411 set_random_seed (NULL);
412 break;
413
414 case OPT_frandom_seed_:
415 set_random_seed (opt->arg);
416 break;
417
21bf1558
JM
418 case OPT_fstack_limit:
419 /* The real switch is -fno-stack-limit. */
299404a1
JM
420 if (!opt->value)
421 stack_limit_rtx = NULL_RTX;
21bf1558
JM
422 break;
423
424 case OPT_fstack_limit_register_:
425 {
426 int reg = decode_reg_name (opt->arg);
427 if (reg < 0)
428 error ("unrecognized register name %qs", opt->arg);
429 else
ecf835e9
KN
430 {
431 /* Deactivate previous OPT_fstack_limit_symbol_ options. */
432 opt_fstack_limit_symbol_arg = NULL;
433 opt_fstack_limit_register_no = reg;
434 }
21bf1558
JM
435 }
436 break;
437
438 case OPT_fstack_limit_symbol_:
ecf835e9
KN
439 /* Deactivate previous OPT_fstack_limit_register_ options. */
440 opt_fstack_limit_register_no = -1;
441 opt_fstack_limit_symbol_arg = opt->arg;
21bf1558
JM
442 break;
443
fd960af2
YG
444 case OPT_fasan_shadow_offset_:
445 if (!(flag_sanitize & SANITIZE_KERNEL_ADDRESS))
446 error ("-fasan-shadow-offset should only be used "
447 "with -fsanitize=kernel-address");
448 if (!set_asan_shadow_offset (opt->arg))
449 error ("unrecognized shadow offset %qs", opt->arg);
450 break;
451
18af8d16
YG
452 case OPT_fsanitize_sections_:
453 set_sanitized_sections (opt->arg);
454 break;
455
21bf1558
JM
456 default:
457 gcc_unreachable ();
458 }
459 }
460}