From patchwork Thu May 30 17:03:15 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 32926 Received: (qmail 3573 invoked by alias); 30 May 2019 17:03:22 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 3561 invoked by uid 89); 30 May 2019 17:03:21 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-23.4 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.1 spammy=032, Breakpoint, integrate X-HELO: rock.gnat.com Received: from rock.gnat.com (HELO rock.gnat.com) (205.232.38.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 30 May 2019 17:03:20 +0000 Received: from localhost (localhost.localdomain [127.0.0.1]) by filtered-rock.gnat.com (Postfix) with ESMTP id 67F96117F28; Thu, 30 May 2019 13:03:18 -0400 (EDT) Received: from rock.gnat.com ([127.0.0.1]) by localhost (rock.gnat.com [127.0.0.1]) (amavisd-new, port 10024) with LMTP id HxBXXGHAodWB; Thu, 30 May 2019 13:03:18 -0400 (EDT) Received: from murgatroyd.Home (174-29-48-168.hlrn.qwest.net [174.29.48.168]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by rock.gnat.com (Postfix) with ESMTPSA id 13E58117F19; Thu, 30 May 2019 13:03:18 -0400 (EDT) From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [RFC] Only compute realpath when basenames_may_differ is set Date: Thu, 30 May 2019 11:03:15 -0600 Message-Id: <20190530170315.9938-1-tromey@adacore.com> MIME-Version: 1.0 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-05-30 Tom Tromey * source.c (find_and_open_source): Respect basenames_may_differ. gdb/testsuite/ChangeLog 2019-05-30 Tom Tromey * gdb.base/annotate-symlink.exp: New file. --- gdb/ChangeLog | 4 ++ gdb/source.c | 14 ++++-- gdb/testsuite/ChangeLog | 4 ++ gdb/testsuite/gdb.base/annotate-symlink.exp | 51 +++++++++++++++++++++ 4 files changed, 68 insertions(+), 5 deletions(-) create mode 100644 gdb/testsuite/gdb.base/annotate-symlink.exp diff --git a/gdb/source.c b/gdb/source.c index 9a30209880b..9e4b8e4fafb 100644 --- a/gdb/source.c +++ b/gdb/source.c @@ -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); } @@ -1036,15 +1039,16 @@ find_and_open_source (const char *filename, 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); diff --git a/gdb/testsuite/gdb.base/annotate-symlink.exp b/gdb/testsuite/gdb.base/annotate-symlink.exp new file mode 100644 index 00000000000..6dba2fe823c --- /dev/null +++ b/gdb/testsuite/gdb.base/annotate-symlink.exp @@ -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 . + +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:.*"