/* 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.
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
}
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;
/* 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:
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;
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. */
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;
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)
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;
flag_weak = value;
break;
+ case OPT_fzero_link:
+ flag_zero_link = value;
+ break;
+
case OPT_gen_decls:
flag_gen_declaration = 1;
break;
bool
c_common_post_options (const char **pfilename)
{
+ struct cpp_callbacks *cb;
+
/* Canonicalize the input and output filenames. */
if (in_fnames == NULL)
{
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;
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;
}
if (flag_preprocess_only)
{
- finish_options (in_fnames[0]);
+ finish_options ();
preprocess_file (parse_in);
return false;
}
/* 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 ();
file_index++;
} while (file_index < num_in_fnames);
- free_parser_stacks ();
finish_file ();
}
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. */
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)
{
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 ();
}
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 <command line>. */
- 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 <command line>. */
+ 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;
}
}
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