gdb/
[deliverable/binutils-gdb.git] / gdb / symtab.c
index 6133b5cc653b7659acd9cf3d56d70cd7538c6d60..e19c850376c77d9598cef5e1cfb79001076d34e2 100644 (file)
@@ -33,7 +33,6 @@
 #include "language.h"
 #include "demangle.h"
 #include "inferior.h"
-#include "linespec.h"
 #include "source.h"
 #include "filenames.h"         /* for FILENAME_CMP */
 #include "objc-lang.h"
@@ -76,8 +75,6 @@ static void variables_info (char *, int);
 
 static void sources_info (char *, int);
 
-static void output_source_filename (const char *, int *);
-
 static int find_line_common (struct linetable *, int, int *, int);
 
 static struct symbol *lookup_symbol_aux (const char *name,
@@ -109,6 +106,9 @@ void _initialize_symtab (void);
 
 /* */
 
+/* When non-zero, print debugging messages related to symtab creation.  */
+int symtab_create_debug = 0;
+
 /* Non-zero if a file may be known by two different basenames.
    This is the uncommon case, and significantly slows down gdb.
    Default set to "off" to not slow down the common case.  */
@@ -1516,18 +1516,17 @@ lookup_symbol_aux_objfile (struct objfile *objfile, int block_index,
     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);
-         }
-      }
+  ALL_OBJFILE_PRIMARY_SYMTABS (objfile, s)
+    {
+      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;
 }
@@ -1552,6 +1551,48 @@ lookup_symbol_aux_symtabs (int block_index, const char *name,
   return NULL;
 }
 
+/* Wrapper around lookup_symbol_aux_objfile for search_symbols.
+   Look up LINKAGE_NAME in DOMAIN in the global and static blocks of OBJFILE
+   and all related objfiles.  */
+
+static struct symbol *
+lookup_symbol_in_objfile_from_linkage_name (struct objfile *objfile,
+                                           const char *linkage_name,
+                                           domain_enum domain)
+{
+  enum language lang = current_language->la_language;
+  const char *modified_name;
+  struct cleanup *cleanup = demangle_for_lookup (linkage_name, lang,
+                                                &modified_name);
+  struct objfile *main_objfile, *cur_objfile;
+
+  if (objfile->separate_debug_objfile_backlink)
+    main_objfile = objfile->separate_debug_objfile_backlink;
+  else
+    main_objfile = objfile;
+
+  for (cur_objfile = main_objfile;
+       cur_objfile;
+       cur_objfile = objfile_separate_debug_iterate (main_objfile, cur_objfile))
+    {
+      struct symbol *sym;
+
+      sym = lookup_symbol_aux_objfile (cur_objfile, GLOBAL_BLOCK,
+                                      modified_name, domain);
+      if (sym == NULL)
+       sym = lookup_symbol_aux_objfile (cur_objfile, STATIC_BLOCK,
+                                        modified_name, domain);
+      if (sym != NULL)
+       {
+         do_cleanups (cleanup);
+         return sym;
+       }
+    }
+
+  do_cleanups (cleanup);
+  return NULL;
+}
+
 /* A helper function for lookup_symbol_aux that interfaces with the
    "quick" symbol table functions.  */
 
@@ -3062,57 +3103,104 @@ operator_chars (char *p, char **end)
 }
 \f
 
