aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Brobecker <brobecker@adacore.com>2014-11-28 18:37:08 +0400
committerJoel Brobecker <brobecker@adacore.com>2014-11-28 18:37:08 +0400
commit0fa9473ff006c0cc9e62036349ab05664b25b4c7 (patch)
tree3e31e1be4fb5da44d6479c204f3d9b4ab4934d32
parent6a29c58ef8067e7c5869aa6dda9ffdd123bc94a8 (diff)
downloadgdb-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/ChangeLog5
-rw-r--r--gdb/utils.c36
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);
}