2007-05-08 Paul Gilliam <pgilliam@us.ibm.com>
[deliverable/binutils-gdb.git] / gdb / symtab.c
index 4a5b1e2fd78c2d44e1b7c77fb9913b0cd2db165c..5dbce041d61fb95144907d0145ccc590a1d6117b 100644 (file)
@@ -84,6 +84,7 @@ static struct symbol *lookup_symbol_aux (const char *name,
                                         const char *linkage_name,
                                         const struct block *block,
                                         const domain_enum domain,
+                                        enum language language,
                                         int *is_a_field_of_this,
                                         struct symtab **symtab);
 
@@ -1079,9 +1080,10 @@ fixup_psymbol_section (struct partial_symbol *psym, struct objfile *objfile)
    code).  */
 
 struct symbol *
-lookup_symbol (const char *name, const struct block *block,
-              const domain_enum domain, int *is_a_field_of_this,
-              struct symtab **symtab)
+lookup_symbol_in_language (const char *name, const struct block *block,
+                          const domain_enum domain, enum language lang,
+                          int *is_a_field_of_this,
+                          struct symtab **symtab)
 {
   char *demangled_name = NULL;
   const char *modified_name = NULL;
@@ -1093,7 +1095,7 @@ lookup_symbol (const char *name, const struct block *block,
 
   /* If we are using C++ or Java, demangle the name before doing a lookup, so
      we can always binary search. */
-  if (current_language->la_language == language_cplus)
+  if (lang == language_cplus)
     {
       demangled_name = cplus_demangle (name, DMGL_ANSI | DMGL_PARAMS);
       if (demangled_name)
@@ -1103,7 +1105,7 @@ lookup_symbol (const char *name, const struct block *block,
          needtofreename = 1;
        }
     }
-  else if (current_language->la_language == language_java)
+  else if (lang == language_java)
     {
       demangled_name = cplus_demangle (name, 
                                       DMGL_ANSI | DMGL_PARAMS | DMGL_JAVA);
@@ -1129,14 +1131,32 @@ lookup_symbol (const char *name, const struct block *block,
     }
 
   returnval = lookup_symbol_aux (modified_name, mangled_name, block,
-                                domain, is_a_field_of_this, symtab);
+                                domain, lang,
+                                is_a_field_of_this, symtab);
   if (needtofreename)
     xfree (demangled_name);
 
+  /* Override the returned symtab with the symbol's specific one.  */
+  if (returnval != NULL && symtab != NULL)
+    *symtab = SYMBOL_SYMTAB (returnval);
+
   return returnval;     
 }
 
-/* Behave like lookup_symbol_aux except that NAME is the natural name
+/* Behave like lookup_symbol_in_language, but performed with the
+   current language.  */
+
+struct symbol *
+lookup_symbol (const char *name, const struct block *block,
+              domain_enum domain, int *is_a_field_of_this,
+              struct symtab **symtab)
+{
+  return lookup_symbol_in_language (name, block, domain,
+                                   current_language->la_language,
+                                   is_a_field_of_this, symtab);
+}
+
+/* Behave like lookup_symbol except that NAME is the natural name
    of the symbol that we're looking for and, if LINKAGE_NAME is
    non-NULL, ensure that the symbol's linkage name matches as
    well.  */
@@ -1144,9 +1164,11 @@ lookup_symbol (const char *name, const struct block *block,
 static struct symbol *
 lookup_symbol_aux (const char *name, const char *linkage_name,
                   const struct block *block, const domain_enum domain,
+                  enum language language,
                   int *is_a_field_of_this, struct symtab **symtab)
 {
   struct symbol *sym;
+  const struct language_defn *langdef;
 
   /* Make sure we do something sensible with is_a_field_of_this, since
      the callers that set this parameter to some non-null value will
@@ -1164,13 +1186,15 @@ lookup_symbol_aux (const char *name, const char *linkage_name,
   if (sym != NULL)
     return sym;
 
-  /* If requested to do so by the caller and if appropriate for the
-     current language, check to see if NAME is a field of `this'. */
+  /* If requested to do so by the caller and if appropriate for LANGUAGE,
+     check to see if NAME is a field of `this'. */
+
+  langdef = language_def (language);
 
-  if (current_language->la_value_of_this != NULL
+  if (langdef->la_value_of_this != NULL
       && is_a_field_of_this != NULL)
     {
-      struct value *v = current_language->la_value_of_this (0);
+      struct value *v = langdef->la_value_of_this (0);
 
       if (v && check_field (v, name))
        {
@@ -1181,12 +1205,11 @@ lookup_symbol_aux (const char *name, const char *linkage_name,
        }
     }
 
-  /* Now do whatever is appropriate for the current language to look
+  /* Now do whatever is appropriate for LANGUAGE to look
      up static and global variables.  */
 
-  sym = current_language->la_lookup_symbol_nonlocal (name, linkage_name,
-                                                    block, domain,
-                                                    symtab);
+  sym = langdef->la_lookup_symbol_nonlocal (name, linkage_name,
+                                            block, domain, symtab);
   if (sym != NULL)
     return sym;
 
@@ -1265,7 +1288,7 @@ lookup_symbol_aux_block (const char *name, const char *linkage_name,
        {
          /* Search the list of symtabs for one which contains the
             address of the start of this block.  */
-         ALL_SYMTABS (objfile, s)
+         ALL_PRIMARY_SYMTABS (objfile, s)
            {
              bv = BLOCKVECTOR (s);
              b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
@@ -1300,7 +1323,7 @@ lookup_symbol_aux_symtabs (int block_index,
   const struct block *block;
   struct symtab *s;
 
-  ALL_SYMTABS (objfile, s)
+  ALL_PRIMARY_SYMTABS (objfile, s)
   {
     bv = BLOCKVECTOR (s);
     block = BLOCKVECTOR_BLOCK (bv, block_index);
@@ -1715,7 +1738,7 @@ basic_lookup_transparent_type (const char *name)
      of the desired name as a global, then do psymtab-to-symtab
      conversion on the fly and return the found symbol.  */
 
-  ALL_SYMTABS (objfile, s)
+  ALL_PRIMARY_SYMTABS (objfile, s)
   {
     bv = BLOCKVECTOR (s);
     block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
@@ -1763,7 +1786,7 @@ basic_lookup_transparent_type (const char *name)
      conversion on the fly and return the found symbol.
    */
 
-  ALL_SYMTABS (objfile, s)
+  ALL_PRIMARY_SYMTABS (objfile, s)
   {
     bv = BLOCKVECTOR (s);
     block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
@@ -1940,7 +1963,7 @@ find_pc_sect_symtab (CORE_ADDR pc, asection *section)
      It also happens for objfiles that have their functions reordered.
      For these, the symtab we are looking for is not necessarily read in.  */
 
-  ALL_SYMTABS (objfile, s)
+  ALL_PRIMARY_SYMTABS (objfile, s)
   {
     bv = BLOCKVECTOR (s);
     b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
@@ -2893,7 +2916,6 @@ search_symbols (char *regexp, domain_enum kind, int nfiles, char *files[],
   struct symtab *s;
   struct partial_symtab *ps;
   struct blockvector *bv;
-  struct blockvector *prev_bv = 0;
   struct block *b;
   int i = 0;
   struct dict_iterator iter;
@@ -3008,7 +3030,11 @@ search_symbols (char *regexp, domain_enum kind, int nfiles, char *files[],
            QUIT;
 
            /* If it would match (logic taken from loop below)
-              load the file and go on to the next one */
+              load the file and go on to the next one.  We check the
+              filename here, but that's a bit bogus: we don't know
+              what file it really comes from until we have full
+              symtabs.  The symbol might be in a header file included by
+              this psymtab.  This only affects Insight.  */
            if (file_matches (ps->filename, files, nfiles)
                && ((regexp == NULL
                     || re_exec (SYMBOL_NATURAL_NAME (*psym)) != 0)
@@ -3063,7 +3089,8 @@ search_symbols (char *regexp, domain_enum kind, int nfiles, char *files[],
                        || lookup_symbol (SYMBOL_LINKAGE_NAME (msymbol),
                                          (struct block *) NULL,
                                          VAR_DOMAIN,
-                                       0, (struct symtab **) NULL) == NULL)
+                                         0, (struct symtab **) NULL)
+                       == NULL)
                      found_misc = 1;
                  }
              }
@@ -3071,15 +3098,9 @@ search_symbols (char *regexp, domain_enum kind, int nfiles, char *files[],
       }
     }
 
-  ALL_SYMTABS (objfile, s)
+  ALL_PRIMARY_SYMTABS (objfile, s)
   {
     bv = BLOCKVECTOR (s);
-    /* Often many files share a blockvector.
-       Scan each blockvector only once so that
-       we don't get every symbol many times.
-       It happens that the first symtab in the list
-       for any given blockvector is the main file.  */
-    if (bv != prev_bv)
       for (i = GLOBAL_BLOCK; i <= STATIC_BLOCK; i++)
        {
          struct symbol_search *prevtail = tail;
@@ -3087,8 +3108,10 @@ search_symbols (char *regexp, domain_enum kind, int nfiles, char *files[],
          b = BLOCKVECTOR_BLOCK (bv, i);
          ALL_BLOCK_SYMBOLS (b, iter, sym)
            {
+             struct symtab *real_symtab = SYMBOL_SYMTAB (sym);
              QUIT;
-             if (file_matches (s->filename, files, nfiles)
+
+             if (file_matches (real_symtab->filename, files, nfiles)
                  && ((regexp == NULL
                       || re_exec (SYMBOL_NATURAL_NAME (sym)) != 0)
                      && ((kind == VARIABLES_DOMAIN && SYMBOL_CLASS (sym) != LOC_TYPEDEF
@@ -3101,7 +3124,7 @@ search_symbols (char *regexp, domain_enum kind, int nfiles, char *files[],
                  /* match */
                  psr = (struct symbol_search *) xmalloc (sizeof (struct symbol_search));
                  psr->block = i;
-                 psr->symtab = s;
+                 psr->symtab = real_symtab;
                  psr->symbol = sym;
                  psr->msymbol = NULL;
                  psr->next = NULL;
@@ -3129,7 +3152,6 @@ search_symbols (char *regexp, domain_enum kind, int nfiles, char *files[],
                tail = sort_search_symbols (prevtail, nfound);
            }
        }
-    prev_bv = bv;
   }
 
   /* If there are no eyes, avoid all contact.  I mean, if there are
@@ -3694,7 +3716,7 @@ make_symbol_completion_list (char *text, char *word)
   /* Go through the symtabs and check the externs and statics for
      symbols which match.  */
 
-  ALL_SYMTABS (objfile, s)
+  ALL_PRIMARY_SYMTABS (objfile, s)
   {
     QUIT;
     b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), GLOBAL_BLOCK);
@@ -3704,7 +3726,7 @@ make_symbol_completion_list (char *text, char *word)
       }
   }
 
-  ALL_SYMTABS (objfile, s)
+  ALL_PRIMARY_SYMTABS (objfile, s)
   {
     QUIT;
     b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), STATIC_BLOCK);
@@ -4089,8 +4111,8 @@ skip_prologue_using_sal (CORE_ADDR func_addr)
       /* If there is only one sal that covers the entire function,
         then it is probably a single line function, like
         "foo(){}". */
-      if (prologue_sal.end == end_pc)
-       return start_pc;
+      if (prologue_sal.end >= end_pc)
+       return 0;
       while (prologue_sal.end < end_pc)
        {
          struct symtab_and_line sal;
This page took 0.027664 seconds and 4 git commands to generate.