diff options
author | manu <manu@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-04-30 16:57:22 +0000 |
---|---|---|
committer | manu <manu@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-04-30 16:57:22 +0000 |
commit | 47b6a3fe6c65ac31da71a415075a18471452c4c1 (patch) | |
tree | 581955b1c8c4cd0feeefcba220d84666458ed1c7 /libcpp | |
parent | ab1e18def00c4d9e3b2dc6050c5ffe7e9e6e924d (diff) | |
download | gcc-47b6a3fe6c65ac31da71a415075a18471452c4c1.tar.gz |
2012-04-30 Manuel López-Ibáñez <manu@gcc.gnu.org>
Dodji Seketeli <dodji@seketeli.org>
PR c++/52974
* libcpp/files.c (maybe_shorter_path): New.
(find_file_in_dir): Use it.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@186991 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libcpp')
-rw-r--r-- | libcpp/ChangeLog | 7 | ||||
-rw-r--r-- | libcpp/files.c | 35 |
2 files changed, 41 insertions, 1 deletions
diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog index 271148cc07d..8ab26a92aed 100644 --- a/libcpp/ChangeLog +++ b/libcpp/ChangeLog @@ -1,3 +1,10 @@ +2012-04-30 Manuel López-Ibáñez <manu@gcc.gnu.org> + Dodji Seketeli <dodji@seketeli.org> + + PR 5297 + * libcpp/files.c (maybe_shorter_path): New. + (find_file_in_dir): Use it. + 2012-04-30 Dodji Seketeli <dodji@redhat.com> Switch -ftrack-macro-expansion=2 on by default. diff --git a/libcpp/files.c b/libcpp/files.c index 29ccf3b7013..5b3a37b0279 100644 --- a/libcpp/files.c +++ b/libcpp/files.c @@ -341,6 +341,25 @@ pch_open_file (cpp_reader *pfile, _cpp_file *file, bool *invalid_pch) return valid; } +/* Canonicalize the path to FILE. Return the canonical form if it is + shorter, otherwise return NULL. This function does NOT free the + memory pointed by FILE. */ + +static char * +maybe_shorter_path (const char * file) +{ + char * file2 = lrealpath (file); + if (file2 && strlen (file2) < strlen (file)) + { + return file2; + } + else + { + free (file2); + return NULL; + } +} + /* Try to open the path FILE->name appended to FILE->dir. This is where remap and PCH intercept the file lookup process. Return true if the file was found, whether or not the open was successful. @@ -361,10 +380,24 @@ find_file_in_dir (cpp_reader *pfile, _cpp_file *file, bool *invalid_pch) if (path) { - hashval_t hv = htab_hash_string (path); + hashval_t hv; char *copy; void **pp; + /* We try to canonicalize system headers. */ + if (file->dir->sysp) + { + char * canonical_path = maybe_shorter_path (path); + if (canonical_path) + { + /* The canonical path was newly allocated. Let's free the + non-canonical one. */ + free (path); + path = canonical_path; + } + } + + hv = htab_hash_string (path); if (htab_find_with_hash (pfile->nonexistent_file_hash, path, hv) != NULL) { file->err_no = ENOENT; |