c-opts.c revision 132718
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
22117395Skan#include "config.h"
23117395Skan#include "system.h"
24132718Skan#include "coretypes.h"
25132718Skan#include "tm.h"
26117395Skan#include "tree.h"
27117395Skan#include "c-common.h"
28117395Skan#include "c-pragma.h"
29117395Skan#include "flags.h"
30117395Skan#include "toplev.h"
31117395Skan#include "langhooks.h"
32117395Skan#include "tree-inline.h"
33117395Skan#include "diagnostic.h"
34117395Skan#include "intl.h"
35132718Skan#include "cppdefault.h"
36132718Skan#include "c-incpath.h"
37132718Skan#include "debug.h"		/* For debug_hooks.  */
38132718Skan#include "opts.h"
39132718Skan#include "options.h"
40117395Skan
41132718Skan#ifndef DOLLARS_IN_IDENTIFIERS
42132718Skan# define DOLLARS_IN_IDENTIFIERS true
43132718Skan#endif
44132718Skan
45132718Skan#ifndef TARGET_SYSTEM_ROOT
46132718Skan# define TARGET_SYSTEM_ROOT NULL
47132718Skan#endif
48132718Skan
49132718Skanstatic int saved_lineno;
50132718Skan
51117395Skan/* CPP's options.  */
52117395Skanstatic cpp_options *cpp_opts;
53117395Skan
54117395Skan/* Input filename.  */
55132718Skanstatic const char *this_input_filename;
56117395Skan
57117395Skan/* Filename and stream for preprocessed output.  */
58117395Skanstatic const char *out_fname;
59117395Skanstatic FILE *out_stream;
60117395Skan
61117395Skan/* Append dependencies to deps_file.  */
62117395Skanstatic bool deps_append;
63117395Skan
64117395Skan/* If dependency switches (-MF etc.) have been given.  */
65117395Skanstatic bool deps_seen;
66117395Skan
67132718Skan/* If -v seen.  */
68132718Skanstatic bool verbose;
69132718Skan
70117395Skan/* Dependency output file.  */
71117395Skanstatic const char *deps_file;
72117395Skan
73132718Skan/* The prefix given by -iprefix, if any.  */
74132718Skanstatic const char *iprefix;
75117395Skan
76132718Skan/* The system root, if any.  Overridden by -isysroot.  */
77132718Skanstatic const char *sysroot = TARGET_SYSTEM_ROOT;
78117395Skan
79132718Skan/* Zero disables all standard directories for headers.  */
80132718Skanstatic bool std_inc = true;
81117395Skan
82132718Skan/* Zero disables the C++-specific standard directories for headers.  */
83132718Skanstatic bool std_cxx_inc = true;
84117395Skan
85132718Skan/* If the quote chain has been split by -I-.  */
86132718Skanstatic bool quote_chain_split;
87117395Skan
88132718Skan/* If -Wunused-macros.  */
89132718Skanstatic bool warn_unused_macros;
90117395Skan
91132718Skan/* Number of deferred options.  */
92132718Skanstatic size_t deferred_count;
93117395Skan
94132718Skan/* Number of deferred options scanned for -include.  */
95132718Skanstatic size_t include_cursor;
96117395Skan
97132718Skan/* Permit Fotran front-end options.  */
98132718Skanstatic bool permit_fortran_options;
99117395Skan
100132718Skanstatic void set_Wimplicit (int);
101132718Skanstatic void handle_OPT_d (const char *);
102132718Skanstatic void set_std_cxx98 (int);
103132718Skanstatic void set_std_c89 (int, int);
104132718Skanstatic void set_std_c99 (int);
105132718Skanstatic void check_deps_environment_vars (void);
106132718Skanstatic void handle_deferred_opts (void);
107132718Skanstatic void sanitize_cpp_opts (void);
108132718Skanstatic void add_prefixed_path (const char *, size_t);
109132718Skanstatic void push_command_line_include (void);
110132718Skanstatic void cb_file_change (cpp_reader *, const struct line_map *);
111132718Skanstatic void cb_dir_change (cpp_reader *, const char *);
112132718Skanstatic void finish_options (void);
113117395Skan
114132718Skan#ifndef STDC_0_IN_SYSTEM_HEADERS
115132718Skan#define STDC_0_IN_SYSTEM_HEADERS 0
116117395Skan#endif
117117395Skan
118132718Skan/* Holds switches parsed by c_common_handle_option (), but whose
119132718Skan   handling is deferred to c_common_post_options ().  */
120132718Skanstatic void defer_opt (enum opt_code, const char *);
121117395Skanstatic struct deferred_opt
122117395Skan{
123117395Skan  enum opt_code code;
124117395Skan  const char *arg;
125117395Skan} *deferred_opts;
126117395Skan
127132718Skan/* Complain that switch CODE expects an argument but none was
128132718Skan   provided.  OPT was the command-line option.  Return FALSE to get
129132718Skan   the default message in opts.c, TRUE if we provide a specialized
130132718Skan   one.  */
131132718Skanbool
132132718Skanc_common_missing_argument (const char *opt, size_t code)
133117395Skan{
134132718Skan  switch (code)
135117395Skan    {
136117395Skan    default:
137132718Skan      /* Pick up the default message.  */
138132718Skan      return false;
139132718Skan
140132718Skan    case OPT_fconstant_string_class_:
141132718Skan      error ("no class name specified with \"%s\"", opt);
142117395Skan      break;
143117395Skan
144132718Skan    case OPT_A:
145132718Skan      error ("assertion missing after \"%s\"", opt);
146117395Skan      break;
147117395Skan
148132718Skan    case OPT_D:
149132718Skan    case OPT_U:
150132718Skan      error ("macro name missing after \"%s\"", opt);
151132718Skan      break;
152132718Skan
153132718Skan    case OPT_I:
154132718Skan    case OPT_idirafter:
155132718Skan    case OPT_isysroot:
156132718Skan    case OPT_isystem:
157132718Skan      error ("missing path after \"%s\"", opt);
158132718Skan      break;
159132718Skan
160117395Skan    case OPT_MF:
161117395Skan    case OPT_MD:
162117395Skan    case OPT_MMD:
163132718Skan    case OPT_include:
164132718Skan    case OPT_imacros:
165117395Skan    case OPT_o:
166132718Skan      error ("missing filename after \"%s\"", opt);
167117395Skan      break;
168117395Skan
169117395Skan    case OPT_MQ:
170117395Skan    case OPT_MT:
171132718Skan      error ("missing makefile target after \"%s\"", opt);
172117395Skan      break;
173117395Skan    }
174117395Skan
175132718Skan  return true;
176117395Skan}
177117395Skan
178117395Skan/* Defer option CODE with argument ARG.  */
179117395Skanstatic void
180132718Skandefer_opt (enum opt_code code, const char *arg)
181117395Skan{
182117395Skan  deferred_opts[deferred_count].code = code;
183117395Skan  deferred_opts[deferred_count].arg = arg;
184117395Skan  deferred_count++;
185117395Skan}
186117395Skan
187117395Skan/* Common initialization before parsing options.  */
188132718Skanunsigned int
189132718Skanc_common_init_options (unsigned int argc, const char **argv ATTRIBUTE_UNUSED)
190117395Skan{
191132718Skan  static const unsigned int lang_flags[] = {CL_C, CL_ObjC, CL_CXX, CL_ObjCXX};
192132718Skan  unsigned int result;
193117395Skan
194132718Skan  /* This is conditionalized only because that is the way the front
195132718Skan     ends used to do it.  Maybe this should be unconditional?  */
196132718Skan  if (c_dialect_cxx ())
197132718Skan    {
198132718Skan      /* By default wrap lines at 80 characters.  Is getenv
199132718Skan	 ("COLUMNS") preferable?  */
200132718Skan      diagnostic_line_cutoff (global_dc) = 80;
201132718Skan      /* By default, emit location information once for every
202132718Skan	 diagnostic message.  */
203132718Skan      diagnostic_prefixing_rule (global_dc) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
204132718Skan    }
205117395Skan
206132718Skan  parse_in = cpp_create_reader (c_dialect_cxx () ? CLK_GNUCXX: CLK_GNUC89,
207132718Skan				ident_hash);
208132718Skan
209117395Skan  cpp_opts = cpp_get_options (parse_in);
210132718Skan  cpp_opts->dollars_in_ident = DOLLARS_IN_IDENTIFIERS;
211132718Skan  cpp_opts->objc = c_dialect_objc ();
212117395Skan
213132718Skan  /* Reset to avoid warnings on internal definitions.  We set it just
214132718Skan     before passing on command-line options to cpplib.  */
215132718Skan  cpp_opts->warn_dollars = 0;
216117395Skan
217132718Skan  flag_const_strings = c_dialect_cxx ();
218132718Skan  flag_exceptions = c_dialect_cxx ();
219132718Skan  warn_pointer_arith = c_dialect_cxx ();
220117395Skan
221132718Skan  deferred_opts = xmalloc (argc * sizeof (struct deferred_opt));
222117395Skan
223132718Skan  result = lang_flags[c_language];
224117395Skan
225132718Skan  /* If potentially preprocessing Fortran we have to accept its front
226132718Skan     end options since the driver passes most of them through.  */
227132718Skan#ifdef CL_F77
228132718Skan  if (c_language == clk_c && argc > 2
229132718Skan      && !strcmp (argv[2], "-traditional-cpp" ))
230117395Skan    {
231132718Skan      permit_fortran_options = true;
232132718Skan      result |= CL_F77;
233117395Skan    }
234132718Skan#endif
235117395Skan
236132718Skan  return result;
237132718Skan}
238117395Skan
239132718Skan/* Handle switch SCODE with argument ARG.  VALUE is true, unless no-
240132718Skan   form of an -f or -W option was given.  Returns 0 if the switch was
241132718Skan   invalid, a negative number to prevent language-independent
242132718Skan   processing in toplev.c (a hack necessary for the short-term).  */
243132718Skanint
244132718Skanc_common_handle_option (size_t scode, const char *arg, int value)
245132718Skan{
246132718Skan  const struct cl_option *option = &cl_options[scode];
247132718Skan  enum opt_code code = (enum opt_code) scode;
248132718Skan  int result = 1;
249117395Skan
250132718Skan  switch (code)
251117395Skan    {
252132718Skan    default:
253132718Skan      result = permit_fortran_options;
254132718Skan      break;
255117395Skan
256132718Skan    case OPT__output_pch_:
257132718Skan      pch_file = arg;
258117395Skan      break;
259117395Skan
260132718Skan    case OPT_A:
261132718Skan      defer_opt (code, arg);
262117395Skan      break;
263117395Skan
264117395Skan    case OPT_C:
265117395Skan      cpp_opts->discard_comments = 0;
266117395Skan      break;
267117395Skan
268117395Skan    case OPT_CC:
269117395Skan      cpp_opts->discard_comments = 0;
270117395Skan      cpp_opts->discard_comments_in_macro_exp = 0;
271117395Skan      break;
272117395Skan
273132718Skan    case OPT_D:
274132718Skan      defer_opt (code, arg);
275132718Skan      break;
276132718Skan
277117395Skan    case OPT_E:
278117395Skan      flag_preprocess_only = 1;
279117395Skan      break;
280117395Skan
281117395Skan    case OPT_H:
282117395Skan      cpp_opts->print_include_names = 1;
283117395Skan      break;
284117395Skan
285132718Skan    case OPT_I:
286132718Skan      if (strcmp (arg, "-"))
287132718Skan	add_path (xstrdup (arg), BRACKET, 0);
288132718Skan      else
289132718Skan	{
290132718Skan	  if (quote_chain_split)
291132718Skan	    error ("-I- specified twice");
292132718Skan	  quote_chain_split = true;
293132718Skan	  split_quote_chain ();
294132718Skan	}
295132718Skan      break;
296132718Skan
297117395Skan    case OPT_M:
298117395Skan    case OPT_MM:
299117395Skan      /* When doing dependencies with -M or -MM, suppress normal
300117395Skan	 preprocessed output, but still do -dM etc. as software
301117395Skan	 depends on this.  Preprocessed output does occur if -MD, -MMD
302117395Skan	 or environment var dependency generation is used.  */
303117395Skan      cpp_opts->deps.style = (code == OPT_M ? DEPS_SYSTEM: DEPS_USER);
304132718Skan      flag_no_output = 1;
305117395Skan      cpp_opts->inhibit_warnings = 1;
306117395Skan      break;
307117395Skan
308117395Skan    case OPT_MD:
309117395Skan    case OPT_MMD:
310117395Skan      cpp_opts->deps.style = (code == OPT_MD ? DEPS_SYSTEM: DEPS_USER);
311117395Skan      deps_file = arg;
312117395Skan      break;
313117395Skan
314117395Skan    case OPT_MF:
315117395Skan      deps_seen = true;
316117395Skan      deps_file = arg;
317117395Skan      break;
318117395Skan
319117395Skan    case OPT_MG:
320117395Skan      deps_seen = true;
321117395Skan      cpp_opts->deps.missing_files = true;
322117395Skan      break;
323117395Skan
324117395Skan    case OPT_MP:
325117395Skan      deps_seen = true;
326117395Skan      cpp_opts->deps.phony_targets = true;
327117395Skan      break;
328117395Skan
329117395Skan    case OPT_MQ:
330117395Skan    case OPT_MT:
331117395Skan      deps_seen = true;
332117395Skan      defer_opt (code, arg);
333117395Skan      break;
334117395Skan
335117395Skan    case OPT_P:
336132718Skan      flag_no_line_commands = 1;
337117395Skan      break;
338117395Skan
339132718Skan    case OPT_fworking_directory:
340132718Skan      flag_working_directory = value;
341132718Skan      break;
342132718Skan
343132718Skan    case OPT_U:
344132718Skan      defer_opt (code, arg);
345132718Skan      break;
346132718Skan
347117395Skan    case OPT_Wabi:
348132718Skan      warn_abi = value;
349117395Skan      break;
350117395Skan
351117395Skan    case OPT_Wall:
352132718Skan      set_Wunused (value);
353132718Skan      set_Wformat (value);
354132718Skan      set_Wimplicit (value);
355132718Skan      warn_char_subscripts = value;
356132718Skan      warn_missing_braces = value;
357132718Skan      warn_parentheses = value;
358132718Skan      warn_return_type = value;
359132718Skan      warn_sequence_point = value;	/* Was C only.  */
360132718Skan      if (c_dialect_cxx ())
361132718Skan	warn_sign_compare = value;
362132718Skan      warn_switch = value;
363132718Skan      warn_strict_aliasing = value;
364132718Skan
365117395Skan      /* Only warn about unknown pragmas that are not in system
366132718Skan	 headers.  */
367132718Skan      warn_unknown_pragmas = value;
368117395Skan
369117395Skan      /* We save the value of warn_uninitialized, since if they put
370117395Skan	 -Wuninitialized on the command line, we need to generate a
371117395Skan	 warning about not using it without also specifying -O.  */
372117395Skan      if (warn_uninitialized != 1)
373132718Skan	warn_uninitialized = (value ? 2 : 0);
374117395Skan
375132718Skan      if (!c_dialect_cxx ())
376117395Skan	/* We set this to 2 here, but 1 in -Wmain, so -ffreestanding
377117395Skan	   can turn it off only if it's not explicit.  */
378132718Skan	warn_main = value * 2;
379117395Skan      else
380117395Skan	{
381117395Skan	  /* C++-specific warnings.  */
382132718Skan	  warn_nonvdtor = value;
383132718Skan	  warn_reorder = value;
384132718Skan	  warn_nontemplate_friend = value;
385117395Skan	}
386117395Skan
387132718Skan      cpp_opts->warn_trigraphs = value;
388132718Skan      cpp_opts->warn_comments = value;
389132718Skan      cpp_opts->warn_num_sign_change = value;
390132718Skan      cpp_opts->warn_multichar = value;	/* Was C++ only.  */
391117395Skan      break;
392117395Skan
393117395Skan    case OPT_Wbad_function_cast:
394132718Skan      warn_bad_function_cast = value;
395117395Skan      break;
396117395Skan
397117395Skan    case OPT_Wcast_qual:
398132718Skan      warn_cast_qual = value;
399117395Skan      break;
400117395Skan
401117395Skan    case OPT_Wchar_subscripts:
402132718Skan      warn_char_subscripts = value;
403117395Skan      break;
404117395Skan
405117395Skan    case OPT_Wcomment:
406117395Skan    case OPT_Wcomments:
407132718Skan      cpp_opts->warn_comments = value;
408117395Skan      break;
409117395Skan
410117395Skan    case OPT_Wconversion:
411132718Skan      warn_conversion = value;
412117395Skan      break;
413117395Skan
414117395Skan    case OPT_Wctor_dtor_privacy:
415132718Skan      warn_ctor_dtor_privacy = value;
416117395Skan      break;
417117395Skan
418132718Skan    case OPT_Wdeclaration_after_statement:
419132718Skan      warn_declaration_after_statement = value;
420132718Skan      break;
421132718Skan
422117395Skan    case OPT_Wdeprecated:
423132718Skan      warn_deprecated = value;
424132718Skan      cpp_opts->warn_deprecated = value;
425117395Skan      break;
426117395Skan
427117395Skan    case OPT_Wdiv_by_zero:
428132718Skan      warn_div_by_zero = value;
429117395Skan      break;
430117395Skan
431132718Skan    case OPT_Weffc__:
432132718Skan      warn_ecpp = value;
433117395Skan      break;
434117395Skan
435117395Skan    case OPT_Wendif_labels:
436132718Skan      cpp_opts->warn_endif_labels = value;
437117395Skan      break;
438117395Skan
439117395Skan    case OPT_Werror:
440132718Skan      cpp_opts->warnings_are_errors = value;
441117395Skan      break;
442117395Skan
443132718Skan    case OPT_Werror_implicit_function_declaration:
444132718Skan      mesg_implicit_function_declaration = 2;
445117395Skan      break;
446117395Skan
447117395Skan    case OPT_Wfloat_equal:
448132718Skan      warn_float_equal = value;
449117395Skan      break;
450117395Skan
451117395Skan    case OPT_Wformat:
452132718Skan      set_Wformat (value);
453117395Skan      break;
454117395Skan
455132718Skan    case OPT_Wformat_:
456117395Skan      set_Wformat (atoi (arg));
457117395Skan      break;
458117395Skan
459117395Skan    case OPT_Wformat_extra_args:
460132718Skan      warn_format_extra_args = value;
461117395Skan      break;
462117395Skan
463117395Skan    case OPT_Wformat_nonliteral:
464132718Skan      warn_format_nonliteral = value;
465117395Skan      break;
466117395Skan
467117395Skan    case OPT_Wformat_security:
468132718Skan      warn_format_security = value;
469117395Skan      break;
470117395Skan
471117395Skan    case OPT_Wformat_y2k:
472132718Skan      warn_format_y2k = value;
473117395Skan      break;
474117395Skan
475117395Skan    case OPT_Wformat_zero_length:
476132718Skan      warn_format_zero_length = value;
477117395Skan      break;
478117395Skan
479132718Skan    case OPT_Winit_self:
480132718Skan      warn_init_self = value;
481132718Skan      break;
482132718Skan
483117395Skan    case OPT_Wimplicit:
484132718Skan      set_Wimplicit (value);
485117395Skan      break;
486117395Skan
487132718Skan    case OPT_Wimplicit_function_declaration:
488132718Skan      mesg_implicit_function_declaration = value;
489117395Skan      break;
490117395Skan
491117395Skan    case OPT_Wimplicit_int:
492132718Skan      warn_implicit_int = value;
493117395Skan      break;
494117395Skan
495117395Skan    case OPT_Wimport:
496132718Skan      /* Silently ignore for now.  */
497117395Skan      break;
498117395Skan
499132718Skan    case OPT_Winvalid_offsetof:
500132718Skan      warn_invalid_offsetof = value;
501132718Skan      break;
502132718Skan
503132718Skan    case OPT_Winvalid_pch:
504132718Skan      cpp_opts->warn_invalid_pch = value;
505132718Skan      break;
506132718Skan
507117395Skan    case OPT_Wlong_long:
508132718Skan      warn_long_long = value;
509117395Skan      break;
510117395Skan
511117395Skan    case OPT_Wmain:
512132718Skan      if (value)
513117395Skan	warn_main = 1;
514117395Skan      else
515117395Skan	warn_main = -1;
516117395Skan      break;
517117395Skan
518117395Skan    case OPT_Wmissing_braces:
519132718Skan      warn_missing_braces = value;
520117395Skan      break;
521117395Skan
522117395Skan    case OPT_Wmissing_declarations:
523132718Skan      warn_missing_declarations = value;
524117395Skan      break;
525117395Skan
526117395Skan    case OPT_Wmissing_format_attribute:
527132718Skan      warn_missing_format_attribute = value;
528117395Skan      break;
529117395Skan
530117395Skan    case OPT_Wmissing_prototypes:
531132718Skan      warn_missing_prototypes = value;
532117395Skan      break;
533117395Skan
534117395Skan    case OPT_Wmultichar:
535132718Skan      cpp_opts->warn_multichar = value;
536117395Skan      break;
537117395Skan
538117395Skan    case OPT_Wnested_externs:
539132718Skan      warn_nested_externs = value;
540117395Skan      break;
541117395Skan
542117395Skan    case OPT_Wnon_template_friend:
543132718Skan      warn_nontemplate_friend = value;
544117395Skan      break;
545117395Skan
546117395Skan    case OPT_Wnon_virtual_dtor:
547132718Skan      warn_nonvdtor = value;
548117395Skan      break;
549117395Skan
550117395Skan    case OPT_Wnonnull:
551132718Skan      warn_nonnull = value;
552117395Skan      break;
553117395Skan
554132718Skan    case OPT_Wold_style_definition:
555132718Skan      warn_old_style_definition = value;
556132718Skan      break;
557132718Skan
558117395Skan    case OPT_Wold_style_cast:
559132718Skan      warn_old_style_cast = value;
560117395Skan      break;
561117395Skan
562117395Skan    case OPT_Woverloaded_virtual:
563132718Skan      warn_overloaded_virtual = value;
564117395Skan      break;
565117395Skan
566117395Skan    case OPT_Wparentheses:
567132718Skan      warn_parentheses = value;
568117395Skan      break;
569117395Skan
570117395Skan    case OPT_Wpmf_conversions:
571132718Skan      warn_pmf2ptr = value;
572117395Skan      break;
573117395Skan
574117395Skan    case OPT_Wpointer_arith:
575132718Skan      warn_pointer_arith = value;
576117395Skan      break;
577117395Skan
578117395Skan    case OPT_Wprotocol:
579132718Skan      warn_protocol = value;
580117395Skan      break;
581117395Skan
582117395Skan    case OPT_Wselector:
583132718Skan      warn_selector = value;
584117395Skan      break;
585117395Skan
586117395Skan    case OPT_Wredundant_decls:
587132718Skan      warn_redundant_decls = value;
588117395Skan      break;
589117395Skan
590117395Skan    case OPT_Wreorder:
591132718Skan      warn_reorder = value;
592117395Skan      break;
593117395Skan
594117395Skan    case OPT_Wreturn_type:
595132718Skan      warn_return_type = value;
596117395Skan      break;
597117395Skan
598117395Skan    case OPT_Wsequence_point:
599132718Skan      warn_sequence_point = value;
600117395Skan      break;
601117395Skan
602117395Skan    case OPT_Wsign_compare:
603132718Skan      warn_sign_compare = value;
604117395Skan      break;
605117395Skan
606117395Skan    case OPT_Wsign_promo:
607132718Skan      warn_sign_promo = value;
608117395Skan      break;
609117395Skan
610117395Skan    case OPT_Wstrict_prototypes:
611132718Skan      warn_strict_prototypes = value;
612117395Skan      break;
613117395Skan
614117395Skan    case OPT_Wsynth:
615132718Skan      warn_synth = value;
616117395Skan      break;
617117395Skan
618117395Skan    case OPT_Wsystem_headers:
619132718Skan      cpp_opts->warn_system_headers = value;
620117395Skan      break;
621117395Skan
622117395Skan    case OPT_Wtraditional:
623132718Skan      warn_traditional = value;
624132718Skan      cpp_opts->warn_traditional = value;
625117395Skan      break;
626117395Skan
627117395Skan    case OPT_Wtrigraphs:
628132718Skan      cpp_opts->warn_trigraphs = value;
629117395Skan      break;
630117395Skan
631117395Skan    case OPT_Wundeclared_selector:
632132718Skan      warn_undeclared_selector = value;
633117395Skan      break;
634117395Skan
635117395Skan    case OPT_Wundef:
636132718Skan      cpp_opts->warn_undef = value;
637117395Skan      break;
638117395Skan
639117395Skan    case OPT_Wunknown_pragmas:
640117395Skan      /* Set to greater than 1, so that even unknown pragmas in
641132718Skan	 system headers will be warned about.  */
642132718Skan      warn_unknown_pragmas = value * 2;
643117395Skan      break;
644117395Skan
645117395Skan    case OPT_Wunused_macros:
646132718Skan      warn_unused_macros = value;
647117395Skan      break;
648117395Skan
649117395Skan    case OPT_Wwrite_strings:
650132718Skan      if (!c_dialect_cxx ())
651132718Skan	flag_const_strings = value;
652117395Skan      else
653132718Skan	warn_write_strings = value;
654117395Skan      break;
655132718Skan
656117395Skan    case OPT_ansi:
657132718Skan      if (!c_dialect_cxx ())
658117395Skan	set_std_c89 (false, true);
659117395Skan      else
660117395Skan	set_std_cxx98 (true);
661117395Skan      break;
662117395Skan
663117395Skan    case OPT_d:
664117395Skan      handle_OPT_d (arg);
665117395Skan      break;
666117395Skan
667117395Skan    case OPT_fcond_mismatch:
668132718Skan      if (!c_dialect_cxx ())
669117395Skan	{
670132718Skan	  flag_cond_mismatch = value;
671117395Skan	  break;
672117395Skan	}
673117395Skan      /* Fall through.  */
674117395Skan
675117395Skan    case OPT_fall_virtual:
676132718Skan    case OPT_falt_external_templates:
677117395Skan    case OPT_fenum_int_equiv:
678132718Skan    case OPT_fexternal_templates:
679117395Skan    case OPT_fguiding_decls:
680117395Skan    case OPT_fhonor_std:
681117395Skan    case OPT_fhuge_objects:
682117395Skan    case OPT_flabels_ok:
683132718Skan    case OPT_fname_mangling_version_:
684117395Skan    case OPT_fnew_abi:
685117395Skan    case OPT_fnonnull_objects:
686117395Skan    case OPT_fsquangle:
687117395Skan    case OPT_fstrict_prototype:
688117395Skan    case OPT_fthis_is_variable:
689117395Skan    case OPT_fvtable_thunks:
690117395Skan    case OPT_fxref:
691132718Skan    case OPT_fvtable_gc:
692132718Skan      warning ("switch \"%s\" is no longer supported", option->opt_text);
693117395Skan      break;
694117395Skan
695117395Skan    case OPT_faccess_control:
696132718Skan      flag_access_control = value;
697117395Skan      break;
698117395Skan
699117395Skan    case OPT_fasm:
700132718Skan      flag_no_asm = !value;
701117395Skan      break;
702117395Skan
703117395Skan    case OPT_fbuiltin:
704132718Skan      flag_no_builtin = !value;
705117395Skan      break;
706117395Skan
707117395Skan    case OPT_fbuiltin_:
708132718Skan      if (value)
709117395Skan	result = 0;
710117395Skan      else
711117395Skan	disable_builtin_function (arg);
712117395Skan      break;
713117395Skan
714117395Skan    case OPT_fdollars_in_identifiers:
715132718Skan      cpp_opts->dollars_in_ident = value;
716117395Skan      break;
717117395Skan
718132718Skan    case OPT_fdump_:
719132718Skan      if (!dump_switch_p (arg))
720117395Skan	result = 0;
721117395Skan      break;
722117395Skan
723117395Skan    case OPT_ffreestanding:
724132718Skan      value = !value;
725132718Skan      /* Fall through....  */
726117395Skan    case OPT_fhosted:
727132718Skan      flag_hosted = value;
728132718Skan      flag_no_builtin = !value;
729117395Skan      /* warn_main will be 2 if set by -Wall, 1 if set by -Wmain */
730132718Skan      if (!value && warn_main == 2)
731117395Skan	warn_main = 0;
732117395Skan      break;
733117395Skan
734117395Skan    case OPT_fshort_double:
735132718Skan      flag_short_double = value;
736117395Skan      break;
737117395Skan
738117395Skan    case OPT_fshort_enums:
739132718Skan      flag_short_enums = value;
740117395Skan      break;
741117395Skan
742117395Skan    case OPT_fshort_wchar:
743132718Skan      flag_short_wchar = value;
744117395Skan      break;
745117395Skan
746117395Skan    case OPT_fsigned_bitfields:
747132718Skan      flag_signed_bitfields = value;
748117395Skan      explicit_flag_signed_bitfields = 1;
749117395Skan      break;
750117395Skan
751117395Skan    case OPT_fsigned_char:
752132718Skan      flag_signed_char = value;
753117395Skan      break;
754117395Skan
755117395Skan    case OPT_funsigned_bitfields:
756132718Skan      flag_signed_bitfields = !value;
757117395Skan      explicit_flag_signed_bitfields = 1;
758117395Skan      break;
759117395Skan
760117395Skan    case OPT_funsigned_char:
761132718Skan      flag_signed_char = !value;
762117395Skan      break;
763117395Skan
764117395Skan    case OPT_fcheck_new:
765132718Skan      flag_check_new = value;
766117395Skan      break;
767117395Skan
768117395Skan    case OPT_fconserve_space:
769132718Skan      flag_conserve_space = value;
770117395Skan      break;
771117395Skan
772117395Skan    case OPT_fconst_strings:
773132718Skan      flag_const_strings = value;
774117395Skan      break;
775117395Skan
776132718Skan    case OPT_fconstant_string_class_:
777117395Skan      constant_string_class_name = arg;
778117395Skan      break;
779117395Skan
780117395Skan    case OPT_fdefault_inline:
781132718Skan      flag_default_inline = value;
782117395Skan      break;
783117395Skan
784117395Skan    case OPT_felide_constructors:
785132718Skan      flag_elide_constructors = value;
786117395Skan      break;
787117395Skan
788117395Skan    case OPT_fenforce_eh_specs:
789132718Skan      flag_enforce_eh_specs = value;
790117395Skan      break;
791117395Skan
792117395Skan    case OPT_ffixed_form:
793132718Skan    case OPT_ffixed_line_length_:
794117395Skan      /* Fortran front end options ignored when preprocessing only.  */
795132718Skan      if (!flag_preprocess_only)
796132718Skan        result = 0;
797117395Skan      break;
798117395Skan
799117395Skan    case OPT_ffor_scope:
800132718Skan      flag_new_for_scope = value;
801117395Skan      break;
802117395Skan
803117395Skan    case OPT_fgnu_keywords:
804132718Skan      flag_no_gnu_keywords = !value;
805117395Skan      break;
806117395Skan
807117395Skan    case OPT_fgnu_runtime:
808132718Skan      flag_next_runtime = !value;
809117395Skan      break;
810117395Skan
811117395Skan    case OPT_fhandle_exceptions:
812132718Skan      warning ("-fhandle-exceptions has been renamed -fexceptions (and is now on by default)");
813132718Skan      flag_exceptions = value;
814117395Skan      break;
815117395Skan
816117395Skan    case OPT_fimplement_inlines:
817132718Skan      flag_implement_inlines = value;
818117395Skan      break;
819117395Skan
820117395Skan    case OPT_fimplicit_inline_templates:
821132718Skan      flag_implicit_inline_templates = value;
822117395Skan      break;
823117395Skan
824117395Skan    case OPT_fimplicit_templates:
825132718Skan      flag_implicit_templates = value;
826117395Skan      break;
827117395Skan
828117395Skan    case OPT_fms_extensions:
829132718Skan      flag_ms_extensions = value;
830117395Skan      break;
831117395Skan
832117395Skan    case OPT_fnext_runtime:
833132718Skan      flag_next_runtime = value;
834117395Skan      break;
835117395Skan
836132718Skan    case OPT_fnil_receivers:
837132718Skan      flag_nil_receivers = value;
838132718Skan      break;
839132718Skan
840117395Skan    case OPT_fnonansi_builtins:
841132718Skan      flag_no_nonansi_builtin = !value;
842117395Skan      break;
843117395Skan
844132718Skan    case OPT_fobjc_exceptions:
845132718Skan      flag_objc_exceptions = value;
846132718Skan      break;
847132718Skan
848117395Skan    case OPT_foperator_names:
849132718Skan      cpp_opts->operator_names = value;
850117395Skan      break;
851117395Skan
852117395Skan    case OPT_foptional_diags:
853132718Skan      flag_optional_diags = value;
854117395Skan      break;
855117395Skan
856132718Skan    case OPT_fpch_deps:
857132718Skan      cpp_opts->restore_pch_deps = value;
858132718Skan      break;
859132718Skan
860117395Skan    case OPT_fpermissive:
861132718Skan      flag_permissive = value;
862117395Skan      break;
863117395Skan
864117395Skan    case OPT_fpreprocessed:
865132718Skan      cpp_opts->preprocessed = value;
866117395Skan      break;
867117395Skan
868132718Skan    case OPT_freplace_objc_classes:
869132718Skan      flag_replace_objc_classes = value;
870132718Skan      break;
871132718Skan
872117395Skan    case OPT_frepo:
873132718Skan      flag_use_repository = value;
874132718Skan      if (value)
875117395Skan	flag_implicit_templates = 0;
876117395Skan      break;
877117395Skan
878117395Skan    case OPT_frtti:
879132718Skan      flag_rtti = value;
880117395Skan      break;
881117395Skan
882117395Skan    case OPT_fshow_column:
883132718Skan      cpp_opts->show_column = value;
884117395Skan      break;
885117395Skan
886117395Skan    case OPT_fstats:
887132718Skan      flag_detailed_statistics = value;
888117395Skan      break;
889117395Skan
890132718Skan    case OPT_ftabstop_:
891117395Skan      /* It is documented that we silently ignore silly values.  */
892132718Skan      if (value >= 1 && value <= 100)
893132718Skan	cpp_opts->tabstop = value;
894117395Skan      break;
895117395Skan
896132718Skan    case OPT_fexec_charset_:
897132718Skan      cpp_opts->narrow_charset = arg;
898117395Skan      break;
899117395Skan
900132718Skan    case OPT_fwide_exec_charset_:
901132718Skan      cpp_opts->wide_charset = arg;
902117395Skan      break;
903117395Skan
904132718Skan    case OPT_finput_charset_:
905132718Skan      cpp_opts->input_charset = arg;
906132718Skan      break;
907132718Skan
908132718Skan    case OPT_ftemplate_depth_:
909132718Skan      max_tinst_depth = value;
910132718Skan      break;
911132718Skan
912117395Skan    case OPT_fuse_cxa_atexit:
913132718Skan      flag_use_cxa_atexit = value;
914117395Skan      break;
915117395Skan
916117395Skan    case OPT_fweak:
917132718Skan      flag_weak = value;
918117395Skan      break;
919117395Skan
920132718Skan    case OPT_fzero_link:
921132718Skan      flag_zero_link = value;
922132718Skan      break;
923132718Skan
924117395Skan    case OPT_gen_decls:
925117395Skan      flag_gen_declaration = 1;
926117395Skan      break;
927117395Skan
928132718Skan    case OPT_idirafter:
929132718Skan      add_path (xstrdup (arg), AFTER, 0);
930132718Skan      break;
931132718Skan
932132718Skan    case OPT_imacros:
933132718Skan    case OPT_include:
934132718Skan      defer_opt (code, arg);
935132718Skan      break;
936132718Skan
937132718Skan    case OPT_iprefix:
938132718Skan      iprefix = arg;
939132718Skan      break;
940132718Skan
941132718Skan    case OPT_isysroot:
942132718Skan      sysroot = arg;
943132718Skan      break;
944132718Skan
945132718Skan    case OPT_isystem:
946132718Skan      add_path (xstrdup (arg), SYSTEM, 0);
947132718Skan      break;
948132718Skan
949132718Skan    case OPT_iwithprefix:
950132718Skan      add_prefixed_path (arg, SYSTEM);
951132718Skan      break;
952132718Skan
953132718Skan    case OPT_iwithprefixbefore:
954132718Skan      add_prefixed_path (arg, BRACKET);
955132718Skan      break;
956132718Skan
957117395Skan    case OPT_lang_asm:
958117395Skan      cpp_set_lang (parse_in, CLK_ASM);
959132718Skan      cpp_opts->dollars_in_ident = false;
960117395Skan      break;
961117395Skan
962117395Skan    case OPT_lang_objc:
963117395Skan      cpp_opts->objc = 1;
964117395Skan      break;
965117395Skan
966117395Skan    case OPT_nostdinc:
967132718Skan      std_inc = false;
968117395Skan      break;
969117395Skan
970132718Skan    case OPT_nostdinc__:
971132718Skan      std_cxx_inc = false;
972117395Skan      break;
973117395Skan
974117395Skan    case OPT_o:
975117395Skan      if (!out_fname)
976117395Skan	out_fname = arg;
977117395Skan      else
978132718Skan	error ("output filename specified twice");
979117395Skan      break;
980117395Skan
981117395Skan      /* We need to handle the -pedantic switches here, rather than in
982117395Skan	 c_common_post_options, so that a subsequent -Wno-endif-labels
983117395Skan	 is not overridden.  */
984117395Skan    case OPT_pedantic_errors:
985117395Skan      cpp_opts->pedantic_errors = 1;
986132718Skan      /* Fall through.  */
987117395Skan    case OPT_pedantic:
988117395Skan      cpp_opts->pedantic = 1;
989117395Skan      cpp_opts->warn_endif_labels = 1;
990117395Skan      break;
991117395Skan
992117395Skan    case OPT_print_objc_runtime_info:
993117395Skan      print_struct_values = 1;
994117395Skan      break;
995117395Skan
996117395Skan    case OPT_remap:
997117395Skan      cpp_opts->remap = 1;
998117395Skan      break;
999117395Skan
1000132718Skan    case OPT_std_c__98:
1001132718Skan    case OPT_std_gnu__98:
1002132718Skan      set_std_cxx98 (code == OPT_std_c__98 /* ISO */);
1003117395Skan      break;
1004117395Skan
1005117395Skan    case OPT_std_c89:
1006117395Skan    case OPT_std_iso9899_1990:
1007117395Skan    case OPT_std_iso9899_199409:
1008117395Skan      set_std_c89 (code == OPT_std_iso9899_199409 /* c94 */, true /* ISO */);
1009117395Skan      break;
1010117395Skan
1011117395Skan    case OPT_std_gnu89:
1012117395Skan      set_std_c89 (false /* c94 */, false /* ISO */);
1013117395Skan      break;
1014117395Skan
1015117395Skan    case OPT_std_c99:
1016117395Skan    case OPT_std_c9x:
1017117395Skan    case OPT_std_iso9899_1999:
1018117395Skan    case OPT_std_iso9899_199x:
1019117395Skan      set_std_c99 (true /* ISO */);
1020117395Skan      break;
1021117395Skan
1022117395Skan    case OPT_std_gnu99:
1023117395Skan    case OPT_std_gnu9x:
1024117395Skan      set_std_c99 (false /* ISO */);
1025117395Skan      break;
1026117395Skan
1027117395Skan    case OPT_trigraphs:
1028117395Skan      cpp_opts->trigraphs = 1;
1029117395Skan      break;
1030117395Skan
1031117395Skan    case OPT_traditional_cpp:
1032117395Skan      cpp_opts->traditional = 1;
1033117395Skan      break;
1034117395Skan
1035117395Skan    case OPT_undef:
1036117395Skan      flag_undef = 1;
1037117395Skan      break;
1038117395Skan
1039117395Skan    case OPT_w:
1040117395Skan      cpp_opts->inhibit_warnings = 1;
1041117395Skan      break;
1042117395Skan
1043117395Skan    case OPT_v:
1044132718Skan      verbose = true;
1045117395Skan      break;
1046117395Skan    }
1047117395Skan
1048117395Skan  return result;
1049117395Skan}
1050117395Skan
1051117395Skan/* Post-switch processing.  */
1052117395Skanbool
1053132718Skanc_common_post_options (const char **pfilename)
1054117395Skan{
1055132718Skan  struct cpp_callbacks *cb;
1056132718Skan
1057117395Skan  /* Canonicalize the input and output filenames.  */
1058132718Skan  if (in_fnames == NULL)
1059132718Skan    {
1060132718Skan      in_fnames = xmalloc (sizeof (in_fnames[0]));
1061132718Skan      in_fnames[0] = "";
1062132718Skan    }
1063132718Skan  else if (strcmp (in_fnames[0], "-") == 0)
1064132718Skan    in_fnames[0] = "";
1065117395Skan
1066117395Skan  if (out_fname == NULL || !strcmp (out_fname, "-"))
1067117395Skan    out_fname = "";
1068117395Skan
1069117395Skan  if (cpp_opts->deps.style == DEPS_NONE)
1070117395Skan    check_deps_environment_vars ();
1071117395Skan
1072117395Skan  handle_deferred_opts ();
1073117395Skan
1074117395Skan  sanitize_cpp_opts ();
1075117395Skan
1076132718Skan  register_include_chains (parse_in, sysroot, iprefix,
1077132718Skan			   std_inc, std_cxx_inc && c_dialect_cxx (), verbose);
1078132718Skan
1079117395Skan  flag_inline_trees = 1;
1080117395Skan
1081117395Skan  /* Use tree inlining if possible.  Function instrumentation is only
1082117395Skan     done in the RTL level, so we disable tree inlining.  */
1083132718Skan  if (flag_instrument_function_entry_exit)
1084117395Skan    {
1085132718Skan      flag_no_inline = 1;
1086132718Skan      flag_really_no_inline = 1;
1087132718Skan    }
1088132718Skan  else
1089132718Skan    {
1090117395Skan      if (!flag_no_inline)
1091117395Skan	flag_no_inline = 1;
1092117395Skan      if (flag_inline_functions)
1093117395Skan	{
1094117395Skan	  flag_inline_trees = 2;
1095117395Skan	  flag_inline_functions = 0;
1096117395Skan	}
1097117395Skan    }
1098117395Skan
1099132718Skan  /* -Wextra implies -Wsign-compare, but not if explicitly
1100132718Skan      overridden.  */
1101132718Skan  if (warn_sign_compare == -1)
1102132718Skan    warn_sign_compare = extra_warnings;
1103132718Skan
1104117395Skan  /* Special format checking options don't work without -Wformat; warn if
1105117395Skan     they are used.  */
1106117395Skan  if (warn_format_y2k && !warn_format)
1107117395Skan    warning ("-Wformat-y2k ignored without -Wformat");
1108117395Skan  if (warn_format_extra_args && !warn_format)
1109117395Skan    warning ("-Wformat-extra-args ignored without -Wformat");
1110117395Skan  if (warn_format_zero_length && !warn_format)
1111117395Skan    warning ("-Wformat-zero-length ignored without -Wformat");
1112117395Skan  if (warn_format_nonliteral && !warn_format)
1113117395Skan    warning ("-Wformat-nonliteral ignored without -Wformat");
1114117395Skan  if (warn_format_security && !warn_format)
1115117395Skan    warning ("-Wformat-security ignored without -Wformat");
1116117395Skan  if (warn_missing_format_attribute && !warn_format)
1117117395Skan    warning ("-Wmissing-format-attribute ignored without -Wformat");
1118117395Skan
1119132718Skan  if (flag_preprocess_only)
1120132718Skan    {
1121132718Skan      /* Open the output now.  We must do so even if flag_no_output is
1122132718Skan	 on, because there may be other output than from the actual
1123132718Skan	 preprocessing (e.g. from -dM).  */
1124132718Skan      if (out_fname[0] == '\0')
1125132718Skan	out_stream = stdout;
1126132718Skan      else
1127132718Skan	out_stream = fopen (out_fname, "w");
1128132718Skan
1129132718Skan      if (out_stream == NULL)
1130132718Skan	{
1131132718Skan	  fatal_error ("opening output file %s: %m", out_fname);
1132132718Skan	  return false;
1133132718Skan	}
1134132718Skan
1135132718Skan      if (num_in_fnames > 1)
1136132718Skan	error ("too many filenames given.  Type %s --help for usage",
1137132718Skan	       progname);
1138132718Skan
1139132718Skan      init_pp_output (out_stream);
1140132718Skan    }
1141132718Skan  else
1142132718Skan    {
1143132718Skan      init_c_lex ();
1144132718Skan
1145132718Skan      /* Yuk.  WTF is this?  I do know ObjC relies on it somewhere.  */
1146132718Skan      input_line = 0;
1147132718Skan    }
1148132718Skan
1149132718Skan  cb = cpp_get_callbacks (parse_in);
1150132718Skan  cb->file_change = cb_file_change;
1151132718Skan  cb->dir_change = cb_dir_change;
1152132718Skan  cpp_post_options (parse_in);
1153132718Skan
1154132718Skan  saved_lineno = input_line;
1155132718Skan  input_line = 0;
1156132718Skan
1157117395Skan  /* If an error has occurred in cpplib, note it so we fail
1158117395Skan     immediately.  */
1159117395Skan  errorcount += cpp_errors (parse_in);
1160117395Skan
1161132718Skan  *pfilename = this_input_filename
1162132718Skan    = cpp_read_main_file (parse_in, in_fnames[0]);
1163132718Skan  if (this_input_filename == NULL)
1164132718Skan    return true;
1165117395Skan
1166132718Skan  if (flag_working_directory
1167132718Skan      && flag_preprocess_only && ! flag_no_line_commands)
1168132718Skan    pp_dir_change (parse_in, get_src_pwd ());
1169117395Skan
1170132718Skan  return flag_preprocess_only;
1171117395Skan}
1172117395Skan
1173117395Skan/* Front end initialization common to C, ObjC and C++.  */
1174132718Skanbool
1175132718Skanc_common_init (void)
1176117395Skan{
1177132718Skan  input_line = saved_lineno;
1178132718Skan
1179117395Skan  /* Set up preprocessor arithmetic.  Must be done after call to
1180117395Skan     c_common_nodes_and_builtins for type nodes to be good.  */
1181117395Skan  cpp_opts->precision = TYPE_PRECISION (intmax_type_node);
1182117395Skan  cpp_opts->char_precision = TYPE_PRECISION (char_type_node);
1183117395Skan  cpp_opts->int_precision = TYPE_PRECISION (integer_type_node);
1184117395Skan  cpp_opts->wchar_precision = TYPE_PRECISION (wchar_type_node);
1185117395Skan  cpp_opts->unsigned_wchar = TREE_UNSIGNED (wchar_type_node);
1186132718Skan  cpp_opts->bytes_big_endian = BYTES_BIG_ENDIAN;
1187117395Skan
1188132718Skan  /* This can't happen until after wchar_precision and bytes_big_endian
1189132718Skan     are known.  */
1190132718Skan  cpp_init_iconv (parse_in);
1191117395Skan
1192117395Skan  if (flag_preprocess_only)
1193117395Skan    {
1194132718Skan      finish_options ();
1195132718Skan      preprocess_file (parse_in);
1196132718Skan      return false;
1197117395Skan    }
1198117395Skan
1199132718Skan  /* Has to wait until now so that cpplib has its hash table.  */
1200117395Skan  init_pragma ();
1201117395Skan
1202132718Skan  return true;
1203117395Skan}
1204117395Skan
1205132718Skan/* Initialize the integrated preprocessor after debug output has been
1206132718Skan   initialized; loop over each input file.  */
1207132718Skanvoid
1208132718Skanc_common_parse_file (int set_yydebug ATTRIBUTE_UNUSED)
1209132718Skan{
1210132718Skan  unsigned file_index;
1211132718Skan
1212132718Skan#if YYDEBUG != 0
1213132718Skan  yydebug = set_yydebug;
1214132718Skan#else
1215132718Skan  warning ("YYDEBUG not defined");
1216132718Skan#endif
1217132718Skan
1218132718Skan  file_index = 0;
1219132718Skan
1220132718Skan  do
1221132718Skan    {
1222132718Skan      if (file_index > 0)
1223132718Skan	{
1224132718Skan	  /* Reset the state of the parser.  */
1225132718Skan	  c_reset_state();
1226132718Skan
1227132718Skan	  /* Reset cpplib's macros and start a new file.  */
1228132718Skan	  cpp_undef_all (parse_in);
1229132718Skan	  main_input_filename = this_input_filename
1230132718Skan	    = cpp_read_main_file (parse_in, in_fnames[file_index]);
1231132718Skan	  if (this_input_filename == NULL)
1232132718Skan	    break;
1233132718Skan	}
1234132718Skan      finish_options ();
1235132718Skan      if (file_index == 0)
1236132718Skan	pch_init();
1237132718Skan      c_parse_file ();
1238132718Skan
1239132718Skan      file_index++;
1240132718Skan    } while (file_index < num_in_fnames);
1241132718Skan
1242132718Skan  finish_file ();
1243132718Skan}
1244132718Skan
1245117395Skan/* Common finish hook for the C, ObjC and C++ front ends.  */
1246117395Skanvoid
1247132718Skanc_common_finish (void)
1248117395Skan{
1249117395Skan  FILE *deps_stream = NULL;
1250117395Skan
1251117395Skan  if (cpp_opts->deps.style != DEPS_NONE)
1252117395Skan    {
1253117395Skan      /* If -M or -MM was seen without -MF, default output to the
1254117395Skan	 output stream.  */
1255117395Skan      if (!deps_file)
1256117395Skan	deps_stream = out_stream;
1257117395Skan      else
1258117395Skan	{
1259117395Skan	  deps_stream = fopen (deps_file, deps_append ? "a": "w");
1260117395Skan	  if (!deps_stream)
1261132718Skan	    fatal_error ("opening dependency file %s: %m", deps_file);
1262117395Skan	}
1263117395Skan    }
1264117395Skan
1265117395Skan  /* For performance, avoid tearing down cpplib's internal structures
1266117395Skan     with cpp_destroy ().  */
1267117395Skan  errorcount += cpp_finish (parse_in, deps_stream);
1268117395Skan
1269117395Skan  if (deps_stream && deps_stream != out_stream
1270117395Skan      && (ferror (deps_stream) || fclose (deps_stream)))
1271132718Skan    fatal_error ("closing dependency file %s: %m", deps_file);
1272117395Skan
1273117395Skan  if (out_stream && (ferror (out_stream) || fclose (out_stream)))
1274132718Skan    fatal_error ("when writing output to %s: %m", out_fname);
1275117395Skan}
1276117395Skan
1277117395Skan/* Either of two environment variables can specify output of
1278117395Skan   dependencies.  Their value is either "OUTPUT_FILE" or "OUTPUT_FILE
1279117395Skan   DEPS_TARGET", where OUTPUT_FILE is the file to write deps info to
1280117395Skan   and DEPS_TARGET is the target to mention in the deps.  They also
1281117395Skan   result in dependency information being appended to the output file
1282117395Skan   rather than overwriting it, and like Sun's compiler
1283117395Skan   SUNPRO_DEPENDENCIES suppresses the dependency on the main file.  */
1284117395Skanstatic void
1285132718Skancheck_deps_environment_vars (void)
1286117395Skan{
1287117395Skan  char *spec;
1288117395Skan
1289117395Skan  GET_ENVIRONMENT (spec, "DEPENDENCIES_OUTPUT");
1290117395Skan  if (spec)
1291117395Skan    cpp_opts->deps.style = DEPS_USER;
1292117395Skan  else
1293117395Skan    {
1294117395Skan      GET_ENVIRONMENT (spec, "SUNPRO_DEPENDENCIES");
1295117395Skan      if (spec)
1296117395Skan	{
1297117395Skan	  cpp_opts->deps.style = DEPS_SYSTEM;
1298117395Skan	  cpp_opts->deps.ignore_main_file = true;
1299117395Skan	}
1300117395Skan    }
1301117395Skan
1302117395Skan  if (spec)
1303117395Skan    {
1304117395Skan      /* Find the space before the DEPS_TARGET, if there is one.  */
1305117395Skan      char *s = strchr (spec, ' ');
1306117395Skan      if (s)
1307117395Skan	{
1308117395Skan	  /* Let the caller perform MAKE quoting.  */
1309117395Skan	  defer_opt (OPT_MT, s + 1);
1310117395Skan	  *s = '\0';
1311117395Skan	}
1312117395Skan
1313117395Skan      /* Command line -MF overrides environment variables and default.  */
1314117395Skan      if (!deps_file)
1315117395Skan	deps_file = spec;
1316117395Skan
1317117395Skan      deps_append = 1;
1318117395Skan    }
1319117395Skan}
1320117395Skan
1321117395Skan/* Handle deferred command line switches.  */
1322117395Skanstatic void
1323132718Skanhandle_deferred_opts (void)
1324117395Skan{
1325117395Skan  size_t i;
1326117395Skan
1327117395Skan  for (i = 0; i < deferred_count; i++)
1328117395Skan    {
1329117395Skan      struct deferred_opt *opt = &deferred_opts[i];
1330117395Skan
1331132718Skan      if (opt->code == OPT_MT || opt->code == OPT_MQ)
1332132718Skan	cpp_add_dependency_target (parse_in, opt->arg, opt->code == OPT_MQ);
1333117395Skan    }
1334117395Skan}
1335117395Skan
1336117395Skan/* These settings are appropriate for GCC, but not necessarily so for
1337117395Skan   cpplib as a library.  */
1338117395Skanstatic void
1339132718Skansanitize_cpp_opts (void)
1340117395Skan{
1341117395Skan  /* If we don't know what style of dependencies to output, complain
1342117395Skan     if any other dependency switches have been given.  */
1343117395Skan  if (deps_seen && cpp_opts->deps.style == DEPS_NONE)
1344117395Skan    error ("to generate dependencies you must specify either -M or -MM");
1345117395Skan
1346117395Skan  /* -dM and dependencies suppress normal output; do it here so that
1347117395Skan     the last -d[MDN] switch overrides earlier ones.  */
1348132718Skan  if (flag_dump_macros == 'M')
1349132718Skan    flag_no_output = 1;
1350117395Skan
1351117395Skan  /* Disable -dD, -dN and -dI if normal output is suppressed.  Allow
1352117395Skan     -dM since at least glibc relies on -M -dM to work.  */
1353132718Skan  if (flag_no_output)
1354117395Skan    {
1355132718Skan      if (flag_dump_macros != 'M')
1356132718Skan	flag_dump_macros = 0;
1357132718Skan      flag_dump_includes = 0;
1358117395Skan    }
1359117395Skan
1360117395Skan  cpp_opts->unsigned_char = !flag_signed_char;
1361117395Skan  cpp_opts->stdc_0_in_system_headers = STDC_0_IN_SYSTEM_HEADERS;
1362117395Skan
1363117395Skan  /* We want -Wno-long-long to override -pedantic -std=non-c99
1364117395Skan     and/or -Wtraditional, whatever the ordering.  */
1365117395Skan  cpp_opts->warn_long_long
1366117395Skan    = warn_long_long && ((!flag_isoc99 && pedantic) || warn_traditional);
1367132718Skan
1368132718Skan  /* If we're generating preprocessor output, emit current directory
1369132718Skan     if explicitly requested or if debugging information is enabled.
1370132718Skan     ??? Maybe we should only do it for debugging formats that
1371132718Skan     actually output the current directory?  */
1372132718Skan  if (flag_working_directory == -1)
1373132718Skan    flag_working_directory = (debug_info_level != DINFO_LEVEL_NONE);
1374117395Skan}
1375117395Skan
1376132718Skan/* Add include path with a prefix at the front of its name.  */
1377132718Skanstatic void
1378132718Skanadd_prefixed_path (const char *suffix, size_t chain)
1379132718Skan{
1380132718Skan  char *path;
1381132718Skan  const char *prefix;
1382132718Skan  size_t prefix_len, suffix_len;
1383132718Skan
1384132718Skan  suffix_len = strlen (suffix);
1385132718Skan  prefix     = iprefix ? iprefix : cpp_GCC_INCLUDE_DIR;
1386132718Skan  prefix_len = iprefix ? strlen (iprefix) : cpp_GCC_INCLUDE_DIR_len;
1387132718Skan
1388132718Skan  path = xmalloc (prefix_len + suffix_len + 1);
1389132718Skan  memcpy (path, prefix, prefix_len);
1390132718Skan  memcpy (path + prefix_len, suffix, suffix_len);
1391132718Skan  path[prefix_len + suffix_len] = '\0';
1392132718Skan
1393132718Skan  add_path (path, chain, 0);
1394132718Skan}
1395132718Skan
1396132718Skan/* Handle -D, -U, -A, -imacros, and the first -include.  */
1397132718Skanstatic void
1398132718Skanfinish_options (void)
1399132718Skan{
1400132718Skan  if (!cpp_opts->preprocessed)
1401132718Skan    {
1402132718Skan      size_t i;
1403132718Skan
1404132718Skan      cpp_change_file (parse_in, LC_RENAME, _("<built-in>"));
1405132718Skan      cpp_init_builtins (parse_in, flag_hosted);
1406132718Skan      c_cpp_builtins (parse_in);
1407132718Skan
1408132718Skan      /* We're about to send user input to cpplib, so make it warn for
1409132718Skan	 things that we previously (when we sent it internal definitions)
1410132718Skan	 told it to not warn.
1411132718Skan
1412132718Skan	 C99 permits implementation-defined characters in identifiers.
1413132718Skan	 The documented meaning of -std= is to turn off extensions that
1414132718Skan	 conflict with the specified standard, and since a strictly
1415132718Skan	 conforming program cannot contain a '$', we do not condition
1416132718Skan	 their acceptance on the -std= setting.  */
1417132718Skan      cpp_opts->warn_dollars = (cpp_opts->pedantic && !cpp_opts->c99);
1418132718Skan
1419132718Skan      cpp_change_file (parse_in, LC_RENAME, _("<command line>"));
1420132718Skan      for (i = 0; i < deferred_count; i++)
1421132718Skan	{
1422132718Skan	  struct deferred_opt *opt = &deferred_opts[i];
1423132718Skan
1424132718Skan	  if (opt->code == OPT_D)
1425132718Skan	    cpp_define (parse_in, opt->arg);
1426132718Skan	  else if (opt->code == OPT_U)
1427132718Skan	    cpp_undef (parse_in, opt->arg);
1428132718Skan	  else if (opt->code == OPT_A)
1429132718Skan	    {
1430132718Skan	      if (opt->arg[0] == '-')
1431132718Skan		cpp_unassert (parse_in, opt->arg + 1);
1432132718Skan	      else
1433132718Skan		cpp_assert (parse_in, opt->arg);
1434132718Skan	    }
1435132718Skan	}
1436132718Skan
1437132718Skan      /* Handle -imacros after -D and -U.  */
1438132718Skan      for (i = 0; i < deferred_count; i++)
1439132718Skan	{
1440132718Skan	  struct deferred_opt *opt = &deferred_opts[i];
1441132718Skan
1442132718Skan	  if (opt->code == OPT_imacros
1443132718Skan	      && cpp_push_include (parse_in, opt->arg))
1444132718Skan	    {
1445132718Skan	      /* Disable push_command_line_include callback for now.  */
1446132718Skan	      include_cursor = deferred_count + 1;
1447132718Skan	      cpp_scan_nooutput (parse_in);
1448132718Skan	    }
1449132718Skan	}
1450132718Skan    }
1451132718Skan
1452132718Skan  include_cursor = 0;
1453132718Skan  push_command_line_include ();
1454132718Skan}
1455132718Skan
1456132718Skan/* Give CPP the next file given by -include, if any.  */
1457132718Skanstatic void
1458132718Skanpush_command_line_include (void)
1459132718Skan{
1460132718Skan  while (include_cursor < deferred_count)
1461132718Skan    {
1462132718Skan      struct deferred_opt *opt = &deferred_opts[include_cursor++];
1463132718Skan
1464132718Skan      if (! cpp_opts->preprocessed && opt->code == OPT_include
1465132718Skan	  && cpp_push_include (parse_in, opt->arg))
1466132718Skan	return;
1467132718Skan    }
1468132718Skan
1469132718Skan  if (include_cursor == deferred_count)
1470132718Skan    {
1471132718Skan      include_cursor++;
1472132718Skan      /* -Wunused-macros should only warn about macros defined hereafter.  */
1473132718Skan      cpp_opts->warn_unused_macros = warn_unused_macros;
1474132718Skan      /* Restore the line map from <command line>.  */
1475132718Skan      if (! cpp_opts->preprocessed)
1476132718Skan	cpp_change_file (parse_in, LC_RENAME, main_input_filename);
1477132718Skan
1478132718Skan      /* Set this here so the client can change the option if it wishes,
1479132718Skan	 and after stacking the main file so we don't trace the main file.  */
1480132718Skan      cpp_get_line_maps (parse_in)->trace_includes
1481132718Skan	= cpp_opts->print_include_names;
1482132718Skan    }
1483132718Skan}
1484132718Skan
1485132718Skan/* File change callback.  Has to handle -include files.  */
1486132718Skanstatic void
1487132718Skancb_file_change (cpp_reader *pfile ATTRIBUTE_UNUSED,
1488132718Skan		const struct line_map *new_map)
1489132718Skan{
1490132718Skan  if (flag_preprocess_only)
1491132718Skan    pp_file_change (new_map);
1492132718Skan  else
1493132718Skan    fe_file_change (new_map);
1494132718Skan
1495132718Skan  if (new_map == 0 || (new_map->reason == LC_LEAVE && MAIN_FILE_P (new_map)))
1496132718Skan    push_command_line_include ();
1497132718Skan}
1498132718Skan
1499132718Skanvoid
1500132718Skancb_dir_change (cpp_reader *pfile ATTRIBUTE_UNUSED, const char *dir)
1501132718Skan{
1502132718Skan  if (! set_src_pwd (dir))
1503132718Skan    warning ("too late for # directive to set debug directory");
1504132718Skan}
1505132718Skan
1506117395Skan/* Set the C 89 standard (with 1994 amendments if C94, without GNU
1507117395Skan   extensions if ISO).  There is no concept of gnu94.  */
1508117395Skanstatic void
1509132718Skanset_std_c89 (int c94, int iso)
1510117395Skan{
1511117395Skan  cpp_set_lang (parse_in, c94 ? CLK_STDC94: iso ? CLK_STDC89: CLK_GNUC89);
1512117395Skan  flag_iso = iso;
1513117395Skan  flag_no_asm = iso;
1514117395Skan  flag_no_gnu_keywords = iso;
1515117395Skan  flag_no_nonansi_builtin = iso;
1516117395Skan  flag_isoc94 = c94;
1517117395Skan  flag_isoc99 = 0;
1518117395Skan  flag_writable_strings = 0;
1519117395Skan}
1520117395Skan
1521117395Skan/* Set the C 99 standard (without GNU extensions if ISO).  */
1522117395Skanstatic void
1523132718Skanset_std_c99 (int iso)
1524117395Skan{
1525117395Skan  cpp_set_lang (parse_in, iso ? CLK_STDC99: CLK_GNUC99);
1526117395Skan  flag_no_asm = iso;
1527117395Skan  flag_no_nonansi_builtin = iso;
1528117395Skan  flag_iso = iso;
1529117395Skan  flag_isoc99 = 1;
1530117395Skan  flag_isoc94 = 1;
1531117395Skan  flag_writable_strings = 0;
1532117395Skan}
1533117395Skan
1534117395Skan/* Set the C++ 98 standard (without GNU extensions if ISO).  */
1535117395Skanstatic void
1536132718Skanset_std_cxx98 (int iso)
1537117395Skan{
1538117395Skan  cpp_set_lang (parse_in, iso ? CLK_CXX98: CLK_GNUCXX);
1539117395Skan  flag_no_gnu_keywords = iso;
1540117395Skan  flag_no_nonansi_builtin = iso;
1541117395Skan  flag_iso = iso;
1542117395Skan}
1543117395Skan
1544117395Skan/* Handle setting implicit to ON.  */
1545117395Skanstatic void
1546132718Skanset_Wimplicit (int on)
1547117395Skan{
1548117395Skan  warn_implicit = on;
1549117395Skan  warn_implicit_int = on;
1550117395Skan  if (on)
1551117395Skan    {
1552117395Skan      if (mesg_implicit_function_declaration != 2)
1553117395Skan	mesg_implicit_function_declaration = 1;
1554117395Skan    }
1555117395Skan  else
1556117395Skan    mesg_implicit_function_declaration = 0;
1557117395Skan}
1558117395Skan
1559117395Skan/* Args to -d specify what to dump.  Silently ignore
1560117395Skan   unrecognized options; they may be aimed at toplev.c.  */
1561117395Skanstatic void
1562132718Skanhandle_OPT_d (const char *arg)
1563117395Skan{
1564117395Skan  char c;
1565117395Skan
1566117395Skan  while ((c = *arg++) != '\0')
1567117395Skan    switch (c)
1568117395Skan      {
1569132718Skan      case 'M':			/* Dump macros only.  */
1570132718Skan      case 'N':			/* Dump names.  */
1571132718Skan      case 'D':			/* Dump definitions.  */
1572132718Skan	flag_dump_macros = c;
1573117395Skan	break;
1574117395Skan
1575117395Skan      case 'I':
1576132718Skan	flag_dump_includes = 1;
1577117395Skan	break;
1578117395Skan      }
1579117395Skan}
1580