diff options
author | Joel Brobecker <brobecker@adacore.com> | 2014-11-28 18:37:08 +0400 |
---|---|---|
committer | Joel Brobecker <brobecker@adacore.com> | 2014-11-28 18:37:08 +0400 |
commit | 0fa9473ff006c0cc9e62036349ab05664b25b4c7 (patch) | |
tree | 3e31e1be4fb5da44d6479c204f3d9b4ab4934d32 | |
parent | 6a29c58ef8067e7c5869aa6dda9ffdd123bc94a8 (diff) | |
download | gdb-0fa9473ff006c0cc9e62036349ab05664b25b4c7.zip gdb-0fa9473ff006c0cc9e62036349ab05664b25b4c7.tar.gz gdb-0fa9473ff006c0cc9e62036349ab05664b25b4c7.tar.bz2 |
gdb_realpath: Rework comment about handling on Windows.
Rework the comment to explain why we're still relying on GetFullPathName
even though gnulib ensures that canonicalize_file_name is now available
on all platforms, including Windows.
gdb/ChangeLog:
* utils.c (gdb_realpath): Rework comment about handling on
Windows.
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/utils.c | 36 |
2 files changed, 32 insertions, 9 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 0e75434..a37d4e1 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2014-11-28 Joel Brobecker <brobecker@adacore.com> + + * utils.c (gdb_realpath): Rework comment about handling on + Windows. + 2014-11-28 Yao Qi <yao@codesourcery.com> * gnulib/update-gnulib.sh (IMPORTED_GNULIB_MODULES): Add diff --git a/gdb/utils.c b/gdb/utils.c index b3720f6..1f5f4f4 100644 --- a/gdb/utils.c +++ b/gdb/utils.c @@ -2868,20 +2868,38 @@ string_to_core_addr (const char *my_string) char * gdb_realpath (const char *filename) { - /* The MS Windows method. If we don't have realpath, we assume we - don't have symlinks and just canonicalize to a Windows absolute - path. GetFullPath converts ../ and ./ in relative paths to - absolute paths, filling in current drive if one is not given - or using the current directory of a specified drive (eg, "E:foo"). - It also converts all forward slashes to back slashes. */ - /* The file system is case-insensitive but case-preserving. - So we do not lowercase the path. Otherwise, we might not - be able to display the original casing in a given path. */ +/* On most hosts, we rely on canonicalize_file_name to compute + the FILENAME's realpath. + + But the situation is slightly more complex on Windows, due to some + versions of GCC which were reported to generate paths where + backlashes (the directory separator) were doubled. For instance: + c:\\some\\double\\slashes\\dir + ... instead of ... + c:\some\double\slashes\dir + Those double-slashes were getting in the way when comparing paths, + for instance when trying to insert a breakpoint as follow: + (gdb) b c:/some/double/slashes/dir/foo.c:4 + No source file named c:/some/double/slashes/dir/foo.c:4. + (gdb) b c:\some\double\slashes\dir\foo.c:4 + No source file named c:\some\double\slashes\dir\foo.c:4. + To prevent this from happening, we need this function to always + strip those extra backslashes. While canonicalize_file_name does + perform this simplification, it only works when the path is valid. + Since the simplification would be useful even if the path is not + valid (one can always set a breakpoint on a file, even if the file + does not exist locally), we rely instead on GetFullPathName to + perform the canonicalization. */ + #if defined (_WIN32) { char buf[MAX_PATH]; DWORD len = GetFullPathName (filename, MAX_PATH, buf, NULL); + /* The file system is case-insensitive but case-preserving. + So it is important we do not lowercase the path. Otherwise, + we might not be able to display the original casing in a given + path. */ if (len > 0 && len < MAX_PATH) return xstrdup (buf); } |