* gcc.dg/vect/pr24225.c: Add cleanup-coverage-files.
[official-gcc.git] / gcc / c-opts.c
blob62db668b4e12f02f0fd001ad72c54e09667db1b2
1 /* C/ObjC/C++ command line option handling.
2 Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
3 Contributed by Neil Booth.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to the Free
19 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
20 02110-1301, USA. */
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "tree.h"
27 #include "c-common.h"
28 #include "c-pragma.h"
29 #include "flags.h"
30 #include "toplev.h"
31 #include "langhooks.h"
32 #include "tree-inline.h"
33 #include "diagnostic.h"
34 #include "intl.h"
35 #include "cppdefault.h"
36 #include "c-incpath.h"
37 #include "debug.h" /* For debug_hooks. */
38 #include "opts.h"
39 #include "options.h"
40 #include "mkdeps.h"
42 #ifndef DOLLARS_IN_IDENTIFIERS
43 # define DOLLARS_IN_IDENTIFIERS true
44 #endif
46 #ifndef TARGET_SYSTEM_ROOT
47 # define TARGET_SYSTEM_ROOT NULL
48 #endif
50 #ifndef TARGET_OPTF
51 #define TARGET_OPTF(ARG)
52 #endif
54 /* CPP's options. */
55 static cpp_options *cpp_opts;
57 /* Input filename. */
58 static const char *this_input_filename;
60 /* Filename and stream for preprocessed output. */
61 static const char *out_fname;
62 static FILE *out_stream;
64 /* Append dependencies to deps_file. */
65 static bool deps_append;
67 /* If dependency switches (-MF etc.) have been given. */
68 static bool deps_seen;
70 /* If -v seen. */
71 static bool verbose;
73 /* If -lang-fortran seen. */
74 static bool lang_fortran = false;
76 /* Dependency output file. */
77 static const char *deps_file;
79 /* The prefix given by -iprefix, if any. */
80 static const char *iprefix;
82 /* The system root, if any. Overridden by -isysroot. */
83 static const char *sysroot = TARGET_SYSTEM_ROOT;
85 /* Zero disables all standard directories for headers. */
86 static bool std_inc = true;
88 /* Zero disables the C++-specific standard directories for headers. */
89 static bool std_cxx_inc = true;
91 /* If the quote chain has been split by -I-. */
92 static bool quote_chain_split;
94 /* If -Wunused-macros. */
95 static bool warn_unused_macros;
97 /* If -Wvariadic-macros. */
98 static bool warn_variadic_macros = true;
100 /* Number of deferred options. */
101 static size_t deferred_count;
103 /* Number of deferred options scanned for -include. */
104 static size_t include_cursor;
106 static void set_Wimplicit (int);
107 static void handle_OPT_d (const char *);
108 static void set_std_cxx98 (int);
109 static void set_std_c89 (int, int);
110 static void set_std_c99 (int);
111 static void check_deps_environment_vars (void);
112 static void handle_deferred_opts (void);
113 static void sanitize_cpp_opts (void);
114 static void add_prefixed_path (const char *, size_t);
115 static void push_command_line_include (void);
116 static void cb_file_change (cpp_reader *, const struct line_map *);
117 static void cb_dir_change (cpp_reader *, const char *);
118 static void finish_options (void);
120 #ifndef STDC_0_IN_SYSTEM_HEADERS
121 #define STDC_0_IN_SYSTEM_HEADERS 0
122 #endif
124 /* Holds switches parsed by c_common_handle_option (), but whose
125 handling is deferred to c_common_post_options (). */
126 static void defer_opt (enum opt_code, const char *);
127 static struct deferred_opt
129 enum opt_code code;
130 const char *arg;
131 } *deferred_opts;
133 /* Complain that switch CODE expects an argument but none was
134 provided. OPT was the command-line option. Return FALSE to get
135 the default message in opts.c, TRUE if we provide a specialized
136 one. */
137 bool
138 c_common_missing_argument (const char *opt, size_t code)
140 switch (code)
142 default:
143 /* Pick up the default message. */
144 return false;
146 case OPT_fconstant_string_class_:
147 error ("no class name specified with %qs", opt);
148 break;
150 case OPT_A:
151 error ("assertion missing after %qs", opt);
152 break;
154 case OPT_D:
155 case OPT_U:
156 error ("macro name missing after %qs", opt);
157 break;
159 case OPT_F:
160 case OPT_I:
161 case OPT_idirafter:
162 case OPT_isysroot:
163 case OPT_isystem:
164 case OPT_iquote:
165 error ("missing path after %qs", opt);
166 break;
168 case OPT_MF:
169 case OPT_MD:
170 case OPT_MMD:
171 case OPT_include:
172 case OPT_imacros:
173 case OPT_o:
174 error ("missing filename after %qs", opt);
175 break;
177 case OPT_MQ:
178 case OPT_MT:
179 error ("missing makefile target after %qs", opt);
180 break;
183 return true;
186 /* Defer option CODE with argument ARG. */
187 static void
188 defer_opt (enum opt_code code, const char *arg)
190 deferred_opts[deferred_count].code = code;
191 deferred_opts[deferred_count].arg = arg;
192 deferred_count++;
195 /* Common initialization before parsing options. */
196 unsigned int
197 c_common_init_options (unsigned int argc, const char **argv)
199 static const unsigned int lang_flags[] = {CL_C, CL_ObjC, CL_CXX, CL_ObjCXX};
200 unsigned int i, result;
202 /* This is conditionalized only because that is the way the front
203 ends used to do it. Maybe this should be unconditional? */
204 if (c_dialect_cxx ())
206 /* By default wrap lines at 80 characters. Is getenv
207 ("COLUMNS") preferable? */
208 diagnostic_line_cutoff (global_dc) = 80;
209 /* By default, emit location information once for every
210 diagnostic message. */
211 diagnostic_prefixing_rule (global_dc) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
214 parse_in = cpp_create_reader (c_dialect_cxx () ? CLK_GNUCXX: CLK_GNUC89,
215 ident_hash, &line_table);
217 cpp_opts = cpp_get_options (parse_in);
218 cpp_opts->dollars_in_ident = DOLLARS_IN_IDENTIFIERS;
219 cpp_opts->objc = c_dialect_objc ();
221 /* Reset to avoid warnings on internal definitions. We set it just
222 before passing on command-line options to cpplib. */
223 cpp_opts->warn_dollars = 0;
225 flag_const_strings = c_dialect_cxx ();
226 flag_exceptions = c_dialect_cxx ();
227 warn_pointer_arith = c_dialect_cxx ();
229 deferred_opts = XNEWVEC (struct deferred_opt, argc);
231 result = lang_flags[c_language];
233 if (c_language == clk_c)
235 /* If preprocessing assembly language, accept any of the C-family
236 front end options since the driver may pass them through. */
237 for (i = 1; i < argc; i++)
238 if (! strcmp (argv[i], "-lang-asm"))
240 result |= CL_C | CL_ObjC | CL_CXX | CL_ObjCXX;
241 break;
244 #ifdef CL_Fortran
245 for (i = 1; i < argc; i++)
246 if (! strcmp (argv[i], "-lang-fortran"))
248 result |= CL_Fortran;
249 break;
251 #endif
254 return result;
257 /* Handle switch SCODE with argument ARG. VALUE is true, unless no-
258 form of an -f or -W option was given. Returns 0 if the switch was
259 invalid, a negative number to prevent language-independent
260 processing in toplev.c (a hack necessary for the short-term). */
262 c_common_handle_option (size_t scode, const char *arg, int value)
264 const struct cl_option *option = &cl_options[scode];
265 enum opt_code code = (enum opt_code) scode;
266 int result = 1;
268 switch (code)
270 default:
271 if (cl_options[code].flags & (CL_C | CL_CXX | CL_ObjC | CL_ObjCXX))
272 break;
273 #ifdef CL_Fortran
274 if (lang_fortran && (cl_options[code].flags & (CL_Fortran)))
275 break;
276 #endif
277 result = 0;
278 break;
280 case OPT__output_pch_:
281 pch_file = arg;
282 break;
284 case OPT_A:
285 defer_opt (code, arg);
286 break;
288 case OPT_C:
289 cpp_opts->discard_comments = 0;
290 break;
292 case OPT_CC:
293 cpp_opts->discard_comments = 0;
294 cpp_opts->discard_comments_in_macro_exp = 0;
295 break;
297 case OPT_D:
298 defer_opt (code, arg);
299 break;
301 case OPT_E:
302 flag_preprocess_only = 1;
303 break;
305 case OPT_H:
306 cpp_opts->print_include_names = 1;
307 break;
309 case OPT_F:
310 TARGET_OPTF (xstrdup (arg));
311 break;
313 case OPT_I:
314 if (strcmp (arg, "-"))
315 add_path (xstrdup (arg), BRACKET, 0, true);
316 else
318 if (quote_chain_split)
319 error ("-I- specified twice");
320 quote_chain_split = true;
321 split_quote_chain ();
322 inform ("obsolete option -I- used, please use -iquote instead");
324 break;
326 case OPT_M:
327 case OPT_MM:
328 /* When doing dependencies with -M or -MM, suppress normal
329 preprocessed output, but still do -dM etc. as software
330 depends on this. Preprocessed output does occur if -MD, -MMD
331 or environment var dependency generation is used. */
332 cpp_opts->deps.style = (code == OPT_M ? DEPS_SYSTEM: DEPS_USER);
333 flag_no_output = 1;
334 cpp_opts->inhibit_warnings = 1;
335 break;
337 case OPT_MD:
338 case OPT_MMD:
339 cpp_opts->deps.style = (code == OPT_MD ? DEPS_SYSTEM: DEPS_USER);
340 deps_file = arg;
341 break;
343 case OPT_MF:
344 deps_seen = true;
345 deps_file = arg;
346 break;
348 case OPT_MG:
349 deps_seen = true;
350 cpp_opts->deps.missing_files = true;
351 break;
353 case OPT_MP:
354 deps_seen = true;
355 cpp_opts->deps.phony_targets = true;
356 break;
358 case OPT_MQ:
359 case OPT_MT:
360 deps_seen = true;
361 defer_opt (code, arg);
362 break;
364 case OPT_P:
365 flag_no_line_commands = 1;
366 break;
368 case OPT_fworking_directory:
369 flag_working_directory = value;
370 break;
372 case OPT_U:
373 defer_opt (code, arg);
374 break;
376 case OPT_Wall:
377 set_Wunused (value);
378 set_Wformat (value);
379 set_Wimplicit (value);
380 warn_char_subscripts = value;
381 warn_missing_braces = value;
382 warn_parentheses = value;
383 warn_return_type = value;
384 warn_sequence_point = value; /* Was C only. */
385 if (c_dialect_cxx ())
386 warn_sign_compare = value;
387 warn_switch = value;
388 warn_strict_aliasing = value;
390 /* Only warn about unknown pragmas that are not in system
391 headers. */
392 warn_unknown_pragmas = value;
394 /* We save the value of warn_uninitialized, since if they put
395 -Wuninitialized on the command line, we need to generate a
396 warning about not using it without also specifying -O. */
397 if (warn_uninitialized != 1)
398 warn_uninitialized = (value ? 2 : 0);
400 if (!c_dialect_cxx ())
401 /* We set this to 2 here, but 1 in -Wmain, so -ffreestanding
402 can turn it off only if it's not explicit. */
403 warn_main = value * 2;
404 else
406 /* C++-specific warnings. */
407 warn_nonvdtor = value;
408 warn_reorder = value;
409 warn_nontemplate_friend = value;
412 cpp_opts->warn_trigraphs = value;
413 cpp_opts->warn_comments = value;
414 cpp_opts->warn_num_sign_change = value;
415 cpp_opts->warn_multichar = value; /* Was C++ only. */
416 break;
418 case OPT_Wcomment:
419 case OPT_Wcomments:
420 cpp_opts->warn_comments = value;
421 break;
423 case OPT_Wdeprecated:
424 cpp_opts->warn_deprecated = value;
425 break;
427 case OPT_Wdiv_by_zero:
428 warn_div_by_zero = value;
429 break;
431 case OPT_Wendif_labels:
432 cpp_opts->warn_endif_labels = value;
433 break;
435 case OPT_Werror:
436 cpp_opts->warnings_are_errors = value;
437 global_dc->warning_as_error_requested = value;
438 break;
440 case OPT_Werror_implicit_function_declaration:
441 mesg_implicit_function_declaration = 2;
442 break;
444 case OPT_Wformat:
445 set_Wformat (value);
446 break;
448 case OPT_Wformat_:
449 set_Wformat (atoi (arg));
450 break;
452 case OPT_Wimplicit:
453 set_Wimplicit (value);
454 break;
456 case OPT_Wimport:
457 /* Silently ignore for now. */
458 break;
460 case OPT_Winvalid_pch:
461 cpp_opts->warn_invalid_pch = value;
462 break;
464 case OPT_Wmain:
465 if (value)
466 warn_main = 1;
467 else
468 warn_main = -1;
469 break;
471 case OPT_Wmissing_include_dirs:
472 cpp_opts->warn_missing_include_dirs = value;
473 break;
475 case OPT_Wmultichar:
476 cpp_opts->warn_multichar = value;
477 break;
479 case OPT_Wnormalized_:
480 if (!value || (arg && strcasecmp (arg, "none") == 0))
481 cpp_opts->warn_normalize = normalized_none;
482 else if (!arg || strcasecmp (arg, "nfkc") == 0)
483 cpp_opts->warn_normalize = normalized_KC;
484 else if (strcasecmp (arg, "id") == 0)
485 cpp_opts->warn_normalize = normalized_identifier_C;
486 else if (strcasecmp (arg, "nfc") == 0)
487 cpp_opts->warn_normalize = normalized_C;
488 else
489 error ("argument %qs to %<-Wnormalized%> not recognized", arg);
490 break;
492 case OPT_Wreturn_type:
493 warn_return_type = value;
494 break;
496 case OPT_Wstrict_null_sentinel:
497 warn_strict_null_sentinel = value;
498 break;
500 case OPT_Wsystem_headers:
501 cpp_opts->warn_system_headers = value;
502 break;
504 case OPT_Wtraditional:
505 cpp_opts->warn_traditional = value;
506 break;
508 case OPT_Wtrigraphs:
509 cpp_opts->warn_trigraphs = value;
510 break;
512 case OPT_Wundef:
513 cpp_opts->warn_undef = value;
514 break;
516 case OPT_Wunknown_pragmas:
517 /* Set to greater than 1, so that even unknown pragmas in
518 system headers will be warned about. */
519 warn_unknown_pragmas = value * 2;
520 break;
522 case OPT_Wunused_macros:
523 warn_unused_macros = value;
524 break;
526 case OPT_Wvariadic_macros:
527 warn_variadic_macros = value;
528 break;
530 case OPT_Wwrite_strings:
531 if (!c_dialect_cxx ())
532 flag_const_strings = value;
533 else
534 warn_write_strings = value;
535 break;
537 case OPT_ansi:
538 if (!c_dialect_cxx ())
539 set_std_c89 (false, true);
540 else
541 set_std_cxx98 (true);
542 break;
544 case OPT_d:
545 handle_OPT_d (arg);
546 break;
548 case OPT_fcond_mismatch:
549 if (!c_dialect_cxx ())
551 flag_cond_mismatch = value;
552 break;
554 /* Fall through. */
556 case OPT_fall_virtual:
557 case OPT_falt_external_templates:
558 case OPT_fenum_int_equiv:
559 case OPT_fexternal_templates:
560 case OPT_fguiding_decls:
561 case OPT_fhonor_std:
562 case OPT_fhuge_objects:
563 case OPT_flabels_ok:
564 case OPT_fname_mangling_version_:
565 case OPT_fnew_abi:
566 case OPT_fnonnull_objects:
567 case OPT_fsquangle:
568 case OPT_fstrict_prototype:
569 case OPT_fthis_is_variable:
570 case OPT_fvtable_thunks:
571 case OPT_fxref:
572 case OPT_fvtable_gc:
573 warning (0, "switch %qs is no longer supported", option->opt_text);
574 break;
576 case OPT_faccess_control:
577 flag_access_control = value;
578 break;
580 case OPT_fasm:
581 flag_no_asm = !value;
582 break;
584 case OPT_fbuiltin:
585 flag_no_builtin = !value;
586 break;
588 case OPT_fbuiltin_:
589 if (value)
590 result = 0;
591 else
592 disable_builtin_function (arg);
593 break;
595 case OPT_fdollars_in_identifiers:
596 cpp_opts->dollars_in_ident = value;
597 break;
599 case OPT_ffreestanding:
600 value = !value;
601 /* Fall through.... */
602 case OPT_fhosted:
603 flag_hosted = value;
604 flag_no_builtin = !value;
605 /* warn_main will be 2 if set by -Wall, 1 if set by -Wmain */
606 if (!value && warn_main == 2)
607 warn_main = 0;
608 break;
610 case OPT_fshort_double:
611 flag_short_double = value;
612 break;
614 case OPT_fshort_enums:
615 flag_short_enums = value;
616 break;
618 case OPT_fshort_wchar:
619 flag_short_wchar = value;
620 break;
622 case OPT_fsigned_bitfields:
623 flag_signed_bitfields = value;
624 break;
626 case OPT_fsigned_char:
627 flag_signed_char = value;
628 break;
630 case OPT_funsigned_bitfields:
631 flag_signed_bitfields = !value;
632 break;
634 case OPT_funsigned_char:
635 flag_signed_char = !value;
636 break;
638 case OPT_fcheck_new:
639 flag_check_new = value;
640 break;
642 case OPT_fconserve_space:
643 flag_conserve_space = value;
644 break;
646 case OPT_fconst_strings:
647 flag_const_strings = value;
648 break;
650 case OPT_fconstant_string_class_:
651 constant_string_class_name = arg;
652 break;
654 case OPT_fdefault_inline:
655 flag_default_inline = value;
656 break;
658 case OPT_felide_constructors:
659 flag_elide_constructors = value;
660 break;
662 case OPT_fenforce_eh_specs:
663 flag_enforce_eh_specs = value;
664 break;
666 case OPT_fextended_identifiers:
667 cpp_opts->extended_identifiers = value;
668 break;
670 case OPT_ffor_scope:
671 flag_new_for_scope = value;
672 break;
674 case OPT_fgnu_keywords:
675 flag_no_gnu_keywords = !value;
676 break;
678 case OPT_fgnu_runtime:
679 flag_next_runtime = !value;
680 break;
682 case OPT_fhandle_exceptions:
683 warning (0, "-fhandle-exceptions has been renamed -fexceptions (and is now on by default)");
684 flag_exceptions = value;
685 break;
687 case OPT_fimplement_inlines:
688 flag_implement_inlines = value;
689 break;
691 case OPT_fimplicit_inline_templates:
692 flag_implicit_inline_templates = value;
693 break;
695 case OPT_fimplicit_templates:
696 flag_implicit_templates = value;
697 break;
699 case OPT_fms_extensions:
700 flag_ms_extensions = value;
701 break;
703 case OPT_fnext_runtime:
704 flag_next_runtime = value;
705 break;
707 case OPT_fnil_receivers:
708 flag_nil_receivers = value;
709 break;
711 case OPT_fnonansi_builtins:
712 flag_no_nonansi_builtin = !value;
713 break;
715 case OPT_foperator_names:
716 cpp_opts->operator_names = value;
717 break;
719 case OPT_foptional_diags:
720 flag_optional_diags = value;
721 break;
723 case OPT_fpch_deps:
724 cpp_opts->restore_pch_deps = value;
725 break;
727 case OPT_fpch_preprocess:
728 flag_pch_preprocess = value;
729 break;
731 case OPT_fpermissive:
732 flag_permissive = value;
733 break;
735 case OPT_fpreprocessed:
736 cpp_opts->preprocessed = value;
737 break;
739 case OPT_freplace_objc_classes:
740 flag_replace_objc_classes = value;
741 break;
743 case OPT_frepo:
744 flag_use_repository = value;
745 if (value)
746 flag_implicit_templates = 0;
747 break;
749 case OPT_frtti:
750 flag_rtti = value;
751 break;
753 case OPT_fshow_column:
754 cpp_opts->show_column = value;
755 break;
757 case OPT_fstats:
758 flag_detailed_statistics = value;
759 break;
761 case OPT_ftabstop_:
762 /* It is documented that we silently ignore silly values. */
763 if (value >= 1 && value <= 100)
764 cpp_opts->tabstop = value;
765 break;
767 case OPT_fexec_charset_:
768 cpp_opts->narrow_charset = arg;
769 break;
771 case OPT_fwide_exec_charset_:
772 cpp_opts->wide_charset = arg;
773 break;
775 case OPT_finput_charset_:
776 cpp_opts->input_charset = arg;
777 break;
779 case OPT_ftemplate_depth_:
780 max_tinst_depth = value;
781 break;
783 case OPT_fuse_cxa_atexit:
784 flag_use_cxa_atexit = value;
785 break;
787 case OPT_fvisibility_inlines_hidden:
788 visibility_options.inlines_hidden = value;
789 break;
791 case OPT_fweak:
792 flag_weak = value;
793 break;
795 case OPT_fthreadsafe_statics:
796 flag_threadsafe_statics = value;
797 break;
799 case OPT_fzero_link:
800 flag_zero_link = value;
801 break;
803 case OPT_gen_decls:
804 flag_gen_declaration = 1;
805 break;
807 case OPT_idirafter:
808 add_path (xstrdup (arg), AFTER, 0, true);
809 break;
811 case OPT_imacros:
812 case OPT_include:
813 defer_opt (code, arg);
814 break;
816 case OPT_iprefix:
817 iprefix = arg;
818 break;
820 case OPT_iquote:
821 add_path (xstrdup (arg), QUOTE, 0, true);
822 break;
824 case OPT_isysroot:
825 sysroot = arg;
826 break;
828 case OPT_isystem:
829 add_path (xstrdup (arg), SYSTEM, 0, true);
830 break;
832 case OPT_iwithprefix:
833 add_prefixed_path (arg, SYSTEM);
834 break;
836 case OPT_iwithprefixbefore:
837 add_prefixed_path (arg, BRACKET);
838 break;
840 case OPT_lang_asm:
841 cpp_set_lang (parse_in, CLK_ASM);
842 cpp_opts->dollars_in_ident = false;
843 break;
845 case OPT_lang_fortran:
846 lang_fortran = true;
847 break;
849 case OPT_lang_objc:
850 cpp_opts->objc = 1;
851 break;
853 case OPT_nostdinc:
854 std_inc = false;
855 break;
857 case OPT_nostdinc__:
858 std_cxx_inc = false;
859 break;
861 case OPT_o:
862 if (!out_fname)
863 out_fname = arg;
864 else
865 error ("output filename specified twice");
866 break;
868 /* We need to handle the -pedantic switches here, rather than in
869 c_common_post_options, so that a subsequent -Wno-endif-labels
870 is not overridden. */
871 case OPT_pedantic_errors:
872 cpp_opts->pedantic_errors = 1;
873 /* Fall through. */
874 case OPT_pedantic:
875 cpp_opts->pedantic = 1;
876 cpp_opts->warn_endif_labels = 1;
877 break;
879 case OPT_print_objc_runtime_info:
880 print_struct_values = 1;
881 break;
883 case OPT_print_pch_checksum:
884 c_common_print_pch_checksum (stdout);
885 exit_after_options = true;
886 break;
888 case OPT_remap:
889 cpp_opts->remap = 1;
890 break;
892 case OPT_std_c__98:
893 case OPT_std_gnu__98:
894 set_std_cxx98 (code == OPT_std_c__98 /* ISO */);
895 break;
897 case OPT_std_c89:
898 case OPT_std_iso9899_1990:
899 case OPT_std_iso9899_199409:
900 set_std_c89 (code == OPT_std_iso9899_199409 /* c94 */, true /* ISO */);
901 break;
903 case OPT_std_gnu89:
904 set_std_c89 (false /* c94 */, false /* ISO */);
905 break;
907 case OPT_std_c99:
908 case OPT_std_c9x:
909 case OPT_std_iso9899_1999:
910 case OPT_std_iso9899_199x:
911 set_std_c99 (true /* ISO */);
912 break;
914 case OPT_std_gnu99:
915 case OPT_std_gnu9x:
916 set_std_c99 (false /* ISO */);
917 break;
919 case OPT_trigraphs:
920 cpp_opts->trigraphs = 1;
921 break;
923 case OPT_traditional_cpp:
924 cpp_opts->traditional = 1;
925 break;
927 case OPT_undef:
928 flag_undef = 1;
929 break;
931 case OPT_w:
932 cpp_opts->inhibit_warnings = 1;
933 break;
935 case OPT_v:
936 verbose = true;
937 break;
940 return result;
943 /* Post-switch processing. */
944 bool
945 c_common_post_options (const char **pfilename)
947 struct cpp_callbacks *cb;
949 /* Canonicalize the input and output filenames. */
950 if (in_fnames == NULL)
952 in_fnames = XNEWVEC (const char *, 1);
953 in_fnames[0] = "";
955 else if (strcmp (in_fnames[0], "-") == 0)
956 in_fnames[0] = "";
958 if (out_fname == NULL || !strcmp (out_fname, "-"))
959 out_fname = "";
961 if (cpp_opts->deps.style == DEPS_NONE)
962 check_deps_environment_vars ();
964 handle_deferred_opts ();
966 sanitize_cpp_opts ();
968 register_include_chains (parse_in, sysroot, iprefix,
969 std_inc, std_cxx_inc && c_dialect_cxx (), verbose);
971 flag_inline_trees = 1;
973 /* Use tree inlining. */
974 if (!flag_no_inline)
975 flag_no_inline = 1;
976 if (flag_inline_functions)
977 flag_inline_trees = 2;
979 /* If we are given more than one input file, we must use
980 unit-at-a-time mode. */
981 if (num_in_fnames > 1)
982 flag_unit_at_a_time = 1;
984 /* Default to ObjC sjlj exception handling if NeXT runtime. */
985 if (flag_objc_sjlj_exceptions < 0)
986 flag_objc_sjlj_exceptions = flag_next_runtime;
987 if (flag_objc_exceptions && !flag_objc_sjlj_exceptions)
988 flag_exceptions = 1;
990 /* -Wextra implies -Wsign-compare and -Wmissing-field-initializers,
991 but not if explicitly overridden. */
992 if (warn_sign_compare == -1)
993 warn_sign_compare = extra_warnings;
994 if (warn_missing_field_initializers == -1)
995 warn_missing_field_initializers = extra_warnings;
997 /* Special format checking options don't work without -Wformat; warn if
998 they are used. */
999 if (!warn_format)
1001 warning (OPT_Wformat_y2k,
1002 "-Wformat-y2k ignored without -Wformat");
1003 warning (OPT_Wformat_extra_args,
1004 "-Wformat-extra-args ignored without -Wformat");
1005 warning (OPT_Wformat_zero_length,
1006 "-Wformat-zero-length ignored without -Wformat");
1007 warning (OPT_Wformat_nonliteral,
1008 "-Wformat-nonliteral ignored without -Wformat");
1009 warning (OPT_Wformat_security,
1010 "-Wformat-security ignored without -Wformat");
1013 /* C99 requires special handling of complex multiplication and division;
1014 -ffast-math and -fcx-limited-range are handled in process_options. */
1015 if (flag_isoc99)
1016 flag_complex_method = 2;
1018 if (flag_preprocess_only)
1020 /* Open the output now. We must do so even if flag_no_output is
1021 on, because there may be other output than from the actual
1022 preprocessing (e.g. from -dM). */
1023 if (out_fname[0] == '\0')
1024 out_stream = stdout;
1025 else
1026 out_stream = fopen (out_fname, "w");
1028 if (out_stream == NULL)
1030 fatal_error ("opening output file %s: %m", out_fname);
1031 return false;
1034 if (num_in_fnames > 1)
1035 error ("too many filenames given. Type %s --help for usage",
1036 progname);
1038 init_pp_output (out_stream);
1040 else
1042 init_c_lex ();
1044 /* Yuk. WTF is this? I do know ObjC relies on it somewhere. */
1045 input_location = UNKNOWN_LOCATION;
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);
1053 input_location = UNKNOWN_LOCATION;
1055 /* If an error has occurred in cpplib, note it so we fail
1056 immediately. */
1057 errorcount += cpp_errors (parse_in);
1059 *pfilename = this_input_filename
1060 = cpp_read_main_file (parse_in, in_fnames[0]);
1061 /* Don't do any compilation or preprocessing if there is no input file. */
1062 if (this_input_filename == NULL)
1064 errorcount++;
1065 return false;
1068 if (flag_working_directory
1069 && flag_preprocess_only && !flag_no_line_commands)
1070 pp_dir_change (parse_in, get_src_pwd ());
1072 return flag_preprocess_only;
1075 /* Front end initialization common to C, ObjC and C++. */
1076 bool
1077 c_common_init (void)
1079 /* Set up preprocessor arithmetic. Must be done after call to
1080 c_common_nodes_and_builtins for type nodes to be good. */
1081 cpp_opts->precision = TYPE_PRECISION (intmax_type_node);
1082 cpp_opts->char_precision = TYPE_PRECISION (char_type_node);
1083 cpp_opts->int_precision = TYPE_PRECISION (integer_type_node);
1084 cpp_opts->wchar_precision = TYPE_PRECISION (wchar_type_node);
1085 cpp_opts->unsigned_wchar = TYPE_UNSIGNED (wchar_type_node);
1086 cpp_opts->bytes_big_endian = BYTES_BIG_ENDIAN;
1088 /* This can't happen until after wchar_precision and bytes_big_endian
1089 are known. */
1090 cpp_init_iconv (parse_in);
1092 if (version_flag)
1093 c_common_print_pch_checksum (stderr);
1095 if (flag_preprocess_only)
1097 finish_options ();
1098 preprocess_file (parse_in);
1099 return false;
1102 /* Has to wait until now so that cpplib has its hash table. */
1103 init_pragma ();
1105 return true;
1108 /* Initialize the integrated preprocessor after debug output has been
1109 initialized; loop over each input file. */
1110 void
1111 c_common_parse_file (int set_yydebug)
1113 unsigned int i;
1115 /* Enable parser debugging, if requested and we can. If requested
1116 and we can't, notify the user. */
1117 #if YYDEBUG != 0
1118 yydebug = set_yydebug;
1119 #else
1120 if (set_yydebug)
1121 warning (0, "YYDEBUG was not defined at build time, -dy ignored");
1122 #endif
1124 i = 0;
1125 for (;;)
1127 /* Start the main input file, if the debug writer wants it. */
1128 if (debug_hooks->start_end_main_source_file)
1129 (*debug_hooks->start_source_file) (0, this_input_filename);
1130 finish_options ();
1131 pch_init ();
1132 push_file_scope ();
1133 c_parse_file ();
1134 finish_file ();
1135 pop_file_scope ();
1136 /* And end the main input file, if the debug writer wants it */
1137 if (debug_hooks->start_end_main_source_file)
1138 (*debug_hooks->end_source_file) (0);
1139 if (++i >= num_in_fnames)
1140 break;
1141 cpp_undef_all (parse_in);
1142 this_input_filename
1143 = cpp_read_main_file (parse_in, in_fnames[i]);
1144 /* If an input file is missing, abandon further compilation.
1145 cpplib has issued a diagnostic. */
1146 if (!this_input_filename)
1147 break;
1151 /* Common finish hook for the C, ObjC and C++ front ends. */
1152 void
1153 c_common_finish (void)
1155 FILE *deps_stream = NULL;
1157 if (cpp_opts->deps.style != DEPS_NONE)
1159 /* If -M or -MM was seen without -MF, default output to the
1160 output stream. */
1161 if (!deps_file)
1162 deps_stream = out_stream;
1163 else
1165 deps_stream = fopen (deps_file, deps_append ? "a": "w");
1166 if (!deps_stream)
1167 fatal_error ("opening dependency file %s: %m", deps_file);
1171 /* For performance, avoid tearing down cpplib's internal structures
1172 with cpp_destroy (). */
1173 errorcount += cpp_finish (parse_in, deps_stream);
1175 if (deps_stream && deps_stream != out_stream
1176 && (ferror (deps_stream) || fclose (deps_stream)))
1177 fatal_error ("closing dependency file %s: %m", deps_file);
1179 if (out_stream && (ferror (out_stream) || fclose (out_stream)))
1180 fatal_error ("when writing output to %s: %m", out_fname);
1183 /* Either of two environment variables can specify output of
1184 dependencies. Their value is either "OUTPUT_FILE" or "OUTPUT_FILE
1185 DEPS_TARGET", where OUTPUT_FILE is the file to write deps info to
1186 and DEPS_TARGET is the target to mention in the deps. They also
1187 result in dependency information being appended to the output file
1188 rather than overwriting it, and like Sun's compiler
1189 SUNPRO_DEPENDENCIES suppresses the dependency on the main file. */
1190 static void
1191 check_deps_environment_vars (void)
1193 char *spec;
1195 GET_ENVIRONMENT (spec, "DEPENDENCIES_OUTPUT");
1196 if (spec)
1197 cpp_opts->deps.style = DEPS_USER;
1198 else
1200 GET_ENVIRONMENT (spec, "SUNPRO_DEPENDENCIES");
1201 if (spec)
1203 cpp_opts->deps.style = DEPS_SYSTEM;
1204 cpp_opts->deps.ignore_main_file = true;
1208 if (spec)
1210 /* Find the space before the DEPS_TARGET, if there is one. */
1211 char *s = strchr (spec, ' ');
1212 if (s)
1214 /* Let the caller perform MAKE quoting. */
1215 defer_opt (OPT_MT, s + 1);
1216 *s = '\0';
1219 /* Command line -MF overrides environment variables and default. */
1220 if (!deps_file)
1221 deps_file = spec;
1223 deps_append = 1;
1224 deps_seen = true;
1228 /* Handle deferred command line switches. */
1229 static void
1230 handle_deferred_opts (void)
1232 size_t i;
1233 struct deps *deps;
1235 /* Avoid allocating the deps buffer if we don't need it.
1236 (This flag may be true without there having been -MT or -MQ
1237 options, but we'll still need the deps buffer.) */
1238 if (!deps_seen)
1239 return;
1241 deps = cpp_get_deps (parse_in);
1243 for (i = 0; i < deferred_count; i++)
1245 struct deferred_opt *opt = &deferred_opts[i];
1247 if (opt->code == OPT_MT || opt->code == OPT_MQ)
1248 deps_add_target (deps, opt->arg, opt->code == OPT_MQ);
1252 /* These settings are appropriate for GCC, but not necessarily so for
1253 cpplib as a library. */
1254 static void
1255 sanitize_cpp_opts (void)
1257 /* If we don't know what style of dependencies to output, complain
1258 if any other dependency switches have been given. */
1259 if (deps_seen && cpp_opts->deps.style == DEPS_NONE)
1260 error ("to generate dependencies you must specify either -M or -MM");
1262 /* -dM and dependencies suppress normal output; do it here so that
1263 the last -d[MDN] switch overrides earlier ones. */
1264 if (flag_dump_macros == 'M')
1265 flag_no_output = 1;
1267 /* Disable -dD, -dN and -dI if normal output is suppressed. Allow
1268 -dM since at least glibc relies on -M -dM to work. */
1269 /* Also, flag_no_output implies flag_no_line_commands, always. */
1270 if (flag_no_output)
1272 if (flag_dump_macros != 'M')
1273 flag_dump_macros = 0;
1274 flag_dump_includes = 0;
1275 flag_no_line_commands = 1;
1278 cpp_opts->unsigned_char = !flag_signed_char;
1279 cpp_opts->stdc_0_in_system_headers = STDC_0_IN_SYSTEM_HEADERS;
1281 /* We want -Wno-long-long to override -pedantic -std=non-c99
1282 and/or -Wtraditional, whatever the ordering. */
1283 cpp_opts->warn_long_long
1284 = warn_long_long && ((!flag_isoc99 && pedantic) || warn_traditional);
1286 /* Similarly with -Wno-variadic-macros. No check for c99 here, since
1287 this also turns off warnings about GCCs extension. */
1288 cpp_opts->warn_variadic_macros
1289 = warn_variadic_macros && (pedantic || warn_traditional);
1291 /* If we're generating preprocessor output, emit current directory
1292 if explicitly requested or if debugging information is enabled.
1293 ??? Maybe we should only do it for debugging formats that
1294 actually output the current directory? */
1295 if (flag_working_directory == -1)
1296 flag_working_directory = (debug_info_level != DINFO_LEVEL_NONE);
1299 /* Add include path with a prefix at the front of its name. */
1300 static void
1301 add_prefixed_path (const char *suffix, size_t chain)
1303 char *path;
1304 const char *prefix;
1305 size_t prefix_len, suffix_len;
1307 suffix_len = strlen (suffix);
1308 prefix = iprefix ? iprefix : cpp_GCC_INCLUDE_DIR;
1309 prefix_len = iprefix ? strlen (iprefix) : cpp_GCC_INCLUDE_DIR_len;
1311 path = (char *) xmalloc (prefix_len + suffix_len + 1);
1312 memcpy (path, prefix, prefix_len);
1313 memcpy (path + prefix_len, suffix, suffix_len);
1314 path[prefix_len + suffix_len] = '\0';
1316 add_path (path, chain, 0, false);
1319 /* Handle -D, -U, -A, -imacros, and the first -include. */
1320 static void
1321 finish_options (void)
1323 if (!cpp_opts->preprocessed)
1325 size_t i;
1327 cb_file_change (parse_in,
1328 linemap_add (&line_table, LC_RENAME, 0,
1329 _("<built-in>"), 0));
1331 cpp_init_builtins (parse_in, flag_hosted);
1332 c_cpp_builtins (parse_in);
1334 /* We're about to send user input to cpplib, so make it warn for
1335 things that we previously (when we sent it internal definitions)
1336 told it to not warn.
1338 C99 permits implementation-defined characters in identifiers.
1339 The documented meaning of -std= is to turn off extensions that
1340 conflict with the specified standard, and since a strictly
1341 conforming program cannot contain a '$', we do not condition
1342 their acceptance on the -std= setting. */
1343 cpp_opts->warn_dollars = (cpp_opts->pedantic && !cpp_opts->c99);
1345 cpp_change_file (parse_in, LC_RENAME, _("<command line>"));
1346 for (i = 0; i < deferred_count; i++)
1348 struct deferred_opt *opt = &deferred_opts[i];
1350 if (opt->code == OPT_D)
1351 cpp_define (parse_in, opt->arg);
1352 else if (opt->code == OPT_U)
1353 cpp_undef (parse_in, opt->arg);
1354 else if (opt->code == OPT_A)
1356 if (opt->arg[0] == '-')
1357 cpp_unassert (parse_in, opt->arg + 1);
1358 else
1359 cpp_assert (parse_in, opt->arg);
1363 /* Handle -imacros after -D and -U. */
1364 for (i = 0; i < deferred_count; i++)
1366 struct deferred_opt *opt = &deferred_opts[i];
1368 if (opt->code == OPT_imacros
1369 && cpp_push_include (parse_in, opt->arg))
1371 /* Disable push_command_line_include callback for now. */
1372 include_cursor = deferred_count + 1;
1373 cpp_scan_nooutput (parse_in);
1378 include_cursor = 0;
1379 push_command_line_include ();
1382 /* Give CPP the next file given by -include, if any. */
1383 static void
1384 push_command_line_include (void)
1386 while (include_cursor < deferred_count)
1388 struct deferred_opt *opt = &deferred_opts[include_cursor++];
1390 if (!cpp_opts->preprocessed && opt->code == OPT_include
1391 && cpp_push_include (parse_in, opt->arg))
1392 return;
1395 if (include_cursor == deferred_count)
1397 include_cursor++;
1398 /* -Wunused-macros should only warn about macros defined hereafter. */
1399 cpp_opts->warn_unused_macros = warn_unused_macros;
1400 /* Restore the line map from <command line>. */
1401 if (!cpp_opts->preprocessed)
1402 cpp_change_file (parse_in, LC_RENAME, this_input_filename);
1404 /* Set this here so the client can change the option if it wishes,
1405 and after stacking the main file so we don't trace the main file. */
1406 line_table.trace_includes = cpp_opts->print_include_names;
1410 /* File change callback. Has to handle -include files. */
1411 static void
1412 cb_file_change (cpp_reader * ARG_UNUSED (pfile),
1413 const struct line_map *new_map)
1415 if (flag_preprocess_only)
1416 pp_file_change (new_map);
1417 else
1418 fe_file_change (new_map);
1420 if (new_map == 0 || (new_map->reason == LC_LEAVE && MAIN_FILE_P (new_map)))
1421 push_command_line_include ();
1424 void
1425 cb_dir_change (cpp_reader * ARG_UNUSED (pfile), const char *dir)
1427 if (!set_src_pwd (dir))
1428 warning (0, "too late for # directive to set debug directory");
1431 /* Set the C 89 standard (with 1994 amendments if C94, without GNU
1432 extensions if ISO). There is no concept of gnu94. */
1433 static void
1434 set_std_c89 (int c94, int iso)
1436 cpp_set_lang (parse_in, c94 ? CLK_STDC94: iso ? CLK_STDC89: CLK_GNUC89);
1437 flag_iso = iso;
1438 flag_no_asm = iso;
1439 flag_no_gnu_keywords = iso;
1440 flag_no_nonansi_builtin = iso;
1441 flag_isoc94 = c94;
1442 flag_isoc99 = 0;
1445 /* Set the C 99 standard (without GNU extensions if ISO). */
1446 static void
1447 set_std_c99 (int iso)
1449 cpp_set_lang (parse_in, iso ? CLK_STDC99: CLK_GNUC99);
1450 flag_no_asm = iso;
1451 flag_no_nonansi_builtin = iso;
1452 flag_iso = iso;
1453 flag_isoc99 = 1;
1454 flag_isoc94 = 1;
1457 /* Set the C++ 98 standard (without GNU extensions if ISO). */
1458 static void
1459 set_std_cxx98 (int iso)
1461 cpp_set_lang (parse_in, iso ? CLK_CXX98: CLK_GNUCXX);
1462 flag_no_gnu_keywords = iso;
1463 flag_no_nonansi_builtin = iso;
1464 flag_iso = iso;
1467 /* Handle setting implicit to ON. */
1468 static void
1469 set_Wimplicit (int on)
1471 warn_implicit = on;
1472 warn_implicit_int = on;
1473 if (on)
1475 if (mesg_implicit_function_declaration != 2)
1476 mesg_implicit_function_declaration = 1;
1478 else
1479 mesg_implicit_function_declaration = 0;
1482 /* Args to -d specify what to dump. Silently ignore
1483 unrecognized options; they may be aimed at toplev.c. */
1484 static void
1485 handle_OPT_d (const char *arg)
1487 char c;
1489 while ((c = *arg++) != '\0')
1490 switch (c)
1492 case 'M': /* Dump macros only. */
1493 case 'N': /* Dump names. */
1494 case 'D': /* Dump definitions. */
1495 flag_dump_macros = c;
1496 break;
1498 case 'I':
1499 flag_dump_includes = 1;
1500 break;