aboutsummaryrefslogtreecommitdiff
path: root/libcpp
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2005-08-30 08:28:21 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2005-08-30 08:28:21 +0200
commitf5eab47e103f6453d4b3f1390c0b855c43aa0210 (patch)
treeb922d7af91c80fb097921024929e5f478a487d86 /libcpp
parent4dc0796f75c62945c1a8ffbec1ab86875b35a45c (diff)
downloadgcc-f5eab47e103f6453d4b3f1390c0b855c43aa0210.zip
gcc-f5eab47e103f6453d4b3f1390c0b855c43aa0210.tar.gz
gcc-f5eab47e103f6453d4b3f1390c0b855c43aa0210.tar.bz2
re PR preprocessor/20348 (File not included when file with same name is included before)
PR preprocessor/20348 PR preprocessor/20356 * files.c (_cpp_find_file, search_cache): Revert 2004-06-26 and 2004-06-05 changes. * gcc.dg/cpp/pr20348.c: New test. * gcc.dg/cpp/pr20348.h: New file. * gcc.dg/cpp/inc/pr20348.h: New file. * gcc.dg/cpp/inc/pr20348-aux.h: New file. * gcc.dg/cpp/pr20356.c: New test. * gcc.dg/cpp/pr20356.h: New file. * gcc.dg/cpp/inc/pr20356.h: New file. * gcc.dg/cpp/inc/pr20356-aux.h: New file. From-SVN: r103629
Diffstat (limited to 'libcpp')
-rw-r--r--libcpp/ChangeLog7
-rw-r--r--libcpp/files.c76
2 files changed, 32 insertions, 51 deletions
diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog
index 74b9308..1b62fcc 100644
--- a/libcpp/ChangeLog
+++ b/libcpp/ChangeLog
@@ -1,3 +1,10 @@
+2005-08-30 Jakub Jelinek <jakub@redhat.com>
+
+ PR preprocessor/20348
+ PR preprocessor/20356
+ * files.c (_cpp_find_file, search_cache): Revert 2004-06-26 and
+ 2004-06-05 changes.
+
2005-07-23 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* configure.ac (ACX_PROG_CC_WARNING_OPTS): add
diff --git a/libcpp/files.c b/libcpp/files.c
index dd4f6d9..779fec7 100644
--- a/libcpp/files.c
+++ b/libcpp/files.c
@@ -416,21 +416,6 @@ _cpp_find_file (cpp_reader *pfile, const char *fname, cpp_dir *start_dir, bool f
/* Try each path in the include chain. */
for (; !fake ;)
{
- if (file->dir == pfile->quote_include
- || file->dir == pfile->bracket_include)
- {
- entry = search_cache (*hash_slot, file->dir);
- if (entry)
- {
- /* Found the same file again. Record it as reachable
- from this position, too. */
- free ((char *) file->name);
- free (file);
- file = entry->u.file;
- goto found;
- }
- }
-
if (find_file_in_dir (pfile, file, &invalid_pch))
break;
@@ -459,40 +444,33 @@ _cpp_find_file (cpp_reader *pfile, const char *fname, cpp_dir *start_dir, bool f
}
break;
}
- }
- /* This is a new file; put it in the list. */
- file->next_file = pfile->all_files;
- pfile->all_files = file;
+ /* Only check the cache for the starting location (done above)
+ and the quote and bracket chain heads because there are no
+ other possible starting points for searches. */
+ if (file->dir != pfile->bracket_include
+ && file->dir != pfile->quote_include)
+ continue;
- /* If this file was found in the directory-of-the-current-file,
- check whether that directory is reachable via one of the normal
- search paths. If so, we must record this entry as being
- reachable that way, otherwise we will mistakenly reprocess this
- file if it is included later from the normal search path. */
- if (file->dir && start_dir->next == pfile->quote_include)
- {
- cpp_dir *d;
- cpp_dir *proper_start_dir = pfile->quote_include;
+ entry = search_cache (*hash_slot, file->dir);
+ if (entry)
+ break;
+ }
- for (d = proper_start_dir;; d = d->next)
- {
- if (d == pfile->bracket_include)
- proper_start_dir = d;
- if (d == 0)
- {
- proper_start_dir = 0;
- break;
- }
- /* file->dir->name will have a trailing slash. */
- if (!strncmp (d->name, file->dir->name, file->dir->len - 1))
- break;
- }
- if (proper_start_dir)
- start_dir = proper_start_dir;
+ if (entry)
+ {
+ /* Cache for START_DIR too, sharing the _cpp_file structure. */
+ free ((char *) file->name);
+ free (file);
+ file = entry->u.file;
+ }
+ else
+ {
+ /* This is a new file; put it in the list. */
+ file->next_file = pfile->all_files;
+ pfile->all_files = file;
}
- found:
/* Store this new result in the hash table. */
entry = new_file_hash_entry (pfile);
entry->next = *hash_slot;
@@ -880,14 +858,10 @@ 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)
{
- struct file_hash_entry *p;
+ while (head && head->start_dir != start_dir)
+ head = head->next;
- /* Look for a file that was found from a search starting at the
- given location. */
- for (p = head; p; p = p->next)
- if (p->start_dir == start_dir)
- return p;
- return 0;
+ return head;
}
/* Allocate a new _cpp_file structure. */