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