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