From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 16294 invoked by alias); 31 Aug 2011 18:17:24 -0000 Received: (qmail 16282 invoked by uid 22791); 31 Aug 2011 18:17:22 -0000 X-SWARE-Spam-Status: No, hits=-6.4 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_HI,RP_MATCHES_RCVD,SPF_HELO_PASS X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 31 Aug 2011 18:17:08 +0000 Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id p7VIH8ce001614 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 31 Aug 2011 14:17:08 -0400 Received: from valrhona.uglyboxes.com (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id p7VIH5L8003707 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Wed, 31 Aug 2011 14:17:07 -0400 Message-ID: <4E5E7AA1.5030209@redhat.com> Date: Wed, 31 Aug 2011 18:17:00 -0000 From: Keith Seitz User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:6.0) Gecko/20110816 Thunderbird/6.0 MIME-Version: 1.0 To: Tom Tromey CC: gdb-patches@sourceware.org Subject: Re: [RFA] 12843 References: <4E56C5A0.60802@redhat.com> In-Reply-To: Content-Type: multipart/mixed; boundary="------------040502060503040709020400" X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2011-08/txt/msg00674.txt.bz2 This is a multi-part message in MIME format. --------------040502060503040709020400 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-length: 1314 On 08/26/2011 11:22 AM, Tom Tromey wrote: >>>>>> "Keith" == Keith Seitz writes: > > Keith> PR gdb/12843 > Keith> * linespec.c (locate_first_half): Do not stop on a colon > Keith> if the next character is a directory separator character. > > Ok. > > I suspect we should tighten this further so that only drive letters work > and not oddball stuff like "break file:/whatever.c:73". What do you > think? I think we can safely do that -- especially since '/' is verboten on unix. So in that case, "file:/whatever.c" parses to the file "whatever.c" in the directory "file:", and we want to keep the whole thing together anyway. Mind you, this doesn't solve the general case of colons in filenames, which is still broken. Note: I've renamed the test to linespecs.exp, hoping that this file will grow into a full-fledged specification for future linespec work. Which I hope to do sometime soon. :-) How about this? [Tested on x86_64-linux and i686-pc-cygwin (with much pain).] Keith ChangeLog 2011-08-30 Keith Seitz PR gdb/12843 * linespec.c (locate_first_half): Keep ':' if it looks like it could be part of a drive letter or filename. testsuite/ChangeLog 2011-08-30 Keith Seitz PR gdb/12843 * gdb.base/linespecs.exp: New file. --------------040502060503040709020400 Content-Type: text/plain; name="12843-2.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="12843-2.patch" Content-length: 2680 diff --git a/gdb/linespec.c b/gdb/linespec.c index 37ec368..721bf12 100644 --- a/gdb/linespec.c +++ b/gdb/linespec.c @@ -43,6 +43,7 @@ #include "arch-utils.h" #include #include "cli/cli-utils.h" +#include "filenames.h" /* Prototypes for local functions. */ @@ -1194,6 +1195,16 @@ locate_first_half (char **argptr, int *is_quote_enclosed) ++p; } } + + + /* Check for a drive letter in the filename. This is done on all hosts + to capture cross-compilation environments. On Unixen, directory + separators are illegal in filenames, so if the user enters "e:/foo.c", + he is referring to a directory named "e:" and a source file named + "foo.c", and we still want to keep these two pieces together. */ + if (isalpha (p[0]) && p[1] == ':' && IS_DIR_SEPARATOR (p[2])) + p += 3; + for (; *p; p++) { if (p[0] == '<') @@ -1218,8 +1229,7 @@ locate_first_half (char **argptr, int *is_quote_enclosed) line, a tab, a colon or a space. But if enclosed in double quotes we do not break on enclosed spaces. */ if (!*p - || p[0] == '\t' - || (p[0] == ':') + || p[0] == '\t' || p[0] == ':' || ((p[0] == ' ') && !*is_quote_enclosed)) break; if (p[0] == '.' && strchr (p, ':') == NULL) diff --git a/gdb/testsuite/gdb.base/linespecs.exp b/gdb/testsuite/gdb.base/linespecs.exp new file mode 100644 index 0000000..bd07779 --- /dev/null +++ b/gdb/testsuite/gdb.base/linespecs.exp @@ -0,0 +1,29 @@ +# Copyright 2011 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 . + +# Linespec tests + +# We don't currently need our own test case for testing, so grab +# another one. + +if {[prepare_for_testing linespecs.exp memattr memattr.c {debug}]} { + return -1 +} + +# PR gdb/12843 +gdb_test "list c:/foo/bar/baz.c:1" "No source file named c:/foo/bar/baz.c." +gdb_test "list c:/foo/bar/baz.c" "Function \"c:/foo/bar/baz.c\" not defined." +gdb_test "list fooc:/foo/bar/baz.c:1" "No source file named fooc." +gdb_test "list fooc:/foo/bar/baz.c" "No source file named fooc." --------------040502060503040709020400--