Only compute realpath when basenames_may_differ is set
authorTom Tromey <tromey@adacore.com>
Thu, 30 May 2019 16:59:03 +0000 (10:59 -0600)
committerTom Tromey <tromey@adacore.com>
Fri, 14 Jun 2019 14:34:24 +0000 (08:34 -0600)
A user noted that, when sources are symlinked, gdb annotations will
print the real path, rather than the name of the symlink.

It seems to me that it is better to print the name of the file that
was actually used in the build, unless there is some reason not to.

This patch implements this, with the caveat that it will not work when
basenames-may-differ is enabled.  The way this mode is currently
implemented, returning the symbolic (not real) path is not possible.

While I think it would be good to redo the source file name cache and
perhaps integrate it with class source_cache, I haven't done so here.

Regression tested on x86-64 Fedora 29.

gdb/ChangeLog
2019-06-14  Tom Tromey  <tromey@adacore.com>

* source.c (find_and_open_source): Respect basenames_may_differ.

gdb/testsuite/ChangeLog
2019-06-14  Tom Tromey  <tromey@adacore.com>

* gdb.base/annotate-symlink.exp: New file.

gdb/ChangeLog
gdb/source.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/annotate-symlink.exp [new file with mode: 0644]

index f4f5b54b7f562bca028ed196d7809ee9f281a580..87575c806109d74a30b4e830ef801615c50c60a7 100644 (file)
@@ -1,3 +1,7 @@
+2019-06-14  Tom Tromey  <tromey@adacore.com>
+
+       * source.c (find_and_open_source): Respect basenames_may_differ.
+
 2019-06-14  Andrew Burgess  <andrew.burgess@embecosm.com>
 
        * annotate.c (annotate_breakpoints_invalid): Make use of
index 00052e67cb9d3adf21b1fe3d18ef515a669ab9f2..02df15a1ae6c5dd704ec16bc97a8240435b3e1e3 100644 (file)
@@ -987,7 +987,10 @@ find_and_open_source (const char *filename,
       result = gdb_open_cloexec (fullname->get (), OPEN_MODE, 0);
       if (result >= 0)
        {
-         *fullname = gdb_realpath (fullname->get ());
+         if (basenames_may_differ)
+           *fullname = gdb_realpath (fullname->get ());
+         else
+           *fullname = gdb_abspath (fullname->get ());
          return scoped_fd (result);
        }
 
@@ -1031,15 +1034,16 @@ find_and_open_source (const char *filename,
   if (rewritten_filename != NULL)
     filename = rewritten_filename.get ();
 
-  result = openp (path, OPF_SEARCH_IN_PATH | OPF_RETURN_REALPATH, filename,
-                 OPEN_MODE, fullname);
+  openp_flags flags = OPF_SEARCH_IN_PATH;
+  if (basenames_may_differ)
+    flags |= OPF_RETURN_REALPATH;
+  result = openp (path, flags, filename, OPEN_MODE, fullname);
   if (result < 0)
     {
       /* Didn't work.  Try using just the basename.  */
       p = lbasename (filename);
       if (p != filename)
-       result = openp (path, OPF_SEARCH_IN_PATH | OPF_RETURN_REALPATH, p,
-                       OPEN_MODE, fullname);
+       result = openp (path, flags, p, OPEN_MODE, fullname);
     }
 
   return scoped_fd (result);
index 82194862423f4409b9d235df663f2a26b8b5813b..4d896692648c188656f0cee649e7b68b88148d4a 100644 (file)
@@ -1,3 +1,7 @@
+2019-06-14  Tom Tromey  <tromey@adacore.com>
+
+       * gdb.base/annotate-symlink.exp: New file.
+
 2019-06-14  Tom Tromey  <tromey@adacore.com>
 
        * gdb.ada/set_wstr.exp: Add reassignment test.
diff --git a/gdb/testsuite/gdb.base/annotate-symlink.exp b/gdb/testsuite/gdb.base/annotate-symlink.exp
new file mode 100644 (file)
index 0000000..6dba2fe
--- /dev/null
@@ -0,0 +1,51 @@
+# Copyright (C) 2019 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+standard_testfile realname-expand.c realname-expand-real.c
+
+if [is_remote host] {
+    unsupported "compiling on a remote host does not support a filename with directory."
+    return 0
+}
+
+set srcdirabs [file join [pwd] $srcdir]
+set srcfilelink [standard_output_file realname-expand-link.c]
+
+remote_exec build "ln -sf ${srcdirabs}/${subdir}/${srcfile2} $srcfilelink"
+
+if { [file type $srcfilelink] != "link" } {
+    unsupported "target directory cannot have symbolic links"
+    return -1
+}
+
+if { [gdb_compile "${srcdir}/${subdir}/${srcfile} ${srcfilelink}" "${binfile}" \
+                 executable {debug}] != "" } {
+    untested "failed to compile"
+    return -1
+}
+
+clean_restart ${testfile}
+
+if {![runto_main]} {
+    unsupported "failed to run to main"
+    return -1
+}
+
+gdb_breakpoint func message
+
+gdb_test_no_output "set annotate 1"
+
+gdb_test "continue" \
+    "Breakpoint .* func .*realname-expand-link.c:$decimal\r\n\032\032.*realname-expand-link.c:.*"