OSDN Git Service

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