* psymtab.c (PSYMTAB_TO_SYMTAB): Remove.
[deliverable/binutils-gdb.git] / gdb / psymtab.c
index 6012118e341c5d3a1a5b6381a4a482bb89fa0ae0..5fb8ad4887ec4e2aa386f3e1172441868f3fa812 100644 (file)
@@ -1,6 +1,6 @@
 /* Partial symbol tables.
    
-   Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc.
+   Copyright (C) 2009-2012 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -45,10 +45,6 @@ struct psymbol_bcache
   struct bcache *bcache;
 };
 
-/* A fast way to get from a psymtab to its symtab (after the first time).  */
-#define PSYMTAB_TO_SYMTAB(pst)  \
-    ((pst) -> symtab != NULL ? (pst) -> symtab : psymtab_to_symtab (pst))
-
 static struct partial_symbol *match_partial_symbol (struct partial_symtab *,
                                                    int,
                                                    const char *, domain_enum,
@@ -125,32 +121,78 @@ require_partial_symbols (struct objfile *objfile, int verbose)
   ALL_OBJFILES (objfile)        \
     ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, p)
 
-/* Lookup the partial symbol table of a source file named NAME.
-   *If* there is no '/' in the name, a match after a '/'
-   in the psymtab filename will also work.  */
+/* Helper function for partial_map_symtabs_matching_filename that
+   expands the symtabs and calls the iterator.  */
 
-static struct partial_symtab *
-lookup_partial_symtab (struct objfile *objfile, const char *name,
-                      const char *full_path, const char *real_path)
+static int
+partial_map_expand_apply (struct objfile *objfile,
+                         const char *name,
+                         const char *full_path,
+                         const char *real_path,
+                         struct partial_symtab *pst,
+                         int (*callback) (struct symtab *, void *),
+                         void *data)
+{
+  struct symtab *last_made = objfile->symtabs;
+
+  /* Don't visit already-expanded psymtabs.  */
+  if (pst->readin)
+    return 0;
+
+  /* This may expand more than one symtab, and we want to iterate over
+     all of them.  */
+  psymtab_to_symtab (pst);
+
+  return iterate_over_some_symtabs (name, full_path, real_path, callback, data,
+                                   objfile->symtabs, last_made);
+}
+
+/* Implementation of the map_symtabs_matching_filename method.  */
+
+static int
+partial_map_symtabs_matching_filename (struct objfile *objfile,
+                                      const char *name,
+                                      const char *full_path,
+                                      const char *real_path,
+                                      int (*callback) (struct symtab *,
+                                                       void *),
+                                      void *data)
 {
   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)
   {
-    if (FILENAME_CMP (name, pst->filename) == 0)
+    if (FILENAME_CMP (name, pst->filename) == 0
+       || (!is_abs && compare_filenames_for_search (pst->filename,
+                                                    name, name_len)))
       {
-       return (pst);
+       if (partial_map_expand_apply (objfile, name, full_path, real_path,
+                                     pst, callback, data))
+         return 1;
       }
 
+    /* Before we invoke realpath, which can get expensive when many
+       files are involved, do a quick comparison of the basenames.  */
+    if (! basenames_may_differ
+       && FILENAME_CMP (name_basename, lbasename (pst->filename)) != 0)
+      continue;
+
     /* If the user gave us an absolute path, try to find the file in
        this symtab and use its absolute path.  */
     if (full_path != NULL)
       {
        psymtab_to_fullname (pst);
        if (pst->fullname != NULL
-           && FILENAME_CMP (full_path, pst->fullname) == 0)
+           && (FILENAME_CMP (full_path, pst->fullname) == 0
+               || (!is_abs && compare_filenames_for_search (pst->fullname,
+                                                            name, name_len))))
          {
-           return pst;
+           if (partial_map_expand_apply (objfile, name, full_path, real_path,
+                                         pst, callback, data))
+             return 1;
          }
       }
 
@@ -163,42 +205,19 @@ lookup_partial_symtab (struct objfile *objfile, const char *name,
             rp = gdb_realpath (pst->fullname);
             make_cleanup (xfree, rp);
           }
-       if (rp != NULL && FILENAME_CMP (real_path, rp) == 0)
+       if (rp != NULL
+           && (FILENAME_CMP (real_path, rp) == 0
+               || (!is_abs && compare_filenames_for_search (real_path,
+                                                            name, name_len))))
          {
-           return pst;
+           if (partial_map_expand_apply (objfile, name, full_path, real_path,
+                                         pst, callback, data))
+             return 1;
          }
       }
   }
 
