* configure.in: Pass a computed --program-transform-name
[official-gcc.git] / gcc / c-opts.c
blobee957f7487b0685e9db2d87ab14f8cf839839e71
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_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_fnonansi_builtins:
851 flag_no_nonansi_builtin = !value;
852 break;
854 case OPT_foperator_names:
855 cpp_opts->operator_names = value;
856 break;
858 case OPT_foptional_diags:
859 flag_optional_diags = value;
860 break;
862 case OPT_fpch_deps:
863 cpp_opts->restore_pch_deps = value;
864 break;
866 case OPT_fpermissive:
867 flag_permissive = value;
868 break;
870 case OPT_fpreprocessed:
871 cpp_opts->preprocessed = value;
872 break;
874 case OPT_frepo:
875 flag_use_repository = value;
876 if (value)
877 flag_implicit_templates = 0;
878 break;
880 case OPT_frtti:
881 flag_rtti = value;
882 break;
884 case OPT_fshow_column:
885 cpp_opts->show_column = value;
886 break;
888 case OPT_fstats:
889 flag_detailed_statistics = value;
890 break;
892 case OPT_ftabstop_:
893 /* It is documented that we silently ignore silly values. */
894 if (value >= 1 && value <= 100)
895 cpp_opts->tabstop = value;
896 break;
898 case OPT_fexec_charset_:
899 cpp_opts->narrow_charset = arg;
900 break;
902 case OPT_fwide_exec_charset_:
903 cpp_opts->wide_charset = arg;
904 break;
906 case OPT_ftemplate_depth_:
907 max_tinst_depth = value;
908 break;
910 case OPT_fuse_cxa_atexit:
911 flag_use_cxa_atexit = value;
912 break;
914 case OPT_fweak:
915 flag_weak = value;
916 break;
918 case OPT_gen_decls:
919 flag_gen_declaration = 1;
920 break;
922 case OPT_idirafter:
923 add_path (xstrdup (arg), AFTER, 0);
924 break;
926 case OPT_imacros:
927 case OPT_include:
928 defer_opt (code, arg);
929 break;
931 case OPT_iprefix:
932 iprefix = arg;
933 break;
935 case OPT_isysroot:
936 sysroot = arg;
937 break;
939 case OPT_isystem:
940 add_path (xstrdup (arg), SYSTEM, 0);
941 break;
943 case OPT_iwithprefix:
944 add_prefixed_path (arg, SYSTEM);
945 break;
947 case OPT_iwithprefixbefore:
948 add_prefixed_path (arg, BRACKET);
949 break;
951 case OPT_lang_asm:
952 cpp_set_lang (parse_in, CLK_ASM);
953 cpp_opts->dollars_in_ident = false;
954 break;
956 case OPT_lang_objc:
957 cpp_opts->objc = 1;
958 break;
960 case OPT_nostdinc:
961 std_inc = false;
962 break;
964 case OPT_nostdinc__:
965 std_cxx_inc = false;
966 break;
968 case OPT_o:
969 if (!out_fname)
970 out_fname = arg;
971 else
972 error ("output filename specified twice");
973 break;
975 /* We need to handle the -pedantic switches here, rather than in
976 c_common_post_options, so that a subsequent -Wno-endif-labels
977 is not overridden. */
978 case OPT_pedantic_errors:
979 cpp_opts->pedantic_errors = 1;
980 /* Fall through. */
981 case OPT_pedantic:
982 cpp_opts->pedantic = 1;
983 cpp_opts->warn_endif_labels = 1;
984 break;
986 case OPT_print_objc_runtime_info:
987 print_struct_values = 1;
988 break;
990 case OPT_remap:
991 cpp_opts->remap = 1;
992 break;
994 case OPT_std_c__98:
995 case OPT_std_gnu__98:
996 set_std_cxx98 (code == OPT_std_c__98 /* ISO */);
997 break;
999 case OPT_std_c89:
1000 case OPT_std_iso9899_1990:
1001 case OPT_std_iso9899_199409:
1002 set_std_c89 (code == OPT_std_iso9899_199409 /* c94 */, true /* ISO */);
1003 break;
1005 case OPT_std_gnu89:
1006 set_std_c89 (false /* c94 */, false /* ISO */);
1007 break;
1009 case OPT_std_c99:
1010 case OPT_std_c9x:
1011 case OPT_std_iso9899_1999:
1012 case OPT_std_iso9899_199x:
1013 set_std_c99 (true /* ISO */);
1014 break;
1016 case OPT_std_gnu99:
1017 case OPT_std_gnu9x:
1018 set_std_c99 (false /* ISO */);
1019 break;
1021 case OPT_trigraphs:
1022 cpp_opts->trigraphs = 1;
1023 break;
1025 case OPT_traditional_cpp:
1026 cpp_opts->traditional = 1;
1027 break;
1029 case OPT_undef:
1030 flag_undef = 1;
1031 break;
1033 case OPT_w:
1034 cpp_opts->inhibit_warnings = 1;
1035 break;
1037 case OPT_v:
1038 verbose = true;
1039 break;
1042 return result;
1045 /* Post-switch processing. */
1046 bool
1047 c_common_post_options (const char **pfilename)
1049 /* Canonicalize the input and output filenames. */
1050 if (in_fnames == NULL)
1052 in_fnames = xmalloc (sizeof (in_fnames[0]));
1053 in_fnames[0] = "";
1055 else if (strcmp (in_fnames[0], "-") == 0)
1056 in_fnames[0] = "";
1058 if (out_fname == NULL || !strcmp (out_fname, "-"))
1059 out_fname = "";
1061 if (cpp_opts->deps.style == DEPS_NONE)
1062 check_deps_environment_vars ();
1064 handle_deferred_opts ();
1066 sanitize_cpp_opts ();
1068 register_include_chains (parse_in, sysroot, iprefix,
1069 std_inc, std_cxx_inc && c_dialect_cxx (), verbose);
1071 flag_inline_trees = 1;
1073 /* Use tree inlining if possible. Function instrumentation is only
1074 done in the RTL level, so we disable tree inlining. */
1075 if (! flag_instrument_function_entry_exit)
1077 if (!flag_no_inline)
1078 flag_no_inline = 1;
1079 if (flag_inline_functions)
1081 flag_inline_trees = 2;
1082 flag_inline_functions = 0;
1086 /* -Wextra implies -Wsign-compare, but not if explicitly
1087 overridden. */
1088 if (warn_sign_compare == -1)
1089 warn_sign_compare = extra_warnings;
1091 /* Special format checking options don't work without -Wformat; warn if
1092 they are used. */
1093 if (warn_format_y2k && !warn_format)
1094 warning ("-Wformat-y2k ignored without -Wformat");
1095 if (warn_format_extra_args && !warn_format)
1096 warning ("-Wformat-extra-args ignored without -Wformat");
1097 if (warn_format_zero_length && !warn_format)
1098 warning ("-Wformat-zero-length ignored without -Wformat");
1099 if (warn_format_nonliteral && !warn_format)
1100 warning ("-Wformat-nonliteral ignored without -Wformat");
1101 if (warn_format_security && !warn_format)
1102 warning ("-Wformat-security ignored without -Wformat");
1103 if (warn_missing_format_attribute && !warn_format)
1104 warning ("-Wmissing-format-attribute ignored without -Wformat");
1106 if (flag_preprocess_only)
1108 /* Open the output now. We must do so even if flag_no_output is
1109 on, because there may be other output than from the actual
1110 preprocessing (e.g. from -dM). */
1111 if (out_fname[0] == '\0')
1112 out_stream = stdout;
1113 else
1114 out_stream = fopen (out_fname, "w");
1116 if (out_stream == NULL)
1118 fatal_error ("opening output file %s: %m", out_fname);
1119 return false;
1122 if (num_in_fnames > 1)
1123 error ("too many filenames given. Type %s --help for usage",
1124 progname);
1126 init_pp_output (out_stream);
1128 else
1130 init_c_lex ();
1132 /* Yuk. WTF is this? I do know ObjC relies on it somewhere. */
1133 input_line = 0;
1136 cpp_get_callbacks (parse_in)->file_change = cb_file_change;
1137 cpp_post_options (parse_in);
1139 /* NOTE: we use in_fname here, not the one supplied. */
1140 *pfilename = cpp_read_main_file (parse_in, in_fnames[0]);
1142 saved_lineno = input_line;
1143 input_line = 0;
1145 /* If an error has occurred in cpplib, note it so we fail
1146 immediately. */
1147 errorcount += cpp_errors (parse_in);
1149 return flag_preprocess_only;
1152 /* Front end initialization common to C, ObjC and C++. */
1153 bool
1154 c_common_init (void)
1156 input_line = saved_lineno;
1158 /* Set up preprocessor arithmetic. Must be done after call to
1159 c_common_nodes_and_builtins for type nodes to be good. */
1160 cpp_opts->precision = TYPE_PRECISION (intmax_type_node);
1161 cpp_opts->char_precision = TYPE_PRECISION (char_type_node);
1162 cpp_opts->int_precision = TYPE_PRECISION (integer_type_node);
1163 cpp_opts->wchar_precision = TYPE_PRECISION (wchar_type_node);
1164 cpp_opts->unsigned_wchar = TREE_UNSIGNED (wchar_type_node);
1165 cpp_opts->bytes_big_endian = BYTES_BIG_ENDIAN;
1167 /* This can't happen until after wchar_precision and bytes_big_endian
1168 are known. */
1169 cpp_init_iconv (parse_in);
1171 if (flag_preprocess_only)
1173 finish_options (in_fnames[0]);
1174 preprocess_file (parse_in);
1175 return false;
1178 /* Has to wait until now so that cpplib has its hash table. */
1179 init_pragma ();
1181 return true;
1184 /* Initialize the integrated preprocessor after debug output has been
1185 initialized; loop over each input file. */
1186 void
1187 c_common_parse_file (int set_yydebug ATTRIBUTE_UNUSED)
1189 unsigned file_index;
1191 #if YYDEBUG != 0
1192 yydebug = set_yydebug;
1193 #else
1194 warning ("YYDEBUG not defined");
1195 #endif
1197 file_index = 0;
1201 if (file_index > 0)
1203 /* Reset the state of the parser. */
1204 c_reset_state();
1206 /* Reset cpplib's macros and start a new file. */
1207 cpp_undef_all (parse_in);
1208 cpp_read_main_file (parse_in, in_fnames[file_index]);
1211 finish_options(in_fnames[file_index]);
1212 if (file_index == 0)
1213 pch_init();
1214 c_parse_file ();
1216 file_index++;
1217 } while (file_index < num_in_fnames);
1219 free_parser_stacks ();
1220 finish_file ();
1223 /* Common finish hook for the C, ObjC and C++ front ends. */
1224 void
1225 c_common_finish (void)
1227 FILE *deps_stream = NULL;
1229 if (cpp_opts->deps.style != DEPS_NONE)
1231 /* If -M or -MM was seen without -MF, default output to the
1232 output stream. */
1233 if (!deps_file)
1234 deps_stream = out_stream;
1235 else
1237 deps_stream = fopen (deps_file, deps_append ? "a": "w");
1238 if (!deps_stream)
1239 fatal_error ("opening dependency file %s: %m", deps_file);
1243 /* For performance, avoid tearing down cpplib's internal structures
1244 with cpp_destroy (). */
1245 errorcount += cpp_finish (parse_in, deps_stream);
1247 if (deps_stream && deps_stream != out_stream
1248 && (ferror (deps_stream) || fclose (deps_stream)))
1249 fatal_error ("closing dependency file %s: %m", deps_file);
1251 if (out_stream && (ferror (out_stream) || fclose (out_stream)))
1252 fatal_error ("when writing output to %s: %m", out_fname);
1255 /* Either of two environment variables can specify output of
1256 dependencies. Their value is either "OUTPUT_FILE" or "OUTPUT_FILE
1257 DEPS_TARGET", where OUTPUT_FILE is the file to write deps info to
1258 and DEPS_TARGET is the target to mention in the deps. They also
1259 result in dependency information being appended to the output file
1260 rather than overwriting it, and like Sun's compiler
1261 SUNPRO_DEPENDENCIES suppresses the dependency on the main file. */
1262 static void
1263 check_deps_environment_vars (void)
1265 char *spec;
1267 GET_ENVIRONMENT (spec, "DEPENDENCIES_OUTPUT");
1268 if (spec)
1269 cpp_opts->deps.style = DEPS_USER;
1270 else
1272 GET_ENVIRONMENT (spec, "SUNPRO_DEPENDENCIES");
1273 if (spec)
1275 cpp_opts->deps.style = DEPS_SYSTEM;
1276 cpp_opts->deps.ignore_main_file = true;
1280 if (spec)
1282 /* Find the space before the DEPS_TARGET, if there is one. */
1283 char *s = strchr (spec, ' ');
1284 if (s)
1286 /* Let the caller perform MAKE quoting. */
1287 defer_opt (OPT_MT, s + 1);
1288 *s = '\0';
1291 /* Command line -MF overrides environment variables and default. */
1292 if (!deps_file)
1293 deps_file = spec;
1295 deps_append = 1;
1299 /* Handle deferred command line switches. */
1300 static void
1301 handle_deferred_opts (void)
1303 size_t i;
1305 for (i = 0; i < deferred_count; i++)
1307 struct deferred_opt *opt = &deferred_opts[i];
1309 if (opt->code == OPT_MT || opt->code == OPT_MQ)
1310 cpp_add_dependency_target (parse_in, opt->arg, opt->code == OPT_MQ);
1314 /* These settings are appropriate for GCC, but not necessarily so for
1315 cpplib as a library. */
1316 static void
1317 sanitize_cpp_opts (void)
1319 /* If we don't know what style of dependencies to output, complain
1320 if any other dependency switches have been given. */
1321 if (deps_seen && cpp_opts->deps.style == DEPS_NONE)
1322 error ("to generate dependencies you must specify either -M or -MM");
1324 /* -dM and dependencies suppress normal output; do it here so that
1325 the last -d[MDN] switch overrides earlier ones. */
1326 if (flag_dump_macros == 'M')
1327 flag_no_output = 1;
1329 /* Disable -dD, -dN and -dI if normal output is suppressed. Allow
1330 -dM since at least glibc relies on -M -dM to work. */
1331 if (flag_no_output)
1333 if (flag_dump_macros != 'M')
1334 flag_dump_macros = 0;
1335 flag_dump_includes = 0;
1338 cpp_opts->unsigned_char = !flag_signed_char;
1339 cpp_opts->stdc_0_in_system_headers = STDC_0_IN_SYSTEM_HEADERS;
1341 /* We want -Wno-long-long to override -pedantic -std=non-c99
1342 and/or -Wtraditional, whatever the ordering. */
1343 cpp_opts->warn_long_long
1344 = warn_long_long && ((!flag_isoc99 && pedantic) || warn_traditional);
1346 /* If we're generating preprocessor output, emit current directory
1347 if explicitly requested or if debugging information is enabled.
1348 ??? Maybe we should only do it for debugging formats that
1349 actually output the current directory? */
1350 if (flag_working_directory == -1)
1351 flag_working_directory = (debug_info_level != DINFO_LEVEL_NONE);
1352 cpp_opts->working_directory
1353 = flag_preprocess_only && flag_working_directory;
1356 /* Add include path with a prefix at the front of its name. */
1357 static void
1358 add_prefixed_path (const char *suffix, size_t chain)
1360 char *path;
1361 const char *prefix;
1362 size_t prefix_len, suffix_len;
1364 suffix_len = strlen (suffix);
1365 prefix = iprefix ? iprefix : cpp_GCC_INCLUDE_DIR;
1366 prefix_len = iprefix ? strlen (iprefix) : cpp_GCC_INCLUDE_DIR_len;
1368 path = xmalloc (prefix_len + suffix_len + 1);
1369 memcpy (path, prefix, prefix_len);
1370 memcpy (path + prefix_len, suffix, suffix_len);
1371 path[prefix_len + suffix_len] = '\0';
1373 add_path (path, chain, 0);
1376 /* Handle -D, -U, -A, -imacros, and the first -include.
1377 TIF is the input file to which we will return after processing all
1378 the includes. */
1379 static void
1380 finish_options (const char *tif)
1382 if (!cpp_opts->preprocessed)
1384 size_t i;
1386 cpp_change_file (parse_in, LC_RENAME, _("<built-in>"));
1387 cpp_init_builtins (parse_in, flag_hosted);
1388 c_cpp_builtins (parse_in);
1390 /* We're about to send user input to cpplib, so make it warn for
1391 things that we previously (when we sent it internal definitions)
1392 told it to not warn.
1394 C99 permits implementation-defined characters in identifiers.
1395 The documented meaning of -std= is to turn off extensions that
1396 conflict with the specified standard, and since a strictly
1397 conforming program cannot contain a '$', we do not condition
1398 their acceptance on the -std= setting. */
1399 cpp_opts->warn_dollars = (cpp_opts->pedantic && !cpp_opts->c99);
1401 cpp_change_file (parse_in, LC_RENAME, _("<command line>"));
1402 for (i = 0; i < deferred_count; i++)
1404 struct deferred_opt *opt = &deferred_opts[i];
1406 if (opt->code == OPT_D)
1407 cpp_define (parse_in, opt->arg);
1408 else if (opt->code == OPT_U)
1409 cpp_undef (parse_in, opt->arg);
1410 else if (opt->code == OPT_A)
1412 if (opt->arg[0] == '-')
1413 cpp_unassert (parse_in, opt->arg + 1);
1414 else
1415 cpp_assert (parse_in, opt->arg);
1419 /* Handle -imacros after -D and -U. */
1420 for (i = 0; i < deferred_count; i++)
1422 struct deferred_opt *opt = &deferred_opts[i];
1424 if (opt->code == OPT_imacros
1425 && cpp_push_include (parse_in, opt->arg))
1426 cpp_scan_nooutput (parse_in);
1430 include_cursor = 0;
1431 this_input_filename = tif;
1432 push_command_line_include ();
1435 /* Give CPP the next file given by -include, if any. */
1436 static void
1437 push_command_line_include (void)
1439 if (cpp_opts->preprocessed)
1440 return;
1442 while (include_cursor < deferred_count)
1444 struct deferred_opt *opt = &deferred_opts[include_cursor++];
1446 if (opt->code == OPT_include && cpp_push_include (parse_in, opt->arg))
1447 return;
1450 if (include_cursor == deferred_count)
1452 /* Restore the line map from <command line>. */
1453 cpp_change_file (parse_in, LC_RENAME, this_input_filename);
1454 /* -Wunused-macros should only warn about macros defined hereafter. */
1455 cpp_opts->warn_unused_macros = warn_unused_macros;
1456 include_cursor++;
1460 /* File change callback. Has to handle -include files. */
1461 static void
1462 cb_file_change (cpp_reader *pfile ATTRIBUTE_UNUSED,
1463 const struct line_map *new_map)
1465 if (flag_preprocess_only)
1466 pp_file_change (new_map);
1467 else
1468 fe_file_change (new_map);
1470 if (new_map->reason == LC_LEAVE && MAIN_FILE_P (new_map))
1471 push_command_line_include ();
1474 /* Set the C 89 standard (with 1994 amendments if C94, without GNU
1475 extensions if ISO). There is no concept of gnu94. */
1476 static void
1477 set_std_c89 (int c94, int iso)
1479 cpp_set_lang (parse_in, c94 ? CLK_STDC94: iso ? CLK_STDC89: CLK_GNUC89);
1480 flag_iso = iso;
1481 flag_no_asm = iso;
1482 flag_no_gnu_keywords = iso;
1483 flag_no_nonansi_builtin = iso;
1484 flag_isoc94 = c94;
1485 flag_isoc99 = 0;
1486 flag_writable_strings = 0;
1489 /* Set the C 99 standard (without GNU extensions if ISO). */
1490 static void
1491 set_std_c99 (int iso)
1493 cpp_set_lang (parse_in, iso ? CLK_STDC99: CLK_GNUC99);
1494 flag_no_asm = iso;
1495 flag_no_nonansi_builtin = iso;
1496 flag_iso = iso;
1497 flag_isoc99 = 1;
1498 flag_isoc94 = 1;
1499 flag_writable_strings = 0;
1502 /* Set the C++ 98 standard (without GNU extensions if ISO). */
1503 static void
1504 set_std_cxx98 (int iso)
1506 cpp_set_lang (parse_in, iso ? CLK_CXX98: CLK_GNUCXX);
1507 flag_no_gnu_keywords = iso;
1508 flag_no_nonansi_builtin = iso;
1509 flag_iso = iso;
1512 /* Handle setting implicit to ON. */
1513 static void
1514 set_Wimplicit (int on)
1516 warn_implicit = on;
1517 warn_implicit_int = on;
1518 if (on)
1520 if (mesg_implicit_function_declaration != 2)
1521 mesg_implicit_function_declaration = 1;
1523 else
1524 mesg_implicit_function_declaration = 0;
1527 /* Args to -d specify what to dump. Silently ignore
1528 unrecognized options; they may be aimed at toplev.c. */
1529 static void
1530 handle_OPT_d (const char *arg)
1532 char c;
1534 while ((c = *arg++) != '\0')
1535 switch (c)
1537 case 'M': /* Dump macros only. */
1538 case 'N': /* Dump names. */
1539 case 'D': /* Dump definitions. */
1540 flag_dump_macros = c;
1541 break;
1543 case 'I':
1544 flag_dump_includes = 1;
1545 break;