Search global symbols from the expression's block objfile first.
authorJoel Brobecker <brobecker@gnat.com>
Thu, 10 May 2012 16:24:40 +0000 (16:24 +0000)
committerJoel Brobecker <brobecker@gnat.com>
Thu, 10 May 2012 16:24:40 +0000 (16:24 +0000)
gdb/ChangeLog:

        * 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/ChangeLog
gdb/findvar.c
gdb/symtab.c

index be59495b7c630cd20a41ec015f2df89cfe78a7c2..01f4be986bfba0f5b657b6d3af382d1d2254075d 100644 (file)
@@ -1,3 +1,17 @@
+2012-05-10  Joel Brobecker  <brobecker@adacore.com>
+
+       * 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.
+
 2012-05-10  Tristan Gingold  <gingold@adacore.com>
 
        * printcmd.c (set_command): Add pre/post inc/dec.
index 9009e6f324be2ae80984546281c665aba35c3ef2..ed7903cfb0911a8492f22b0b5f40ad4926687f0f 100644 (file)
@@ -562,7 +562,15 @@ default_read_var_value (struct symbol *var, struct frame_info *frame)
        struct minimal_symbol *msym;
        struct obj_section *obj_section;
 
-       msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (var), NULL, NULL);
+       /* 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);
        if (msym == NULL)
          error (_("No global symbol \"%s\"."), SYMBOL_LINKAGE_NAME (var));
        if (overlay_debugging)
index d68e542ec833ad6bb43e7ea80763dc586c06e585..3fce349a3bec9b6cd9a6d4f9170efcedcf5d4c94 100644 (file)
@@ -95,7 +95,8 @@ 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);
+                                         const domain_enum domain,
+                                         struct objfile *exclude_objfile);
 
 static
 struct symbol *lookup_symbol_aux_quick (struct objfile *objfile,
@@ -1361,7 +1362,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);
+  sym = lookup_symbol_aux_symtabs (STATIC_BLOCK, name, domain, NULL);
   if (sym != NULL)
     return sym;
 
@@ -1500,40 +1501,61 @@ lookup_global_symbol_from_objfile (const struct objfile *main_objfile,
   return NULL;
 }
 
-/* Check to see if the symbol is defined in one of the symtabs.
-   BLOCK_INDEX should be either GLOBAL_BLOCK or STATIC_BLOCK,
+/* 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,
    depending on whether or not we want to search global symbols or
    static symbols.  */
 
 static struct symbol *
-lookup_symbol_aux_symtabs (int block_index, const char *name,
-                          const domain_enum domain)
+lookup_symbol_aux_objfile (struct objfile *objfile, int block_index,
+                          const char *name, const domain_enum domain)
 {
-  struct symbol *sym;
-  struct objfile *objfile;
+  struct symbol *sym = NULL;
   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_OBJFILE_SYMTABS (objfile, s)
+    if (s->primary)
+      {
+       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->sf)
-      objfile->sf->qf->pre_expand_symtabs_matching (objfile,
-                                                   block_index,
-                                                   name, domain);
-
-    ALL_OBJFILE_SYMTABS (objfile, s)
-      if (s->primary)
-       {
-         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);
-           }
-       }
+    if (objfile != exclude_objfile)
+      {
+       sym = lookup_symbol_aux_objfile (objfile, block_index, name, domain);
+       if (sym)
+         return sym;
+      }
   }
 
   return NULL;
@@ -1659,24 +1681,46 @@ 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.  */
-  objfile = lookup_objfile_from_block (block);
-  if (objfile != NULL)
-    sym = solib_global_lookup (objfile, name, domain);
+  block_objfile = lookup_objfile_from_block (block);
+  if (block_objfile != NULL)
+    sym = solib_global_lookup (block_objfile, name, domain);
   if (sym != NULL)
     return sym;
 
-  sym = lookup_symbol_aux_symtabs (GLOBAL_BLOCK, name, domain);
+  /* 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);
   if (sym != NULL)
     return sym;
 
   ALL_OBJFILES (objfile)
   {
-    sym = lookup_symbol_aux_quick (objfile, GLOBAL_BLOCK, name, domain);
-    if (sym)
-      return sym;
+    if (objfile != block_objfile)
+      {
+       sym = lookup_symbol_aux_quick (objfile, GLOBAL_BLOCK, name, domain);
+       if (sym)
+         return sym;
+      }
   }
 
   return NULL;