]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/c-family/c-opts.c
17e1958ad58d63c16f6f49e21d70c8feee713670
[thirdparty/gcc.git] / gcc / c-family / c-opts.c
1 /* C/ObjC/C++ 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 "coretypes.h"
25 #include "tree.h"
26 #include "c-common.h"
27 #include "c-pragma.h"
28 #include "flags.h"
29 #include "toplev.h"
30 #include "langhooks.h"
31 #include "diagnostic.h"
32 #include "intl.h"
33 #include "cppdefault.h"
34 #include "incpath.h"
35 #include "debug.h" /* For debug_hooks. */
36 #include "opts.h"
37 #include "options.h"
38 #include "mkdeps.h"
39 #include "c-target.h"
40 #include "tm.h" /* For BYTES_BIG_ENDIAN,
41 DOLLARS_IN_IDENTIFIERS,
42 STDC_0_IN_SYSTEM_HEADERS,
43 TARGET_FLT_EVAL_METHOD_NON_DEFAULT and
44 TARGET_OPTF. */
45 #include "tm_p.h" /* For C_COMMON_OVERRIDE_OPTIONS. */
46
47 #ifndef DOLLARS_IN_IDENTIFIERS
48 # define DOLLARS_IN_IDENTIFIERS true
49 #endif
50
51 #ifndef TARGET_SYSTEM_ROOT
52 # define TARGET_SYSTEM_ROOT NULL
53 #endif
54
55 #ifndef TARGET_OPTF
56 #define TARGET_OPTF(ARG)
57 #endif
58
59 /* CPP's options. */
60 cpp_options *cpp_opts;
61
62 /* Input filename. */
63 static const char *this_input_filename;
64
65 /* Filename and stream for preprocessed output. */
66 static const char *out_fname;
67 static FILE *out_stream;
68
69 /* Append dependencies to deps_file. */
70 static bool deps_append;
71
72 /* If dependency switches (-MF etc.) have been given. */
73 static bool deps_seen;
74
75 /* If -v seen. */
76 static bool verbose;
77
78 /* Dependency output file. */
79 static const char *deps_file;
80
81 /* The prefix given by -iprefix, if any. */
82 static const char *iprefix;
83
84 /* The multilib directory given by -imultilib, if any. */
85 static const char *imultilib;
86
87 /* The system root, if any. Overridden by -isysroot. */
88 static const char *sysroot = TARGET_SYSTEM_ROOT;
89
90 /* Zero disables all standard directories for headers. */
91 static bool std_inc = true;
92
93 /* Zero disables the C++-specific standard directories for headers. */
94 static bool std_cxx_inc = true;
95
96 /* If the quote chain has been split by -I-. */
97 static bool quote_chain_split;
98
99 /* If -Wunused-macros. */
100 static bool warn_unused_macros;
101
102 /* If -Wvariadic-macros. */
103 static bool warn_variadic_macros = true;
104
105 /* Number of deferred options. */
106 static size_t deferred_count;
107
108 /* Number of deferred options scanned for -include. */
109 static size_t include_cursor;
110
111 static void handle_OPT_d (const char *);
112 static void set_std_cxx98 (int);
113 static void set_std_cxx11 (int);
114 static void set_std_cxx1y (int);
115 static void set_std_c89 (int, int);
116 static void set_std_c99 (int);
117 static void set_std_c11 (int);
118 static void check_deps_environment_vars (void);
119 static void handle_deferred_opts (void);
120 static void sanitize_cpp_opts (void);
121 static void add_prefixed_path (const char *, size_t);
122 static void push_command_line_include (void);
123 static void cb_file_change (cpp_reader *, const struct line_map *);
124 static void cb_dir_change (cpp_reader *, const char *);
125 static void c_finish_options (void);
126
127 #ifndef STDC_0_IN_SYSTEM_HEADERS
128 #define STDC_0_IN_SYSTEM_HEADERS 0
129 #endif
130
131 /* Holds switches parsed by c_common_handle_option (), but whose
132 handling is deferred to c_common_post_options (). */
133 static void defer_opt (enum opt_code, const char *);
134 static struct deferred_opt
135 {
136 enum opt_code code;
137 const char *arg;
138 } *deferred_opts;
139
140
141 extern const unsigned int
142 c_family_lang_mask = (CL_C | CL_CXX | CL_ObjC | CL_ObjCXX);
143
144 /* Defer option CODE with argument ARG. */
145 static void
146 defer_opt (enum opt_code code, const char *arg)
147 {
148 deferred_opts[deferred_count].code = code;
149 deferred_opts[deferred_count].arg = arg;
150 deferred_count++;
151 }
152
153 /* Return language mask for option parsing. */
154 unsigned int
155 c_common_option_lang_mask (void)
156 {
157 static const unsigned int lang_flags[] = {CL_C, CL_ObjC, CL_CXX, CL_ObjCXX};
158
159 return lang_flags[c_language];
160 }
161
162 /* Common diagnostics initialization. */
163 void
164 c_common_initialize_diagnostics (diagnostic_context *context)
165 {
166 /* This is conditionalized only because that is the way the front
167 ends used to do it. Maybe this should be unconditional? */
168 if (c_dialect_cxx ())
169 {
170 /* By default wrap lines at 80 characters. Is getenv
171 ("COLUMNS") preferable? */
172 diagnostic_line_cutoff (context) = 80;
173 /* By default, emit location information once for every
174 diagnostic message. */
175 diagnostic_prefixing_rule (context) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
176 }
177
178 context->opt_permissive = OPT_fpermissive;
179 }
180
181 /* Whether options from all C-family languages should be accepted
182 quietly. */
183 static bool accept_all_c_family_options = false;
184
185 /* Return whether to complain about a wrong-language option. */
186 bool
187 c_common_complain_wrong_lang_p (const struct cl_option *option)
188 {
189 if (accept_all_c_family_options
190 && (option->flags & c_family_lang_mask))
191 return false;
192
193 return true;
194 }
195
196 /* Initialize options structure OPTS. */
197 void
198 c_common_init_options_struct (struct gcc_options *opts)
199 {
200 opts->x_flag_exceptions = c_dialect_cxx ();
201 opts->x_warn_pointer_arith = c_dialect_cxx ();
202 opts->x_warn_write_strings = c_dialect_cxx ();
203 opts->x_flag_warn_unused_result = true;
204
205 /* By default, C99-like requirements for complex multiply and divide. */
206 opts->x_flag_complex_method = 2;
207 }
208
209 /* Common initialization before calling option handlers. */
210 void
211 c_common_init_options (unsigned int decoded_options_count,
212 struct cl_decoded_option *decoded_options)
213 {
214 unsigned int i;
215 struct cpp_callbacks *cb;
216
217 parse_in = cpp_create_reader (c_dialect_cxx () ? CLK_GNUCXX: CLK_GNUC89,
218 ident_hash, line_table);
219 cb = cpp_get_callbacks (parse_in);
220 cb->error = c_cpp_error;
221
222 cpp_opts = cpp_get_options (parse_in);
223 cpp_opts->dollars_in_ident = DOLLARS_IN_IDENTIFIERS;
224 cpp_opts->objc = c_dialect_objc ();
225
226 /* Reset to avoid warnings on internal definitions. We set it just
227 before passing on command-line options to cpplib. */
228 cpp_opts->warn_dollars = 0;
229
230 deferred_opts = XNEWVEC (struct deferred_opt, decoded_options_count);
231
232 if (c_language == clk_c)
233 {
234 /* If preprocessing assembly language, accept any of the C-family
235 front end options since the driver may pass them through. */
236 for (i = 1; i < decoded_options_count; i++)
237 if (decoded_options[i].opt_index == OPT_lang_asm)
238 {
239 accept_all_c_family_options = true;
240 break;
241 }
242 }
243 }
244
245 /* Handle switch SCODE with argument ARG. VALUE is true, unless no-
246 form of an -f or -W option was given. Returns false if the switch was
247 invalid, true if valid. Use HANDLERS in recursive handle_option calls. */
248 bool
249 c_common_handle_option (size_t scode, const char *arg, int value,
250 int kind, location_t loc,
251 const struct cl_option_handlers *handlers)
252 {
253 const struct cl_option *option = &cl_options[scode];
254 enum opt_code code = (enum opt_code) scode;
255 bool result = true;
256
257 /* Prevent resetting the language standard to a C dialect when the driver
258 has already determined that we're looking at assembler input. */
259 bool preprocessing_asm_p = (cpp_get_options (parse_in)->lang == CLK_ASM);
260
261 switch (code)
262 {
263 default:
264 if (cl_options[code].flags & c_family_lang_mask)
265 {
266 if ((option->flags & CL_TARGET)
267 && ! targetcm.handle_c_option (scode, arg, value))
268 result = false;
269 break;
270 }
271 result = false;
272 break;
273
274 case OPT__output_pch_:
275 pch_file = arg;
276 break;
277
278 case OPT_A:
279 defer_opt (code, arg);
280 break;
281
282 case OPT_C:
283 cpp_opts->discard_comments = 0;
284 break;
285
286 case OPT_CC:
287 cpp_opts->discard_comments = 0;
288 cpp_opts->discard_comments_in_macro_exp = 0;
289 break;
290
291 case OPT_D:
292 defer_opt (code, arg);
293 break;
294
295 case OPT_H:
296 cpp_opts->print_include_names = 1;
297 break;
298
299 case OPT_F:
300 TARGET_OPTF (xstrdup (arg));
301 break;
302
303 case OPT_I:
304 if (strcmp (arg, "-"))
305 add_path (xstrdup (arg), BRACKET, 0, true);
306 else
307 {
308 if (quote_chain_split)
309 error ("-I- specified twice");
310 quote_chain_split = true;
311 split_quote_chain ();
312 inform (input_location, "obsolete option -I- used, please use -iquote instead");
313 }
314 break;
315
316 case OPT_M:
317 case OPT_MM:
318 /* When doing dependencies with -M or -MM, suppress normal
319 preprocessed output, but still do -dM etc. as software
320 depends on this. Preprocessed output does occur if -MD, -MMD
321 or environment var dependency generation is used. */
322 cpp_opts->deps.style = (code == OPT_M ? DEPS_SYSTEM: DEPS_USER);
323 flag_no_output = 1;
324 break;
325
326 case OPT_MD:
327 case OPT_MMD:
328 cpp_opts->deps.style = (code == OPT_MD ? DEPS_SYSTEM: DEPS_USER);
329 cpp_opts->deps.need_preprocessor_output = true;
330 deps_file = arg;
331 break;
332
333 case OPT_MF:
334 deps_seen = true;
335 deps_file = arg;
336 break;
337
338 case OPT_MG:
339 deps_seen = true;
340 cpp_opts->deps.missing_files = true;
341 break;
342
343 case OPT_MP:
344 deps_seen = true;
345 cpp_opts->deps.phony_targets = true;
346 break;
347
348 case OPT_MQ:
349 case OPT_MT:
350 deps_seen = true;
351 defer_opt (code, arg);
352 break;
353
354 case OPT_P:
355 flag_no_line_commands = 1;
356 break;
357
358 case OPT_U:
359 defer_opt (code, arg);
360 break;
361
362 case OPT_Wall:
363 warn_unused = value;
364 set_Wformat (value);
365 handle_generated_option (&global_options, &global_options_set,
366 OPT_Wimplicit, NULL, value,
367 c_family_lang_mask, kind, loc,
368 handlers, global_dc);
369 warn_char_subscripts = value;
370 warn_missing_braces = value;
371 warn_parentheses = value;
372 warn_return_type = value;
373 warn_sequence_point = value; /* Was C only. */
374 warn_switch = value;
375 if (warn_strict_aliasing == -1)
376 set_Wstrict_aliasing (&global_options, value);
377 warn_address = value;
378 if (warn_strict_overflow == -1)
379 warn_strict_overflow = value;
380 warn_array_bounds = value;
381 warn_volatile_register_var = value;
382
383 /* Only warn about unknown pragmas that are not in system
384 headers. */
385 warn_unknown_pragmas = value;
386
387 warn_uninitialized = value;
388 warn_maybe_uninitialized = value;
389
390 if (!c_dialect_cxx ())
391 {
392 /* We set this to 2 here, but 1 in -Wmain, so -ffreestanding
393 can turn it off only if it's not explicit. */
394 if (warn_main == -1)
395 warn_main = (value ? 2 : 0);
396
397 /* In C, -Wall turns on -Wenum-compare, which we do here.
398 In C++ it is on by default, which is done in
399 c_common_post_options. */
400 if (warn_enum_compare == -1)
401 warn_enum_compare = value;
402 }
403 else
404 {
405 /* C++-specific warnings. */
406 warn_sign_compare = value;
407 warn_reorder = value;
408 warn_cxx0x_compat = value;
409 warn_delnonvdtor = value;
410 warn_narrowing = value;
411 }
412
413 cpp_opts->warn_trigraphs = value;
414 cpp_opts->warn_comments = value;
415 cpp_opts->warn_num_sign_change = value;
416
417 if (warn_pointer_sign == -1)
418 warn_pointer_sign = value;
419 break;
420
421 case OPT_Wbuiltin_macro_redefined:
422 cpp_opts->warn_builtin_macro_redefined = value;
423 break;
424
425 case OPT_Wcomment:
426 cpp_opts->warn_comments = value;
427 break;
428
429 case OPT_Wc___compat:
430 /* Because -Wenum-compare is the default in C++, -Wc++-compat
431 implies -Wenum-compare. */
432 if (warn_enum_compare == -1 && value)
433 warn_enum_compare = value;
434 /* Because C++ always warns about a goto which misses an
435 initialization, -Wc++-compat turns on -Wjump-misses-init. */
436 if (warn_jump_misses_init == -1 && value)
437 warn_jump_misses_init = value;
438 cpp_opts->warn_cxx_operator_names = value;
439 break;
440
441 case OPT_Wc__0x_compat:
442 warn_narrowing = value;
443 break;
444
445 case OPT_Wdeprecated:
446 cpp_opts->cpp_warn_deprecated = value;
447 break;
448
449 case OPT_Wendif_labels:
450 cpp_opts->warn_endif_labels = value;
451 break;
452
453 case OPT_Wformat:
454 set_Wformat (value);
455 break;
456
457 case OPT_Wformat_:
458 set_Wformat (atoi (arg));
459 break;
460
461 case OPT_Wimplicit:
462 gcc_assert (value == 0 || value == 1);
463 if (warn_implicit_int == -1)
464 handle_generated_option (&global_options, &global_options_set,
465 OPT_Wimplicit_int, NULL, value,
466 c_family_lang_mask, kind, loc, handlers,
467 global_dc);
468 if (warn_implicit_function_declaration == -1)
469 handle_generated_option (&global_options, &global_options_set,
470 OPT_Wimplicit_function_declaration, NULL,
471 value, c_family_lang_mask, kind, loc,
472 handlers, global_dc);
473 break;
474
475 case OPT_Winvalid_pch:
476 cpp_opts->warn_invalid_pch = value;
477 break;
478
479 case OPT_Wlong_long:
480 cpp_opts->cpp_warn_long_long = value;
481 break;
482
483 case OPT_Wmissing_include_dirs:
484 cpp_opts->warn_missing_include_dirs = value;
485 break;
486
487 case OPT_Wmultichar:
488 cpp_opts->warn_multichar = value;
489 break;
490
491 case OPT_Wnormalized_:
492 if (kind == DK_ERROR)
493 {
494 gcc_assert (!arg);
495 inform (input_location, "-Werror=normalized=: set -Wnormalized=nfc");
496 cpp_opts->warn_normalize = normalized_C;
497 }
498 else
499 {
500 if (!value || (arg && strcasecmp (arg, "none") == 0))
501 cpp_opts->warn_normalize = normalized_none;
502 else if (!arg || strcasecmp (arg, "nfkc") == 0)
503 cpp_opts->warn_normalize = normalized_KC;
504 else if (strcasecmp (arg, "id") == 0)
505 cpp_opts->warn_normalize = normalized_identifier_C;
506 else if (strcasecmp (arg, "nfc") == 0)
507 cpp_opts->warn_normalize = normalized_C;
508 else
509 error ("argument %qs to %<-Wnormalized%> not recognized", arg);
510 break;
511 }
512
513 case OPT_Wreturn_type:
514 warn_return_type = value;
515 break;
516
517 case OPT_Wtraditional:
518 cpp_opts->cpp_warn_traditional = value;
519 break;
520
521 case OPT_Wtrigraphs:
522 cpp_opts->warn_trigraphs = value;
523 break;
524
525 case OPT_Wundef:
526 cpp_opts->warn_undef = value;
527 break;
528
529 case OPT_Wunknown_pragmas:
530 /* Set to greater than 1, so that even unknown pragmas in
531 system headers will be warned about. */
532 warn_unknown_pragmas = value * 2;
533 break;
534
535 case OPT_Wunused_macros:
536 warn_unused_macros = value;
537 break;
538
539 case OPT_Wvariadic_macros:
540 warn_variadic_macros = value;
541 break;
542
543 case OPT_Wwrite_strings:
544 warn_write_strings = value;
545 break;
546
547 case OPT_Weffc__:
548 warn_ecpp = value;
549 if (value)
550 warn_nonvdtor = true;
551 break;
552
553 case OPT_ansi:
554 if (!c_dialect_cxx ())
555 set_std_c89 (false, true);
556 else
557 set_std_cxx98 (true);
558 break;
559
560 case OPT_d:
561 handle_OPT_d (arg);
562 break;
563
564 case OPT_fcond_mismatch:
565 if (!c_dialect_cxx ())
566 {
567 flag_cond_mismatch = value;
568 break;
569 }
570 warning (0, "switch %qs is no longer supported", option->opt_text);
571 break;
572
573 case OPT_fbuiltin_:
574 if (value)
575 result = false;
576 else
577 disable_builtin_function (arg);
578 break;
579
580 case OPT_fdirectives_only:
581 cpp_opts->directives_only = value;
582 break;
583
584 case OPT_fdollars_in_identifiers:
585 cpp_opts->dollars_in_ident = value;
586 break;
587
588 case OPT_ffreestanding:
589 value = !value;
590 /* Fall through.... */
591 case OPT_fhosted:
592 flag_hosted = value;
593 flag_no_builtin = !value;
594 break;
595
596 case OPT_fconstant_string_class_:
597 constant_string_class_name = arg;
598 break;
599
600 case OPT_fextended_identifiers:
601 cpp_opts->extended_identifiers = value;
602 break;
603
604 case OPT_foperator_names:
605 cpp_opts->operator_names = value;
606 break;
607
608 case OPT_fpch_deps:
609 cpp_opts->restore_pch_deps = value;
610 break;
611
612 case OPT_fpch_preprocess:
613 flag_pch_preprocess = value;
614 break;
615
616 case OPT_fpermissive:
617 flag_permissive = value;
618 global_dc->permissive = value;
619 break;
620
621 case OPT_fpreprocessed:
622 cpp_opts->preprocessed = value;
623 break;
624
625 case OPT_fdebug_cpp:
626 cpp_opts->debug = 1;
627 break;
628
629 case OPT_ftrack_macro_expansion:
630 if (value)
631 value = 2;
632 /* Fall Through. */
633
634 case OPT_ftrack_macro_expansion_:
635 if (arg && *arg != '\0')
636 cpp_opts->track_macro_expansion = value;
637 else
638 cpp_opts->track_macro_expansion = 2;
639 break;
640
641 case OPT_frepo:
642 flag_use_repository = value;
643 if (value)
644 flag_implicit_templates = 0;
645 break;
646
647 case OPT_ftabstop_:
648 /* It is documented that we silently ignore silly values. */
649 if (value >= 1 && value <= 100)
650 cpp_opts->tabstop = value;
651 break;
652
653 case OPT_fexec_charset_:
654 cpp_opts->narrow_charset = arg;
655 break;
656
657 case OPT_fwide_exec_charset_:
658 cpp_opts->wide_charset = arg;
659 break;
660
661 case OPT_finput_charset_:
662 cpp_opts->input_charset = arg;
663 break;
664
665 case OPT_ftemplate_depth_:
666 max_tinst_depth = value;
667 break;
668
669 case OPT_fvisibility_inlines_hidden:
670 visibility_options.inlines_hidden = value;
671 break;
672
673 case OPT_femit_struct_debug_baseonly:
674 set_struct_debug_option (&global_options, loc, "base");
675 break;
676
677 case OPT_femit_struct_debug_reduced:
678 set_struct_debug_option (&global_options, loc,
679 "dir:ord:sys,dir:gen:any,ind:base");
680 break;
681
682 case OPT_femit_struct_debug_detailed_:
683 set_struct_debug_option (&global_options, loc, arg);
684 break;
685
686 case OPT_idirafter:
687 add_path (xstrdup (arg), AFTER, 0, true);
688 break;
689
690 case OPT_imacros:
691 case OPT_include:
692 defer_opt (code, arg);
693 break;
694
695 case OPT_imultilib:
696 imultilib = arg;
697 break;
698
699 case OPT_iprefix:
700 iprefix = arg;
701 break;
702
703 case OPT_iquote:
704 add_path (xstrdup (arg), QUOTE, 0, true);
705 break;
706
707 case OPT_isysroot:
708 sysroot = arg;
709 break;
710
711 case OPT_isystem:
712 add_path (xstrdup (arg), SYSTEM, 0, true);
713 break;
714
715 case OPT_iwithprefix:
716 add_prefixed_path (arg, SYSTEM);
717 break;
718
719 case OPT_iwithprefixbefore:
720 add_prefixed_path (arg, BRACKET);
721 break;
722
723 case OPT_lang_asm:
724 cpp_set_lang (parse_in, CLK_ASM);
725 cpp_opts->dollars_in_ident = false;
726 break;
727
728 case OPT_nostdinc:
729 std_inc = false;
730 break;
731
732 case OPT_nostdinc__:
733 std_cxx_inc = false;
734 break;
735
736 case OPT_o:
737 if (!out_fname)
738 out_fname = arg;
739 else
740 error ("output filename specified twice");
741 break;
742
743 /* We need to handle the -Wpedantic switches here, rather than in
744 c_common_post_options, so that a subsequent -Wno-endif-labels
745 is not overridden. */
746 case OPT_pedantic_errors:
747 case OPT_Wpedantic:
748 cpp_opts->cpp_pedantic = 1;
749 cpp_opts->warn_endif_labels = 1;
750 if (warn_pointer_sign == -1)
751 warn_pointer_sign = 1;
752 if (warn_overlength_strings == -1)
753 warn_overlength_strings = 1;
754 if (warn_main == -1)
755 warn_main = 2;
756 break;
757
758 case OPT_print_objc_runtime_info:
759 print_struct_values = 1;
760 break;
761
762 case OPT_remap:
763 cpp_opts->remap = 1;
764 break;
765
766 case OPT_std_c__98:
767 case OPT_std_gnu__98:
768 if (!preprocessing_asm_p)
769 set_std_cxx98 (code == OPT_std_c__98 /* ISO */);
770 break;
771
772 case OPT_std_c__11:
773 case OPT_std_gnu__11:
774 if (!preprocessing_asm_p)
775 set_std_cxx11 (code == OPT_std_c__11 /* ISO */);
776 break;
777
778 case OPT_std_c__1y:
779 case OPT_std_gnu__1y:
780 if (!preprocessing_asm_p)
781 set_std_cxx1y (code == OPT_std_c__11 /* ISO */);
782 break;
783
784 case OPT_std_c90:
785 case OPT_std_iso9899_199409:
786 if (!preprocessing_asm_p)
787 set_std_c89 (code == OPT_std_iso9899_199409 /* c94 */, true /* ISO */);
788 break;
789
790 case OPT_std_gnu90:
791 if (!preprocessing_asm_p)
792 set_std_c89 (false /* c94 */, false /* ISO */);
793 break;
794
795 case OPT_std_c99:
796 if (!preprocessing_asm_p)
797 set_std_c99 (true /* ISO */);
798 break;
799
800 case OPT_std_gnu99:
801 if (!preprocessing_asm_p)
802 set_std_c99 (false /* ISO */);
803 break;
804
805 case OPT_std_c11:
806 if (!preprocessing_asm_p)
807 set_std_c11 (true /* ISO */);
808 break;
809
810 case OPT_std_gnu11:
811 if (!preprocessing_asm_p)
812 set_std_c11 (false /* ISO */);
813 break;
814
815 case OPT_trigraphs:
816 cpp_opts->trigraphs = 1;
817 break;
818
819 case OPT_traditional_cpp:
820 cpp_opts->traditional = 1;
821 break;
822
823 case OPT_v:
824 verbose = true;
825 break;
826
827 case OPT_Wabi:
828 warn_psabi = value;
829 break;
830 }
831
832 return result;
833 }
834
835 /* Default implementation of TARGET_HANDLE_C_OPTION. */
836
837 bool
838 default_handle_c_option (size_t code ATTRIBUTE_UNUSED,
839 const char *arg ATTRIBUTE_UNUSED,
840 int value ATTRIBUTE_UNUSED)
841 {
842 return false;
843 }
844
845 /* Post-switch processing. */
846 bool
847 c_common_post_options (const char **pfilename)
848 {
849 struct cpp_callbacks *cb;
850
851 /* Canonicalize the input and output filenames. */
852 if (in_fnames == NULL)
853 {
854 in_fnames = XNEWVEC (const char *, 1);
855 in_fnames[0] = "";
856 }
857 else if (strcmp (in_fnames[0], "-") == 0)
858 in_fnames[0] = "";
859
860 if (out_fname == NULL || !strcmp (out_fname, "-"))
861 out_fname = "";
862
863 if (cpp_opts->deps.style == DEPS_NONE)
864 check_deps_environment_vars ();
865
866 handle_deferred_opts ();
867
868 sanitize_cpp_opts ();
869
870 register_include_chains (parse_in, sysroot, iprefix, imultilib,
871 std_inc, std_cxx_inc && c_dialect_cxx (), verbose);
872
873 #ifdef C_COMMON_OVERRIDE_OPTIONS
874 /* Some machines may reject certain combinations of C
875 language-specific options. */
876 C_COMMON_OVERRIDE_OPTIONS;
877 #endif
878
879 /* Excess precision other than "fast" requires front-end
880 support. */
881 if (c_dialect_cxx ())
882 {
883 if (flag_excess_precision_cmdline == EXCESS_PRECISION_STANDARD
884 && TARGET_FLT_EVAL_METHOD_NON_DEFAULT)
885 sorry ("-fexcess-precision=standard for C++");
886 flag_excess_precision_cmdline = EXCESS_PRECISION_FAST;
887 }
888 else if (flag_excess_precision_cmdline == EXCESS_PRECISION_DEFAULT)
889 flag_excess_precision_cmdline = (flag_iso
890 ? EXCESS_PRECISION_STANDARD
891 : EXCESS_PRECISION_FAST);
892
893 /* By default we use C99 inline semantics in GNU99 or C99 mode. C99
894 inline semantics are not supported in GNU89 or C89 mode. */
895 if (flag_gnu89_inline == -1)
896 flag_gnu89_inline = !flag_isoc99;
897 else if (!flag_gnu89_inline && !flag_isoc99)
898 error ("-fno-gnu89-inline is only supported in GNU99 or C99 mode");
899
900 /* Default to ObjC sjlj exception handling if NeXT runtime. */
901 if (flag_objc_sjlj_exceptions < 0)
902 flag_objc_sjlj_exceptions = flag_next_runtime;
903 if (flag_objc_exceptions && !flag_objc_sjlj_exceptions)
904 flag_exceptions = 1;
905
906 /* -Wextra implies the following flags
907 unless explicitly overridden. */
908 if (warn_type_limits == -1)
909 warn_type_limits = extra_warnings;
910 if (warn_clobbered == -1)
911 warn_clobbered = extra_warnings;
912 if (warn_empty_body == -1)
913 warn_empty_body = extra_warnings;
914 if (warn_sign_compare == -1)
915 warn_sign_compare = extra_warnings;
916 if (warn_missing_field_initializers == -1)
917 warn_missing_field_initializers = extra_warnings;
918 if (warn_missing_parameter_type == -1)
919 warn_missing_parameter_type = extra_warnings;
920 if (warn_old_style_declaration == -1)
921 warn_old_style_declaration = extra_warnings;
922 if (warn_override_init == -1)
923 warn_override_init = extra_warnings;
924 if (warn_ignored_qualifiers == -1)
925 warn_ignored_qualifiers = extra_warnings;
926
927 /* -Wpointer-sign is disabled by default, but it is enabled if any
928 of -Wall or -Wpedantic are given. */
929 if (warn_pointer_sign == -1)
930 warn_pointer_sign = 0;
931
932 if (warn_strict_aliasing == -1)
933 warn_strict_aliasing = 0;
934 if (warn_strict_overflow == -1)
935 warn_strict_overflow = 0;
936 if (warn_jump_misses_init == -1)
937 warn_jump_misses_init = 0;
938
939 /* -Woverlength-strings is off by default, but is enabled by -Wpedantic.
940 It is never enabled in C++, as the minimum limit is not normative
941 in that standard. */
942 if (warn_overlength_strings == -1 || c_dialect_cxx ())
943 warn_overlength_strings = 0;
944
945 /* Wmain is enabled by default in C++ but not in C. */
946 /* Wmain is disabled by default for -ffreestanding (!flag_hosted),
947 even if -Wall was given (warn_main will be 2 if set by -Wall, 1
948 if set by -Wmain). */
949 if (warn_main == -1)
950 warn_main = (c_dialect_cxx () && flag_hosted) ? 1 : 0;
951 else if (warn_main == 2)
952 warn_main = flag_hosted ? 1 : 0;
953
954 /* In C, -Wconversion enables -Wsign-conversion (unless disabled
955 through -Wno-sign-conversion). While in C++,
956 -Wsign-conversion needs to be requested explicitly. */
957 if (warn_sign_conversion == -1)
958 warn_sign_conversion = (c_dialect_cxx ()) ? 0 : warn_conversion;
959
960 /* In C, -Wall and -Wc++-compat enable -Wenum-compare, which we do
961 in c_common_handle_option; if it has not yet been set, it is
962 disabled by default. In C++, it is enabled by default. */
963 if (warn_enum_compare == -1)
964 warn_enum_compare = c_dialect_cxx () ? 1 : 0;
965
966 /* -Wpacked-bitfield-compat is on by default for the C languages. The
967 warning is issued in stor-layout.c which is not part of the front-end so
968 we need to selectively turn it on here. */
969 if (warn_packed_bitfield_compat == -1)
970 warn_packed_bitfield_compat = 1;
971
972 /* Special format checking options don't work without -Wformat; warn if
973 they are used. */
974 if (!warn_format)
975 {
976 warning (OPT_Wformat_y2k,
977 "-Wformat-y2k ignored without -Wformat");
978 warning (OPT_Wformat_extra_args,
979 "-Wformat-extra-args ignored without -Wformat");
980 warning (OPT_Wformat_zero_length,
981 "-Wformat-zero-length ignored without -Wformat");
982 warning (OPT_Wformat_nonliteral,
983 "-Wformat-nonliteral ignored without -Wformat");
984 warning (OPT_Wformat_contains_nul,
985 "-Wformat-contains-nul ignored without -Wformat");
986 warning (OPT_Wformat_security,
987 "-Wformat-security ignored without -Wformat");
988 }
989
990 if (warn_implicit == -1)
991 warn_implicit = 0;
992
993 if (warn_implicit_int == -1)
994 warn_implicit_int = 0;
995
996 /* -Wimplicit-function-declaration is enabled by default for C99. */
997 if (warn_implicit_function_declaration == -1)
998 warn_implicit_function_declaration = flag_isoc99;
999
1000 if (cxx_dialect >= cxx0x)
1001 {
1002 /* If we're allowing C++0x constructs, don't warn about C++98
1003 identifiers which are keywords in C++0x. */
1004 warn_cxx0x_compat = 0;
1005
1006 if (warn_narrowing == -1)
1007 warn_narrowing = 1;
1008 }
1009 else if (warn_narrowing == -1)
1010 warn_narrowing = 0;
1011
1012 if (flag_preprocess_only)
1013 {
1014 /* Open the output now. We must do so even if flag_no_output is
1015 on, because there may be other output than from the actual
1016 preprocessing (e.g. from -dM). */
1017 if (out_fname[0] == '\0')
1018 out_stream = stdout;
1019 else
1020 out_stream = fopen (out_fname, "w");
1021
1022 if (out_stream == NULL)
1023 {
1024 fatal_error ("opening output file %s: %m", out_fname);
1025 return false;
1026 }
1027
1028 if (num_in_fnames > 1)
1029 error ("too many filenames given. Type %s --help for usage",
1030 progname);
1031
1032 init_pp_output (out_stream);
1033 }
1034 else
1035 {
1036 init_c_lex ();
1037
1038 /* When writing a PCH file, avoid reading some other PCH file,
1039 because the default address space slot then can't be used
1040 for the output PCH file. */
1041 if (pch_file)
1042 c_common_no_more_pch ();
1043
1044 /* Yuk. WTF is this? I do know ObjC relies on it somewhere. */
1045 input_location = UNKNOWN_LOCATION;
1046 }
1047
1048 cb = cpp_get_callbacks (parse_in);
1049 cb->file_change = cb_file_change;
1050 cb->dir_change = cb_dir_change;
1051 cpp_post_options (parse_in);
1052
1053 input_location = UNKNOWN_LOCATION;
1054
1055 *pfilename = this_input_filename
1056 = cpp_read_main_file (parse_in, in_fnames[0]);
1057 /* Don't do any compilation or preprocessing if there is no input file. */
1058 if (this_input_filename == NULL)
1059 {
1060 errorcount++;
1061 return false;
1062 }
1063
1064 if (flag_working_directory
1065 && flag_preprocess_only && !flag_no_line_commands)
1066 pp_dir_change (parse_in, get_src_pwd ());
1067
1068 /* Disable LTO output when outputting a precompiled header. */
1069 if (pch_file && flag_lto)
1070 {
1071 flag_lto = 0;
1072 flag_generate_lto = 0;
1073 }
1074
1075 return flag_preprocess_only;
1076 }
1077
1078 /* Front end initialization common to C, ObjC and C++. */
1079 bool
1080 c_common_init (void)
1081 {
1082 /* Set up preprocessor arithmetic. Must be done after call to
1083 c_common_nodes_and_builtins for type nodes to be good. */
1084 cpp_opts->precision = TYPE_PRECISION (intmax_type_node);
1085 cpp_opts->char_precision = TYPE_PRECISION (char_type_node);
1086 cpp_opts->int_precision = TYPE_PRECISION (integer_type_node);
1087 cpp_opts->wchar_precision = TYPE_PRECISION (wchar_type_node);
1088 cpp_opts->unsigned_wchar = TYPE_UNSIGNED (wchar_type_node);
1089 cpp_opts->bytes_big_endian = BYTES_BIG_ENDIAN;
1090
1091 /* This can't happen until after wchar_precision and bytes_big_endian
1092 are known. */
1093 cpp_init_iconv (parse_in);
1094
1095 if (version_flag)
1096 c_common_print_pch_checksum (stderr);
1097
1098 /* Has to wait until now so that cpplib has its hash table. */
1099 init_pragma ();
1100
1101 if (flag_preprocess_only)
1102 {
1103 c_finish_options ();
1104 preprocess_file (parse_in);
1105 return false;
1106 }
1107
1108 return true;
1109 }
1110
1111 /* Initialize the integrated preprocessor after debug output has been
1112 initialized; loop over each input file. */
1113 void
1114 c_common_parse_file (void)
1115 {
1116 unsigned int i;
1117
1118 i = 0;
1119 for (;;)
1120 {
1121 c_finish_options ();
1122 pch_init ();
1123 push_file_scope ();
1124 c_parse_file ();
1125 pop_file_scope ();
1126 /* And end the main input file, if the debug writer wants it */
1127 if (debug_hooks->start_end_main_source_file)
1128 (*debug_hooks->end_source_file) (0);
1129 if (++i >= num_in_fnames)
1130 break;
1131 cpp_undef_all (parse_in);
1132 cpp_clear_file_cache (parse_in);
1133 this_input_filename
1134 = cpp_read_main_file (parse_in, in_fnames[i]);
1135 /* If an input file is missing, abandon further compilation.
1136 cpplib has issued a diagnostic. */
1137 if (!this_input_filename)
1138 break;
1139 }
1140 }
1141
1142 /* Common finish hook for the C, ObjC and C++ front ends. */
1143 void
1144 c_common_finish (void)
1145 {
1146 FILE *deps_stream = NULL;
1147
1148 /* Don't write the deps file if there are errors. */
1149 if (cpp_opts->deps.style != DEPS_NONE && !seen_error ())
1150 {
1151 /* If -M or -MM was seen without -MF, default output to the
1152 output stream. */
1153 if (!deps_file)
1154 deps_stream = out_stream;
1155 else
1156 {
1157 deps_stream = fopen (deps_file, deps_append ? "a": "w");
1158 if (!deps_stream)
1159 fatal_error ("opening dependency file %s: %m", deps_file);
1160 }
1161 }
1162
1163 /* For performance, avoid tearing down cpplib's internal structures
1164 with cpp_destroy (). */
1165 cpp_finish (parse_in, deps_stream);
1166
1167 if (deps_stream && deps_stream != out_stream
1168 && (ferror (deps_stream) || fclose (deps_stream)))
1169 fatal_error ("closing dependency file %s: %m", deps_file);
1170
1171 if (out_stream && (ferror (out_stream) || fclose (out_stream)))
1172 fatal_error ("when writing output to %s: %m", out_fname);
1173 }
1174
1175 /* Either of two environment variables can specify output of
1176 dependencies. Their value is either "OUTPUT_FILE" or "OUTPUT_FILE
1177 DEPS_TARGET", where OUTPUT_FILE is the file to write deps info to
1178 and DEPS_TARGET is the target to mention in the deps. They also
1179 result in dependency information being appended to the output file
1180 rather than overwriting it, and like Sun's compiler
1181 SUNPRO_DEPENDENCIES suppresses the dependency on the main file. */
1182 static void
1183 check_deps_environment_vars (void)
1184 {
1185 char *spec;
1186
1187 spec = getenv ("DEPENDENCIES_OUTPUT");
1188 if (spec)
1189 cpp_opts->deps.style = DEPS_USER;
1190 else
1191 {
1192 spec = getenv ("SUNPRO_DEPENDENCIES");
1193 if (spec)
1194 {
1195 cpp_opts->deps.style = DEPS_SYSTEM;
1196 cpp_opts->deps.ignore_main_file = true;
1197 }
1198 }
1199
1200 if (spec)
1201 {
1202 /* Find the space before the DEPS_TARGET, if there is one. */
1203 char *s = strchr (spec, ' ');
1204 if (s)
1205 {
1206 /* Let the caller perform MAKE quoting. */
1207 defer_opt (OPT_MT, s + 1);
1208 *s = '\0';
1209 }
1210
1211 /* Command line -MF overrides environment variables and default. */
1212 if (!deps_file)
1213 deps_file = spec;
1214
1215 deps_append = 1;
1216 deps_seen = true;
1217 }
1218 }
1219
1220 /* Handle deferred command line switches. */
1221 static void
1222 handle_deferred_opts (void)
1223 {
1224 size_t i;
1225 struct deps *deps;
1226
1227 /* Avoid allocating the deps buffer if we don't need it.
1228 (This flag may be true without there having been -MT or -MQ
1229 options, but we'll still need the deps buffer.) */
1230 if (!deps_seen)
1231 return;
1232
1233 deps = cpp_get_deps (parse_in);
1234
1235 for (i = 0; i < deferred_count; i++)
1236 {
1237 struct deferred_opt *opt = &deferred_opts[i];
1238
1239 if (opt->code == OPT_MT || opt->code == OPT_MQ)
1240 deps_add_target (deps, opt->arg, opt->code == OPT_MQ);
1241 }
1242 }
1243
1244 /* These settings are appropriate for GCC, but not necessarily so for
1245 cpplib as a library. */
1246 static void
1247 sanitize_cpp_opts (void)
1248 {
1249 /* If we don't know what style of dependencies to output, complain
1250 if any other dependency switches have been given. */
1251 if (deps_seen && cpp_opts->deps.style == DEPS_NONE)
1252 error ("to generate dependencies you must specify either -M or -MM");
1253
1254 /* -dM and dependencies suppress normal output; do it here so that
1255 the last -d[MDN] switch overrides earlier ones. */
1256 if (flag_dump_macros == 'M')
1257 flag_no_output = 1;
1258
1259 /* By default, -fdirectives-only implies -dD. This allows subsequent phases
1260 to perform proper macro expansion. */
1261 if (cpp_opts->directives_only && !cpp_opts->preprocessed && !flag_dump_macros)
1262 flag_dump_macros = 'D';
1263
1264 /* Disable -dD, -dN and -dI if normal output is suppressed. Allow
1265 -dM since at least glibc relies on -M -dM to work. */
1266 /* Also, flag_no_output implies flag_no_line_commands, always. */
1267 if (flag_no_output)
1268 {
1269 if (flag_dump_macros != 'M')
1270 flag_dump_macros = 0;
1271 flag_dump_includes = 0;
1272 flag_no_line_commands = 1;
1273 }
1274 else if (cpp_opts->deps.missing_files)
1275 error ("-MG may only be used with -M or -MM");
1276
1277 cpp_opts->unsigned_char = !flag_signed_char;
1278 cpp_opts->stdc_0_in_system_headers = STDC_0_IN_SYSTEM_HEADERS;
1279
1280 /* Wlong-long is disabled by default. It is enabled by:
1281 [-Wpedantic | -Wtraditional] -std=[gnu|c]++98 ; or
1282 [-Wpedantic | -Wtraditional] -std=non-c99 .
1283
1284 Either -Wlong-long or -Wno-long-long override any other settings. */
1285 if (warn_long_long == -1)
1286 warn_long_long = ((pedantic || warn_traditional)
1287 && (c_dialect_cxx () ? cxx_dialect == cxx98 : !flag_isoc99));
1288 cpp_opts->cpp_warn_long_long = warn_long_long;
1289
1290 /* Similarly with -Wno-variadic-macros. No check for c99 here, since
1291 this also turns off warnings about GCCs extension. */
1292 cpp_opts->warn_variadic_macros
1293 = warn_variadic_macros && (pedantic || warn_traditional);
1294
1295 /* If we're generating preprocessor output, emit current directory
1296 if explicitly requested or if debugging information is enabled.
1297 ??? Maybe we should only do it for debugging formats that
1298 actually output the current directory? */
1299 if (flag_working_directory == -1)
1300 flag_working_directory = (debug_info_level != DINFO_LEVEL_NONE);
1301
1302 if (cpp_opts->directives_only)
1303 {
1304 if (warn_unused_macros)
1305 error ("-fdirectives-only is incompatible with -Wunused_macros");
1306 if (cpp_opts->traditional)
1307 error ("-fdirectives-only is incompatible with -traditional");
1308 }
1309 }
1310
1311 /* Add include path with a prefix at the front of its name. */
1312 static void
1313 add_prefixed_path (const char *suffix, size_t chain)
1314 {
1315 char *path;
1316 const char *prefix;
1317 size_t prefix_len, suffix_len;
1318
1319 suffix_len = strlen (suffix);
1320 prefix = iprefix ? iprefix : cpp_GCC_INCLUDE_DIR;
1321 prefix_len = iprefix ? strlen (iprefix) : cpp_GCC_INCLUDE_DIR_len;
1322
1323 path = (char *) xmalloc (prefix_len + suffix_len + 1);
1324 memcpy (path, prefix, prefix_len);
1325 memcpy (path + prefix_len, suffix, suffix_len);
1326 path[prefix_len + suffix_len] = '\0';
1327
1328 add_path (path, chain, 0, false);
1329 }
1330
1331 /* Handle -D, -U, -A, -imacros, and the first -include. */
1332 static void
1333 c_finish_options (void)
1334 {
1335 if (!cpp_opts->preprocessed)
1336 {
1337 size_t i;
1338
1339 {
1340 /* Make sure all of the builtins about to be declared have
1341 BUILTINS_LOCATION has their source_location. */
1342 source_location builtins_loc = BUILTINS_LOCATION;
1343 cpp_force_token_locations (parse_in, &builtins_loc);
1344
1345 cpp_init_builtins (parse_in, flag_hosted);
1346 c_cpp_builtins (parse_in);
1347
1348 cpp_stop_forcing_token_locations (parse_in);
1349 }
1350
1351 /* We're about to send user input to cpplib, so make it warn for
1352 things that we previously (when we sent it internal definitions)
1353 told it to not warn.
1354
1355 C99 permits implementation-defined characters in identifiers.
1356 The documented meaning of -std= is to turn off extensions that
1357 conflict with the specified standard, and since a strictly
1358 conforming program cannot contain a '$', we do not condition
1359 their acceptance on the -std= setting. */
1360 cpp_opts->warn_dollars = (cpp_opts->cpp_pedantic && !cpp_opts->c99);
1361
1362 cb_file_change (parse_in,
1363 linemap_add (line_table, LC_RENAME, 0,
1364 _("<command-line>"), 0));
1365
1366 for (i = 0; i < deferred_count; i++)
1367 {
1368 struct deferred_opt *opt = &deferred_opts[i];
1369
1370 if (opt->code == OPT_D)
1371 cpp_define (parse_in, opt->arg);
1372 else if (opt->code == OPT_U)
1373 cpp_undef (parse_in, opt->arg);
1374 else if (opt->code == OPT_A)
1375 {
1376 if (opt->arg[0] == '-')
1377 cpp_unassert (parse_in, opt->arg + 1);
1378 else
1379 cpp_assert (parse_in, opt->arg);
1380 }
1381 }
1382
1383 /* Start the main input file, if the debug writer wants it. */
1384 if (debug_hooks->start_end_main_source_file
1385 && !flag_preprocess_only)
1386 (*debug_hooks->start_source_file) (0, this_input_filename);
1387
1388 /* Handle -imacros after -D and -U. */
1389 for (i = 0; i < deferred_count; i++)
1390 {
1391 struct deferred_opt *opt = &deferred_opts[i];
1392
1393 if (opt->code == OPT_imacros
1394 && cpp_push_include (parse_in, opt->arg))
1395 {
1396 /* Disable push_command_line_include callback for now. */
1397 include_cursor = deferred_count + 1;
1398 cpp_scan_nooutput (parse_in);
1399 }
1400 }
1401 }
1402 else
1403 {
1404 if (cpp_opts->directives_only)
1405 cpp_init_special_builtins (parse_in);
1406
1407 /* Start the main input file, if the debug writer wants it. */
1408 if (debug_hooks->start_end_main_source_file
1409 && !flag_preprocess_only)
1410 (*debug_hooks->start_source_file) (0, this_input_filename);
1411 }
1412
1413 include_cursor = 0;
1414 push_command_line_include ();
1415 }
1416
1417 /* Give CPP the next file given by -include, if any. */
1418 static void
1419 push_command_line_include (void)
1420 {
1421 while (include_cursor < deferred_count)
1422 {
1423 struct deferred_opt *opt = &deferred_opts[include_cursor++];
1424
1425 if (!cpp_opts->preprocessed && opt->code == OPT_include
1426 && cpp_push_include (parse_in, opt->arg))
1427 return;
1428 }
1429
1430 if (include_cursor == deferred_count)
1431 {
1432 include_cursor++;
1433 /* -Wunused-macros should only warn about macros defined hereafter. */
1434 cpp_opts->warn_unused_macros = warn_unused_macros;
1435 /* Restore the line map from <command line>. */
1436 if (!cpp_opts->preprocessed)
1437 cpp_change_file (parse_in, LC_RENAME, this_input_filename);
1438
1439 /* Set this here so the client can change the option if it wishes,
1440 and after stacking the main file so we don't trace the main file. */
1441 line_table->trace_includes = cpp_opts->print_include_names;
1442 }
1443 }
1444
1445 /* File change callback. Has to handle -include files. */
1446 static void
1447 cb_file_change (cpp_reader * ARG_UNUSED (pfile),
1448 const struct line_map *new_map)
1449 {
1450 if (flag_preprocess_only)
1451 pp_file_change (new_map);
1452 else
1453 fe_file_change (new_map);
1454
1455 if (new_map == 0 || (new_map->reason == LC_LEAVE && MAIN_FILE_P (new_map)))
1456 push_command_line_include ();
1457 }
1458
1459 void
1460 cb_dir_change (cpp_reader * ARG_UNUSED (pfile), const char *dir)
1461 {
1462 if (!set_src_pwd (dir))
1463 warning (0, "too late for # directive to set debug directory");
1464 }
1465
1466 /* Set the C 89 standard (with 1994 amendments if C94, without GNU
1467 extensions if ISO). There is no concept of gnu94. */
1468 static void
1469 set_std_c89 (int c94, int iso)
1470 {
1471 cpp_set_lang (parse_in, c94 ? CLK_STDC94: iso ? CLK_STDC89: CLK_GNUC89);
1472 flag_iso = iso;
1473 flag_no_asm = iso;
1474 flag_no_gnu_keywords = iso;
1475 flag_no_nonansi_builtin = iso;
1476 flag_isoc94 = c94;
1477 flag_isoc99 = 0;
1478 flag_isoc11 = 0;
1479 }
1480
1481 /* Set the C 99 standard (without GNU extensions if ISO). */
1482 static void
1483 set_std_c99 (int iso)
1484 {
1485 cpp_set_lang (parse_in, iso ? CLK_STDC99: CLK_GNUC99);
1486 flag_no_asm = iso;
1487 flag_no_nonansi_builtin = iso;
1488 flag_iso = iso;
1489 flag_isoc11 = 0;
1490 flag_isoc99 = 1;
1491 flag_isoc94 = 1;
1492 }
1493
1494 /* Set the C 11 standard (without GNU extensions if ISO). */
1495 static void
1496 set_std_c11 (int iso)
1497 {
1498 cpp_set_lang (parse_in, iso ? CLK_STDC11: CLK_GNUC11);
1499 flag_no_asm = iso;
1500 flag_no_nonansi_builtin = iso;
1501 flag_iso = iso;
1502 flag_isoc11 = 1;
1503 flag_isoc99 = 1;
1504 flag_isoc94 = 1;
1505 }
1506
1507 /* Set the C++ 98 standard (without GNU extensions if ISO). */
1508 static void
1509 set_std_cxx98 (int iso)
1510 {
1511 cpp_set_lang (parse_in, iso ? CLK_CXX98: CLK_GNUCXX);
1512 flag_no_gnu_keywords = iso;
1513 flag_no_nonansi_builtin = iso;
1514 flag_iso = iso;
1515 cxx_dialect = cxx98;
1516 }
1517
1518 /* Set the C++ 2011 standard (without GNU extensions if ISO). */
1519 static void
1520 set_std_cxx11 (int iso)
1521 {
1522 cpp_set_lang (parse_in, iso ? CLK_CXX11: CLK_GNUCXX11);
1523 flag_no_gnu_keywords = iso;
1524 flag_no_nonansi_builtin = iso;
1525 flag_iso = iso;
1526 /* C++11 includes the C99 standard library. */
1527 flag_isoc94 = 1;
1528 flag_isoc99 = 1;
1529 cxx_dialect = cxx11;
1530 }
1531
1532 /* Set the C++ 201y draft standard (without GNU extensions if ISO). */
1533 static void
1534 set_std_cxx1y (int iso)
1535 {
1536 cpp_set_lang (parse_in, iso ? CLK_CXX11: CLK_GNUCXX11);
1537 flag_no_gnu_keywords = iso;
1538 flag_no_nonansi_builtin = iso;
1539 flag_iso = iso;
1540 /* C++11 includes the C99 standard library. */
1541 flag_isoc94 = 1;
1542 flag_isoc99 = 1;
1543 cxx_dialect = cxx1y;
1544 }
1545
1546 /* Args to -d specify what to dump. Silently ignore
1547 unrecognized options; they may be aimed at toplev.c. */
1548 static void
1549 handle_OPT_d (const char *arg)
1550 {
1551 char c;
1552
1553 while ((c = *arg++) != '\0')
1554 switch (c)
1555 {
1556 case 'M': /* Dump macros only. */
1557 case 'N': /* Dump names. */
1558 case 'D': /* Dump definitions. */
1559 case 'U': /* Dump used macros. */
1560 flag_dump_macros = c;
1561 break;
1562
1563 case 'I':
1564 flag_dump_includes = 1;
1565 break;
1566 }
1567 }