From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12512 invoked by alias); 17 Oct 2003 04:02:45 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 12505 invoked from network); 17 Oct 2003 04:02:42 -0000 Received: from unknown (HELO external1.doc.com) (199.72.38.5) by sources.redhat.com with SMTP; 17 Oct 2003 04:02:42 -0000 Received: (qmail 12583 invoked from network); 17 Oct 2003 03:57:43 -0000 Received: from cpe-24-221-209-215.co.sprintbbd.net (HELO ?192.168.1.103?) (24.221.209.215) by external1.doc.com with SMTP; 17 Oct 2003 03:57:43 -0000 Subject: [RFC]: Disallow ObjC search when resetting breakpoint. From: Adam Fedor To: "gdb-patches@sources.redhat.com" Content-Type: multipart/mixed; boundary="=-g72p7BUrTBrVnyNsZt1r" Organization: Message-Id: <1066363062.1070.26.camel@localhost.localdomain> Mime-Version: 1.0 Date: Fri, 17 Oct 2003 04:02:00 -0000 X-SW-Source: 2003-10/txt/msg00581.txt.bz2 --=-g72p7BUrTBrVnyNsZt1r Content-Type: text/plain Content-Transfer-Encoding: 7bit Content-length: 1561 This patch fixes PR objc/1238, where you get frustrating behavior if there is an ObjC method with the same name as a function: (gdb) break init [0] cancel [1] all [2] -[MyObject init] at gdb-objc-test.m:50 [3] -[NewObject init] at gdb-objc-test.m:18 [4] init at gdb-objc-test.m:62 > 4 Breakpoint 1 at 0x10001a40: file gdb-objc-test.m, line 62. (gdb) run Starting program: /home/users/fedor/src/gstep/Tester/shared_debug_obj/gdb-objc-test [0] cancel [1] all [2] -[MyObject init] at gdb-objc-test.m:50 [3] -[NewObject init] at gdb-objc-test.m:18 [4] init at gdb-objc-test.m:62 > 0 Error in re-setting breakpoint 1: canceled [Thread debugging using libthread_db enabled] [New Thread 16384 (LWP 2249)] [0] cancel [1] all [2] -[MyObject init] at gdb-objc-test.m:50 [3] -[NewObject init] at gdb-objc-test.m:18 [4] init at gdb-objc-test.m:62 > [... on and on ad infinitum ...] What happens is that every time you try to reset a breakpoint, decode_line_1 gets called and we search through all the ObjC selectors for a match to the breakpoint and there are always multiple matches to "init". I don't particularly like the solution (It's the way Apple does it, although it might be for more reasons than this, e.g. there's no reason to go through the ObjC selector search when resetting a breakpoint anyway). I can't think of any other way to do it though, unless perhaps there is some way to canonicalize the symbol name for the breakpoint - so it's something like "gdb-objc-test.m:init", and not just "init" - then you won't get multiple matches. Any comments? --=-g72p7BUrTBrVnyNsZt1r Content-Disposition: attachment; filename=allow_objc.patch Content-Type: text/plain; name=allow_objc.patch; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-length: 1913 2003-10-16 Adam Fedor * gdb/linespec.c (decode_line_1): Search for ObjC selectors only if allow_objc_selectors_flag. * gdb/breakpoint.c (breakpoint_re_set_one): Don't allow search for ObjC selectors when resetting a breakpoint. Index: gdb/breakpoint.c =================================================================== RCS file: /cvs/src/src/gdb/breakpoint.c,v retrieving revision 1.132 diff -u -p -r1.132 breakpoint.c --- gdb/breakpoint.c 13 Oct 2003 23:53:20 -0000 1.132 +++ gdb/breakpoint.c 17 Oct 2003 03:41:32 -0000 @@ -52,6 +52,8 @@ #include "gdb-events.h" +extern int allow_objc_selectors_flag; + /* Prototypes for local functions. */ static void until_break_command_continuation (struct continuation_arg *arg); @@ -6854,7 +6856,9 @@ breakpoint_re_set_one (void *bint) set_language (b->language); input_radix = b->input_radix; s = b->addr_string; + allow_objc_selectors_flag = 0; sals = decode_line_1 (&s, 1, (struct symtab *) NULL, 0, (char ***) NULL); + allow_objc_selectors_flag = 1; for (i = 0; i < sals.nelts; i++) { resolve_sal_pc (&sals.sals[i]); Index: gdb/linespec.c =================================================================== RCS file: /cvs/src/src/gdb/linespec.c,v retrieving revision 1.51 diff -u -p -r1.51 linespec.c --- gdb/linespec.c 2 Aug 2003 03:59:40 -0000 1.51 +++ gdb/linespec.c 17 Oct 2003 03:41:34 -0000 @@ -36,6 +36,8 @@ #include "objc-lang.h" #include "linespec.h" +int allow_objc_selectors_flag = 1; + /* We share this one with symtab.c, but it is not exported widely. */ extern char *operator_chars (char *, char **); @@ -698,6 +700,7 @@ decode_line_1 (char **argptr, int funfir /* Check if the symbol could be an Objective-C selector. */ + if (allow_objc_selectors_flag) { struct symtabs_and_lines values; values = decode_objc (argptr, funfirstline, NULL, --=-g72p7BUrTBrVnyNsZt1r--