OSDN Git Service

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