*** empty log message ***
[deliverable/binutils-gdb.git] / gdb / psymtab.c
index 814023e894a8c7f602043c308d131a1639249490..5623e2dc5f8ba30d6b1aa52cb6c9fa3579855d70 100644 (file)
@@ -174,6 +174,10 @@ partial_map_symtabs_matching_filename (struct objfile *objfile,
     if (pst->user != NULL)
       continue;
 
+    /* Anonymous psymtabs don't have a file name.  */
+    if (pst->anonymous)
+      continue;
+
     if (FILENAME_CMP (name, pst->filename) == 0
        || (!is_abs && compare_filenames_for_search (pst->filename,
                                                     name, name_len)))
@@ -397,7 +401,8 @@ find_pc_sect_symtab_from_partial (struct objfile *objfile,
        warning (_("\
 (Internal error: pc %s in read in psymtab, but not in symtab.)\n"),
                 paddress (get_objfile_arch (ps->objfile), pc));
-      return psymtab_to_symtab (ps);
+      psymtab_to_symtab (ps);
+      return ps->symtab;
     }
   return NULL;
 }
@@ -509,6 +514,7 @@ lookup_symbol_aux_psymtabs (struct objfile *objfile,
 {
   struct partial_symtab *ps;
   const int psymtab_index = (block_index == GLOBAL_BLOCK ? 1 : 0);
+  struct symtab *stab_best = NULL;
 
   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
   {
@@ -529,13 +535,18 @@ lookup_symbol_aux_psymtabs (struct objfile *objfile,
          }
 
        if (sym && strcmp_iw (SYMBOL_SEARCH_NAME (sym), name) == 0)
-         return stab;
+         {
+           if (!TYPE_IS_OPAQUE (SYMBOL_TYPE (sym)))
+             return stab;
+
+           stab_best = stab;
+         }
 
        /* Keep looking through other psymtabs.  */
       }
   }
 
-  return NULL;
+  return stab_best;
 }
 
 /* Look in PST for a symbol in DOMAIN whose name matches NAME.  Search
@@ -966,8 +977,16 @@ dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab,
   struct gdbarch *gdbarch = get_objfile_arch (objfile);
   int i;
 
-  fprintf_filtered (outfile, "\nPartial symtab for source file %s ",
-                   psymtab->filename);
+  if (psymtab->anonymous)
+    {
+      fprintf_filtered (outfile, "\nAnonymous partial symtab (%s) ",
+                       psymtab->filename);
+    }
+  else
+    {
+      fprintf_filtered (outfile, "\nPartial symtab for source file %s ",
+                       psymtab->filename);
+    }
   fprintf_filtered (outfile, "(object ");
   gdb_print_host_address (psymtab, outfile);
   fprintf_filtered (outfile, ")\n\n");
@@ -1117,6 +1136,10 @@ read_psymtabs_with_filename (struct objfile *objfile, const char *filename)
 
   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, p)
     {
+      /* Anonymous psymtabs don't have a name of a source file.  */
+      if (p->anonymous)
+       continue;
+
       if (filename_cmp (filename, p->filename) == 0)
        psymtab_to_symtab (p);
     }
@@ -1136,6 +1159,15 @@ map_symbol_filenames_psymtab (struct objfile *objfile,
       if (ps->readin)
        continue;
 
+      /* We can skip shared psymtabs here, because any file name will be
+        attached to the unshared psymtab.  */
+      if (ps->user != NULL)
+       continue;
+
+      /* Anonymous psymtabs don't have a file name.  */
+      if (ps->anonymous)
+       continue;
+
       QUIT;
       if (need_fullname)
        fullname = psymtab_to_fullname (ps);
@@ -1160,6 +1192,8 @@ psymtab_to_fullname (struct partial_symtab *ps)
 
   if (!ps)
     return NULL;
+  if (ps->anonymous)
+    return NULL;
 
   /* Use cached copy if we have it.
      We rely on forget_cached_source_info being called appropriately
@@ -1370,8 +1404,13 @@ expand_symtabs_matching_via_partial
       if (ps->user != NULL)
        continue;
 
-      if (file_matcher && ! (*file_matcher) (ps->filename, data))
-       continue;
+      if (file_matcher)
+       {
+         if (ps->anonymous)
+           continue;
+         if (! (*file_matcher) (ps->filename, data))
+           continue;
+       }
 
       if (recursively_search_psymtabs (ps, objfile, kind, name_matcher, data))
        psymtab_to_symtab (ps);
@@ -1724,6 +1763,26 @@ allocate_psymtab (const char *filename, struct objfile *objfile)
   psymtab->next = objfile->psymtabs;
   objfile->psymtabs = psymtab;
 
+  if (symtab_create_debug)
+    {
+      /* Be a bit clever with debugging messages, and don't print objfile
+        every time, only when it changes.  */
+      static char *last_objfile_name = NULL;
+
+      if (last_objfile_name == NULL
+         || strcmp (last_objfile_name, objfile->name) != 0)
+       {
+         xfree (last_objfile_name);
+         last_objfile_name = xstrdup (objfile->name);
+         fprintf_unfiltered (gdb_stdlog,
+                             "Creating one or more psymtabs for objfile %s ...\n",
+                             last_objfile_name);
+       }
+      fprintf_unfiltered (gdb_stdlog,
+                         "Created psymtab %s for module %s.\n",
+                         host_address_to_string (psymtab), filename);
+    }
+
   return (psymtab);
 }
 
This page took 0.026235 seconds and 4 git commands to generate.