* c.opt: Introduce -fworking-directory.
[official-gcc.git] / gcc / c-opts.c
blobe2a30430997eeb05b5eccdfb48ccfcf42ca8c2e6
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 void 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_Wimplicit:
479 set_Wimplicit (value);
480 break;
482 case OPT_Wimplicit_function_declaration:
483 mesg_implicit_function_declaration = value;
484 break;
486 case OPT_Wimplicit_int:
487 warn_implicit_int = value;
488 break;
490 case OPT_Wimport:
491 /* Silently ignore for now. */
492 break;
494 case OPT_Winvalid_offsetof:
495 warn_invalid_offsetof = value;
496 break;
498 case OPT_Winvalid_pch:
499 cpp_opts->warn_invalid_pch = value;
500 break;
502 case OPT_Wlong_long:
503 warn_long_long = value;
504 break;
506 case OPT_Wmain:
507 if (value)
508 warn_main = 1;
509 else
510 warn_main = -1;
511 break;
513 case OPT_Wmissing_braces:
514 warn_missing_braces = value;
515 break;
517 case OPT_Wmissing_declarations:
518 warn_missing_declarations = value;
519 break;
521 case OPT_Wmissing_format_attribute:
522 warn_missing_format_attribute = value;
523 break;
525 case OPT_Wmissing_prototypes:
526 warn_missing_prototypes = value;
527 break;
529 case OPT_Wmultichar:
530 cpp_opts->warn_multichar = value;
531 break;
533 case OPT_Wnested_externs:
534 warn_nested_externs = value;
535 break;
537 case OPT_Wnon_template_friend:
538 warn_nontemplate_friend = value;
539 break;
541 case OPT_Wnon_virtual_dtor:
542 warn_nonvdtor = value;
543 break;
545 case OPT_Wnonnull:
546 warn_nonnull = value;
547 break;
549 case OPT_Wold_style_cast:
550 warn_old_style_cast = value;
551 break;
553 case OPT_Woverloaded_virtual:
554 warn_overloaded_virtual = value;
555 break;
557 case OPT_Wparentheses:
558 warn_parentheses = value;
559 break;
561 case OPT_Wpmf_conversions:
562 warn_pmf2ptr = value;
563 break;
565 case OPT_Wpointer_arith:
566 warn_pointer_arith = value;
567 break;
569 case OPT_Wprotocol:
570 warn_protocol = value;
571 break;
573 case OPT_Wselector:
574 warn_selector = value;
575 break;
577 case OPT_Wredundant_decls:
578 warn_redundant_decls = value;
579 break;
581 case OPT_Wreorder:
582 warn_reorder = value;
583 break;
585 case OPT_Wreturn_type:
586 warn_return_type = value;
587 break;
589 case OPT_Wsequence_point:
590 warn_sequence_point = value;
591 break;
593 case OPT_Wsign_compare:
594 warn_sign_compare = value;
595 break;
597 case OPT_Wsign_promo:
598 warn_sign_promo = value;
599 break;
601 case OPT_Wstrict_prototypes:
602 warn_strict_prototypes = value;
603 break;
605 case OPT_Wsynth:
606 warn_synth = value;
607 break;
609 case OPT_Wsystem_headers:
610 cpp_opts->warn_system_headers = value;
611 break;
613 case OPT_Wtraditional:
614 warn_traditional = value;
615 cpp_opts->warn_traditional = value;
616 break;
618 case OPT_Wtrigraphs:
619 cpp_opts->warn_trigraphs = value;
620 break;
622 case OPT_Wundeclared_selector:
623 warn_undeclared_selector = value;
624 break;
626 case OPT_Wundef:
627 cpp_opts->warn_undef = value;
628 break;
630 case OPT_Wunknown_pragmas:
631 /* Set to greater than 1, so that even unknown pragmas in
632 system headers will be warned about. */
633 warn_unknown_pragmas = value * 2;
634 break;
636 case OPT_Wunused_macros:
637 warn_unused_macros = value;
638 break;
640 case OPT_Wwrite_strings:
641 if (!c_dialect_cxx ())
642 flag_const_strings = value;
643 else
644 warn_write_strings = value;
645 break;
647 case OPT_ansi:
648 if (!c_dialect_cxx ())
649 set_std_c89 (false, true);
650 else
651 set_std_cxx98 (true);
652 break;
654 case OPT_d:
655 handle_OPT_d (arg);
656 break;
658 case OPT_fcond_mismatch:
659 if (!c_dialect_cxx ())
661 flag_cond_mismatch = value;
662 break;
664 /* Fall through. */
666 case OPT_fall_virtual:
667 case OPT_fenum_int_equiv:
668 case OPT_fguiding_decls:
669 case OPT_fhonor_std:
670 case OPT_fhuge_objects:
671 case OPT_flabels_ok:
672 case OPT_fname_mangling_version_:
673 case OPT_fnew_abi:
674 case OPT_fnonnull_objects:
675 case OPT_fsquangle:
676 case OPT_fstrict_prototype:
677 case OPT_fthis_is_variable:
678 case OPT_fvtable_thunks:
679 case OPT_fxref:
680 case OPT_fvtable_gc:
681 warning ("switch \"%s\" is no longer supported", option->opt_text);
682 break;
684 case OPT_fabi_version_:
685 flag_abi_version = value;
686 break;
688 case OPT_faccess_control:
689 flag_access_control = value;
690 break;
692 case OPT_falt_external_templates:
693 flag_alt_external_templates = value;
694 if (value)
695 flag_external_templates = true;
696 cp_deprecated:
697 warning ("switch \"%s\" is deprecated, please see documentation "
698 "for details", option->opt_text);
699 break;
701 case OPT_fasm:
702 flag_no_asm = !value;
703 break;
705 case OPT_fbuiltin:
706 flag_no_builtin = !value;
707 break;
709 case OPT_fbuiltin_:
710 if (value)
711 result = 0;
712 else
713 disable_builtin_function (arg);
714 break;
716 case OPT_fdollars_in_identifiers:
717 cpp_opts->dollars_in_ident = value;
718 break;
720 case OPT_fdump_:
721 if (!dump_switch_p (arg))
722 result = 0;
723 break;
725 case OPT_ffreestanding:
726 value = !value;
727 /* Fall through.... */
728 case OPT_fhosted:
729 flag_hosted = value;
730 flag_no_builtin = !value;
731 /* warn_main will be 2 if set by -Wall, 1 if set by -Wmain */
732 if (!value && warn_main == 2)
733 warn_main = 0;
734 break;
736 case OPT_fshort_double:
737 flag_short_double = value;
738 break;
740 case OPT_fshort_enums:
741 flag_short_enums = value;
742 break;
744 case OPT_fshort_wchar:
745 flag_short_wchar = value;
746 break;
748 case OPT_fsigned_bitfields:
749 flag_signed_bitfields = value;
750 explicit_flag_signed_bitfields = 1;
751 break;
753 case OPT_fsigned_char:
754 flag_signed_char = value;
755 break;
757 case OPT_funsigned_bitfields:
758 flag_signed_bitfields = !value;
759 explicit_flag_signed_bitfields = 1;
760 break;
762 case OPT_funsigned_char:
763 flag_signed_char = !value;
764 break;
766 case OPT_fcheck_new:
767 flag_check_new = value;
768 break;
770 case OPT_fconserve_space:
771 flag_conserve_space = value;
772 break;
774 case OPT_fconst_strings:
775 flag_const_strings = value;
776 break;
778 case OPT_fconstant_string_class_:
779 constant_string_class_name = arg;
780 break;
782 case OPT_fdefault_inline:
783 flag_default_inline = value;
784 break;
786 case OPT_felide_constructors:
787 flag_elide_constructors = value;
788 break;
790 case OPT_fenforce_eh_specs:
791 flag_enforce_eh_specs = value;
792 break;
794 case OPT_fexternal_templates:
795 flag_external_templates = value;
796 goto cp_deprecated;
798 case OPT_ffixed_form:
799 case OPT_ffixed_line_length_:
800 /* Fortran front end options ignored when preprocessing only. */
801 if (!flag_preprocess_only)
802 result = 0;
803 break;
805 case OPT_ffor_scope:
806 flag_new_for_scope = value;
807 break;
809 case OPT_fgnu_keywords:
810 flag_no_gnu_keywords = !value;
811 break;
813 case OPT_fgnu_runtime:
814 flag_next_runtime = !value;
815 break;
817 case OPT_fhandle_exceptions:
818 warning ("-fhandle-exceptions has been renamed -fexceptions (and is now on by default)");
819 flag_exceptions = value;
820 break;
822 case OPT_fimplement_inlines:
823 flag_implement_inlines = value;
824 break;
826 case OPT_fimplicit_inline_templates:
827 flag_implicit_inline_templates = value;
828 break;
830 case OPT_fimplicit_templates:
831 flag_implicit_templates = value;
832 break;
834 case OPT_fms_extensions:
835 flag_ms_extensions = value;
836 break;
838 case OPT_fnext_runtime:
839 flag_next_runtime = value;
840 break;
842 case OPT_fnonansi_builtins:
843 flag_no_nonansi_builtin = !value;
844 break;
846 case OPT_foperator_names:
847 cpp_opts->operator_names = value;
848 break;
850 case OPT_foptional_diags:
851 flag_optional_diags = value;
852 break;
854 case OPT_fpch_deps:
855 cpp_opts->restore_pch_deps = value;
856 break;
858 case OPT_fpermissive:
859 flag_permissive = value;
860 break;
862 case OPT_fpreprocessed:
863 cpp_opts->preprocessed = value;
864 break;
866 case OPT_frepo:
867 flag_use_repository = value;
868 if (value)
869 flag_implicit_templates = 0;
870 break;
872 case OPT_frtti:
873 flag_rtti = value;
874 break;
876 case OPT_fshow_column:
877 cpp_opts->show_column = value;
878 break;
880 case OPT_fstats:
881 flag_detailed_statistics = value;
882 break;
884 case OPT_ftabstop_:
885 /* It is documented that we silently ignore silly values. */
886 if (value >= 1 && value <= 100)
887 cpp_opts->tabstop = value;
888 break;
890 case OPT_fexec_charset_:
891 cpp_opts->narrow_charset = arg;
892 break;
894 case OPT_fwide_exec_charset_:
895 cpp_opts->wide_charset = arg;
896 break;
898 case OPT_ftemplate_depth_:
899 max_tinst_depth = value;
900 break;
902 case OPT_fuse_cxa_atexit:
903 flag_use_cxa_atexit = value;
904 break;
906 case OPT_fweak:
907 flag_weak = value;
908 break;
910 case OPT_gen_decls:
911 flag_gen_declaration = 1;
912 break;
914 case OPT_idirafter:
915 add_path (xstrdup (arg), AFTER, 0);
916 break;
918 case OPT_imacros:
919 case OPT_include:
920 defer_opt (code, arg);
921 break;
923 case OPT_iprefix:
924 iprefix = arg;
925 break;
927 case OPT_isysroot:
928 sysroot = arg;
929 break;
931 case OPT_isystem:
932 add_path (xstrdup (arg), SYSTEM, 0);
933 break;
935 case OPT_iwithprefix:
936 add_prefixed_path (arg, SYSTEM);
937 break;
939 case OPT_iwithprefixbefore:
940 add_prefixed_path (arg, BRACKET);
941 break;
943 case OPT_lang_asm:
944 cpp_set_lang (parse_in, CLK_ASM);
945 cpp_opts->dollars_in_ident = false;
946 break;
948 case OPT_lang_objc:
949 cpp_opts->objc = 1;
950 break;
952 case OPT_nostdinc:
953 std_inc = false;
954 break;
956 case OPT_nostdinc__:
957 std_cxx_inc = false;
958 break;
960 case OPT_o:
961 if (!out_fname)
962 out_fname = arg;
963 else
964 error ("output filename specified twice");
965 break;
967 /* We need to handle the -pedantic switches here, rather than in
968 c_common_post_options, so that a subsequent -Wno-endif-labels
969 is not overridden. */
970 case OPT_pedantic_errors:
971 cpp_opts->pedantic_errors = 1;
972 /* Fall through. */
973 case OPT_pedantic:
974 cpp_opts->pedantic = 1;
975 cpp_opts->warn_endif_labels = 1;
976 break;
978 case OPT_print_objc_runtime_info:
979 print_struct_values = 1;
980 break;
982 case OPT_remap:
983 cpp_opts->remap = 1;
984 break;
986 case OPT_std_c__98:
987 case OPT_std_gnu__98:
988 set_std_cxx98 (code == OPT_std_c__98 /* ISO */);
989 break;
991 case OPT_std_c89:
992 case OPT_std_iso9899_1990:
993 case OPT_std_iso9899_199409:
994 set_std_c89 (code == OPT_std_iso9899_199409 /* c94 */, true /* ISO */);
995 break;
997 case OPT_std_gnu89:
998 set_std_c89 (false /* c94 */, false /* ISO */);
999 break;
1001 case OPT_std_c99:
1002 case OPT_std_c9x:
1003 case OPT_std_iso9899_1999:
1004 case OPT_std_iso9899_199x:
1005 set_std_c99 (true /* ISO */);
1006 break;
1008 case OPT_std_gnu99:
1009 case OPT_std_gnu9x:
1010 set_std_c99 (false /* ISO */);
1011 break;
1013 case OPT_trigraphs:
1014 cpp_opts->trigraphs = 1;
1015 break;
1017 case OPT_traditional_cpp:
1018 cpp_opts->traditional = 1;
1019 break;
1021 case OPT_undef:
1022 flag_undef = 1;
1023 break;
1025 case OPT_w:
1026 cpp_opts->inhibit_warnings = 1;
1027 break;
1029 case OPT_v:
1030 verbose = true;
1031 break;
1034 return result;
1037 /* Post-switch processing. */
1038 bool
1039 c_common_post_options (const char **pfilename)
1041 /* Canonicalize the input and output filenames. */
1042 if (in_fnames == NULL)
1044 in_fnames = xmalloc (sizeof (in_fnames[0]));
1045 in_fnames[0] = "";
1047 else if (strcmp (in_fnames[0], "-") == 0)
1048 in_fnames[0] = "";
1050 if (out_fname == NULL || !strcmp (out_fname, "-"))
1051 out_fname = "";
1053 if (cpp_opts->deps.style == DEPS_NONE)
1054 check_deps_environment_vars ();
1056 handle_deferred_opts ();
1058 sanitize_cpp_opts ();
1060 register_include_chains (parse_in, sysroot, iprefix,
1061 std_inc, std_cxx_inc && c_dialect_cxx (), verbose);
1063 flag_inline_trees = 1;
1065 /* Use tree inlining if possible. Function instrumentation is only
1066 done in the RTL level, so we disable tree inlining. */
1067 if (! flag_instrument_function_entry_exit)
1069 if (!flag_no_inline)
1070 flag_no_inline = 1;
1071 if (flag_inline_functions)
1073 flag_inline_trees = 2;
1074 flag_inline_functions = 0;
1078 /* -Wextra implies -Wsign-compare, but not if explicitly
1079 overridden. */
1080 if (warn_sign_compare == -1)
1081 warn_sign_compare = extra_warnings;
1083 /* Special format checking options don't work without -Wformat; warn if
1084 they are used. */
1085 if (warn_format_y2k && !warn_format)
1086 warning ("-Wformat-y2k ignored without -Wformat");
1087 if (warn_format_extra_args && !warn_format)
1088 warning ("-Wformat-extra-args ignored without -Wformat");
1089 if (warn_format_zero_length && !warn_format)
1090 warning ("-Wformat-zero-length ignored without -Wformat");
1091 if (warn_format_nonliteral && !warn_format)
1092 warning ("-Wformat-nonliteral ignored without -Wformat");
1093 if (warn_format_security && !warn_format)
1094 warning ("-Wformat-security ignored without -Wformat");
1095 if (warn_missing_format_attribute && !warn_format)
1096 warning ("-Wmissing-format-attribute ignored without -Wformat");
1098 if (flag_preprocess_only)
1100 /* Open the output now. We must do so even if flag_no_output is
1101 on, because there may be other output than from the actual
1102 preprocessing (e.g. from -dM). */
1103 if (out_fname[0] == '\0')
1104 out_stream = stdout;
1105 else
1106 out_stream = fopen (out_fname, "w");
1108 if (out_stream == NULL)
1110 fatal_error ("opening output file %s: %m", out_fname);
1111 return false;
1114 if (num_in_fnames > 1)
1115 error ("too many filenames given. Type %s --help for usage",
1116 progname);
1118 init_pp_output (out_stream);
1120 else
1122 init_c_lex ();
1124 /* Yuk. WTF is this? I do know ObjC relies on it somewhere. */
1125 input_line = 0;
1128 cpp_get_callbacks (parse_in)->file_change = cb_file_change;
1130 /* NOTE: we use in_fname here, not the one supplied. */
1131 *pfilename = cpp_read_main_file (parse_in, in_fnames[0]);
1133 saved_lineno = input_line;
1134 input_line = 0;
1136 /* If an error has occurred in cpplib, note it so we fail
1137 immediately. */
1138 errorcount += cpp_errors (parse_in);
1140 return flag_preprocess_only;
1143 /* Front end initialization common to C, ObjC and C++. */
1144 bool
1145 c_common_init (void)
1147 input_line = saved_lineno;
1149 /* Set up preprocessor arithmetic. Must be done after call to
1150 c_common_nodes_and_builtins for type nodes to be good. */
1151 cpp_opts->precision = TYPE_PRECISION (intmax_type_node);
1152 cpp_opts->char_precision = TYPE_PRECISION (char_type_node);
1153 cpp_opts->int_precision = TYPE_PRECISION (integer_type_node);
1154 cpp_opts->wchar_precision = TYPE_PRECISION (wchar_type_node);
1155 cpp_opts->unsigned_wchar = TREE_UNSIGNED (wchar_type_node);
1156 cpp_opts->bytes_big_endian = BYTES_BIG_ENDIAN;
1158 /* This can't happen until after wchar_precision and bytes_big_endian
1159 are known. */
1160 cpp_init_iconv (parse_in);
1162 if (flag_preprocess_only)
1164 finish_options (in_fnames[0]);
1165 preprocess_file (parse_in);
1166 return false;
1169 /* Has to wait until now so that cpplib has its hash table. */
1170 init_pragma ();
1172 return true;
1175 /* Initialize the integrated preprocessor after debug output has been
1176 initialized; loop over each input file. */
1177 void
1178 c_common_parse_file (int set_yydebug ATTRIBUTE_UNUSED)
1180 unsigned file_index;
1182 #if YYDEBUG != 0
1183 yydebug = set_yydebug;
1184 #else
1185 warning ("YYDEBUG not defined");
1186 #endif
1188 file_index = 0;
1192 if (file_index > 0)
1194 /* Reset the state of the parser. */
1195 c_reset_state();
1197 /* Reset cpplib's macros and start a new file. */
1198 cpp_undef_all (parse_in);
1199 cpp_stack_file (parse_in, in_fnames[file_index]);
1202 finish_options(in_fnames[file_index]);
1203 if (file_index == 0)
1204 pch_init();
1205 c_parse_file ();
1207 file_index++;
1208 } while (file_index < num_in_fnames);
1210 free_parser_stacks ();
1211 finish_file ();
1214 /* Common finish hook for the C, ObjC and C++ front ends. */
1215 void
1216 c_common_finish (void)
1218 FILE *deps_stream = NULL;
1220 if (cpp_opts->deps.style != DEPS_NONE)
1222 /* If -M or -MM was seen without -MF, default output to the
1223 output stream. */
1224 if (!deps_file)
1225 deps_stream = out_stream;
1226 else
1228 deps_stream = fopen (deps_file, deps_append ? "a": "w");
1229 if (!deps_stream)
1230 fatal_error ("opening dependency file %s: %m", deps_file);
1234 /* For performance, avoid tearing down cpplib's internal structures
1235 with cpp_destroy (). */
1236 errorcount += cpp_finish (parse_in, deps_stream);
1238 if (deps_stream && deps_stream != out_stream
1239 && (ferror (deps_stream) || fclose (deps_stream)))
1240 fatal_error ("closing dependency file %s: %m", deps_file);
1242 if (out_stream && (ferror (out_stream) || fclose (out_stream)))
1243 fatal_error ("when writing output to %s: %m", out_fname);
1246 /* Either of two environment variables can specify output of
1247 dependencies. Their value is either "OUTPUT_FILE" or "OUTPUT_FILE
1248 DEPS_TARGET", where OUTPUT_FILE is the file to write deps info to
1249 and DEPS_TARGET is the target to mention in the deps. They also
1250 result in dependency information being appended to the output file
1251 rather than overwriting it, and like Sun's compiler
1252 SUNPRO_DEPENDENCIES suppresses the dependency on the main file. */
1253 static void
1254 check_deps_environment_vars (void)
1256 char *spec;
1258 GET_ENVIRONMENT (spec, "DEPENDENCIES_OUTPUT");
1259 if (spec)
1260 cpp_opts->deps.style = DEPS_USER;
1261 else
1263 GET_ENVIRONMENT (spec, "SUNPRO_DEPENDENCIES");
1264 if (spec)
1266 cpp_opts->deps.style = DEPS_SYSTEM;
1267 cpp_opts->deps.ignore_main_file = true;
1271 if (spec)
1273 /* Find the space before the DEPS_TARGET, if there is one. */
1274 char *s = strchr (spec, ' ');
1275 if (s)
1277 /* Let the caller perform MAKE quoting. */
1278 defer_opt (OPT_MT, s + 1);
1279 *s = '\0';
1282 /* Command line -MF overrides environment variables and default. */
1283 if (!deps_file)
1284 deps_file = spec;
1286 deps_append = 1;
1290 /* Handle deferred command line switches. */
1291 static void
1292 handle_deferred_opts (void)
1294 size_t i;
1296 for (i = 0; i < deferred_count; i++)
1298 struct deferred_opt *opt = &deferred_opts[i];
1300 if (opt->code == OPT_MT || opt->code == OPT_MQ)
1301 cpp_add_dependency_target (parse_in, opt->arg, opt->code == OPT_MQ);
1305 /* These settings are appropriate for GCC, but not necessarily so for
1306 cpplib as a library. */
1307 static void
1308 sanitize_cpp_opts (void)
1310 /* If we don't know what style of dependencies to output, complain
1311 if any other dependency switches have been given. */
1312 if (deps_seen && cpp_opts->deps.style == DEPS_NONE)
1313 error ("to generate dependencies you must specify either -M or -MM");
1315 /* -dM and dependencies suppress normal output; do it here so that
1316 the last -d[MDN] switch overrides earlier ones. */
1317 if (flag_dump_macros == 'M')
1318 flag_no_output = 1;
1320 /* Disable -dD, -dN and -dI if normal output is suppressed. Allow
1321 -dM since at least glibc relies on -M -dM to work. */
1322 if (flag_no_output)
1324 if (flag_dump_macros != 'M')
1325 flag_dump_macros = 0;
1326 flag_dump_includes = 0;
1329 cpp_opts->unsigned_char = !flag_signed_char;
1330 cpp_opts->stdc_0_in_system_headers = STDC_0_IN_SYSTEM_HEADERS;
1332 /* We want -Wno-long-long to override -pedantic -std=non-c99
1333 and/or -Wtraditional, whatever the ordering. */
1334 cpp_opts->warn_long_long
1335 = warn_long_long && ((!flag_isoc99 && pedantic) || warn_traditional);
1337 /* If we're generating preprocessor output, emit current directory
1338 if explicitly requested or if debugging information is enabled.
1339 ??? Maybe we should only do it for debugging formats that
1340 actually output the current directory? */
1341 if (flag_working_directory == -1)
1342 flag_working_directory = (debug_info_level != DINFO_LEVEL_NONE);
1343 cpp_opts->working_directory
1344 = flag_preprocess_only && flag_working_directory;
1347 /* Add include path with a prefix at the front of its name. */
1348 static void
1349 add_prefixed_path (const char *suffix, size_t chain)
1351 char *path;
1352 const char *prefix;
1353 size_t prefix_len, suffix_len;
1355 suffix_len = strlen (suffix);
1356 prefix = iprefix ? iprefix : cpp_GCC_INCLUDE_DIR;
1357 prefix_len = iprefix ? strlen (iprefix) : cpp_GCC_INCLUDE_DIR_len;
1359 path = xmalloc (prefix_len + suffix_len + 1);
1360 memcpy (path, prefix, prefix_len);
1361 memcpy (path + prefix_len, suffix, suffix_len);
1362 path[prefix_len + suffix_len] = '\0';
1364 add_path (path, chain, 0);
1367 /* Handle -D, -U, -A, -imacros, and the first -include.
1368 TIF is the input file to which we will return after processing all
1369 the includes. */
1370 static void
1371 finish_options (const char *tif)
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 include_cursor = 0;
1422 this_input_filename = tif;
1423 push_command_line_include ();
1426 /* Give CPP the next file given by -include, if any. */
1427 static void
1428 push_command_line_include (void)
1430 if (cpp_opts->preprocessed)
1431 return;
1433 while (include_cursor < deferred_count)
1435 struct deferred_opt *opt = &deferred_opts[include_cursor++];
1437 if (opt->code == OPT_include && cpp_push_include (parse_in, opt->arg))
1438 return;
1441 if (include_cursor == deferred_count)
1443 /* Restore the line map from <command line>. */
1444 cpp_change_file (parse_in, LC_RENAME, this_input_filename);
1445 /* -Wunused-macros should only warn about macros defined hereafter. */
1446 cpp_opts->warn_unused_macros = warn_unused_macros;
1447 include_cursor++;
1451 /* File change callback. Has to handle -include files. */
1452 static void
1453 cb_file_change (cpp_reader *pfile ATTRIBUTE_UNUSED,
1454 const struct line_map *new_map)
1456 if (flag_preprocess_only)
1457 pp_file_change (new_map);
1458 else
1459 fe_file_change (new_map);
1461 if (new_map->reason == LC_LEAVE && MAIN_FILE_P (new_map))
1462 push_command_line_include ();
1465 /* Set the C 89 standard (with 1994 amendments if C94, without GNU
1466 extensions if ISO). There is no concept of gnu94. */
1467 static void
1468 set_std_c89 (int c94, int iso)
1470 cpp_set_lang (parse_in, c94 ? CLK_STDC94: iso ? CLK_STDC89: CLK_GNUC89);
1471 flag_iso = iso;
1472 flag_no_asm = iso;
1473 flag_no_gnu_keywords = iso;
1474 flag_no_nonansi_builtin = 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_iso = iso;
1488 flag_isoc99 = 1;
1489 flag_isoc94 = 1;
1490 flag_writable_strings = 0;
1493 /* Set the C++ 98 standard (without GNU extensions if ISO). */
1494 static void
1495 set_std_cxx98 (int iso)
1497 cpp_set_lang (parse_in, iso ? CLK_CXX98: CLK_GNUCXX);
1498 flag_no_gnu_keywords = iso;
1499 flag_no_nonansi_builtin = iso;
1500 flag_iso = iso;
1503 /* Handle setting implicit to ON. */
1504 static void
1505 set_Wimplicit (int on)
1507 warn_implicit = on;
1508 warn_implicit_int = on;
1509 if (on)
1511 if (mesg_implicit_function_declaration != 2)
1512 mesg_implicit_function_declaration = 1;
1514 else
1515 mesg_implicit_function_declaration = 0;
1518 /* Args to -d specify what to dump. Silently ignore
1519 unrecognized options; they may be aimed at toplev.c. */
1520 static void
1521 handle_OPT_d (const char *arg)
1523 char c;
1525 while ((c = *arg++) != '\0')
1526 switch (c)
1528 case 'M': /* Dump macros only. */
1529 case 'N': /* Dump names. */
1530 case 'D': /* Dump definitions. */
1531 flag_dump_macros = c;
1532 break;
1534 case 'I':
1535 flag_dump_includes = 1;
1536 break;