OSDN Git Service

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