This is the mail archive of the gdb-patches@sourceware.org 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]

[RFA v3 2/4] Revert "Search global symbols from the expression's block objfile first."


The search order used in this patch breaks global symbol lookups
for certain symbols when copy-relocation is used.  A slightly different
search order will be implemented later.

gdb/ChangeLog:

        Revert the following patch:
        * findvar.c (default_read_var_value): For LOC_UNRESOLVED symbols,
        try locating the symbol in the symbol's own objfile first, before
        extending the search to all objfiles.
        * symtab.c (lookup_symbol_aux_objfile): New function, extracted
        out of lookup_symbol_aux_symtabs.
        (lookup_symbol_aux_symtabs): Add new parameter "exclude_objfile".
        Replace extracted-out code by call to lookup_symbol_aux_objfile.
        Do not search EXCLUDE_OBJFILE.
        (lookup_static_symbol_aux): Update call to lookup_symbol_aux_symtabs.
        (lookup_symbol_global): Search for matches in the block's objfile
        first, before searching all other objfiles.
---
 gdb/findvar.c |   10 +-----
 gdb/symtab.c  |  105 +++++++++++++++++----------------------------------------
 2 files changed, 32 insertions(+), 83 deletions(-)

diff --git a/gdb/findvar.c b/gdb/findvar.c
index ed7903c..9009e6f 100644
--- a/gdb/findvar.c
+++ b/gdb/findvar.c
@@ -562,15 +562,7 @@ default_read_var_value (struct symbol *var, struct frame_info *frame)
 	struct minimal_symbol *msym;
 	struct obj_section *obj_section;
 
-	/* First, try locating the associated minimal symbol within
-	   the same objfile.  This prevents us from selecting another
-	   symbol with the same name but located in a different objfile.  */
-	msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (var), NULL,
-				      SYMBOL_SYMTAB (var)->objfile);
-	/* If the lookup failed, try expanding the search to all
-	   objfiles.  */
-	if (msym == NULL)
-	  msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (var), NULL, NULL);
+	msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (var), NULL, NULL);
 	if (msym == NULL)
 	  error (_("No global symbol \"%s\"."), SYMBOL_LINKAGE_NAME (var));
 	if (overlay_debugging)
