Update GCC80 to version 8.3
[dragonfly.git] / contrib / gcc-8.0 / gcc / c-family / c-opts.c
1 /* C/ObjC/C++ command line option handling.
2    Copyright (C) 2002-2018 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 3, 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 COPYING3.  If not see
19 <http://www.gnu.org/licenses/>.  */
20
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "c-target.h"
26 #include "c-common.h"
27 #include "memmodel.h"
28 #include "tm_p.h"               /* For C_COMMON_OVERRIDE_OPTIONS.  */
29 #include "diagnostic.h"
30 #include "c-pragma.h"
31 #include "flags.h"
32 #include "toplev.h"
33 #include "langhooks.h"
34 #include "tree-diagnostic.h" /* for virt_loc_aware_diagnostic_finalizer */
35 #include "intl.h"
36 #include "cppdefault.h"
37 #include "incpath.h"
38 #include "debug.h"              /* For debug_hooks.  */
39 #include "opts.h"
40 #include "plugin.h"             /* For PLUGIN_INCLUDE_FILE event.  */
41 #include "mkdeps.h"
42 #include "dumpfile.h"
43 #include "file-prefix-map.h"    /* add_*_prefix_map()  */
44
45 #ifndef DOLLARS_IN_IDENTIFIERS
46 # define DOLLARS_IN_IDENTIFIERS true
47 #endif
48
49 #ifndef TARGET_SYSTEM_ROOT
50 # define TARGET_SYSTEM_ROOT NULL
51 #endif
52
53 #ifndef TARGET_OPTF
54 #define TARGET_OPTF(ARG)
55 #endif
56
57 /* CPP's options.  */
58 cpp_options *cpp_opts;
59
60 /* Input filename.  */
61 static const char *this_input_filename;
62
63 /* Filename and stream for preprocessed output.  */
64 static const char *out_fname;
65 static FILE *out_stream;
66
67 /* Append dependencies to deps_file.  */
68 static bool deps_append;
69
70 /* If dependency switches (-MF etc.) have been given.  */
71 static bool deps_seen;
72
73 /* If -v seen.  */
74 static bool verbose;
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 /* Number of deferred options.  */
98 static size_t deferred_count;
99
100 /* Number of deferred options scanned for -include.  */
101 static size_t include_cursor;
102
103 /* Dump files/flags to use during parsing.  */
104 static FILE *original_dump_file = NULL;
105 static dump_flags_t original_dump_flags;
106
107 /* Whether any standard preincluded header has been preincluded.  */
108 static bool done_preinclude;
109
110 static void handle_OPT_d (const char *);
111 static void set_std_cxx98 (int);
112 static void set_std_cxx11 (int);
113 static void set_std_cxx14 (int);
114 static void set_std_cxx17 (int);
115 static void set_std_cxx2a (int);
116 static void set_std_c89 (int, int);
117 static void set_std_c99 (int);
118 static void set_std_c11 (int);
119 static void set_std_c17 (int);
120 static void check_deps_environment_vars (void);
121 static void handle_deferred_opts (void);
122 static void sanitize_cpp_opts (void);
123 static void add_prefixed_path (const char *, incpath_kind);
124 static void push_command_line_include (void);
125 static void cb_file_change (cpp_reader *, const line_map_ordinary *);
126 static void cb_dir_change (cpp_reader *, const char *);
127 static void c_finish_options (void);
128
129 #ifndef STDC_0_IN_SYSTEM_HEADERS
130 #define STDC_0_IN_SYSTEM_HEADERS 0
131 #endif
132
133 /* Holds switches parsed by c_common_handle_option (), but whose
134    handling is deferred to c_common_post_options ().  */
135 static void defer_opt (enum opt_code, const char *);
136 static struct deferred_opt
137 {
138   enum opt_code code;
139   const char *arg;
140 } *deferred_opts;
141
142
143 extern const unsigned int 
144 c_family_lang_mask = (CL_C | CL_CXX | CL_ObjC | CL_ObjCXX);
145
146 /* Defer option CODE with argument ARG.  */
147 static void
148 defer_opt (enum opt_code code, const char *arg)
149 {
150   deferred_opts[deferred_count].code = code;
151   deferred_opts[deferred_count].arg = arg;
152   deferred_count++;
153 }
154
155 /* Return language mask for option parsing.  */
156 unsigned int
157 c_common_option_lang_mask (void)
158 {
159   static const unsigned int lang_flags[] = {CL_C, CL_ObjC, CL_CXX, CL_ObjCXX};
160
161   return lang_flags[c_language];
162 }
163
164 /* Diagnostic finalizer for C/C++/Objective-C/Objective-C++.  */
165 static void
166 c_diagnostic_finalizer (diagnostic_context *context,
167                         diagnostic_info *diagnostic)
168 {
169   diagnostic_show_locus (context, diagnostic->richloc, diagnostic->kind);
170   /* By default print macro expansion contexts in the diagnostic
171      finalizer -- for tokens resulting from macro expansion.  */
172   virt_loc_aware_diagnostic_finalizer (context, diagnostic);
173   pp_destroy_prefix (context->printer);
174   pp_flush (context->printer);
175 }
176
177 /* Common default settings for diagnostics.  */
178 void
179 c_common_diagnostics_set_defaults (diagnostic_context *context)
180 {
181   diagnostic_finalizer (context) = c_diagnostic_finalizer;
182   context->opt_permissive = OPT_fpermissive;
183 }
184
185 /* Whether options from all C-family languages should be accepted
186    quietly.  */
187 static bool accept_all_c_family_options = false;
188
189 /* Return whether to complain about a wrong-language option.  */
190 bool
191 c_common_complain_wrong_lang_p (const struct cl_option *option)
192 {
193   if (accept_all_c_family_options
194       && (option->flags & c_family_lang_mask))
195     return false;
196
197   return true;
198 }
199
200 /* Initialize options structure OPTS.  */
201 void
202 c_common_init_options_struct (struct gcc_options *opts)
203 {
204   opts->x_flag_exceptions = c_dialect_cxx ();
205   opts->x_warn_pointer_arith = c_dialect_cxx ();
206   opts->x_warn_write_strings = c_dialect_cxx ();
207   opts->x_flag_warn_unused_result = true;
208
209   /* By default, C99-like requirements for complex multiply and divide.  */
210   opts->x_flag_complex_method = 2;
211 }
212
213 /* Common initialization before calling option handlers.  */
214 void
215 c_common_init_options (unsigned int decoded_options_count,
216                        struct cl_decoded_option *decoded_options)
217 {
218   unsigned int i;
219   struct cpp_callbacks *cb;
220
221   g_string_concat_db
222     = new (ggc_alloc <string_concat_db> ()) string_concat_db ();
223
224   parse_in = cpp_create_reader (c_dialect_cxx () ? CLK_GNUCXX: CLK_GNUC89,
225                                 ident_hash, line_table);
226   cb = cpp_get_callbacks (parse_in);
227   cb->error = c_cpp_error;
228
229   cpp_opts = cpp_get_options (parse_in);
230   cpp_opts->dollars_in_ident = DOLLARS_IN_IDENTIFIERS;
231   cpp_opts->objc = c_dialect_objc ();
232
233   /* Reset to avoid warnings on internal definitions.  We set it just
234      before passing on command-line options to cpplib.  */
235   cpp_opts->warn_dollars = 0;
236
237   deferred_opts = XNEWVEC (struct deferred_opt, decoded_options_count);
238
239   if (c_language == clk_c)
240     {
241       /* The default for C is gnu17.  */
242       set_std_c17 (false /* ISO */);
243
244       /* If preprocessing assembly language, accept any of the C-family
245          front end options since the driver may pass them through.  */
246       for (i = 1; i < decoded_options_count; i++)
247         if (decoded_options[i].opt_index == OPT_lang_asm)
248           {
249             accept_all_c_family_options = true;
250             break;
251           }
252     }
253
254   /* Set C++ standard to C++14 if not specified on the command line.  */
255   if (c_dialect_cxx ())
256     set_std_cxx14 (/*ISO*/false);
257
258   global_dc->colorize_source_p = true;
259 }
260
261 /* Handle switch SCODE with argument ARG.  VALUE is true, unless no-
262    form of an -f or -W option was given.  Returns false if the switch was
263    invalid, true if valid.  Use HANDLERS in recursive handle_option calls.  */
264 bool
265 c_common_handle_option (size_t scode, const char *arg, int value,
266                         int kind, location_t loc,
267                         const struct cl_option_handlers *handlers)
268 {
269   const struct cl_option *option = &cl_options[scode];
270   enum opt_code code = (enum opt_code) scode;
271   bool result = true;
272
273   /* Prevent resetting the language standard to a C dialect when the driver
274      has already determined that we're looking at assembler input.  */
275   bool preprocessing_asm_p = (cpp_get_options (parse_in)->lang == CLK_ASM);
276
277   switch (code)
278     {
279     default:
280       if (cl_options[code].flags & c_family_lang_mask)
281         {
282           if ((option->flags & CL_TARGET)
283               && ! targetcm.handle_c_option (scode, arg, value))
284             result = false;
285           break;
286         }
287       result = false;
288       break;
289
290     case OPT__output_pch_:
291       pch_file = arg;
292       break;
293
294     case OPT_A:
295       defer_opt (code, arg);
296       break;
297
298     case OPT_C:
299       cpp_opts->discard_comments = 0;
300       break;
301
302     case OPT_CC:
303       cpp_opts->discard_comments = 0;
304       cpp_opts->discard_comments_in_macro_exp = 0;
305       break;
306
307     case OPT_D:
308       defer_opt (code, arg);
309       break;
310
311     case OPT_H:
312       cpp_opts->print_include_names = 1;
313       break;
314
315     case OPT_F:
316       TARGET_OPTF (xstrdup (arg));
317       break;
318
319     case OPT_I:
320       if (strcmp (arg, "-"))
321         add_path (xstrdup (arg), INC_BRACKET, 0, true);
322       else
323         {
324           if (quote_chain_split)
325             error ("-I- specified twice");
326           quote_chain_split = true;
327           split_quote_chain ();
328           inform (input_location, "obsolete option -I- used, please use -iquote instead");
329         }
330       break;
331
332     case OPT_M:
333     case OPT_MM:
334       /* When doing dependencies with -M or -MM, suppress normal
335          preprocessed output, but still do -dM etc. as software
336          depends on this.  Preprocessed output does occur if -MD, -MMD
337          or environment var dependency generation is used.  */
338       cpp_opts->deps.style = (code == OPT_M ? DEPS_SYSTEM: DEPS_USER);
339       flag_no_output = 1;
340       break;
341
342     case OPT_MD:
343     case OPT_MMD:
344       cpp_opts->deps.style = (code == OPT_MD ? DEPS_SYSTEM: DEPS_USER);
345       cpp_opts->deps.need_preprocessor_output = true;
346       deps_file = arg;
347       break;
348
349     case OPT_MF:
350       deps_seen = true;
351       deps_file = arg;
352       break;
353
354     case OPT_MG:
355       deps_seen = true;
356       cpp_opts->deps.missing_files = true;
357       break;
358
359     case OPT_MP:
360       deps_seen = true;
361       cpp_opts->deps.phony_targets = true;
362       break;
363
364     case OPT_MQ:
365     case OPT_MT:
366       deps_seen = true;
367       defer_opt (code, arg);
368       break;
369
370     case OPT_P:
371       flag_no_line_commands = 1;
372       break;
373
374     case OPT_U:
375       defer_opt (code, arg);
376       break;
377
378     case OPT_Wall:
379       /* ??? Don't add new options here. Use LangEnabledBy in c.opt.  */
380
381       cpp_opts->warn_num_sign_change = value;
382       break;
383
384     case OPT_Walloca_larger_than_:
385       if (!value)
386         inform (loc, "-Walloca-larger-than=0 is meaningless");
387       break;
388
389     case OPT_Wvla_larger_than_:
390       if (!value)
391         inform (loc, "-Wvla-larger-than=0 is meaningless");
392       break;
393
394     case OPT_Wunknown_pragmas:
395       /* Set to greater than 1, so that even unknown pragmas in
396          system headers will be warned about.  */
397       /* ??? There is no way to handle this automatically for now.  */
398       warn_unknown_pragmas = value * 2;
399       break;
400
401     case OPT_ansi:
402       if (!c_dialect_cxx ())
403         set_std_c89 (false, true);
404       else
405         set_std_cxx98 (true);
406       break;
407
408     case OPT_d:
409       handle_OPT_d (arg);
410       break;
411
412     case OPT_Wabi_:
413       warn_abi = true;
414       if (value == 1)
415         {
416           warning (0, "%<-Wabi=1%> is not supported, using =2");
417           value = 2;
418         }
419       warn_abi_version = value;
420       break;
421
422     case OPT_fcanonical_system_headers:
423       cpp_opts->canonical_system_headers = value;
424       break;
425
426     case OPT_fcond_mismatch:
427       if (!c_dialect_cxx ())
428         {
429           flag_cond_mismatch = value;
430           break;
431         }
432       warning (0, "switch %qs is no longer supported", option->opt_text);
433       break;
434
435     case OPT_fbuiltin_:
436       if (value)
437         result = false;
438       else
439         disable_builtin_function (arg);
440       break;
441
442     case OPT_fdirectives_only:
443       cpp_opts->directives_only = value;
444       break;
445
446     case OPT_fdollars_in_identifiers:
447       cpp_opts->dollars_in_ident = value;
448       break;
449
450     case OPT_fmacro_prefix_map_:
451       add_macro_prefix_map (arg);
452       break;
453
454     case OPT_ffreestanding:
455       value = !value;
456       /* Fall through.  */
457     case OPT_fhosted:
458       flag_hosted = value;
459       flag_no_builtin = !value;
460       break;
461
462     case OPT_fconstant_string_class_:
463       constant_string_class_name = arg;
464       break;
465
466     case OPT_fextended_identifiers:
467       cpp_opts->extended_identifiers = value;
468       break;
469
470     case OPT_foperator_names:
471       cpp_opts->operator_names = value;
472       break;
473
474     case OPT_fpch_deps:
475       cpp_opts->restore_pch_deps = value;
476       break;
477
478     case OPT_fpch_preprocess:
479       flag_pch_preprocess = value;
480       break;
481
482     case OPT_fpermissive:
483       flag_permissive = value;
484       global_dc->permissive = value;
485       break;
486
487     case OPT_fpreprocessed:
488       cpp_opts->preprocessed = value;
489       break;
490
491     case OPT_fdebug_cpp:
492       cpp_opts->debug = 1;
493       break;
494
495     case OPT_ftrack_macro_expansion:
496       if (value)
497         value = 2;
498       /* Fall Through.  */
499
500     case OPT_ftrack_macro_expansion_:
501       if (arg && *arg != '\0')
502         cpp_opts->track_macro_expansion = value;
503       else
504         cpp_opts->track_macro_expansion = 2;
505       break;
506
507     case OPT_frepo:
508       flag_use_repository = value;
509       if (value)
510         flag_implicit_templates = 0;
511       break;
512
513     case OPT_ftabstop_:
514       /* It is documented that we silently ignore silly values.  */
515       if (value >= 1 && value <= 100)
516         cpp_opts->tabstop = value;
517       break;
518
519     case OPT_fexec_charset_:
520       cpp_opts->narrow_charset = arg;
521       break;
522
523     case OPT_fwide_exec_charset_:
524       cpp_opts->wide_charset = arg;
525       break;
526
527     case OPT_finput_charset_:
528       cpp_opts->input_charset = arg;
529       break;
530
531     case OPT_ftemplate_depth_:
532       max_tinst_depth = value;
533       break;
534
535     case OPT_fvisibility_inlines_hidden:
536       visibility_options.inlines_hidden = value;
537       break;
538
539     case OPT_femit_struct_debug_baseonly:
540       set_struct_debug_option (&global_options, loc, "base");
541       break;
542
543     case OPT_femit_struct_debug_reduced:
544       set_struct_debug_option (&global_options, loc,
545                                "dir:ord:sys,dir:gen:any,ind:base");
546       break;
547
548     case OPT_femit_struct_debug_detailed_:
549       set_struct_debug_option (&global_options, loc, arg);
550       break;
551
552     case OPT_fext_numeric_literals:
553       cpp_opts->ext_numeric_literals = value;
554       break;
555
556     case OPT_idirafter:
557       add_path (xstrdup (arg), INC_AFTER, 0, true);
558       break;
559
560     case OPT_imacros:
561     case OPT_include:
562       defer_opt (code, arg);
563       break;
564
565     case OPT_imultilib:
566       imultilib = arg;
567       break;
568
569     case OPT_iprefix:
570       iprefix = arg;
571       break;
572
573     case OPT_iquote:
574       add_path (xstrdup (arg), INC_QUOTE, 0, true);
575       break;
576
577     case OPT_isysroot:
578       sysroot = arg;
579       break;
580
581     case OPT_isystem:
582       add_path (xstrdup (arg), INC_SYSTEM, 0, true);
583       break;
584
585     case OPT_iwithprefix:
586       add_prefixed_path (arg, INC_SYSTEM);
587       break;
588
589     case OPT_iwithprefixbefore:
590       add_prefixed_path (arg, INC_BRACKET);
591       break;
592
593     case OPT_lang_asm:
594       cpp_set_lang (parse_in, CLK_ASM);
595       cpp_opts->dollars_in_ident = false;
596       break;
597
598     case OPT_nostdinc:
599       std_inc = false;
600       break;
601
602     case OPT_nostdinc__:
603       std_cxx_inc = false;
604       break;
605
606     case OPT_o:
607       if (!out_fname)
608         out_fname = arg;
609       else
610         error ("output filename specified twice");
611       break;
612
613     case OPT_print_objc_runtime_info:
614       print_struct_values = 1;
615       break;
616
617     case OPT_remap:
618       cpp_opts->remap = 1;
619       break;
620
621     case OPT_std_c__98:
622     case OPT_std_gnu__98:
623       if (!preprocessing_asm_p)
624         set_std_cxx98 (code == OPT_std_c__98 /* ISO */);
625       break;
626
627     case OPT_std_c__11:
628     case OPT_std_gnu__11:
629       if (!preprocessing_asm_p)
630         set_std_cxx11 (code == OPT_std_c__11 /* ISO */);
631       break;
632
633     case OPT_std_c__14:
634     case OPT_std_gnu__14:
635       if (!preprocessing_asm_p)
636         set_std_cxx14 (code == OPT_std_c__14 /* ISO */);
637       break;
638
639     case OPT_std_c__17:
640     case OPT_std_gnu__17:
641       if (!preprocessing_asm_p)
642         set_std_cxx17 (code == OPT_std_c__17 /* ISO */);
643       break;
644
645     case OPT_std_c__2a:
646     case OPT_std_gnu__2a:
647       if (!preprocessing_asm_p)
648         set_std_cxx2a (code == OPT_std_c__2a /* ISO */);
649       break;
650
651     case OPT_std_c90:
652     case OPT_std_iso9899_199409:
653       if (!preprocessing_asm_p)
654         set_std_c89 (code == OPT_std_iso9899_199409 /* c94 */, true /* ISO */);
655       break;
656
657     case OPT_std_gnu90:
658       if (!preprocessing_asm_p)
659         set_std_c89 (false /* c94 */, false /* ISO */);
660       break;
661
662     case OPT_std_c99:
663       if (!preprocessing_asm_p)
664         set_std_c99 (true /* ISO */);
665       break;
666
667     case OPT_std_gnu99:
668       if (!preprocessing_asm_p)
669         set_std_c99 (false /* ISO */);
670       break;
671
672     case OPT_std_c11:
673       if (!preprocessing_asm_p)
674         set_std_c11 (true /* ISO */);
675       break;
676
677     case OPT_std_gnu11:
678       if (!preprocessing_asm_p)
679         set_std_c11 (false /* ISO */);
680       break;
681
682     case OPT_std_c17:
683       if (!preprocessing_asm_p)
684         set_std_c17 (true /* ISO */);
685       break;
686
687     case OPT_std_gnu17:
688       if (!preprocessing_asm_p)
689         set_std_c17 (false /* ISO */);
690       break;
691
692     case OPT_trigraphs:
693       cpp_opts->trigraphs = 1;
694       break;
695
696     case OPT_traditional_cpp:
697       cpp_opts->traditional = 1;
698       break;
699
700     case OPT_v:
701       verbose = true;
702       break;
703     }
704
705   switch (c_language)
706     {
707     case clk_c:
708       C_handle_option_auto (&global_options, &global_options_set, 
709                             scode, arg, value, 
710                             c_family_lang_mask, kind,
711                             loc, handlers, global_dc);
712       break;
713
714     case clk_objc:
715       ObjC_handle_option_auto (&global_options, &global_options_set,
716                                scode, arg, value, 
717                                c_family_lang_mask, kind,
718                                loc, handlers, global_dc);
719       break;
720
721     case clk_cxx:
722       CXX_handle_option_auto (&global_options, &global_options_set,
723                               scode, arg, value,
724                               c_family_lang_mask, kind,
725                               loc, handlers, global_dc);
726       break;
727
728     case clk_objcxx:
729       ObjCXX_handle_option_auto (&global_options, &global_options_set,
730                                  scode, arg, value,
731                                  c_family_lang_mask, kind,
732                                  loc, handlers, global_dc);
733       break;
734
735     default:
736       gcc_unreachable ();
737     }
738
739   cpp_handle_option_auto (&global_options, scode, cpp_opts);
740   return result;
741 }
742
743 /* Default implementation of TARGET_HANDLE_C_OPTION.  */
744
745 bool
746 default_handle_c_option (size_t code ATTRIBUTE_UNUSED,
747                          const char *arg ATTRIBUTE_UNUSED,
748                          int value ATTRIBUTE_UNUSED)
749 {
750   return false;
751 }
752
753 /* Post-switch processing.  */
754 bool
755 c_common_post_options (const char **pfilename)
756 {
757   struct cpp_callbacks *cb;
758
759   /* Canonicalize the input and output filenames.  */
760   if (in_fnames == NULL)
761     {
762       in_fnames = XNEWVEC (const char *, 1);
763       in_fnames[0] = "";
764     }
765   else if (strcmp (in_fnames[0], "-") == 0)
766     {
767       if (pch_file)
768         error ("cannot use %<-%> as input filename for a precompiled header");
769
770       in_fnames[0] = "";
771     }
772
773   if (out_fname == NULL || !strcmp (out_fname, "-"))
774     out_fname = "";
775
776   if (cpp_opts->deps.style == DEPS_NONE)
777     check_deps_environment_vars ();
778
779   handle_deferred_opts ();
780
781   sanitize_cpp_opts ();
782
783   register_include_chains (parse_in, sysroot, iprefix, imultilib,
784                            std_inc, std_cxx_inc && c_dialect_cxx (), verbose);
785
786 #ifdef C_COMMON_OVERRIDE_OPTIONS
787   /* Some machines may reject certain combinations of C
788      language-specific options.  */
789   C_COMMON_OVERRIDE_OPTIONS;
790 #endif
791
792   /* Excess precision other than "fast" requires front-end
793      support.  */
794   if (c_dialect_cxx ())
795     {
796       if (flag_excess_precision_cmdline == EXCESS_PRECISION_STANDARD)
797         sorry ("-fexcess-precision=standard for C++");
798       flag_excess_precision_cmdline = EXCESS_PRECISION_FAST;
799     }
800   else if (flag_excess_precision_cmdline == EXCESS_PRECISION_DEFAULT)
801     flag_excess_precision_cmdline = (flag_iso
802                                      ? EXCESS_PRECISION_STANDARD
803                                      : EXCESS_PRECISION_FAST);
804
805   /* ISO C restricts floating-point expression contraction to within
806      source-language expressions (-ffp-contract=on, currently an alias
807      for -ffp-contract=off).  */
808   if (flag_iso
809       && !c_dialect_cxx ()
810       && (global_options_set.x_flag_fp_contract_mode
811           == (enum fp_contract_mode) 0)
812       && flag_unsafe_math_optimizations == 0)
813     flag_fp_contract_mode = FP_CONTRACT_OFF;
814
815   /* If we are compiling C, and we are outside of a standards mode,
816      we can permit the new values from ISO/IEC TS 18661-3 for
817      FLT_EVAL_METHOD.  Otherwise, we must restrict the possible values to
818      the set specified in ISO C99/C11.  */
819   if (!flag_iso
820       && !c_dialect_cxx ()
821       && (global_options_set.x_flag_permitted_flt_eval_methods
822           == PERMITTED_FLT_EVAL_METHODS_DEFAULT))
823     flag_permitted_flt_eval_methods = PERMITTED_FLT_EVAL_METHODS_TS_18661;
824   else
825     flag_permitted_flt_eval_methods = PERMITTED_FLT_EVAL_METHODS_C11;
826
827   /* By default we use C99 inline semantics in GNU99 or C99 mode.  C99
828      inline semantics are not supported in GNU89 or C89 mode.  */
829   if (flag_gnu89_inline == -1)
830     flag_gnu89_inline = !flag_isoc99;
831   else if (!flag_gnu89_inline && !flag_isoc99)
832     error ("-fno-gnu89-inline is only supported in GNU99 or C99 mode");
833
834   /* Default to ObjC sjlj exception handling if NeXT runtime.  */
835   if (flag_objc_sjlj_exceptions < 0)
836     flag_objc_sjlj_exceptions = flag_next_runtime;
837   if (flag_objc_exceptions && !flag_objc_sjlj_exceptions)
838     flag_exceptions = 1;
839
840   /* If -ffreestanding, -fno-hosted or -fno-builtin then disable
841      pattern recognition.  */
842   if (!global_options_set.x_flag_tree_loop_distribute_patterns
843       && flag_no_builtin)
844     flag_tree_loop_distribute_patterns = 0;
845
846   /* -Woverlength-strings is off by default, but is enabled by -Wpedantic.
847      It is never enabled in C++, as the minimum limit is not normative
848      in that standard.  */
849   if (c_dialect_cxx ())
850     warn_overlength_strings = 0;
851
852   /* Wmain is enabled by default in C++ but not in C.  */
853   /* Wmain is disabled by default for -ffreestanding (!flag_hosted),
854      even if -Wall or -Wpedantic was given (warn_main will be 2 if set
855      by -Wall, 1 if set by -Wmain).  */
856   if (warn_main == -1)
857     warn_main = (c_dialect_cxx () && flag_hosted) ? 1 : 0;
858   else if (warn_main == 2)
859     warn_main = flag_hosted ? 1 : 0;
860
861   /* In C, -Wall and -Wc++-compat enable -Wenum-compare; if it has not
862      yet been set, it is disabled by default.  In C++, it is enabled
863      by default.  */
864   if (warn_enum_compare == -1)
865     warn_enum_compare = c_dialect_cxx () ? 1 : 0;
866
867   /* -Wpacked-bitfield-compat is on by default for the C languages.  The
868      warning is issued in stor-layout.c which is not part of the front-end so
869      we need to selectively turn it on here.  */
870   if (warn_packed_bitfield_compat == -1)
871     warn_packed_bitfield_compat = 1;
872
873   /* Special format checking options don't work without -Wformat; warn if
874      they are used.  */
875   if (!warn_format)
876     {
877       warning (OPT_Wformat_y2k,
878                "-Wformat-y2k ignored without -Wformat");
879       warning (OPT_Wformat_extra_args,
880                "-Wformat-extra-args ignored without -Wformat");
881       warning (OPT_Wformat_zero_length,
882                "-Wformat-zero-length ignored without -Wformat");
883       warning (OPT_Wformat_nonliteral,
884                "-Wformat-nonliteral ignored without -Wformat");
885       warning (OPT_Wformat_contains_nul,
886                "-Wformat-contains-nul ignored without -Wformat");
887       warning (OPT_Wformat_security,
888                "-Wformat-security ignored without -Wformat");
889     }
890
891   /* -Wimplicit-function-declaration is enabled by default for C99.  */
892   if (warn_implicit_function_declaration == -1)
893     warn_implicit_function_declaration = flag_isoc99;
894
895   /* -Wimplicit-int is enabled by default for C99.  */
896   if (warn_implicit_int == -1)
897     warn_implicit_int = flag_isoc99;
898
899   /* -Wshift-overflow is enabled by default in C99 and C++11 modes.  */
900   if (warn_shift_overflow == -1)
901     warn_shift_overflow = cxx_dialect >= cxx11 || flag_isoc99;
902
903   /* -Wshift-negative-value is enabled by -Wextra in C99 and C++11 modes.  */
904   if (warn_shift_negative_value == -1)
905     warn_shift_negative_value = (extra_warnings
906                                  && (cxx_dialect >= cxx11 || flag_isoc99));
907
908   /* -Wregister is enabled by default in C++17.  */
909   if (!global_options_set.x_warn_register)
910     warn_register = cxx_dialect >= cxx17;
911
912   /* Declone C++ 'structors if -Os.  */
913   if (flag_declone_ctor_dtor == -1)
914     flag_declone_ctor_dtor = optimize_size;
915
916   if (flag_abi_compat_version == 1)
917     {
918       warning (0, "%<-fabi-compat-version=1%> is not supported, using =2");
919       flag_abi_compat_version = 2;
920     }
921
922   /* Change flag_abi_version to be the actual current ABI level, for the
923      benefit of c_cpp_builtins, and to make comparison simpler.  */
924   const int latest_abi_version = 13;
925   /* Generate compatibility aliases for ABI v11 (7.1) by default.  */
926   const int abi_compat_default = 11;
927
928 #define clamp(X) if (X == 0 || X > latest_abi_version) X = latest_abi_version
929   clamp (flag_abi_version);
930   clamp (warn_abi_version);
931   clamp (flag_abi_compat_version);
932 #undef clamp
933
934   /* Default -Wabi= or -fabi-compat-version= from each other.  */
935   if (warn_abi_version == -1 && flag_abi_compat_version != -1)
936     warn_abi_version = flag_abi_compat_version;
937   else if (flag_abi_compat_version == -1 && warn_abi_version != -1)
938     flag_abi_compat_version = warn_abi_version;
939   else if (warn_abi_version == -1 && flag_abi_compat_version == -1)
940     {
941       warn_abi_version = latest_abi_version;
942       if (flag_abi_version == latest_abi_version)
943         {
944           if (warning (OPT_Wabi, "-Wabi won't warn about anything"))
945             {
946               inform (input_location, "-Wabi warns about differences "
947                       "from the most up-to-date ABI, which is also used "
948                       "by default");
949               inform (input_location, "use e.g. -Wabi=11 to warn about "
950                       "changes from GCC 7");
951             }
952           flag_abi_compat_version = abi_compat_default;
953         }
954       else
955         flag_abi_compat_version = latest_abi_version;
956     }
957
958   /* By default, enable the new inheriting constructor semantics along with ABI
959      11.  New and old should coexist fine, but it is a change in what
960      artificial symbols are generated.  */
961   if (!global_options_set.x_flag_new_inheriting_ctors)
962     flag_new_inheriting_ctors = abi_version_at_least (11);
963
964   /* For GCC 7, only enable DR150 resolution by default if -std=c++17.  */
965   if (!global_options_set.x_flag_new_ttp)
966     flag_new_ttp = (cxx_dialect >= cxx17);
967
968   if (cxx_dialect >= cxx11)
969     {
970       /* If we're allowing C++0x constructs, don't warn about C++98
971          identifiers which are keywords in C++0x.  */
972       warn_cxx11_compat = 0;
973       cpp_opts->cpp_warn_cxx11_compat = 0;
974
975       if (warn_narrowing == -1)
976         warn_narrowing = 1;
977
978       /* Unless -f{,no-}ext-numeric-literals has been used explicitly,
979          for -std=c++{11,14,17,2a} default to -fno-ext-numeric-literals.  */
980       if (flag_iso && !global_options_set.x_flag_ext_numeric_literals)
981         cpp_opts->ext_numeric_literals = 0;
982     }
983   else if (warn_narrowing == -1)
984     warn_narrowing = 0;
985
986   /* C++17 has stricter evaluation order requirements; let's use some of them
987      for earlier C++ as well, so chaining works as expected.  */
988   if (c_dialect_cxx ()
989       && flag_strong_eval_order == -1)
990     flag_strong_eval_order = (cxx_dialect >= cxx17 ? 2 : 1);
991
992   /* Global sized deallocation is new in C++14.  */
993   if (flag_sized_deallocation == -1)
994     flag_sized_deallocation = (cxx_dialect >= cxx14);
995
996   if (flag_extern_tls_init)
997     {
998       if (!TARGET_SUPPORTS_ALIASES || !SUPPORTS_WEAK)
999         {
1000           /* Lazy TLS initialization for a variable in another TU requires
1001              alias and weak reference support.  */
1002           if (flag_extern_tls_init > 0)
1003             sorry ("external TLS initialization functions not supported "
1004                    "on this target");
1005
1006           flag_extern_tls_init = 0;
1007         }
1008       else
1009         flag_extern_tls_init = 1;
1010     }
1011
1012   if (warn_return_type == -1)
1013     warn_return_type = c_dialect_cxx ();
1014
1015   if (num_in_fnames > 1)
1016     error ("too many filenames given.  Type %s --help for usage",
1017            progname);
1018
1019   if (flag_preprocess_only)
1020     {
1021       /* Open the output now.  We must do so even if flag_no_output is
1022          on, because there may be other output than from the actual
1023          preprocessing (e.g. from -dM).  */
1024       if (out_fname[0] == '\0')
1025         out_stream = stdout;
1026       else
1027         out_stream = fopen (out_fname, "w");
1028
1029       if (out_stream == NULL)
1030         {
1031           fatal_error (input_location, "opening output file %s: %m", out_fname);
1032           return false;
1033         }
1034
1035       init_pp_output (out_stream);
1036     }
1037   else
1038     {
1039       init_c_lex ();
1040
1041       /* When writing a PCH file, avoid reading some other PCH file,
1042          because the default address space slot then can't be used
1043          for the output PCH file.  */
1044       if (pch_file)
1045         {
1046           c_common_no_more_pch ();
1047           /* Only -g0 and -gdwarf* are supported with PCH, for other
1048              debug formats we warn here and refuse to load any PCH files.  */
1049           if (write_symbols != NO_DEBUG && write_symbols != DWARF2_DEBUG)
1050             warning (OPT_Wdeprecated,
1051                      "the \"%s\" debug format cannot be used with "
1052                      "pre-compiled headers", debug_type_names[write_symbols]);
1053         }
1054       else if (write_symbols != NO_DEBUG && write_symbols != DWARF2_DEBUG)
1055         c_common_no_more_pch ();
1056
1057       /* Yuk.  WTF is this?  I do know ObjC relies on it somewhere.  */
1058       input_location = UNKNOWN_LOCATION;
1059     }
1060
1061   cb = cpp_get_callbacks (parse_in);
1062   cb->file_change = cb_file_change;
1063   cb->dir_change = cb_dir_change;
1064   cpp_post_options (parse_in);
1065   init_global_opts_from_cpp (&global_options, cpp_get_options (parse_in));
1066
1067   input_location = UNKNOWN_LOCATION;
1068
1069   *pfilename = this_input_filename
1070     = cpp_read_main_file (parse_in, in_fnames[0]);
1071   /* Don't do any compilation or preprocessing if there is no input file.  */
1072   if (this_input_filename == NULL)
1073     {
1074       errorcount++;
1075       return false;
1076     }
1077
1078   if (flag_working_directory
1079       && flag_preprocess_only && !flag_no_line_commands)
1080     pp_dir_change (parse_in, get_src_pwd ());
1081
1082   /* Disable LTO output when outputting a precompiled header.  */
1083   if (pch_file && flag_lto)
1084     {
1085       flag_lto = 0;
1086       flag_generate_lto = 0;
1087     }
1088
1089   return flag_preprocess_only;
1090 }
1091
1092 /* Front end initialization common to C, ObjC and C++.  */
1093 bool
1094 c_common_init (void)
1095 {
1096   /* Set up preprocessor arithmetic.  Must be done after call to
1097      c_common_nodes_and_builtins for type nodes to be good.  */
1098   cpp_opts->precision = TYPE_PRECISION (intmax_type_node);
1099   cpp_opts->char_precision = TYPE_PRECISION (char_type_node);
1100   cpp_opts->int_precision = TYPE_PRECISION (integer_type_node);
1101   cpp_opts->wchar_precision = TYPE_PRECISION (wchar_type_node);
1102   cpp_opts->unsigned_wchar = TYPE_UNSIGNED (wchar_type_node);
1103   cpp_opts->bytes_big_endian = BYTES_BIG_ENDIAN;
1104
1105   /* This can't happen until after wchar_precision and bytes_big_endian
1106      are known.  */
1107   cpp_init_iconv (parse_in);
1108
1109   if (version_flag)
1110     {
1111       int i;
1112       fputs ("Compiler executable checksum: ", stderr);
1113       for (i = 0; i < 16; i++)
1114         fprintf (stderr, "%02x", executable_checksum[i]);
1115       putc ('\n', stderr);
1116     }
1117
1118   /* Has to wait until now so that cpplib has its hash table.  */
1119   init_pragma ();
1120
1121   if (flag_preprocess_only)
1122     {
1123       c_finish_options ();
1124       preprocess_file (parse_in);
1125       return false;
1126     }
1127
1128   return true;
1129 }
1130
1131 /* Initialize the integrated preprocessor after debug output has been
1132    initialized; loop over each input file.  */
1133 void
1134 c_common_parse_file (void)
1135 {
1136   unsigned int i;
1137
1138   i = 0;
1139   for (;;)
1140     {
1141       c_finish_options ();
1142       /* Open the dump file to use for the original dump output
1143          here, to be used during parsing for the current file.  */
1144       original_dump_file = dump_begin (TDI_original, &original_dump_flags);
1145       pch_init ();
1146       push_file_scope ();
1147       c_parse_file ();
1148       pop_file_scope ();
1149       /* And end the main input file, if the debug writer wants it  */
1150       if (debug_hooks->start_end_main_source_file)
1151         (*debug_hooks->end_source_file) (0);
1152       if (++i >= num_in_fnames)
1153         break;
1154       cpp_undef_all (parse_in);
1155       cpp_clear_file_cache (parse_in);
1156       this_input_filename
1157         = cpp_read_main_file (parse_in, in_fnames[i]);
1158       if (original_dump_file)
1159         {
1160           dump_end (TDI_original, original_dump_file);
1161           original_dump_file = NULL;
1162         }
1163       /* If an input file is missing, abandon further compilation.
1164          cpplib has issued a diagnostic.  */
1165       if (!this_input_filename)
1166         break;
1167     }
1168
1169   c_parse_final_cleanups ();
1170 }
1171
1172 /* Returns the appropriate dump file for PHASE to dump with FLAGS.  */
1173
1174 FILE *
1175 get_dump_info (int phase, dump_flags_t *flags)
1176 {
1177   gcc_assert (phase == TDI_original);
1178
1179   *flags = original_dump_flags;
1180   return original_dump_file;
1181 }
1182
1183 /* Common finish hook for the C, ObjC and C++ front ends.  */
1184 void
1185 c_common_finish (void)
1186 {
1187   FILE *deps_stream = NULL;
1188
1189   /* Note that we write the dependencies even if there are errors. This is
1190      useful for handling outdated generated headers that now trigger errors
1191      (for example, with #error) which would be resolved by re-generating
1192      them. In a sense, this complements -MG.  */
1193   if (cpp_opts->deps.style != DEPS_NONE)
1194     {
1195       /* If -M or -MM was seen without -MF, default output to the
1196          output stream.  */
1197       if (!deps_file)
1198         deps_stream = out_stream;
1199       else if (deps_file[0] == '-' && deps_file[1] == '\0')
1200         deps_stream = stdout;
1201       else
1202         {
1203           deps_stream = fopen (deps_file, deps_append ? "a": "w");
1204           if (!deps_stream)
1205             fatal_error (input_location, "opening dependency file %s: %m",
1206                          deps_file);
1207         }
1208     }
1209
1210   /* For performance, avoid tearing down cpplib's internal structures
1211      with cpp_destroy ().  */
1212   cpp_finish (parse_in, deps_stream);
1213
1214   if (deps_stream && deps_stream != out_stream && deps_stream != stdout
1215       && (ferror (deps_stream) || fclose (deps_stream)))
1216     fatal_error (input_location, "closing dependency file %s: %m", deps_file);
1217
1218   if (out_stream && (ferror (out_stream) || fclose (out_stream)))
1219     fatal_error (input_location, "when writing output to %s: %m", out_fname);
1220 }
1221
1222 /* Either of two environment variables can specify output of
1223    dependencies.  Their value is either "OUTPUT_FILE" or "OUTPUT_FILE
1224    DEPS_TARGET", where OUTPUT_FILE is the file to write deps info to
1225    and DEPS_TARGET is the target to mention in the deps.  They also
1226    result in dependency information being appended to the output file
1227    rather than overwriting it, and like Sun's compiler
1228    SUNPRO_DEPENDENCIES suppresses the dependency on the main file.  */
1229 static void
1230 check_deps_environment_vars (void)
1231 {
1232   char *spec;
1233
1234   spec = getenv ("DEPENDENCIES_OUTPUT");
1235   if (spec)
1236     cpp_opts->deps.style = DEPS_USER;
1237   else
1238     {
1239       spec = getenv ("SUNPRO_DEPENDENCIES");
1240       if (spec)
1241         {
1242           cpp_opts->deps.style = DEPS_SYSTEM;
1243           cpp_opts->deps.ignore_main_file = true;
1244         }
1245     }
1246
1247   if (spec)
1248     {
1249       /* Find the space before the DEPS_TARGET, if there is one.  */
1250       char *s = strchr (spec, ' ');
1251       if (s)
1252         {
1253           /* Let the caller perform MAKE quoting.  */
1254           defer_opt (OPT_MT, s + 1);
1255           *s = '\0';
1256         }
1257
1258       /* Command line -MF overrides environment variables and default.  */
1259       if (!deps_file)
1260         deps_file = spec;
1261
1262       deps_append = 1;
1263       deps_seen = true;
1264     }
1265 }
1266
1267 /* Handle deferred command line switches.  */
1268 static void
1269 handle_deferred_opts (void)
1270 {
1271   size_t i;
1272   struct deps *deps;
1273
1274   /* Avoid allocating the deps buffer if we don't need it.
1275      (This flag may be true without there having been -MT or -MQ
1276      options, but we'll still need the deps buffer.)  */
1277   if (!deps_seen)
1278     return;
1279
1280   deps = cpp_get_deps (parse_in);
1281
1282   for (i = 0; i < deferred_count; i++)
1283     {
1284       struct deferred_opt *opt = &deferred_opts[i];
1285
1286       if (opt->code == OPT_MT || opt->code == OPT_MQ)
1287         deps_add_target (deps, opt->arg, opt->code == OPT_MQ);
1288     }
1289 }
1290
1291 /* These settings are appropriate for GCC, but not necessarily so for
1292    cpplib as a library.  */
1293 static void
1294 sanitize_cpp_opts (void)
1295 {
1296   /* If we don't know what style of dependencies to output, complain
1297      if any other dependency switches have been given.  */
1298   if (deps_seen && cpp_opts->deps.style == DEPS_NONE)
1299     error ("to generate dependencies you must specify either -M or -MM");
1300
1301   /* -dM and dependencies suppress normal output; do it here so that
1302      the last -d[MDN] switch overrides earlier ones.  */
1303   if (flag_dump_macros == 'M')
1304     flag_no_output = 1;
1305
1306   /* By default, -fdirectives-only implies -dD.  This allows subsequent phases
1307      to perform proper macro expansion.  */
1308   if (cpp_opts->directives_only && !cpp_opts->preprocessed && !flag_dump_macros)
1309     flag_dump_macros = 'D';
1310
1311   /* Disable -dD, -dN and -dI if normal output is suppressed.  Allow
1312      -dM since at least glibc relies on -M -dM to work.  */
1313   /* Also, flag_no_output implies flag_no_line_commands, always.  */
1314   if (flag_no_output)
1315     {
1316       if (flag_dump_macros != 'M')
1317         flag_dump_macros = 0;
1318       flag_dump_includes = 0;
1319       flag_no_line_commands = 1;
1320     }
1321   else if (cpp_opts->deps.missing_files)
1322     error ("-MG may only be used with -M or -MM");
1323
1324   cpp_opts->unsigned_char = !flag_signed_char;
1325   cpp_opts->stdc_0_in_system_headers = STDC_0_IN_SYSTEM_HEADERS;
1326
1327   /* Wlong-long is disabled by default. It is enabled by:
1328       [-Wpedantic | -Wtraditional] -std=[gnu|c]++98 ; or
1329       [-Wpedantic | -Wtraditional] -std=non-c99 
1330
1331       Either -Wlong-long or -Wno-long-long override any other settings.
1332       ??? These conditions should be handled in c.opt.  */
1333   if (warn_long_long == -1)
1334     {
1335       warn_long_long = ((pedantic || warn_traditional)
1336                         && (c_dialect_cxx () ? cxx_dialect == cxx98 : !flag_isoc99));
1337       cpp_opts->cpp_warn_long_long = warn_long_long;
1338     }
1339
1340   /* If we're generating preprocessor output, emit current directory
1341      if explicitly requested or if debugging information is enabled.
1342      ??? Maybe we should only do it for debugging formats that
1343      actually output the current directory?  */
1344   if (flag_working_directory == -1)
1345     flag_working_directory = (debug_info_level != DINFO_LEVEL_NONE);
1346
1347   if (warn_implicit_fallthrough < 5)
1348     cpp_opts->cpp_warn_implicit_fallthrough = warn_implicit_fallthrough;
1349   else
1350     cpp_opts->cpp_warn_implicit_fallthrough = 0;
1351
1352   if (cpp_opts->directives_only)
1353     {
1354       if (cpp_warn_unused_macros)
1355         error ("-fdirectives-only is incompatible with -Wunused_macros");
1356       if (cpp_opts->traditional)
1357         error ("-fdirectives-only is incompatible with -traditional");
1358     }
1359 }
1360
1361 /* Add include path with a prefix at the front of its name.  */
1362 static void
1363 add_prefixed_path (const char *suffix, incpath_kind chain)
1364 {
1365   char *path;
1366   const char *prefix;
1367   size_t prefix_len, suffix_len;
1368
1369   suffix_len = strlen (suffix);
1370   prefix     = iprefix ? iprefix : cpp_GCC_INCLUDE_DIR;
1371   prefix_len = iprefix ? strlen (iprefix) : cpp_GCC_INCLUDE_DIR_len;
1372
1373   path = (char *) xmalloc (prefix_len + suffix_len + 1);
1374   memcpy (path, prefix, prefix_len);
1375   memcpy (path + prefix_len, suffix, suffix_len);
1376   path[prefix_len + suffix_len] = '\0';
1377
1378   add_path (path, chain, 0, false);
1379 }
1380
1381 /* Handle -D, -U, -A, -imacros, and the first -include.  */
1382 static void
1383 c_finish_options (void)
1384 {
1385   if (!cpp_opts->preprocessed)
1386     {
1387       size_t i;
1388
1389       cb_file_change (parse_in,
1390                       linemap_check_ordinary (linemap_add (line_table,
1391                                                            LC_RENAME, 0,
1392                                                            _("<built-in>"),
1393                                                            0)));
1394       /* Make sure all of the builtins about to be declared have
1395          BUILTINS_LOCATION has their source_location.  */
1396       source_location builtins_loc = BUILTINS_LOCATION;
1397       cpp_force_token_locations (parse_in, &builtins_loc);
1398
1399       cpp_init_builtins (parse_in, flag_hosted);
1400       c_cpp_builtins (parse_in);
1401
1402       cpp_stop_forcing_token_locations (parse_in);
1403
1404       /* We're about to send user input to cpplib, so make it warn for
1405          things that we previously (when we sent it internal definitions)
1406          told it to not warn.
1407
1408          C99 permits implementation-defined characters in identifiers.
1409          The documented meaning of -std= is to turn off extensions that
1410          conflict with the specified standard, and since a strictly
1411          conforming program cannot contain a '$', we do not condition
1412          their acceptance on the -std= setting.  */
1413       cpp_opts->warn_dollars = (cpp_opts->cpp_pedantic && !cpp_opts->c99);
1414
1415       cb_file_change (parse_in,
1416                       linemap_check_ordinary (linemap_add (line_table, LC_RENAME, 0,
1417                                                            _("<command-line>"), 0)));
1418
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       /* Start the main input file, if the debug writer wants it. */
1437       if (debug_hooks->start_end_main_source_file
1438           && !flag_preprocess_only)
1439         (*debug_hooks->start_source_file) (0, this_input_filename);
1440
1441       /* Handle -imacros after -D and -U.  */
1442       for (i = 0; i < deferred_count; i++)
1443         {
1444           struct deferred_opt *opt = &deferred_opts[i];
1445
1446           if (opt->code == OPT_imacros
1447               && cpp_push_include (parse_in, opt->arg))
1448             {
1449               /* Disable push_command_line_include callback for now.  */
1450               include_cursor = deferred_count + 1;
1451               cpp_scan_nooutput (parse_in);
1452             }
1453         }
1454     }
1455   else
1456     {
1457       if (cpp_opts->directives_only)
1458         cpp_init_special_builtins (parse_in);
1459
1460       /* Start the main input file, if the debug writer wants it. */
1461       if (debug_hooks->start_end_main_source_file
1462           && !flag_preprocess_only)
1463         (*debug_hooks->start_source_file) (0, this_input_filename);
1464     }
1465
1466   include_cursor = 0;
1467   push_command_line_include ();
1468 }
1469
1470 /* Give CPP the next file given by -include, if any.  */
1471 static void
1472 push_command_line_include (void)
1473 {
1474   /* This can happen if disabled by -imacros for example.
1475      Punt so that we don't set "<command-line>" as the filename for
1476      the header.  */
1477   if (include_cursor > deferred_count)
1478     return;
1479
1480   if (!done_preinclude)
1481     {
1482       done_preinclude = true;
1483       if (flag_hosted && std_inc && !cpp_opts->preprocessed)
1484         {
1485           const char *preinc = targetcm.c_preinclude ();
1486           if (preinc && cpp_push_default_include (parse_in, preinc))
1487             return;
1488         }
1489     }
1490
1491   pch_cpp_save_state ();
1492
1493   while (include_cursor < deferred_count)
1494     {
1495       struct deferred_opt *opt = &deferred_opts[include_cursor++];
1496
1497       if (!cpp_opts->preprocessed && opt->code == OPT_include
1498           && cpp_push_include (parse_in, opt->arg))
1499         return;
1500     }
1501
1502   if (include_cursor == deferred_count)
1503     {
1504       include_cursor++;
1505       /* -Wunused-macros should only warn about macros defined hereafter.  */
1506       cpp_opts->warn_unused_macros = cpp_warn_unused_macros;
1507       /* Restore the line map from <command line>.  */
1508       if (!cpp_opts->preprocessed)
1509         cpp_change_file (parse_in, LC_RENAME, this_input_filename);
1510
1511       /* Set this here so the client can change the option if it wishes,
1512          and after stacking the main file so we don't trace the main file.  */
1513       line_table->trace_includes = cpp_opts->print_include_names;
1514     }
1515 }
1516
1517 /* File change callback.  Has to handle -include files.  */
1518 static void
1519 cb_file_change (cpp_reader * ARG_UNUSED (pfile),
1520                 const line_map_ordinary *new_map)
1521 {
1522   if (flag_preprocess_only)
1523     pp_file_change (new_map);
1524   else
1525     fe_file_change (new_map);
1526
1527   if (new_map 
1528       && (new_map->reason == LC_ENTER || new_map->reason == LC_RENAME))
1529     {
1530       /* Signal to plugins that a file is included.  This could happen
1531          several times with the same file path, e.g. because of
1532          several '#include' or '#line' directives...  */
1533       invoke_plugin_callbacks 
1534         (PLUGIN_INCLUDE_FILE,
1535          const_cast<char*> (ORDINARY_MAP_FILE_NAME (new_map)));
1536     }
1537
1538   if (new_map == 0 || (new_map->reason == LC_LEAVE && MAIN_FILE_P (new_map)))
1539     {
1540       pch_cpp_save_state ();
1541       push_command_line_include ();
1542     }
1543 }
1544
1545 void
1546 cb_dir_change (cpp_reader * ARG_UNUSED (pfile), const char *dir)
1547 {
1548   if (!set_src_pwd (dir))
1549     warning (0, "too late for # directive to set debug directory");
1550 }
1551
1552 /* Set the C 89 standard (with 1994 amendments if C94, without GNU
1553    extensions if ISO).  There is no concept of gnu94.  */
1554 static void
1555 set_std_c89 (int c94, int iso)
1556 {
1557   cpp_set_lang (parse_in, c94 ? CLK_STDC94: iso ? CLK_STDC89: CLK_GNUC89);
1558   flag_iso = iso;
1559   flag_no_asm = iso;
1560   flag_no_gnu_keywords = iso;
1561   flag_no_nonansi_builtin = iso;
1562   flag_isoc94 = c94;
1563   flag_isoc99 = 0;
1564   flag_isoc11 = 0;
1565   lang_hooks.name = "GNU C89";
1566 }
1567
1568 /* Set the C 99 standard (without GNU extensions if ISO).  */
1569 static void
1570 set_std_c99 (int iso)
1571 {
1572   cpp_set_lang (parse_in, iso ? CLK_STDC99: CLK_GNUC99);
1573   flag_no_asm = iso;
1574   flag_no_nonansi_builtin = iso;
1575   flag_iso = iso;
1576   flag_isoc11 = 0;
1577   flag_isoc99 = 1;
1578   flag_isoc94 = 1;
1579   lang_hooks.name = "GNU C99";
1580 }
1581
1582 /* Set the C 11 standard (without GNU extensions if ISO).  */
1583 static void
1584 set_std_c11 (int iso)
1585 {
1586   cpp_set_lang (parse_in, iso ? CLK_STDC11: CLK_GNUC11);
1587   flag_no_asm = iso;
1588   flag_no_nonansi_builtin = iso;
1589   flag_iso = iso;
1590   flag_isoc11 = 1;
1591   flag_isoc99 = 1;
1592   flag_isoc94 = 1;
1593   lang_hooks.name = "GNU C11";
1594 }
1595
1596 /* Set the C 17 standard (without GNU extensions if ISO).  */
1597 static void
1598 set_std_c17 (int iso)
1599 {
1600   cpp_set_lang (parse_in, iso ? CLK_STDC17: CLK_GNUC17);
1601   flag_no_asm = iso;
1602   flag_no_nonansi_builtin = iso;
1603   flag_iso = iso;
1604   flag_isoc11 = 1;
1605   flag_isoc99 = 1;
1606   flag_isoc94 = 1;
1607   lang_hooks.name = "GNU C17";
1608 }
1609
1610
1611 /* Set the C++ 98 standard (without GNU extensions if ISO).  */
1612 static void
1613 set_std_cxx98 (int iso)
1614 {
1615   cpp_set_lang (parse_in, iso ? CLK_CXX98: CLK_GNUCXX);
1616   flag_no_gnu_keywords = iso;
1617   flag_no_nonansi_builtin = iso;
1618   flag_iso = iso;
1619   flag_isoc94 = 0;
1620   flag_isoc99 = 0;
1621   cxx_dialect = cxx98;
1622   lang_hooks.name = "GNU C++98";
1623 }
1624
1625 /* Set the C++ 2011 standard (without GNU extensions if ISO).  */
1626 static void
1627 set_std_cxx11 (int iso)
1628 {
1629   cpp_set_lang (parse_in, iso ? CLK_CXX11: CLK_GNUCXX11);
1630   flag_no_gnu_keywords = iso;
1631   flag_no_nonansi_builtin = iso;
1632   flag_iso = iso;
1633   /* C++11 includes the C99 standard library.  */
1634   flag_isoc94 = 1;
1635   flag_isoc99 = 1;
1636   cxx_dialect = cxx11;
1637   lang_hooks.name = "GNU C++11";
1638 }
1639
1640 /* Set the C++ 2014 standard (without GNU extensions if ISO).  */
1641 static void
1642 set_std_cxx14 (int iso)
1643 {
1644   cpp_set_lang (parse_in, iso ? CLK_CXX14: CLK_GNUCXX14);
1645   flag_no_gnu_keywords = iso;
1646   flag_no_nonansi_builtin = iso;
1647   flag_iso = iso;
1648   /* C++14 includes the C99 standard library.  */
1649   flag_isoc94 = 1;
1650   flag_isoc99 = 1;
1651   cxx_dialect = cxx14;
1652   lang_hooks.name = "GNU C++14";
1653 }
1654
1655 /* Set the C++ 2017 standard (without GNU extensions if ISO).  */
1656 static void
1657 set_std_cxx17 (int iso)
1658 {
1659   cpp_set_lang (parse_in, iso ? CLK_CXX17: CLK_GNUCXX17);
1660   flag_no_gnu_keywords = iso;
1661   flag_no_nonansi_builtin = iso;
1662   flag_iso = iso;
1663   /* C++17 includes the C11 standard library.  */
1664   flag_isoc94 = 1;
1665   flag_isoc99 = 1;
1666   flag_isoc11 = 1;
1667   cxx_dialect = cxx17;
1668   lang_hooks.name = "GNU C++17";
1669 }
1670
1671 /* Set the C++ 202a draft standard (without GNU extensions if ISO).  */
1672 static void
1673 set_std_cxx2a (int iso)
1674 {
1675   cpp_set_lang (parse_in, iso ? CLK_CXX2A: CLK_GNUCXX2A);
1676   flag_no_gnu_keywords = iso;
1677   flag_no_nonansi_builtin = iso;
1678   flag_iso = iso;
1679   /* C++17 includes the C11 standard library.  */
1680   flag_isoc94 = 1;
1681   flag_isoc99 = 1;
1682   flag_isoc11 = 1;
1683   cxx_dialect = cxx2a;
1684   lang_hooks.name = "GNU C++17"; /* Pretend C++17 until standardization.  */
1685 }
1686
1687 /* Args to -d specify what to dump.  Silently ignore
1688    unrecognized options; they may be aimed at toplev.c.  */
1689 static void
1690 handle_OPT_d (const char *arg)
1691 {
1692   char c;
1693
1694   while ((c = *arg++) != '\0')
1695     switch (c)
1696       {
1697       case 'M':                 /* Dump macros only.  */
1698       case 'N':                 /* Dump names.  */
1699       case 'D':                 /* Dump definitions.  */
1700       case 'U':                 /* Dump used macros.  */
1701         flag_dump_macros = c;
1702         break;
1703
1704       case 'I':
1705         flag_dump_includes = 1;
1706         break;
1707       }
1708 }