From mboxrd@z Thu Jan 1 00:00:00 1970 From: Fred Fish To: gdb-patches@sources.redhat.com Cc: fnf@ninemoons.com Subject: [PATCH] temporary fix for bogus language check Date: Sun, 25 Nov 2001 11:26:00 -0000 Message-id: <200111251921.fAPJLP323371@fishpond.ninemoons.com> X-SW-Source: 2001-11/msg00430.html In lookup_symbol(), gdb checks the current language and if it is C++, trys to demangle the symbol name before looking it up. This works fine if we are both looking up a C++ symbol and the current language is C++. However it breaks down if we are trying to lookup a C++ symbol and the current language is not C++, such as when stopped inside a C function (perhaps a C library call for example). Consider decode_line_1 in linespec.c, which is called when you do something like "br PCReader::work". This function calls find_methods(), which later calls lookup_symbol() with the mangled name "work__8PCReader". If the current language is C++, lookup_symbol() demangles it to "PCReader::work(void)" and calls lookup_symbol_aux with the demangled name, which succeeds. If however you try to set the same breakpoint when stopped at a C function setting the breakpoint fails. The following patch works around the problem by always attempting to demangle the symbol to be looked up. We could fix this problem by eliminating the test of the current language, but then every gdb session would incur the additional overhead of attempting to demangle every symbol regardless of whether or not any C++ symbols were present. Another option is to set some global flag whenever symbols for a C++ function are read in, and then do the current language test unconditionally once we know that there might be C++ symbols somewhere. Yet another option is to add a parameter to lookup_symbol that says whether to consider the possibility that the symbol to be looked up is a C++ symbol, set that appropriately when calling lookup_symbol, and use that value to decide whether or not to try demangling the symbol. Suggestions? -Fred Index: symtab.c =================================================================== RCS file: /cvs/src/src/gdb/symtab.c,v retrieving revision 1.48 diff -u -r1.48 symtab.c --- symtab.c 2001/11/13 16:42:50 1.48 +++ symtab.c 2001/11/25 18:49:46 @@ -528,8 +528,11 @@ modified_name = (char *) name; /* If we are using C++ language, demangle the name before doing a lookup, so - we can always binary search. */ - if (current_language->la_language == language_cplus) + we can always binary search. + NOTE: We need to always try to demangle since the current_language might + be something other than C++ at the point when we are trying to set a + breakpoint in C++ code. -fnf */ + if (1 || (current_language->la_language == language_cplus)) { modified_name2 = cplus_demangle (modified_name, DMGL_ANSI | DMGL_PARAMS); if (modified_name2) From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 28501 invoked by alias); 25 Nov 2001 19:26:29 -0000 Mailing-List: contact gdb-patches-help@sourceware.cygnus.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 28392 invoked from network); 25 Nov 2001 19:25:12 -0000 Received: from unknown (HELO fishpond.ninemoons.com) (64.232.230.104) by sourceware.cygnus.com with SMTP; 25 Nov 2001 19:25:12 -0000 Received: (from fnf@localhost) by fishpond.ninemoons.com (8.11.6/8.11.6) id fAPJLP323371; Sun, 25 Nov 2001 12:21:25 -0700 From: Fred Fish Message-ID: <200111251921.fAPJLP323371@fishpond.ninemoons.com> Subject: [PATCH] temporary fix for bogus language check To: gdb-patches@sources.redhat.com Date: Sun, 11 Nov 2001 04:26:00 -0000 Cc: fnf@ninemoons.com Reply-To: fnf@ninemoons.com X-Mailer: ELM [version 2.5 PL6] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-SW-Source: 2001-11/txt/msg00215.txt.bz2 Message-ID: <20011111042600.IdIVhMp4QbbRYLtEzONftsQJI4s0s1Ia2tfi4mblX8E@z> In lookup_symbol(), gdb checks the current language and if it is C++, trys to demangle the symbol name before looking it up. This works fine if we are both looking up a C++ symbol and the current language is C++. However it breaks down if we are trying to lookup a C++ symbol and the current language is not C++, such as when stopped inside a C function (perhaps a C library call for example). Consider decode_line_1 in linespec.c, which is called when you do something like "br PCReader::work". This function calls find_methods(), which later calls lookup_symbol() with the mangled name "work__8PCReader". If the current language is C++, lookup_symbol() demangles it to "PCReader::work(void)" and calls lookup_symbol_aux with the demangled name, which succeeds. If however you try to set the same breakpoint when stopped at a C function setting the breakpoint fails. The following patch works around the problem by always attempting to demangle the symbol to be looked up. We could fix this problem by eliminating the test of the current language, but then every gdb session would incur the additional overhead of attempting to demangle every symbol regardless of whether or not any C++ symbols were present. Another option is to set some global flag whenever symbols for a C++ function are read in, and then do the current language test unconditionally once we know that there might be C++ symbols somewhere. Yet another option is to add a parameter to lookup_symbol that says whether to consider the possibility that the symbol to be looked up is a C++ symbol, set that appropriately when calling lookup_symbol, and use that value to decide whether or not to try demangling the symbol. Suggestions? -Fred Index: symtab.c =================================================================== RCS file: /cvs/src/src/gdb/symtab.c,v retrieving revision 1.48 diff -u -r1.48 symtab.c --- symtab.c 2001/11/13 16:42:50 1.48 +++ symtab.c 2001/11/25 18:49:46 @@ -528,8 +528,11 @@ modified_name = (char *) name; /* If we are using C++ language, demangle the name before doing a lookup, so - we can always binary search. */ - if (current_language->la_language == language_cplus) + we can always binary search. + NOTE: We need to always try to demangle since the current_language might + be something other than C++ at the point when we are trying to set a + breakpoint in C++ code. -fnf */ + if (1 || (current_language->la_language == language_cplus)) { modified_name2 = cplus_demangle (modified_name, DMGL_ANSI | DMGL_PARAMS); if (modified_name2)