OSDN Git Service

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