diff options
author | ebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-12-15 13:31:28 +0000 |
---|---|---|
committer | ebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-12-15 13:31:28 +0000 |
commit | 461ea98d47d624495d320b5e01e483f78f15ec3c (patch) | |
tree | ee4f13a206730085a5823040cd5d0b9a0e3f2b44 /libcpp | |
parent | 325703fc1e9164d672cc192e9426ac2d63b2857f (diff) | |
download | gcc-461ea98d47d624495d320b5e01e483f78f15ec3c.tar.gz |
PR preprocessor/15167
* files.c (destroy_cpp_file): New function.
(should_stack_file): Make a new file if the
compared file is still stacked.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@92194 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libcpp')
-rw-r--r-- | libcpp/ChangeLog | 7 | ||||
-rw-r--r-- | libcpp/files.c | 49 |
2 files changed, 50 insertions, 6 deletions
diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog index 3b01f82668f..41e8aaec7d2 100644 --- a/libcpp/ChangeLog +++ b/libcpp/ChangeLog @@ -1,3 +1,10 @@ +2004-12-15 Eric Botcazou <ebotcazou@libertysurf.fr> + + PR preprocessor/15167 + * files.c (destroy_cpp_file): New function. + (should_stack_file): Make a new file if the + compared file is still stacked. + 2004-11-28 Nathanael Nerode <neroden@gcc.gnu.org> PR preprocessor/17610 diff --git a/libcpp/files.c b/libcpp/files.c index fc1fa2c7f0e..bd5f8dd5114 100644 --- a/libcpp/files.c +++ b/libcpp/files.c @@ -161,6 +161,7 @@ static void open_file_failed (cpp_reader *pfile, _cpp_file *file); static struct file_hash_entry *search_cache (struct file_hash_entry *head, const cpp_dir *start_dir); static _cpp_file *make_cpp_file (cpp_reader *, cpp_dir *, const char *fname); +static void destroy_cpp_file (_cpp_file *); static cpp_dir *make_cpp_dir (cpp_reader *, const char *dir_name, int sysp); static void allocate_file_hash_entries (cpp_reader *pfile); static struct file_hash_entry *new_file_hash_entry (cpp_reader *pfile); @@ -667,12 +668,38 @@ should_stack_file (cpp_reader *pfile, _cpp_file *file, bool import) if ((import || f->once_only) && f->err_no == 0 && f->st.st_mtime == file->st.st_mtime - && f->st.st_size == file->st.st_size - && read_file (pfile, f) - /* Size might have changed in read_file(). */ - && f->st.st_size == file->st.st_size - && !memcmp (f->buffer, file->buffer, f->st.st_size)) - break; + && f->st.st_size == file->st.st_size) + { + _cpp_file *ref_file; + bool same_file_p = false; + + if (f->buffer && !f->buffer_valid) + { + /* We already have a buffer but it is not valid, because + the file is still stacked. Make a new one. */ + ref_file = make_cpp_file (pfile, f->dir, f->name); + ref_file->path = f->path; + } + else + /* The file is not stacked anymore. We can reuse it. */ + ref_file = f; + + same_file_p = read_file (pfile, ref_file) + /* Size might have changed in read_file(). */ + && ref_file->st.st_size == file->st.st_size + && !memcmp (ref_file->buffer, + file->buffer, + file->st.st_size); + + if (f->buffer && !f->buffer_valid) + { + ref_file->path = 0; + destroy_cpp_file (ref_file); + } + + if (same_file_p) + break; + } } return f == NULL; @@ -870,6 +897,16 @@ make_cpp_file (cpp_reader *pfile, cpp_dir *dir, const char *fname) return file; } +/* Release a _cpp_file structure. */ +static void +destroy_cpp_file (_cpp_file *file) +{ + if (file->buffer) + free ((void *) file->buffer); + free ((void *) file->name); + free (file); +} + /* A hash of directory names. The directory names are the path names of files which contain a #include "", the included file name is appended to this directories. |