+/* Cache to watch for file names already seen by filename_seen.  */
+
+struct filename_seen_cache
+{
+  /* Table of files seen so far.  */
+  const char **tab;
+
+  /* Allocated size of tab in elements.  */
+  int tab_alloc_size;
+#define INITIAL_FILENAME_SEEN_CACHE_SIZE 100
+
+  /* Current size of tab in elements.  */
+  int tab_cur_size;
+};
+
+/* filename_seen_cache constructor.  */
+
+static struct filename_seen_cache *
+create_filename_seen_cache (void)
+{
+  struct filename_seen_cache *cache;
+
+  cache = XNEW (struct filename_seen_cache);
+  cache->tab_alloc_size = INITIAL_FILENAME_SEEN_CACHE_SIZE;
+  cache->tab = XNEWVEC (const char *, cache->tab_alloc_size);
+  cache->tab_cur_size = 0;
+
+  return cache;
+}
+
+/* Empty the cache, but do not delete it.  */
+
+static void
+clear_filename_seen_cache (struct filename_seen_cache * cache)
+{
+  cache->tab_cur_size = 0;
+}
+
+/* filename_seen_cache destructor.
+   This takes a void * argument as it is generally used as a cleanup.  */
+
+static void
+delete_filename_seen_cache (void *ptr)
+{
+  struct filename_seen_cache *cache = ptr;
+
+  xfree (cache->tab);
+  xfree (cache);
+}
+
 /* If FILE is not already in the table of files, return zero;
    otherwise return non-zero.  Optionally add FILE to the table if ADD
    is non-zero.  If *FIRST is non-zero, forget the old table
    contents.  */
 
 static int
-filename_seen (const char *file, int add, int *first)
+filename_seen (struct filename_seen_cache *cache, const char *file, int add)
 {
-  /* Table of files seen so far.  */
-  static const char **tab = NULL;
-  /* Allocated size of tab in elements.
-     Start with one 256-byte block (when using GNU malloc.c).
-     24 is the malloc overhead when range checking is in effect.  */
-  static int tab_alloc_size = (256 - 24) / sizeof (char *);
-  /* Current size of tab in elements.  */
-  static int tab_cur_size;
   const char **p;
 
-  if (*first)
-    {
-      if (tab == NULL)
-       tab = (const char **) xmalloc (tab_alloc_size * sizeof (*tab));
-      tab_cur_size = 0;
-    }
-
   /* Is FILE in tab?  */
-  for (p = tab; p < tab + tab_cur_size; p++)
+  for (p = cache->tab; p < cache->tab + cache->tab_cur_size; p++)
     if (filename_cmp (*p, file) == 0)
       return 1;
 
   /* No; maybe add it to tab.  */
   if (add)
     {
-      if (tab_cur_size == tab_alloc_size)
+      if (cache->tab_cur_size == cache->tab_alloc_size)
        {
-         tab_alloc_size *= 2;
-         tab = (const char **) xrealloc ((char *) tab,
-                                         tab_alloc_size * sizeof (*tab));
+         cache->tab_alloc_size *= 2;
+         cache->tab = XRESIZEVEC (const char *, cache->tab,
+                                  cache->tab_alloc_size);
        }
-      tab[tab_cur_size++] = file;
+      cache->tab[cache->tab_cur_size++] = file;
     }
 
   return 0;
 }
 
+/* Data structure to maintain printing state for output_source_filename.  */
+
+struct output_source_filename_data
+{
+  /* Cache of what we've seen so far.  */
+  struct filename_seen_cache *filename_seen_cache;
+
+  /* Flag of whether we're printing the first one.  */
+  int first;
+};
+
 /* Slave routine for sources_info.  Force line breaks at ,'s.
-   NAME is the name to print and *FIRST is nonzero if this is the first
-   name printed.  Set *FIRST to zero.  */
+   NAME is the name to print.
+   DATA contains the state for printing and watching for duplicates.  */
 
 static void
