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