c-opts.c revision 132811
1117395Skan/* C/ObjC/C++ command line option handling.
2132718Skan   Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
3117395Skan   Contributed by Neil Booth.
4117395Skan
5117395SkanThis file is part of GCC.
6117395Skan
7117395SkanGCC is free software; you can redistribute it and/or modify it under
8117395Skanthe terms of the GNU General Public License as published by the Free
9117395SkanSoftware Foundation; either version 2, or (at your option) any later
10117395Skanversion.
11117395Skan
12117395SkanGCC is distributed in the hope that it will be useful, but WITHOUT ANY
13117395SkanWARRANTY; without even the implied warranty of MERCHANTABILITY or
14117395SkanFITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15117395Skanfor more details.
16117395Skan
17117395SkanYou should have received a copy of the GNU General Public License
18117395Skanalong with GCC; see the file COPYING.  If not, write to the Free
19117395SkanSoftware Foundation, 59 Temple Place - Suite 330, Boston, MA
20117395Skan02111-1307, USA.  */
21117395Skan
22132811Skan/* $FreeBSD: head/contrib/gcc/c-opts.c 132811 2004-07-29 02:04:58Z kan $ */
23132811Skan
24117395Skan#include "config.h"
25117395Skan#include "system.h"
26132718Skan#include "coretypes.h"
27132718Skan#include "tm.h"
28117395Skan#include "tree.h"
29117395Skan#include "c-common.h"
30117395Skan#include "c-pragma.h"
31117395Skan#include "flags.h"
32117395Skan#include "toplev.h"
33117395Skan#include "langhooks.h"
34117395Skan#include "tree-inline.h"
35117395Skan#include "diagnostic.h"
36117395Skan#include "intl.h"
37132718Skan#include "cppdefault.h"
38132718Skan#include "c-incpath.h"
39132718Skan#include "debug.h"		/* For debug_hooks.  */
40132718Skan#include "opts.h"
41132718Skan#include "options.h"
42117395Skan
43132718Skan#ifndef DOLLARS_IN_IDENTIFIERS
44132718Skan# define DOLLARS_IN_IDENTIFIERS true
45132718Skan#endif
46132718Skan
47132718Skan#ifndef TARGET_SYSTEM_ROOT
48132718Skan# define TARGET_SYSTEM_ROOT NULL
49132718Skan#endif
50132718Skan
51132718Skanstatic int saved_lineno;
52132718Skan
53117395Skan/* CPP's options.  */
54117395Skanstatic cpp_options *cpp_opts;
55117395Skan
56117395Skan/* Input filename.  */
57132718Skanstatic const char *this_input_filename;
58117395Skan
59117395Skan/* Filename and stream for preprocessed output.  */
60117395Skanstatic const char *out_fname;
61117395Skanstatic FILE *out_stream;
62117395Skan
63117395Skan/* Append dependencies to deps_file.  */
64117395Skanstatic bool deps_append;
65117395Skan
66117395Skan/* If dependency switches (-MF etc.) have been given.  */
67117395Skanstatic bool deps_seen;
68117395Skan
69132718Skan/* If -v seen.  */
70132718Skanstatic bool verbose;
71132718Skan
72117395Skan/* Dependency output file.  */
73117395Skanstatic const char *deps_file;
74117395Skan
75132718Skan/* The prefix given by -iprefix, if any.  */
76132718Skanstatic const char *iprefix;
77117395Skan
78132718Skan/* The system root, if any.  Overridden by -isysroot.  */
79132718Skanstatic const char *sysroot = TARGET_SYSTEM_ROOT;
80117395Skan
81132718Skan/* Zero disables all standard directories for headers.  */
82132718Skanstatic bool std_inc = true;
83117395Skan
84132718Skan/* Zero disables the C++-specific standard directories for headers.  */
85132718Skanstatic bool std_cxx_inc = true;
86117395Skan
87132718Skan/* If the quote chain has been split by -I-.  */
88132718Skanstatic bool quote_chain_split;
89117395Skan
90132718Skan/* If -Wunused-macros.  */
91132718Skanstatic bool warn_unused_macros;
92117395Skan
93132718Skan/* Number of deferred options.  */
94132718Skanstatic size_t deferred_count;
95117395Skan
96132718Skan/* Number of deferred options scanned for -include.  */
97132718Skanstatic size_t include_cursor;
98117395Skan
99132718Skan/* Permit Fotran front-end options.  */
100132718Skanstatic bool permit_fortran_options;
101117395Skan
102132718Skanstatic void set_Wimplicit (int);
103132718Skanstatic void handle_OPT_d (const char *);
104132718Skanstatic void set_std_cxx98 (int);
105132718Skanstatic void set_std_c89 (int, int);
106132718Skanstatic void set_std_c99 (int);
107132718Skanstatic void check_deps_environment_vars (void);
108132718Skanstatic void handle_deferred_opts (void);
109132718Skanstatic void sanitize_cpp_opts (void);
110132718Skanstatic void add_prefixed_path (const char *, size_t);
111132718Skanstatic void push_command_line_include (void);
112132718Skanstatic void cb_file_change (cpp_reader *, const struct line_map *);
113132718Skanstatic void cb_dir_change (cpp_reader *, const char *);
114132718Skanstatic void finish_options (void);
115117395Skan
116132718Skan#ifndef STDC_0_IN_SYSTEM_HEADERS
117132718Skan#define STDC_0_IN_SYSTEM_HEADERS 0
118117395Skan#endif
119117395Skan
120132718Skan/* Holds switches parsed by c_common_handle_option (), but whose
121132718Skan   handling is deferred to c_common_post_options ().  */
122132718Skanstatic void defer_opt (enum opt_code, const char *);
123117395Skanstatic struct deferred_opt
124117395Skan{
125117395Skan  enum opt_code code;
126117395Skan  const char *arg;
127117395Skan} *deferred_opts;
128117395Skan
129132718Skan/* Complain that switch CODE expects an argument but none was
130132718Skan   provided.  OPT was the command-line option.  Return FALSE to get
131132718Skan   the default message in opts.c, TRUE if we provide a specialized
132132718Skan   one.  */
133132718Skanbool
134132718Skanc_common_missing_argument (const char *opt, size_t code)
135117395Skan{
136132718Skan  switch (code)
137117395Skan    {
138117395Skan    default:
139132718Skan      /* Pick up the default message.  */
140132718Skan      return false;
141132718Skan
142132718Skan    case OPT_fconstant_string_class_:
143132718Skan      error ("no class name specified with \"%s\"", opt);
144117395Skan      break;
145117395Skan
146132718Skan    case OPT_A:
147132718Skan      error ("assertion missing after \"%s\"", opt);
148117395Skan      break;
149117395Skan
150132718Skan    case OPT_D:
151132718Skan    case OPT_U:
152132718Skan      error ("macro name missing after \"%s\"", opt);
153132718Skan      break;
154132718Skan
155132718Skan    case OPT_I:
156132718Skan    case OPT_idirafter:
157132718Skan    case OPT_isysroot:
158132718Skan    case OPT_isystem:
159132718Skan      error ("missing path after \"%s\"", opt);
160132718Skan      break;
161132718Skan
162117395Skan    case OPT_MF:
163117395Skan    case OPT_MD:
164117395Skan    case OPT_MMD:
165132718Skan    case OPT_include:
166132718Skan    case OPT_imacros:
167117395Skan    case OPT_o:
168132718Skan      error ("missing filename after \"%s\"", opt);
169117395Skan      break;
170117395Skan
171117395Skan    case OPT_MQ:
172117395Skan    case OPT_MT:
173132718Skan      error ("missing makefile target after \"%s\"", opt);
174117395Skan      break;
175117395Skan    }
176117395Skan
177132718Skan  return true;
178117395Skan}
179117395Skan
180117395Skan/* Defer option CODE with argument ARG.  */
181117395Skanstatic void
182132718Skandefer_opt (enum opt_code code, const char *arg)
183117395Skan{
184117395Skan  deferred_opts[deferred_count].code = code;
185117395Skan  deferred_opts[deferred_count].arg = arg;
186117395Skan  deferred_count++;
187117395Skan}
188117395Skan
189117395Skan/* Common initialization before parsing options.  */
190132718Skanunsigned int
191132718Skanc_common_init_options (unsigned int argc, const char **argv ATTRIBUTE_UNUSED)
192117395Skan{
193132718Skan  static const unsigned int lang_flags[] = {CL_C, CL_ObjC, CL_CXX, CL_ObjCXX};
194132718Skan  unsigned int result;
195117395Skan
196132718Skan  /* This is conditionalized only because that is the way the front
197132718Skan     ends used to do it.  Maybe this should be unconditional?  */
198132718Skan  if (c_dialect_cxx ())
199132718Skan    {
200132718Skan      /* By default wrap lines at 80 characters.  Is getenv
201132718Skan	 ("COLUMNS") preferable?  */
202132718Skan      diagnostic_line_cutoff (global_dc) = 80;
203132718Skan      /* By default, emit location information once for every
204132718Skan	 diagnostic message.  */
205132718Skan      diagnostic_prefixing_rule (global_dc) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
206132718Skan    }
207117395Skan
208132718Skan  parse_in = cpp_create_reader (c_dialect_cxx () ? CLK_GNUCXX: CLK_GNUC89,
209132718Skan				ident_hash);
210132718Skan
211117395Skan  cpp_opts = cpp_get_options (parse_in);
212132718Skan  cpp_opts->dollars_in_ident = DOLLARS_IN_IDENTIFIERS;
213132718Skan  cpp_opts->objc = c_dialect_objc ();
214117395Skan
215132718Skan  /* Reset to avoid warnings on internal definitions.  We set it just
216132718Skan     before passing on command-line options to cpplib.  */
217132718Skan  cpp_opts->warn_dollars = 0;
218117395Skan
219132718Skan  flag_const_strings = c_dialect_cxx ();
220132718Skan  flag_exceptions = c_dialect_cxx ();
221132718Skan  warn_pointer_arith = c_dialect_cxx ();
222117395Skan
223132718Skan  deferred_opts = xmalloc (argc * sizeof (struct deferred_opt));
224117395Skan
225132718Skan  result = lang_flags[c_language];
226117395Skan
227132718Skan  /* If potentially preprocessing Fortran we have to accept its front
228132718Skan     end options since the driver passes most of them through.  */
229132718Skan#ifdef CL_F77
230132718Skan  if (c_language == clk_c && argc > 2
231132718Skan      && !strcmp (argv[2], "-traditional-cpp" ))
232117395Skan    {
233132718Skan      permit_fortran_options = true;
234132718Skan      result |= CL_F77;
235117395Skan    }
236132718Skan#endif
237117395Skan
238132718Skan  return result;
239132718Skan}
240117395Skan
241132718Skan/* Handle switch SCODE with argument ARG.  VALUE is true, unless no-
242132718Skan   form of an -f or -W option was given.  Returns 0 if the switch was
243132718Skan   invalid, a negative number to prevent language-independent
244132718Skan   processing in toplev.c (a hack necessary for the short-term).  */
245132718Skanint
246132718Skanc_common_handle_option (size_t scode, const char *arg, int value)
247132718Skan{
248132718Skan  const struct cl_option *option = &cl_options[scode];
249132718Skan  enum opt_code code = (enum opt_code) scode;
250132718Skan  int result = 1;
251117395Skan
252132718Skan  switch (code)
253117395Skan    {
254132718Skan    default:
255132718Skan      result = permit_fortran_options;
256132718Skan      break;
257117395Skan
258132718Skan    case OPT__output_pch_:
259132718Skan      pch_file = arg;
260117395Skan      break;
261117395Skan
262132718Skan    case OPT_A:
263132718Skan      defer_opt (code, arg);
264117395Skan      break;
265117395Skan
266117395Skan    case OPT_C:
267117395Skan      cpp_opts->discard_comments = 0;
268117395Skan      break;
269117395Skan
270117395Skan    case OPT_CC:
271117395Skan      cpp_opts->discard_comments = 0;
272117395Skan      cpp_opts->discard_comments_in_macro_exp = 0;
273117395Skan      break;
274117395Skan
275132718Skan    case OPT_D:
276132718Skan      defer_opt (code, arg);
277132718Skan      break;
278132718Skan
279117395Skan    case OPT_E:
280117395Skan      flag_preprocess_only = 1;
281117395Skan      break;
282117395Skan
283117395Skan    case OPT_H:
284117395Skan      cpp_opts->print_include_names = 1;
285117395Skan      break;
286117395Skan
287132718Skan    case OPT_I:
288132718Skan      if (strcmp (arg, "-"))
289132718Skan	add_path (xstrdup (arg), BRACKET, 0);
290132718Skan      else
291132718Skan	{
292132718Skan	  if (quote_chain_split)
293132718Skan	    error ("-I- specified twice");
294132718Skan	  quote_chain_split = true;
295132718Skan	  split_quote_chain ();
296132718Skan	}
297132718Skan      break;
298132718Skan
299117395Skan    case OPT_M:
300117395Skan    case OPT_MM:
301117395Skan      /* When doing dependencies with -M or -MM, suppress normal
302117395Skan	 preprocessed output, but still do -dM etc. as software
303117395Skan	 depends on this.  Preprocessed output does occur if -MD, -MMD
304117395Skan	 or environment var dependency generation is used.  */
305117395Skan      cpp_opts->deps.style = (code == OPT_M ? DEPS_SYSTEM: DEPS_USER);
306132718Skan      flag_no_output = 1;
307117395Skan      cpp_opts->inhibit_warnings = 1;
308117395Skan      break;
309117395Skan
310117395Skan    case OPT_MD:
311117395Skan    case OPT_MMD:
312117395Skan      cpp_opts->deps.style = (code == OPT_MD ? DEPS_SYSTEM: DEPS_USER);
313117395Skan      deps_file = arg;
314117395Skan      break;
315117395Skan
316117395Skan    case OPT_MF:
317117395Skan      deps_seen = true;
318117395Skan      deps_file = arg;
319117395Skan      break;
320117395Skan
321117395Skan    case OPT_MG:
322117395Skan      deps_seen = true;
323117395Skan      cpp_opts->deps.missing_files = true;
324117395Skan      break;
325117395Skan
326117395Skan    case OPT_MP:
327117395Skan      deps_seen = true;
328117395Skan      cpp_opts->deps.phony_targets = true;
329117395Skan      break;
330117395Skan
331117395Skan    case OPT_MQ:
332117395Skan    case OPT_MT:
333117395Skan      deps_seen = true;
334117395Skan      defer_opt (code, arg);
335117395Skan      break;
336117395Skan
337117395Skan    case OPT_P:
338132718Skan      flag_no_line_commands = 1;
339117395Skan      break;
340117395Skan
341132718Skan    case OPT_fworking_directory:
342132718Skan      flag_working_directory = value;
343132718Skan      break;
344132718Skan
345132718Skan    case OPT_U:
346132718Skan      defer_opt (code, arg);
347132718Skan      break;
348132718Skan
349117395Skan    case OPT_Wabi:
350132718Skan      warn_abi = value;
351117395Skan      break;
352117395Skan
353117395Skan    case OPT_Wall:
354132718Skan      set_Wunused (value);
355132718Skan      set_Wformat (value);
356132718Skan      set_Wimplicit (value);
357132718Skan      warn_char_subscripts = value;
358132718Skan      warn_missing_braces = value;
359132718Skan      warn_parentheses = value;
360132718Skan      warn_return_type = value;
361132718Skan      warn_sequence_point = value;	/* Was C only.  */
362132718Skan      if (c_dialect_cxx ())
363132718Skan	warn_sign_compare = value;
364132718Skan      warn_switch = value;
365132718Skan      warn_strict_aliasing = value;
366132718Skan
367117395Skan      /* Only warn about unknown pragmas that are not in system
368132718Skan	 headers.  */
369132718Skan      warn_unknown_pragmas = value;
370117395Skan
371117395Skan      /* We save the value of warn_uninitialized, since if they put
372117395Skan	 -Wuninitialized on the command line, we need to generate a
373117395Skan	 warning about not using it without also specifying -O.  */
374117395Skan      if (warn_uninitialized != 1)
375132718Skan	warn_uninitialized = (value ? 2 : 0);
376117395Skan
377132718Skan      if (!c_dialect_cxx ())
378117395Skan	/* We set this to 2 here, but 1 in -Wmain, so -ffreestanding
379117395Skan	   can turn it off only if it's not explicit.  */
380132718Skan	warn_main = value * 2;
381117395Skan      else
382117395Skan	{
383117395Skan	  /* C++-specific warnings.  */
384132718Skan	  warn_nonvdtor = value;
385132718Skan	  warn_reorder = value;
386132718Skan	  warn_nontemplate_friend = value;
387117395Skan	}
388117395Skan
389132718Skan      cpp_opts->warn_trigraphs = value;
390132718Skan      cpp_opts->warn_comments = value;
391132718Skan      cpp_opts->warn_num_sign_change = value;
392132718Skan      cpp_opts->warn_multichar = value;	/* Was C++ only.  */
393117395Skan      break;
394117395Skan
395117395Skan    case OPT_Wbad_function_cast:
396132718Skan      warn_bad_function_cast = value;
397117395Skan      break;
398117395Skan
399117395Skan    case OPT_Wcast_qual:
400132718Skan      warn_cast_qual = value;
401117395Skan      break;
402117395Skan
403117395Skan    case OPT_Wchar_subscripts:
404132718Skan      warn_char_subscripts = value;
405117395Skan      break;
406117395Skan
407117395Skan    case OPT_Wcomment:
408117395Skan    case OPT_Wcomments:
409132718Skan      cpp_opts->warn_comments = value;
410117395Skan      break;
411117395Skan
412117395Skan    case OPT_Wconversion:
413132718Skan      warn_conversion = value;
414117395Skan      break;
415117395Skan
416117395Skan    case OPT_Wctor_dtor_privacy:
417132718Skan      warn_ctor_dtor_privacy = value;
418117395Skan      break;
419117395Skan
420132718Skan    case OPT_Wdeclaration_after_statement:
421132718Skan      warn_declaration_after_statement = value;
422132718Skan      break;
423132718Skan
424117395Skan    case OPT_Wdeprecated:
425132718Skan      warn_deprecated = value;
426132718Skan      cpp_opts->warn_deprecated = value;
427117395Skan      break;
428117395Skan
429117395Skan    case OPT_Wdiv_by_zero:
430132718Skan      warn_div_by_zero = value;
431117395Skan      break;
432117395Skan
433132718Skan    case OPT_Weffc__:
434132718Skan      warn_ecpp = value;
435117395Skan      break;
436117395Skan
437117395Skan    case OPT_Wendif_labels:
438132718Skan      cpp_opts->warn_endif_labels = value;
439117395Skan      break;
440117395Skan
441117395Skan    case OPT_Werror:
442132718Skan      cpp_opts->warnings_are_errors = value;
443117395Skan      break;
444117395Skan
445132718Skan    case OPT_Werror_implicit_function_declaration:
446132718Skan      mesg_implicit_function_declaration = 2;
447117395Skan      break;
448117395Skan
449117395Skan    case OPT_Wfloat_equal:
450132718Skan      warn_float_equal = value;
451117395Skan      break;
452117395Skan
453117395Skan    case OPT_Wformat:
454132718Skan      set_Wformat (value);
455117395Skan      break;
456117395Skan
457132718Skan    case OPT_Wformat_:
458117395Skan      set_Wformat (atoi (arg));
459117395Skan      break;
460117395Skan
461117395Skan    case OPT_Wformat_extra_args:
462132718Skan      warn_format_extra_args = value;
463117395Skan      break;
464117395Skan
465117395Skan    case OPT_Wformat_nonliteral:
466132718Skan      warn_format_nonliteral = value;
467117395Skan      break;
468117395Skan
469117395Skan    case OPT_Wformat_security:
470132718Skan      warn_format_security = value;
471117395Skan      break;
472117395Skan
473117395Skan    case OPT_Wformat_y2k:
474132718Skan      warn_format_y2k = value;
475117395Skan      break;
476117395Skan
477117395Skan    case OPT_Wformat_zero_length:
478132718Skan      warn_format_zero_length = value;
479117395Skan      break;
480117395Skan
481132718Skan    case OPT_Winit_self:
482132718Skan      warn_init_self = value;
483132718Skan      break;
484132718Skan
485117395Skan    case OPT_Wimplicit:
486132718Skan      set_Wimplicit (value);
487117395Skan      break;
488117395Skan
489132718Skan    case OPT_Wimplicit_function_declaration:
490132718Skan      mesg_implicit_function_declaration = value;
491117395Skan      break;
492117395Skan
493117395Skan    case OPT_Wimplicit_int:
494132718Skan      warn_implicit_int = value;
495117395Skan      break;
496117395Skan
497117395Skan    case OPT_Wimport:
498132718Skan      /* Silently ignore for now.  */
499117395Skan      break;
500117395Skan
501132718Skan    case OPT_Winvalid_offsetof:
502132718Skan      warn_invalid_offsetof = value;
503132718Skan      break;
504132718Skan
505132718Skan    case OPT_Winvalid_pch:
506132718Skan      cpp_opts->warn_invalid_pch = value;
507132718Skan      break;
508132718Skan
509117395Skan    case OPT_Wlong_long:
510132718Skan      warn_long_long = value;
511117395Skan      break;
512117395Skan
513117395Skan    case OPT_Wmain:
514132718Skan      if (value)
515117395Skan	warn_main = 1;
516117395Skan      else
517117395Skan	warn_main = -1;
518117395Skan      break;
519117395Skan
520117395Skan    case OPT_Wmissing_braces:
521132718Skan      warn_missing_braces = value;
522117395Skan      break;
523117395Skan
524117395Skan    case OPT_Wmissing_declarations:
525132718Skan      warn_missing_declarations = value;
526117395Skan      break;
527117395Skan
528117395Skan    case OPT_Wmissing_format_attribute:
529132718Skan      warn_missing_format_attribute = value;
530117395Skan      break;
531117395Skan
532117395Skan    case OPT_Wmissing_prototypes:
533132718Skan      warn_missing_prototypes = value;
534117395Skan      break;
535117395Skan
536117395Skan    case OPT_Wmultichar:
537132718Skan      cpp_opts->warn_multichar = value;
538117395Skan      break;
539117395Skan
540117395Skan    case OPT_Wnested_externs:
541132718Skan      warn_nested_externs = value;
542117395Skan      break;
543117395Skan
544117395Skan    case OPT_Wnon_template_friend:
545132718Skan      warn_nontemplate_friend = value;
546117395Skan      break;
547117395Skan
548117395Skan    case OPT_Wnon_virtual_dtor:
549132718Skan      warn_nonvdtor = value;
550117395Skan      break;
551117395Skan
552117395Skan    case OPT_Wnonnull:
553132718Skan      warn_nonnull = value;
554117395Skan      break;
555117395Skan
556132718Skan    case OPT_Wold_style_definition:
557132718Skan      warn_old_style_definition = value;
558132718Skan      break;
559132718Skan
560117395Skan    case OPT_Wold_style_cast:
561132718Skan      warn_old_style_cast = value;
562117395Skan      break;
563117395Skan
564117395Skan    case OPT_Woverloaded_virtual:
565132718Skan      warn_overloaded_virtual = value;
566117395Skan      break;
567117395Skan
568117395Skan    case OPT_Wparentheses:
569132718Skan      warn_parentheses = value;
570117395Skan      break;
571117395Skan
572117395Skan    case OPT_Wpmf_conversions:
573132718Skan      warn_pmf2ptr = value;
574117395Skan      break;
575117395Skan
576117395Skan    case OPT_Wpointer_arith:
577132718Skan      warn_pointer_arith = value;
578117395Skan      break;
579117395Skan
580117395Skan    case OPT_Wprotocol:
581132718Skan      warn_protocol = value;
582117395Skan      break;
583117395Skan
584117395Skan    case OPT_Wselector:
585132718Skan      warn_selector = value;
586117395Skan      break;
587117395Skan
588117395Skan    case OPT_Wredundant_decls:
589132718Skan      warn_redundant_decls = value;
590117395Skan      break;
591117395Skan
592117395Skan    case OPT_Wreorder:
593132718Skan      warn_reorder = value;
594117395Skan      break;
595117395Skan
596117395Skan    case OPT_Wreturn_type:
597132718Skan      warn_return_type = value;
598117395Skan      break;
599117395Skan
600117395Skan    case OPT_Wsequence_point:
601132718Skan      warn_sequence_point = value;
602117395Skan      break;
603117395Skan
604117395Skan    case OPT_Wsign_compare:
605132718Skan      warn_sign_compare = value;
606117395Skan      break;
607117395Skan
608117395Skan    case OPT_Wsign_promo:
609132718Skan      warn_sign_promo = value;
610117395Skan      break;
611117395Skan
612117395Skan    case OPT_Wstrict_prototypes:
613132718Skan      warn_strict_prototypes = value;
614117395Skan      break;
615117395Skan
616117395Skan    case OPT_Wsynth:
617132718Skan      warn_synth = value;
618117395Skan      break;
619117395Skan
620117395Skan    case OPT_Wsystem_headers:
621132718Skan      cpp_opts->warn_system_headers = value;
622117395Skan      break;
623117395Skan
624117395Skan    case OPT_Wtraditional:
625132718Skan      warn_traditional = value;
626132718Skan      cpp_opts->warn_traditional = value;
627117395Skan      break;
628117395Skan
629117395Skan    case OPT_Wtrigraphs:
630132718Skan      cpp_opts->warn_trigraphs = value;
631117395Skan      break;
632117395Skan
633117395Skan    case OPT_Wundeclared_selector:
634132718Skan      warn_undeclared_selector = value;
635117395Skan      break;
636117395Skan
637117395Skan    case OPT_Wundef:
638132718Skan      cpp_opts->warn_undef = value;
639117395Skan      break;
640117395Skan
641117395Skan    case OPT_Wunknown_pragmas:
642117395Skan      /* Set to greater than 1, so that even unknown pragmas in
643132718Skan	 system headers will be warned about.  */
644132718Skan      warn_unknown_pragmas = value * 2;
645117395Skan      break;
646117395Skan
647117395Skan    case OPT_Wunused_macros:
648132718Skan      warn_unused_macros = value;
649117395Skan      break;
650117395Skan
651117395Skan    case OPT_Wwrite_strings:
652132718Skan      if (!c_dialect_cxx ())
653132718Skan	flag_const_strings = value;
654117395Skan      else
655132718Skan	warn_write_strings = value;
656117395Skan      break;
657132718Skan
658117395Skan    case OPT_ansi:
659132718Skan      if (!c_dialect_cxx ())
660117395Skan	set_std_c89 (false, true);
661117395Skan      else
662117395Skan	set_std_cxx98 (true);
663117395Skan      break;
664117395Skan
665117395Skan    case OPT_d:
666117395Skan      handle_OPT_d (arg);
667117395Skan      break;
668117395Skan
669117395Skan    case OPT_fcond_mismatch:
670132718Skan      if (!c_dialect_cxx ())
671117395Skan	{
672132718Skan	  flag_cond_mismatch = value;
673117395Skan	  break;
674117395Skan	}
675117395Skan      /* Fall through.  */
676117395Skan
677117395Skan    case OPT_fall_virtual:
678132718Skan    case OPT_falt_external_templates:
679117395Skan    case OPT_fenum_int_equiv:
680132718Skan    case OPT_fexternal_templates:
681117395Skan    case OPT_fguiding_decls:
682117395Skan    case OPT_fhonor_std:
683117395Skan    case OPT_fhuge_objects:
684117395Skan    case OPT_flabels_ok:
685132718Skan    case OPT_fname_mangling_version_:
686117395Skan    case OPT_fnew_abi:
687117395Skan    case OPT_fnonnull_objects:
688117395Skan    case OPT_fsquangle:
689117395Skan    case OPT_fstrict_prototype:
690117395Skan    case OPT_fthis_is_variable:
691117395Skan    case OPT_fvtable_thunks:
692117395Skan    case OPT_fxref:
693132718Skan    case OPT_fvtable_gc:
694132718Skan      warning ("switch \"%s\" is no longer supported", option->opt_text);
695117395Skan      break;
696117395Skan
697117395Skan    case OPT_faccess_control:
698132718Skan      flag_access_control = value;
699117395Skan      break;
700117395Skan
701117395Skan    case OPT_fasm:
702132718Skan      flag_no_asm = !value;
703117395Skan      break;
704117395Skan
705117395Skan    case OPT_fbuiltin:
706132718Skan      flag_no_builtin = !value;
707117395Skan      break;
708117395Skan
709117395Skan    case OPT_fbuiltin_:
710132718Skan      if (value)
711117395Skan	result = 0;
712117395Skan      else
713117395Skan	disable_builtin_function (arg);
714117395Skan      break;
715117395Skan
716117395Skan    case OPT_fdollars_in_identifiers:
717132718Skan      cpp_opts->dollars_in_ident = value;
718117395Skan      break;
719117395Skan
720132718Skan    case OPT_fdump_:
721132718Skan      if (!dump_switch_p (arg))
722117395Skan	result = 0;
723117395Skan      break;
724117395Skan
725117395Skan    case OPT_ffreestanding:
726132718Skan      value = !value;
727132718Skan      /* Fall through....  */
728117395Skan    case OPT_fhosted:
729132718Skan      flag_hosted = value;
730132718Skan      flag_no_builtin = !value;
731117395Skan      /* warn_main will be 2 if set by -Wall, 1 if set by -Wmain */
732132718Skan      if (!value && warn_main == 2)
733117395Skan	warn_main = 0;
734117395Skan      break;
735117395Skan
736117395Skan    case OPT_fshort_double:
737132718Skan      flag_short_double = value;
738117395Skan      break;
739117395Skan
740117395Skan    case OPT_fshort_enums:
741132718Skan      flag_short_enums = value;
742117395Skan      break;
743117395Skan
744117395Skan    case OPT_fshort_wchar:
745132718Skan      flag_short_wchar = value;
746117395Skan      break;
747117395Skan
748117395Skan    case OPT_fsigned_bitfields:
749132718Skan      flag_signed_bitfields = value;
750117395Skan      explicit_flag_signed_bitfields = 1;
751117395Skan      break;
752117395Skan
753117395Skan    case OPT_fsigned_char:
754132718Skan      flag_signed_char = value;
755117395Skan      break;
756117395Skan
757117395Skan    case OPT_funsigned_bitfields:
758132718Skan      flag_signed_bitfields = !value;
759117395Skan      explicit_flag_signed_bitfields = 1;
760117395Skan      break;
761117395Skan
762117395Skan    case OPT_funsigned_char:
763132718Skan      flag_signed_char = !value;
764117395Skan      break;
765117395Skan
766117395Skan    case OPT_fcheck_new:
767132718Skan      flag_check_new = value;
768117395Skan      break;
769117395Skan
770117395Skan    case OPT_fconserve_space:
771132718Skan      flag_conserve_space = value;
772117395Skan      break;
773117395Skan
774117395Skan    case OPT_fconst_strings:
775132718Skan      flag_const_strings = value;
776117395Skan      break;
777117395Skan
778132718Skan    case OPT_fconstant_string_class_:
779117395Skan      constant_string_class_name = arg;
780117395Skan      break;
781117395Skan
782117395Skan    case OPT_fdefault_inline:
783132718Skan      flag_default_inline = value;
784117395Skan      break;
785117395Skan
786117395Skan    case OPT_felide_constructors:
787132718Skan      flag_elide_constructors = value;
788117395Skan      break;
789117395Skan
790117395Skan    case OPT_fenforce_eh_specs:
791132718Skan      flag_enforce_eh_specs = value;
792117395Skan      break;
793117395Skan
794117395Skan    case OPT_ffixed_form:
795132718Skan    case OPT_ffixed_line_length_:
796117395Skan      /* Fortran front end options ignored when preprocessing only.  */
797132718Skan      if (!flag_preprocess_only)
798132718Skan        result = 0;
799117395Skan      break;
800117395Skan
801117395Skan    case OPT_ffor_scope:
802132718Skan      flag_new_for_scope = value;
803117395Skan      break;
804117395Skan
805117395Skan    case OPT_fgnu_keywords:
806132718Skan      flag_no_gnu_keywords = !value;
807117395Skan      break;
808117395Skan
809117395Skan    case OPT_fgnu_runtime:
810132718Skan      flag_next_runtime = !value;
811117395Skan      break;
812117395Skan
813117395Skan    case OPT_fhandle_exceptions:
814132718Skan      warning ("-fhandle-exceptions has been renamed -fexceptions (and is now on by default)");
815132718Skan      flag_exceptions = value;
816117395Skan      break;
817117395Skan
818117395Skan    case OPT_fimplement_inlines:
819132718Skan      flag_implement_inlines = value;
820117395Skan      break;
821117395Skan
822117395Skan    case OPT_fimplicit_inline_templates:
823132718Skan      flag_implicit_inline_templates = value;
824117395Skan      break;
825117395Skan
826117395Skan    case OPT_fimplicit_templates:
827132718Skan      flag_implicit_templates = value;
828117395Skan      break;
829117395Skan
830117395Skan    case OPT_fms_extensions:
831132718Skan      flag_ms_extensions = value;
832117395Skan      break;
833117395Skan
834117395Skan    case OPT_fnext_runtime:
835132718Skan      flag_next_runtime = value;
836117395Skan      break;
837117395Skan
838132718Skan    case OPT_fnil_receivers:
839132718Skan      flag_nil_receivers = value;
840132718Skan      break;
841132718Skan
842117395Skan    case OPT_fnonansi_builtins:
843132718Skan      flag_no_nonansi_builtin = !value;
844117395Skan      break;
845117395Skan
846132718Skan    case OPT_fobjc_exceptions:
847132718Skan      flag_objc_exceptions = value;
848132718Skan      break;
849132718Skan
850117395Skan    case OPT_foperator_names:
851132718Skan      cpp_opts->operator_names = value;
852117395Skan      break;
853117395Skan
854117395Skan    case OPT_foptional_diags:
855132718Skan      flag_optional_diags = value;
856117395Skan      break;
857117395Skan
858132718Skan    case OPT_fpch_deps:
859132718Skan      cpp_opts->restore_pch_deps = value;
860132718Skan      break;
861132718Skan
862117395Skan    case OPT_fpermissive:
863132718Skan      flag_permissive = value;
864117395Skan      break;
865117395Skan
866117395Skan    case OPT_fpreprocessed:
867132718Skan      cpp_opts->preprocessed = value;
868117395Skan      break;
869117395Skan
870132718Skan    case OPT_freplace_objc_classes:
871132718Skan      flag_replace_objc_classes = value;
872132718Skan      break;
873132718Skan
874117395Skan    case OPT_frepo:
875132718Skan      flag_use_repository = value;
876132718Skan      if (value)
877117395Skan	flag_implicit_templates = 0;
878117395Skan      break;
879117395Skan
880117395Skan    case OPT_frtti:
881132718Skan      flag_rtti = value;
882117395Skan      break;
883117395Skan
884117395Skan    case OPT_fshow_column:
885132718Skan      cpp_opts->show_column = value;
886117395Skan      break;
887117395Skan
888117395Skan    case OPT_fstats:
889132718Skan      flag_detailed_statistics = value;
890117395Skan      break;
891117395Skan
892132718Skan    case OPT_ftabstop_:
893117395Skan      /* It is documented that we silently ignore silly values.  */
894132718Skan      if (value >= 1 && value <= 100)
895132718Skan	cpp_opts->tabstop = value;
896117395Skan      break;
897117395Skan
898132718Skan    case OPT_fexec_charset_:
899132718Skan      cpp_opts->narrow_charset = arg;
900117395Skan      break;
901117395Skan
902132718Skan    case OPT_fwide_exec_charset_:
903132718Skan      cpp_opts->wide_charset = arg;
904117395Skan      break;
905117395Skan
906132718Skan    case OPT_finput_charset_:
907132718Skan      cpp_opts->input_charset = arg;
908132718Skan      break;
909132718Skan
910132718Skan    case OPT_ftemplate_depth_:
911132718Skan      max_tinst_depth = value;
912132718Skan      break;
913132718Skan
914117395Skan    case OPT_fuse_cxa_atexit:
915132718Skan      flag_use_cxa_atexit = value;
916117395Skan      break;
917117395Skan
918117395Skan    case OPT_fweak:
919132718Skan      flag_weak = value;
920117395Skan      break;
921117395Skan
922132718Skan    case OPT_fzero_link:
923132718Skan      flag_zero_link = value;
924132718Skan      break;
925132718Skan
926117395Skan    case OPT_gen_decls:
927117395Skan      flag_gen_declaration = 1;
928117395Skan      break;
929117395Skan
930132718Skan    case OPT_idirafter:
931132718Skan      add_path (xstrdup (arg), AFTER, 0);
932132718Skan      break;
933132718Skan
934132718Skan    case OPT_imacros:
935132718Skan    case OPT_include:
936132718Skan      defer_opt (code, arg);
937132718Skan      break;
938132718Skan
939132718Skan    case OPT_iprefix:
940132718Skan      iprefix = arg;
941132718Skan      break;
942132718Skan
943132718Skan    case OPT_isysroot:
944132718Skan      sysroot = arg;
945132718Skan      break;
946132718Skan
947132718Skan    case OPT_isystem:
948132718Skan      add_path (xstrdup (arg), SYSTEM, 0);
949132718Skan      break;
950132718Skan
951132718Skan    case OPT_iwithprefix:
952132718Skan      add_prefixed_path (arg, SYSTEM);
953132718Skan      break;
954132718Skan
955132718Skan    case OPT_iwithprefixbefore:
956132718Skan      add_prefixed_path (arg, BRACKET);
957132718Skan      break;
958132718Skan
959117395Skan    case OPT_lang_asm:
960117395Skan      cpp_set_lang (parse_in, CLK_ASM);
961132718Skan      cpp_opts->dollars_in_ident = false;
962117395Skan      break;
963117395Skan
964117395Skan    case OPT_lang_objc:
965117395Skan      cpp_opts->objc = 1;
966117395Skan      break;
967117395Skan
968117395Skan    case OPT_nostdinc:
969132718Skan      std_inc = false;
970117395Skan      break;
971117395Skan
972132718Skan    case OPT_nostdinc__:
973132718Skan      std_cxx_inc = false;
974117395Skan      break;
975117395Skan
976117395Skan    case OPT_o:
977117395Skan      if (!out_fname)
978117395Skan	out_fname = arg;
979117395Skan      else
980132718Skan	error ("output filename specified twice");
981117395Skan      break;
982117395Skan
983117395Skan      /* We need to handle the -pedantic switches here, rather than in
984117395Skan	 c_common_post_options, so that a subsequent -Wno-endif-labels
985117395Skan	 is not overridden.  */
986117395Skan    case OPT_pedantic_errors:
987117395Skan      cpp_opts->pedantic_errors = 1;
988132718Skan      /* Fall through.  */
989117395Skan    case OPT_pedantic:
990117395Skan      cpp_opts->pedantic = 1;
991117395Skan      cpp_opts->warn_endif_labels = 1;
992117395Skan      break;
993117395Skan
994117395Skan    case OPT_print_objc_runtime_info:
995117395Skan      print_struct_values = 1;
996117395Skan      break;
997117395Skan
998117395Skan    case OPT_remap:
999117395Skan      cpp_opts->remap = 1;
1000117395Skan      break;
1001117395Skan
1002132718Skan    case OPT_std_c__98:
1003132718Skan    case OPT_std_gnu__98:
1004132718Skan      set_std_cxx98 (code == OPT_std_c__98 /* ISO */);
1005117395Skan      break;
1006117395Skan
1007117395Skan    case OPT_std_c89:
1008117395Skan    case OPT_std_iso9899_1990:
1009117395Skan    case OPT_std_iso9899_199409:
1010117395Skan      set_std_c89 (code == OPT_std_iso9899_199409 /* c94 */, true /* ISO */);
1011117395Skan      break;
1012117395Skan
1013117395Skan    case OPT_std_gnu89:
1014117395Skan      set_std_c89 (false /* c94 */, false /* ISO */);
1015117395Skan      break;
1016117395Skan
1017117395Skan    case OPT_std_c99:
1018117395Skan    case OPT_std_c9x:
1019117395Skan    case OPT_std_iso9899_1999:
1020117395Skan    case OPT_std_iso9899_199x:
1021117395Skan      set_std_c99 (true /* ISO */);
1022117395Skan      break;
1023117395Skan
1024117395Skan    case OPT_std_gnu99:
1025117395Skan    case OPT_std_gnu9x:
1026117395Skan      set_std_c99 (false /* ISO */);
1027117395Skan      break;
1028117395Skan
1029117395Skan    case OPT_trigraphs:
1030117395Skan      cpp_opts->trigraphs = 1;
1031117395Skan      break;
1032117395Skan
1033117395Skan    case OPT_traditional_cpp:
1034117395Skan      cpp_opts->traditional = 1;
1035117395Skan      break;
1036117395Skan
1037117395Skan    case OPT_undef:
1038117395Skan      flag_undef = 1;
1039117395Skan      break;
1040117395Skan
1041117395Skan    case OPT_w:
1042117395Skan      cpp_opts->inhibit_warnings = 1;
1043117395Skan      break;
1044117395Skan
1045117395Skan    case OPT_v:
1046132718Skan      verbose = true;
1047117395Skan      break;
1048132811Skan
1049132811Skan    case OPT_fformat_extensions:
1050132811Skan      break;
1051117395Skan    }
1052117395Skan
1053117395Skan  return result;
1054117395Skan}
1055117395Skan
1056117395Skan/* Post-switch processing.  */
1057117395Skanbool
1058132718Skanc_common_post_options (const char **pfilename)
1059117395Skan{
1060132718Skan  struct cpp_callbacks *cb;
1061132718Skan
1062117395Skan  /* Canonicalize the input and output filenames.  */
1063132718Skan  if (in_fnames == NULL)
1064132718Skan    {
1065132718Skan      in_fnames = xmalloc (sizeof (in_fnames[0]));
1066132718Skan      in_fnames[0] = "";
1067132718Skan    }
1068132718Skan  else if (strcmp (in_fnames[0], "-") == 0)
1069132718Skan    in_fnames[0] = "";
1070117395Skan
1071117395Skan  if (out_fname == NULL || !strcmp (out_fname, "-"))
1072117395Skan    out_fname = "";
1073117395Skan
1074117395Skan  if (cpp_opts->deps.style == DEPS_NONE)
1075117395Skan    check_deps_environment_vars ();
1076117395Skan
1077117395Skan  handle_deferred_opts ();
1078117395Skan
1079117395Skan  sanitize_cpp_opts ();
1080117395Skan
1081132718Skan  register_include_chains (parse_in, sysroot, iprefix,
1082132718Skan			   std_inc, std_cxx_inc && c_dialect_cxx (), verbose);
1083132718Skan
1084117395Skan  flag_inline_trees = 1;
1085117395Skan
1086117395Skan  /* Use tree inlining if possible.  Function instrumentation is only
1087117395Skan     done in the RTL level, so we disable tree inlining.  */
1088132718Skan  if (flag_instrument_function_entry_exit)
1089117395Skan    {
1090132718Skan      flag_no_inline = 1;
1091132718Skan      flag_really_no_inline = 1;
1092132718Skan    }
1093132718Skan  else
1094132718Skan    {
1095117395Skan      if (!flag_no_inline)
1096117395Skan	flag_no_inline = 1;
1097117395Skan      if (flag_inline_functions)
1098117395Skan	{
1099117395Skan	  flag_inline_trees = 2;
1100117395Skan	  flag_inline_functions = 0;
1101117395Skan	}
1102117395Skan    }
1103117395Skan
1104132718Skan  /* -Wextra implies -Wsign-compare, but not if explicitly
1105132718Skan      overridden.  */
1106132718Skan  if (warn_sign_compare == -1)
1107132718Skan    warn_sign_compare = extra_warnings;
1108132718Skan
1109117395Skan  /* Special format checking options don't work without -Wformat; warn if
1110117395Skan     they are used.  */
1111117395Skan  if (warn_format_y2k && !warn_format)
1112117395Skan    warning ("-Wformat-y2k ignored without -Wformat");
1113117395Skan  if (warn_format_extra_args && !warn_format)
1114117395Skan    warning ("-Wformat-extra-args ignored without -Wformat");
1115117395Skan  if (warn_format_zero_length && !warn_format)
1116117395Skan    warning ("-Wformat-zero-length ignored without -Wformat");
1117117395Skan  if (warn_format_nonliteral && !warn_format)
1118117395Skan    warning ("-Wformat-nonliteral ignored without -Wformat");
1119117395Skan  if (warn_format_security && !warn_format)
1120117395Skan    warning ("-Wformat-security ignored without -Wformat");
1121117395Skan  if (warn_missing_format_attribute && !warn_format)
1122117395Skan    warning ("-Wmissing-format-attribute ignored without -Wformat");
1123117395Skan
1124132718Skan  if (flag_preprocess_only)
1125132718Skan    {
1126132718Skan      /* Open the output now.  We must do so even if flag_no_output is
1127132718Skan	 on, because there may be other output than from the actual
1128132718Skan	 preprocessing (e.g. from -dM).  */
1129132718Skan      if (out_fname[0] == '\0')
1130132718Skan	out_stream = stdout;
1131132718Skan      else
1132132718Skan	out_stream = fopen (out_fname, "w");
1133132718Skan
1134132718Skan      if (out_stream == NULL)
1135132718Skan	{
1136132718Skan	  fatal_error ("opening output file %s: %m", out_fname);
1137132718Skan	  return false;
1138132718Skan	}
1139132718Skan
1140132718Skan      if (num_in_fnames > 1)
1141132718Skan	error ("too many filenames given.  Type %s --help for usage",
1142132718Skan	       progname);
1143132718Skan
1144132718Skan      init_pp_output (out_stream);
1145132718Skan    }
1146132718Skan  else
1147132718Skan    {
1148132718Skan      init_c_lex ();
1149132718Skan
1150132718Skan      /* Yuk.  WTF is this?  I do know ObjC relies on it somewhere.  */
1151132718Skan      input_line = 0;
1152132718Skan    }
1153132718Skan
1154132718Skan  cb = cpp_get_callbacks (parse_in);
1155132718Skan  cb->file_change = cb_file_change;
1156132718Skan  cb->dir_change = cb_dir_change;
1157132718Skan  cpp_post_options (parse_in);
1158132718Skan
1159132718Skan  saved_lineno = input_line;
1160132718Skan  input_line = 0;
1161132718Skan
1162117395Skan  /* If an error has occurred in cpplib, note it so we fail
1163117395Skan     immediately.  */
1164117395Skan  errorcount += cpp_errors (parse_in);
1165117395Skan
1166132718Skan  *pfilename = this_input_filename
1167132718Skan    = cpp_read_main_file (parse_in, in_fnames[0]);
1168132718Skan  if (this_input_filename == NULL)
1169132718Skan    return true;
1170117395Skan
1171132718Skan  if (flag_working_directory
1172132718Skan      && flag_preprocess_only && ! flag_no_line_commands)
1173132718Skan    pp_dir_change (parse_in, get_src_pwd ());
1174117395Skan
1175132718Skan  return flag_preprocess_only;
1176117395Skan}
1177117395Skan
1178117395Skan/* Front end initialization common to C, ObjC and C++.  */
1179132718Skanbool
1180132718Skanc_common_init (void)
1181117395Skan{
1182132718Skan  input_line = saved_lineno;
1183132718Skan
1184117395Skan  /* Set up preprocessor arithmetic.  Must be done after call to
1185117395Skan     c_common_nodes_and_builtins for type nodes to be good.  */
1186117395Skan  cpp_opts->precision = TYPE_PRECISION (intmax_type_node);
1187117395Skan  cpp_opts->char_precision = TYPE_PRECISION (char_type_node);
1188117395Skan  cpp_opts->int_precision = TYPE_PRECISION (integer_type_node);
1189117395Skan  cpp_opts->wchar_precision = TYPE_PRECISION (wchar_type_node);
1190117395Skan  cpp_opts->unsigned_wchar = TREE_UNSIGNED (wchar_type_node);
1191132718Skan  cpp_opts->bytes_big_endian = BYTES_BIG_ENDIAN;
1192117395Skan
1193132718Skan  /* This can't happen until after wchar_precision and bytes_big_endian
1194132718Skan     are known.  */
1195132718Skan  cpp_init_iconv (parse_in);
1196117395Skan
1197117395Skan  if (flag_preprocess_only)
1198117395Skan    {
1199132718Skan      finish_options ();
1200132718Skan      preprocess_file (parse_in);
1201132718Skan      return false;
1202117395Skan    }
1203117395Skan
1204132718Skan  /* Has to wait until now so that cpplib has its hash table.  */
1205117395Skan  init_pragma ();
1206117395Skan
1207132718Skan  return true;
1208117395Skan}
1209117395Skan
1210132718Skan/* Initialize the integrated preprocessor after debug output has been
1211132718Skan   initialized; loop over each input file.  */
1212132718Skanvoid
1213132718Skanc_common_parse_file (int set_yydebug ATTRIBUTE_UNUSED)
1214132718Skan{
1215132718Skan  unsigned file_index;
1216132718Skan
1217132718Skan#if YYDEBUG != 0
1218132718Skan  yydebug = set_yydebug;
1219132718Skan#else
1220132718Skan  warning ("YYDEBUG not defined");
1221132718Skan#endif
1222132718Skan
1223132718Skan  file_index = 0;
1224132718Skan
1225132718Skan  do
1226132718Skan    {
1227132718Skan      if (file_index > 0)
1228132718Skan	{
1229132718Skan	  /* Reset the state of the parser.  */
1230132718Skan	  c_reset_state();
1231132718Skan
1232132718Skan	  /* Reset cpplib's macros and start a new file.  */
1233132718Skan	  cpp_undef_all (parse_in);
1234132718Skan	  main_input_filename = this_input_filename
1235132718Skan	    = cpp_read_main_file (parse_in, in_fnames[file_index]);
1236132718Skan	  if (this_input_filename == NULL)
1237132718Skan	    break;
1238132718Skan	}
1239132718Skan      finish_options ();
1240132718Skan      if (file_index == 0)
1241132718Skan	pch_init();
1242132718Skan      c_parse_file ();
1243132718Skan
1244132718Skan      file_index++;
1245132718Skan    } while (file_index < num_in_fnames);
1246132718Skan
1247132718Skan  finish_file ();
1248132718Skan}
1249132718Skan
1250117395Skan/* Common finish hook for the C, ObjC and C++ front ends.  */
1251117395Skanvoid
1252132718Skanc_common_finish (void)
1253117395Skan{
1254117395Skan  FILE *deps_stream = NULL;
1255117395Skan
1256117395Skan  if (cpp_opts->deps.style != DEPS_NONE)
1257117395Skan    {
1258117395Skan      /* If -M or -MM was seen without -MF, default output to the
1259117395Skan	 output stream.  */
1260117395Skan      if (!deps_file)
1261117395Skan	deps_stream = out_stream;
1262117395Skan      else
1263117395Skan	{
1264117395Skan	  deps_stream = fopen (deps_file, deps_append ? "a": "w");
1265117395Skan	  if (!deps_stream)
1266132718Skan	    fatal_error ("opening dependency file %s: %m", deps_file);
1267117395Skan	}
1268117395Skan    }
1269117395Skan
1270117395Skan  /* For performance, avoid tearing down cpplib's internal structures
1271117395Skan     with cpp_destroy ().  */
1272117395Skan  errorcount += cpp_finish (parse_in, deps_stream);
1273117395Skan
1274117395Skan  if (deps_stream && deps_stream != out_stream
1275117395Skan      && (ferror (deps_stream) || fclose (deps_stream)))
1276132718Skan    fatal_error ("closing dependency file %s: %m", deps_file);
1277117395Skan
1278117395Skan  if (out_stream && (ferror (out_stream) || fclose (out_stream)))
1279132718Skan    fatal_error ("when writing output to %s: %m", out_fname);
1280117395Skan}
1281117395Skan
1282117395Skan/* Either of two environment variables can specify output of
1283117395Skan   dependencies.  Their value is either "OUTPUT_FILE" or "OUTPUT_FILE
1284117395Skan   DEPS_TARGET", where OUTPUT_FILE is the file to write deps info to
1285117395Skan   and DEPS_TARGET is the target to mention in the deps.  They also
1286117395Skan   result in dependency information being appended to the output file
1287117395Skan   rather than overwriting it, and like Sun's compiler
1288117395Skan   SUNPRO_DEPENDENCIES suppresses the dependency on the main file.  */
1289117395Skanstatic void
1290132718Skancheck_deps_environment_vars (void)
1291117395Skan{
1292117395Skan  char *spec;
1293117395Skan
1294117395Skan  GET_ENVIRONMENT (spec, "DEPENDENCIES_OUTPUT");
1295117395Skan  if (spec)
1296117395Skan    cpp_opts->deps.style = DEPS_USER;
1297117395Skan  else
1298117395Skan    {
1299117395Skan      GET_ENVIRONMENT (spec, "SUNPRO_DEPENDENCIES");
1300117395Skan      if (spec)
1301117395Skan	{
1302117395Skan	  cpp_opts->deps.style = DEPS_SYSTEM;
1303117395Skan	  cpp_opts->deps.ignore_main_file = true;
1304117395Skan	}
1305117395Skan    }
1306117395Skan
1307117395Skan  if (spec)
1308117395Skan    {
1309117395Skan      /* Find the space before the DEPS_TARGET, if there is one.  */
1310117395Skan      char *s = strchr (spec, ' ');
1311117395Skan      if (s)
1312117395Skan	{
1313117395Skan	  /* Let the caller perform MAKE quoting.  */
1314117395Skan	  defer_opt (OPT_MT, s + 1);
1315117395Skan	  *s = '\0';
1316117395Skan	}
1317117395Skan
1318117395Skan      /* Command line -MF overrides environment variables and default.  */
1319117395Skan      if (!deps_file)
1320117395Skan	deps_file = spec;
1321117395Skan
1322117395Skan      deps_append = 1;
1323117395Skan    }
1324117395Skan}
1325117395Skan
1326117395Skan/* Handle deferred command line switches.  */
1327117395Skanstatic void
1328132718Skanhandle_deferred_opts (void)
1329117395Skan{
1330117395Skan  size_t i;
1331117395Skan
1332117395Skan  for (i = 0; i < deferred_count; i++)
1333117395Skan    {
1334117395Skan      struct deferred_opt *opt = &deferred_opts[i];
1335117395Skan
1336132718Skan      if (opt->code == OPT_MT || opt->code == OPT_MQ)
1337132718Skan	cpp_add_dependency_target (parse_in, opt->arg, opt->code == OPT_MQ);
1338117395Skan    }
1339117395Skan}
1340117395Skan
1341117395Skan/* These settings are appropriate for GCC, but not necessarily so for
1342117395Skan   cpplib as a library.  */
1343117395Skanstatic void
1344132718Skansanitize_cpp_opts (void)
1345117395Skan{
1346117395Skan  /* If we don't know what style of dependencies to output, complain
1347117395Skan     if any other dependency switches have been given.  */
1348117395Skan  if (deps_seen && cpp_opts->deps.style == DEPS_NONE)
1349117395Skan    error ("to generate dependencies you must specify either -M or -MM");
1350117395Skan
1351117395Skan  /* -dM and dependencies suppress normal output; do it here so that
1352117395Skan     the last -d[MDN] switch overrides earlier ones.  */
1353132718Skan  if (flag_dump_macros == 'M')
1354132718Skan    flag_no_output = 1;
1355117395Skan
1356117395Skan  /* Disable -dD, -dN and -dI if normal output is suppressed.  Allow
1357117395Skan     -dM since at least glibc relies on -M -dM to work.  */
1358132718Skan  if (flag_no_output)
1359117395Skan    {
1360132718Skan      if (flag_dump_macros != 'M')
1361132718Skan	flag_dump_macros = 0;
1362132718Skan      flag_dump_includes = 0;
1363117395Skan    }
1364117395Skan
1365117395Skan  cpp_opts->unsigned_char = !flag_signed_char;
1366117395Skan  cpp_opts->stdc_0_in_system_headers = STDC_0_IN_SYSTEM_HEADERS;
1367117395Skan
1368117395Skan  /* We want -Wno-long-long to override -pedantic -std=non-c99
1369117395Skan     and/or -Wtraditional, whatever the ordering.  */
1370117395Skan  cpp_opts->warn_long_long
1371117395Skan    = warn_long_long && ((!flag_isoc99 && pedantic) || warn_traditional);
1372132718Skan
1373132718Skan  /* If we're generating preprocessor output, emit current directory
1374132718Skan     if explicitly requested or if debugging information is enabled.
1375132718Skan     ??? Maybe we should only do it for debugging formats that
1376132718Skan     actually output the current directory?  */
1377132718Skan  if (flag_working_directory == -1)
1378132718Skan    flag_working_directory = (debug_info_level != DINFO_LEVEL_NONE);
1379117395Skan}
1380117395Skan
1381132718Skan/* Add include path with a prefix at the front of its name.  */
1382132718Skanstatic void
1383132718Skanadd_prefixed_path (const char *suffix, size_t chain)
1384132718Skan{
1385132718Skan  char *path;
1386132718Skan  const char *prefix;
1387132718Skan  size_t prefix_len, suffix_len;
1388132718Skan
1389132718Skan  suffix_len = strlen (suffix);
1390132718Skan  prefix     = iprefix ? iprefix : cpp_GCC_INCLUDE_DIR;
1391132718Skan  prefix_len = iprefix ? strlen (iprefix) : cpp_GCC_INCLUDE_DIR_len;
1392132718Skan
1393132718Skan  path = xmalloc (prefix_len + suffix_len + 1);
1394132718Skan  memcpy (path, prefix, prefix_len);
1395132718Skan  memcpy (path + prefix_len, suffix, suffix_len);
1396132718Skan  path[prefix_len + suffix_len] = '\0';
1397132718Skan
1398132718Skan  add_path (path, chain, 0);
1399132718Skan}
1400132718Skan
1401132718Skan/* Handle -D, -U, -A, -imacros, and the first -include.  */
1402132718Skanstatic void
1403132718Skanfinish_options (void)
1404132718Skan{
1405132718Skan  if (!cpp_opts->preprocessed)
1406132718Skan    {
1407132718Skan      size_t i;
1408132718Skan
1409132718Skan      cpp_change_file (parse_in, LC_RENAME, _("<built-in>"));
1410132718Skan      cpp_init_builtins (parse_in, flag_hosted);
1411132718Skan      c_cpp_builtins (parse_in);
1412132718Skan
1413132718Skan      /* We're about to send user input to cpplib, so make it warn for
1414132718Skan	 things that we previously (when we sent it internal definitions)
1415132718Skan	 told it to not warn.
1416132718Skan
1417132718Skan	 C99 permits implementation-defined characters in identifiers.
1418132718Skan	 The documented meaning of -std= is to turn off extensions that
1419132718Skan	 conflict with the specified standard, and since a strictly
1420132718Skan	 conforming program cannot contain a '$', we do not condition
1421132718Skan	 their acceptance on the -std= setting.  */
1422132718Skan      cpp_opts->warn_dollars = (cpp_opts->pedantic && !cpp_opts->c99);
1423132718Skan
1424132718Skan      cpp_change_file (parse_in, LC_RENAME, _("<command line>"));
1425132718Skan      for (i = 0; i < deferred_count; i++)
1426132718Skan	{
1427132718Skan	  struct deferred_opt *opt = &deferred_opts[i];
1428132718Skan
1429132718Skan	  if (opt->code == OPT_D)
1430132718Skan	    cpp_define (parse_in, opt->arg);
1431132718Skan	  else if (opt->code == OPT_U)
1432132718Skan	    cpp_undef (parse_in, opt->arg);
1433132718Skan	  else if (opt->code == OPT_A)
1434132718Skan	    {
1435132718Skan	      if (opt->arg[0] == '-')
1436132718Skan		cpp_unassert (parse_in, opt->arg + 1);
1437132718Skan	      else
1438132718Skan		cpp_assert (parse_in, opt->arg);
1439132718Skan	    }
1440132718Skan	}
1441132718Skan
1442132718Skan      /* Handle -imacros after -D and -U.  */
1443132718Skan      for (i = 0; i < deferred_count; i++)
1444132718Skan	{
1445132718Skan	  struct deferred_opt *opt = &deferred_opts[i];
1446132718Skan
1447132718Skan	  if (opt->code == OPT_imacros
1448132718Skan	      && cpp_push_include (parse_in, opt->arg))
1449132718Skan	    {
1450132718Skan	      /* Disable push_command_line_include callback for now.  */
1451132718Skan	      include_cursor = deferred_count + 1;
1452132718Skan	      cpp_scan_nooutput (parse_in);
1453132718Skan	    }
1454132718Skan	}
1455132718Skan    }
1456132718Skan
1457132718Skan  include_cursor = 0;
1458132718Skan  push_command_line_include ();
1459132718Skan}
1460132718Skan
1461132718Skan/* Give CPP the next file given by -include, if any.  */
1462132718Skanstatic void
1463132718Skanpush_command_line_include (void)
1464132718Skan{
1465132718Skan  while (include_cursor < deferred_count)
1466132718Skan    {
1467132718Skan      struct deferred_opt *opt = &deferred_opts[include_cursor++];
1468132718Skan
1469132718Skan      if (! cpp_opts->preprocessed && opt->code == OPT_include
1470132718Skan	  && cpp_push_include (parse_in, opt->arg))
1471132718Skan	return;
1472132718Skan    }
1473132718Skan
1474132718Skan  if (include_cursor == deferred_count)
1475132718Skan    {
1476132718Skan      include_cursor++;
1477132718Skan      /* -Wunused-macros should only warn about macros defined hereafter.  */
1478132718Skan      cpp_opts->warn_unused_macros = warn_unused_macros;
1479132718Skan      /* Restore the line map from <command line>.  */
1480132718Skan      if (! cpp_opts->preprocessed)
1481132718Skan	cpp_change_file (parse_in, LC_RENAME, main_input_filename);
1482132718Skan
1483132718Skan      /* Set this here so the client can change the option if it wishes,
1484132718Skan	 and after stacking the main file so we don't trace the main file.  */
1485132718Skan      cpp_get_line_maps (parse_in)->trace_includes
1486132718Skan	= cpp_opts->print_include_names;
1487132718Skan    }
1488132718Skan}
1489132718Skan
1490132718Skan/* File change callback.  Has to handle -include files.  */
1491132718Skanstatic void
1492132718Skancb_file_change (cpp_reader *pfile ATTRIBUTE_UNUSED,
1493132718Skan		const struct line_map *new_map)
1494132718Skan{
1495132718Skan  if (flag_preprocess_only)
1496132718Skan    pp_file_change (new_map);
1497132718Skan  else
1498132718Skan    fe_file_change (new_map);
1499132718Skan
1500132718Skan  if (new_map == 0 || (new_map->reason == LC_LEAVE && MAIN_FILE_P (new_map)))
1501132718Skan    push_command_line_include ();
1502132718Skan}
1503132718Skan
1504132718Skanvoid
1505132718Skancb_dir_change (cpp_reader *pfile ATTRIBUTE_UNUSED, const char *dir)
1506132718Skan{
1507132718Skan  if (! set_src_pwd (dir))
1508132718Skan    warning ("too late for # directive to set debug directory");
1509132718Skan}
1510132718Skan
1511117395Skan/* Set the C 89 standard (with 1994 amendments if C94, without GNU
1512117395Skan   extensions if ISO).  There is no concept of gnu94.  */
1513117395Skanstatic void
1514132718Skanset_std_c89 (int c94, int iso)
1515117395Skan{
1516117395Skan  cpp_set_lang (parse_in, c94 ? CLK_STDC94: iso ? CLK_STDC89: CLK_GNUC89);
1517117395Skan  flag_iso = iso;
1518117395Skan  flag_no_asm = iso;
1519117395Skan  flag_no_gnu_keywords = iso;
1520117395Skan  flag_no_nonansi_builtin = iso;
1521117395Skan  flag_isoc94 = c94;
1522117395Skan  flag_isoc99 = 0;
1523117395Skan  flag_writable_strings = 0;
1524117395Skan}
1525117395Skan
1526117395Skan/* Set the C 99 standard (without GNU extensions if ISO).  */
1527117395Skanstatic void
1528132718Skanset_std_c99 (int iso)
1529117395Skan{
1530117395Skan  cpp_set_lang (parse_in, iso ? CLK_STDC99: CLK_GNUC99);
1531117395Skan  flag_no_asm = iso;
1532117395Skan  flag_no_nonansi_builtin = iso;
1533117395Skan  flag_iso = iso;
1534117395Skan  flag_isoc99 = 1;
1535117395Skan  flag_isoc94 = 1;
1536117395Skan  flag_writable_strings = 0;
1537117395Skan}
1538117395Skan
1539117395Skan/* Set the C++ 98 standard (without GNU extensions if ISO).  */
1540117395Skanstatic void
1541132718Skanset_std_cxx98 (int iso)
1542117395Skan{
1543117395Skan  cpp_set_lang (parse_in, iso ? CLK_CXX98: CLK_GNUCXX);
1544117395Skan  flag_no_gnu_keywords = iso;
1545117395Skan  flag_no_nonansi_builtin = iso;
1546117395Skan  flag_iso = iso;
1547117395Skan}
1548117395Skan
1549117395Skan/* Handle setting implicit to ON.  */
1550117395Skanstatic void
1551132718Skanset_Wimplicit (int on)
1552117395Skan{
1553117395Skan  warn_implicit = on;
1554117395Skan  warn_implicit_int = on;
1555117395Skan  if (on)
1556117395Skan    {
1557117395Skan      if (mesg_implicit_function_declaration != 2)
1558117395Skan	mesg_implicit_function_declaration = 1;
1559117395Skan    }
1560117395Skan  else
1561117395Skan    mesg_implicit_function_declaration = 0;
1562117395Skan}
1563117395Skan
1564117395Skan/* Args to -d specify what to dump.  Silently ignore
1565117395Skan   unrecognized options; they may be aimed at toplev.c.  */
1566117395Skanstatic void
1567132718Skanhandle_OPT_d (const char *arg)
1568117395Skan{
1569117395Skan  char c;
1570117395Skan
1571117395Skan  while ((c = *arg++) != '\0')
1572117395Skan    switch (c)
1573117395Skan      {
1574132718Skan      case 'M':			/* Dump macros only.  */
1575132718Skan      case 'N':			/* Dump names.  */
1576132718Skan      case 'D':			/* Dump definitions.  */
1577132718Skan	flag_dump_macros = c;
1578117395Skan	break;
1579117395Skan
1580117395Skan      case 'I':
1581132718Skan	flag_dump_includes = 1;
1582117395Skan	break;
1583117395Skan      }
1584117395Skan}
1585