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] add linkage_name argument to lookup_partial_symbol


Currently, lookup_partial_symbol only matches on natural names, not on
linkage names.  This can be a problem when it's called from
lookup_symbol_aux_psymtabs: that functions cares about the linkage
name of the symbol in addition to its natural name.  So the wrong
partial symtab could be found, leading to a "name found in psymtab but
not in symtab" error.

Here's a patch to fix that; it seems obvious, so I'm planning to
commit it tomorrow unless somebody objects.  I've tested it on
i686-pc-linux-gnu/GCC3.1/DWARF-2; Michael's run it through his entire
testbed, since I thought it might fix a Java bug that I can't
reproduce.  (It didn't, alas.)  No new failures in either case.

David Carlton
carlton at math dot stanford dot edu

2003-03-03  David Carlton  <carlton at math dot stanford dot edu>

	* symtab.c (lookup_partial_symbol): Add linkage_name argument.
	(lookup_symbol_aux_psymtabs): Update call to
	lookup_partial_symbol.
	(lookup_transparent_type, find_main_psymtab)
	(make_symbol_overload_list): Ditto.

Index: symtab.c
===================================================================
RCS file: /cvs/src/src/gdb/symtab.c,v
retrieving revision 1.98
diff -u -p -r1.98 symtab.c
--- symtab.c	3 Mar 2003 18:34:12 -0000	1.98
+++ symtab.c	3 Mar 2003 19:28:56 -0000
@@ -76,6 +76,7 @@ static int find_line_common (struct line
 char *operator_chars (char *p, char **end);
 
 static struct partial_symbol *lookup_partial_symbol (struct partial_symtab *,
+						     const char *,
 						     const char *, int,
 						     namespace_enum);
 
@@ -1201,7 +1202,8 @@ lookup_symbol_aux_psymtabs (int block_in
   ALL_PSYMTABS (objfile, ps)
   {
     if (!ps->readin
-	&& lookup_partial_symbol (ps, name, psymtab_index, namespace))
+	&& lookup_partial_symbol (ps, name, mangled_name,
+				  psymtab_index, namespace))
       {
 	s = PSYMTAB_TO_SYMTAB (ps);
 	bv = BLOCKVECTOR (s);
@@ -1367,11 +1369,14 @@ lookup_symbol_aux_minsyms (const char *n
   return NULL;
 }
 
-/* Look, in partial_symtab PST, for symbol NAME.  Check the global
-   symbols if GLOBAL, the static symbols if not */
+/* Look, in partial_symtab PST, for symbol whose natural name is NAME.
+   If LINKAGE_NAME is non-NULL, check in addition that the symbol's
+   linkage name matches it.  Check the global symbols if GLOBAL, the
+   static symbols if not */
 
 static struct partial_symbol *
-lookup_partial_symbol (struct partial_symtab *pst, const char *name, int global,
+lookup_partial_symbol (struct partial_symtab *pst, const char *name,
+		       const char *linkage_name, int global,
 		       namespace_enum namespace)
 {
   struct partial_symbol *temp;
@@ -1423,7 +1428,10 @@ lookup_partial_symbol (struct partial_sy
       if (!(top == bottom))
 	internal_error (__FILE__, __LINE__, "failed internal consistency check");
 
-      while (top <= real_top && SYMBOL_MATCHES_NATURAL_NAME (*top,name))
+      while (top <= real_top
+	     && (linkage_name != NULL
+		 ? strcmp (SYMBOL_LINKAGE_NAME (*top), linkage_name) == 0
+		 : SYMBOL_MATCHES_NATURAL_NAME (*top,name)))
 	{
 	  if (SYMBOL_NAMESPACE (*top) == namespace)
 	    {
@@ -1442,7 +1450,9 @@ lookup_partial_symbol (struct partial_sy
 	{
 	  if (namespace == SYMBOL_NAMESPACE (*psym))
 	    {
-	      if (SYMBOL_MATCHES_NATURAL_NAME (*psym, name))
+	      if (linkage_name != NULL
+		  ? strcmp (SYMBOL_LINKAGE_NAME (*psym), linkage_name) == 0
+		  : SYMBOL_MATCHES_NATURAL_NAME (*psym, name))
 		{
 		  return (*psym);
 		}
@@ -1489,7 +1499,8 @@ lookup_transparent_type (const char *nam
 
   ALL_PSYMTABS (objfile, ps)
   {
-    if (!ps->readin && lookup_partial_symbol (ps, name, 1, STRUCT_NAMESPACE))
+    if (!ps->readin && lookup_partial_symbol (ps, name, NULL,
+					      1, STRUCT_NAMESPACE))
       {
 	s = PSYMTAB_TO_SYMTAB (ps);
 	bv = BLOCKVECTOR (s);
@@ -1536,7 +1547,7 @@ lookup_transparent_type (const char *nam
 
   ALL_PSYMTABS (objfile, ps)
   {
-    if (!ps->readin && lookup_partial_symbol (ps, name, 0, STRUCT_NAMESPACE))
+    if (!ps->readin && lookup_partial_symbol (ps, name, NULL, 0, STRUCT_NAMESPACE))
       {
 	s = PSYMTAB_TO_SYMTAB (ps);
 	bv = BLOCKVECTOR (s);
@@ -1577,7 +1588,7 @@ find_main_psymtab (void)
 
   ALL_PSYMTABS (objfile, pst)
   {
-    if (lookup_partial_symbol (pst, main_name (), 1, VAR_NAMESPACE))
+    if (lookup_partial_symbol (pst, main_name (), NULL, 1, VAR_NAMESPACE))
       {
 	return (pst);
       }
@@ -4027,8 +4038,10 @@ make_symbol_overload_list (struct symbol
     if (ps->readin)
       continue;
 
-    if ((lookup_partial_symbol (ps, oload_name, 1, VAR_NAMESPACE) != NULL)
-	|| (lookup_partial_symbol (ps, oload_name, 0, VAR_NAMESPACE) != NULL))
+    if ((lookup_partial_symbol (ps, oload_name, NULL, 1, VAR_NAMESPACE)
+	 != NULL)
+	|| (lookup_partial_symbol (ps, oload_name, NULL, 0, VAR_NAMESPACE)
+	    != NULL))
       PSYMTAB_TO_SYMTAB (ps);
   }
 


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