00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "config.h"
00024 #include "system.h"
00025 #include "coretypes.h"
00026 #include "tm.h"
00027 #include "tree.h"
00028 #include "c-common.h"
00029 #include "c-pragma.h"
00030 #include "flags.h"
00031 #include "toplev.h"
00032 #include "langhooks.h"
00033 #include "tree-inline.h"
00034 #include "diagnostic.h"
00035 #include "intl.h"
00036 #include "cppdefault.h"
00037 #include "c-incpath.h"
00038 #include "debug.h"
00039 #include "opts.h"
00040 #include "options.h"
00041 #include "mkdeps.h"
00042
00043 #ifndef DOLLARS_IN_IDENTIFIERS
00044 # define DOLLARS_IN_IDENTIFIERS true
00045 #endif
00046
00047 #ifndef TARGET_SYSTEM_ROOT
00048 # define TARGET_SYSTEM_ROOT NULL
00049 #endif
00050
00051 #ifndef TARGET_OPTF
00052 #define TARGET_OPTF(ARG)
00053 #endif
00054
00055
00056 static cpp_options *cpp_opts;
00057
00058
00059 static const char *this_input_filename;
00060
00061
00062 static const char *out_fname;
00063 static FILE *out_stream;
00064
00065
00066 static bool deps_append;
00067
00068
00069 static bool deps_seen;
00070
00071
00072 static bool verbose;
00073
00074
00075 static bool lang_fortran = false;
00076
00077
00078 static const char *deps_file;
00079
00080
00081 static const char *iprefix;
00082
00083
00084 static const char *imultilib;
00085
00086
00087 static const char *sysroot = TARGET_SYSTEM_ROOT;
00088
00089
00090 static bool std_inc = true;
00091
00092
00093 static bool std_cxx_inc = true;
00094
00095
00096 static bool quote_chain_split;
00097
00098
00099 static bool warn_unused_macros;
00100
00101
00102 static bool warn_variadic_macros = true;
00103
00104
00105 static size_t deferred_count;
00106
00107
00108 static size_t include_cursor;
00109
00110 static void set_Wimplicit (int);
00111 static void handle_OPT_d (const char *);
00112 static void set_std_cxx98 (int);
00113 static void set_std_c89 (int, int);
00114 static void set_std_c99 (int);
00115 static void check_deps_environment_vars (void);
00116 static void handle_deferred_opts (void);
00117 static void sanitize_cpp_opts (void);
00118 static void add_prefixed_path (const char *, size_t);
00119 static void push_command_line_include (void);
00120 static void cb_file_change (cpp_reader *, const struct line_map *);
00121 static void cb_dir_change (cpp_reader *, const char *);
00122 static void finish_options (void);
00123
00124 #ifndef STDC_0_IN_SYSTEM_HEADERS
00125 #define STDC_0_IN_SYSTEM_HEADERS 0
00126 #endif
00127
00128
00129
00130 static void defer_opt (enum opt_code, const char *);
00131 static struct deferred_opt
00132 {
00133 enum opt_code code;
00134 const char *arg;
00135 } *deferred_opts;
00136
00137
00138
00139
00140
00141 bool
00142 c_common_missing_argument (const char *opt, size_t code)
00143 {
00144 switch (code)
00145 {
00146 default:
00147
00148 return false;
00149
00150 case OPT_fconstant_string_class_:
00151 error ("no class name specified with %qs", opt);
00152 break;
00153
00154 case OPT_A:
00155 error ("assertion missing after %qs", opt);
00156 break;
00157
00158 case OPT_D:
00159 case OPT_U:
00160 error ("macro name missing after %qs", opt);
00161 break;
00162
00163 case OPT_F:
00164 case OPT_I:
00165 case OPT_idirafter:
00166 case OPT_isysroot:
00167 case OPT_isystem:
00168 case OPT_iquote:
00169 error ("missing path after %qs", opt);
00170 break;
00171
00172 case OPT_MF:
00173 case OPT_MD:
00174 case OPT_MMD:
00175 case OPT_include:
00176 case OPT_imacros:
00177 case OPT_o:
00178 error ("missing filename after %qs", opt);
00179 break;
00180
00181 case OPT_MQ:
00182 case OPT_MT:
00183 error ("missing makefile target after %qs", opt);
00184 break;
00185 }
00186
00187 return true;
00188 }
00189
00190
00191 static void
00192 defer_opt (enum opt_code code, const char *arg)
00193 {
00194 deferred_opts[deferred_count].code = code;
00195 deferred_opts[deferred_count].arg = arg;
00196 deferred_count++;
00197 }
00198
00199
00200 unsigned int
00201 c_common_init_options (unsigned int argc, const char **argv)
00202 {
00203 static const unsigned int lang_flags[] = {CL_C, CL_ObjC, CL_CXX, CL_ObjCXX};
00204 unsigned int i, result;
00205
00206
00207
00208 if (c_dialect_cxx ())
00209 {
00210
00211
00212 diagnostic_line_cutoff (global_dc) = 80;
00213
00214
00215 diagnostic_prefixing_rule (global_dc) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
00216 }
00217
00218 parse_in = cpp_create_reader (c_dialect_cxx () ? CLK_GNUCXX: CLK_GNUC89,
00219 ident_hash, &line_table);
00220
00221 cpp_opts = cpp_get_options (parse_in);
00222 cpp_opts->dollars_in_ident = DOLLARS_IN_IDENTIFIERS;
00223 cpp_opts->objc = c_dialect_objc ();
00224
00225
00226
00227 cpp_opts->warn_dollars = 0;
00228
00229 flag_exceptions = c_dialect_cxx ();
00230 warn_pointer_arith = c_dialect_cxx ();
00231 warn_write_strings = c_dialect_cxx();
00232
00233 deferred_opts = XNEWVEC (struct deferred_opt, argc);
00234
00235 result = lang_flags[c_language];
00236
00237 if (c_language == clk_c)
00238 {
00239
00240
00241 for (i = 1; i < argc; i++)
00242 if (! strcmp (argv[i], "-lang-asm"))
00243 {
00244 result |= CL_C | CL_ObjC | CL_CXX | CL_ObjCXX;
00245 break;
00246 }
00247
00248 #ifdef CL_Fortran
00249 for (i = 1; i < argc; i++)
00250 if (! strcmp (argv[i], "-lang-fortran"))
00251 {
00252 result |= CL_Fortran;
00253 break;
00254 }
00255 #endif
00256 }
00257
00258 return result;
00259 }
00260
00261
00262
00263
00264
00265 int
00266 c_common_handle_option (size_t scode, const char *arg, int value)
00267 {
00268 const struct cl_option *option = &cl_options[scode];
00269 enum opt_code code = (enum opt_code) scode;
00270 int result = 1;
00271
00272
00273
00274 bool preprocessing_asm_p = (cpp_get_options (parse_in)->lang == CLK_ASM);
00275
00276 switch (code)
00277 {
00278 default:
00279 if (cl_options[code].flags & (CL_C | CL_CXX | CL_ObjC | CL_ObjCXX))
00280 break;
00281 #ifdef CL_Fortran
00282 if (lang_fortran && (cl_options[code].flags & (CL_Fortran)))
00283 break;
00284 #endif
00285 result = 0;
00286 break;
00287
00288 #ifdef TARG_SL
00289 case OPT_msoft_float:
00290 Float_Point_Support = true;
00291 break;
00292
00293 case OPT_mlong_long:
00294 Long_Long_Support = true;
00295 break;
00296 #endif
00297
00298 case OPT__output_pch_:
00299 pch_file = arg;
00300 break;
00301
00302 case OPT_A:
00303 defer_opt (code, arg);
00304 break;
00305
00306 case OPT_C:
00307 cpp_opts->discard_comments = 0;
00308 break;
00309
00310 case OPT_CC:
00311 cpp_opts->discard_comments = 0;
00312 cpp_opts->discard_comments_in_macro_exp = 0;
00313 break;
00314
00315 case OPT_D:
00316 defer_opt (code, arg);
00317 break;
00318
00319 case OPT_E:
00320 flag_preprocess_only = 1;
00321 break;
00322
00323 case OPT_H:
00324 cpp_opts->print_include_names = 1;
00325 break;
00326
00327 case OPT_F:
00328 TARGET_OPTF (xstrdup (arg));
00329 break;
00330
00331 case OPT_I:
00332 if (strcmp (arg, "-"))
00333 add_path (xstrdup (arg), BRACKET, 0, true);
00334 else
00335 {
00336 if (quote_chain_split)
00337 error ("-I- specified twice");
00338 quote_chain_split = true;
00339 split_quote_chain ();
00340 inform ("obsolete option -I- used, please use -iquote instead");
00341 }
00342 break;
00343
00344 case OPT_M:
00345 case OPT_MM:
00346
00347
00348
00349
00350 cpp_opts->deps.style = (code == OPT_M ? DEPS_SYSTEM: DEPS_USER);
00351 flag_no_output = 1;
00352 cpp_opts->inhibit_warnings = 1;
00353 break;
00354
00355 case OPT_MD:
00356 case OPT_MMD:
00357 cpp_opts->deps.style = (code == OPT_MD ? DEPS_SYSTEM: DEPS_USER);
00358 deps_file = arg;
00359 break;
00360
00361 case OPT_MF:
00362 deps_seen = true;
00363 deps_file = arg;
00364 break;
00365
00366 case OPT_MG:
00367 deps_seen = true;
00368 cpp_opts->deps.missing_files = true;
00369 break;
00370
00371 case OPT_MP:
00372 deps_seen = true;
00373 cpp_opts->deps.phony_targets = true;
00374 break;
00375
00376 case OPT_MQ:
00377 case OPT_MT:
00378 deps_seen = true;
00379 defer_opt (code, arg);
00380 break;
00381
00382 case OPT_P:
00383 flag_no_line_commands = 1;
00384 break;
00385
00386 case OPT_fworking_directory:
00387 flag_working_directory = value;
00388 break;
00389
00390 case OPT_U:
00391 defer_opt (code, arg);
00392 break;
00393
00394 case OPT_Wall:
00395 set_Wunused (value);
00396 set_Wformat (value);
00397 set_Wimplicit (value);
00398 warn_char_subscripts = value;
00399 warn_missing_braces = value;
00400 warn_parentheses = value;
00401 warn_return_type = value;
00402 warn_sequence_point = value;
00403 if (c_dialect_cxx ())
00404 warn_sign_compare = value;
00405 warn_switch = value;
00406 warn_strict_aliasing = value;
00407 warn_strict_overflow = value;
00408 warn_address = value;
00409
00410
00411
00412 warn_unknown_pragmas = value;
00413
00414
00415
00416
00417 if (warn_uninitialized != 1)
00418 warn_uninitialized = (value ? 2 : 0);
00419
00420 if (!c_dialect_cxx ())
00421
00422
00423 warn_main = value * 2;
00424 else
00425 {
00426
00427 warn_reorder = value;
00428 warn_nontemplate_friend = value;
00429 }
00430
00431 cpp_opts->warn_trigraphs = value;
00432 cpp_opts->warn_comments = value;
00433 cpp_opts->warn_num_sign_change = value;
00434 cpp_opts->warn_multichar = value;
00435
00436 if (warn_pointer_sign == -1)
00437 warn_pointer_sign = 1;
00438 break;
00439
00440 case OPT_Wcomment:
00441 case OPT_Wcomments:
00442 cpp_opts->warn_comments = value;
00443 break;
00444
00445 case OPT_Wdeprecated:
00446 cpp_opts->warn_deprecated = value;
00447 break;
00448
00449 case OPT_Wendif_labels:
00450 cpp_opts->warn_endif_labels = value;
00451 break;
00452
00453 case OPT_Werror:
00454 cpp_opts->warnings_are_errors = value;
00455 global_dc->warning_as_error_requested = value;
00456 break;
00457
00458 case OPT_Werror_implicit_function_declaration:
00459 mesg_implicit_function_declaration = 2;
00460 break;
00461
00462 case OPT_Wformat:
00463 set_Wformat (value);
00464 break;
00465
00466 case OPT_Wformat_:
00467 set_Wformat (atoi (arg));
00468 break;
00469
00470 case OPT_Wimplicit:
00471 set_Wimplicit (value);
00472 break;
00473
00474 case OPT_Wimport:
00475
00476 break;
00477
00478 case OPT_Winvalid_pch:
00479 cpp_opts->warn_invalid_pch = value;
00480 break;
00481
00482 case OPT_Wmain:
00483 if (value)
00484 warn_main = 1;
00485 else
00486 warn_main = -1;
00487 break;
00488
00489 case OPT_Wmissing_include_dirs:
00490 cpp_opts->warn_missing_include_dirs = value;
00491 break;
00492
00493 case OPT_Wmultichar:
00494 cpp_opts->warn_multichar = value;
00495 break;
00496
00497 case OPT_Wnormalized_:
00498 if (!value || (arg && strcasecmp (arg, "none") == 0))
00499 cpp_opts->warn_normalize = normalized_none;
00500 else if (!arg || strcasecmp (arg, "nfkc") == 0)
00501 cpp_opts->warn_normalize = normalized_KC;
00502 else if (strcasecmp (arg, "id") == 0)
00503 cpp_opts->warn_normalize = normalized_identifier_C;
00504 else if (strcasecmp (arg, "nfc") == 0)
00505 cpp_opts->warn_normalize = normalized_C;
00506 else
00507 error ("argument %qs to %<-Wnormalized%> not recognized", arg);
00508 break;
00509
00510 case OPT_Wreturn_type:
00511 warn_return_type = value;
00512 break;
00513
00514 case OPT_Wstrict_null_sentinel:
00515 warn_strict_null_sentinel = value;
00516 break;
00517
00518 case OPT_Wsystem_headers:
00519 cpp_opts->warn_system_headers = value;
00520 break;
00521
00522 case OPT_Wtraditional:
00523 cpp_opts->warn_traditional = value;
00524 break;
00525
00526 case OPT_Wtrigraphs:
00527 cpp_opts->warn_trigraphs = value;
00528 break;
00529
00530 case OPT_Wundef:
00531 cpp_opts->warn_undef = value;
00532 break;
00533
00534 case OPT_Wunknown_pragmas:
00535
00536
00537 warn_unknown_pragmas = value * 2;
00538 break;
00539
00540 case OPT_Wunused_macros:
00541 warn_unused_macros = value;
00542 break;
00543
00544 case OPT_Wvariadic_macros:
00545 warn_variadic_macros = value;
00546 break;
00547
00548 case OPT_Wwrite_strings:
00549 warn_write_strings = value;
00550 break;
00551
00552 case OPT_Weffc__:
00553 warn_ecpp = value;
00554 if (value)
00555 warn_nonvdtor = true;
00556 break;
00557
00558 case OPT_ansi:
00559 if (!c_dialect_cxx ())
00560 set_std_c89 (false, true);
00561 else
00562 set_std_cxx98 (true);
00563 break;
00564
00565 case OPT_d:
00566 handle_OPT_d (arg);
00567 break;
00568
00569 case OPT_fcond_mismatch:
00570 if (!c_dialect_cxx ())
00571 {
00572 flag_cond_mismatch = value;
00573 break;
00574 }
00575
00576
00577 case OPT_fall_virtual:
00578 case OPT_falt_external_templates:
00579 case OPT_fenum_int_equiv:
00580 case OPT_fexternal_templates:
00581 case OPT_fguiding_decls:
00582 case OPT_fhonor_std:
00583 case OPT_fhuge_objects:
00584 case OPT_flabels_ok:
00585 case OPT_fname_mangling_version_:
00586 case OPT_fnew_abi:
00587 case OPT_fnonnull_objects:
00588 case OPT_fsquangle:
00589 case OPT_fstrict_prototype:
00590 case OPT_fthis_is_variable:
00591 case OPT_fvtable_thunks:
00592 case OPT_fxref:
00593 case OPT_fvtable_gc:
00594 warning (0, "switch %qs is no longer supported", option->opt_text);
00595 break;
00596
00597 case OPT_faccess_control:
00598 flag_access_control = value;
00599 break;
00600
00601 case OPT_fasm:
00602 flag_no_asm = !value;
00603 break;
00604
00605 case OPT_fbuiltin:
00606 flag_no_builtin = !value;
00607 break;
00608
00609 case OPT_fbuiltin_:
00610 if (value)
00611 result = 0;
00612 else
00613 disable_builtin_function (arg);
00614 break;
00615
00616 case OPT_fdollars_in_identifiers:
00617 cpp_opts->dollars_in_ident = value;
00618 break;
00619
00620 case OPT_ffreestanding:
00621 value = !value;
00622
00623 case OPT_fhosted:
00624 flag_hosted = value;
00625 flag_no_builtin = !value;
00626
00627 if (!value && warn_main == 2)
00628 warn_main = 0;
00629 break;
00630
00631 case OPT_fshort_double:
00632 flag_short_double = value;
00633 break;
00634
00635 case OPT_fshort_enums:
00636 flag_short_enums = value;
00637 break;
00638
00639 case OPT_fshort_wchar:
00640 flag_short_wchar = value;
00641 break;
00642
00643 case OPT_fsigned_bitfields:
00644 flag_signed_bitfields = value;
00645 break;
00646
00647 case OPT_fsigned_char:
00648 flag_signed_char = value;
00649 break;
00650
00651 case OPT_funsigned_bitfields:
00652 flag_signed_bitfields = !value;
00653 break;
00654
00655 case OPT_funsigned_char:
00656 flag_signed_char = !value;
00657 break;
00658
00659 case OPT_fcheck_new:
00660 flag_check_new = value;
00661 break;
00662
00663 case OPT_fconserve_space:
00664 flag_conserve_space = value;
00665 break;
00666
00667 case OPT_fconstant_string_class_:
00668 constant_string_class_name = arg;
00669 break;
00670
00671 case OPT_fdefault_inline:
00672 flag_default_inline = value;
00673 break;
00674
00675 case OPT_felide_constructors:
00676 flag_elide_constructors = value;
00677 break;
00678
00679 case OPT_fenforce_eh_specs:
00680 flag_enforce_eh_specs = value;
00681 break;
00682
00683 case OPT_fextended_identifiers:
00684 cpp_opts->extended_identifiers = value;
00685 break;
00686
00687 case OPT_ffor_scope:
00688 flag_new_for_scope = value;
00689 break;
00690
00691 case OPT_fgnu_keywords:
00692 flag_no_gnu_keywords = !value;
00693 break;
00694
00695 case OPT_fgnu_runtime:
00696 flag_next_runtime = !value;
00697 break;
00698
00699 case OPT_fhandle_exceptions:
00700 warning (0, "-fhandle-exceptions has been renamed -fexceptions (and is now on by default)");
00701 flag_exceptions = value;
00702 break;
00703
00704 case OPT_fimplement_inlines:
00705 flag_implement_inlines = value;
00706 break;
00707
00708 case OPT_fimplicit_inline_templates:
00709 flag_implicit_inline_templates = value;
00710 break;
00711
00712 case OPT_fimplicit_templates:
00713 flag_implicit_templates = value;
00714 break;
00715
00716 case OPT_fms_extensions:
00717 flag_ms_extensions = value;
00718 break;
00719
00720 case OPT_fnext_runtime:
00721 flag_next_runtime = value;
00722 break;
00723
00724 case OPT_fnil_receivers:
00725 flag_nil_receivers = value;
00726 break;
00727
00728 case OPT_fnonansi_builtins:
00729 flag_no_nonansi_builtin = !value;
00730 break;
00731
00732 case OPT_foperator_names:
00733 cpp_opts->operator_names = value;
00734 break;
00735
00736 case OPT_foptional_diags:
00737 flag_optional_diags = value;
00738 break;
00739
00740 case OPT_fpch_deps:
00741 cpp_opts->restore_pch_deps = value;
00742 break;
00743
00744 case OPT_fpch_preprocess:
00745 flag_pch_preprocess = value;
00746 break;
00747
00748 case OPT_fpermissive:
00749 flag_permissive = value;
00750 break;
00751
00752 case OPT_fpreprocessed:
00753 cpp_opts->preprocessed = value;
00754 break;
00755
00756 case OPT_freplace_objc_classes:
00757 flag_replace_objc_classes = value;
00758 break;
00759
00760 case OPT_frepo:
00761 flag_use_repository = value;
00762 if (value)
00763 flag_implicit_templates = 0;
00764 break;
00765
00766 case OPT_frtti:
00767 flag_rtti = value;
00768 break;
00769
00770 case OPT_fshow_column:
00771 cpp_opts->show_column = value;
00772 break;
00773
00774 case OPT_fstats:
00775 flag_detailed_statistics = value;
00776 break;
00777
00778 case OPT_ftabstop_:
00779
00780 if (value >= 1 && value <= 100)
00781 cpp_opts->tabstop = value;
00782 break;
00783
00784 case OPT_fexec_charset_:
00785 cpp_opts->narrow_charset = arg;
00786 break;
00787
00788 case OPT_fwide_exec_charset_:
00789 cpp_opts->wide_charset = arg;
00790 break;
00791
00792 case OPT_finput_charset_:
00793 cpp_opts->input_charset = arg;
00794 break;
00795
00796 case OPT_ftemplate_depth_:
00797 max_tinst_depth = value;
00798 break;
00799
00800 case OPT_fuse_cxa_atexit:
00801 flag_use_cxa_atexit = value;
00802 break;
00803
00804 case OPT_fuse_cxa_get_exception_ptr:
00805 flag_use_cxa_get_exception_ptr = value;
00806 break;
00807
00808 case OPT_fvisibility_inlines_hidden:
00809 visibility_options.inlines_hidden = value;
00810 break;
00811
00812 case OPT_fweak:
00813 flag_weak = value;
00814 break;
00815
00816 case OPT_fthreadsafe_statics:
00817 flag_threadsafe_statics = value;
00818 break;
00819
00820 case OPT_fzero_link:
00821 flag_zero_link = value;
00822 break;
00823
00824 case OPT_gen_decls:
00825 flag_gen_declaration = 1;
00826 break;
00827
00828 case OPT_idirafter:
00829 add_path (xstrdup (arg), AFTER, 0, true);
00830 break;
00831
00832 case OPT_imacros:
00833 case OPT_include:
00834 defer_opt (code, arg);
00835 break;
00836
00837 case OPT_imultilib:
00838 imultilib = arg;
00839 break;
00840
00841 case OPT_iprefix:
00842 iprefix = arg;
00843 break;
00844
00845 case OPT_iquote:
00846 add_path (xstrdup (arg), QUOTE, 0, true);
00847 break;
00848
00849 case OPT_isysroot:
00850 sysroot = arg;
00851 break;
00852
00853 case OPT_isystem:
00854 add_path (xstrdup (arg), SYSTEM, 0, true);
00855 break;
00856
00857 case OPT_iwithprefix:
00858 add_prefixed_path (arg, SYSTEM);
00859 break;
00860
00861 case OPT_iwithprefixbefore:
00862 add_prefixed_path (arg, BRACKET);
00863 break;
00864
00865 case OPT_lang_asm:
00866 cpp_set_lang (parse_in, CLK_ASM);
00867 cpp_opts->dollars_in_ident = false;
00868 break;
00869
00870 case OPT_lang_fortran:
00871 lang_fortran = true;
00872 break;
00873
00874 case OPT_lang_objc:
00875 cpp_opts->objc = 1;
00876 break;
00877
00878 case OPT_nostdinc:
00879 std_inc = false;
00880 break;
00881
00882 case OPT_nostdinc__:
00883 std_cxx_inc = false;
00884 break;
00885
00886 case OPT_o:
00887 if (!out_fname)
00888 out_fname = arg;
00889 else
00890 error ("output filename specified twice");
00891 break;
00892
00893
00894
00895
00896 case OPT_pedantic_errors:
00897 cpp_opts->pedantic_errors = 1;
00898
00899 case OPT_pedantic:
00900 cpp_opts->pedantic = 1;
00901 cpp_opts->warn_endif_labels = 1;
00902 if (warn_pointer_sign == -1)
00903 warn_pointer_sign = 1;
00904 if (warn_overlength_strings == -1)
00905 warn_overlength_strings = 1;
00906 break;
00907
00908 case OPT_print_objc_runtime_info:
00909 print_struct_values = 1;
00910 break;
00911
00912 case OPT_print_pch_checksum:
00913 c_common_print_pch_checksum (stdout);
00914 exit_after_options = true;
00915 break;
00916
00917 case OPT_remap:
00918 cpp_opts->remap = 1;
00919 break;
00920
00921 case OPT_std_c__98:
00922 case OPT_std_gnu__98:
00923 if (!preprocessing_asm_p)
00924 set_std_cxx98 (code == OPT_std_c__98 );
00925 break;
00926
00927 case OPT_std_c89:
00928 case OPT_std_iso9899_1990:
00929 case OPT_std_iso9899_199409:
00930 if (!preprocessing_asm_p)
00931 set_std_c89 (code == OPT_std_iso9899_199409 , true );
00932 break;
00933
00934 case OPT_std_gnu89:
00935 if (!preprocessing_asm_p)
00936 set_std_c89 (false , false );
00937 break;
00938
00939 case OPT_std_c99:
00940 case OPT_std_c9x:
00941 case OPT_std_iso9899_1999:
00942 case OPT_std_iso9899_199x:
00943 if (!preprocessing_asm_p)
00944 set_std_c99 (true );
00945 break;
00946
00947 case OPT_std_gnu99:
00948 case OPT_std_gnu9x:
00949 if (!preprocessing_asm_p)
00950 set_std_c99 (false );
00951 break;
00952
00953 case OPT_trigraphs:
00954 cpp_opts->trigraphs = 1;
00955 break;
00956
00957 case OPT_traditional_cpp:
00958 cpp_opts->traditional = 1;
00959 break;
00960
00961 case OPT_undef:
00962 flag_undef = 1;
00963 break;
00964
00965 case OPT_w:
00966 cpp_opts->inhibit_warnings = 1;
00967 break;
00968
00969 case OPT_v:
00970 verbose = true;
00971 break;
00972 }
00973
00974 return result;
00975 }
00976
00977
00978 bool
00979 c_common_post_options (const char **pfilename)
00980 {
00981 struct cpp_callbacks *cb;
00982
00983
00984 if (in_fnames == NULL)
00985 {
00986 in_fnames = XNEWVEC (const char *, 1);
00987 in_fnames[0] = "";
00988 }
00989 else if (strcmp (in_fnames[0], "-") == 0)
00990 in_fnames[0] = "";
00991
00992 if (out_fname == NULL || !strcmp (out_fname, "-"))
00993 out_fname = "";
00994
00995 if (cpp_opts->deps.style == DEPS_NONE)
00996 check_deps_environment_vars ();
00997
00998 handle_deferred_opts ();
00999
01000 sanitize_cpp_opts ();
01001
01002 register_include_chains (parse_in, sysroot, iprefix, imultilib,
01003 std_inc, std_cxx_inc && c_dialect_cxx (), verbose);
01004
01005 #ifdef C_COMMON_OVERRIDE_OPTIONS
01006
01007
01008 C_COMMON_OVERRIDE_OPTIONS;
01009 #endif
01010
01011 flag_inline_trees = 1;
01012
01013
01014 if (!flag_no_inline)
01015 flag_no_inline = 1;
01016 if (flag_inline_functions)
01017 flag_inline_trees = 2;
01018
01019
01020
01021
01022 if (!flag_gnu89_inline)
01023 error ("-fno-gnu89-inline is not supported");
01024
01025
01026
01027 if (num_in_fnames > 1)
01028 flag_unit_at_a_time = 1;
01029
01030
01031 if (flag_objc_sjlj_exceptions < 0)
01032 flag_objc_sjlj_exceptions = flag_next_runtime;
01033 if (flag_objc_exceptions && !flag_objc_sjlj_exceptions)
01034 flag_exceptions = 1;
01035
01036
01037
01038 if (warn_sign_compare == -1)
01039 warn_sign_compare = extra_warnings;
01040 if (warn_missing_field_initializers == -1)
01041 warn_missing_field_initializers = extra_warnings;
01042 if (warn_override_init == -1)
01043 warn_override_init = extra_warnings;
01044
01045
01046
01047 if (warn_pointer_sign == -1)
01048 warn_pointer_sign = 0;
01049
01050
01051
01052
01053 if (warn_overlength_strings == -1 || c_dialect_cxx ())
01054 warn_overlength_strings = 0;
01055
01056
01057
01058 if (!warn_format)
01059 {
01060 warning (OPT_Wformat_y2k,
01061 "-Wformat-y2k ignored without -Wformat");
01062 warning (OPT_Wformat_extra_args,
01063 "-Wformat-extra-args ignored without -Wformat");
01064 warning (OPT_Wformat_zero_length,
01065 "-Wformat-zero-length ignored without -Wformat");
01066 warning (OPT_Wformat_nonliteral,
01067 "-Wformat-nonliteral ignored without -Wformat");
01068 warning (OPT_Wformat_security,
01069 "-Wformat-security ignored without -Wformat");
01070 }
01071
01072
01073
01074 if (flag_isoc99)
01075 flag_complex_method = 2;
01076
01077 if (flag_preprocess_only)
01078 {
01079
01080
01081
01082 if (out_fname[0] == '\0')
01083 out_stream = stdout;
01084 else
01085 out_stream = fopen (out_fname, "w");
01086
01087 if (out_stream == NULL)
01088 {
01089 fatal_error ("opening output file %s: %m", out_fname);
01090 return false;
01091 }
01092
01093 if (num_in_fnames > 1)
01094 error ("too many filenames given. Type %s --help for usage",
01095 progname);
01096
01097 init_pp_output (out_stream);
01098 }
01099 else
01100 {
01101 init_c_lex ();
01102
01103
01104 input_location = UNKNOWN_LOCATION;
01105 }
01106
01107 cb = cpp_get_callbacks (parse_in);
01108 cb->file_change = cb_file_change;
01109 cb->dir_change = cb_dir_change;
01110 cpp_post_options (parse_in);
01111
01112 input_location = UNKNOWN_LOCATION;
01113
01114
01115
01116 errorcount += cpp_errors (parse_in);
01117
01118 *pfilename = this_input_filename
01119 = cpp_read_main_file (parse_in, in_fnames[0]);
01120
01121 if (this_input_filename == NULL)
01122 {
01123 errorcount++;
01124 return false;
01125 }
01126
01127 if (flag_working_directory
01128 && flag_preprocess_only && !flag_no_line_commands)
01129 pp_dir_change (parse_in, get_src_pwd ());
01130
01131 return flag_preprocess_only;
01132 }
01133
01134
01135 bool
01136 c_common_init (void)
01137 {
01138
01139
01140 cpp_opts->precision = TYPE_PRECISION (intmax_type_node);
01141 cpp_opts->char_precision = TYPE_PRECISION (char_type_node);
01142 cpp_opts->int_precision = TYPE_PRECISION (integer_type_node);
01143 cpp_opts->wchar_precision = TYPE_PRECISION (wchar_type_node);
01144 cpp_opts->unsigned_wchar = TYPE_UNSIGNED (wchar_type_node);
01145 cpp_opts->bytes_big_endian = BYTES_BIG_ENDIAN;
01146
01147
01148
01149 cpp_init_iconv (parse_in);
01150
01151 if (version_flag)
01152 c_common_print_pch_checksum (stderr);
01153
01154 if (flag_preprocess_only)
01155 {
01156 finish_options ();
01157 preprocess_file (parse_in);
01158 return false;
01159 }
01160
01161
01162 init_pragma ();
01163
01164 return true;
01165 }
01166
01167
01168
01169 void
01170 c_common_parse_file (int set_yydebug)
01171 {
01172 unsigned int i;
01173
01174
01175
01176 #if YYDEBUG != 0
01177 yydebug = set_yydebug;
01178 #else
01179 if (set_yydebug)
01180 warning (0, "YYDEBUG was not defined at build time, -dy ignored");
01181 #endif
01182
01183 i = 0;
01184 for (;;)
01185 {
01186
01187 if (debug_hooks->start_end_main_source_file)
01188 (*debug_hooks->start_source_file) (0, this_input_filename);
01189 finish_options ();
01190 pch_init ();
01191 push_file_scope ();
01192 c_parse_file ();
01193 finish_file ();
01194 pop_file_scope ();
01195
01196 if (debug_hooks->start_end_main_source_file)
01197 (*debug_hooks->end_source_file) (0);
01198 if (++i >= num_in_fnames)
01199 break;
01200 cpp_undef_all (parse_in);
01201 this_input_filename
01202 = cpp_read_main_file (parse_in, in_fnames[i]);
01203
01204
01205 if (!this_input_filename)
01206 break;
01207 }
01208 }
01209
01210
01211 void
01212 c_common_finish (void)
01213 {
01214 FILE *deps_stream = NULL;
01215
01216 if (cpp_opts->deps.style != DEPS_NONE)
01217 {
01218
01219
01220 if (!deps_file)
01221 deps_stream = out_stream;
01222 else
01223 {
01224 deps_stream = fopen (deps_file, deps_append ? "a": "w");
01225 if (!deps_stream)
01226 fatal_error ("opening dependency file %s: %m", deps_file);
01227 }
01228 }
01229
01230
01231
01232 errorcount += cpp_finish (parse_in, deps_stream);
01233
01234 if (deps_stream && deps_stream != out_stream
01235 && (ferror (deps_stream) || fclose (deps_stream)))
01236 fatal_error ("closing dependency file %s: %m", deps_file);
01237
01238 if (out_stream && (ferror (out_stream) || fclose (out_stream)))
01239 fatal_error ("when writing output to %s: %m", out_fname);
01240 }
01241
01242
01243
01244
01245
01246
01247
01248
01249 static void
01250 check_deps_environment_vars (void)
01251 {
01252 char *spec;
01253
01254 GET_ENVIRONMENT (spec, "DEPENDENCIES_OUTPUT");
01255 if (spec)
01256 cpp_opts->deps.style = DEPS_USER;
01257 else
01258 {
01259 GET_ENVIRONMENT (spec, "SUNPRO_DEPENDENCIES");
01260 if (spec)
01261 {
01262 cpp_opts->deps.style = DEPS_SYSTEM;
01263 cpp_opts->deps.ignore_main_file = true;
01264 }
01265 }
01266
01267 if (spec)
01268 {
01269
01270 char *s = strchr (spec, ' ');
01271 if (s)
01272 {
01273
01274 defer_opt (OPT_MT, s + 1);
01275 *s = '\0';
01276 }
01277
01278
01279 if (!deps_file)
01280 deps_file = spec;
01281
01282 deps_append = 1;
01283 deps_seen = true;
01284 }
01285 }
01286
01287
01288 static void
01289 handle_deferred_opts (void)
01290 {
01291 size_t i;
01292 struct deps *deps;
01293
01294
01295
01296
01297 if (!deps_seen)
01298 return;
01299
01300 deps = cpp_get_deps (parse_in);
01301
01302 for (i = 0; i < deferred_count; i++)
01303 {
01304 struct deferred_opt *opt = &deferred_opts[i];
01305
01306 if (opt->code == OPT_MT || opt->code == OPT_MQ)
01307 deps_add_target (deps, opt->arg, opt->code == OPT_MQ);
01308 }
01309 }
01310
01311
01312
01313 static void
01314 sanitize_cpp_opts (void)
01315 {
01316
01317
01318 if (deps_seen && cpp_opts->deps.style == DEPS_NONE)
01319 error ("to generate dependencies you must specify either -M or -MM");
01320
01321
01322
01323 if (flag_dump_macros == 'M')
01324 flag_no_output = 1;
01325
01326
01327
01328
01329 if (flag_no_output)
01330 {
01331 if (flag_dump_macros != 'M')
01332 flag_dump_macros = 0;
01333 flag_dump_includes = 0;
01334 flag_no_line_commands = 1;
01335 }
01336
01337 cpp_opts->unsigned_char = !flag_signed_char;
01338 cpp_opts->stdc_0_in_system_headers = STDC_0_IN_SYSTEM_HEADERS;
01339
01340
01341
01342 cpp_opts->warn_long_long
01343 = warn_long_long && ((!flag_isoc99 && pedantic) || warn_traditional);
01344
01345
01346
01347 cpp_opts->warn_variadic_macros
01348 = warn_variadic_macros && (pedantic || warn_traditional);
01349
01350
01351
01352
01353
01354 if (flag_working_directory == -1)
01355 flag_working_directory = (debug_info_level != DINFO_LEVEL_NONE);
01356 }
01357
01358
01359 static void
01360 add_prefixed_path (const char *suffix, size_t chain)
01361 {
01362 char *path;
01363 const char *prefix;
01364 size_t prefix_len, suffix_len;
01365
01366 suffix_len = strlen (suffix);
01367 prefix = iprefix ? iprefix : cpp_GCC_INCLUDE_DIR;
01368 prefix_len = iprefix ? strlen (iprefix) : cpp_GCC_INCLUDE_DIR_len;
01369
01370 path = (char *) xmalloc (prefix_len + suffix_len + 1);
01371 memcpy (path, prefix, prefix_len);
01372 memcpy (path + prefix_len, suffix, suffix_len);
01373 path[prefix_len + suffix_len] = '\0';
01374
01375 add_path (path, chain, 0, false);
01376 }
01377
01378
01379 static void
01380 finish_options (void)
01381 {
01382 if (!cpp_opts->preprocessed)
01383 {
01384 size_t i;
01385
01386 cb_file_change (parse_in,
01387 linemap_add (&line_table, LC_RENAME, 0,
01388 _("<built-in>"), 0));
01389
01390 cpp_init_builtins (parse_in, flag_hosted);
01391 c_cpp_builtins (parse_in);
01392
01393
01394
01395
01396
01397
01398
01399
01400
01401
01402 cpp_opts->warn_dollars = (cpp_opts->pedantic && !cpp_opts->c99);
01403
01404 cb_file_change (parse_in,
01405 linemap_add (&line_table, LC_RENAME, 0,
01406 _("<command-line>"), 0));
01407
01408 for (i = 0; i < deferred_count; i++)
01409 {
01410 struct deferred_opt *opt = &deferred_opts[i];
01411
01412 if (opt->code == OPT_D)
01413 cpp_define (parse_in, opt->arg);
01414 else if (opt->code == OPT_U)
01415 cpp_undef (parse_in, opt->arg);
01416 else if (opt->code == OPT_A)
01417 {
01418 if (opt->arg[0] == '-')
01419 cpp_unassert (parse_in, opt->arg + 1);
01420 else
01421 cpp_assert (parse_in, opt->arg);
01422 }
01423 }
01424
01425
01426 for (i = 0; i < deferred_count; i++)
01427 {
01428 struct deferred_opt *opt = &deferred_opts[i];
01429
01430 if (opt->code == OPT_imacros
01431 && cpp_push_include (parse_in, opt->arg))
01432 {
01433
01434 include_cursor = deferred_count + 1;
01435 cpp_scan_nooutput (parse_in);
01436 }
01437 }
01438 }
01439
01440 include_cursor = 0;
01441 push_command_line_include ();
01442 }
01443
01444
01445 static void
01446 push_command_line_include (void)
01447 {
01448 while (include_cursor < deferred_count)
01449 {
01450 struct deferred_opt *opt = &deferred_opts[include_cursor++];
01451
01452 if (!cpp_opts->preprocessed && opt->code == OPT_include
01453 && cpp_push_include (parse_in, opt->arg))
01454 return;
01455 }
01456
01457 if (include_cursor == deferred_count)
01458 {
01459 include_cursor++;
01460
01461 cpp_opts->warn_unused_macros = warn_unused_macros;
01462
01463 if (!cpp_opts->preprocessed)
01464 cpp_change_file (parse_in, LC_RENAME, this_input_filename);
01465
01466
01467
01468 line_table.trace_includes = cpp_opts->print_include_names;
01469 }
01470 }
01471
01472
01473 static void
01474 cb_file_change (cpp_reader * ARG_UNUSED (pfile),
01475 const struct line_map *new_map)
01476 {
01477 if (flag_preprocess_only)
01478 pp_file_change (new_map);
01479 else
01480 fe_file_change (new_map);
01481
01482 if (new_map == 0 || (new_map->reason == LC_LEAVE && MAIN_FILE_P (new_map)))
01483 push_command_line_include ();
01484 }
01485
01486 void
01487 cb_dir_change (cpp_reader * ARG_UNUSED (pfile), const char *dir)
01488 {
01489 if (!set_src_pwd (dir))
01490 warning (0, "too late for # directive to set debug directory");
01491 }
01492
01493
01494
01495 static void
01496 set_std_c89 (int c94, int iso)
01497 {
01498 cpp_set_lang (parse_in, c94 ? CLK_STDC94: iso ? CLK_STDC89: CLK_GNUC89);
01499 flag_iso = iso;
01500 flag_no_asm = iso;
01501 flag_no_gnu_keywords = iso;
01502 flag_no_nonansi_builtin = iso;
01503 flag_isoc94 = c94;
01504 flag_isoc99 = 0;
01505 }
01506
01507
01508 static void
01509 set_std_c99 (int iso)
01510 {
01511 cpp_set_lang (parse_in, iso ? CLK_STDC99: CLK_GNUC99);
01512 flag_no_asm = iso;
01513 flag_no_nonansi_builtin = iso;
01514 flag_iso = iso;
01515 flag_isoc99 = 1;
01516 flag_isoc94 = 1;
01517 }
01518
01519
01520 static void
01521 set_std_cxx98 (int iso)
01522 {
01523 cpp_set_lang (parse_in, iso ? CLK_CXX98: CLK_GNUCXX);
01524 flag_no_gnu_keywords = iso;
01525 flag_no_nonansi_builtin = iso;
01526 flag_iso = iso;
01527 }
01528
01529
01530 static void
01531 set_Wimplicit (int on)
01532 {
01533 warn_implicit = on;
01534 warn_implicit_int = on;
01535 if (on)
01536 {
01537 if (mesg_implicit_function_declaration != 2)
01538 mesg_implicit_function_declaration = 1;
01539 }
01540 else
01541 mesg_implicit_function_declaration = 0;
01542 }
01543
01544
01545
01546 static void
01547 handle_OPT_d (const char *arg)
01548 {
01549 char c;
01550
01551 while ((c = *arg++) != '\0')
01552 switch (c)
01553 {
01554 case 'M':
01555 case 'N':
01556 case 'D':
01557 flag_dump_macros = c;
01558 break;
01559
01560 case 'I':
01561 flag_dump_includes = 1;
01562 break;
01563 }
01564 }