-output_source_filename (const char *name, int *first)
+output_source_filename (const char *name,
+                       struct output_source_filename_data *data)
 {
   /* Since a single source file can result in several partial symbol
      tables, we need to avoid printing it more than once.  Note: if
@@ -3124,20 +3212,16 @@ output_source_filename (const char *name, int *first)
      symtabs; it doesn't hurt to check.  */
 
   /* Was NAME already seen?  */
-  if (filename_seen (name, 1, first))
+  if (filename_seen (data->filename_seen_cache, name, 1))
     {
       /* Yes; don't print it again.  */
       return;
     }
+
   /* No; print it and reset *FIRST.  */
-  if (*first)
-    {
-      *first = 0;
-    }
-  else
-    {
-      printf_filtered (", ");
-    }
+  if (! data->first)
+    printf_filtered (", ");
+  data->first = 0;
 
   wrap_here ("");
   fputs_filtered (name, gdb_stdout);
@@ -3157,31 +3241,39 @@ sources_info (char *ignore, int from_tty)
 {
   struct symtab *s;
   struct objfile *objfile;
-  int first;
+  struct output_source_filename_data data;
+  struct cleanup *cleanups;
 
   if (!have_full_symbols () && !have_partial_symbols ())
     {
       error (_("No symbol table is loaded.  Use the \"file\" command."));
     }
 
+  data.filename_seen_cache = create_filename_seen_cache ();
+  cleanups = make_cleanup (delete_filename_seen_cache,
+                          data.filename_seen_cache);
+
   printf_filtered ("Source files for which symbols have been read in:\n\n");
 
-  first = 1;
+  data.first = 1;
   ALL_SYMTABS (objfile, s)
   {
     const char *fullname = symtab_to_fullname (s);
 
-    output_source_filename (fullname ? fullname : s->filename, &first);
+    output_source_filename (fullname ? fullname : s->filename, &data);
   }
   printf_filtered ("\n\n");
 
   printf_filtered ("Source files for which symbols "
                   "will be read in on demand:\n\n");
 
-  first = 1;
-  map_partial_symbol_filenames (output_partial_symbol_filename, &first,
+  clear_filename_seen_cache (data.filename_seen_cache);
+  data.first = 1;
+  map_partial_symbol_filenames (output_partial_symbol_filename, &data,
                                1 /*need_fullname*/);
   printf_filtered ("\n");
+
+  do_cleanups (cleanups);
 }
 
 static int
@@ -3450,10 +3542,14 @@ search_symbols (char *regexp, enum search_domain kind,
      The symbol will then be found during the scan of symtabs below.
 
      For functions, find_pc_symtab should succeed if we have debug info
-     for the function, for variables we have to call lookup_symbol
-     to determine if the variable has debug info.
+     for the function, for variables we have to call
+     lookup_symbol_in_objfile_from_linkage_name to determine if the variable
+     has debug info.
      If the lookup fails, set found_misc so that we will rescan to print
-     any matching symbols without debug info.  */
+     any matching symbols without debug info.
+     We only search the objfile the msymbol came from, we no longer search
+     all objfiles.  In large programs (1000s of shared libs) searching all
+     objfiles is not worth the pain.  */
 
   if (nfiles == 0 && (kind == VARIABLES_DOMAIN || kind == FUNCTIONS_DOMAIN))
     {
@@ -3461,6 +3557,9 @@ search_symbols (char *regexp, enum search_domain kind,
       {
         QUIT;
 
+       if (msymbol->created_by_gdb)
+         continue;
+
        if (MSYMBOL_TYPE (msymbol) == ourtype
            || MSYMBOL_TYPE (msymbol) == ourtype2
            || MSYMBOL_TYPE (msymbol) == ourtype3
@@ -3470,21 +3569,15 @@ search_symbols (char *regexp, enum search_domain kind,
                || regexec (&datum.preg, SYMBOL_NATURAL_NAME (msymbol), 0,
                            NULL, 0) == 0)
              {
-               if (0 == find_pc_symtab (SYMBOL_VALUE_ADDRESS (msymbol)))
-                 {
-                   /* FIXME: carlton/2003-02-04: Given that the
-                      semantics of lookup_symbol keeps on changing
-                      slightly, it would be a nice idea if we had a
-                      function lookup_symbol_minsym that found the
-                      symbol associated to a given minimal symbol (if
-                      any).  */
-                   if (kind == FUNCTIONS_DOMAIN
-                       || lookup_symbol (SYMBOL_LINKAGE_NAME (msymbol),
-                                         (struct block *) NULL,
-                                         VAR_DOMAIN, 0)
-                       == NULL)
-                     found_misc = 1;
-                 }
+               /* Note: An important side-effect of these lookup functions
+                  is to expand the symbol table if msymbol is found, for the
+                  benefit of the next loop on ALL_PRIMARY_SYMTABS.  */
+               if (kind == FUNCTIONS_DOMAIN
+                   ? find_pc_symtab (SYMBOL_VALUE_ADDRESS (msymbol)) == NULL
+                   : (lookup_symbol_in_objfile_from_linkage_name
+                      (objfile, SYMBOL_LINKAGE_NAME (msymbol), VAR_DOMAIN)
+                      == NULL))
+                 found_misc = 1;
              }
          }
       }
@@ -3561,12 +3654,15 @@ search_symbols (char *regexp, enum search_domain kind,
   /* If there are no eyes, avoid all contact.  I mean, if there are
      no debug symbols, then print directly from the msymbol_vector.  */
 
-  if (found_misc || kind != FUNCTIONS_DOMAIN)
+  if (found_misc || (nfiles == 0 && kind != FUNCTIONS_DOMAIN))
     {
       ALL_MSYMBOLS (objfile, msymbol)
       {
         QUIT;
 
+       if (msymbol->created_by_gdb)
+         continue;
+
        if (MSYMBOL_TYPE (msymbol) == ourtype
            || MSYMBOL_TYPE (msymbol) == ourtype2
            || MSYMBOL_TYPE (msymbol) == ourtype3
@@ -3576,14 +3672,14 @@ search_symbols (char *regexp, enum search_domain kind,
                || regexec (&datum.preg, SYMBOL_NATURAL_NAME (msymbol), 0,
                            NULL, 0) == 0)
              {
-               /* Functions:  Look up by address.  */
-               if (kind != FUNCTIONS_DOMAIN ||
-                   (0 == find_pc_symtab (SYMBOL_VALUE_ADDRESS (msymbol))))
+               /* For functions we can do a quick check of whether the
+                  symbol might be found via find_pc_symtab.  */
+               if (kind != FUNCTIONS_DOMAIN
+                   || find_pc_symtab (SYMBOL_VALUE_ADDRESS (msymbol)) == NULL)
                  {
-                   /* Variables/Absolutes:  Look up by name.  */
-                   if (lookup_symbol (SYMBOL_LINKAGE_NAME (msymbol),
-                                      (struct block *) NULL, VAR_DOMAIN, 0)
-                        == NULL)
+                   if (lookup_symbol_in_objfile_from_linkage_name
+                       (objfile, SYMBOL_LINKAGE_NAME (msymbol), VAR_DOMAIN)
+                       == NULL)
                      {
                        /* match */
                        psr = (struct symbol_search *)
@@ -3881,17 +3977,14 @@ compare_symbol_name (const char *name, const char *sym_text, int sym_text_len)
 /* Free any memory associated with a completion list.  */
 
 static void
-free_completion_list (char ***list_ptr)
+free_completion_list (VEC (char_ptr) **list_ptr)
 {
-  int i = 0;
-  char **list = *list_ptr;
+  int i;
+  char *p;
 
-  while (list[i] != NULL)
-    {
-      xfree (list[i]);
-      i++;
-    }
-  xfree (list);
+  for (i = 0; VEC_iterate (char_ptr, *list_ptr, i, p); ++i)
+    xfree (p);
+  VEC_free (char_ptr, *list_ptr);
 }
 
 /* Callback for make_cleanup.  */
@@ -3904,9 +3997,7 @@ do_free_completion_list (void *list)
 
 /* Helper routine for make_symbol_completion_list.  */
 
-static int return_val_size;
-static int return_val_index;
-static char **return_val;
+static VEC (char_ptr) *return_val;
 
 #define COMPLETION_LIST_ADD_SYMBOL(symbol, sym_text, len, text, word) \
       completion_list_add_name \
@@ -3953,13 +4044,7 @@ completion_list_add_name (const char *symname,
        strcat (new, symname);
       }
 
-    if (return_val_index + 3 > return_val_size)
-      {
-       newsize = (return_val_size *= 2) * sizeof (char *);
-       return_val = (char **) xrealloc ((char *) return_val, newsize);
-      }
-    return_val[return_val_index++] = new;
-    return_val[return_val_index] = NULL;
+    VEC_safe_push (char_ptr, return_val, new);
   }
 }
 
@@ -4123,7 +4208,7 @@ expand_partial_symbol_name (const char *name, void *user_data)
   return compare_symbol_name (name, datum->sym_text, datum->sym_text_len);
 }
 
-char **
+VEC (char_ptr) *
 default_make_symbol_completion_list_break_on (char *text, char *word,
                                              const char *break_on)
 {
@@ -4178,9 +4263,7 @@ default_make_symbol_completion_list_break_on (char *text, char *word,
       /* A double-quoted string is never a symbol, nor does it make sense
          to complete it any other way.  */
       {
-       return_val = (char **) xmalloc (sizeof (char *));
-       return_val[0] = NULL;
-       return return_val;
+       return NULL;
       }
     else
       {
@@ -4216,10 +4299,7 @@ default_make_symbol_completion_list_break_on (char *text, char *word,
     }
   gdb_assert (sym_text[sym_text_len] == '\0' || sym_text[sym_text_len] == '(');
 
-  return_val_size = 100;
-  return_val_index = 0;
-  return_val = (char **) xmalloc ((return_val_size + 1) * sizeof (char *));
-  return_val[0] = NULL;
+  return_val = NULL;
   back_to = make_cleanup (do_free_completion_list, &return_val);
 
   datum.sym_text = sym_text;
@@ -4334,17 +4414,17 @@ default_make_symbol_completion_list_break_on (char *text, char *word,
   return (return_val);
 }
 
-char **
+VEC (char_ptr) *
 default_make_symbol_completion_list (char *text, char *word)
 {
   return default_make_symbol_completion_list_break_on (text, word, "");
 }
 
-/* Return a NULL terminated array of all symbols (regardless of class)
-   which begin by matching TEXT.  If the answer is no symbols, then
-   the return value is an array which contains only a NULL pointer.  */
+/* Return a vector of all symbols (regardless of class) which begin by
+   matching TEXT.  If the answer is no symbols, then the return value
+   is NULL.  */
 
-char **
+VEC (char_ptr) *
 make_symbol_completion_list (char *text, char *word)
 {
   return current_language->la_make_symbol_completion_list (text, word);
@@ -4353,7 +4433,7 @@ make_symbol_completion_list (char *text, char *word)
 /* Like make_symbol_completion_list, but suitable for use as a
    completion function.  */
 
-char **
+VEC (char_ptr) *
 make_symbol_completion_list_fn (struct cmd_list_element *ignore,
                                char *text, char *word)
 {
@@ -4363,7 +4443,7 @@ make_symbol_completion_list_fn (struct cmd_list_element *ignore,
 /* Like make_symbol_completion_list, but returns a list of symbols
    defined in a source file FILE.  */
 
-char **
+VEC (char_ptr) *
 make_file_symbol_completion_list (char *text, char *word, char *srcfile)
 {
   struct symbol *sym;
@@ -4409,9 +4489,7 @@ make_file_symbol_completion_list (char *text, char *word, char *srcfile)
       /* A double-quoted string is never a symbol, nor does it make sense
          to complete it any other way.  */
       {
-       return_val = (char **) xmalloc (sizeof (char *));
-       return_val[0] = NULL;
-       return return_val;
+       return NULL;
       }
     else
       {
@@ -4422,10 +4500,7 @@ make_file_symbol_completion_list (char *text, char *word, char *srcfile)
 
   sym_text_len = strlen (sym_text);
 
-  return_val_size = 10;
-  return_val_index = 0;
-  return_val = (char **) xmalloc ((return_val_size + 1) * sizeof (char *));
-  return_val[0] = NULL;
+  return_val = NULL;
 
   /* Find the symtab for SRCFILE (this loads it if it was not yet read
      in).  */
@@ -4468,18 +4543,11 @@ make_file_symbol_completion_list (char *text, char *word, char *srcfile)
 
 static void
 add_filename_to_list (const char *fname, char *text, char *word,
-                     char ***list, int *list_used, int *list_alloced)
+                     VEC (char_ptr) **list)
 {
   char *new;
   size_t fnlen = strlen (fname);
 
-  if (*list_used + 1 >= *list_alloced)
-    {
-      *list_alloced *= 2;
-      *list = (char **) xrealloc ((char *) *list,
-                                 *list_alloced * sizeof (char *));
-    }
-
   if (word == text)
     {
       /* Return exactly fname.  */
@@ -4500,8 +4568,7 @@ add_filename_to_list (const char *fname, char *text, char *word,
       new[text - word] = '\0';
       strcat (new, fname);
     }
-  (*list)[*list_used] = new;
-  (*list)[++*list_used] = NULL;
+  VEC_safe_push (char_ptr, *list, new);
 }
 
 static int
@@ -4525,13 +4592,11 @@ not_interesting_fname (const char *fname)
    map_partial_symbol_filenames.  */
 struct add_partial_filename_data
 {
-  int *first;
+  struct filename_seen_cache *filename_seen_cache;
   char *text;
   char *word;
   int text_len;
-  char ***list;
-  int *list_used;
-  int *list_alloced;
+  VEC (char_ptr) **list;
 };
 
 /* A callback for map_partial_symbol_filenames.  */
@@ -4544,63 +4609,60 @@ maybe_add_partial_symtab_filename (const char *filename, const char *fullname,
 
   if (not_interesting_fname (filename))
     return;
-  if (!filename_seen (filename, 1, data->first)
+  if (!filename_seen (data->filename_seen_cache, filename, 1)
       && filename_ncmp (filename, data->text, data->text_len) == 0)
     {
       /* This file matches for a completion; add it to the
         current list of matches.  */
-      add_filename_to_list (filename, data->text, data->word,
-                           data->list, data->list_used, data->list_alloced);
+      add_filename_to_list (filename, data->text, data->word, data->list);
     }
   else
     {
       const char *base_name = lbasename (filename);
 
       if (base_name != filename
-         && !filename_seen (base_name, 1, data->first)
+         && !filename_seen (data->filename_seen_cache, base_name, 1)
          && filename_ncmp (base_name, data->text, data->text_len) == 0)
-       add_filename_to_list (base_name, data->text, data->word,
-                             data->list, data->list_used, data->list_alloced);
+       add_filename_to_list (base_name, data->text, data->word, data->list);
     }
 }
 
-/* Return a NULL terminated array of all source files whose names
-   begin with matching TEXT.  The file names are looked up in the
-   symbol tables of this program.  If the answer is no matchess, then
-   the return value is an array which contains only a NULL pointer.  */
+/* Return a vector of all source files whose names begin with matching
+   TEXT.  The file names are looked up in the symbol tables of this
+   program.  If the answer is no matchess, then the return value is
+   NULL.  */
 
-char **
+VEC (char_ptr) *
 make_source_files_completion_list (char *text, char *word)
 {
   struct symtab *s;
   struct objfile *objfile;
-  int first = 1;
-  int list_alloced = 1;
-  int list_used = 0;
   size_t text_len = strlen (text);
-  char **list = (char **) xmalloc (list_alloced * sizeof (char *));
+  VEC (char_ptr) *list = NULL;
   const char *base_name;
   struct add_partial_filename_data datum;
-  struct cleanup *back_to;
-
-  list[0] = NULL;
+  struct filename_seen_cache *filename_seen_cache;
+  struct cleanup *back_to, *cache_cleanup;
 
   if (!have_full_symbols () && !have_partial_symbols ())
     return list;
 
   back_to = make_cleanup (do_free_completion_list, &list);
 
+  filename_seen_cache = create_filename_seen_cache ();
+  cache_cleanup = make_cleanup (delete_filename_seen_cache,
+                               filename_seen_cache);
+
   ALL_SYMTABS (objfile, s)
     {
       if (not_interesting_fname (s->filename))
        continue;
-      if (!filename_seen (s->filename, 1, &first)
+      if (!filename_seen (filename_seen_cache, s->filename, 1)
          && filename_ncmp (s->filename, text, text_len) == 0)
        {
          /* This file matches for a completion; add it to the current
             list of matches.  */
-         add_filename_to_list (s->filename, text, word,
-                               &list, &list_used, &list_alloced);
+         add_filename_to_list (s->filename, text, word, &list);
        }
       else
        {
@@ -4610,22 +4672,21 @@ make_source_files_completion_list (char *text, char *word)
             command do when they parse file names.  */
          base_name = lbasename (s->filename);
          if (base_name != s->filename
-             && !filename_seen (base_name, 1, &first)
+             && !filename_seen (filename_seen_cache, base_name, 1)
              && filename_ncmp (base_name, text, text_len) == 0)
-           add_filename_to_list (base_name, text, word,
-                                 &list, &list_used, &list_alloced);
+           add_filename_to_list (base_name, text, word, &list);
        }
     }
 
-  datum.first = &first;
+  datum.filename_seen_cache = filename_seen_cache;
   datum.text = text;
   datum.word = word;
   datum.text_len = text_len;
   datum.list = &list;
-  datum.list_used = &list_used;
-  datum.list_alloced = &list_alloced;
   map_partial_symbol_filenames (maybe_add_partial_symtab_filename, &datum,
                                0 /*need_fullname*/);
+
+  do_cleanups (cache_cleanup);
   discard_cleanups (back_to);
 
   return list;
@@ -4814,27 +4875,6 @@ skip_prologue_using_sal (struct gdbarch *gdbarch, CORE_ADDR func_addr)
     return prologue_sal.pc;
 }
 \f
-struct symtabs_and_lines
-decode_line_spec (char *string, int flags)
-{
-  struct symtabs_and_lines sals;
-  struct symtab_and_line cursal;
-
-  if (string == 0)
-    error (_("Empty line specification."));
-
-  /* We use whatever is set as the current source line.  We do not try
-     and get a default  or it will recursively call us!  */
-  cursal = get_current_source_symtab_and_line ();
-
-  sals = decode_line_1 (&string, flags,
-                       cursal.symtab, cursal.line);
-
-  if (*string)
-    error (_("Junk at end of line specification: %s"), string);
-  return sals;
-}
-
 /* Track MAIN */
 static char *name_of_main;
 enum language language_of_main = language_unknown;
@@ -5009,5 +5049,13 @@ one base name, and gdb will do file name comparisons more efficiently."),
                           NULL, NULL,
                           &setlist, &showlist);
 
+  add_setshow_boolean_cmd ("symtab-create", no_class, &symtab_create_debug,
+                          _("Set debugging of symbol table creation."),
+                          _("Show debugging of symbol table creation."), _("\
+When enabled, debugging messages are printed when building symbol tables."),
+                           NULL,
+                           NULL,
+                           &setdebuglist, &showdebuglist);
+
   observer_attach_executable_changed (symtab_observer_executable_changed);
 }
This page took 0.03248 seconds and 4 git commands to generate.