summaryrefslogtreecommitdiffstats
path: root/gcc/c-opts.c
diff options
context:
space:
mode:
authorbothner <bothner@138bc75d-0d04-0410-961f-82ee72b054a4>2004-02-05 06:52:26 +0000
committerbothner <bothner@138bc75d-0d04-0410-961f-82ee72b054a4>2004-02-05 06:52:26 +0000
commitd732fcf07665e7bbf25e86683c340207a742c7b3 (patch)
treea8cb79fee4ffa92207a17795cfa3750745b8d001 /gcc/c-opts.c
parenta2383135f2a6bb2b6184b15c5e0beb5d117626f3 (diff)
downloadppe42-gcc-d732fcf07665e7bbf25e86683c340207a742c7b3.tar.gz
ppe42-gcc-d732fcf07665e7bbf25e86683c340207a742c7b3.zip
Partially revert/redo 2003-10-01 change; fix -fworking-directory.
* c-ppoutput.c (pp_dir_change): New function. * c-common.h (pp_dir_change): New declaration. * cpplib.h (struct cpp_options): Remove working_directory field. * cppinit.c (cpp_find_main_file, cpp_push_main_file): Merge back to (cpp_read_main_file): as before 10-01. Call _cpp_stack_file. Don't handle -fworking_directory here, but in c_common_post_options. (read_original_directory): Don't back up when done. Don't clear no-longer used working_directory flag. * cpplib.h: Update declarations to match. * c-lex.c (cb_dir_change): Move to c-opts.c. (init_c_lex): Don't set dir_change callback here, since we want to set it even if flag_preprocess_only. * c-opts.c (cb_dir_change): Function moved from c-lex.c. (c_common_post_options): Set dir_change callback. Call pp_dir_change if approporiate. (finish_options): Don't call cpp_find_main_file here. Hence remove unneeded parameter and result. Do LC_RENAME for <built-in>. (c_common_post_options): Call cpp_read_main_file here instead. (c_common_init): Update accordingly. (push_command_line_include): Don't cpp_push_main_file. Do LC_RENAME rather than LC_LEASE to get back to main file. Compared to pre-10-01 version, inline cpp_rename_to_main_file. (c_common_parse_file): Call cpp_read_main_file for subsequent main files, but call finish_options for all files. * c-opts.c (sanitize_cpp_opts): Don't set cpp_opts->working_directory. * fix-header.c (read_scan_file): Call cpp_read_main_file instead of cpp_find_main_file + cpp_push_main_file. * c-lex.c (fe_file_change): Don't set main_input_filename here. * opts.c (handle_options): Only set main_input_filename first time. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@77303 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/c-opts.c')
-rw-r--r--gcc/c-opts.c66
1 files changed, 41 insertions, 25 deletions
diff --git a/gcc/c-opts.c b/gcc/c-opts.c
index c89ba0040e6..6fbfd1cee6c 100644
--- a/gcc/c-opts.c
+++ b/gcc/c-opts.c
@@ -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 bool 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
@@ -1053,8 +1054,10 @@ c_common_handle_option (size_t scode, const char *arg, int value)
/* Post-switch processing. */
bool
-c_common_post_options (const char **pfilename ATTRIBUTE_UNUSED)
+c_common_post_options (const char **pfilename)
{
+ struct cpp_callbacks *cb;
+
/* Canonicalize the input and output filenames. */
if (in_fnames == NULL)
{
@@ -1142,7 +1145,9 @@ c_common_post_options (const char **pfilename ATTRIBUTE_UNUSED)
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);
saved_lineno = input_line;
@@ -1152,6 +1157,14 @@ c_common_post_options (const char **pfilename ATTRIBUTE_UNUSED)
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;
}
@@ -1176,8 +1189,8 @@ c_common_init (void)
if (flag_preprocess_only)
{
- if (finish_options (in_fnames[0]))
- preprocess_file (parse_in);
+ finish_options ();
+ preprocess_file (parse_in);
return false;
}
@@ -1211,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);
+ main_input_filename = this_input_filename
+ = cpp_read_main_file (parse_in, in_fnames[file_index]);
+ if (this_input_filename == NULL)
+ break;
}
-
- if (! finish_options(in_fnames[file_index]))
- break;
+ finish_options ();
if (file_index == 0)
pch_init();
c_parse_file ();
@@ -1355,8 +1370,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. */
@@ -1379,21 +1392,15 @@ 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. Returns true on success. */
-static bool
-finish_options (const char *tif)
+/* Handle -D, -U, -A, -imacros, and the first -include. */
+static void
+finish_options (void)
{
- this_input_filename = tif;
- if (! cpp_find_main_file (parse_in, this_input_filename))
- return false;
-
if (!cpp_opts->preprocessed)
{
size_t i;
- cpp_change_file (parse_in, LC_ENTER, _("<built-in>"));
+ cpp_change_file (parse_in, LC_RENAME, _("<built-in>"));
cpp_init_builtins (parse_in, flag_hosted);
c_cpp_builtins (parse_in);
@@ -1443,7 +1450,6 @@ finish_options (const char *tif)
include_cursor = 0;
push_command_line_include ();
- return true;
}
/* Give CPP the next file given by -include, if any. */
@@ -1462,12 +1468,15 @@ push_command_line_include (void)
if (include_cursor == deferred_count)
{
include_cursor++;
- /* Restore the line map from <command line>. */
- if (! cpp_opts->preprocessed)
- cpp_change_file (parse_in, LC_LEAVE, NULL);
/* -Wunused-macros should only warn about macros defined hereafter. */
cpp_opts->warn_unused_macros = warn_unused_macros;
- cpp_push_main_file (parse_in);
+ /* 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;
}
}
@@ -1485,6 +1494,13 @@ cb_file_change (cpp_reader *pfile ATTRIBUTE_UNUSED,
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
OpenPOWER on IntegriCloud