-  /* Now, search for a matching tail (only if name doesn't have any dirs).  */
-
-  if (lbasename (name) == name)
-    ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst)
-    {
-      if (FILENAME_CMP (lbasename (pst->filename), name) == 0)
-       return (pst);
-    }
-
-  return (NULL);
-}
-
-static int
-lookup_symtab_via_partial_symtab (struct objfile *objfile, const char *name,
-                                 const char *full_path, const char *real_path,
-                                 struct symtab **result)
-{
-  struct partial_symtab *ps;
-
-  ps = lookup_partial_symtab (objfile, name, full_path, real_path);
-  if (!ps)
-    return 0;
-
-  if (ps->readin)
-    error (_("Internal: readin %s pst for `%s' found when no symtab found."),
-          ps->filename, name);
-
-  *result = PSYMTAB_TO_SYMTAB (ps);
-  return 1;
+  return 0;
 }
 
 /* Find which partial symtab contains PC and SECTION starting at psymtab PST.
@@ -214,6 +233,8 @@ find_pc_sect_psymtab_closer (CORE_ADDR pc, struct obj_section *section,
   struct partial_symtab *best_pst = pst;
   CORE_ADDR best_addr = pst->textlow;
 
+  gdb_assert (!pst->psymtabs_addrmap_supported);
+
   /* An objfile that has its functions reordered might have
      many partial symbol tables containing the PC, but
      we want the partial symbol table that contains the
@@ -337,7 +358,8 @@ find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc,
      debug info type in single OBJFILE.  */
 
   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst)
-    if (pc >= pst->textlow && pc < pst->texthigh)
+    if (!pst->psymtabs_addrmap_supported
+       && pc >= pst->textlow && pc < pst->texthigh)
       {
        struct partial_symtab *best_pst;
 
@@ -366,7 +388,7 @@ 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);
+      return psymtab_to_symtab (ps);
     }
   return NULL;
 }
@@ -484,7 +506,7 @@ lookup_symbol_aux_psymtabs (struct objfile *objfile,
     if (!ps->readin && lookup_partial_symbol (ps, name, psymtab_index, domain))
       {
        struct symbol *sym = NULL;
-       struct symtab *stab = PSYMTAB_TO_SYMTAB (ps);
+       struct symtab *stab = psymtab_to_symtab (ps);
 
        /* Some caution must be observed with overloaded functions
           and methods, since the psymtab will not contain any overload
@@ -733,9 +755,7 @@ lookup_partial_symbol (struct partial_symtab *pst, const char *name,
 }
 
 /* Get the symbol table that corresponds to a partial_symtab.
-   This is fast after the first time you do it.  In fact, there
-   is an even faster macro PSYMTAB_TO_SYMTAB that does the fast
-   case inline.  */
+   This is fast after the first time you do it.  */
 
 static struct symtab *
 psymtab_to_symtab (struct partial_symtab *pst)
@@ -815,7 +835,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 (cs_pst);
     }
   return NULL;
 }
@@ -969,6 +989,8 @@ dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab,
   fprintf_filtered (outfile, "-");
   fputs_filtered (paddress (gdbarch, psymtab->texthigh), outfile);
   fprintf_filtered (outfile, "\n");
+  fprintf_filtered (outfile, "  Address map supported - %s.\n",
+                   psymtab->psymtabs_addrmap_supported ? "yes" : "no");
   fprintf_filtered (outfile, "  Depends on %d other partial symtabs.\n",
                    psymtab->number_of_dependencies);
   for (i = 0; i < psymtab->number_of_dependencies; i++)
@@ -1076,7 +1098,7 @@ read_psymtabs_with_filename (struct objfile *objfile, const char *filename)
   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, p)
     {
       if (filename_cmp (filename, p->filename) == 0)
-       PSYMTAB_TO_SYMTAB (p);
+       psymtab_to_symtab (p);
     }
 }
 
@@ -1103,10 +1125,6 @@ map_symbol_filenames_psymtab (struct objfile *objfile,
     }
 }
 