diff --git a/gdb/symtab.c b/gdb/symtab.c
index 318310a..7e6483f 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -95,8 +95,7 @@ struct symbol *lookup_symbol_aux_local (const char *name,
 static
 struct symbol *lookup_symbol_aux_symtabs (int block_index,
 					  const char *name,
-					  const domain_enum domain,
-					  struct objfile *exclude_objfile);
+					  const domain_enum domain);
 
 static
 struct symbol *lookup_symbol_aux_quick (struct objfile *objfile,
@@ -1360,7 +1359,7 @@ lookup_static_symbol_aux (const char *name, const domain_enum domain)
   struct objfile *objfile;
   struct symbol *sym;
 
-  sym = lookup_symbol_aux_symtabs (STATIC_BLOCK, name, domain, NULL);
+  sym = lookup_symbol_aux_symtabs (STATIC_BLOCK, name, domain);
   if (sym != NULL)
     return sym;
 
@@ -1499,60 +1498,40 @@ lookup_global_symbol_from_objfile (const struct objfile *main_objfile,
   return NULL;
 }
 
-/* Check to see if the symbol is defined in one of the OBJFILE's
-   symtabs.  BLOCK_INDEX should be either GLOBAL_BLOCK or STATIC_BLOCK,
+/* Check to see if the symbol is defined in one of the symtabs.
+   BLOCK_INDEX should be either GLOBAL_BLOCK or STATIC_BLOCK,
    depending on whether or not we want to search global symbols or
    static symbols.  */
 
 static struct symbol *
-lookup_symbol_aux_objfile (struct objfile *objfile, int block_index,
-			   const char *name, const domain_enum domain)
+lookup_symbol_aux_symtabs (int block_index, const char *name,
+			   const domain_enum domain)
 {
-  struct symbol *sym = NULL;
+  struct symbol *sym;
+  struct objfile *objfile;
   struct blockvector *bv;
   const struct block *block;
   struct symtab *s;
 
-  if (objfile->sf)
-    objfile->sf->qf->pre_expand_symtabs_matching (objfile, block_index,
-						  name, domain);
+  ALL_OBJFILES (objfile)
+  {
+    if (objfile->sf)
+      objfile->sf->qf->pre_expand_symtabs_matching (objfile,
+						    block_index,
+						    name, domain);
 
-  ALL_OBJFILE_PRIMARY_SYMTABS (objfile, s)
-    {
-      bv = BLOCKVECTOR (s);
-      block = BLOCKVECTOR_BLOCK (bv, block_index);
-      sym = lookup_block_symbol (block, name, domain);
-      if (sym)
+    ALL_OBJFILE_SYMTABS (objfile, s)
+      if (s->primary)
 	{
-	  block_found = block;
-	  return fixup_symbol_section (sym, objfile);
+	  bv = BLOCKVECTOR (s);
+	  block = BLOCKVECTOR_BLOCK (bv, block_index);
+	  sym = lookup_block_symbol (block, name, domain);
+	  if (sym)
+	    {
+	      block_found = block;
+	      return fixup_symbol_section (sym, objfile);
+	    }
 	}
-    }
-
-  return NULL;
-}
-
-/* Same as lookup_symbol_aux_objfile, except that it searches all
-   objfiles except for EXCLUDE_OBJFILE.  Return the first match found.
-
-   If EXCLUDE_OBJFILE is NULL, then all objfiles are searched.  */
-
-static struct symbol *
-lookup_symbol_aux_symtabs (int block_index, const char *name,
-			   const domain_enum domain,
-			   struct objfile *exclude_objfile)
-{
-  struct symbol *sym;
-  struct objfile *objfile;
-
-  ALL_OBJFILES (objfile)
-  {
-    if (objfile != exclude_objfile)
-      {
-	sym = lookup_symbol_aux_objfile (objfile, block_index, name, domain);
-	if (sym)
-	  return sym;
-      }
   }
 
   return NULL;
@@ -1678,46 +1657,24 @@ lookup_symbol_global (const char *name,
 		      const domain_enum domain)
 {
   struct symbol *sym = NULL;
-  struct objfile *block_objfile = NULL;
   struct objfile *objfile = NULL;
 
   /* Call library-specific lookup procedure.  */
-  block_objfile = lookup_objfile_from_block (block);
-  if (block_objfile != NULL)
-    sym = solib_global_lookup (block_objfile, name, domain);
+  objfile = lookup_objfile_from_block (block);
+  if (objfile != NULL)
+    sym = solib_global_lookup (objfile, name, domain);
   if (sym != NULL)
     return sym;
 
-  /* If BLOCK_OBJFILE is not NULL, then search this objfile first.
-     In case the global symbol is defined in multiple objfiles,
-     we have a better chance of finding the most relevant symbol.  */
-
-  if (block_objfile != NULL)
-    {
-      sym = lookup_symbol_aux_objfile (block_objfile, GLOBAL_BLOCK,
-				       name, domain);
-      if (sym == NULL)
-	sym = lookup_symbol_aux_quick (block_objfile, GLOBAL_BLOCK,
-				       name, domain);
-      if (sym != NULL)
-	return sym;
-    }
-
-  /* Symbol not found in the BLOCK_OBJFILE, so try all the other
-     objfiles, starting with symtabs first, and then partial symtabs.  */
-
-  sym = lookup_symbol_aux_symtabs (GLOBAL_BLOCK, name, domain, block_objfile);
+  sym = lookup_symbol_aux_symtabs (GLOBAL_BLOCK, name, domain);
   if (sym != NULL)
     return sym;
 
   ALL_OBJFILES (objfile)
   {
-    if (objfile != block_objfile)
-      {
-	sym = lookup_symbol_aux_quick (objfile, GLOBAL_BLOCK, name, domain);
-	if (sym)
-	  return sym;
-      }
+    sym = lookup_symbol_aux_quick (objfile, GLOBAL_BLOCK, name, domain);
+    if (sym)
+      return sym;
   }
 
   return NULL;
-- 
1.7.1


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