* config/ia64/fde-glibc.c (_GNU_SOURCE): Define to 1 instead of
[official-gcc.git] / gcc / c-opts.c
blob4473eaf49d33e84280bee3aa8be746c505099ea0
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 *this_input_filename;
57 /* Filename and stream for preprocessed output. */
58 static const char *out_fname;
59 static FILE *out_stream;
61 /* Append dependencies to deps_file. */
62 static bool deps_append;
64 /* If dependency switches (-MF etc.) have been given. */
65 static bool deps_seen;
67 /* If -v seen. */
68 static bool verbose;
70 /* Dependency output file. */
71 static const char *deps_file;
73 /* The prefix given by -iprefix, if any. */
74 static const char *iprefix;
76 /* The system root, if any. Overridden by -isysroot. */
77 static const char *sysroot = TARGET_SYSTEM_ROOT;
79 /* Zero disables all standard directories for headers. */
80 static bool std_inc = true;
82 /* Zero disables the C++-specific standard directories for headers. */
83 static bool std_cxx_inc = true;
85 /* If the quote chain has been split by -I-. */
86 static bool quote_chain_split;
88 /* If -Wunused-macros. */
89 static bool warn_unused_macros;
91 /* Number of deferred options. */
92 static size_t deferred_count;
94 /* Number of deferred options scanned for -include. */
95 static size_t include_cursor;
97 /* Permit Fotran front-end options. */
98 static bool permit_fortran_options;
100 static void set_Wimplicit (int);
101 static void handle_OPT_d (const char *);
102 static void set_std_cxx98 (int);
103 static void set_std_c89 (int, int);
104 static void set_std_c99 (int);
105 static void check_deps_environment_vars (void);
106 static void handle_deferred_opts (void);
107 static void sanitize_cpp_opts (void);
108 static void add_prefixed_path (const char *, size_t);
109 static void push_command_line_include (void);
110 static void cb_file_change (cpp_reader *, const struct line_map *);
111 static bool finish_options (const char *);
113 #ifndef STDC_0_IN_SYSTEM_HEADERS
114 #define STDC_0_IN_SYSTEM_HEADERS 0
115 #endif
117 /* Holds switches parsed by c_common_handle_option (), but whose
118 handling is deferred to c_common_post_options (). */
119 static void defer_opt (enum opt_code, const char *);
120 static struct deferred_opt
122 enum opt_code code;
123 const char *arg;
124 } *deferred_opts;
126 /* Complain that switch CODE expects an argument but none was
127 provided. OPT was the command-line option. Return FALSE to get
128 the default message in opts.c, TRUE if we provide a specialized
129 one. */
130 bool
131 c_common_missing_argument (const char *opt, size_t code)
133 switch (code)
135 default:
136 /* Pick up the default message. */
137 return false;
139 case OPT_fconstant_string_class_:
140 error ("no class name specified with \"%s\"", opt);
141 break;
143 case OPT_A:
144 error ("assertion missing after \"%s\"", opt);
145 break;
147 case OPT_D:
148 case OPT_U:
149 error ("macro name missing after \"%s\"", opt);
150 break;
152 case OPT_I:
153 case OPT_idirafter:
154 case OPT_isysroot:
155 case OPT_isystem:
156 error ("missing path after \"%s\"", opt);
157 break;
159 case OPT_MF:
160 case OPT_MD:
161 case OPT_MMD:
162 case OPT_include:
163 case OPT_imacros:
164 case OPT_o:
165 error ("missing filename after \"%s\"", opt);
166 break;
168 case OPT_MQ:
169 case OPT_MT:
170 error ("missing makefile target after \"%s\"", opt);
171 break;
174 return true;
177 /* Defer option CODE with argument ARG. */
178 static void
179 defer_opt (enum opt_code code, const char *arg)
181 deferred_opts[deferred_count].code = code;
182 deferred_opts[deferred_count].arg = arg;
183 deferred_count++;
186 /* Common initialization before parsing options. */
187 unsigned int
188 c_common_init_options (unsigned int argc, const char **argv ATTRIBUTE_UNUSED)
190 static const unsigned int lang_flags[] = {CL_C, CL_ObjC, CL_CXX, CL_ObjCXX};
191 unsigned int result;
193 /* This is conditionalized only because that is the way the front
194 ends used to do it. Maybe this should be unconditional? */
195 if (c_dialect_cxx ())
197 /* By default wrap lines at 80 characters. Is getenv
198 ("COLUMNS") preferable? */
199 diagnostic_line_cutoff (global_dc) = 80;
200 /* By default, emit location information once for every
201 diagnostic message. */
202 diagnostic_prefixing_rule (global_dc) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
205 parse_in = cpp_create_reader (c_dialect_cxx () ? CLK_GNUCXX: CLK_GNUC89,
206 ident_hash);
208 cpp_opts = cpp_get_options (parse_in);
209 cpp_opts->dollars_in_ident = DOLLARS_IN_IDENTIFIERS;
210 cpp_opts->objc = c_dialect_objc ();
212 /* Reset to avoid warnings on internal definitions. We set it just
213 before passing on command-line options to cpplib. */
214 cpp_opts->warn_dollars = 0;
216 flag_const_strings = c_dialect_cxx ();
217 flag_exceptions = c_dialect_cxx ();
218 warn_pointer_arith = c_dialect_cxx ();
220 deferred_opts = xmalloc (argc * sizeof (struct deferred_opt));
222 result = lang_flags[c_language];
224 /* If potentially preprocessing Fortran we have to accept its front
225 end options since the driver passes most of them through. */
226 #ifdef CL_F77
227 if (c_language == clk_c && argc > 2
228 && !strcmp (argv[2], "-traditional-cpp" ))
230 permit_fortran_options = true;
231 result |= CL_F77;
233 #endif
235 return result;
238 /* Handle switch SCODE with argument ARG. VALUE is true, unless no-
239 form of an -f or -W option was given. Returns 0 if the switch was
240 invalid, a negative number to prevent language-independent
241 processing in toplev.c (a hack necessary for the short-term). */
243 c_common_handle_option (size_t scode, const char *arg, int value)
245 const struct cl_option *option = &cl_options[scode];
246 enum opt_code code = (enum opt_code) scode;
247 int result = 1;
249 switch (code)
251 default:
252 result = permit_fortran_options;
253 break;
255 case OPT__output_pch_:
256 pch_file = arg;
257 break;
259 case OPT_A:
260 defer_opt (code, arg);
261 break;
263 case OPT_C:
264 cpp_opts->discard_comments = 0;
265 break;
267 case OPT_CC:
268 cpp_opts->discard_comments = 0;
269 cpp_opts->discard_comments_in_macro_exp = 0;
270 break;
272 case OPT_D:
273 defer_opt (code, arg);
274 break;
276 case OPT_E:
277 flag_preprocess_only = 1;
278 break;
280 case OPT_H:
281 cpp_opts->print_include_names = 1;
282 break;
284 case OPT_I:
285 if (strcmp (arg, "-"))
286 add_path (xstrdup (arg), BRACKET, 0);
287 else
289 if (quote_chain_split)
290 error ("-I- specified twice");
291 quote_chain_split = true;
292 split_quote_chain ();
294 break;
296 case OPT_M:
297 case OPT_MM:
298 /* When doing dependencies with -M or -MM, suppress normal
299 preprocessed output, but still do -dM etc. as software
300 depends on this. Preprocessed output does occur if -MD, -MMD
301 or environment var dependency generation is used. */
302 cpp_opts->deps.style = (code == OPT_M ? DEPS_SYSTEM: DEPS_USER);
303 flag_no_output = 1;
304 cpp_opts->inhibit_warnings = 1;
305 break;
307 case OPT_MD:
308 case OPT_MMD:
309 cpp_opts->deps.style = (code == OPT_MD ? DEPS_SYSTEM: DEPS_USER);
310 deps_file = arg;
311 break;
313 case OPT_MF:
314 deps_seen = true;
315 deps_file = arg;
316 break;
318 case OPT_MG:
319 deps_seen = true;
320 cpp_opts->deps.missing_files = true;
321 break;
323 case OPT_MP:
324 deps_seen = true;
325 cpp_opts->deps.phony_targets = true;
326 break;
328 case OPT_MQ:
329 case OPT_MT:
330 deps_seen = true;
331 defer_opt (code, arg);
332 break;
334 case OPT_P:
335 flag_no_line_commands = 1;
336 break;
338 case OPT_fworking_directory:
339 flag_working_directory = value;
340 break;
342 case OPT_U:
343 defer_opt (code, arg);
344 break;
346 case OPT_Wabi:
347 warn_abi = value;
348 break;
350 case OPT_Wall:
351 set_Wunused (value);
352 set_Wformat (value);
353 set_Wimplicit (value);
354 warn_char_subscripts = value;
355 warn_missing_braces = value;
356 warn_parentheses = value;
357 warn_return_type = value;
358 warn_sequence_point = value; /* Was C only. */
359 if (c_dialect_cxx ())
360 warn_sign_compare = value;
361 warn_switch = value;
362 warn_strict_aliasing = value;
364 /* Only warn about unknown pragmas that are not in system
365 headers. */
366 warn_unknown_pragmas = value;
368 /* We save the value of warn_uninitialized, since if they put
369 -Wuninitialized on the command line, we need to generate a
370 warning about not using it without also specifying -O. */
371 if (warn_uninitialized != 1)
372 warn_uninitialized = (value ? 2 : 0);
374 if (!c_dialect_cxx ())
375 /* We set this to 2 here, but 1 in -Wmain, so -ffreestanding
376 can turn it off only if it's not explicit. */
377 warn_main = value * 2;
378 else
380 /* C++-specific warnings. */
381 warn_nonvdtor = value;
382 warn_reorder = value;
383 warn_nontemplate_friend = value;
386 cpp_opts->warn_trigraphs = value;
387 cpp_opts->warn_comments = value;
388 cpp_opts->warn_num_sign_change = value;
389 cpp_opts->warn_multichar = value; /* Was C++ only. */
390 break;
392 case OPT_Wbad_function_cast:
393 warn_bad_function_cast = value;
394 break;
396 case OPT_Wcast_qual:
397 warn_cast_qual = value;
398 break;
400 case OPT_Wchar_subscripts:
401 warn_char_subscripts = value;
402 break;
404 case OPT_Wcomment:
405 case OPT_Wcomments:
406 cpp_opts->warn_comments = value;
407 break;
409 case OPT_Wconversion:
410 warn_conversion = value;
411 break;
413 case OPT_Wctor_dtor_privacy:
414 warn_ctor_dtor_privacy = value;
415 break;
417 case OPT_Wdeclaration_after_statement:
418 warn_declaration_after_statement = value;
419 break;
421 case OPT_Wdeprecated:
422 warn_deprecated = value;
423 cpp_opts->warn_deprecated = value;
424 break;
426 case OPT_Wdiv_by_zero:
427 warn_div_by_zero = value;
428 break;
430 case OPT_Weffc__:
431 warn_ecpp = value;
432 break;
434 case OPT_Wendif_labels:
435 cpp_opts->warn_endif_labels = value;
436 break;
438 case OPT_Werror:
439 cpp_opts->warnings_are_errors = value;
440 break;
442 case OPT_Werror_implicit_function_declaration:
443 mesg_implicit_function_declaration = 2;
444 break;
446 case OPT_Wfloat_equal:
447 warn_float_equal = value;
448 break;
450 case OPT_Wformat:
451 set_Wformat (value);
452 break;
454 case OPT_Wformat_:
455 set_Wformat (atoi (arg));
456 break;
458 case OPT_Wformat_extra_args:
459 warn_format_extra_args = value;
460 break;
462 case OPT_Wformat_nonliteral:
463 warn_format_nonliteral = value;
464 break;
466 case OPT_Wformat_security:
467 warn_format_security = value;
468 break;
470 case OPT_Wformat_y2k:
471 warn_format_y2k = value;
472 break;
474 case OPT_Wformat_zero_length:
475 warn_format_zero_length = value;
476 break;
478 case OPT_Winit_self:
479 warn_init_self = value;
480 break;
482 case OPT_Wimplicit:
483 set_Wimplicit (value);
484 break;
486 case OPT_Wimplicit_function_declaration:
487 mesg_implicit_function_declaration = value;
488 break;
490 case OPT_Wimplicit_int:
491 warn_implicit_int = value;
492 break;
494 case OPT_Wimport:
495 /* Silently ignore for now. */
496 break;
498 case OPT_Winvalid_offsetof:
499 warn_invalid_offsetof = value;
500 break;
502 case OPT_Winvalid_pch:
503 cpp_opts->warn_invalid_pch = value;
504 break;
506 case OPT_Wlong_long:
507 warn_long_long = value;
508 break;
510 case OPT_Wmain:
511 if (value)
512 warn_main = 1;
513 else
514 warn_main = -1;
515 break;
517 case OPT_Wmissing_braces:
518 warn_missing_braces = value;
519 break;
521 case OPT_Wmissing_declarations:
522 warn_missing_declarations = value;
523 break;
525 case OPT_Wmissing_format_attribute:
526 warn_missing_format_attribute = value;
527 break;
529 case OPT_Wmissing_prototypes:
530 warn_missing_prototypes = value;
531 break;
533 case OPT_Wmultichar:
534 cpp_opts->warn_multichar = value;
535 break;
537 case OPT_Wnested_externs:
538 warn_nested_externs = value;
539 break;
541 case OPT_Wnon_template_friend:
542 warn_nontemplate_friend = value;
543 break;
545 case OPT_Wnon_virtual_dtor:
546 warn_nonvdtor = value;
547 break;
549 case OPT_Wnonnull:
550 warn_nonnull = value;
551 break;
553 case OPT_Wold_style_definition:
554 warn_old_style_definition = value;
555 break;
557 case OPT_Wold_style_cast:
558 warn_old_style_cast = value;
559 break;
561 case OPT_Woverloaded_virtual:
562 warn_overloaded_virtual = value;
563 break;
565 case OPT_Wparentheses:
566 warn_parentheses = value;
567 break;
569 case OPT_Wpmf_conversions:
570 warn_pmf2ptr = value;
571 break;
573 case OPT_Wpointer_arith:
574 warn_pointer_arith = value;
575 break;
577 case OPT_Wprotocol:
578 warn_protocol = value;
579 break;
581 case OPT_Wselector:
582 warn_selector = value;
583 break;
585 case OPT_Wredundant_decls:
586 warn_redundant_decls = value;
587 break;
589 case OPT_Wreorder:
590 warn_reorder = value;
591 break;
593 case OPT_Wreturn_type:
594 warn_return_type = value;
595 break;
597 case OPT_Wsequence_point:
598 warn_sequence_point = value;
599 break;
601 case OPT_Wsign_compare:
602 warn_sign_compare = value;
603 break;
605 case OPT_Wsign_promo:
606 warn_sign_promo = value;
607 break;
609 case OPT_Wstrict_prototypes:
610 warn_strict_prototypes = value;
611 break;
613 case OPT_Wsynth:
614 warn_synth = value;
615 break;
617 case OPT_Wsystem_headers:
618 cpp_opts->warn_system_headers = value;
619 break;
621 case OPT_Wtraditional:
622 warn_traditional = value;
623 cpp_opts->warn_traditional = value;
624 break;
626 case OPT_Wtrigraphs:
627 cpp_opts->warn_trigraphs = value;
628 break;
630 case OPT_Wundeclared_selector:
631 warn_undeclared_selector = value;
632 break;
634 case OPT_Wundef:
635 cpp_opts->warn_undef = value;
636 break;
638 case OPT_Wunknown_pragmas:
639 /* Set to greater than 1, so that even unknown pragmas in
640 system headers will be warned about. */
641 warn_unknown_pragmas = value * 2;
642 break;
644 case OPT_Wunused_macros:
645 warn_unused_macros = value;
646 break;
648 case OPT_Wwrite_strings:
649 if (!c_dialect_cxx ())
650 flag_const_strings = value;
651 else
652 warn_write_strings = value;
653 break;
655 case OPT_ansi:
656 if (!c_dialect_cxx ())
657 set_std_c89 (false, true);
658 else
659 set_std_cxx98 (true);
660 break;
662 case OPT_d:
663 handle_OPT_d (arg);
664 break;
666 case OPT_fcond_mismatch:
667 if (!c_dialect_cxx ())
669 flag_cond_mismatch = value;
670 break;
672 /* Fall through. */
674 case OPT_fall_virtual:
675 case OPT_fenum_int_equiv:
676 case OPT_fguiding_decls:
677 case OPT_fhonor_std:
678 case OPT_fhuge_objects:
679 case OPT_flabels_ok:
680 case OPT_fname_mangling_version_:
681 case OPT_fnew_abi:
682 case OPT_fnonnull_objects:
683 case OPT_fsquangle:
684 case OPT_fstrict_prototype:
685 case OPT_fthis_is_variable:
686 case OPT_fvtable_thunks:
687 case OPT_fxref:
688 case OPT_fvtable_gc:
689 warning ("switch \"%s\" is no longer supported", option->opt_text);
690 break;
692 case OPT_fabi_version_:
693 flag_abi_version = value;
694 break;
696 case OPT_faccess_control:
697 flag_access_control = value;
698 break;
700 case OPT_falt_external_templates:
701 flag_alt_external_templates = value;
702 if (value)
703 flag_external_templates = true;
704 cp_deprecated:
705 warning ("switch \"%s\" is deprecated, please see documentation "
706 "for details", option->opt_text);
707 break;
709 case OPT_fasm:
710 flag_no_asm = !value;
711 break;
713 case OPT_fbuiltin:
714 flag_no_builtin = !value;
715 break;
717 case OPT_fbuiltin_:
718 if (value)
719 result = 0;
720 else
721 disable_builtin_function (arg);
722 break;
724 case OPT_fdollars_in_identifiers:
725 cpp_opts->dollars_in_ident = value;
726 break;
728 case OPT_fdump_:
729 if (!dump_switch_p (arg))
730 result = 0;
731 break;
733 case OPT_ffreestanding:
734 value = !value;
735 /* Fall through.... */
736 case OPT_fhosted:
737 flag_hosted = value;
738 flag_no_builtin = !value;
739 /* warn_main will be 2 if set by -Wall, 1 if set by -Wmain */
740 if (!value && warn_main == 2)
741 warn_main = 0;
742 break;
744 case OPT_fshort_double:
745 flag_short_double = value;
746 break;
748 case OPT_fshort_enums:
749 flag_short_enums = value;
750 break;
752 case OPT_fshort_wchar:
753 flag_short_wchar = value;
754 break;
756 case OPT_fsigned_bitfields:
757 flag_signed_bitfields = value;
758 explicit_flag_signed_bitfields = 1;
759 break;
761 case OPT_fsigned_char:
762 flag_signed_char = value;
763 break;
765 case OPT_funsigned_bitfields:
766 flag_signed_bitfields = !value;
767 explicit_flag_signed_bitfields = 1;
768 break;
770 case OPT_funsigned_char:
771 flag_signed_char = !value;
772 break;
774 case OPT_fcheck_new:
775 flag_check_new = value;
776 break;
778 case OPT_fconserve_space:
779 flag_conserve_space = value;
780 break;
782 case OPT_fconst_strings:
783 flag_const_strings = value;
784 break;
786 case OPT_fconstant_string_class_:
787 constant_string_class_name = arg;
788 break;
790 case OPT_fdefault_inline:
791 flag_default_inline = value;
792 break;
794 case OPT_felide_constructors:
795 flag_elide_constructors = value;
796 break;
798 case OPT_fenforce_eh_specs:
799 flag_enforce_eh_specs = value;
800 break;
802 case OPT_fexternal_templates:
803 flag_external_templates = value;
804 goto cp_deprecated;
806 case OPT_ffixed_form:
807 case OPT_ffixed_line_length_:
808 /* Fortran front end options ignored when preprocessing only. */
809 if (!flag_preprocess_only)
810 result = 0;
811 break;
813 case OPT_ffor_scope:
814 flag_new_for_scope = value;
815 break;
817 case OPT_fgnu_keywords:
818 flag_no_gnu_keywords = !value;
819 break;
821 case OPT_fgnu_runtime:
822 flag_next_runtime = !value;
823 break;
825 case OPT_fhandle_exceptions:
826 warning ("-fhandle-exceptions has been renamed -fexceptions (and is now on by default)");
827 flag_exceptions = value;
828 break;
830 case OPT_fimplement_inlines:
831 flag_implement_inlines = value;
832 break;
834 case OPT_fimplicit_inline_templates:
835 flag_implicit_inline_templates = value;
836 break;
838 case OPT_fimplicit_templates:
839 flag_implicit_templates = value;
840 break;
842 case OPT_fms_extensions:
843 flag_ms_extensions = value;
844 break;
846 case OPT_fnext_runtime:
847 flag_next_runtime = value;
848 break;
850 case OPT_fnil_receivers:
851 flag_nil_receivers = value;
852 break;
854 case OPT_fnonansi_builtins:
855 flag_no_nonansi_builtin = !value;
856 break;
858 case OPT_fobjc_exceptions:
859 flag_objc_exceptions = value;
860 break;
862 case OPT_foperator_names:
863 cpp_opts->operator_names = value;
864 break;
866 case OPT_foptional_diags:
867 flag_optional_diags = value;
868 break;
870 case OPT_fpch_deps:
871 cpp_opts->restore_pch_deps = value;
872 break;
874 case OPT_fpermissive:
875 flag_permissive = value;
876 break;
878 case OPT_fpreprocessed:
879 cpp_opts->preprocessed = value;
880 break;
882 case OPT_freplace_objc_classes:
883 flag_replace_objc_classes = value;
884 break;
886 case OPT_frepo:
887 flag_use_repository = value;
888 if (value)
889 flag_implicit_templates = 0;
890 break;
892 case OPT_frtti:
893 flag_rtti = value;
894 break;
896 case OPT_fshow_column:
897 cpp_opts->show_column = value;
898 break;
900 case OPT_fstats:
901 flag_detailed_statistics = value;
902 break;
904 case OPT_ftabstop_:
905 /* It is documented that we silently ignore silly values. */
906 if (value >= 1 && value <= 100)
907 cpp_opts->tabstop = value;
908 break;
910 case OPT_fexec_charset_:
911 cpp_opts->narrow_charset = arg;
912 break;
914 case OPT_fwide_exec_charset_:
915 cpp_opts->wide_charset = arg;
916 break;
918 case OPT_ftemplate_depth_:
919 max_tinst_depth = value;
920 break;
922 case OPT_fuse_cxa_atexit:
923 flag_use_cxa_atexit = value;
924 break;
926 case OPT_fweak:
927 flag_weak = value;
928 break;
930 case OPT_fzero_link:
931 flag_zero_link = value;
932 break;
934 case OPT_gen_decls:
935 flag_gen_declaration = 1;
936 break;
938 case OPT_idirafter:
939 add_path (xstrdup (arg), AFTER, 0);
940 break;
942 case OPT_imacros:
943 case OPT_include:
944 defer_opt (code, arg);
945 break;
947 case OPT_iprefix:
948 iprefix = arg;
949 break;
951 case OPT_isysroot:
952 sysroot = arg;
953 break;
955 case OPT_isystem:
956 add_path (xstrdup (arg), SYSTEM, 0);
957 break;
959 case OPT_iwithprefix:
960 add_prefixed_path (arg, SYSTEM);
961 break;
963 case OPT_iwithprefixbefore:
964 add_prefixed_path (arg, BRACKET);
965 break;
967 case OPT_lang_asm:
968 cpp_set_lang (parse_in, CLK_ASM);
969 cpp_opts->dollars_in_ident = false;
970 break;
972 case OPT_lang_objc:
973 cpp_opts->objc = 1;
974 break;
976 case OPT_nostdinc:
977 std_inc = false;
978 break;
980 case OPT_nostdinc__:
981 std_cxx_inc = false;
982 break;
984 case OPT_o:
985 if (!out_fname)
986 out_fname = arg;
987 else
988 error ("output filename specified twice");
989 break;
991 /* We need to handle the -pedantic switches here, rather than in
992 c_common_post_options, so that a subsequent -Wno-endif-labels
993 is not overridden. */
994 case OPT_pedantic_errors:
995 cpp_opts->pedantic_errors = 1;
996 /* Fall through. */
997 case OPT_pedantic:
998 cpp_opts->pedantic = 1;
999 cpp_opts->warn_endif_labels = 1;
1000 break;
1002 case OPT_print_objc_runtime_info:
1003 print_struct_values = 1;
1004 break;
1006 case OPT_remap:
1007 cpp_opts->remap = 1;
1008 break;
1010 case OPT_std_c__98:
1011 case OPT_std_gnu__98:
1012 set_std_cxx98 (code == OPT_std_c__98 /* ISO */);
1013 break;
1015 case OPT_std_c89:
1016 case OPT_std_iso9899_1990:
1017 case OPT_std_iso9899_199409:
1018 set_std_c89 (code == OPT_std_iso9899_199409 /* c94 */, true /* ISO */);
1019 break;
1021 case OPT_std_gnu89:
1022 set_std_c89 (false /* c94 */, false /* ISO */);
1023 break;
1025 case OPT_std_c99:
1026 case OPT_std_c9x:
1027 case OPT_std_iso9899_1999:
1028 case OPT_std_iso9899_199x:
1029 set_std_c99 (true /* ISO */);
1030 break;
1032 case OPT_std_gnu99:
1033 case OPT_std_gnu9x:
1034 set_std_c99 (false /* ISO */);
1035 break;
1037 case OPT_trigraphs:
1038 cpp_opts->trigraphs = 1;
1039 break;
1041 case OPT_traditional_cpp:
1042 cpp_opts->traditional = 1;
1043 break;
1045 case OPT_undef:
1046 flag_undef = 1;
1047 break;
1049 case OPT_w:
1050 cpp_opts->inhibit_warnings = 1;
1051 break;
1053 case OPT_v:
1054 verbose = true;
1055 break;
1058 return result;
1061 /* Post-switch processing. */
1062 bool
1063 c_common_post_options (const char **pfilename ATTRIBUTE_UNUSED)
1065 /* Canonicalize the input and output filenames. */
1066 if (in_fnames == NULL)
1068 in_fnames = xmalloc (sizeof (in_fnames[0]));
1069 in_fnames[0] = "";
1071 else if (strcmp (in_fnames[0], "-") == 0)
1072 in_fnames[0] = "";
1074 if (out_fname == NULL || !strcmp (out_fname, "-"))
1075 out_fname = "";
1077 if (cpp_opts->deps.style == DEPS_NONE)
1078 check_deps_environment_vars ();
1080 handle_deferred_opts ();
1082 sanitize_cpp_opts ();
1084 register_include_chains (parse_in, sysroot, iprefix,
1085 std_inc, std_cxx_inc && c_dialect_cxx (), verbose);
1087 flag_inline_trees = 1;
1089 /* Use tree inlining if possible. Function instrumentation is only
1090 done in the RTL level, so we disable tree inlining. */
1091 if (! flag_instrument_function_entry_exit)
1093 if (!flag_no_inline)
1094 flag_no_inline = 1;
1095 if (flag_inline_functions)
1097 flag_inline_trees = 2;
1098 flag_inline_functions = 0;
1102 /* -Wextra implies -Wsign-compare, but not if explicitly
1103 overridden. */
1104 if (warn_sign_compare == -1)
1105 warn_sign_compare = extra_warnings;
1107 /* Special format checking options don't work without -Wformat; warn if
1108 they are used. */
1109 if (warn_format_y2k && !warn_format)
1110 warning ("-Wformat-y2k ignored without -Wformat");
1111 if (warn_format_extra_args && !warn_format)
1112 warning ("-Wformat-extra-args ignored without -Wformat");
1113 if (warn_format_zero_length && !warn_format)
1114 warning ("-Wformat-zero-length ignored without -Wformat");
1115 if (warn_format_nonliteral && !warn_format)
1116 warning ("-Wformat-nonliteral ignored without -Wformat");
1117 if (warn_format_security && !warn_format)
1118 warning ("-Wformat-security ignored without -Wformat");
1119 if (warn_missing_format_attribute && !warn_format)
1120 warning ("-Wmissing-format-attribute ignored without -Wformat");
1122 if (flag_preprocess_only)
1124 /* Open the output now. We must do so even if flag_no_output is
1125 on, because there may be other output than from the actual
1126 preprocessing (e.g. from -dM). */
1127 if (out_fname[0] == '\0')
1128 out_stream = stdout;
1129 else
1130 out_stream = fopen (out_fname, "w");
1132 if (out_stream == NULL)
1134 fatal_error ("opening output file %s: %m", out_fname);
1135 return false;
1138 if (num_in_fnames > 1)
1139 error ("too many filenames given. Type %s --help for usage",
1140 progname);
1142 init_pp_output (out_stream);
1144 else
1146 init_c_lex ();
1148 /* Yuk. WTF is this? I do know ObjC relies on it somewhere. */
1149 input_line = 0;
1152 cpp_get_callbacks (parse_in)->file_change = cb_file_change;
1153 cpp_post_options (parse_in);
1155 saved_lineno = input_line;
1156 input_line = 0;
1158 /* If an error has occurred in cpplib, note it so we fail
1159 immediately. */
1160 errorcount += cpp_errors (parse_in);
1162 return flag_preprocess_only;
1165 /* Front end initialization common to C, ObjC and C++. */
1166 bool
1167 c_common_init (void)
1169 input_line = saved_lineno;
1171 /* Set up preprocessor arithmetic. Must be done after call to
1172 c_common_nodes_and_builtins for type nodes to be good. */
1173 cpp_opts->precision = TYPE_PRECISION (intmax_type_node);
1174 cpp_opts->char_precision = TYPE_PRECISION (char_type_node);
1175 cpp_opts->int_precision = TYPE_PRECISION (integer_type_node);
1176 cpp_opts->wchar_precision = TYPE_PRECISION (wchar_type_node);
1177 cpp_opts->unsigned_wchar = TREE_UNSIGNED (wchar_type_node);
1178 cpp_opts->bytes_big_endian = BYTES_BIG_ENDIAN;
1180 /* This can't happen until after wchar_precision and bytes_big_endian
1181 are known. */
1182 cpp_init_iconv (parse_in);
1184 if (flag_preprocess_only)
1186 if (finish_options (in_fnames[0]))
1187 preprocess_file (parse_in);
1188 return false;
1191 /* Has to wait until now so that cpplib has its hash table. */
1192 init_pragma ();
1194 return true;
1197 /* Initialize the integrated preprocessor after debug output has been
1198 initialized; loop over each input file. */
1199 void
1200 c_common_parse_file (int set_yydebug ATTRIBUTE_UNUSED)
1202 unsigned file_index;
1204 #if YYDEBUG != 0
1205 yydebug = set_yydebug;
1206 #else
1207 warning ("YYDEBUG not defined");
1208 #endif
1210 file_index = 0;
1214 if (file_index > 0)
1216 /* Reset the state of the parser. */
1217 c_reset_state();
1219 /* Reset cpplib's macros and start a new file. */
1220 cpp_undef_all (parse_in);
1223 if (! finish_options(in_fnames[file_index]))
1224 break;
1225 if (file_index == 0)
1226 pch_init();
1227 c_parse_file ();
1229 file_index++;
1230 } while (file_index < num_in_fnames);
1232 free_parser_stacks ();
1233 finish_file ();
1236 /* Common finish hook for the C, ObjC and C++ front ends. */
1237 void
1238 c_common_finish (void)
1240 FILE *deps_stream = NULL;
1242 if (cpp_opts->deps.style != DEPS_NONE)
1244 /* If -M or -MM was seen without -MF, default output to the
1245 output stream. */
1246 if (!deps_file)
1247 deps_stream = out_stream;
1248 else
1250 deps_stream = fopen (deps_file, deps_append ? "a": "w");
1251 if (!deps_stream)
1252 fatal_error ("opening dependency file %s: %m", deps_file);
1256 /* For performance, avoid tearing down cpplib's internal structures
1257 with cpp_destroy (). */
1258 errorcount += cpp_finish (parse_in, deps_stream);
1260 if (deps_stream && deps_stream != out_stream
1261 && (ferror (deps_stream) || fclose (deps_stream)))
1262 fatal_error ("closing dependency file %s: %m", deps_file);
1264 if (out_stream && (ferror (out_stream) || fclose (out_stream)))
1265 fatal_error ("when writing output to %s: %m", out_fname);
1268 /* Either of two environment variables can specify output of
1269 dependencies. Their value is either "OUTPUT_FILE" or "OUTPUT_FILE
1270 DEPS_TARGET", where OUTPUT_FILE is the file to write deps info to
1271 and DEPS_TARGET is the target to mention in the deps. They also
1272 result in dependency information being appended to the output file
1273 rather than overwriting it, and like Sun's compiler
1274 SUNPRO_DEPENDENCIES suppresses the dependency on the main file. */
1275 static void
1276 check_deps_environment_vars (void)
1278 char *spec;
1280 GET_ENVIRONMENT (spec, "DEPENDENCIES_OUTPUT");
1281 if (spec)
1282 cpp_opts->deps.style = DEPS_USER;
1283 else
1285 GET_ENVIRONMENT (spec, "SUNPRO_DEPENDENCIES");
1286 if (spec)
1288 cpp_opts->deps.style = DEPS_SYSTEM;
1289 cpp_opts->deps.ignore_main_file = true;
1293 if (spec)
1295 /* Find the space before the DEPS_TARGET, if there is one. */
1296 char *s = strchr (spec, ' ');
1297 if (s)
1299 /* Let the caller perform MAKE quoting. */
1300 defer_opt (OPT_MT, s + 1);
1301 *s = '\0';
1304 /* Command line -MF overrides environment variables and default. */
1305 if (!deps_file)
1306 deps_file = spec;
1308 deps_append = 1;
1312 /* Handle deferred command line switches. */
1313 static void
1314 handle_deferred_opts (void)
1316 size_t i;
1318 for (i = 0; i < deferred_count; i++)
1320 struct deferred_opt *opt = &deferred_opts[i];
1322 if (opt->code == OPT_MT || opt->code == OPT_MQ)
1323 cpp_add_dependency_target (parse_in, opt->arg, opt->code == OPT_MQ);
1327 /* These settings are appropriate for GCC, but not necessarily so for
1328 cpplib as a library. */
1329 static void
1330 sanitize_cpp_opts (void)
1332 /* If we don't know what style of dependencies to output, complain
1333 if any other dependency switches have been given. */
1334 if (deps_seen && cpp_opts->deps.style == DEPS_NONE)
1335 error ("to generate dependencies you must specify either -M or -MM");
1337 /* -dM and dependencies suppress normal output; do it here so that
1338 the last -d[MDN] switch overrides earlier ones. */
1339 if (flag_dump_macros == 'M')
1340 flag_no_output = 1;
1342 /* Disable -dD, -dN and -dI if normal output is suppressed. Allow
1343 -dM since at least glibc relies on -M -dM to work. */
1344 if (flag_no_output)
1346 if (flag_dump_macros != 'M')
1347 flag_dump_macros = 0;
1348 flag_dump_includes = 0;
1351 cpp_opts->unsigned_char = !flag_signed_char;
1352 cpp_opts->stdc_0_in_system_headers = STDC_0_IN_SYSTEM_HEADERS;
1354 /* We want -Wno-long-long to override -pedantic -std=non-c99
1355 and/or -Wtraditional, whatever the ordering. */
1356 cpp_opts->warn_long_long
1357 = warn_long_long && ((!flag_isoc99 && pedantic) || warn_traditional);
1359 /* If we're generating preprocessor output, emit current directory
1360 if explicitly requested or if debugging information is enabled.
1361 ??? Maybe we should only do it for debugging formats that
1362 actually output the current directory? */
1363 if (flag_working_directory == -1)
1364 flag_working_directory = (debug_info_level != DINFO_LEVEL_NONE);
1365 cpp_opts->working_directory
1366 = flag_preprocess_only && flag_working_directory;
1369 /* Add include path with a prefix at the front of its name. */
1370 static void
1371 add_prefixed_path (const char *suffix, size_t chain)
1373 char *path;
1374 const char *prefix;
1375 size_t prefix_len, suffix_len;
1377 suffix_len = strlen (suffix);
1378 prefix = iprefix ? iprefix : cpp_GCC_INCLUDE_DIR;
1379 prefix_len = iprefix ? strlen (iprefix) : cpp_GCC_INCLUDE_DIR_len;
1381 path = xmalloc (prefix_len + suffix_len + 1);
1382 memcpy (path, prefix, prefix_len);
1383 memcpy (path + prefix_len, suffix, suffix_len);
1384 path[prefix_len + suffix_len] = '\0';
1386 add_path (path, chain, 0);
1389 /* Handle -D, -U, -A, -imacros, and the first -include.
1390 TIF is the input file to which we will return after processing all
1391 the includes. Returns true on success. */
1392 static bool
1393 finish_options (const char *tif)
1395 if (!cpp_opts->preprocessed)
1397 size_t i;
1399 cpp_change_file (parse_in, LC_ENTER, _("<built-in>"));
1400 cpp_init_builtins (parse_in, flag_hosted);
1401 c_cpp_builtins (parse_in);
1403 /* We're about to send user input to cpplib, so make it warn for
1404 things that we previously (when we sent it internal definitions)
1405 told it to not warn.
1407 C99 permits implementation-defined characters in identifiers.
1408 The documented meaning of -std= is to turn off extensions that
1409 conflict with the specified standard, and since a strictly
1410 conforming program cannot contain a '$', we do not condition
1411 their acceptance on the -std= setting. */
1412 cpp_opts->warn_dollars = (cpp_opts->pedantic && !cpp_opts->c99);
1414 cpp_change_file (parse_in, LC_RENAME, _("<command line>"));
1415 for (i = 0; i < deferred_count; i++)
1417 struct deferred_opt *opt = &deferred_opts[i];
1419 if (opt->code == OPT_D)
1420 cpp_define (parse_in, opt->arg);
1421 else if (opt->code == OPT_U)
1422 cpp_undef (parse_in, opt->arg);
1423 else if (opt->code == OPT_A)
1425 if (opt->arg[0] == '-')
1426 cpp_unassert (parse_in, opt->arg + 1);
1427 else
1428 cpp_assert (parse_in, opt->arg);
1432 /* Handle -imacros after -D and -U. */
1433 for (i = 0; i < deferred_count; i++)
1435 struct deferred_opt *opt = &deferred_opts[i];
1437 if (opt->code == OPT_imacros
1438 && cpp_push_include (parse_in, opt->arg))
1439 cpp_scan_nooutput (parse_in);
1443 include_cursor = 0;
1444 this_input_filename = tif;
1445 if (! cpp_find_main_file (parse_in, this_input_filename))
1446 return false;
1447 push_command_line_include ();
1448 return true;
1451 /* Give CPP the next file given by -include, if any. */
1452 static void
1453 push_command_line_include (void)
1455 while (include_cursor < deferred_count)
1457 struct deferred_opt *opt = &deferred_opts[include_cursor++];
1459 if (! cpp_opts->preprocessed && opt->code == OPT_include
1460 && cpp_push_include (parse_in, opt->arg))
1461 return;
1464 if (include_cursor == deferred_count)
1466 include_cursor++;
1467 /* Restore the line map from <command line>. */
1468 if (! cpp_opts->preprocessed)
1469 cpp_change_file (parse_in, LC_LEAVE, NULL);
1470 /* -Wunused-macros should only warn about macros defined hereafter. */
1471 cpp_opts->warn_unused_macros = warn_unused_macros;
1472 cpp_push_main_file (parse_in);
1476 /* File change callback. Has to handle -include files. */
1477 static void
1478 cb_file_change (cpp_reader *pfile ATTRIBUTE_UNUSED,
1479 const struct line_map *new_map)
1481 if (flag_preprocess_only)
1482 pp_file_change (new_map);
1483 else
1484 fe_file_change (new_map);
1486 if (new_map == 0 || (new_map->reason == LC_LEAVE && MAIN_FILE_P (new_map)))
1487 push_command_line_include ();
1490 /* Set the C 89 standard (with 1994 amendments if C94, without GNU
1491 extensions if ISO). There is no concept of gnu94. */
1492 static void
1493 set_std_c89 (int c94, int iso)
1495 cpp_set_lang (parse_in, c94 ? CLK_STDC94: iso ? CLK_STDC89: CLK_GNUC89);
1496 flag_iso = iso;
1497 flag_no_asm = iso;
1498 flag_no_gnu_keywords = iso;
1499 flag_no_nonansi_builtin = iso;
1500 flag_isoc94 = c94;
1501 flag_isoc99 = 0;
1502 flag_writable_strings = 0;
1505 /* Set the C 99 standard (without GNU extensions if ISO). */
1506 static void
1507 set_std_c99 (int iso)
1509 cpp_set_lang (parse_in, iso ? CLK_STDC99: CLK_GNUC99);
1510 flag_no_asm = iso;
1511 flag_no_nonansi_builtin = iso;
1512 flag_iso = iso;
1513 flag_isoc99 = 1;
1514 flag_isoc94 = 1;
1515 flag_writable_strings = 0;
1518 /* Set the C++ 98 standard (without GNU extensions if ISO). */
1519 static void
1520 set_std_cxx98 (int iso)
1522 cpp_set_lang (parse_in, iso ? CLK_CXX98: CLK_GNUCXX);
1523 flag_no_gnu_keywords = iso;
1524 flag_no_nonansi_builtin = iso;
1525 flag_iso = iso;
1528 /* Handle setting implicit to ON. */
1529 static void
1530 set_Wimplicit (int on)
1532 warn_implicit = on;
1533 warn_implicit_int = on;
1534 if (on)
1536 if (mesg_implicit_function_declaration != 2)
1537 mesg_implicit_function_declaration = 1;
1539 else
1540 mesg_implicit_function_declaration = 0;
1543 /* Args to -d specify what to dump. Silently ignore
1544 unrecognized options; they may be aimed at toplev.c. */
1545 static void
1546 handle_OPT_d (const char *arg)
1548 char c;
1550 while ((c = *arg++) != '\0')
1551 switch (c)
1553 case 'M': /* Dump macros only. */
1554 case 'N': /* Dump names. */
1555 case 'D': /* Dump definitions. */
1556 flag_dump_macros = c;
1557 break;
1559 case 'I':
1560 flag_dump_includes = 1;
1561 break;