gdb/
[deliverable/binutils-gdb.git] / gdb / psymtab.c
index 5366d947393952fecc5a972798ceb2b55ce06c91..027ad38b8b0f559de6421e1e6db52e1aba052278 100644 (file)
@@ -45,19 +45,22 @@ struct psymbol_bcache
   struct bcache *bcache;
 };
 
-static struct partial_symbol *match_partial_symbol (struct partial_symtab *,
+static struct partial_symbol *match_partial_symbol (struct objfile *,
+                                                   struct partial_symtab *,
                                                    int,
                                                    const char *, domain_enum,
                                                    symbol_compare_ftype *,
                                                    symbol_compare_ftype *);
 
-static struct partial_symbol *lookup_partial_symbol (struct partial_symtab *,
+static struct partial_symbol *lookup_partial_symbol (struct objfile *,
+                                                    struct partial_symtab *,
                                                     const char *, int,
                                                     domain_enum);
 
 static char *psymtab_to_fullname (struct partial_symtab *ps);
 
-static struct partial_symbol *find_pc_sect_psymbol (struct partial_symtab *,
+static struct partial_symbol *find_pc_sect_psymbol (struct objfile *,
+                                                   struct partial_symtab *,
                                                    CORE_ADDR,
                                                    struct obj_section *);
 
@@ -65,7 +68,8 @@ static struct partial_symbol *fixup_psymbol_section (struct partial_symbol
                                                     *psym,
                                                     struct objfile *objfile);
 
-static struct symtab *psymtab_to_symtab (struct partial_symtab *pst);
+static struct symtab *psymtab_to_symtab (struct objfile *objfile,
+                                        struct partial_symtab *pst);
 
 /* Ensure that the partial symbols for OBJFILE have been loaded.  This
    function always returns its argument, as a convenience.  */
@@ -145,7 +149,7 @@ partial_map_expand_apply (struct objfile *objfile,
 
   /* This may expand more than one symtab, and we want to iterate over
      all of them.  */
-  psymtab_to_symtab (pst);
+  psymtab_to_symtab (objfile, pst);
 
   return iterate_over_some_symtabs (name, full_path, real_path, callback, data,
                                    objfile->symtabs, last_made);
@@ -164,7 +168,6 @@ partial_map_symtabs_matching_filename (struct objfile *objfile,
 {
   struct partial_symtab *pst;
   const char *name_basename = lbasename (name);
-  int name_len = strlen (name);
   int is_abs = IS_ABSOLUTE_PATH (name);
 
   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst)
@@ -174,9 +177,12 @@ 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)))
+       || (!is_abs && compare_filenames_for_search (pst->filename, name)))
       {
        if (partial_map_expand_apply (objfile, name, full_path, real_path,
                                      pst, callback, data))
@@ -197,7 +203,7 @@ partial_map_symtabs_matching_filename (struct objfile *objfile,
        if (pst->fullname != NULL
            && (FILENAME_CMP (full_path, pst->fullname) == 0
                || (!is_abs && compare_filenames_for_search (pst->fullname,
-                                                            name, name_len))))
+                                                            name))))
          {
            if (partial_map_expand_apply (objfile, name, full_path, real_path,
                                          pst, callback, data))
@@ -216,8 +222,7 @@ partial_map_symtabs_matching_filename (struct objfile *objfile,
           }
        if (rp != NULL
            && (FILENAME_CMP (real_path, rp) == 0
-               || (!is_abs && compare_filenames_for_search (real_path,
-                                                            name, name_len))))
+               || (!is_abs && compare_filenames_for_search (real_path, name))))
          {
            if (partial_map_expand_apply (objfile, name, full_path, real_path,
                                          pst, callback, data))
@@ -233,11 +238,11 @@ partial_map_symtabs_matching_filename (struct objfile *objfile,
    We may find a different psymtab than PST.  See FIND_PC_SECT_PSYMTAB.  */
 
 static struct partial_symtab *
-find_pc_sect_psymtab_closer (CORE_ADDR pc, struct obj_section *section,
+find_pc_sect_psymtab_closer (struct objfile *objfile,
+                            CORE_ADDR pc, struct obj_section *section,
                             struct partial_symtab *pst,
                             struct minimal_symbol *msymbol)
 {
-  struct objfile *objfile = pst->objfile;
   struct partial_symtab *tpst;
   struct partial_symtab *best_pst = pst;
   CORE_ADDR best_addr = pst->textlow;
@@ -273,7 +278,7 @@ find_pc_sect_psymtab_closer (CORE_ADDR pc, struct obj_section *section,
             corresponding msymbol, which is not necessarily
             true; the debug info might be much richer than the
             object's symbol table.  */
-         p = find_pc_sect_psymbol (tpst, pc, section);
+         p = find_pc_sect_psymbol (objfile, tpst, pc, section);
          if (p != NULL
              && SYMBOL_VALUE_ADDRESS (p)
              == SYMBOL_VALUE_ADDRESS (msymbol))
@@ -338,7 +343,7 @@ find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc,
                 corresponding msymbol, which is not necessarily
                 true; the debug info might be much richer than the
                 object's symbol table.  */
-             p = find_pc_sect_psymbol (pst, pc, section);
+             p = find_pc_sect_psymbol (objfile, pst, pc, section);
              if (!p
                  || SYMBOL_VALUE_ADDRESS (p)
                  != SYMBOL_VALUE_ADDRESS (msymbol))
@@ -372,7 +377,8 @@ find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc,
       {
        struct partial_symtab *best_pst;
 
-       best_pst = find_pc_sect_psymtab_closer (pc, section, pst, msymbol);
+       best_pst = find_pc_sect_psymtab_closer (objfile, pc, section, pst,
+                                               msymbol);
        if (best_pst != NULL)
          return best_pst;
       }
@@ -396,8 +402,8 @@ find_pc_sect_symtab_from_partial (struct objfile *objfile,
           continue, so let's not.  */
        warning (_("\
 (Internal error: pc %s in read in psymtab, but not in symtab.)\n"),
-                paddress (get_objfile_arch (ps->objfile), pc));
-      psymtab_to_symtab (ps);
+                paddress (get_objfile_arch (objfile), pc));
+      psymtab_to_symtab (objfile, ps);
       return ps->symtab;
     }
   return NULL;
@@ -407,7 +413,8 @@ find_pc_sect_symtab_from_partial (struct objfile *objfile,
    Return 0 if none.  */
 
 static struct partial_symbol *
-find_pc_sect_psymbol (struct partial_symtab *psymtab, CORE_ADDR pc,
+find_pc_sect_psymbol (struct objfile *objfile,
+                     struct partial_symtab *psymtab, CORE_ADDR pc,
                      struct obj_section *section)
 {
   struct partial_symbol *best = NULL, *p, **pp;
@@ -421,8 +428,8 @@ find_pc_sect_psymbol (struct partial_symtab *psymtab, CORE_ADDR pc,
   /* Search the global symbols as well as the static symbols, so that
      find_pc_partial_function doesn't use a minimal symbol and thus
      cache a bad endaddr.  */
-  for (pp = psymtab->objfile->global_psymbols.list + psymtab->globals_offset;
-    (pp - (psymtab->objfile->global_psymbols.list + psymtab->globals_offset)
+  for (pp = objfile->global_psymbols.list + psymtab->globals_offset;
+    (pp - (objfile->global_psymbols.list + psymtab->globals_offset)
      < psymtab->n_global_syms);
        pp++)
     {
@@ -436,7 +443,7 @@ find_pc_sect_psymbol (struct partial_symtab *psymtab, CORE_ADDR pc,
        {
          if (section)          /* Match on a specific section.  */
            {
-             fixup_psymbol_section (p, psymtab->objfile);
+             fixup_psymbol_section (p, objfile);
              if (!matching_obj_sections (SYMBOL_OBJ_SECTION (p), section))
                continue;
            }
@@ -445,8 +452,8 @@ find_pc_sect_psymbol (struct partial_symtab *psymtab, CORE_ADDR pc,
        }
     }
 
-  for (pp = psymtab->objfile->static_psymbols.list + psymtab->statics_offset;
-    (pp - (psymtab->objfile->static_psymbols.list + psymtab->statics_offset)
+  for (pp = objfile->static_psymbols.list + psymtab->statics_offset;
+    (pp - (objfile->static_psymbols.list + psymtab->statics_offset)
      < psymtab->n_static_syms);
        pp++)
     {
@@ -460,7 +467,7 @@ find_pc_sect_psymbol (struct partial_symtab *psymtab, CORE_ADDR pc,
        {
          if (section)          /* Match on a specific section.  */
            {
-             fixup_psymbol_section (p, psymtab->objfile);
+             fixup_psymbol_section (p, objfile);
              if (!matching_obj_sections (SYMBOL_OBJ_SECTION (p), section))
                continue;
            }
@@ -514,10 +521,11 @@ lookup_symbol_aux_psymtabs (struct objfile *objfile,
 
   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
   {
-    if (!ps->readin && lookup_partial_symbol (ps, name, psymtab_index, domain))
+    if (!ps->readin && lookup_partial_symbol (objfile, ps, name,
+                                             psymtab_index, domain))
       {
        struct symbol *sym = NULL;
-       struct symtab *stab = psymtab_to_symtab (ps);
+       struct symtab *stab = psymtab_to_symtab (objfile, ps);
 
        /* Some caution must be observed with overloaded functions
           and methods, since the psymtab will not contain any overload
@@ -554,7 +562,8 @@ lookup_symbol_aux_psymtabs (struct objfile *objfile,
    with MATCH.  Returns the symbol, if found, and otherwise NULL.  */
 
 static struct partial_symbol *
-match_partial_symbol (struct partial_symtab *pst, int global,
+match_partial_symbol (struct objfile *objfile,
+                     struct partial_symtab *pst, int global,
                      const char *name, domain_enum domain,
                      symbol_compare_ftype *match,
                      symbol_compare_ftype *ordered_compare)
@@ -567,8 +576,8 @@ match_partial_symbol (struct partial_symtab *pst, int global,
   if (length == 0)
       return NULL;
   start = (global ?
-          pst->objfile->global_psymbols.list + pst->globals_offset :
-          pst->objfile->static_psymbols.list + pst->statics_offset);
+          objfile->global_psymbols.list + pst->globals_offset :
+          objfile->static_psymbols.list + pst->statics_offset);
 
   if (global && ordered_compare)  /* Can use a binary search.  */
     {
@@ -670,7 +679,8 @@ psymtab_search_name (const char *name)
    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,
+lookup_partial_symbol (struct objfile *objfile,
+                      struct partial_symtab *pst, const char *name,
                       int global, domain_enum domain)
 {
   struct partial_symbol **start, **psym;
@@ -688,8 +698,8 @@ lookup_partial_symbol (struct partial_symtab *pst, const char *name,
   search_name = psymtab_search_name (name);
   cleanup = make_cleanup (xfree, search_name);
   start = (global ?
-          pst->objfile->global_psymbols.list + pst->globals_offset :
-          pst->objfile->static_psymbols.list + pst->statics_offset);
+          objfile->global_psymbols.list + pst->globals_offset :
+          objfile->static_psymbols.list + pst->statics_offset);
 
   if (global)                  /* This means we can use a binary search.  */
     {
@@ -774,7 +784,7 @@ lookup_partial_symbol (struct partial_symtab *pst, const char *name,
    This is fast after the first time you do it.  */
 
 static struct symtab *
-psymtab_to_symtab (struct partial_symtab *pst)
+psymtab_to_symtab (struct objfile *objfile, struct partial_symtab *pst)
 {
   /* If it is a shared psymtab, find an unshared psymtab that includes
      it.  Any such psymtab will do.  */
@@ -790,7 +800,7 @@ psymtab_to_symtab (struct partial_symtab *pst)
     {
       struct cleanup *back_to = increment_reading_symtab ();
 
-      (*pst->read_symtab) (pst);
+      (*pst->read_symtab) (objfile, pst);
       do_cleanups (back_to);
     }
 
@@ -856,7 +866,7 @@ find_last_source_symtab_from_partial (struct objfile *ofp)
                          "readin pst found and no symtabs."));
        }
       else
-       return psymtab_to_symtab (cs_pst);
+       return psymtab_to_symtab (ofp, cs_pst);
     }
   return NULL;
 }
@@ -884,6 +894,7 @@ print_partial_symbols (struct gdbarch *gdbarch,
   fprintf_filtered (outfile, "  %s partial symbols:\n", what);
   while (count-- > 0)
     {
+      QUIT;
       fprintf_filtered (outfile, "    `%s'", SYMBOL_LINKAGE_NAME (*p));
       if (SYMBOL_DEMANGLED_NAME (*p) != NULL)
        {
@@ -973,8 +984,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");
@@ -994,7 +1013,7 @@ dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab,
     }
 
   fprintf_filtered (outfile, "  Relocate symbols by ");
-  for (i = 0; i < psymtab->objfile->num_sections; ++i)
+  for (i = 0; i < objfile->num_sections; ++i)
     {
       if (i != 0)
        fprintf_filtered (outfile, ", ");
@@ -1075,10 +1094,6 @@ dump_psymtabs_for_objfile (struct objfile *objfile)
                           psymtab->filename);
          gdb_print_host_address (psymtab, gdb_stdout);
          printf_filtered (", ");
-         if (psymtab->objfile != objfile)
-           {
-             printf_filtered ("NOT ON CHAIN!  ");
-           }
          wrap_here ("  ");
        }
       printf_filtered ("\n\n");
@@ -1098,11 +1113,11 @@ read_symtabs_for_function (struct objfile *objfile, const char *func_name)
     if (ps->readin)
       continue;
 
-    if ((lookup_partial_symbol (ps, func_name, 1, VAR_DOMAIN)
+    if ((lookup_partial_symbol (objfile, ps, func_name, 1, VAR_DOMAIN)
         != NULL)
-       || (lookup_partial_symbol (ps, func_name, 0, VAR_DOMAIN)
+       || (lookup_partial_symbol (objfile, ps, func_name, 0, VAR_DOMAIN)
            != NULL))
-      psymtab_to_symtab (ps);
+      psymtab_to_symtab (objfile, ps);
   }
 }
 
@@ -1113,7 +1128,7 @@ expand_partial_symbol_tables (struct objfile *objfile)
 
   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, psymtab)
     {
-      psymtab_to_symtab (psymtab);
+      psymtab_to_symtab (objfile, psymtab);
     }
 }
 
@@ -1124,8 +1139,12 @@ 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);
+       psymtab_to_symtab (objfile, p);
     }
 }
 
@@ -1143,6 +1162,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);
@@ -1167,6 +1195,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
@@ -1192,7 +1222,7 @@ find_symbol_file_from_partial (struct objfile *objfile, const char *name)
 
   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst)
     {
-      if (lookup_partial_symbol (pst, name, 1, VAR_DOMAIN))
+      if (lookup_partial_symbol (objfile, pst, name, 1, VAR_DOMAIN))
        return pst->filename;
     }
   return NULL;
@@ -1245,10 +1275,10 @@ map_matching_symbols_psymtab (const char *name, domain_enum namespace,
     {
       QUIT;
       if (ps->readin
-         || match_partial_symbol (ps, global, name, namespace, match,
+         || match_partial_symbol (objfile, ps, global, name, namespace, match,
                                   ordered_compare))
        {
-         struct symtab *s = psymtab_to_symtab (ps);
+         struct symtab *s = psymtab_to_symtab (objfile, ps);
          struct block *block;
 
          if (s == NULL || !s->primary)
@@ -1377,11 +1407,16 @@ 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);
+       psymtab_to_symtab (objfile, ps);
     }
 }
 
@@ -1428,11 +1463,11 @@ compare_psymbols (const void *s1p, const void *s2p)
 }
 
 void
-sort_pst_symbols (struct partial_symtab *pst)
+sort_pst_symbols (struct objfile *objfile, struct partial_symtab *pst)
 {
   /* Sort the global list; don't sort the static list.  */
 
-  qsort (pst->objfile->global_psymbols.list + pst->globals_offset,
+  qsort (objfile->global_psymbols.list + pst->globals_offset,
         pst->n_global_syms, sizeof (struct partial_symbol *),
         compare_psymbols);
 }
@@ -1727,7 +1762,6 @@ allocate_psymtab (const char *filename, struct objfile *objfile)
      Psymtabs are searched in most recent inserted -> least recent
      inserted order.  */
 
-  psymtab->objfile = objfile;
   psymtab->next = objfile->psymtabs;
   objfile->psymtabs = psymtab;
 
@@ -1755,7 +1789,7 @@ allocate_psymtab (const char *filename, struct objfile *objfile)
 }
 
 void
-discard_psymtab (struct partial_symtab *pst)
+discard_psymtab (struct objfile *objfile, struct partial_symtab *pst)
 {
   struct partial_symtab **prev_pst;
 
@@ -1768,15 +1802,15 @@ discard_psymtab (struct partial_symtab *pst)
 
   /* First, snip it out of the psymtab chain.  */
 
-  prev_pst = &(pst->objfile->psymtabs);
+  prev_pst = &(objfile->psymtabs);
   while ((*prev_pst) != pst)
     prev_pst = &((*prev_pst)->next);
   (*prev_pst) = pst->next;
 
   /* Next, put it on a free list for recycling.  */
 
-  pst->next = pst->objfile->free_psymtabs;
-  pst->objfile->free_psymtabs = pst;
+  pst->next = objfile->free_psymtabs;
+  objfile->free_psymtabs = pst;
 }
 
 \f
@@ -1820,11 +1854,12 @@ print-psymbols takes an output file name and optional symbol file name"));
     perror_with_name (filename);
   make_cleanup_ui_file_delete (outfile);
 
-  immediate_quit++;
   ALL_PSYMTABS (objfile, ps)
-    if (symname == NULL || filename_cmp (symname, ps->filename) == 0)
-    dump_psymtab (objfile, ps, outfile);
-  immediate_quit--;
+    {
+      QUIT;
+      if (symname == NULL || filename_cmp (symname, ps->filename) == 0)
+       dump_psymtab (objfile, ps, outfile);
+    }
   do_cleanups (cleanups);
 }
 
@@ -1888,7 +1923,7 @@ maintenance_info_psymtabs (char *regexp, int from_tty)
              if (psymtab->n_global_syms)
                {
                  printf_filtered ("(* (struct partial_symbol **) %s @ %d)\n",
-                                  host_address_to_string (psymtab->objfile->global_psymbols.list
+                                  host_address_to_string (objfile->global_psymbols.list
                                    + psymtab->globals_offset),
                                   psymtab->n_global_syms);
                }
@@ -1898,7 +1933,7 @@ maintenance_info_psymtabs (char *regexp, int from_tty)
              if (psymtab->n_static_syms)
                {
                  printf_filtered ("(* (struct partial_symbol **) %s @ %d)\n",
-                                  host_address_to_string (psymtab->objfile->static_psymbols.list
+                                  host_address_to_string (objfile->static_psymbols.list
                                    + psymtab->statics_offset),
                                   psymtab->n_static_syms);
                }
@@ -1951,12 +1986,12 @@ maintenance_check_symtabs (char *ignore, int from_tty)
   {
     struct gdbarch *gdbarch = get_objfile_arch (objfile);
 
-    s = psymtab_to_symtab (ps);
+    s = psymtab_to_symtab (objfile, ps);
     if (s == NULL)
       continue;
     bv = BLOCKVECTOR (s);
     b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
-    psym = ps->objfile->static_psymbols.list + ps->statics_offset;
+    psym = objfile->static_psymbols.list + ps->statics_offset;
     length = ps->n_static_syms;
     while (length--)
       {
@@ -1973,7 +2008,7 @@ maintenance_check_symtabs (char *ignore, int from_tty)
        psym++;
       }
     b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
-    psym = ps->objfile->global_psymbols.list + ps->globals_offset;
+    psym = objfile->global_psymbols.list + ps->globals_offset;
     length = ps->n_global_syms;
     while (length--)
       {
This page took 0.033237 seconds and 4 git commands to generate.