X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=blobdiff_plain;f=gcc%2Fc-opts.c;h=3f773be18d99eb558462328e2c58b3061f834512;hp=462ca240b79ce4669bc7a9a0f09cb2b91b251200;hb=3bb41885ada059987ab4ca46e9f552324fff8bd8;hpb=c7f96907dfe6fede5a989629c99e878a58cf4391 diff --git a/gcc/c-opts.c b/gcc/c-opts.c index 462ca240b79..3f773be18d9 100644 --- a/gcc/c-opts.c +++ b/gcc/c-opts.c @@ -1,5 +1,5 @@ /* C/ObjC/C++ command line option handling. - Copyright (C) 2002, 2003 Free Software Foundation, Inc. + Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. Contributed by Neil Booth. This file is part of GCC. @@ -108,7 +108,8 @@ static void sanitize_cpp_opts (void); static void add_prefixed_path (const char *, size_t); static void push_command_line_include (void); static void cb_file_change (cpp_reader *, const struct line_map *); -static void finish_options (const char *); +static void cb_dir_change (cpp_reader *, const char *); +static void finish_options (void); #ifndef STDC_0_IN_SYSTEM_HEADERS #define STDC_0_IN_SYSTEM_HEADERS 0 @@ -203,7 +204,7 @@ c_common_init_options (unsigned int argc, const char **argv ATTRIBUTE_UNUSED) } parse_in = cpp_create_reader (c_dialect_cxx () ? CLK_GNUCXX: CLK_GNUC89, - ident_hash); + ident_hash, &line_table); cpp_opts = cpp_get_options (parse_in); cpp_opts->dollars_in_ident = DOLLARS_IN_IDENTIFIERS; @@ -475,6 +476,10 @@ c_common_handle_option (size_t scode, const char *arg, int value) warn_format_zero_length = value; break; + case OPT_Winit_self: + warn_init_self = value; + break; + case OPT_Wimplicit: set_Wimplicit (value); break; @@ -546,6 +551,10 @@ c_common_handle_option (size_t scode, const char *arg, int value) warn_nonnull = value; break; + case OPT_Wold_style_definition: + warn_old_style_definition = value; + break; + case OPT_Wold_style_cast: warn_old_style_cast = value; break; @@ -664,7 +673,9 @@ c_common_handle_option (size_t scode, const char *arg, int value) /* Fall through. */ case OPT_fall_virtual: + case OPT_falt_external_templates: case OPT_fenum_int_equiv: + case OPT_fexternal_templates: case OPT_fguiding_decls: case OPT_fhonor_std: case OPT_fhuge_objects: @@ -689,15 +700,6 @@ c_common_handle_option (size_t scode, const char *arg, int value) flag_access_control = value; break; - case OPT_falt_external_templates: - flag_alt_external_templates = value; - if (value) - flag_external_templates = true; - cp_deprecated: - warning ("switch \"%s\" is deprecated, please see documentation " - "for details", option->opt_text); - break; - case OPT_fasm: flag_no_asm = !value; break; @@ -791,10 +793,6 @@ c_common_handle_option (size_t scode, const char *arg, int value) flag_enforce_eh_specs = value; break; - case OPT_fexternal_templates: - flag_external_templates = value; - goto cp_deprecated; - case OPT_ffixed_form: case OPT_ffixed_line_length_: /* Fortran front end options ignored when preprocessing only. */ @@ -839,10 +837,18 @@ c_common_handle_option (size_t scode, const char *arg, int value) flag_next_runtime = value; break; + case OPT_fnil_receivers: + flag_nil_receivers = value; + break; + case OPT_fnonansi_builtins: flag_no_nonansi_builtin = !value; break; + case OPT_fobjc_exceptions: + flag_objc_exceptions = value; + break; + case OPT_foperator_names: cpp_opts->operator_names = value; break; @@ -863,6 +869,10 @@ c_common_handle_option (size_t scode, const char *arg, int value) cpp_opts->preprocessed = value; break; + case OPT_freplace_objc_classes: + flag_replace_objc_classes = value; + break; + case OPT_frepo: flag_use_repository = value; if (value) @@ -895,6 +905,10 @@ c_common_handle_option (size_t scode, const char *arg, int value) cpp_opts->wide_charset = arg; break; + case OPT_finput_charset_: + cpp_opts->input_charset = arg; + break; + case OPT_ftemplate_depth_: max_tinst_depth = value; break; @@ -907,6 +921,10 @@ c_common_handle_option (size_t scode, const char *arg, int value) flag_weak = value; break; + case OPT_fzero_link: + flag_zero_link = value; + break; + case OPT_gen_decls: flag_gen_declaration = 1; break; @@ -1038,6 +1056,8 @@ c_common_handle_option (size_t scode, const char *arg, int value) bool c_common_post_options (const char **pfilename) { + struct cpp_callbacks *cb; + /* Canonicalize the input and output filenames. */ if (in_fnames == NULL) { @@ -1125,12 +1145,11 @@ c_common_post_options (const char **pfilename) input_line = 0; } - cpp_get_callbacks (parse_in)->file_change = cb_file_change; + cb = cpp_get_callbacks (parse_in); + cb->file_change = cb_file_change; + cb->dir_change = cb_dir_change; cpp_post_options (parse_in); - /* NOTE: we use in_fname here, not the one supplied. */ - *pfilename = cpp_read_main_file (parse_in, in_fnames[0]); - saved_lineno = input_line; input_line = 0; @@ -1138,6 +1157,14 @@ c_common_post_options (const char **pfilename) immediately. */ errorcount += cpp_errors (parse_in); + *pfilename = this_input_filename + = cpp_read_main_file (parse_in, in_fnames[0]); + if (this_input_filename == NULL) + return true; + + if (flag_preprocess_only && flag_working_directory) + pp_dir_change (parse_in, get_src_pwd ()); + return flag_preprocess_only; } @@ -1162,7 +1189,7 @@ c_common_init (void) if (flag_preprocess_only) { - finish_options (in_fnames[0]); + finish_options (); preprocess_file (parse_in); return false; } @@ -1197,10 +1224,12 @@ c_common_parse_file (int set_yydebug ATTRIBUTE_UNUSED) /* Reset cpplib's macros and start a new file. */ cpp_undef_all (parse_in); - cpp_read_main_file (parse_in, in_fnames[file_index]); + main_input_filename = this_input_filename + = cpp_read_main_file (parse_in, in_fnames[file_index]); + if (this_input_filename == NULL) + break; } - - finish_options(in_fnames[file_index]); + finish_options (); if (file_index == 0) pch_init(); c_parse_file (); @@ -1208,7 +1237,6 @@ c_common_parse_file (int set_yydebug ATTRIBUTE_UNUSED) file_index++; } while (file_index < num_in_fnames); - free_parser_stacks (); finish_file (); } @@ -1341,8 +1369,6 @@ sanitize_cpp_opts (void) actually output the current directory? */ if (flag_working_directory == -1) flag_working_directory = (debug_info_level != DINFO_LEVEL_NONE); - cpp_opts->working_directory - = flag_preprocess_only && flag_working_directory; } /* Add include path with a prefix at the front of its name. */ @@ -1365,11 +1391,9 @@ add_prefixed_path (const char *suffix, size_t chain) add_path (path, chain, 0); } -/* Handle -D, -U, -A, -imacros, and the first -include. - TIF is the input file to which we will return after processing all - the includes. */ +/* Handle -D, -U, -A, -imacros, and the first -include. */ static void -finish_options (const char *tif) +finish_options (void) { if (!cpp_opts->preprocessed) { @@ -1415,12 +1439,15 @@ finish_options (const char *tif) if (opt->code == OPT_imacros && cpp_push_include (parse_in, opt->arg)) - cpp_scan_nooutput (parse_in); + { + /* Disable push_command_line_include callback for now. */ + include_cursor = deferred_count + 1; + cpp_scan_nooutput (parse_in); + } } } include_cursor = 0; - this_input_filename = tif; push_command_line_include (); } @@ -1428,24 +1455,27 @@ finish_options (const char *tif) static void push_command_line_include (void) { - if (cpp_opts->preprocessed) - return; - while (include_cursor < deferred_count) { struct deferred_opt *opt = &deferred_opts[include_cursor++]; - if (opt->code == OPT_include && cpp_push_include (parse_in, opt->arg)) + if (! cpp_opts->preprocessed && opt->code == OPT_include + && cpp_push_include (parse_in, opt->arg)) return; } if (include_cursor == deferred_count) { - /* Restore the line map from . */ - cpp_change_file (parse_in, LC_RENAME, this_input_filename); + include_cursor++; /* -Wunused-macros should only warn about macros defined hereafter. */ cpp_opts->warn_unused_macros = warn_unused_macros; - include_cursor++; + /* Restore the line map from . */ + if (! cpp_opts->preprocessed) + cpp_change_file (parse_in, LC_RENAME, main_input_filename); + + /* Set this here so the client can change the option if it wishes, + and after stacking the main file so we don't trace the main file. */ + line_table.trace_includes = cpp_opts->print_include_names; } } @@ -1459,10 +1489,17 @@ cb_file_change (cpp_reader *pfile ATTRIBUTE_UNUSED, else fe_file_change (new_map); - if (new_map->reason == LC_LEAVE && MAIN_FILE_P (new_map)) + if (new_map == 0 || (new_map->reason == LC_LEAVE && MAIN_FILE_P (new_map))) push_command_line_include (); } +void +cb_dir_change (cpp_reader *pfile ATTRIBUTE_UNUSED, const char *dir) +{ + if (! set_src_pwd (dir)) + warning ("too late for # directive to set debug directory"); +} + /* Set the C 89 standard (with 1994 amendments if C94, without GNU extensions if ISO). There is no concept of gnu94. */ static void