PR c++/11503
[official-gcc.git] / gcc / c-opts.c
blobbf60504bab790dcdee376c11d884895f0b762e3f
1 /* C/ObjC/C++ command line option handling.
2 Copyright (C) 2002, 2003 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, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, 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"
41 #ifndef DOLLARS_IN_IDENTIFIERS
42 # define DOLLARS_IN_IDENTIFIERS true
43 #endif
45 #ifndef TARGET_SYSTEM_ROOT
46 # define TARGET_SYSTEM_ROOT NULL
47 #endif
49 static int saved_lineno;
51 /* CPP's options. */
52 static cpp_options *cpp_opts;
54 /* Input filename. */
55 static const char **in_fnames;
56 static unsigned num_in_fnames;
58 /* Filename and stream for preprocessed output. */
59 static const char *out_fname;
60 static FILE *out_stream;
62 /* Append dependencies to deps_file. */
63 static bool deps_append;
65 /* If dependency switches (-MF etc.) have been given. */
66 static bool deps_seen;
68 /* If -v seen. */
69 static bool verbose;
71 /* Dependency output file. */
72 static const char *deps_file;
74 /* The prefix given by -iprefix, if any. */
75 static const char *iprefix;
77 /* The system root, if any. Overridden by -isysroot. */
78 static const char *sysroot = TARGET_SYSTEM_ROOT;
80 /* Zero disables all standard directories for headers. */
81 static bool std_inc = true;
83 /* Zero disables the C++-specific standard directories for headers. */
84 static bool std_cxx_inc = true;
86 /* If the quote chain has been split by -I-. */
87 static bool quote_chain_split;
89 /* If -Wunused-macros. */
90 static bool warn_unused_macros;
92 /* Number of deferred options. */
93 static size_t deferred_count;
95 /* Number of deferred options scanned for -include. */
96 static size_t include_cursor;
98 /* Permit Fotran front-end options. */
99 static bool permit_fortran_options;
101 static void set_Wimplicit (int);
102 static void print_help (void);
103 static void handle_OPT_d (const char *);
104 static void set_std_cxx98 (int);
105 static void set_std_c89 (int, int);
106 static void set_std_c99 (int);
107 static void check_deps_environment_vars (void);
108 static void handle_deferred_opts (void);
109 static void sanitize_cpp_opts (void);
110 static void add_prefixed_path (const char *, size_t);
111 static void push_command_line_include (void);
112 static void cb_file_change (cpp_reader *, const struct line_map *);
113 static void finish_options (void);
115 #ifndef STDC_0_IN_SYSTEM_HEADERS
116 #define STDC_0_IN_SYSTEM_HEADERS 0
117 #endif
119 /* Holds switches parsed by c_common_handle_option (), but whose
120 handling is deferred to c_common_post_options (). */
121 static void defer_opt (enum opt_code, const char *);
122 static struct deferred_opt
124 enum opt_code code;
125 const char *arg;
126 } *deferred_opts;
128 /* Complain that switch CODE expects an argument but none was
129 provided. OPT was the command-line option. Return FALSE to get
130 the default message in opts.c, TRUE if we provide a specialized
131 one. */
132 bool
133 c_common_missing_argument (const char *opt, size_t code)
135 switch (code)
137 default:
138 /* Pick up the default message. */
139 return false;
141 case OPT_fconstant_string_class_:
142 error ("no class name specified with \"%s\"", opt);
143 break;
145 case OPT_A:
146 error ("assertion missing after \"%s\"", opt);
147 break;
149 case OPT_D:
150 case OPT_U:
151 error ("macro name missing after \"%s\"", opt);
152 break;
154 case OPT_I:
155 case OPT_idirafter:
156 case OPT_isysroot:
157 case OPT_isystem:
158 error ("missing path after \"%s\"", opt);
159 break;
161 case OPT_MF:
162 case OPT_MD:
163 case OPT_MMD:
164 case OPT_include:
165 case OPT_imacros:
166 case OPT_o:
167 error ("missing filename after \"%s\"", opt);
168 break;
170 case OPT_MQ:
171 case OPT_MT:
172 error ("missing makefile target after \"%s\"", opt);
173 break;
176 return true;
179 /* Defer option CODE with argument ARG. */
180 static void
181 defer_opt (enum opt_code code, const char *arg)
183 deferred_opts[deferred_count].code = code;
184 deferred_opts[deferred_count].arg = arg;
185 deferred_count++;
188 /* Common initialization before parsing options. */
189 unsigned int
190 c_common_init_options (unsigned int argc, const char **argv ATTRIBUTE_UNUSED)
192 static const unsigned int lang_flags[] = {CL_C, CL_ObjC, CL_CXX, CL_ObjCXX};
193 unsigned int result;
195 /* This is conditionalized only because that is the way the front
196 ends used to do it. Maybe this should be unconditional? */
197 if (c_dialect_cxx ())
199 /* By default wrap lines at 80 characters. Is getenv
200 ("COLUMNS") preferable? */
201 diagnostic_line_cutoff (global_dc) = 80;
202 /* By default, emit location information once for every
203 diagnostic message. */
204 diagnostic_prefixing_rule (global_dc) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
207 parse_in = cpp_create_reader (c_dialect_cxx () ? CLK_GNUCXX: CLK_GNUC89,
208 ident_hash);
210 cpp_opts = cpp_get_options (parse_in);
211 cpp_opts->dollars_in_ident = DOLLARS_IN_IDENTIFIERS;
212 cpp_opts->objc = c_dialect_objc ();
214 /* Reset to avoid warnings on internal definitions. We set it just
215 before passing on command-line options to cpplib. */
216 cpp_opts->warn_dollars = 0;
218 flag_const_strings = c_dialect_cxx ();
219 flag_exceptions = c_dialect_cxx ();
220 warn_pointer_arith = c_dialect_cxx ();
222 deferred_opts = (struct deferred_opt *)
223 xmalloc (argc * sizeof (struct deferred_opt));
225 result = lang_flags[c_language];
227 /* If potentially preprocessing Fortran we have to accept its front
228 end options since the driver passes most of them through. */
229 #ifdef CL_F77
230 if (c_language == clk_c && argc > 2
231 && !strcmp (argv[2], "-traditional-cpp" ))
233 permit_fortran_options = true;
234 result |= CL_F77;
236 #endif
238 return result;
241 /* Handle switch SCODE with argument ARG. ON is true, unless no-
242 form of an -f or -W option was given. Returns 0 if the switch was
243 invalid, a negative number to prevent language-independent
244 processing in toplev.c (a hack necessary for the short-term). */
246 c_common_handle_option (size_t scode, const char *arg, int value)
248 const struct cl_option *option = &cl_options[scode];
249 enum opt_code code = (enum opt_code) scode;
250 int result = 1;
252 switch (code)
254 default:
255 result = permit_fortran_options;
256 break;
258 case OPT__help:
259 print_help ();
260 break;
262 case OPT__output_pch_:
263 pch_file = arg;
264 break;
266 case OPT_A:
267 defer_opt (code, arg);
268 break;
270 case OPT_C:
271 cpp_opts->discard_comments = 0;
272 break;
274 case OPT_CC:
275 cpp_opts->discard_comments = 0;
276 cpp_opts->discard_comments_in_macro_exp = 0;
277 break;
279 case OPT_D:
280 defer_opt (code, arg);
281 break;
283 case OPT_E:
284 flag_preprocess_only = 1;
285 break;
287 case OPT_H:
288 cpp_opts->print_include_names = 1;
289 break;
291 case OPT_I:
292 if (strcmp (arg, "-"))
293 add_path (xstrdup (arg), BRACKET, 0);
294 else
296 if (quote_chain_split)
297 error ("-I- specified twice");
298 quote_chain_split = true;
299 split_quote_chain ();
301 break;
303 case OPT_M:
304 case OPT_MM:
305 /* When doing dependencies with -M or -MM, suppress normal
306 preprocessed output, but still do -dM etc. as software
307 depends on this. Preprocessed output does occur if -MD, -MMD
308 or environment var dependency generation is used. */
309 cpp_opts->deps.style = (code == OPT_M ? DEPS_SYSTEM: DEPS_USER);
310 flag_no_output = 1;
311 cpp_opts->inhibit_warnings = 1;
312 break;
314 case OPT_MD:
315 case OPT_MMD:
316 cpp_opts->deps.style = (code == OPT_MD ? DEPS_SYSTEM: DEPS_USER);
317 deps_file = arg;
318 break;
320 case OPT_MF:
321 deps_seen = true;
322 deps_file = arg;
323 break;
325 case OPT_MG:
326 deps_seen = true;
327 cpp_opts->deps.missing_files = true;
328 break;
330 case OPT_MP:
331 deps_seen = true;
332 cpp_opts->deps.phony_targets = true;
333 break;
335 case OPT_MQ:
336 case OPT_MT:
337 deps_seen = true;
338 defer_opt (code, arg);
339 break;
341 case OPT_P:
342 flag_no_line_commands = 1;
343 break;
345 case OPT_U:
346 defer_opt (code, arg);
347 break;
349 case OPT_Wabi:
350 warn_abi = value;
351 break;
353 case OPT_Wall:
354 set_Wunused (value);
355 set_Wformat (value);
356 set_Wimplicit (value);
357 warn_char_subscripts = value;
358 warn_missing_braces = value;
359 warn_parentheses = value;
360 warn_return_type = value;
361 warn_sequence_point = value; /* Was C only. */
362 if (c_dialect_cxx ())
363 warn_sign_compare = value;
364 warn_switch = value;
365 warn_strict_aliasing = value;
367 /* Only warn about unknown pragmas that are not in system
368 headers. */
369 warn_unknown_pragmas = value;
371 /* We save the value of warn_uninitialized, since if they put
372 -Wuninitialized on the command line, we need to generate a
373 warning about not using it without also specifying -O. */
374 if (warn_uninitialized != 1)
375 warn_uninitialized = (value ? 2 : 0);
377 if (!c_dialect_cxx ())
378 /* We set this to 2 here, but 1 in -Wmain, so -ffreestanding
379 can turn it off only if it's not explicit. */
380 warn_main = value * 2;
381 else
383 /* C++-specific warnings. */
384 warn_nonvdtor = value;
385 warn_reorder = value;
386 warn_nontemplate_friend = value;
389 cpp_opts->warn_trigraphs = value;
390 cpp_opts->warn_comments = value;
391 cpp_opts->warn_num_sign_change = value;
392 cpp_opts->warn_multichar = value; /* Was C++ only. */
393 break;
395 case OPT_Wbad_function_cast:
396 warn_bad_function_cast = value;
397 break;
399 case OPT_Wcast_qual:
400 warn_cast_qual = value;
401 break;
403 case OPT_Wchar_subscripts:
404 warn_char_subscripts = value;
405 break;
407 case OPT_Wcomment:
408 case OPT_Wcomments:
409 cpp_opts->warn_comments = value;
410 break;
412 case OPT_Wconversion:
413 warn_conversion = value;
414 break;
416 case OPT_Wctor_dtor_privacy:
417 warn_ctor_dtor_privacy = value;
418 break;
420 case OPT_Wdeprecated:
421 warn_deprecated = value;
422 cpp_opts->warn_deprecated = value;
423 break;
425 case OPT_Wdiv_by_zero:
426 warn_div_by_zero = value;
427 break;
429 case OPT_Weffc__:
430 warn_ecpp = value;
431 break;
433 case OPT_Wendif_labels:
434 cpp_opts->warn_endif_labels = value;
435 break;
437 case OPT_Werror:
438 cpp_opts->warnings_are_errors = value;
439 break;
441 case OPT_Werror_implicit_function_declaration:
442 mesg_implicit_function_declaration = 2;
443 break;
445 case OPT_Wfloat_equal:
446 warn_float_equal = value;
447 break;
449 case OPT_Wformat:
450 set_Wformat (value);
451 break;
453 case OPT_Wformat_:
454 set_Wformat (atoi (arg));
455 break;
457 case OPT_Wformat_extra_args:
458 warn_format_extra_args = value;
459 break;
461 case OPT_Wformat_nonliteral:
462 warn_format_nonliteral = value;
463 break;
465 case OPT_Wformat_security:
466 warn_format_security = value;
467 break;
469 case OPT_Wformat_y2k:
470 warn_format_y2k = value;
471 break;
473 case OPT_Wformat_zero_length:
474 warn_format_zero_length = value;
475 break;
477 case OPT_Wimplicit:
478 set_Wimplicit (value);
479 break;
481 case OPT_Wimplicit_function_declaration:
482 mesg_implicit_function_declaration = value;
483 break;
485 case OPT_Wimplicit_int:
486 warn_implicit_int = value;
487 break;
489 case OPT_Wimport:
490 cpp_opts->warn_import = value;
491 break;
493 case OPT_Winvalid_offsetof:
494 warn_invalid_offsetof = value;
495 break;
497 case OPT_Winvalid_pch:
498 cpp_opts->warn_invalid_pch = value;
499 break;
501 case OPT_Wlong_long:
502 warn_long_long = value;
503 break;
505 case OPT_Wmain:
506 if (value)
507 warn_main = 1;
508 else
509 warn_main = -1;
510 break;
512 case OPT_Wmissing_braces:
513 warn_missing_braces = value;
514 break;
516 case OPT_Wmissing_declarations:
517 warn_missing_declarations = value;
518 break;
520 case OPT_Wmissing_format_attribute:
521 warn_missing_format_attribute = value;
522 break;
524 case OPT_Wmissing_prototypes:
525 warn_missing_prototypes = value;
526 break;
528 case OPT_Wmultichar:
529 cpp_opts->warn_multichar = value;
530 break;
532 case OPT_Wnested_externs:
533 warn_nested_externs = value;
534 break;
536 case OPT_Wnon_template_friend:
537 warn_nontemplate_friend = value;
538 break;
540 case OPT_Wnon_virtual_dtor:
541 warn_nonvdtor = value;
542 break;
544 case OPT_Wnonnull:
545 warn_nonnull = value;
546 break;
548 case OPT_Wold_style_cast:
549 warn_old_style_cast = value;
550 break;
552 case OPT_Woverloaded_virtual:
553 warn_overloaded_virtual = value;
554 break;
556 case OPT_Wparentheses:
557 warn_parentheses = value;
558 break;
560 case OPT_Wpmf_conversions:
561 warn_pmf2ptr = value;
562 break;
564 case OPT_Wpointer_arith:
565 warn_pointer_arith = value;
566 break;
568 case OPT_Wprotocol:
569 warn_protocol = value;
570 break;
572 case OPT_Wselector:
573 warn_selector = value;
574 break;
576 case OPT_Wredundant_decls:
577 warn_redundant_decls = value;
578 break;
580 case OPT_Wreorder:
581 warn_reorder = value;
582 break;
584 case OPT_Wreturn_type:
585 warn_return_type = value;
586 break;
588 case OPT_Wsequence_point:
589 warn_sequence_point = value;
590 break;
592 case OPT_Wsign_compare:
593 warn_sign_compare = value;
594 break;
596 case OPT_Wsign_promo:
597 warn_sign_promo = value;
598 break;
600 case OPT_Wstrict_prototypes:
601 warn_strict_prototypes = value;
602 break;
604 case OPT_Wsynth:
605 warn_synth = value;
606 break;
608 case OPT_Wsystem_headers:
609 cpp_opts->warn_system_headers = value;
610 break;
612 case OPT_Wtraditional:
613 warn_traditional = value;
614 cpp_opts->warn_traditional = value;
615 break;
617 case OPT_Wtrigraphs:
618 cpp_opts->warn_trigraphs = value;
619 break;
621 case OPT_Wundeclared_selector:
622 warn_undeclared_selector = value;
623 break;
625 case OPT_Wundef:
626 cpp_opts->warn_undef = value;
627 break;
629 case OPT_Wunknown_pragmas:
630 /* Set to greater than 1, so that even unknown pragmas in
631 system headers will be warned about. */
632 warn_unknown_pragmas = value * 2;
633 break;
635 case OPT_Wunused_macros:
636 warn_unused_macros = value;
637 break;
639 case OPT_Wwrite_strings:
640 if (!c_dialect_cxx ())
641 flag_const_strings = value;
642 else
643 warn_write_strings = value;
644 break;
646 case OPT_ansi:
647 if (!c_dialect_cxx ())
648 set_std_c89 (false, true);
649 else
650 set_std_cxx98 (true);
651 break;
653 case OPT_d:
654 handle_OPT_d (arg);
655 break;
657 case OPT_fcond_mismatch:
658 if (!c_dialect_cxx ())
660 flag_cond_mismatch = value;
661 break;
663 /* Fall through. */
665 case OPT_fall_virtual:
666 case OPT_fenum_int_equiv:
667 case OPT_fguiding_decls:
668 case OPT_fhonor_std:
669 case OPT_fhuge_objects:
670 case OPT_flabels_ok:
671 case OPT_fname_mangling_version_:
672 case OPT_fnew_abi:
673 case OPT_fnonnull_objects:
674 case OPT_fsquangle:
675 case OPT_fstrict_prototype:
676 case OPT_fthis_is_variable:
677 case OPT_fvtable_thunks:
678 case OPT_fxref:
679 warning ("switch \"%s\" is no longer supported", option->opt_text);
680 break;
682 case OPT_fabi_version_:
683 flag_abi_version = value;
684 break;
686 case OPT_faccess_control:
687 flag_access_control = value;
688 break;
690 case OPT_falt_external_templates:
691 flag_alt_external_templates = value;
692 if (value)
693 flag_external_templates = true;
694 cp_deprecated:
695 warning ("switch \"%s\" is deprecated, please see documentation "
696 "for details", option->opt_text);
697 break;
699 case OPT_fasm:
700 flag_no_asm = !value;
701 break;
703 case OPT_fbuiltin:
704 flag_no_builtin = !value;
705 break;
707 case OPT_fbuiltin_:
708 if (value)
709 result = 0;
710 else
711 disable_builtin_function (arg);
712 break;
714 case OPT_fdollars_in_identifiers:
715 cpp_opts->dollars_in_ident = value;
716 break;
718 case OPT_fdump_:
719 if (!dump_switch_p (arg))
720 result = 0;
721 break;
723 case OPT_ffreestanding:
724 value = !value;
725 /* Fall through... */
726 case OPT_fhosted:
727 flag_hosted = value;
728 flag_no_builtin = !value;
729 /* warn_main will be 2 if set by -Wall, 1 if set by -Wmain */
730 if (!value && warn_main == 2)
731 warn_main = 0;
732 break;
734 case OPT_fshort_double:
735 flag_short_double = value;
736 break;
738 case OPT_fshort_enums:
739 flag_short_enums = value;
740 break;
742 case OPT_fshort_wchar:
743 flag_short_wchar = value;
744 break;
746 case OPT_fsigned_bitfields:
747 flag_signed_bitfields = value;
748 explicit_flag_signed_bitfields = 1;
749 break;
751 case OPT_fsigned_char:
752 flag_signed_char = value;
753 break;
755 case OPT_funsigned_bitfields:
756 flag_signed_bitfields = !value;
757 explicit_flag_signed_bitfields = 1;
758 break;
760 case OPT_funsigned_char:
761 flag_signed_char = !value;
762 break;
764 case OPT_fcheck_new:
765 flag_check_new = value;
766 break;
768 case OPT_fconserve_space:
769 flag_conserve_space = value;
770 break;
772 case OPT_fconst_strings:
773 flag_const_strings = value;
774 break;
776 case OPT_fconstant_string_class_:
777 constant_string_class_name = arg;
778 break;
780 case OPT_fdefault_inline:
781 flag_default_inline = value;
782 break;
784 case OPT_felide_constructors:
785 flag_elide_constructors = value;
786 break;
788 case OPT_fenforce_eh_specs:
789 flag_enforce_eh_specs = value;
790 break;
792 case OPT_fexternal_templates:
793 flag_external_templates = value;
794 goto cp_deprecated;
796 case OPT_ffixed_form:
797 case OPT_ffixed_line_length_:
798 /* Fortran front end options ignored when preprocessing only. */
799 if (!flag_preprocess_only)
800 result = 0;
801 break;
803 case OPT_ffor_scope:
804 flag_new_for_scope = value;
805 break;
807 case OPT_fgnu_keywords:
808 flag_no_gnu_keywords = !value;
809 break;
811 case OPT_fgnu_runtime:
812 flag_next_runtime = !value;
813 break;
815 case OPT_fhandle_exceptions:
816 warning ("-fhandle-exceptions has been renamed -fexceptions (and is now on by default)");
817 flag_exceptions = value;
818 break;
820 case OPT_fimplement_inlines:
821 flag_implement_inlines = value;
822 break;
824 case OPT_fimplicit_inline_templates:
825 flag_implicit_inline_templates = value;
826 break;
828 case OPT_fimplicit_templates:
829 flag_implicit_templates = value;
830 break;
832 case OPT_fms_extensions:
833 flag_ms_extensions = value;
834 break;
836 case OPT_fnext_runtime:
837 flag_next_runtime = value;
838 break;
840 case OPT_fnonansi_builtins:
841 flag_no_nonansi_builtin = !value;
842 break;
844 case OPT_foperator_names:
845 cpp_opts->operator_names = value;
846 break;
848 case OPT_foptional_diags:
849 flag_optional_diags = value;
850 break;
852 case OPT_fpch_deps:
853 cpp_opts->restore_pch_deps = value;
854 break;
856 case OPT_fpermissive:
857 flag_permissive = value;
858 break;
860 case OPT_fpreprocessed:
861 cpp_opts->preprocessed = value;
862 break;
864 case OPT_frepo:
865 flag_use_repository = value;
866 if (value)
867 flag_implicit_templates = 0;
868 break;
870 case OPT_frtti:
871 flag_rtti = value;
872 break;
874 case OPT_fshow_column:
875 cpp_opts->show_column = value;
876 break;
878 case OPT_fstats:
879 flag_detailed_statistics = value;
880 break;
882 case OPT_ftabstop_:
883 /* It is documented that we silently ignore silly values. */
884 if (value >= 1 && value <= 100)
885 cpp_opts->tabstop = value;
886 break;
888 case OPT_fexec_charset_:
889 cpp_opts->narrow_charset = arg;
890 break;
892 case OPT_fwide_exec_charset_:
893 cpp_opts->wide_charset = arg;
894 break;
896 case OPT_ftemplate_depth_:
897 max_tinst_depth = value;
898 break;
900 case OPT_fvtable_gc:
901 flag_vtable_gc = value;
902 break;
904 case OPT_fuse_cxa_atexit:
905 flag_use_cxa_atexit = value;
906 break;
908 case OPT_fweak:
909 flag_weak = value;
910 break;
912 case OPT_gen_decls:
913 flag_gen_declaration = 1;
914 break;
916 case OPT_idirafter:
917 add_path (xstrdup (arg), AFTER, 0);
918 break;
920 case OPT_imacros:
921 case OPT_include:
922 defer_opt (code, arg);
923 break;
925 case OPT_iprefix:
926 iprefix = arg;
927 break;
929 case OPT_isysroot:
930 sysroot = arg;
931 break;
933 case OPT_isystem:
934 add_path (xstrdup (arg), SYSTEM, 0);
935 break;
937 case OPT_iwithprefix:
938 add_prefixed_path (arg, SYSTEM);
939 break;
941 case OPT_iwithprefixbefore:
942 add_prefixed_path (arg, BRACKET);
943 break;
945 case OPT_lang_asm:
946 cpp_set_lang (parse_in, CLK_ASM);
947 cpp_opts->dollars_in_ident = false;
948 break;
950 case OPT_lang_objc:
951 cpp_opts->objc = 1;
952 break;
954 case OPT_nostdinc:
955 std_inc = false;
956 break;
958 case OPT_nostdinc__:
959 std_cxx_inc = false;
960 break;
962 case OPT_o:
963 if (!out_fname)
964 out_fname = arg;
965 else
966 error ("output filename specified twice");
967 break;
969 /* We need to handle the -pedantic switches here, rather than in
970 c_common_post_options, so that a subsequent -Wno-endif-labels
971 is not overridden. */
972 case OPT_pedantic_errors:
973 cpp_opts->pedantic_errors = 1;
974 /* fall through */
975 case OPT_pedantic:
976 cpp_opts->pedantic = 1;
977 cpp_opts->warn_endif_labels = 1;
978 break;
980 case OPT_print_objc_runtime_info:
981 print_struct_values = 1;
982 break;
984 case OPT_remap:
985 cpp_opts->remap = 1;
986 break;
988 case OPT_std_c__98:
989 case OPT_std_gnu__98:
990 set_std_cxx98 (code == OPT_std_c__98 /* ISO */);
991 break;
993 case OPT_std_c89:
994 case OPT_std_iso9899_1990:
995 case OPT_std_iso9899_199409:
996 set_std_c89 (code == OPT_std_iso9899_199409 /* c94 */, true /* ISO */);
997 break;
999 case OPT_std_gnu89:
1000 set_std_c89 (false /* c94 */, false /* ISO */);
1001 break;
1003 case OPT_std_c99:
1004 case OPT_std_c9x:
1005 case OPT_std_iso9899_1999:
1006 case OPT_std_iso9899_199x:
1007 set_std_c99 (true /* ISO */);
1008 break;
1010 case OPT_std_gnu99:
1011 case OPT_std_gnu9x:
1012 set_std_c99 (false /* ISO */);
1013 break;
1015 case OPT_trigraphs:
1016 cpp_opts->trigraphs = 1;
1017 break;
1019 case OPT_traditional_cpp:
1020 cpp_opts->traditional = 1;
1021 break;
1023 case OPT_undef:
1024 flag_undef = 1;
1025 break;
1027 case OPT_w:
1028 cpp_opts->inhibit_warnings = 1;
1029 break;
1031 case OPT_v:
1032 verbose = true;
1033 break;
1036 return result;
1039 /* Handle FILENAME from the command line. */
1040 void
1041 c_common_handle_filename (const char *filename)
1043 num_in_fnames++;
1044 in_fnames = xrealloc (in_fnames, num_in_fnames * sizeof (in_fnames[0]));
1045 in_fnames[num_in_fnames - 1] = filename;
1048 /* Post-switch processing. */
1049 bool
1050 c_common_post_options (const char **pfilename)
1052 /* Canonicalize the input and output filenames. */
1053 if (in_fnames == NULL)
1055 in_fnames = xmalloc (sizeof (in_fnames[0]));
1056 in_fnames[0] = "";
1058 else if (strcmp (in_fnames[0], "-") == 0)
1059 in_fnames[0] = "";
1061 if (out_fname == NULL || !strcmp (out_fname, "-"))
1062 out_fname = "";
1064 if (cpp_opts->deps.style == DEPS_NONE)
1065 check_deps_environment_vars ();
1067 handle_deferred_opts ();
1069 sanitize_cpp_opts ();
1071 register_include_chains (parse_in, sysroot, iprefix,
1072 std_inc, std_cxx_inc && c_dialect_cxx (), verbose);
1074 flag_inline_trees = 1;
1076 /* Use tree inlining if possible. Function instrumentation is only
1077 done in the RTL level, so we disable tree inlining. */
1078 if (! flag_instrument_function_entry_exit)
1080 if (!flag_no_inline)
1081 flag_no_inline = 1;
1082 if (flag_inline_functions)
1084 flag_inline_trees = 2;
1085 flag_inline_functions = 0;
1089 /* -Wextra implies -Wsign-compare, but not if explicitly
1090 overridden. */
1091 if (warn_sign_compare == -1)
1092 warn_sign_compare = extra_warnings;
1094 /* Special format checking options don't work without -Wformat; warn if
1095 they are used. */
1096 if (warn_format_y2k && !warn_format)
1097 warning ("-Wformat-y2k ignored without -Wformat");
1098 if (warn_format_extra_args && !warn_format)
1099 warning ("-Wformat-extra-args ignored without -Wformat");
1100 if (warn_format_zero_length && !warn_format)
1101 warning ("-Wformat-zero-length ignored without -Wformat");
1102 if (warn_format_nonliteral && !warn_format)
1103 warning ("-Wformat-nonliteral ignored without -Wformat");
1104 if (warn_format_security && !warn_format)
1105 warning ("-Wformat-security ignored without -Wformat");
1106 if (warn_missing_format_attribute && !warn_format)
1107 warning ("-Wmissing-format-attribute ignored without -Wformat");
1109 if (flag_preprocess_only)
1111 /* Open the output now. We must do so even if flag_no_output is
1112 on, because there may be other output than from the actual
1113 preprocessing (e.g. from -dM). */
1114 if (out_fname[0] == '\0')
1115 out_stream = stdout;
1116 else
1117 out_stream = fopen (out_fname, "w");
1119 if (out_stream == NULL)
1121 fatal_error ("opening output file %s: %m", out_fname);
1122 return false;
1125 if (num_in_fnames > 1)
1126 error ("too many filenames given. Type %s --help for usage",
1127 progname);
1129 init_pp_output (out_stream);
1131 else
1133 init_c_lex ();
1135 /* Yuk. WTF is this? I do know ObjC relies on it somewhere. */
1136 input_line = 0;
1139 cpp_get_callbacks (parse_in)->file_change = cb_file_change;
1141 /* NOTE: we use in_fname here, not the one supplied. */
1142 *pfilename = cpp_read_main_file (parse_in, in_fnames[0]);
1144 saved_lineno = input_line;
1145 input_line = 0;
1147 /* If an error has occurred in cpplib, note it so we fail
1148 immediately. */
1149 errorcount += cpp_errors (parse_in);
1151 return flag_preprocess_only;
1154 /* Front end initialization common to C, ObjC and C++. */
1155 bool
1156 c_common_init (void)
1158 input_line = saved_lineno;
1160 /* Set up preprocessor arithmetic. Must be done after call to
1161 c_common_nodes_and_builtins for type nodes to be good. */
1162 cpp_opts->precision = TYPE_PRECISION (intmax_type_node);
1163 cpp_opts->char_precision = TYPE_PRECISION (char_type_node);
1164 cpp_opts->int_precision = TYPE_PRECISION (integer_type_node);
1165 cpp_opts->wchar_precision = TYPE_PRECISION (wchar_type_node);
1166 cpp_opts->unsigned_wchar = TREE_UNSIGNED (wchar_type_node);
1167 cpp_opts->bytes_big_endian = BYTES_BIG_ENDIAN;
1169 /* This can't happen until after wchar_precision and bytes_big_endian
1170 are known. */
1171 cpp_init_iconv (parse_in);
1173 if (flag_preprocess_only)
1175 finish_options ();
1176 preprocess_file (parse_in);
1177 return false;
1180 /* Has to wait until now so that cpplib has its hash table. */
1181 init_pragma ();
1183 return true;
1186 /* Initialize the integrated preprocessor after debug output has been
1187 initialized; loop over each input file. */
1188 void
1189 c_common_parse_file (int set_yydebug ATTRIBUTE_UNUSED)
1191 unsigned file_index;
1193 #if YYDEBUG != 0
1194 yydebug = set_yydebug;
1195 #else
1196 warning ("YYDEBUG not defined");
1197 #endif
1199 file_index = 0;
1203 if (file_index > 0)
1205 /* Reset the state of the parser. */
1206 c_reset_state();
1208 /* Reset cpplib's macros and start a new file. */
1209 cpp_undef_all (parse_in);
1210 cpp_read_next_file (parse_in, in_fnames[file_index]);
1213 finish_options();
1214 if (file_index == 0)
1215 pch_init();
1216 c_parse_file ();
1218 file_index++;
1219 } while (file_index < num_in_fnames);
1221 free_parser_stacks ();
1222 finish_file ();
1225 /* Common finish hook for the C, ObjC and C++ front ends. */
1226 void
1227 c_common_finish (void)
1229 FILE *deps_stream = NULL;
1231 if (cpp_opts->deps.style != DEPS_NONE)
1233 /* If -M or -MM was seen without -MF, default output to the
1234 output stream. */
1235 if (!deps_file)
1236 deps_stream = out_stream;
1237 else
1239 deps_stream = fopen (deps_file, deps_append ? "a": "w");
1240 if (!deps_stream)
1241 fatal_error ("opening dependency file %s: %m", deps_file);
1245 /* For performance, avoid tearing down cpplib's internal structures
1246 with cpp_destroy (). */
1247 errorcount += cpp_finish (parse_in, deps_stream);
1249 if (deps_stream && deps_stream != out_stream
1250 && (ferror (deps_stream) || fclose (deps_stream)))
1251 fatal_error ("closing dependency file %s: %m", deps_file);
1253 if (out_stream && (ferror (out_stream) || fclose (out_stream)))
1254 fatal_error ("when writing output to %s: %m", out_fname);
1257 /* Either of two environment variables can specify output of
1258 dependencies. Their value is either "OUTPUT_FILE" or "OUTPUT_FILE
1259 DEPS_TARGET", where OUTPUT_FILE is the file to write deps info to
1260 and DEPS_TARGET is the target to mention in the deps. They also
1261 result in dependency information being appended to the output file
1262 rather than overwriting it, and like Sun's compiler
1263 SUNPRO_DEPENDENCIES suppresses the dependency on the main file. */
1264 static void
1265 check_deps_environment_vars (void)
1267 char *spec;
1269 GET_ENVIRONMENT (spec, "DEPENDENCIES_OUTPUT");
1270 if (spec)
1271 cpp_opts->deps.style = DEPS_USER;
1272 else
1274 GET_ENVIRONMENT (spec, "SUNPRO_DEPENDENCIES");
1275 if (spec)
1277 cpp_opts->deps.style = DEPS_SYSTEM;
1278 cpp_opts->deps.ignore_main_file = true;
1282 if (spec)
1284 /* Find the space before the DEPS_TARGET, if there is one. */
1285 char *s = strchr (spec, ' ');
1286 if (s)
1288 /* Let the caller perform MAKE quoting. */
1289 defer_opt (OPT_MT, s + 1);
1290 *s = '\0';
1293 /* Command line -MF overrides environment variables and default. */
1294 if (!deps_file)
1295 deps_file = spec;
1297 deps_append = 1;
1301 /* Handle deferred command line switches. */
1302 static void
1303 handle_deferred_opts (void)
1305 size_t i;
1307 for (i = 0; i < deferred_count; i++)
1309 struct deferred_opt *opt = &deferred_opts[i];
1311 if (opt->code == OPT_MT || opt->code == OPT_MQ)
1312 cpp_add_dependency_target (parse_in, opt->arg, opt->code == OPT_MQ);
1316 /* These settings are appropriate for GCC, but not necessarily so for
1317 cpplib as a library. */
1318 static void
1319 sanitize_cpp_opts (void)
1321 /* If we don't know what style of dependencies to output, complain
1322 if any other dependency switches have been given. */
1323 if (deps_seen && cpp_opts->deps.style == DEPS_NONE)
1324 error ("to generate dependencies you must specify either -M or -MM");
1326 /* -dM and dependencies suppress normal output; do it here so that
1327 the last -d[MDN] switch overrides earlier ones. */
1328 if (flag_dump_macros == 'M')
1329 flag_no_output = 1;
1331 /* Disable -dD, -dN and -dI if normal output is suppressed. Allow
1332 -dM since at least glibc relies on -M -dM to work. */
1333 if (flag_no_output)
1335 if (flag_dump_macros != 'M')
1336 flag_dump_macros = 0;
1337 flag_dump_includes = 0;
1340 cpp_opts->unsigned_char = !flag_signed_char;
1341 cpp_opts->stdc_0_in_system_headers = STDC_0_IN_SYSTEM_HEADERS;
1343 /* We want -Wno-long-long to override -pedantic -std=non-c99
1344 and/or -Wtraditional, whatever the ordering. */
1345 cpp_opts->warn_long_long
1346 = warn_long_long && ((!flag_isoc99 && pedantic) || warn_traditional);
1349 /* Add include path with a prefix at the front of its name. */
1350 static void
1351 add_prefixed_path (const char *suffix, size_t chain)
1353 char *path;
1354 const char *prefix;
1355 size_t prefix_len, suffix_len;
1357 suffix_len = strlen (suffix);
1358 prefix = iprefix ? iprefix : cpp_GCC_INCLUDE_DIR;
1359 prefix_len = iprefix ? strlen (iprefix) : cpp_GCC_INCLUDE_DIR_len;
1361 path = xmalloc (prefix_len + suffix_len + 1);
1362 memcpy (path, prefix, prefix_len);
1363 memcpy (path + prefix_len, suffix, suffix_len);
1364 path[prefix_len + suffix_len] = '\0';
1366 add_path (path, chain, 0);
1369 /* Handle -D, -U, -A, -imacros, and the first -include. */
1370 static void
1371 finish_options (void)
1373 if (!cpp_opts->preprocessed)
1375 size_t i;
1377 cpp_change_file (parse_in, LC_RENAME, _("<built-in>"));
1378 cpp_init_builtins (parse_in, flag_hosted);
1379 c_cpp_builtins (parse_in);
1381 /* We're about to send user input to cpplib, so make it warn for
1382 things that we previously (when we sent it internal definitions)
1383 told it to not warn.
1385 C99 permits implementation-defined characters in identifiers.
1386 The documented meaning of -std= is to turn off extensions that
1387 conflict with the specified standard, and since a strictly
1388 conforming program cannot contain a '$', we do not condition
1389 their acceptance on the -std= setting. */
1390 cpp_opts->warn_dollars = (cpp_opts->pedantic && !cpp_opts->c99);
1392 cpp_change_file (parse_in, LC_RENAME, _("<command line>"));
1393 for (i = 0; i < deferred_count; i++)
1395 struct deferred_opt *opt = &deferred_opts[i];
1397 if (opt->code == OPT_D)
1398 cpp_define (parse_in, opt->arg);
1399 else if (opt->code == OPT_U)
1400 cpp_undef (parse_in, opt->arg);
1401 else if (opt->code == OPT_A)
1403 if (opt->arg[0] == '-')
1404 cpp_unassert (parse_in, opt->arg + 1);
1405 else
1406 cpp_assert (parse_in, opt->arg);
1410 /* Handle -imacros after -D and -U. */
1411 for (i = 0; i < deferred_count; i++)
1413 struct deferred_opt *opt = &deferred_opts[i];
1415 if (opt->code == OPT_imacros
1416 && cpp_push_include (parse_in, opt->arg))
1417 cpp_scan_nooutput (parse_in);
1421 push_command_line_include ();
1424 /* Give CPP the next file given by -include, if any. */
1425 static void
1426 push_command_line_include (void)
1428 if (cpp_opts->preprocessed)
1429 return;
1431 while (include_cursor < deferred_count)
1433 struct deferred_opt *opt = &deferred_opts[include_cursor++];
1435 if (opt->code == OPT_include && cpp_push_include (parse_in, opt->arg))
1436 return;
1439 if (include_cursor == deferred_count)
1441 free (deferred_opts);
1442 /* Restore the line map from <command line>. */
1443 cpp_change_file (parse_in, LC_RENAME, main_input_filename);
1444 /* -Wunused-macros should only warn about macros defined hereafter. */
1445 cpp_opts->warn_unused_macros = warn_unused_macros;
1446 include_cursor++;
1450 /* File change callback. Has to handle -include files. */
1451 static void
1452 cb_file_change (cpp_reader *pfile ATTRIBUTE_UNUSED,
1453 const struct line_map *new_map)
1455 if (flag_preprocess_only)
1456 pp_file_change (new_map);
1457 else
1458 fe_file_change (new_map);
1460 if (new_map->reason == LC_LEAVE && MAIN_FILE_P (new_map))
1461 push_command_line_include ();
1464 /* Set the C 89 standard (with 1994 amendments if C94, without GNU
1465 extensions if ISO). There is no concept of gnu94. */
1466 static void
1467 set_std_c89 (int c94, int iso)
1469 cpp_set_lang (parse_in, c94 ? CLK_STDC94: iso ? CLK_STDC89: CLK_GNUC89);
1470 flag_iso = iso;
1471 flag_no_asm = iso;
1472 flag_no_gnu_keywords = iso;
1473 flag_no_nonansi_builtin = iso;
1474 flag_noniso_default_format_attributes = !iso;
1475 flag_isoc94 = c94;
1476 flag_isoc99 = 0;
1477 flag_writable_strings = 0;
1480 /* Set the C 99 standard (without GNU extensions if ISO). */
1481 static void
1482 set_std_c99 (int iso)
1484 cpp_set_lang (parse_in, iso ? CLK_STDC99: CLK_GNUC99);
1485 flag_no_asm = iso;
1486 flag_no_nonansi_builtin = iso;
1487 flag_noniso_default_format_attributes = !iso;
1488 flag_iso = iso;
1489 flag_isoc99 = 1;
1490 flag_isoc94 = 1;
1491 flag_writable_strings = 0;
1494 /* Set the C++ 98 standard (without GNU extensions if ISO). */
1495 static void
1496 set_std_cxx98 (int iso)
1498 cpp_set_lang (parse_in, iso ? CLK_CXX98: CLK_GNUCXX);
1499 flag_no_gnu_keywords = iso;
1500 flag_no_nonansi_builtin = iso;
1501 flag_noniso_default_format_attributes = !iso;
1502 flag_iso = iso;
1505 /* Handle setting implicit to ON. */
1506 static void
1507 set_Wimplicit (int on)
1509 warn_implicit = on;
1510 warn_implicit_int = on;
1511 if (on)
1513 if (mesg_implicit_function_declaration != 2)
1514 mesg_implicit_function_declaration = 1;
1516 else
1517 mesg_implicit_function_declaration = 0;
1520 /* Args to -d specify what to dump. Silently ignore
1521 unrecognized options; they may be aimed at toplev.c. */
1522 static void
1523 handle_OPT_d (const char *arg)
1525 char c;
1527 while ((c = *arg++) != '\0')
1528 switch (c)
1530 case 'M': /* Dump macros only. */
1531 case 'N': /* Dump names. */
1532 case 'D': /* Dump definitions. */
1533 flag_dump_macros = c;
1534 break;
1536 case 'I':
1537 flag_dump_includes = 1;
1538 break;
1542 /* Handle --help output. */
1543 static void
1544 print_help (void)
1546 /* To keep the lines from getting too long for some compilers, limit
1547 to about 500 characters (6 lines) per chunk. */
1548 fputs (_("\
1549 Switches:\n\
1550 -include <file> Include the contents of <file> before other files\n\
1551 -imacros <file> Accept definition of macros in <file>\n\
1552 -iprefix <path> Specify <path> as a prefix for next two options\n\
1553 -iwithprefix <dir> Add <dir> to the end of the system include path\n\
1554 -iwithprefixbefore <dir> Add <dir> to the end of the main include path\n\
1555 -isystem <dir> Add <dir> to the start of the system include path\n\
1556 "), stdout);
1557 fputs (_("\
1558 -idirafter <dir> Add <dir> to the end of the system include path\n\
1559 -I <dir> Add <dir> to the end of the main include path\n\
1560 -I- Fine-grained include path control; see info docs\n\
1561 -nostdinc Do not search system include directories\n\
1562 (dirs specified with -isystem will still be used)\n\
1563 -nostdinc++ Do not search system include directories for C++\n\
1564 -o <file> Put output into <file>\n\
1565 "), stdout);
1566 fputs (_("\
1567 -trigraphs Support ISO C trigraphs\n\
1568 -std=<std name> Specify the conformance standard; one of:\n\
1569 gnu89, gnu99, c89, c99, iso9899:1990,\n\
1570 iso9899:199409, iso9899:1999, c++98\n\
1571 -w Inhibit warning messages\n\
1572 -W[no-]trigraphs Warn if trigraphs are encountered\n\
1573 -W[no-]comment{s} Warn if one comment starts inside another\n\
1574 "), stdout);
1575 fputs (_("\
1576 -W[no-]traditional Warn about features not present in traditional C\n\
1577 -W[no-]undef Warn if an undefined macro is used by #if\n\
1578 -W[no-]import Warn about the use of the #import directive\n\
1579 "), stdout);
1580 fputs (_("\
1581 -W[no-]error Treat all warnings as errors\n\
1582 -W[no-]system-headers Do not suppress warnings from system headers\n\
1583 -W[no-]all Enable most preprocessor warnings\n\
1584 "), stdout);
1585 fputs (_("\
1586 -M Generate make dependencies\n\
1587 -MM As -M, but ignore system header files\n\
1588 -MD Generate make dependencies and compile\n\
1589 -MMD As -MD, but ignore system header files\n\
1590 -MF <file> Write dependency output to the given file\n\
1591 -MG Treat missing header file as generated files\n\
1592 "), stdout);
1593 fputs (_("\
1594 -MP Generate phony targets for all headers\n\
1595 -MQ <target> Add a MAKE-quoted target\n\
1596 -MT <target> Add an unquoted target\n\
1597 "), stdout);
1598 fputs (_("\
1599 -D<macro> Define a <macro> with string '1' as its value\n\
1600 -D<macro>=<val> Define a <macro> with <val> as its value\n\
1601 -A<question>=<answer> Assert the <answer> to <question>\n\
1602 -A-<question>=<answer> Disable the <answer> to <question>\n\
1603 -U<macro> Undefine <macro> \n\
1604 -v Display the version number\n\
1605 "), stdout);
1606 fputs (_("\
1607 -H Print the name of header files as they are used\n\
1608 -C Do not discard comments\n\
1609 -dM Display a list of macro definitions active at end\n\
1610 -dD Preserve macro definitions in output\n\
1611 -dN As -dD except that only the names are preserved\n\
1612 -dI Include #include directives in the output\n\
1613 "), stdout);
1614 fputs (_("\
1615 -f[no-]preprocessed Treat the input file as already preprocessed\n\
1616 -ftabstop=<number> Distance between tab stops for column reporting\n\
1617 -ftarget-charset=<c> Convert all strings and character constants\n\
1618 to character set <c>\n\
1619 -ftarget-wide-charset=<c> Convert all wide strings and character constants\n\
1620 to character set <c>\n\
1621 "), stdout);
1622 fputs (_("\
1623 -isysroot <dir> Set <dir> to be the system root directory\n\
1624 -P Do not generate #line directives\n\
1625 -remap Remap file names when including files\n\
1626 --help Display this information\n\
1627 "), stdout);