-int find_and_open_source (const char *filename,
-                         const char *dirname,
-                         char **fullname);
-
 /* Finds the fullname that a partial_symtab represents.
 
    If this functions finds the fullname, it will save it in ps->fullname
@@ -1203,7 +1221,7 @@ map_matching_symbols_psymtab (const char *name, domain_enum namespace,
          || match_partial_symbol (ps, global, name, namespace, match,
                                   ordered_compare))
        {
-         struct symtab *s = PSYMTAB_TO_SYMTAB (ps);
+         struct symtab *s = psymtab_to_symtab (ps);
          struct block *block;
 
          if (s == NULL || !s->primary)
@@ -1219,13 +1237,12 @@ map_matching_symbols_psymtab (const char *name, domain_enum namespace,
 }          
 
 static void
-expand_symtabs_matching_via_partial (struct objfile *objfile,
-                                    int (*file_matcher) (const char *,
-                                                         void *),
-                                    int (*name_matcher) (const char *,
-                                                         void *),
-                                    enum search_domain kind,
-                                    void *data)
+expand_symtabs_matching_via_partial
+  (struct objfile *objfile,
+   int (*file_matcher) (const char *, void *),
+   int (*name_matcher) (const char *, void *),
+   enum search_domain kind,
+   void *data)
 {
   struct partial_symtab *ps;
 
@@ -1275,9 +1292,9 @@ expand_symtabs_matching_via_partial (struct objfile *objfile,
                       && SYMBOL_CLASS (*psym) == LOC_BLOCK)
                   || (kind == TYPES_DOMAIN
                       && SYMBOL_CLASS (*psym) == LOC_TYPEDEF))
-                 && (*name_matcher) (SYMBOL_NATURAL_NAME (*psym), data))
+                 && (*name_matcher) (SYMBOL_SEARCH_NAME (*psym), data))
                {
-                 PSYMTAB_TO_SYMTAB (ps);
+                 psymtab_to_symtab (ps);
                  keep_going = 0;
                }
            }
@@ -1297,7 +1314,7 @@ const struct quick_symbol_functions psym_functions =
   objfile_has_psyms,
   find_last_source_symtab_from_partial,
   forget_cached_source_info_partial,
-  lookup_symtab_via_partial_symtab,
+  partial_map_symtabs_matching_filename,
   lookup_symbol_aux_psymtabs,
   pre_expand_symtabs_matching_psymtabs,
   print_psymtab_stats_for_objfile,
@@ -1539,18 +1556,7 @@ append_psymbol_to_list (struct psymbol_allocation_list *list,
    Since one arg is a struct, we pass in a ptr and deref it (sigh).
    Return the partial symbol that has been added.  */
 
-/* NOTE: carlton/2003-09-11: The reason why we return the partial
-   symbol is so that callers can get access to the symbol's demangled
-   name, which they don't have any cheap way to determine otherwise.
-   (Currenly, dwarf2read.c is the only file who uses that information,
-   though it's possible that other readers might in the future.)
-   Elena wasn't thrilled about that, and I don't blame her, but we
-   couldn't come up with a better way to get that information.  If
-   it's needed in other situations, we could consider breaking up
-   SYMBOL_SET_NAMES to provide access to the demangled name lookup
-   cache.  */
-
-const struct partial_symbol *
+void
 add_psymbol_to_list (const char *name, int namelength, int copy_name,
                     domain_enum domain,
                     enum address_class class,
@@ -1570,11 +1576,10 @@ add_psymbol_to_list (const char *name, int namelength, int copy_name,
   /* Do not duplicate global partial symbols.  */
   if (list == &objfile->global_psymbols
       && !added)
-    return psym;
+    return;
 
   /* Save pointer to partial symbol in psymtab, growing symtab if needed.  */
   append_psymbol_to_list (list, psym, objfile);
-  return psym;
 }
 
 /* Initialize storage for partial symbols.  */
@@ -1774,6 +1779,9 @@ maintenance_info_psymtabs (char *regexp, int from_tty)
              fputs_filtered (paddress (gdbarch, psymtab->texthigh),
                              gdb_stdout);
              printf_filtered ("\n");
+             printf_filtered ("    psymtabs_addrmap_supported %s\n",
+                              (psymtab->psymtabs_addrmap_supported
+                               ? "yes" : "no"));
              printf_filtered ("    globals ");
              if (psymtab->n_global_syms)
                {
@@ -1841,7 +1849,7 @@ maintenance_check_symtabs (char *ignore, int from_tty)
   {
     struct gdbarch *gdbarch = get_objfile_arch (objfile);
 
-    s = PSYMTAB_TO_SYMTAB (ps);
+    s = psymtab_to_symtab (ps);
     if (s == NULL)
       continue;
     bv = BLOCKVECTOR (s);
@@ -1912,7 +1920,8 @@ maintenance_check_symtabs (char *ignore, int from_tty)
 \f
 
 void
-expand_partial_symbol_names (int (*fun) (const char *, void *), void *data)
+expand_partial_symbol_names (int (*fun) (const char *, void *),
+                            void *data)
 {
   struct objfile *objfile;
 
This page took 0.028299 seconds and 4 git commands to generate.