c-opts.c revision 260074
1117395Skan/* C/ObjC/C++ command line option handling. 2169699Skan Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 3169699Skan Free Software Foundation, Inc. 4117395Skan Contributed by Neil Booth. 5117395Skan 6117395SkanThis file is part of GCC. 7117395Skan 8117395SkanGCC is free software; you can redistribute it and/or modify it under 9117395Skanthe terms of the GNU General Public License as published by the Free 10117395SkanSoftware Foundation; either version 2, or (at your option) any later 11117395Skanversion. 12117395Skan 13117395SkanGCC is distributed in the hope that it will be useful, but WITHOUT ANY 14117395SkanWARRANTY; without even the implied warranty of MERCHANTABILITY or 15117395SkanFITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 16117395Skanfor more details. 17117395Skan 18117395SkanYou should have received a copy of the GNU General Public License 19117395Skanalong with GCC; see the file COPYING. If not, write to the Free 20169699SkanSoftware Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 21169699Skan02110-1301, USA. */ 22117395Skan 23132811Skan/* $FreeBSD: stable/10/contrib/gcc/c-opts.c 260074 2013-12-30 03:39:46Z pfg $ */ 24189824Sdas/* Merged C99 inline changes from gcc trunk 122565 2007-03-05 */ 25132811Skan 26117395Skan#include "config.h" 27117395Skan#include "system.h" 28132718Skan#include "coretypes.h" 29132718Skan#include "tm.h" 30117395Skan#include "tree.h" 31117395Skan#include "c-common.h" 32117395Skan#include "c-pragma.h" 33117395Skan#include "flags.h" 34117395Skan#include "toplev.h" 35117395Skan#include "langhooks.h" 36117395Skan#include "tree-inline.h" 37117395Skan#include "diagnostic.h" 38117395Skan#include "intl.h" 39132718Skan#include "cppdefault.h" 40132718Skan#include "c-incpath.h" 41132718Skan#include "debug.h" /* For debug_hooks. */ 42132718Skan#include "opts.h" 43132718Skan#include "options.h" 44169699Skan#include "mkdeps.h" 45117395Skan 46132718Skan#ifndef DOLLARS_IN_IDENTIFIERS 47132718Skan# define DOLLARS_IN_IDENTIFIERS true 48132718Skan#endif 49132718Skan 50132718Skan#ifndef TARGET_SYSTEM_ROOT 51132718Skan# define TARGET_SYSTEM_ROOT NULL 52132718Skan#endif 53132718Skan 54169699Skan#ifndef TARGET_OPTF 55169699Skan#define TARGET_OPTF(ARG) 56169699Skan#endif 57132718Skan 58117395Skan/* CPP's options. */ 59117395Skanstatic cpp_options *cpp_opts; 60117395Skan 61117395Skan/* Input filename. */ 62132718Skanstatic const char *this_input_filename; 63117395Skan 64117395Skan/* Filename and stream for preprocessed output. */ 65117395Skanstatic const char *out_fname; 66117395Skanstatic FILE *out_stream; 67117395Skan 68117395Skan/* Append dependencies to deps_file. */ 69117395Skanstatic bool deps_append; 70117395Skan 71117395Skan/* If dependency switches (-MF etc.) have been given. */ 72117395Skanstatic bool deps_seen; 73117395Skan 74132718Skan/* If -v seen. */ 75132718Skanstatic bool verbose; 76132718Skan 77169699Skan/* If -lang-fortran seen. */ 78169699Skanstatic bool lang_fortran = false; 79169699Skan 80117395Skan/* Dependency output file. */ 81117395Skanstatic const char *deps_file; 82117395Skan 83132718Skan/* The prefix given by -iprefix, if any. */ 84132718Skanstatic const char *iprefix; 85117395Skan 86169699Skan/* The multilib directory given by -imultilib, if any. */ 87169699Skanstatic const char *imultilib; 88169699Skan 89132718Skan/* The system root, if any. Overridden by -isysroot. */ 90132718Skanstatic const char *sysroot = TARGET_SYSTEM_ROOT; 91117395Skan 92132718Skan/* Zero disables all standard directories for headers. */ 93132718Skanstatic bool std_inc = true; 94117395Skan 95132718Skan/* Zero disables the C++-specific standard directories for headers. */ 96132718Skanstatic bool std_cxx_inc = true; 97117395Skan 98132718Skan/* If the quote chain has been split by -I-. */ 99132718Skanstatic bool quote_chain_split; 100117395Skan 101132718Skan/* If -Wunused-macros. */ 102132718Skanstatic bool warn_unused_macros; 103117395Skan 104169699Skan/* If -Wvariadic-macros. */ 105169699Skanstatic bool warn_variadic_macros = true; 106169699Skan 107132718Skan/* Number of deferred options. */ 108132718Skanstatic size_t deferred_count; 109117395Skan 110132718Skan/* Number of deferred options scanned for -include. */ 111132718Skanstatic size_t include_cursor; 112117395Skan 113132718Skanstatic void set_Wimplicit (int); 114132718Skanstatic void handle_OPT_d (const char *); 115132718Skanstatic void set_std_cxx98 (int); 116132718Skanstatic void set_std_c89 (int, int); 117132718Skanstatic void set_std_c99 (int); 118132718Skanstatic void check_deps_environment_vars (void); 119132718Skanstatic void handle_deferred_opts (void); 120132718Skanstatic void sanitize_cpp_opts (void); 121132718Skanstatic void add_prefixed_path (const char *, size_t); 122132718Skanstatic void push_command_line_include (void); 123132718Skanstatic void cb_file_change (cpp_reader *, const struct line_map *); 124132718Skanstatic void cb_dir_change (cpp_reader *, const char *); 125132718Skanstatic void finish_options (void); 126117395Skan 127132718Skan#ifndef STDC_0_IN_SYSTEM_HEADERS 128132718Skan#define STDC_0_IN_SYSTEM_HEADERS 0 129117395Skan#endif 130117395Skan 131132718Skan/* Holds switches parsed by c_common_handle_option (), but whose 132132718Skan handling is deferred to c_common_post_options (). */ 133132718Skanstatic void defer_opt (enum opt_code, const char *); 134117395Skanstatic struct deferred_opt 135117395Skan{ 136117395Skan enum opt_code code; 137117395Skan const char *arg; 138117395Skan} *deferred_opts; 139117395Skan 140132718Skan/* Complain that switch CODE expects an argument but none was 141132718Skan provided. OPT was the command-line option. Return FALSE to get 142132718Skan the default message in opts.c, TRUE if we provide a specialized 143132718Skan one. */ 144132718Skanbool 145132718Skanc_common_missing_argument (const char *opt, size_t code) 146117395Skan{ 147132718Skan switch (code) 148117395Skan { 149117395Skan default: 150132718Skan /* Pick up the default message. */ 151132718Skan return false; 152132718Skan 153132718Skan case OPT_fconstant_string_class_: 154169699Skan error ("no class name specified with %qs", opt); 155117395Skan break; 156117395Skan 157132718Skan case OPT_A: 158169699Skan error ("assertion missing after %qs", opt); 159117395Skan break; 160117395Skan 161132718Skan case OPT_D: 162132718Skan case OPT_U: 163169699Skan error ("macro name missing after %qs", opt); 164132718Skan break; 165132718Skan 166169699Skan case OPT_F: 167132718Skan case OPT_I: 168132718Skan case OPT_idirafter: 169132718Skan case OPT_isysroot: 170132718Skan case OPT_isystem: 171169699Skan case OPT_iquote: 172169699Skan error ("missing path after %qs", opt); 173132718Skan break; 174132718Skan 175117395Skan case OPT_MF: 176117395Skan case OPT_MD: 177117395Skan case OPT_MMD: 178132718Skan case OPT_include: 179132718Skan case OPT_imacros: 180117395Skan case OPT_o: 181169699Skan error ("missing filename after %qs", opt); 182117395Skan break; 183117395Skan 184117395Skan case OPT_MQ: 185117395Skan case OPT_MT: 186169699Skan error ("missing makefile target after %qs", opt); 187117395Skan break; 188117395Skan } 189117395Skan 190132718Skan return true; 191117395Skan} 192117395Skan 193117395Skan/* Defer option CODE with argument ARG. */ 194117395Skanstatic void 195132718Skandefer_opt (enum opt_code code, const char *arg) 196117395Skan{ 197117395Skan deferred_opts[deferred_count].code = code; 198117395Skan deferred_opts[deferred_count].arg = arg; 199117395Skan deferred_count++; 200117395Skan} 201117395Skan 202117395Skan/* Common initialization before parsing options. */ 203132718Skanunsigned int 204146908Skanc_common_init_options (unsigned int argc, const char **argv) 205117395Skan{ 206132718Skan static const unsigned int lang_flags[] = {CL_C, CL_ObjC, CL_CXX, CL_ObjCXX}; 207146908Skan unsigned int i, result; 208117395Skan 209132718Skan /* This is conditionalized only because that is the way the front 210132718Skan ends used to do it. Maybe this should be unconditional? */ 211132718Skan if (c_dialect_cxx ()) 212132718Skan { 213132718Skan /* By default wrap lines at 80 characters. Is getenv 214132718Skan ("COLUMNS") preferable? */ 215132718Skan diagnostic_line_cutoff (global_dc) = 80; 216132718Skan /* By default, emit location information once for every 217132718Skan diagnostic message. */ 218132718Skan diagnostic_prefixing_rule (global_dc) = DIAGNOSTICS_SHOW_PREFIX_ONCE; 219132718Skan } 220117395Skan 221132718Skan parse_in = cpp_create_reader (c_dialect_cxx () ? CLK_GNUCXX: CLK_GNUC89, 222169699Skan ident_hash, &line_table); 223132718Skan 224117395Skan cpp_opts = cpp_get_options (parse_in); 225132718Skan cpp_opts->dollars_in_ident = DOLLARS_IN_IDENTIFIERS; 226132718Skan cpp_opts->objc = c_dialect_objc (); 227117395Skan 228132718Skan /* Reset to avoid warnings on internal definitions. We set it just 229132718Skan before passing on command-line options to cpplib. */ 230132718Skan cpp_opts->warn_dollars = 0; 231117395Skan 232132718Skan flag_exceptions = c_dialect_cxx (); 233132718Skan warn_pointer_arith = c_dialect_cxx (); 234169699Skan warn_write_strings = c_dialect_cxx(); 235117395Skan 236169699Skan deferred_opts = XNEWVEC (struct deferred_opt, argc); 237117395Skan 238132718Skan result = lang_flags[c_language]; 239117395Skan 240146908Skan if (c_language == clk_c) 241146908Skan { 242169699Skan /* If preprocessing assembly language, accept any of the C-family 243169699Skan front end options since the driver may pass them through. */ 244146908Skan for (i = 1; i < argc; i++) 245169699Skan if (! strcmp (argv[i], "-lang-asm")) 246169699Skan { 247169699Skan result |= CL_C | CL_ObjC | CL_CXX | CL_ObjCXX; 248169699Skan break; 249169699Skan } 250169699Skan 251169699Skan#ifdef CL_Fortran 252169699Skan for (i = 1; i < argc; i++) 253169699Skan if (! strcmp (argv[i], "-lang-fortran")) 254146908Skan { 255169699Skan result |= CL_Fortran; 256169699Skan break; 257169699Skan } 258146908Skan#endif 259117395Skan } 260169699Skan 261132718Skan return result; 262132718Skan} 263117395Skan 264132718Skan/* Handle switch SCODE with argument ARG. VALUE is true, unless no- 265132718Skan form of an -f or -W option was given. Returns 0 if the switch was 266132718Skan invalid, a negative number to prevent language-independent 267132718Skan processing in toplev.c (a hack necessary for the short-term). */ 268132718Skanint 269132718Skanc_common_handle_option (size_t scode, const char *arg, int value) 270132718Skan{ 271132718Skan const struct cl_option *option = &cl_options[scode]; 272132718Skan enum opt_code code = (enum opt_code) scode; 273132718Skan int result = 1; 274117395Skan 275169699Skan /* Prevent resetting the language standard to a C dialect when the driver 276169699Skan has already determined that we're looking at assembler input. */ 277169699Skan bool preprocessing_asm_p = (cpp_get_options (parse_in)->lang == CLK_ASM); 278169699Skan 279132718Skan switch (code) 280117395Skan { 281132718Skan default: 282169699Skan if (cl_options[code].flags & (CL_C | CL_CXX | CL_ObjC | CL_ObjCXX)) 283169699Skan break; 284169699Skan#ifdef CL_Fortran 285169699Skan if (lang_fortran && (cl_options[code].flags & (CL_Fortran))) 286169699Skan break; 287169699Skan#endif 288169699Skan result = 0; 289132718Skan break; 290117395Skan 291132718Skan case OPT__output_pch_: 292132718Skan pch_file = arg; 293117395Skan break; 294117395Skan 295132718Skan case OPT_A: 296132718Skan defer_opt (code, arg); 297117395Skan break; 298117395Skan 299117395Skan case OPT_C: 300117395Skan cpp_opts->discard_comments = 0; 301117395Skan break; 302117395Skan 303117395Skan case OPT_CC: 304117395Skan cpp_opts->discard_comments = 0; 305117395Skan cpp_opts->discard_comments_in_macro_exp = 0; 306117395Skan break; 307117395Skan 308132718Skan case OPT_D: 309132718Skan defer_opt (code, arg); 310132718Skan break; 311132718Skan 312117395Skan case OPT_E: 313117395Skan flag_preprocess_only = 1; 314117395Skan break; 315117395Skan 316117395Skan case OPT_H: 317117395Skan cpp_opts->print_include_names = 1; 318117395Skan break; 319117395Skan 320169699Skan case OPT_F: 321169699Skan TARGET_OPTF (xstrdup (arg)); 322169699Skan break; 323169699Skan 324132718Skan case OPT_I: 325132718Skan if (strcmp (arg, "-")) 326169699Skan add_path (xstrdup (arg), BRACKET, 0, true); 327132718Skan else 328132718Skan { 329132718Skan if (quote_chain_split) 330132718Skan error ("-I- specified twice"); 331132718Skan quote_chain_split = true; 332132718Skan split_quote_chain (); 333169699Skan inform ("obsolete option -I- used, please use -iquote instead"); 334132718Skan } 335132718Skan break; 336132718Skan 337117395Skan case OPT_M: 338117395Skan case OPT_MM: 339117395Skan /* When doing dependencies with -M or -MM, suppress normal 340117395Skan preprocessed output, but still do -dM etc. as software 341117395Skan depends on this. Preprocessed output does occur if -MD, -MMD 342117395Skan or environment var dependency generation is used. */ 343117395Skan cpp_opts->deps.style = (code == OPT_M ? DEPS_SYSTEM: DEPS_USER); 344132718Skan flag_no_output = 1; 345117395Skan cpp_opts->inhibit_warnings = 1; 346117395Skan break; 347117395Skan 348117395Skan case OPT_MD: 349117395Skan case OPT_MMD: 350117395Skan cpp_opts->deps.style = (code == OPT_MD ? DEPS_SYSTEM: DEPS_USER); 351117395Skan deps_file = arg; 352117395Skan break; 353117395Skan 354117395Skan case OPT_MF: 355117395Skan deps_seen = true; 356117395Skan deps_file = arg; 357117395Skan break; 358117395Skan 359117395Skan case OPT_MG: 360117395Skan deps_seen = true; 361117395Skan cpp_opts->deps.missing_files = true; 362117395Skan break; 363117395Skan 364117395Skan case OPT_MP: 365117395Skan deps_seen = true; 366117395Skan cpp_opts->deps.phony_targets = true; 367117395Skan break; 368117395Skan 369117395Skan case OPT_MQ: 370117395Skan case OPT_MT: 371117395Skan deps_seen = true; 372117395Skan defer_opt (code, arg); 373117395Skan break; 374117395Skan 375117395Skan case OPT_P: 376132718Skan flag_no_line_commands = 1; 377117395Skan break; 378117395Skan 379132718Skan case OPT_fworking_directory: 380132718Skan flag_working_directory = value; 381132718Skan break; 382132718Skan 383132718Skan case OPT_U: 384132718Skan defer_opt (code, arg); 385132718Skan break; 386132718Skan 387117395Skan case OPT_Wall: 388132718Skan set_Wunused (value); 389132718Skan set_Wformat (value); 390132718Skan set_Wimplicit (value); 391132718Skan warn_char_subscripts = value; 392132718Skan warn_missing_braces = value; 393132718Skan warn_parentheses = value; 394132718Skan warn_return_type = value; 395132718Skan warn_sequence_point = value; /* Was C only. */ 396132718Skan if (c_dialect_cxx ()) 397132718Skan warn_sign_compare = value; 398132718Skan warn_switch = value; 399259405Spfg set_warn_strict_aliasing (value); 400169699Skan warn_strict_overflow = value; 401169699Skan warn_address = value; 402132718Skan 403117395Skan /* Only warn about unknown pragmas that are not in system 404132718Skan headers. */ 405132718Skan warn_unknown_pragmas = value; 406117395Skan 407117395Skan /* We save the value of warn_uninitialized, since if they put 408117395Skan -Wuninitialized on the command line, we need to generate a 409117395Skan warning about not using it without also specifying -O. */ 410117395Skan if (warn_uninitialized != 1) 411132718Skan warn_uninitialized = (value ? 2 : 0); 412117395Skan 413132718Skan if (!c_dialect_cxx ()) 414117395Skan /* We set this to 2 here, but 1 in -Wmain, so -ffreestanding 415117395Skan can turn it off only if it's not explicit. */ 416132718Skan warn_main = value * 2; 417117395Skan else 418117395Skan { 419117395Skan /* C++-specific warnings. */ 420132718Skan warn_reorder = value; 421132718Skan warn_nontemplate_friend = value; 422117395Skan } 423117395Skan 424132718Skan cpp_opts->warn_trigraphs = value; 425132718Skan cpp_opts->warn_comments = value; 426132718Skan cpp_opts->warn_num_sign_change = value; 427132718Skan cpp_opts->warn_multichar = value; /* Was C++ only. */ 428117395Skan 429169699Skan if (warn_pointer_sign == -1) 430169699Skan warn_pointer_sign = 1; 431117395Skan break; 432117395Skan 433117395Skan case OPT_Wcomment: 434117395Skan case OPT_Wcomments: 435132718Skan cpp_opts->warn_comments = value; 436117395Skan break; 437117395Skan 438117395Skan case OPT_Wdeprecated: 439132718Skan cpp_opts->warn_deprecated = value; 440117395Skan break; 441117395Skan 442117395Skan case OPT_Wendif_labels: 443132718Skan cpp_opts->warn_endif_labels = value; 444117395Skan break; 445117395Skan 446117395Skan case OPT_Werror: 447132718Skan cpp_opts->warnings_are_errors = value; 448169699Skan global_dc->warning_as_error_requested = value; 449117395Skan break; 450117395Skan 451132718Skan case OPT_Werror_implicit_function_declaration: 452132718Skan mesg_implicit_function_declaration = 2; 453117395Skan break; 454117395Skan 455117395Skan case OPT_Wformat: 456132718Skan set_Wformat (value); 457117395Skan break; 458117395Skan 459132718Skan case OPT_Wformat_: 460117395Skan set_Wformat (atoi (arg)); 461117395Skan break; 462117395Skan 463117395Skan case OPT_Wimplicit: 464132718Skan set_Wimplicit (value); 465117395Skan break; 466117395Skan 467117395Skan case OPT_Wimport: 468132718Skan /* Silently ignore for now. */ 469117395Skan break; 470117395Skan 471132718Skan case OPT_Winvalid_pch: 472132718Skan cpp_opts->warn_invalid_pch = value; 473132718Skan break; 474132718Skan 475117395Skan case OPT_Wmain: 476132718Skan if (value) 477117395Skan warn_main = 1; 478117395Skan else 479117395Skan warn_main = -1; 480117395Skan break; 481117395Skan 482169699Skan case OPT_Wmissing_include_dirs: 483169699Skan cpp_opts->warn_missing_include_dirs = value; 484117395Skan break; 485117395Skan 486117395Skan case OPT_Wmultichar: 487132718Skan cpp_opts->warn_multichar = value; 488117395Skan break; 489117395Skan 490259890Spfg /* APPLE LOCAL begin -Wnewline-eof */ 491259890Spfg case OPT_Wnewline_eof: 492259890Spfg cpp_opts->warn_newline_at_eof = value; 493259890Spfg break; 494259890Spfg /* APPLE LOCAL end -Wnewline-eof */ 495259890Spfg 496169699Skan case OPT_Wnormalized_: 497169699Skan if (!value || (arg && strcasecmp (arg, "none") == 0)) 498169699Skan cpp_opts->warn_normalize = normalized_none; 499169699Skan else if (!arg || strcasecmp (arg, "nfkc") == 0) 500169699Skan cpp_opts->warn_normalize = normalized_KC; 501169699Skan else if (strcasecmp (arg, "id") == 0) 502169699Skan cpp_opts->warn_normalize = normalized_identifier_C; 503169699Skan else if (strcasecmp (arg, "nfc") == 0) 504169699Skan cpp_opts->warn_normalize = normalized_C; 505169699Skan else 506169699Skan error ("argument %qs to %<-Wnormalized%> not recognized", arg); 507117395Skan break; 508117395Skan 509117395Skan case OPT_Wreturn_type: 510132718Skan warn_return_type = value; 511117395Skan break; 512117395Skan 513169699Skan case OPT_Wstrict_null_sentinel: 514169699Skan warn_strict_null_sentinel = value; 515117395Skan break; 516117395Skan 517117395Skan case OPT_Wsystem_headers: 518132718Skan cpp_opts->warn_system_headers = value; 519117395Skan break; 520117395Skan 521117395Skan case OPT_Wtraditional: 522132718Skan cpp_opts->warn_traditional = value; 523117395Skan break; 524117395Skan 525117395Skan case OPT_Wtrigraphs: 526132718Skan cpp_opts->warn_trigraphs = value; 527117395Skan break; 528117395Skan 529117395Skan case OPT_Wundef: 530132718Skan cpp_opts->warn_undef = value; 531117395Skan break; 532117395Skan 533117395Skan case OPT_Wunknown_pragmas: 534117395Skan /* Set to greater than 1, so that even unknown pragmas in 535132718Skan system headers will be warned about. */ 536132718Skan warn_unknown_pragmas = value * 2; 537117395Skan break; 538117395Skan 539117395Skan case OPT_Wunused_macros: 540132718Skan warn_unused_macros = value; 541117395Skan break; 542117395Skan 543169699Skan case OPT_Wvariadic_macros: 544169699Skan warn_variadic_macros = value; 545169699Skan break; 546169699Skan 547117395Skan case OPT_Wwrite_strings: 548169699Skan warn_write_strings = value; 549117395Skan break; 550132718Skan 551169699Skan case OPT_Weffc__: 552169699Skan warn_ecpp = value; 553169699Skan if (value) 554169699Skan warn_nonvdtor = true; 555169699Skan break; 556169699Skan 557117395Skan case OPT_ansi: 558132718Skan if (!c_dialect_cxx ()) 559117395Skan set_std_c89 (false, true); 560117395Skan else 561117395Skan set_std_cxx98 (true); 562117395Skan break; 563117395Skan 564117395Skan case OPT_d: 565117395Skan handle_OPT_d (arg); 566117395Skan break; 567117395Skan 568117395Skan case OPT_fcond_mismatch: 569132718Skan if (!c_dialect_cxx ()) 570117395Skan { 571132718Skan flag_cond_mismatch = value; 572117395Skan break; 573117395Skan } 574117395Skan /* Fall through. */ 575117395Skan 576117395Skan case OPT_fall_virtual: 577132718Skan case OPT_falt_external_templates: 578117395Skan case OPT_fenum_int_equiv: 579132718Skan case OPT_fexternal_templates: 580117395Skan case OPT_fguiding_decls: 581117395Skan case OPT_fhonor_std: 582117395Skan case OPT_fhuge_objects: 583117395Skan case OPT_flabels_ok: 584132718Skan case OPT_fname_mangling_version_: 585117395Skan case OPT_fnew_abi: 586117395Skan case OPT_fnonnull_objects: 587117395Skan case OPT_fsquangle: 588117395Skan case OPT_fstrict_prototype: 589117395Skan case OPT_fthis_is_variable: 590117395Skan case OPT_fvtable_thunks: 591117395Skan case OPT_fxref: 592132718Skan case OPT_fvtable_gc: 593169699Skan warning (0, "switch %qs is no longer supported", option->opt_text); 594117395Skan break; 595117395Skan 596117395Skan case OPT_faccess_control: 597132718Skan flag_access_control = value; 598117395Skan break; 599117395Skan 600117395Skan case OPT_fasm: 601132718Skan flag_no_asm = !value; 602117395Skan break; 603117395Skan 604117395Skan case OPT_fbuiltin: 605132718Skan flag_no_builtin = !value; 606117395Skan break; 607117395Skan 608117395Skan case OPT_fbuiltin_: 609132718Skan if (value) 610117395Skan result = 0; 611117395Skan else 612117395Skan disable_builtin_function (arg); 613117395Skan break; 614117395Skan 615259405Spfg case OPT_fdirectives_only: 616259405Spfg cpp_opts->directives_only = 1; 617259405Spfg break; 618259405Spfg 619117395Skan case OPT_fdollars_in_identifiers: 620132718Skan cpp_opts->dollars_in_ident = value; 621117395Skan break; 622117395Skan 623117395Skan case OPT_ffreestanding: 624132718Skan value = !value; 625132718Skan /* Fall through.... */ 626117395Skan case OPT_fhosted: 627132718Skan flag_hosted = value; 628132718Skan flag_no_builtin = !value; 629117395Skan /* warn_main will be 2 if set by -Wall, 1 if set by -Wmain */ 630132718Skan if (!value && warn_main == 2) 631117395Skan warn_main = 0; 632117395Skan break; 633117395Skan 634117395Skan case OPT_fshort_double: 635132718Skan flag_short_double = value; 636117395Skan break; 637117395Skan 638117395Skan case OPT_fshort_enums: 639132718Skan flag_short_enums = value; 640117395Skan break; 641117395Skan 642117395Skan case OPT_fshort_wchar: 643132718Skan flag_short_wchar = value; 644117395Skan break; 645117395Skan 646117395Skan case OPT_fsigned_bitfields: 647132718Skan flag_signed_bitfields = value; 648117395Skan break; 649117395Skan 650117395Skan case OPT_fsigned_char: 651132718Skan flag_signed_char = value; 652117395Skan break; 653117395Skan 654117395Skan case OPT_funsigned_bitfields: 655132718Skan flag_signed_bitfields = !value; 656117395Skan break; 657117395Skan 658117395Skan case OPT_funsigned_char: 659132718Skan flag_signed_char = !value; 660117395Skan break; 661117395Skan 662117395Skan case OPT_fcheck_new: 663132718Skan flag_check_new = value; 664117395Skan break; 665117395Skan 666117395Skan case OPT_fconserve_space: 667132718Skan flag_conserve_space = value; 668117395Skan break; 669117395Skan 670132718Skan case OPT_fconstant_string_class_: 671117395Skan constant_string_class_name = arg; 672117395Skan break; 673117395Skan 674117395Skan case OPT_fdefault_inline: 675132718Skan flag_default_inline = value; 676117395Skan break; 677117395Skan 678117395Skan case OPT_felide_constructors: 679132718Skan flag_elide_constructors = value; 680117395Skan break; 681117395Skan 682117395Skan case OPT_fenforce_eh_specs: 683132718Skan flag_enforce_eh_specs = value; 684117395Skan break; 685117395Skan 686169699Skan case OPT_fextended_identifiers: 687169699Skan cpp_opts->extended_identifiers = value; 688117395Skan break; 689117395Skan 690117395Skan case OPT_ffor_scope: 691132718Skan flag_new_for_scope = value; 692117395Skan break; 693117395Skan 694117395Skan case OPT_fgnu_keywords: 695132718Skan flag_no_gnu_keywords = !value; 696117395Skan break; 697117395Skan 698117395Skan case OPT_fgnu_runtime: 699132718Skan flag_next_runtime = !value; 700117395Skan break; 701117395Skan 702117395Skan case OPT_fhandle_exceptions: 703169699Skan warning (0, "-fhandle-exceptions has been renamed -fexceptions (and is now on by default)"); 704132718Skan flag_exceptions = value; 705117395Skan break; 706117395Skan 707117395Skan case OPT_fimplement_inlines: 708132718Skan flag_implement_inlines = value; 709117395Skan break; 710117395Skan 711117395Skan case OPT_fimplicit_inline_templates: 712132718Skan flag_implicit_inline_templates = value; 713117395Skan break; 714117395Skan 715117395Skan case OPT_fimplicit_templates: 716132718Skan flag_implicit_templates = value; 717117395Skan break; 718117395Skan 719260074Spfg case OPT_flax_vector_conversions: 720260074Spfg flag_lax_vector_conversions = value; 721260074Spfg break; 722260074Spfg 723117395Skan case OPT_fms_extensions: 724132718Skan flag_ms_extensions = value; 725117395Skan break; 726117395Skan 727117395Skan case OPT_fnext_runtime: 728132718Skan flag_next_runtime = value; 729117395Skan break; 730117395Skan 731132718Skan case OPT_fnil_receivers: 732132718Skan flag_nil_receivers = value; 733132718Skan break; 734132718Skan 735117395Skan case OPT_fnonansi_builtins: 736132718Skan flag_no_nonansi_builtin = !value; 737117395Skan break; 738117395Skan 739117395Skan case OPT_foperator_names: 740132718Skan cpp_opts->operator_names = value; 741117395Skan break; 742117395Skan 743117395Skan case OPT_foptional_diags: 744132718Skan flag_optional_diags = value; 745117395Skan break; 746117395Skan 747132718Skan case OPT_fpch_deps: 748132718Skan cpp_opts->restore_pch_deps = value; 749132718Skan break; 750132718Skan 751169699Skan case OPT_fpch_preprocess: 752169699Skan flag_pch_preprocess = value; 753169699Skan break; 754169699Skan 755117395Skan case OPT_fpermissive: 756132718Skan flag_permissive = value; 757117395Skan break; 758117395Skan 759117395Skan case OPT_fpreprocessed: 760132718Skan cpp_opts->preprocessed = value; 761117395Skan break; 762117395Skan 763132718Skan case OPT_freplace_objc_classes: 764132718Skan flag_replace_objc_classes = value; 765132718Skan break; 766169699Skan 767117395Skan case OPT_frepo: 768132718Skan flag_use_repository = value; 769132718Skan if (value) 770117395Skan flag_implicit_templates = 0; 771117395Skan break; 772117395Skan 773117395Skan case OPT_frtti: 774132718Skan flag_rtti = value; 775117395Skan break; 776117395Skan 777117395Skan case OPT_fshow_column: 778132718Skan cpp_opts->show_column = value; 779117395Skan break; 780117395Skan 781117395Skan case OPT_fstats: 782132718Skan flag_detailed_statistics = value; 783117395Skan break; 784117395Skan 785132718Skan case OPT_ftabstop_: 786117395Skan /* It is documented that we silently ignore silly values. */ 787132718Skan if (value >= 1 && value <= 100) 788132718Skan cpp_opts->tabstop = value; 789117395Skan break; 790117395Skan 791132718Skan case OPT_fexec_charset_: 792132718Skan cpp_opts->narrow_charset = arg; 793117395Skan break; 794117395Skan 795132718Skan case OPT_fwide_exec_charset_: 796132718Skan cpp_opts->wide_charset = arg; 797117395Skan break; 798117395Skan 799132718Skan case OPT_finput_charset_: 800132718Skan cpp_opts->input_charset = arg; 801132718Skan break; 802132718Skan 803132718Skan case OPT_ftemplate_depth_: 804132718Skan max_tinst_depth = value; 805132718Skan break; 806132718Skan 807117395Skan case OPT_fuse_cxa_atexit: 808132718Skan flag_use_cxa_atexit = value; 809117395Skan break; 810169699Skan 811169699Skan case OPT_fuse_cxa_get_exception_ptr: 812169699Skan flag_use_cxa_get_exception_ptr = value; 813169699Skan break; 814117395Skan 815169699Skan case OPT_fvisibility_inlines_hidden: 816169699Skan visibility_options.inlines_hidden = value; 817169699Skan break; 818169699Skan 819117395Skan case OPT_fweak: 820132718Skan flag_weak = value; 821117395Skan break; 822117395Skan 823169699Skan case OPT_fthreadsafe_statics: 824169699Skan flag_threadsafe_statics = value; 825169699Skan break; 826169699Skan 827132718Skan case OPT_fzero_link: 828132718Skan flag_zero_link = value; 829132718Skan break; 830132718Skan 831117395Skan case OPT_gen_decls: 832117395Skan flag_gen_declaration = 1; 833117395Skan break; 834117395Skan 835259268Spfg case OPT_femit_struct_debug_baseonly: 836259268Spfg set_struct_debug_option ("base"); 837259268Spfg break; 838259268Spfg 839259268Spfg case OPT_femit_struct_debug_reduced: 840259268Spfg set_struct_debug_option ("dir:ord:sys,dir:gen:any,ind:base"); 841259268Spfg break; 842259268Spfg 843259268Spfg case OPT_femit_struct_debug_detailed_: 844259268Spfg set_struct_debug_option (arg); 845259268Spfg break; 846259268Spfg 847132718Skan case OPT_idirafter: 848169699Skan add_path (xstrdup (arg), AFTER, 0, true); 849132718Skan break; 850132718Skan 851132718Skan case OPT_imacros: 852132718Skan case OPT_include: 853132718Skan defer_opt (code, arg); 854132718Skan break; 855132718Skan 856169699Skan case OPT_imultilib: 857169699Skan imultilib = arg; 858169699Skan break; 859169699Skan 860132718Skan case OPT_iprefix: 861132718Skan iprefix = arg; 862132718Skan break; 863132718Skan 864169699Skan case OPT_iquote: 865169699Skan add_path (xstrdup (arg), QUOTE, 0, true); 866169699Skan break; 867169699Skan 868132718Skan case OPT_isysroot: 869132718Skan sysroot = arg; 870132718Skan break; 871132718Skan 872132718Skan case OPT_isystem: 873169699Skan add_path (xstrdup (arg), SYSTEM, 0, true); 874132718Skan break; 875132718Skan 876132718Skan case OPT_iwithprefix: 877132718Skan add_prefixed_path (arg, SYSTEM); 878132718Skan break; 879132718Skan 880132718Skan case OPT_iwithprefixbefore: 881132718Skan add_prefixed_path (arg, BRACKET); 882132718Skan break; 883132718Skan 884117395Skan case OPT_lang_asm: 885117395Skan cpp_set_lang (parse_in, CLK_ASM); 886132718Skan cpp_opts->dollars_in_ident = false; 887117395Skan break; 888117395Skan 889169699Skan case OPT_lang_fortran: 890169699Skan lang_fortran = true; 891169699Skan break; 892169699Skan 893117395Skan case OPT_lang_objc: 894117395Skan cpp_opts->objc = 1; 895117395Skan break; 896117395Skan 897117395Skan case OPT_nostdinc: 898132718Skan std_inc = false; 899117395Skan break; 900117395Skan 901132718Skan case OPT_nostdinc__: 902132718Skan std_cxx_inc = false; 903117395Skan break; 904117395Skan 905117395Skan case OPT_o: 906117395Skan if (!out_fname) 907117395Skan out_fname = arg; 908117395Skan else 909132718Skan error ("output filename specified twice"); 910117395Skan break; 911117395Skan 912117395Skan /* We need to handle the -pedantic switches here, rather than in 913117395Skan c_common_post_options, so that a subsequent -Wno-endif-labels 914117395Skan is not overridden. */ 915117395Skan case OPT_pedantic_errors: 916117395Skan cpp_opts->pedantic_errors = 1; 917132718Skan /* Fall through. */ 918117395Skan case OPT_pedantic: 919117395Skan cpp_opts->pedantic = 1; 920117395Skan cpp_opts->warn_endif_labels = 1; 921169699Skan if (warn_pointer_sign == -1) 922169699Skan warn_pointer_sign = 1; 923169699Skan if (warn_overlength_strings == -1) 924169699Skan warn_overlength_strings = 1; 925117395Skan break; 926117395Skan 927117395Skan case OPT_print_objc_runtime_info: 928117395Skan print_struct_values = 1; 929117395Skan break; 930117395Skan 931169699Skan case OPT_print_pch_checksum: 932169699Skan c_common_print_pch_checksum (stdout); 933169699Skan exit_after_options = true; 934169699Skan break; 935169699Skan 936117395Skan case OPT_remap: 937117395Skan cpp_opts->remap = 1; 938117395Skan break; 939117395Skan 940132718Skan case OPT_std_c__98: 941132718Skan case OPT_std_gnu__98: 942169699Skan if (!preprocessing_asm_p) 943169699Skan set_std_cxx98 (code == OPT_std_c__98 /* ISO */); 944117395Skan break; 945117395Skan 946117395Skan case OPT_std_c89: 947117395Skan case OPT_std_iso9899_1990: 948117395Skan case OPT_std_iso9899_199409: 949169699Skan if (!preprocessing_asm_p) 950169699Skan set_std_c89 (code == OPT_std_iso9899_199409 /* c94 */, true /* ISO */); 951117395Skan break; 952117395Skan 953117395Skan case OPT_std_gnu89: 954169699Skan if (!preprocessing_asm_p) 955169699Skan set_std_c89 (false /* c94 */, false /* ISO */); 956117395Skan break; 957117395Skan 958117395Skan case OPT_std_c99: 959117395Skan case OPT_std_c9x: 960117395Skan case OPT_std_iso9899_1999: 961117395Skan case OPT_std_iso9899_199x: 962169699Skan if (!preprocessing_asm_p) 963169699Skan set_std_c99 (true /* ISO */); 964117395Skan break; 965117395Skan 966117395Skan case OPT_std_gnu99: 967117395Skan case OPT_std_gnu9x: 968169699Skan if (!preprocessing_asm_p) 969169699Skan set_std_c99 (false /* ISO */); 970117395Skan break; 971117395Skan 972117395Skan case OPT_trigraphs: 973117395Skan cpp_opts->trigraphs = 1; 974117395Skan break; 975117395Skan 976117395Skan case OPT_traditional_cpp: 977117395Skan cpp_opts->traditional = 1; 978117395Skan break; 979117395Skan 980117395Skan case OPT_undef: 981117395Skan flag_undef = 1; 982117395Skan break; 983117395Skan 984117395Skan case OPT_w: 985117395Skan cpp_opts->inhibit_warnings = 1; 986117395Skan break; 987117395Skan 988117395Skan case OPT_v: 989132718Skan verbose = true; 990117395Skan break; 991117395Skan } 992117395Skan 993117395Skan return result; 994117395Skan} 995117395Skan 996117395Skan/* Post-switch processing. */ 997117395Skanbool 998132718Skanc_common_post_options (const char **pfilename) 999117395Skan{ 1000132718Skan struct cpp_callbacks *cb; 1001132718Skan 1002117395Skan /* Canonicalize the input and output filenames. */ 1003132718Skan if (in_fnames == NULL) 1004132718Skan { 1005169699Skan in_fnames = XNEWVEC (const char *, 1); 1006132718Skan in_fnames[0] = ""; 1007132718Skan } 1008132718Skan else if (strcmp (in_fnames[0], "-") == 0) 1009132718Skan in_fnames[0] = ""; 1010117395Skan 1011117395Skan if (out_fname == NULL || !strcmp (out_fname, "-")) 1012117395Skan out_fname = ""; 1013117395Skan 1014117395Skan if (cpp_opts->deps.style == DEPS_NONE) 1015117395Skan check_deps_environment_vars (); 1016117395Skan 1017117395Skan handle_deferred_opts (); 1018117395Skan 1019117395Skan sanitize_cpp_opts (); 1020117395Skan 1021169699Skan register_include_chains (parse_in, sysroot, iprefix, imultilib, 1022132718Skan std_inc, std_cxx_inc && c_dialect_cxx (), verbose); 1023132718Skan 1024169699Skan#ifdef C_COMMON_OVERRIDE_OPTIONS 1025169699Skan /* Some machines may reject certain combinations of C 1026169699Skan language-specific options. */ 1027169699Skan C_COMMON_OVERRIDE_OPTIONS; 1028169699Skan#endif 1029169699Skan 1030117395Skan flag_inline_trees = 1; 1031117395Skan 1032169699Skan /* Use tree inlining. */ 1033169699Skan if (!flag_no_inline) 1034169699Skan flag_no_inline = 1; 1035169699Skan if (flag_inline_functions) 1036169699Skan flag_inline_trees = 2; 1037117395Skan 1038189824Sdas /* By default we use C99 inline semantics in GNU99 or C99 mode. C99 1039189824Sdas inline semantics are not supported in GNU89 or C89 mode. */ 1040189824Sdas if (flag_gnu89_inline == -1) 1041189824Sdas flag_gnu89_inline = !flag_isoc99; 1042189824Sdas else if (!flag_gnu89_inline && !flag_isoc99) 1043189824Sdas error ("-fno-gnu89-inline is only supported in GNU99 or C99 mode"); 1044169699Skan 1045169699Skan /* If we are given more than one input file, we must use 1046169699Skan unit-at-a-time mode. */ 1047169699Skan if (num_in_fnames > 1) 1048169699Skan flag_unit_at_a_time = 1; 1049169699Skan 1050169699Skan /* Default to ObjC sjlj exception handling if NeXT runtime. */ 1051169699Skan if (flag_objc_sjlj_exceptions < 0) 1052169699Skan flag_objc_sjlj_exceptions = flag_next_runtime; 1053169699Skan if (flag_objc_exceptions && !flag_objc_sjlj_exceptions) 1054169699Skan flag_exceptions = 1; 1055169699Skan 1056169699Skan /* -Wextra implies -Wsign-compare, -Wmissing-field-initializers and 1057169699Skan -Woverride-init, but not if explicitly overridden. */ 1058132718Skan if (warn_sign_compare == -1) 1059132718Skan warn_sign_compare = extra_warnings; 1060169699Skan if (warn_missing_field_initializers == -1) 1061169699Skan warn_missing_field_initializers = extra_warnings; 1062169699Skan if (warn_override_init == -1) 1063169699Skan warn_override_init = extra_warnings; 1064132718Skan 1065169699Skan /* -Wpointer_sign is disabled by default, but it is enabled if any 1066169699Skan of -Wall or -pedantic are given. */ 1067169699Skan if (warn_pointer_sign == -1) 1068169699Skan warn_pointer_sign = 0; 1069169699Skan 1070169699Skan /* -Woverlength-strings is off by default, but is enabled by -pedantic. 1071169699Skan It is never enabled in C++, as the minimum limit is not normative 1072169699Skan in that standard. */ 1073169699Skan if (warn_overlength_strings == -1 || c_dialect_cxx ()) 1074169699Skan warn_overlength_strings = 0; 1075169699Skan 1076117395Skan /* Special format checking options don't work without -Wformat; warn if 1077117395Skan they are used. */ 1078169699Skan if (!warn_format) 1079169699Skan { 1080169699Skan warning (OPT_Wformat_y2k, 1081169699Skan "-Wformat-y2k ignored without -Wformat"); 1082169699Skan warning (OPT_Wformat_extra_args, 1083169699Skan "-Wformat-extra-args ignored without -Wformat"); 1084169699Skan warning (OPT_Wformat_zero_length, 1085169699Skan "-Wformat-zero-length ignored without -Wformat"); 1086169699Skan warning (OPT_Wformat_nonliteral, 1087169699Skan "-Wformat-nonliteral ignored without -Wformat"); 1088169699Skan warning (OPT_Wformat_security, 1089169699Skan "-Wformat-security ignored without -Wformat"); 1090169699Skan } 1091117395Skan 1092169699Skan /* C99 requires special handling of complex multiplication and division; 1093169699Skan -ffast-math and -fcx-limited-range are handled in process_options. */ 1094169699Skan if (flag_isoc99) 1095169699Skan flag_complex_method = 2; 1096169699Skan 1097132718Skan if (flag_preprocess_only) 1098132718Skan { 1099132718Skan /* Open the output now. We must do so even if flag_no_output is 1100132718Skan on, because there may be other output than from the actual 1101132718Skan preprocessing (e.g. from -dM). */ 1102132718Skan if (out_fname[0] == '\0') 1103132718Skan out_stream = stdout; 1104132718Skan else 1105132718Skan out_stream = fopen (out_fname, "w"); 1106132718Skan 1107132718Skan if (out_stream == NULL) 1108132718Skan { 1109132718Skan fatal_error ("opening output file %s: %m", out_fname); 1110132718Skan return false; 1111132718Skan } 1112132718Skan 1113132718Skan if (num_in_fnames > 1) 1114132718Skan error ("too many filenames given. Type %s --help for usage", 1115132718Skan progname); 1116132718Skan 1117132718Skan init_pp_output (out_stream); 1118132718Skan } 1119132718Skan else 1120132718Skan { 1121132718Skan init_c_lex (); 1122132718Skan 1123132718Skan /* Yuk. WTF is this? I do know ObjC relies on it somewhere. */ 1124169699Skan input_location = UNKNOWN_LOCATION; 1125132718Skan } 1126132718Skan 1127132718Skan cb = cpp_get_callbacks (parse_in); 1128132718Skan cb->file_change = cb_file_change; 1129132718Skan cb->dir_change = cb_dir_change; 1130132718Skan cpp_post_options (parse_in); 1131132718Skan 1132169699Skan input_location = UNKNOWN_LOCATION; 1133132718Skan 1134117395Skan /* If an error has occurred in cpplib, note it so we fail 1135117395Skan immediately. */ 1136117395Skan errorcount += cpp_errors (parse_in); 1137117395Skan 1138132718Skan *pfilename = this_input_filename 1139132718Skan = cpp_read_main_file (parse_in, in_fnames[0]); 1140146908Skan /* Don't do any compilation or preprocessing if there is no input file. */ 1141132718Skan if (this_input_filename == NULL) 1142146908Skan { 1143146908Skan errorcount++; 1144146908Skan return false; 1145146908Skan } 1146117395Skan 1147132718Skan if (flag_working_directory 1148169699Skan && flag_preprocess_only && !flag_no_line_commands) 1149132718Skan pp_dir_change (parse_in, get_src_pwd ()); 1150117395Skan 1151132718Skan return flag_preprocess_only; 1152117395Skan} 1153117395Skan 1154117395Skan/* Front end initialization common to C, ObjC and C++. */ 1155132718Skanbool 1156132718Skanc_common_init (void) 1157117395Skan{ 1158117395Skan /* Set up preprocessor arithmetic. Must be done after call to 1159117395Skan c_common_nodes_and_builtins for type nodes to be good. */ 1160117395Skan cpp_opts->precision = TYPE_PRECISION (intmax_type_node); 1161117395Skan cpp_opts->char_precision = TYPE_PRECISION (char_type_node); 1162117395Skan cpp_opts->int_precision = TYPE_PRECISION (integer_type_node); 1163117395Skan cpp_opts->wchar_precision = TYPE_PRECISION (wchar_type_node); 1164169699Skan cpp_opts->unsigned_wchar = TYPE_UNSIGNED (wchar_type_node); 1165132718Skan cpp_opts->bytes_big_endian = BYTES_BIG_ENDIAN; 1166117395Skan 1167132718Skan /* This can't happen until after wchar_precision and bytes_big_endian 1168132718Skan are known. */ 1169132718Skan cpp_init_iconv (parse_in); 1170117395Skan 1171169699Skan if (version_flag) 1172169699Skan c_common_print_pch_checksum (stderr); 1173169699Skan 1174117395Skan if (flag_preprocess_only) 1175117395Skan { 1176132718Skan finish_options (); 1177132718Skan preprocess_file (parse_in); 1178132718Skan return false; 1179117395Skan } 1180117395Skan 1181132718Skan /* Has to wait until now so that cpplib has its hash table. */ 1182117395Skan init_pragma (); 1183117395Skan 1184132718Skan return true; 1185117395Skan} 1186117395Skan 1187132718Skan/* Initialize the integrated preprocessor after debug output has been 1188132718Skan initialized; loop over each input file. */ 1189132718Skanvoid 1190169699Skanc_common_parse_file (int set_yydebug) 1191132718Skan{ 1192169699Skan unsigned int i; 1193169699Skan 1194169699Skan /* Enable parser debugging, if requested and we can. If requested 1195169699Skan and we can't, notify the user. */ 1196132718Skan#if YYDEBUG != 0 1197132718Skan yydebug = set_yydebug; 1198132718Skan#else 1199169699Skan if (set_yydebug) 1200169699Skan warning (0, "YYDEBUG was not defined at build time, -dy ignored"); 1201132718Skan#endif 1202132718Skan 1203169699Skan i = 0; 1204169699Skan for (;;) 1205132718Skan { 1206169699Skan /* Start the main input file, if the debug writer wants it. */ 1207169699Skan if (debug_hooks->start_end_main_source_file) 1208169699Skan (*debug_hooks->start_source_file) (0, this_input_filename); 1209132718Skan finish_options (); 1210169699Skan pch_init (); 1211169699Skan push_file_scope (); 1212132718Skan c_parse_file (); 1213169699Skan finish_file (); 1214169699Skan pop_file_scope (); 1215169699Skan /* And end the main input file, if the debug writer wants it */ 1216169699Skan if (debug_hooks->start_end_main_source_file) 1217169699Skan (*debug_hooks->end_source_file) (0); 1218169699Skan if (++i >= num_in_fnames) 1219169699Skan break; 1220169699Skan cpp_undef_all (parse_in); 1221169699Skan this_input_filename 1222169699Skan = cpp_read_main_file (parse_in, in_fnames[i]); 1223169699Skan /* If an input file is missing, abandon further compilation. 1224169699Skan cpplib has issued a diagnostic. */ 1225169699Skan if (!this_input_filename) 1226169699Skan break; 1227169699Skan } 1228132718Skan} 1229132718Skan 1230117395Skan/* Common finish hook for the C, ObjC and C++ front ends. */ 1231117395Skanvoid 1232132718Skanc_common_finish (void) 1233117395Skan{ 1234117395Skan FILE *deps_stream = NULL; 1235117395Skan 1236117395Skan if (cpp_opts->deps.style != DEPS_NONE) 1237117395Skan { 1238117395Skan /* If -M or -MM was seen without -MF, default output to the 1239117395Skan output stream. */ 1240117395Skan if (!deps_file) 1241117395Skan deps_stream = out_stream; 1242117395Skan else 1243117395Skan { 1244117395Skan deps_stream = fopen (deps_file, deps_append ? "a": "w"); 1245117395Skan if (!deps_stream) 1246132718Skan fatal_error ("opening dependency file %s: %m", deps_file); 1247117395Skan } 1248117395Skan } 1249117395Skan 1250117395Skan /* For performance, avoid tearing down cpplib's internal structures 1251117395Skan with cpp_destroy (). */ 1252117395Skan errorcount += cpp_finish (parse_in, deps_stream); 1253117395Skan 1254117395Skan if (deps_stream && deps_stream != out_stream 1255117395Skan && (ferror (deps_stream) || fclose (deps_stream))) 1256132718Skan fatal_error ("closing dependency file %s: %m", deps_file); 1257117395Skan 1258117395Skan if (out_stream && (ferror (out_stream) || fclose (out_stream))) 1259132718Skan fatal_error ("when writing output to %s: %m", out_fname); 1260117395Skan} 1261117395Skan 1262117395Skan/* Either of two environment variables can specify output of 1263117395Skan dependencies. Their value is either "OUTPUT_FILE" or "OUTPUT_FILE 1264117395Skan DEPS_TARGET", where OUTPUT_FILE is the file to write deps info to 1265117395Skan and DEPS_TARGET is the target to mention in the deps. They also 1266117395Skan result in dependency information being appended to the output file 1267117395Skan rather than overwriting it, and like Sun's compiler 1268117395Skan SUNPRO_DEPENDENCIES suppresses the dependency on the main file. */ 1269117395Skanstatic void 1270132718Skancheck_deps_environment_vars (void) 1271117395Skan{ 1272117395Skan char *spec; 1273117395Skan 1274117395Skan GET_ENVIRONMENT (spec, "DEPENDENCIES_OUTPUT"); 1275117395Skan if (spec) 1276117395Skan cpp_opts->deps.style = DEPS_USER; 1277117395Skan else 1278117395Skan { 1279117395Skan GET_ENVIRONMENT (spec, "SUNPRO_DEPENDENCIES"); 1280117395Skan if (spec) 1281117395Skan { 1282117395Skan cpp_opts->deps.style = DEPS_SYSTEM; 1283117395Skan cpp_opts->deps.ignore_main_file = true; 1284117395Skan } 1285117395Skan } 1286117395Skan 1287117395Skan if (spec) 1288117395Skan { 1289117395Skan /* Find the space before the DEPS_TARGET, if there is one. */ 1290117395Skan char *s = strchr (spec, ' '); 1291117395Skan if (s) 1292117395Skan { 1293117395Skan /* Let the caller perform MAKE quoting. */ 1294117395Skan defer_opt (OPT_MT, s + 1); 1295117395Skan *s = '\0'; 1296117395Skan } 1297117395Skan 1298117395Skan /* Command line -MF overrides environment variables and default. */ 1299117395Skan if (!deps_file) 1300117395Skan deps_file = spec; 1301117395Skan 1302117395Skan deps_append = 1; 1303169699Skan deps_seen = true; 1304117395Skan } 1305117395Skan} 1306117395Skan 1307117395Skan/* Handle deferred command line switches. */ 1308117395Skanstatic void 1309132718Skanhandle_deferred_opts (void) 1310117395Skan{ 1311117395Skan size_t i; 1312169699Skan struct deps *deps; 1313117395Skan 1314169699Skan /* Avoid allocating the deps buffer if we don't need it. 1315169699Skan (This flag may be true without there having been -MT or -MQ 1316169699Skan options, but we'll still need the deps buffer.) */ 1317169699Skan if (!deps_seen) 1318169699Skan return; 1319169699Skan 1320169699Skan deps = cpp_get_deps (parse_in); 1321169699Skan 1322117395Skan for (i = 0; i < deferred_count; i++) 1323117395Skan { 1324117395Skan struct deferred_opt *opt = &deferred_opts[i]; 1325117395Skan 1326132718Skan if (opt->code == OPT_MT || opt->code == OPT_MQ) 1327169699Skan deps_add_target (deps, opt->arg, opt->code == OPT_MQ); 1328117395Skan } 1329117395Skan} 1330117395Skan 1331117395Skan/* These settings are appropriate for GCC, but not necessarily so for 1332117395Skan cpplib as a library. */ 1333117395Skanstatic void 1334132718Skansanitize_cpp_opts (void) 1335117395Skan{ 1336117395Skan /* If we don't know what style of dependencies to output, complain 1337117395Skan if any other dependency switches have been given. */ 1338117395Skan if (deps_seen && cpp_opts->deps.style == DEPS_NONE) 1339117395Skan error ("to generate dependencies you must specify either -M or -MM"); 1340117395Skan 1341117395Skan /* -dM and dependencies suppress normal output; do it here so that 1342117395Skan the last -d[MDN] switch overrides earlier ones. */ 1343132718Skan if (flag_dump_macros == 'M') 1344132718Skan flag_no_output = 1; 1345117395Skan 1346259405Spfg /* By default, -fdirectives-only implies -dD. This allows subsequent phases 1347259405Spfg to perform proper macro expansion. */ 1348259405Spfg if (cpp_opts->directives_only && !cpp_opts->preprocessed && !flag_dump_macros) 1349259405Spfg flag_dump_macros = 'D'; 1350259405Spfg 1351117395Skan /* Disable -dD, -dN and -dI if normal output is suppressed. Allow 1352117395Skan -dM since at least glibc relies on -M -dM to work. */ 1353169699Skan /* Also, flag_no_output implies flag_no_line_commands, always. */ 1354132718Skan if (flag_no_output) 1355117395Skan { 1356132718Skan if (flag_dump_macros != 'M') 1357132718Skan flag_dump_macros = 0; 1358132718Skan flag_dump_includes = 0; 1359146908Skan flag_no_line_commands = 1; 1360117395Skan } 1361117395Skan 1362117395Skan cpp_opts->unsigned_char = !flag_signed_char; 1363117395Skan cpp_opts->stdc_0_in_system_headers = STDC_0_IN_SYSTEM_HEADERS; 1364117395Skan 1365117395Skan /* We want -Wno-long-long to override -pedantic -std=non-c99 1366117395Skan and/or -Wtraditional, whatever the ordering. */ 1367117395Skan cpp_opts->warn_long_long 1368117395Skan = warn_long_long && ((!flag_isoc99 && pedantic) || warn_traditional); 1369132718Skan 1370169699Skan /* Similarly with -Wno-variadic-macros. No check for c99 here, since 1371169699Skan this also turns off warnings about GCCs extension. */ 1372169699Skan cpp_opts->warn_variadic_macros 1373169699Skan = warn_variadic_macros && (pedantic || warn_traditional); 1374169699Skan 1375132718Skan /* If we're generating preprocessor output, emit current directory 1376132718Skan if explicitly requested or if debugging information is enabled. 1377132718Skan ??? Maybe we should only do it for debugging formats that 1378132718Skan actually output the current directory? */ 1379132718Skan if (flag_working_directory == -1) 1380132718Skan flag_working_directory = (debug_info_level != DINFO_LEVEL_NONE); 1381259405Spfg 1382259405Spfg if (cpp_opts->directives_only) 1383259405Spfg { 1384259405Spfg if (warn_unused_macros) 1385259405Spfg error ("-fdirectives-only is incompatible with -Wunused_macros"); 1386259405Spfg if (cpp_opts->traditional) 1387259405Spfg error ("-fdirectives-only is incompatible with -traditional"); 1388259405Spfg } 1389117395Skan} 1390117395Skan 1391132718Skan/* Add include path with a prefix at the front of its name. */ 1392132718Skanstatic void 1393132718Skanadd_prefixed_path (const char *suffix, size_t chain) 1394132718Skan{ 1395132718Skan char *path; 1396132718Skan const char *prefix; 1397132718Skan size_t prefix_len, suffix_len; 1398132718Skan 1399132718Skan suffix_len = strlen (suffix); 1400132718Skan prefix = iprefix ? iprefix : cpp_GCC_INCLUDE_DIR; 1401132718Skan prefix_len = iprefix ? strlen (iprefix) : cpp_GCC_INCLUDE_DIR_len; 1402132718Skan 1403169699Skan path = (char *) xmalloc (prefix_len + suffix_len + 1); 1404132718Skan memcpy (path, prefix, prefix_len); 1405132718Skan memcpy (path + prefix_len, suffix, suffix_len); 1406132718Skan path[prefix_len + suffix_len] = '\0'; 1407132718Skan 1408169699Skan add_path (path, chain, 0, false); 1409132718Skan} 1410132718Skan 1411132718Skan/* Handle -D, -U, -A, -imacros, and the first -include. */ 1412132718Skanstatic void 1413132718Skanfinish_options (void) 1414132718Skan{ 1415132718Skan if (!cpp_opts->preprocessed) 1416132718Skan { 1417132718Skan size_t i; 1418132718Skan 1419169699Skan cb_file_change (parse_in, 1420169699Skan linemap_add (&line_table, LC_RENAME, 0, 1421169699Skan _("<built-in>"), 0)); 1422169699Skan 1423132718Skan cpp_init_builtins (parse_in, flag_hosted); 1424132718Skan c_cpp_builtins (parse_in); 1425132718Skan 1426132718Skan /* We're about to send user input to cpplib, so make it warn for 1427132718Skan things that we previously (when we sent it internal definitions) 1428132718Skan told it to not warn. 1429132718Skan 1430132718Skan C99 permits implementation-defined characters in identifiers. 1431132718Skan The documented meaning of -std= is to turn off extensions that 1432132718Skan conflict with the specified standard, and since a strictly 1433132718Skan conforming program cannot contain a '$', we do not condition 1434132718Skan their acceptance on the -std= setting. */ 1435132718Skan cpp_opts->warn_dollars = (cpp_opts->pedantic && !cpp_opts->c99); 1436132718Skan 1437169699Skan cb_file_change (parse_in, 1438169699Skan linemap_add (&line_table, LC_RENAME, 0, 1439169699Skan _("<command-line>"), 0)); 1440169699Skan 1441132718Skan for (i = 0; i < deferred_count; i++) 1442132718Skan { 1443132718Skan struct deferred_opt *opt = &deferred_opts[i]; 1444132718Skan 1445132718Skan if (opt->code == OPT_D) 1446132718Skan cpp_define (parse_in, opt->arg); 1447132718Skan else if (opt->code == OPT_U) 1448132718Skan cpp_undef (parse_in, opt->arg); 1449132718Skan else if (opt->code == OPT_A) 1450132718Skan { 1451132718Skan if (opt->arg[0] == '-') 1452132718Skan cpp_unassert (parse_in, opt->arg + 1); 1453132718Skan else 1454132718Skan cpp_assert (parse_in, opt->arg); 1455132718Skan } 1456132718Skan } 1457132718Skan 1458132718Skan /* Handle -imacros after -D and -U. */ 1459132718Skan for (i = 0; i < deferred_count; i++) 1460132718Skan { 1461132718Skan struct deferred_opt *opt = &deferred_opts[i]; 1462132718Skan 1463132718Skan if (opt->code == OPT_imacros 1464132718Skan && cpp_push_include (parse_in, opt->arg)) 1465132718Skan { 1466132718Skan /* Disable push_command_line_include callback for now. */ 1467132718Skan include_cursor = deferred_count + 1; 1468132718Skan cpp_scan_nooutput (parse_in); 1469132718Skan } 1470132718Skan } 1471132718Skan } 1472259405Spfg else if (cpp_opts->directives_only) 1473259405Spfg cpp_init_special_builtins (parse_in); 1474132718Skan 1475132718Skan include_cursor = 0; 1476132718Skan push_command_line_include (); 1477132718Skan} 1478132718Skan 1479132718Skan/* Give CPP the next file given by -include, if any. */ 1480132718Skanstatic void 1481132718Skanpush_command_line_include (void) 1482132718Skan{ 1483132718Skan while (include_cursor < deferred_count) 1484132718Skan { 1485132718Skan struct deferred_opt *opt = &deferred_opts[include_cursor++]; 1486132718Skan 1487169699Skan if (!cpp_opts->preprocessed && opt->code == OPT_include 1488132718Skan && cpp_push_include (parse_in, opt->arg)) 1489132718Skan return; 1490132718Skan } 1491132718Skan 1492132718Skan if (include_cursor == deferred_count) 1493132718Skan { 1494132718Skan include_cursor++; 1495132718Skan /* -Wunused-macros should only warn about macros defined hereafter. */ 1496132718Skan cpp_opts->warn_unused_macros = warn_unused_macros; 1497132718Skan /* Restore the line map from <command line>. */ 1498169699Skan if (!cpp_opts->preprocessed) 1499169699Skan cpp_change_file (parse_in, LC_RENAME, this_input_filename); 1500132718Skan 1501132718Skan /* Set this here so the client can change the option if it wishes, 1502132718Skan and after stacking the main file so we don't trace the main file. */ 1503169699Skan line_table.trace_includes = cpp_opts->print_include_names; 1504132718Skan } 1505132718Skan} 1506132718Skan 1507132718Skan/* File change callback. Has to handle -include files. */ 1508132718Skanstatic void 1509169699Skancb_file_change (cpp_reader * ARG_UNUSED (pfile), 1510132718Skan const struct line_map *new_map) 1511132718Skan{ 1512132718Skan if (flag_preprocess_only) 1513132718Skan pp_file_change (new_map); 1514132718Skan else 1515132718Skan fe_file_change (new_map); 1516132718Skan 1517132718Skan if (new_map == 0 || (new_map->reason == LC_LEAVE && MAIN_FILE_P (new_map))) 1518132718Skan push_command_line_include (); 1519132718Skan} 1520132718Skan 1521132718Skanvoid 1522169699Skancb_dir_change (cpp_reader * ARG_UNUSED (pfile), const char *dir) 1523132718Skan{ 1524169699Skan if (!set_src_pwd (dir)) 1525169699Skan warning (0, "too late for # directive to set debug directory"); 1526132718Skan} 1527132718Skan 1528117395Skan/* Set the C 89 standard (with 1994 amendments if C94, without GNU 1529117395Skan extensions if ISO). There is no concept of gnu94. */ 1530117395Skanstatic void 1531132718Skanset_std_c89 (int c94, int iso) 1532117395Skan{ 1533117395Skan cpp_set_lang (parse_in, c94 ? CLK_STDC94: iso ? CLK_STDC89: CLK_GNUC89); 1534117395Skan flag_iso = iso; 1535117395Skan flag_no_asm = iso; 1536117395Skan flag_no_gnu_keywords = iso; 1537117395Skan flag_no_nonansi_builtin = iso; 1538117395Skan flag_isoc94 = c94; 1539117395Skan flag_isoc99 = 0; 1540117395Skan} 1541117395Skan 1542117395Skan/* Set the C 99 standard (without GNU extensions if ISO). */ 1543117395Skanstatic void 1544132718Skanset_std_c99 (int iso) 1545117395Skan{ 1546117395Skan cpp_set_lang (parse_in, iso ? CLK_STDC99: CLK_GNUC99); 1547117395Skan flag_no_asm = iso; 1548117395Skan flag_no_nonansi_builtin = iso; 1549117395Skan flag_iso = iso; 1550117395Skan flag_isoc99 = 1; 1551117395Skan flag_isoc94 = 1; 1552117395Skan} 1553117395Skan 1554117395Skan/* Set the C++ 98 standard (without GNU extensions if ISO). */ 1555117395Skanstatic void 1556132718Skanset_std_cxx98 (int iso) 1557117395Skan{ 1558117395Skan cpp_set_lang (parse_in, iso ? CLK_CXX98: CLK_GNUCXX); 1559117395Skan flag_no_gnu_keywords = iso; 1560117395Skan flag_no_nonansi_builtin = iso; 1561117395Skan flag_iso = iso; 1562117395Skan} 1563117395Skan 1564117395Skan/* Handle setting implicit to ON. */ 1565117395Skanstatic void 1566132718Skanset_Wimplicit (int on) 1567117395Skan{ 1568117395Skan warn_implicit = on; 1569117395Skan warn_implicit_int = on; 1570117395Skan if (on) 1571117395Skan { 1572117395Skan if (mesg_implicit_function_declaration != 2) 1573117395Skan mesg_implicit_function_declaration = 1; 1574117395Skan } 1575117395Skan else 1576117395Skan mesg_implicit_function_declaration = 0; 1577117395Skan} 1578117395Skan 1579117395Skan/* Args to -d specify what to dump. Silently ignore 1580117395Skan unrecognized options; they may be aimed at toplev.c. */ 1581117395Skanstatic void 1582132718Skanhandle_OPT_d (const char *arg) 1583117395Skan{ 1584117395Skan char c; 1585117395Skan 1586117395Skan while ((c = *arg++) != '\0') 1587117395Skan switch (c) 1588117395Skan { 1589132718Skan case 'M': /* Dump macros only. */ 1590132718Skan case 'N': /* Dump names. */ 1591132718Skan case 'D': /* Dump definitions. */ 1592132718Skan flag_dump_macros = c; 1593117395Skan break; 1594117395Skan 1595117395Skan case 'I': 1596132718Skan flag_dump_includes = 1; 1597117395Skan break; 1598117395Skan } 1599117395Skan} 1600