From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Berlin To: Cc: Subject: Re: [PATCH] temporary fix for bogus language check Date: Sun, 25 Nov 2001 11:53:00 -0000 Message-id: References: <200111251921.fAPJLP323371@fishpond.ninemoons.com> X-SW-Source: 2001-11/msg00432.html On Sun, 25 Nov 2001, Fred Fish wrote: > 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. Of course, this raises the question, what exactly is the current language supposed to mean? The language of the frame, or the language of the expressions you are trying to enter. If it's the first, this behavior is incorrect. If it's the second, this behavior is correct. The help says "Current source language", which doesn't help resolve the problem, since we've never cared what the source language of the file is, only what it's supposed to tell us about either the frame language, or the expression language. > > The following patch works around the problem by always attempting to > demangle the symbol to be looked up I remember doing this originally, and somebody objected that we should only do it if the current language is C++, to avoid the cost of always trying to demangle. I didn't have the energy to argue. >. 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. These shouldn't just be C++ specific. IE modify the suggestions so that lookup_symbol should take a parameter that tells you what languages the symbol might be for (maybe including an order so that the current frame language/expression language is preferred over other languages, or something), and we only do the demangling if they want to look it up in C++. Or keep a list of languages we've seen, rather than just whether we've seen C++ or not. Another option is to detect whether the name even could be mangled without demangling it. At least for C++, we know the ABI's can't be mixed, and thus, you have only one C++ ABI. So, you could add a function to the cp_abi_ops structure called "could_be_mangled_name", and fill it in for the various C++ ABI's. For gnu-v2, it's tricky to determine whether a name is mangled without trying to demangle it (thus, you could just always return 1 in could_be_mangled_name), but for gnu-v3, it's trivial. > > 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 6148 invoked by alias); 25 Nov 2001 19:53:32 -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 6127 invoked from network); 25 Nov 2001 19:53:30 -0000 Received: from unknown (HELO www.cgsoftware.com) (208.155.65.221) by sourceware.cygnus.com with SMTP; 25 Nov 2001 19:53:30 -0000 Received: from localhost (localhost [127.0.0.1]) by www.cgsoftware.com (8.9.3/8.9.3) with ESMTP id OAA05700; Sun, 25 Nov 2001 14:53:25 -0500 Date: Sun, 11 Nov 2001 08:42:00 -0000 From: Daniel Berlin To: cc: Subject: Re: [PATCH] temporary fix for bogus language check In-Reply-To: <200111251921.fAPJLP323371@fishpond.ninemoons.com> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-SW-Source: 2001-11/txt/msg00217.txt.bz2 Message-ID: <20011111084200.PrFix2ur6HVLsKuOaH27FzeOfChk-60KHH0KmPVG-bc@z> On Sun, 25 Nov 2001, Fred Fish wrote: > 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. Of course, this raises the question, what exactly is the current language supposed to mean? The language of the frame, or the language of the expressions you are trying to enter. If it's the first, this behavior is incorrect. If it's the second, this behavior is correct. The help says "Current source language", which doesn't help resolve the problem, since we've never cared what the source language of the file is, only what it's supposed to tell us about either the frame language, or the expression language. > > The following patch works around the problem by always attempting to > demangle the symbol to be looked up I remember doing this originally, and somebody objected that we should only do it if the current language is C++, to avoid the cost of always trying to demangle. I didn't have the energy to argue. >. 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. These shouldn't just be C++ specific. IE modify the suggestions so that lookup_symbol should take a parameter that tells you what languages the symbol might be for (maybe including an order so that the current frame language/expression language is preferred over other languages, or something), and we only do the demangling if they want to look it up in C++. Or keep a list of languages we've seen, rather than just whether we've seen C++ or not. Another option is to detect whether the name even could be mangled without demangling it. At least for C++, we know the ABI's can't be mixed, and thus, you have only one C++ ABI. So, you could add a function to the cp_abi_ops structure called "could_be_mangled_name", and fill it in for the various C++ ABI's. For gnu-v2, it's tricky to determine whether a name is mangled without trying to demangle it (thus, you could just always return 1 in could_be_mangled_name), but for gnu-v3, it's trivial. > > 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) >