This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] temporary fix for bogus language check


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)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]