2003-05-14 Elena Zannoni <ezannoni@redhat.com>
[deliverable/binutils-gdb.git] / gdb / symtab.c
index 2353ae5a8c0c4fc91f3f95c01ba655b49e309e3f..dbc83b9143cc05852e65f80291a308462340ea8b 100644 (file)
@@ -1,6 +1,7 @@
 /* Symbol table lookup for the GNU debugger, GDB.
-   Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
-   1996, 1997, 1998, 1999, 2000, 2001
+
+   Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
+   1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
    Free Software Foundation, Inc.
 
    This file is part of GDB.
 #include "demangle.h"
 #include "inferior.h"
 #include "linespec.h"
+#include "source.h"
 #include "filenames.h"         /* for FILENAME_CMP */
+#include "objc-lang.h"
+
+#include "hashtab.h"
 
-#include "obstack.h"
+#include "gdb_obstack.h"
+#include "block.h"
 
 #include <sys/types.h>
 #include <fcntl.h>
 #include <ctype.h>
 #include "cp-abi.h"
 
-/* Prototype for one function in parser-defs.h,
-   instead of including that entire file. */
-
-extern char *find_template_name_end (char *);
-
 /* Prototypes for local functions */
 
 static void completion_list_add_name (char *, char *, int, char *, char *);
@@ -76,15 +77,52 @@ static int find_line_common (struct linetable *, int, int *);
 char *operator_chars (char *p, char **end);
 
 static struct partial_symbol *lookup_partial_symbol (struct partial_symtab *,
+                                                    const char *,
                                                     const char *, int,
-                                                    namespace_enum);
-
-static struct symbol *lookup_symbol_aux (const char *name, const
-                                        struct block *block, const
-                                        namespace_enum namespace, int
-                                        *is_a_field_of_this, struct
-                                        symtab **symtab);
-
+                                                    domain_enum);
+
+static struct symbol *lookup_symbol_aux (const char *name,
+                                        const char *mangled_name,
+                                        const struct block *block,
+                                        const domain_enum domain,
+                                        int *is_a_field_of_this,
+                                        struct symtab **symtab);
+
+static
+struct symbol *lookup_symbol_aux_local (const char *name,
+                                       const char *mangled_name,
+                                       const struct block *block,
+                                       const domain_enum domain,
+                                       struct symtab **symtab,
+                                       const struct block **static_block);
+
+static
+struct symbol *lookup_symbol_aux_block (const char *name,
+                                       const char *mangled_name,
+                                       const struct block *block,
+                                       const domain_enum domain,
+                                       struct symtab **symtab);
+
+static
+struct symbol *lookup_symbol_aux_symtabs (int block_index,
+                                         const char *name,
+                                         const char *mangled_name,
+                                         const domain_enum domain,
+                                         struct symtab **symtab);
+
+static
+struct symbol *lookup_symbol_aux_psymtabs (int block_index,
+                                          const char *name,
+                                          const char *mangled_name,
+                                          const domain_enum domain,
+                                          struct symtab **symtab);
+
+static
+struct symbol *lookup_symbol_aux_minsyms (const char *name,
+                                         const char *mangled_name,
+                                         const domain_enum domain,
+                                         int *is_a_field_of_this,
+                                         struct symtab **symtab);
 
 static struct symbol *find_active_alias (struct symbol *sym, CORE_ADDR addr);
 
@@ -96,12 +134,12 @@ static void fixup_section (struct general_symbol_info *, struct objfile *);
 
 static int file_matches (char *, char **, int);
 
-static void print_symbol_info (namespace_enum,
+static void print_symbol_info (domain_enum,
                               struct symtab *, struct symbol *, int, char *);
 
 static void print_msymbol_info (struct minimal_symbol *);
 
-static void symtab_symbol_info (char *, namespace_enum, int);
+static void symtab_symbol_info (char *, domain_enum, int);
 
 static void overload_list_add_symbol (struct symbol *sym, char *oload_name);
 
@@ -118,19 +156,6 @@ struct type *builtin_type_error;
 
 const struct block *block_found;
 
-/* While the C++ support is still in flux, issue a possibly helpful hint on
-   using the new command completion feature on single quoted demangled C++
-   symbols.  Remove when loose ends are cleaned up.   FIXME -fnf */
-
-static void
-cplusplus_hint (char *name)
-{
-  while (*name == '\'')
-    name++;
-  printf_filtered ("Hint: try '%s<TAB> or '%s<ESC-?>\n", name, name);
-  printf_filtered ("(Note leading single quote.)\n");
-}
-
 /* Check for a symtab of a specific name; first in symtabs, then in
    psymtabs.  *If* there is no '/' in the name, a match after a '/'
    in the symtab filename will also work.  */
@@ -142,11 +167,17 @@ lookup_symtab (const char *name)
   register struct partial_symtab *ps;
   register struct objfile *objfile;
   char *real_path = NULL;
+  char *full_path = NULL;
 
   /* Here we are interested in canonicalizing an absolute path, not
      absolutizing a relative path.  */
   if (IS_ABSOLUTE_PATH (name))
-    real_path = gdb_realpath (name);
+    {
+      full_path = xfullpath (name);
+      make_cleanup (xfree, full_path);
+      real_path = gdb_realpath (name);
+      make_cleanup (xfree, real_path);
+    }
 
 got_symtab:
 
@@ -156,24 +187,32 @@ got_symtab:
   {
     if (FILENAME_CMP (name, s->filename) == 0)
       {
-       xfree (real_path);
        return s;
       }
+      
     /* 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)
+      {
+       const char *fp = symtab_to_filename (s);
+       if (FILENAME_CMP (full_path, fp) == 0)
+         {
+           return s;
+         }
+      }
+
     if (real_path != NULL)
       {
-       char *rp = symtab_to_filename (s);
+       char *rp = gdb_realpath (symtab_to_filename (s));
+        make_cleanup (xfree, rp);
        if (FILENAME_CMP (real_path, rp) == 0)
          {
-           xfree (real_path);
            return s;
          }
       }
   }
 
-  xfree (real_path);
-
   /* Now, search for a matching tail (only if name doesn't have any dirs) */
 
   if (lbasename (name) == name)
@@ -219,36 +258,55 @@ lookup_partial_symtab (const char *name)
 {
   register struct partial_symtab *pst;
   register struct objfile *objfile;
+  char *full_path = NULL;
   char *real_path = NULL;
 
   /* Here we are interested in canonicalizing an absolute path, not
      absolutizing a relative path.  */
   if (IS_ABSOLUTE_PATH (name))
-    real_path = gdb_realpath (name);
+    {
+      full_path = xfullpath (name);
+      make_cleanup (xfree, full_path);
+      real_path = gdb_realpath (name);
+      make_cleanup (xfree, real_path);
+    }
 
   ALL_PSYMTABS (objfile, pst)
   {
     if (FILENAME_CMP (name, pst->filename) == 0)
       {
-       xfree (real_path);
        return (pst);
       }
+
     /* If the user gave us an absolute path, try to find the file in
        this symtab and use its absolute path.  */
-    if (real_path != NULL)
+    if (full_path != NULL)
       {
        if (pst->fullname == NULL)
          source_full_path_of (pst->filename, &pst->fullname);
        if (pst->fullname != NULL
-           && FILENAME_CMP (real_path, pst->fullname) == 0)
+           && FILENAME_CMP (full_path, pst->fullname) == 0)
          {
-           xfree (real_path);
            return pst;
          }
       }
-  }
 
-  xfree (real_path);
+    if (real_path != NULL)
+      {
+        char *rp = NULL;
+       if (pst->fullname == NULL)
+         source_full_path_of (pst->filename, &pst->fullname);
+        if (pst->fullname != NULL)
+          {
+            rp = gdb_realpath (pst->fullname);
+            make_cleanup (xfree, rp);
+          }
+       if (rp != NULL && FILENAME_CMP (real_path, rp) == 0)
+         {
+           return pst;
+         }
+      }
+  }
 
   /* Now, search for a matching tail (only if name doesn't have any dirs) */
 
@@ -290,7 +348,10 @@ gdb_mangle_name (struct type *type, int method_id, int signature_id)
   char buf[20];
   int len = (newname == NULL ? 0 : strlen (newname));
 
-  if (is_operator_name (field_name))
+  /* Nothing to do if physname already contains a fully mangled v3 abi name
+     or an operator name.  */
+  if ((physname[0] == '_' && physname[1] == 'Z')
+      || is_operator_name (field_name))
     return xstrdup (physname);
 
   is_full_physname_constructor = is_constructor_name (physname);
@@ -344,6 +405,284 @@ gdb_mangle_name (struct type *type, int method_id, int signature_id)
   strcat (mangled_name, physname);
   return (mangled_name);
 }
+
+\f
+/* Initialize the language dependent portion of a symbol
+   depending upon the language for the symbol. */
+void
+symbol_init_language_specific (struct general_symbol_info *gsymbol,
+                              enum language language)
+{
+  gsymbol->language = language;
+  if (gsymbol->language == language_cplus
+      || gsymbol->language == language_java
+      || gsymbol->language == language_objc)
+    {
+      gsymbol->language_specific.cplus_specific.demangled_name = NULL;
+    }
+  else
+    {
+      memset (&gsymbol->language_specific, 0,
+             sizeof (gsymbol->language_specific));
+    }
+}
+
+/* Functions to initialize a symbol's mangled name.  */
+
+/* Create the hash table used for demangled names.  Each hash entry is
+   a pair of strings; one for the mangled name and one for the demangled
+   name.  The entry is hashed via just the mangled name.  */
+
+static void
+create_demangled_names_hash (struct objfile *objfile)
+{
+  /* Choose 256 as the starting size of the hash table, somewhat arbitrarily.
+     The hash table code will round this up to the next prime number. 
+     Choosing a much larger table size wastes memory, and saves only about
+     1% in symbol reading.  */
+
+  objfile->demangled_names_hash = htab_create_alloc_ex
+    (256, htab_hash_string, (int (*) (const void *, const void *)) streq,
+     NULL, objfile->md, xmcalloc, xmfree);
+}
+
+/* Try to determine the demangled name for a symbol, based on the
+   language of that symbol.  If the language is set to language_auto,
+   it will attempt to find any demangling algorithm that works and
+   then set the language appropriately.  The returned name is allocated
+   by the demangler and should be xfree'd.  */
+
+static char *
+symbol_find_demangled_name (struct general_symbol_info *gsymbol,
+                           const char *mangled)
+{
+  char *demangled = NULL;
+
+  if (gsymbol->language == language_unknown)
+    gsymbol->language = language_auto;
+
+  if (gsymbol->language == language_objc
+      || gsymbol->language == language_auto)
+    {
+      demangled =
+       objc_demangle (mangled, 0);
+      if (demangled != NULL)
+       {
+         gsymbol->language = language_objc;
+         return demangled;
+       }
+    }
+  if (gsymbol->language == language_cplus
+      || gsymbol->language == language_auto)
+    {
+      demangled =
+        cplus_demangle (mangled, DMGL_PARAMS | DMGL_ANSI);
+      if (demangled != NULL)
+       {
+         gsymbol->language = language_cplus;
+         return demangled;
+       }
+    }
+  if (gsymbol->language == language_java)
+    {
+      demangled =
+        cplus_demangle (mangled,
+                        DMGL_PARAMS | DMGL_ANSI | DMGL_JAVA);
+      if (demangled != NULL)
+       {
+         gsymbol->language = language_java;
+         return demangled;
+       }
+    }
+  return NULL;
+}
+
+/* Set both the mangled and demangled (if any) names for GSYMBOL based
+   on LINKAGE_NAME and LEN.  The hash table corresponding to OBJFILE
+   is used, and the memory comes from that objfile's symbol_obstack.
+   LINKAGE_NAME is copied, so the pointer can be discarded after
+   calling this function.  */
+
+/* We have to be careful when dealing with Java names: when we run
+   into a Java minimal symbol, we don't know it's a Java symbol, so it
+   gets demangled as a C++ name.  This is unfortunate, but there's not
+   much we can do about it: but when demangling partial symbols and
+   regular symbols, we'd better not reuse the wrong demangled name.
+   (See PR gdb/1039.)  We solve this by putting a distinctive prefix
+   on Java names when storing them in the hash table.  */
+
+/* FIXME: carlton/2003-03-13: This is an unfortunate situation.  I
+   don't mind the Java prefix so much: different languages have
+   different demangling requirements, so it's only natural that we
+   need to keep language data around in our demangling cache.  But
+   it's not good that the minimal symbol has the wrong demangled name.
+   Unfortunately, I can't think of any easy solution to that
+   problem.  */
+
+#define JAVA_PREFIX "##JAVA$$"
+#define JAVA_PREFIX_LEN 8
+
+void
+symbol_set_names (struct general_symbol_info *gsymbol,
+                 const char *linkage_name, int len, struct objfile *objfile)
+{
+  char **slot;
+  /* A 0-terminated copy of the linkage name.  */
+  const char *linkage_name_copy;
+  /* A copy of the linkage name that might have a special Java prefix
+     added to it, for use when looking names up in the hash table.  */
+  const char *lookup_name;
+  /* The length of lookup_name.  */
+  int lookup_len;
+
+  if (objfile->demangled_names_hash == NULL)
+    create_demangled_names_hash (objfile);
+
+  /* The stabs reader generally provides names that are not
+     NUL-terminated; most of the other readers don't do this, so we
+     can just use the given copy, unless we're in the Java case.  */
+  if (gsymbol->language == language_java)
+    {
+      char *alloc_name;
+      lookup_len = len + JAVA_PREFIX_LEN;
+
+      alloc_name = alloca (lookup_len + 1);
+      memcpy (alloc_name, JAVA_PREFIX, JAVA_PREFIX_LEN);
+      memcpy (alloc_name + JAVA_PREFIX_LEN, linkage_name, len);
+      alloc_name[lookup_len] = '\0';
+
+      lookup_name = alloc_name;
+      linkage_name_copy = alloc_name + JAVA_PREFIX_LEN;
+    }
+  else if (linkage_name[len] != '\0')
+    {
+      char *alloc_name;
+      lookup_len = len;
+
+      alloc_name = alloca (lookup_len + 1);
+      memcpy (alloc_name, linkage_name, len);
+      alloc_name[lookup_len] = '\0';
+
+      lookup_name = alloc_name;
+      linkage_name_copy = alloc_name;
+    }
+  else
+    {
+      lookup_len = len;
+      lookup_name = linkage_name;
+      linkage_name_copy = linkage_name;
+    }
+
+  slot = (char **) htab_find_slot (objfile->demangled_names_hash,
+                                  lookup_name, INSERT);
+
+  /* If this name is not in the hash table, add it.  */
+  if (*slot == NULL)
+    {
+      char *demangled_name = symbol_find_demangled_name (gsymbol,
+                                                        linkage_name_copy);
+      int demangled_len = demangled_name ? strlen (demangled_name) : 0;
+
+      /* If there is a demangled name, place it right after the mangled name.
+        Otherwise, just place a second zero byte after the end of the mangled
+        name.  */
+      *slot = obstack_alloc (&objfile->symbol_obstack,
+                            lookup_len + demangled_len + 2);
+      memcpy (*slot, lookup_name, lookup_len + 1);
+      if (demangled_name != NULL)
+       {
+         memcpy (*slot + lookup_len + 1, demangled_name, demangled_len + 1);
+         xfree (demangled_name);
+       }
+      else
+       (*slot)[lookup_len + 1] = '\0';
+    }
+
+  gsymbol->name = *slot + lookup_len - len;
+  if ((*slot)[lookup_len + 1] != '\0')
+    gsymbol->language_specific.cplus_specific.demangled_name
+      = &(*slot)[lookup_len + 1];
+  else
+    gsymbol->language_specific.cplus_specific.demangled_name = NULL;
+}
+
+/* Initialize the demangled name of GSYMBOL if possible.  Any required space
+   to store the name is obtained from the specified obstack.  The function
+   symbol_set_names, above, should be used instead where possible for more
+   efficient memory usage.  */
+
+void
+symbol_init_demangled_name (struct general_symbol_info *gsymbol,
+                            struct obstack *obstack)
+{
+  char *mangled = gsymbol->name;
+  char *demangled = NULL;
+
+  demangled = symbol_find_demangled_name (gsymbol, mangled);
+  if (gsymbol->language == language_cplus
+      || gsymbol->language == language_java
+      || gsymbol->language == language_objc)
+    {
+      if (demangled)
+       {
+         gsymbol->language_specific.cplus_specific.demangled_name
+           = obsavestring (demangled, strlen (demangled), obstack);
+         xfree (demangled);
+       }
+      else
+       gsymbol->language_specific.cplus_specific.demangled_name = NULL;
+    }
+  else
+    {
+      /* Unknown language; just clean up quietly.  */
+      if (demangled)
+       xfree (demangled);
+    }
+}
+
+/* Return the source code name of a symbol.  In languages where
+   demangling is necessary, this is the demangled name.  */
+
+char *
+symbol_natural_name (const struct general_symbol_info *gsymbol)
+{
+  if ((gsymbol->language == language_cplus
+       || gsymbol->language == language_java
+       || gsymbol->language == language_objc)
+      && (gsymbol->language_specific.cplus_specific.demangled_name != NULL))
+    {
+      return gsymbol->language_specific.cplus_specific.demangled_name;
+    }
+  else
+    {
+      return gsymbol->name;
+    }
+}
+
+/* Return the demangled name for a symbol based on the language for
+   that symbol.  If no demangled name exists, return NULL. */
+char *
+symbol_demangled_name (struct general_symbol_info *gsymbol)
+{
+  if (gsymbol->language == language_cplus
+      || gsymbol->language == language_java
+      || gsymbol->language == language_objc)
+    return gsymbol->language_specific.cplus_specific.demangled_name;
+
+  else 
+    return NULL;
+}
+
+/* Initialize the structure fields to zero values.  */
+void
+init_sal (struct symtab_and_line *sal)
+{
+  sal->symtab = 0;
+  sal->section = 0;
+  sal->line = 0;
+  sal->pc = 0;
+  sal->end = 0;
+}
 \f
 
 
@@ -354,12 +693,24 @@ find_pc_sect_psymtab (CORE_ADDR pc, asection *section)
 {
   register struct partial_symtab *pst;
   register struct objfile *objfile;
+  struct minimal_symbol *msymbol;
+
+  /* If we know that this is not a text address, return failure.  This is
+     necessary because we loop based on texthigh and textlow, which do
+     not include the data ranges.  */
+  msymbol = lookup_minimal_symbol_by_pc_section (pc, section);
+  if (msymbol
+      && (msymbol->type == mst_data
+         || msymbol->type == mst_bss
+         || msymbol->type == mst_abs
+         || msymbol->type == mst_file_data
+         || msymbol->type == mst_file_bss))
+    return NULL;
 
   ALL_PSYMTABS (objfile, pst)
   {
     if (pc >= pst->textlow && pc < pst->texthigh)
       {
-       struct minimal_symbol *msymbol;
        struct partial_symtab *tpst;
 
        /* An objfile that has its functions reordered might have
@@ -370,7 +721,6 @@ find_pc_sect_psymtab (CORE_ADDR pc, asection *section)
            section == 0)       /* can't validate section this way */
          return (pst);
 
-       msymbol = lookup_minimal_symbol_by_pc_section (pc, section);
        if (msymbol == NULL)
          return (pst);
 
@@ -429,7 +779,7 @@ find_pc_sect_psymbol (struct partial_symtab *psymtab, CORE_ADDR pc,
        pp++)
     {
       p = *pp;
-      if (SYMBOL_NAMESPACE (p) == VAR_NAMESPACE
+      if (SYMBOL_DOMAIN (p) == VAR_DOMAIN
          && SYMBOL_CLASS (p) == LOC_BLOCK
          && pc >= SYMBOL_VALUE_ADDRESS (p)
          && (SYMBOL_VALUE_ADDRESS (p) > best_pc
@@ -453,7 +803,7 @@ find_pc_sect_psymbol (struct partial_symtab *psymtab, CORE_ADDR pc,
        pp++)
     {
       p = *pp;
-      if (SYMBOL_NAMESPACE (p) == VAR_NAMESPACE
+      if (SYMBOL_DOMAIN (p) == VAR_DOMAIN
          && SYMBOL_CLASS (p) == LOC_BLOCK
          && pc >= SYMBOL_VALUE_ADDRESS (p)
          && (SYMBOL_VALUE_ADDRESS (p) > best_pc
@@ -528,7 +878,7 @@ fixup_psymbol_section (struct partial_symbol *psym, struct objfile *objfile)
 }
 
 /* Find the definition for a specified symbol name NAME
-   in namespace NAMESPACE, visible from lexical block BLOCK.
+   in domain DOMAIN, visible from lexical block BLOCK.
    Returns the struct symbol pointer, or zero if no symbol is found.
    If SYMTAB is non-NULL, store the symbol table in which the
    symbol was found there, or NULL if not found.
@@ -542,22 +892,38 @@ fixup_psymbol_section (struct partial_symbol *psym, struct objfile *objfile)
    attractive to put in some QUIT's (though I'm not really sure
    whether it can run long enough to be really important).  But there
    are a few calls for which it would appear to be bad news to quit
-   out of here: find_proc_desc in alpha-tdep.c and mips-tdep.c, and
-   nindy_frame_chain_valid in nindy-tdep.c.  (Note that there is C++
-   code below which can error(), but that probably doesn't affect
-   these calls since they are looking for a known variable and thus
-   can probably assume it will never hit the C++ code).  */
+   out of here: find_proc_desc in alpha-tdep.c and mips-tdep.c.  (Note
+   that there is C++ code below which can error(), but that probably
+   doesn't affect these calls since they are looking for a known
+   variable and thus can probably assume it will never hit the C++
+   code).  */
 
 struct symbol *
 lookup_symbol (const char *name, const struct block *block,
-              const namespace_enum namespace, int *is_a_field_of_this,
+              const domain_enum domain, int *is_a_field_of_this,
               struct symtab **symtab)
 {
-  char *modified_name = NULL;
-  char *modified_name2 = NULL;
+  char *demangled_name = NULL;
+  const char *modified_name = NULL;
+  const char *mangled_name = NULL;
   int needtofreename = 0;
   struct symbol *returnval;
 
+  modified_name = name;
+
+  /* If we are using C++ language, demangle the name before doing a lookup, so
+     we can always binary search. */
+  if (current_language->la_language == language_cplus)
+    {
+      demangled_name = cplus_demangle (name, DMGL_ANSI | DMGL_PARAMS);
+      if (demangled_name)
+       {
+         mangled_name = name;
+         modified_name = demangled_name;
+         needtofreename = 1;
+       }
+    }
+
   if (case_sensitivity == case_sensitive_off)
     {
       char *copy;
@@ -570,76 +936,40 @@ lookup_symbol (const char *name, const struct block *block,
       copy[len] = 0;
       modified_name = copy;
     }
-  else 
-      modified_name = (char *) name;
-
-  /* If we are using C++ language, demangle the name before doing a lookup, so
-     we can always binary search. */
-  if (current_language->la_language == language_cplus)
-    {
-      modified_name2 = cplus_demangle (modified_name, DMGL_ANSI | DMGL_PARAMS);
-      if (modified_name2)
-       {
-         modified_name = modified_name2;
-         needtofreename = 1;
-       }
-    }
 
-  returnval = lookup_symbol_aux (modified_name, block, namespace,
-                                is_a_field_of_this, symtab);
+  returnval = lookup_symbol_aux (modified_name, mangled_name, block,
+                                domain, is_a_field_of_this, symtab);
   if (needtofreename)
-    xfree (modified_name2);
+    xfree (demangled_name);
 
   return returnval;     
 }
 
 static struct symbol *
-lookup_symbol_aux (const char *name, const struct block *block,
-              const namespace_enum namespace, int *is_a_field_of_this,
-              struct symtab **symtab)
+lookup_symbol_aux (const char *name, const char *mangled_name,
+                  const struct block *block, const domain_enum domain,
+                  int *is_a_field_of_this, struct symtab **symtab)
 {
-  register struct symbol *sym;
-  register struct symtab *s = NULL;
-  register struct partial_symtab *ps;
-  register struct blockvector *bv;
-  register struct objfile *objfile = NULL;
-  register struct block *b;
-  register struct minimal_symbol *msymbol;
-
+  struct symbol *sym;
+  const struct block *static_block;
 
-  /* Search specified block and its superiors.  */
+  /* Search specified block and its superiors.  Don't search
+     STATIC_BLOCK or GLOBAL_BLOCK.  */
 
-  while (block != 0)
-    {
-      sym = lookup_block_symbol (block, name, namespace);
-      if (sym)
-       {
-         block_found = block;
-         if (symtab != NULL)
-           {
-             /* Search the list of symtabs for one which contains the
-                address of the start of this block.  */
-             ALL_SYMTABS (objfile, s)
-             {
-               bv = BLOCKVECTOR (s);
-               b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
-               if (BLOCK_START (b) <= BLOCK_START (block)
-                   && BLOCK_END (b) > BLOCK_START (block))
-                 goto found;
-             }
-           found:
-             *symtab = s;
-           }
+  sym = lookup_symbol_aux_local (name, mangled_name, block, domain,
+                                symtab, &static_block);
+  if (sym != NULL)
+    return sym;
 
-         return fixup_symbol_section (sym, objfile);
-       }
-      block = BLOCK_SUPERBLOCK (block);
-    }
+#if 0
+  /* NOTE: carlton/2002-11-05: At the time that this code was
+     #ifdeffed out, the value of 'block' was always NULL at this
+     point, hence the bemused comments below.  */
 
   /* FIXME: this code is never executed--block is always NULL at this
      point.  What is it trying to do, anyway?  We already should have
      checked the STATIC_BLOCK above (it is the superblock of top-level
-     blocks).  Why is VAR_NAMESPACE special-cased?  */
+     blocks).  Why is VAR_DOMAIN special-cased?  */
   /* Don't need to mess with the psymtabs; if we have a block,
      that file is read in.  If we don't, then we deal later with
      all the psymtab stuff that needs checking.  */
@@ -653,7 +983,7 @@ lookup_symbol_aux (const char *name, const struct block *block,
    * code to find any 'sym''s that were not found above. I vote for 
    * deleting the following paragraph of code.
    */
-  if (namespace == VAR_NAMESPACE && block != NULL)
+  if (domain == VAR_DOMAIN && block != NULL)
     {
       struct block *b;
       /* Find the right symtab.  */
@@ -664,7 +994,7 @@ lookup_symbol_aux (const char *name, const struct block *block,
        if (BLOCK_START (b) <= BLOCK_START (block)
            && BLOCK_END (b) > BLOCK_START (block))
          {
-           sym = lookup_block_symbol (b, name, VAR_NAMESPACE);
+           sym = lookup_block_symbol (b, name, mangled_name, VAR_DOMAIN);
            if (sym)
              {
                block_found = b;
@@ -675,9 +1005,9 @@ lookup_symbol_aux (const char *name, const struct block *block,
          }
       }
     }
+#endif /* 0 */
 
-
-  /* C++: If requested to do so by the caller, 
+  /* C++/Java/Objective-C: If requested to do so by the caller, 
      check to see if NAME is a field of `this'. */
   if (is_a_field_of_this)
     {
@@ -693,24 +1023,47 @@ lookup_symbol_aux (const char *name, const struct block *block,
        }
     }
 
+  /* If there's a static block to search, search it next.  */
+
+  /* NOTE: carlton/2002-12-05: There is a question as to whether or
+     not it would be appropriate to search the current global block
+     here as well.  (That's what this code used to do before the
+     is_a_field_of_this check was moved up.)  On the one hand, it's
+     redundant with the lookup_symbol_aux_symtabs search that happens
+     next.  On the other hand, if decode_line_1 is passed an argument
+     like filename:var, then the user presumably wants 'var' to be
+     searched for in filename.  On the third hand, there shouldn't be
+     multiple global variables all of which are named 'var', and it's
+     not like decode_line_1 has ever restricted its search to only
+     global variables in a single filename.  All in all, only
+     searching the static block here seems best: it's correct and it's
+     cleanest.  */
+
+  /* NOTE: carlton/2002-12-05: There's also a possible performance
+     issue here: if you usually search for global symbols in the
+     current file, then it would be slightly better to search the
+     current global block before searching all the symtabs.  But there
+     are other factors that have a much greater effect on performance
+     than that one, so I don't think we should worry about that for
+     now.  */
+
+  if (static_block != NULL)
+    {
+      sym = lookup_symbol_aux_block (name, mangled_name, static_block,
+                                    domain, symtab);
+      if (sym != NULL)
+       return sym;
+    }
+
   /* Now search all global blocks.  Do the symtab's first, then
      check the psymtab's. If a psymtab indicates the existence
      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)
-  {
-    bv = BLOCKVECTOR (s);
-    block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
-    sym = lookup_block_symbol (block, name, namespace);
-    if (sym)
-      {
-       block_found = block;
-       if (symtab != NULL)
-         *symtab = s;
-       return fixup_symbol_section (sym, objfile);
-      }
-  }
+  sym = lookup_symbol_aux_symtabs (GLOBAL_BLOCK, name, mangled_name,
+                                  domain, symtab);
+  if (sym != NULL)
+    return sym;
 
 #ifndef HPUXHPPA
 
@@ -718,104 +1071,167 @@ lookup_symbol_aux (const char *name, const struct block *block,
      a mangled variable that is stored in one of the minimal symbol tables.
      Eventually, all global symbols might be resolved in this way.  */
 
-  if (namespace == VAR_NAMESPACE)
+  sym = lookup_symbol_aux_minsyms (name, mangled_name,
+                                  domain, is_a_field_of_this,
+                                  symtab);
+  
+  if (sym != NULL)
+    return sym;
+
+#endif
+
+  sym = lookup_symbol_aux_psymtabs (GLOBAL_BLOCK, name, mangled_name,
+                                   domain, symtab);
+  if (sym != NULL)
+    return sym;
+
+  /* Now search all static file-level symbols.  Not strictly correct,
+     but more useful than an error.  Do the symtabs first, then check
+     the psymtabs.  If a psymtab indicates the existence of the
+     desired name as a file-level static, then do psymtab-to-symtab
+     conversion on the fly and return the found symbol. */
+
+  sym = lookup_symbol_aux_symtabs (STATIC_BLOCK, name, mangled_name,
+                                  domain, symtab);
+  if (sym != NULL)
+    return sym;
+  
+  sym = lookup_symbol_aux_psymtabs (STATIC_BLOCK, name, mangled_name,
+                                   domain, symtab);
+  if (sym != NULL)
+    return sym;
+
+#ifdef HPUXHPPA
+
+  /* Check for the possibility of the symbol being a function or
+     a global variable that is stored in one of the minimal symbol tables.
+     The "minimal symbol table" is built from linker-supplied info.
+
+     RT: I moved this check to last, after the complete search of
+     the global (p)symtab's and static (p)symtab's. For HP-generated
+     symbol tables, this check was causing a premature exit from
+     lookup_symbol with NULL return, and thus messing up symbol lookups
+     of things like "c::f". It seems to me a check of the minimal
+     symbol table ought to be a last resort in any case. I'm vaguely
+     worried about the comment below which talks about FORTRAN routines "foo_"
+     though... is it saying we need to do the "minsym" check before
+     the static check in this case? 
+   */
+
+
+  sym = lookup_symbol_aux_minsyms (name, mangled_name,
+                                  domain, is_a_field_of_this,
+                                  symtab);
+  
+  if (sym != NULL)
+    return sym;
+
+#endif
+
+  if (symtab != NULL)
+    *symtab = NULL;
+  return NULL;
+}
+
+/* Check to see if the symbol is defined in BLOCK or its superiors.
+   Don't search STATIC_BLOCK or GLOBAL_BLOCK.  If we don't find a
+   match, store the address of STATIC_BLOCK in static_block.  */
+
+static struct symbol *
+lookup_symbol_aux_local (const char *name, const char *mangled_name,
+                        const struct block *block,
+                        const domain_enum domain,
+                        struct symtab **symtab,
+                        const struct block **static_block)
+{
+  struct symbol *sym;
+  
+  /* Check if either no block is specified or it's a global block.  */
+
+  if (block == NULL || BLOCK_SUPERBLOCK (block) == NULL)
     {
-      msymbol = lookup_minimal_symbol (name, NULL, NULL);
-      if (msymbol != NULL)
-       {
-         s = find_pc_sect_symtab (SYMBOL_VALUE_ADDRESS (msymbol),
-                                  SYMBOL_BFD_SECTION (msymbol));
-         if (s != NULL)
-           {
-             /* This is a function which has a symtab for its address.  */
-             bv = BLOCKVECTOR (s);
-             block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
-             sym = lookup_block_symbol (block, SYMBOL_NAME (msymbol),
-                                        namespace);
-             /* We kept static functions in minimal symbol table as well as
-                in static scope. We want to find them in the symbol table. */
-             if (!sym)
-               {
-                 block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
-                 sym = lookup_block_symbol (block, SYMBOL_NAME (msymbol),
-                                            namespace);
-               }
+      *static_block = NULL;
+      return NULL;
+    }
 
-             /* sym == 0 if symbol was found in the minimal symbol table
-                but not in the symtab.
-                Return 0 to use the msymbol definition of "foo_".
+  while (BLOCK_SUPERBLOCK (BLOCK_SUPERBLOCK (block)) != NULL)
+    {
+      sym = lookup_symbol_aux_block (name, mangled_name, block, domain,
+                                    symtab);
+      if (sym != NULL)
+       return sym;
+      block = BLOCK_SUPERBLOCK (block);
+    }
 
-                This happens for Fortran  "foo_" symbols,
-                which are "foo" in the symtab.
+  /* We've reached the static block.  */
 
-                This can also happen if "asm" is used to make a
-                regular symbol but not a debugging symbol, e.g.
-                asm(".globl _main");
-                asm("_main:");
-              */
+  *static_block = block;
+  return NULL;
+}
 
-             if (symtab != NULL)
-               *symtab = s;
-             return fixup_symbol_section (sym, objfile);
-           }
-         else if (MSYMBOL_TYPE (msymbol) != mst_text
-                  && MSYMBOL_TYPE (msymbol) != mst_file_text
-                  && !STREQ (name, SYMBOL_NAME (msymbol)))
+/* Look up a symbol in a block; if found, locate its symtab, fixup the
+   symbol, and set block_found appropriately.  */
+
+static struct symbol *
+lookup_symbol_aux_block (const char *name, const char *mangled_name,
+                        const struct block *block,
+                        const domain_enum domain,
+                        struct symtab **symtab)
+{
+  struct symbol *sym;
+  struct objfile *objfile = NULL;
+  struct blockvector *bv;
+  struct block *b;
+  struct symtab *s = NULL;
+
+  sym = lookup_block_symbol (block, name, mangled_name, domain);
+  if (sym)
+    {
+      block_found = block;
+      if (symtab != NULL)
+       {
+         /* Search the list of symtabs for one which contains the
+            address of the start of this block.  */
+         ALL_SYMTABS (objfile, s)
            {
-             /* This is a mangled variable, look it up by its
-                mangled name.  */
-             return lookup_symbol_aux (SYMBOL_NAME (msymbol), block,
-                                       namespace, is_a_field_of_this, symtab);
+             bv = BLOCKVECTOR (s);
+             b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
+             if (BLOCK_START (b) <= BLOCK_START (block)
+                 && BLOCK_END (b) > BLOCK_START (block))
+               goto found;
            }
-         /* There are no debug symbols for this file, or we are looking
-            for an unmangled variable.
-            Try to find a matching static symbol below. */
+       found:
+         *symtab = s;
        }
+      
+      return fixup_symbol_section (sym, objfile);
     }
 
-#endif
+  return NULL;
+}
 
-  ALL_PSYMTABS (objfile, ps)
-  {
-    if (!ps->readin && lookup_partial_symbol (ps, name, 1, namespace))
-      {
-       s = PSYMTAB_TO_SYMTAB (ps);
-       bv = BLOCKVECTOR (s);
-       block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
-       sym = lookup_block_symbol (block, name, namespace);
-       if (!sym)
-         {
-           /* This shouldn't be necessary, but as a last resort
-            * try looking in the statics even though the psymtab
-            * claimed the symbol was global. It's possible that
-            * the psymtab gets it wrong in some cases.
-            */
-           block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
-           sym = lookup_block_symbol (block, name, namespace);
-           if (!sym)
-             error ("Internal: global symbol `%s' found in %s psymtab but not in symtab.\n\
-%s may be an inlined function, or may be a template function\n\
-(if a template, try specifying an instantiation: %s<type>).",
-                    name, ps->filename, name, name);
-         }
-       if (symtab != NULL)
-         *symtab = s;
-       return fixup_symbol_section (sym, objfile);
-      }
-  }
+/* Check to see if the symbol is defined in one of the symtabs.
+   BLOCK_INDEX should be either GLOBAL_BLOCK or STATIC_BLOCK,
+   depending on whether or not we want to search global symbols or
+   static symbols.  */
 
-  /* Now search all static file-level symbols.
-     Not strictly correct, but more useful than an error.
-     Do the symtabs first, then check the psymtabs.
-     If a psymtab indicates the existence
-     of the desired name as a file-level static, then do psymtab-to-symtab
-     conversion on the fly and return the found symbol. */
+static struct symbol *
+lookup_symbol_aux_symtabs (int block_index,
+                          const char *name, const char *mangled_name,
+                          const domain_enum domain,
+                          struct symtab **symtab)
+{
+  struct symbol *sym;
+  struct objfile *objfile;
+  struct blockvector *bv;
+  const struct block *block;
+  struct symtab *s;
 
   ALL_SYMTABS (objfile, s)
   {
     bv = BLOCKVECTOR (s);
-    block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
-    sym = lookup_block_symbol (block, name, namespace);
+    block = BLOCKVECTOR_BLOCK (bv, block_index);
+    sym = lookup_block_symbol (block, name, mangled_name, domain);
     if (sym)
       {
        block_found = block;
@@ -825,27 +1241,58 @@ lookup_symbol_aux (const char *name, const struct block *block,
       }
   }
 
+  return NULL;
+}
+
+/* Check to see if the symbol is defined in one of the partial
+   symtabs.  BLOCK_INDEX should be either GLOBAL_BLOCK or
+   STATIC_BLOCK, depending on whether or not we want to search global
+   symbols or static symbols.  */
+
+static struct symbol *
+lookup_symbol_aux_psymtabs (int block_index, const char *name,
+                           const char *mangled_name,
+                           const domain_enum domain,
+                           struct symtab **symtab)
+{
+  struct symbol *sym;
+  struct objfile *objfile;
+  struct blockvector *bv;
+  const struct block *block;
+  struct partial_symtab *ps;
+  struct symtab *s;
+  const int psymtab_index = (block_index == GLOBAL_BLOCK ? 1 : 0);
+
   ALL_PSYMTABS (objfile, ps)
   {
-    if (!ps->readin && lookup_partial_symbol (ps, name, 0, namespace))
+    if (!ps->readin
+       && lookup_partial_symbol (ps, name, mangled_name,
+                                 psymtab_index, domain))
       {
        s = PSYMTAB_TO_SYMTAB (ps);
        bv = BLOCKVECTOR (s);
-       block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
-       sym = lookup_block_symbol (block, name, namespace);
+       block = BLOCKVECTOR_BLOCK (bv, block_index);
+       sym = lookup_block_symbol (block, name, mangled_name, domain);
        if (!sym)
          {
-           /* This shouldn't be necessary, but as a last resort
-            * try looking in the globals even though the psymtab
-            * claimed the symbol was static. It's possible that
-            * the psymtab gets it wrong in some cases.
-            */
-           block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
-           sym = lookup_block_symbol (block, name, namespace);
+           /* This shouldn't be necessary, but as a last resort try
+              looking in the statics even though the psymtab claimed
+              the symbol was global, or vice-versa. It's possible
+              that the psymtab gets it wrong in some cases.  */
+
+           /* FIXME: carlton/2002-09-30: Should we really do that?
+              If that happens, isn't it likely to be a GDB error, in
+              which case we should fix the GDB error rather than
+              silently dealing with it here?  So I'd vote for
+              removing the check for the symbol in the other
+              block.  */
+           block = BLOCKVECTOR_BLOCK (bv,
+                                      block_index == GLOBAL_BLOCK ?
+                                      STATIC_BLOCK : GLOBAL_BLOCK);
+           sym = lookup_block_symbol (block, name, mangled_name, domain);
            if (!sym)
-             error ("Internal: static symbol `%s' found in %s psymtab but not in symtab.\n\
-%s may be an inlined function, or may be a template function\n\
-(if a template, try specifying an instantiation: %s<type>).",
+             error ("Internal: %s symbol `%s' found in %s psymtab but not in symtab.\n%s may be an inlined function, or may be a template function\n(if a template, try specifying an instantiation: %s<type>).",
+                    block_index == GLOBAL_BLOCK ? "global" : "static",
                     name, ps->filename, name, name);
          }
        if (symtab != NULL)
@@ -854,67 +1301,100 @@ lookup_symbol_aux (const char *name, const struct block *block,
       }
   }
 
-#ifdef HPUXHPPA
+  return NULL;
+}
 
-  /* Check for the possibility of the symbol being a function or
-     a global variable that is stored in one of the minimal symbol tables.
-     The "minimal symbol table" is built from linker-supplied info.
+/* Check for the possibility of the symbol being a function or a
+   mangled variable that is stored in one of the minimal symbol
+   tables.  Eventually, all global symbols might be resolved in this
+   way.  */
 
-     RT: I moved this check to last, after the complete search of
-     the global (p)symtab's and static (p)symtab's. For HP-generated
-     symbol tables, this check was causing a premature exit from
-     lookup_symbol with NULL return, and thus messing up symbol lookups
-     of things like "c::f". It seems to me a check of the minimal
-     symbol table ought to be a last resort in any case. I'm vaguely
-     worried about the comment below which talks about FORTRAN routines "foo_"
-     though... is it saying we need to do the "minsym" check before
-     the static check in this case? 
-   */
+/* NOTE: carlton/2002-12-05: At one point, this function was part of
+   lookup_symbol_aux, and what are now 'return' statements within
+   lookup_symbol_aux_minsyms returned from lookup_symbol_aux, even if
+   sym was NULL.  As far as I can tell, this was basically accidental;
+   it didn't happen every time that msymbol was non-NULL, but only if
+   some additional conditions held as well, and it caused problems
+   with HP-generated symbol tables.  */
+
+static struct symbol *
+lookup_symbol_aux_minsyms (const char *name,
+                          const char *mangled_name,
+                          const domain_enum domain,
+                          int *is_a_field_of_this,
+                          struct symtab **symtab)
+{
+  struct symbol *sym;
+  struct blockvector *bv;
+  const struct block *block;
+  struct minimal_symbol *msymbol;
+  struct symtab *s;
 
-  if (namespace == VAR_NAMESPACE)
+  if (domain == VAR_DOMAIN)
     {
       msymbol = lookup_minimal_symbol (name, NULL, NULL);
+
       if (msymbol != NULL)
        {
-         /* OK, we found a minimal symbol in spite of not
-          * finding any symbol. There are various possible
-          * explanations for this. One possibility is the symbol
-          * exists in code not compiled -g. Another possibility
-          * is that the 'psymtab' isn't doing its job.
-          * A third possibility, related to #2, is that we were confused 
-          * by name-mangling. For instance, maybe the psymtab isn't
-          * doing its job because it only know about demangled
-          * names, but we were given a mangled name...
-          */
-
-         /* We first use the address in the msymbol to try to
-          * locate the appropriate symtab. Note that find_pc_symtab()
-          * has a side-effect of doing psymtab-to-symtab expansion,
-          * for the found symtab.
-          */
-         s = find_pc_symtab (SYMBOL_VALUE_ADDRESS (msymbol));
+         /* OK, we found a minimal symbol in spite of not finding any
+            symbol. There are various possible explanations for
+            this. One possibility is the symbol exists in code not
+            compiled -g. Another possibility is that the 'psymtab'
+            isn't doing its job.  A third possibility, related to #2,
+            is that we were confused by name-mangling. For instance,
+            maybe the psymtab isn't doing its job because it only
+            know about demangled names, but we were given a mangled
+            name...  */
+
+         /* We first use the address in the msymbol to try to locate
+            the appropriate symtab. Note that find_pc_sect_symtab()
+            has a side-effect of doing psymtab-to-symtab expansion,
+            for the found symtab.  */
+         s = find_pc_sect_symtab (SYMBOL_VALUE_ADDRESS (msymbol),
+                                  SYMBOL_BFD_SECTION (msymbol));
          if (s != NULL)
            {
+             /* This is a function which has a symtab for its address.  */
              bv = BLOCKVECTOR (s);
              block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
-             sym = lookup_block_symbol (block, SYMBOL_NAME (msymbol),
-                                        namespace);
+
+             /* This call used to pass `DEPRECATED_SYMBOL_NAME (msymbol)' as the
+                `name' argument to lookup_block_symbol.  But the name
+                of a minimal symbol is always mangled, so that seems
+                to be clearly the wrong thing to pass as the
+                unmangled name.  */
+             sym =
+               lookup_block_symbol (block, name, mangled_name, domain);
              /* We kept static functions in minimal symbol table as well as
                 in static scope. We want to find them in the symbol table. */
              if (!sym)
                {
                  block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
-                 sym = lookup_block_symbol (block, SYMBOL_NAME (msymbol),
-                                            namespace);
-               }
-             /* If we found one, return it */
-             if (sym)
-               {
-                 if (symtab != NULL)
-                   *symtab = s;
-                 return sym;
+                 sym = lookup_block_symbol (block, name,
+                                            mangled_name, domain);
                }
 
+             /* NOTE: carlton/2002-12-04: The following comment was
+                taken from a time when two versions of this function
+                were part of the body of lookup_symbol_aux: this
+                comment was taken from the version of the function
+                that was #ifdef HPUXHPPA, and the comment was right
+                before the 'return NULL' part of lookup_symbol_aux.
+                (Hence the "Fall through and return 0" comment.)
+                Elena did some digging into the situation for
+                Fortran, and she reports:
+
+                "I asked around (thanks to Jeff Knaggs), and I think
+                the story for Fortran goes like this:
+
+                "Apparently, in older Fortrans, '_' was not part of
+                the user namespace.  g77 attached a final '_' to
+                procedure names as the exported symbols for linkage
+                (foo_) , but the symbols went in the debug info just
+                like 'foo'. The rationale behind this is not
+                completely clear, and maybe it was done to other
+                symbols as well, not just procedures."  */
+
              /* If we get here with sym == 0, the symbol was 
                 found in the minimal symbol table
                 but not in the symtab.
@@ -932,39 +1412,40 @@ lookup_symbol_aux (const char *name, const struct block *block,
                 asm(".globl _main");
                 asm("_main:");
               */
-           }
 
-         /* If the lookup-by-address fails, try repeating the
-          * entire lookup process with the symbol name from
-          * the msymbol (if different from the original symbol name).
-          */
+             if (symtab != NULL && sym != NULL)
+               *symtab = s;
+             return fixup_symbol_section (sym, s->objfile);
+           }
          else if (MSYMBOL_TYPE (msymbol) != mst_text
                   && MSYMBOL_TYPE (msymbol) != mst_file_text
-                  && !STREQ (name, SYMBOL_NAME (msymbol)))
+                  && !STREQ (name, DEPRECATED_SYMBOL_NAME (msymbol)))
            {
-             return lookup_symbol_aux (SYMBOL_NAME (msymbol), block,
-                                       namespace, is_a_field_of_this, symtab);
+             /* This is a mangled variable, look it up by its
+                mangled name.  */
+             return lookup_symbol_aux (DEPRECATED_SYMBOL_NAME (msymbol), mangled_name,
+                                       NULL, domain, is_a_field_of_this,
+                                       symtab);
            }
        }
     }
 
-#endif
-
-  if (symtab != NULL)
-    *symtab = NULL;
-  return 0;
+  return NULL;
 }
-                                                               
-/* Look, in partial_symtab PST, for symbol NAME.  Check the global
-   symbols if GLOBAL, the static symbols if not */
+
+/* Look, in partial_symtab PST, for symbol whose natural name is NAME.
+   If LINKAGE_NAME is non-NULL, check in addition that the symbol's
+   linkage name matches it.  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, int global,
-                      namespace_enum namespace)
+lookup_partial_symbol (struct partial_symtab *pst, const char *name,
+                      const char *linkage_name, int global,
+                      domain_enum domain)
 {
   struct partial_symbol *temp;
   struct partial_symbol **start, **psym;
-  struct partial_symbol **top, **bottom, **center;
+  struct partial_symbol **top, **real_top, **bottom, **center;
   int length = (global ? pst->n_global_syms : pst->n_static_syms);
   int do_linear_search = 1;
   
@@ -981,12 +1462,14 @@ lookup_partial_symbol (struct partial_symtab *pst, const char *name, int global,
       do_linear_search = 0;
 
       /* Binary search.  This search is guaranteed to end with center
-         pointing at the earliest partial symbol with the correct
-         name.  At that point *all* partial symbols with that name
-         will be checked against the correct namespace. */
+         pointing at the earliest partial symbol whose name might be
+         correct.  At that point *all* partial symbols with an
+         appropriate name will be checked against the correct
+         domain.  */
 
       bottom = start;
       top = start + length - 1;
+      real_top = top;
       while (top > bottom)
        {
          center = bottom + (top - bottom) / 2;
@@ -997,7 +1480,7 @@ lookup_partial_symbol (struct partial_symtab *pst, const char *name, int global,
            {
              do_linear_search = 1;
            }
-         if (strcmp (SYMBOL_SOURCE_NAME (*center), name) >= 0)
+         if (strcmp_iw_ordered (SYMBOL_NATURAL_NAME (*center), name) >= 0)
            {
              top = center;
            }
@@ -1009,12 +1492,12 @@ lookup_partial_symbol (struct partial_symtab *pst, const char *name, int global,
       if (!(top == bottom))
        internal_error (__FILE__, __LINE__, "failed internal consistency check");
 
-      /* djb - 2000-06-03 - Use SYMBOL_MATCHES_NAME, not a strcmp, so
-        we don't have to force a linear search on C++. Probably holds true
-        for JAVA as well, no way to check.*/
-      while (SYMBOL_MATCHES_NAME (*top,name))
+      while (top <= real_top
+            && (linkage_name != NULL
+                ? strcmp (SYMBOL_LINKAGE_NAME (*top), linkage_name) == 0
+                : SYMBOL_MATCHES_NATURAL_NAME (*top,name)))
        {
-         if (SYMBOL_NAMESPACE (*top) == namespace)
+         if (SYMBOL_DOMAIN (*top) == domain)
            {
                  return (*top);
            }
@@ -1029,9 +1512,11 @@ lookup_partial_symbol (struct partial_symtab *pst, const char *name, int global,
     {                  
       for (psym = start; psym < start + length; psym++)
        {
-         if (namespace == SYMBOL_NAMESPACE (*psym))
+         if (domain == SYMBOL_DOMAIN (*psym))
            {
-             if (SYMBOL_MATCHES_NAME (*psym, name))
+             if (linkage_name != NULL
+                 ? strcmp (SYMBOL_LINKAGE_NAME (*psym), linkage_name) == 0
+                 : SYMBOL_MATCHES_NATURAL_NAME (*psym, name))
                {
                  return (*psym);
                }
@@ -1042,12 +1527,12 @@ lookup_partial_symbol (struct partial_symtab *pst, const char *name, int global,
   return (NULL);
 }
 
-/* Look up a type named NAME in the struct_namespace.  The type returned
+/* Look up a type named NAME in the struct_domain.  The type returned
    must not be opaque -- i.e., must have at least one field defined
 
    This code was modelled on lookup_symbol -- the parts not relevant to looking
    up types were just left out.  In particular it's assumed here that types
-   are available in struct_namespace and only at file-static or global blocks. */
+   are available in struct_domain and only at file-static or global blocks. */
 
 
 struct type *
@@ -1069,7 +1554,7 @@ lookup_transparent_type (const char *name)
   {
     bv = BLOCKVECTOR (s);
     block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
-    sym = lookup_block_symbol (block, name, STRUCT_NAMESPACE);
+    sym = lookup_block_symbol (block, name, NULL, STRUCT_DOMAIN);
     if (sym && !TYPE_IS_OPAQUE (SYMBOL_TYPE (sym)))
       {
        return SYMBOL_TYPE (sym);
@@ -1078,12 +1563,13 @@ lookup_transparent_type (const char *name)
 
   ALL_PSYMTABS (objfile, ps)
   {
-    if (!ps->readin && lookup_partial_symbol (ps, name, 1, STRUCT_NAMESPACE))
+    if (!ps->readin && lookup_partial_symbol (ps, name, NULL,
+                                             1, STRUCT_DOMAIN))
       {
        s = PSYMTAB_TO_SYMTAB (ps);
        bv = BLOCKVECTOR (s);
        block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
-       sym = lookup_block_symbol (block, name, STRUCT_NAMESPACE);
+       sym = lookup_block_symbol (block, name, NULL, STRUCT_DOMAIN);
        if (!sym)
          {
            /* This shouldn't be necessary, but as a last resort
@@ -1092,7 +1578,7 @@ lookup_transparent_type (const char *name)
             * the psymtab gets it wrong in some cases.
             */
            block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
-           sym = lookup_block_symbol (block, name, STRUCT_NAMESPACE);
+           sym = lookup_block_symbol (block, name, NULL, STRUCT_DOMAIN);
            if (!sym)
              error ("Internal: global symbol `%s' found in %s psymtab but not in symtab.\n\
 %s may be an inlined function, or may be a template function\n\
@@ -1116,7 +1602,7 @@ lookup_transparent_type (const char *name)
   {
     bv = BLOCKVECTOR (s);
     block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
-    sym = lookup_block_symbol (block, name, STRUCT_NAMESPACE);
+    sym = lookup_block_symbol (block, name, NULL, STRUCT_DOMAIN);
     if (sym && !TYPE_IS_OPAQUE (SYMBOL_TYPE (sym)))
       {
        return SYMBOL_TYPE (sym);
@@ -1125,12 +1611,12 @@ lookup_transparent_type (const char *name)
 
   ALL_PSYMTABS (objfile, ps)
   {
-    if (!ps->readin && lookup_partial_symbol (ps, name, 0, STRUCT_NAMESPACE))
+    if (!ps->readin && lookup_partial_symbol (ps, name, NULL, 0, STRUCT_DOMAIN))
       {
        s = PSYMTAB_TO_SYMTAB (ps);
        bv = BLOCKVECTOR (s);
        block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
-       sym = lookup_block_symbol (block, name, STRUCT_NAMESPACE);
+       sym = lookup_block_symbol (block, name, NULL, STRUCT_DOMAIN);
        if (!sym)
          {
            /* This shouldn't be necessary, but as a last resort
@@ -1139,7 +1625,7 @@ lookup_transparent_type (const char *name)
             * the psymtab gets it wrong in some cases.
             */
            block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
-           sym = lookup_block_symbol (block, name, STRUCT_NAMESPACE);
+           sym = lookup_block_symbol (block, name, NULL, STRUCT_DOMAIN);
            if (!sym)
              error ("Internal: static symbol `%s' found in %s psymtab but not in symtab.\n\
 %s may be an inlined function, or may be a template function\n\
@@ -1166,7 +1652,7 @@ find_main_psymtab (void)
 
   ALL_PSYMTABS (objfile, pst)
   {
-    if (lookup_partial_symbol (pst, main_name (), 1, VAR_NAMESPACE))
+    if (lookup_partial_symbol (pst, main_name (), NULL, 1, VAR_DOMAIN))
       {
        return (pst);
       }
@@ -1174,26 +1660,47 @@ find_main_psymtab (void)
   return (NULL);
 }
 
-/* Search BLOCK for symbol NAME in NAMESPACE.
+/* Search BLOCK for symbol NAME in DOMAIN.
 
    Note that if NAME is the demangled form of a C++ symbol, we will fail
    to find a match during the binary search of the non-encoded names, but
    for now we don't worry about the slight inefficiency of looking for
    a match we'll never find, since it will go pretty quick.  Once the
    binary search terminates, we drop through and do a straight linear
-   search on the symbols.  Each symbol which is marked as being a C++
-   symbol (language_cplus set) has both the encoded and non-encoded names
-   tested for a match. */
+   search on the symbols.  Each symbol which is marked as being a ObjC/C++
+   symbol (language_cplus or language_objc set) has both the encoded and 
+   non-encoded names tested for a match.
+
+   If MANGLED_NAME is non-NULL, verify that any symbol we find has this
+   particular mangled name.
+*/
 
 struct symbol *
 lookup_block_symbol (register const struct block *block, const char *name,
-                    const namespace_enum namespace)
+                    const char *mangled_name,
+                    const domain_enum domain)
 {
   register int bot, top, inc;
   register struct symbol *sym;
   register struct symbol *sym_found = NULL;
   register int do_linear_search = 1;
 
+  if (BLOCK_HASHTABLE (block))
+    {
+      unsigned int hash_index;
+      hash_index = msymbol_hash_iw (name);
+      hash_index = hash_index % BLOCK_BUCKETS (block);
+      for (sym = BLOCK_BUCKET (block, hash_index); sym; sym = sym->hash_next)
+       {
+         if (SYMBOL_DOMAIN (sym) == domain 
+             && (mangled_name
+                 ? strcmp (DEPRECATED_SYMBOL_NAME (sym), mangled_name) == 0
+                 : SYMBOL_MATCHES_NATURAL_NAME (sym, name)))
+           return sym;
+       }
+      return NULL;
+    }
+
   /* If the blocks's symbols were sorted, start with a binary search.  */
 
   if (BLOCK_SHOULD_SORT (block))
@@ -1222,15 +1729,15 @@ lookup_block_symbol (register const struct block *block, const char *name,
            {
              do_linear_search = 1;
            }
-         if (SYMBOL_SOURCE_NAME (sym)[0] < name[0])
+         if (SYMBOL_NATURAL_NAME (sym)[0] < name[0])
            {
              bot = inc;
            }
-         else if (SYMBOL_SOURCE_NAME (sym)[0] > name[0])
+         else if (SYMBOL_NATURAL_NAME (sym)[0] > name[0])
            {
              top = inc;
            }
-         else if (strcmp (SYMBOL_SOURCE_NAME (sym), name) < 0)
+         else if (strcmp (SYMBOL_NATURAL_NAME (sym), name) < 0)
            {
              bot = inc;
            }
@@ -1242,22 +1749,27 @@ lookup_block_symbol (register const struct block *block, const char *name,
 
       /* Now scan forward until we run out of symbols, find one whose
          name is greater than NAME, or find one we want.  If there is
-         more than one symbol with the right name and namespace, we
+         more than one symbol with the right name and domain, we
          return the first one; I believe it is now impossible for us
-         to encounter two symbols with the same name and namespace
+         to encounter two symbols with the same name and domain
          here, because blocks containing argument symbols are no
-         longer sorted.  */
+         longer sorted.  The exception is for C++, where multiple functions
+        (cloned constructors / destructors, in particular) can have
+        the same demangled name.  So if we have a particular
+        mangled name to match, try to do so.  */
 
       top = BLOCK_NSYMS (block);
       while (bot < top)
        {
          sym = BLOCK_SYM (block, bot);
-         if (SYMBOL_NAMESPACE (sym) == namespace &&
-             SYMBOL_MATCHES_NAME (sym, name))
+         if (SYMBOL_DOMAIN (sym) == domain
+             && (mangled_name
+                 ? strcmp (DEPRECATED_SYMBOL_NAME (sym), mangled_name) == 0
+                 : SYMBOL_MATCHES_NATURAL_NAME (sym, name)))
            {
              return sym;
            }
-          if (SYMBOL_SOURCE_NAME (sym)[0] > name[0])
+          if (SYMBOL_PRINT_NAME (sym)[0] > name[0])
             {
               break;
             }
@@ -1285,8 +1797,10 @@ lookup_block_symbol (register const struct block *block, const char *name,
       while (bot < top)
        {
          sym = BLOCK_SYM (block, bot);
-         if (SYMBOL_NAMESPACE (sym) == namespace &&
-             SYMBOL_MATCHES_NAME (sym, name))
+         if (SYMBOL_DOMAIN (sym) == domain
+             && (mangled_name
+                 ? strcmp (DEPRECATED_SYMBOL_NAME (sym), mangled_name) == 0
+                 : SYMBOL_MATCHES_NATURAL_NAME (sym, name)))
            {
              /* If SYM has aliases, then use any alias that is active
                 at the current PC.  If no alias is active at the current
@@ -1317,7 +1831,8 @@ lookup_block_symbol (register const struct block *block, const char *name,
                  SYMBOL_CLASS (sym) != LOC_REF_ARG &&
                  SYMBOL_CLASS (sym) != LOC_REGPARM &&
                  SYMBOL_CLASS (sym) != LOC_REGPARM_ADDR &&
-                 SYMBOL_CLASS (sym) != LOC_BASEREG_ARG)
+                 SYMBOL_CLASS (sym) != LOC_BASEREG_ARG &&
+                 SYMBOL_CLASS (sym) != LOC_COMPUTED_ARG)
                {
                  break;
                }
@@ -1360,18 +1875,6 @@ find_active_alias (struct symbol *sym, CORE_ADDR addr)
 }
 \f
 
-/* Return the symbol for the function which contains a specified
-   lexical block, described by a struct block BL.  */
-
-struct symbol *
-block_function (struct block *bl)
-{
-  while (BLOCK_FUNCTION (bl) == 0 && BLOCK_SUPERBLOCK (bl) != 0)
-    bl = BLOCK_SUPERBLOCK (bl);
-
-  return BLOCK_FUNCTION (bl);
-}
-
 /* Find the symtab associated with PC and SECTION.  Look through the
    psymtabs and read in another symtab if necessary. */
 
@@ -1385,6 +1888,21 @@ find_pc_sect_symtab (CORE_ADDR pc, asection *section)
   register struct partial_symtab *ps;
   register struct objfile *objfile;
   CORE_ADDR distance = 0;
+  struct minimal_symbol *msymbol;
+
+  /* If we know that this is not a text address, return failure.  This is
+     necessary because we loop based on the block's high and low code
+     addresses, which do not include the data ranges, and because
+     we call find_pc_sect_psymtab which has a similar restriction based
+     on the partial_symtab's texthigh and textlow.  */
+  msymbol = lookup_minimal_symbol_by_pc_section (pc, section);
+  if (msymbol
+      && (msymbol->type == mst_data
+         || msymbol->type == mst_bss
+         || msymbol->type == mst_abs
+         || msymbol->type == mst_file_data
+         || msymbol->type == mst_file_bss))
+    return NULL;
 
   /* Search all symtabs for the one whose file contains our address, and which
      is the smallest of all the ones containing the address.  This is designed
@@ -1426,14 +1944,15 @@ find_pc_sect_symtab (CORE_ADDR pc, asection *section)
        if (section != 0)
          {
            int i;
+           struct symbol *sym = NULL;
 
-           for (i = 0; i < b->nsyms; i++)
+           ALL_BLOCK_SYMBOLS (b, i, sym)
              {
-               fixup_symbol_section (b->sym[i], objfile);
-               if (section == SYMBOL_BFD_SECTION (b->sym[i]))
+               fixup_symbol_section (sym, objfile);
+               if (section == SYMBOL_BFD_SECTION (sym))
                  break;
              }
-           if (i >= b->nsyms)
+           if ((i >= BLOCK_BUCKETS (b)) && (sym == NULL))
              continue;         /* no symbol in this symtab matches section */
          }
        distance = BLOCK_END (b) - BLOCK_START (b);
@@ -1470,96 +1989,6 @@ find_pc_symtab (CORE_ADDR pc)
 }
 \f
 
-#if 0
-
-/* Find the closest symbol value (of any sort -- function or variable)
-   for a given address value.  Slow but complete.  (currently unused,
-   mainly because it is too slow.  We could fix it if each symtab and
-   psymtab had contained in it the addresses ranges of each of its
-   sections, which also would be required to make things like "info
-   line *0x2345" cause psymtabs to be converted to symtabs).  */
-
-struct symbol *
-find_addr_symbol (CORE_ADDR addr, struct symtab **symtabp, CORE_ADDR *symaddrp)
-{
-  struct symtab *symtab, *best_symtab;
-  struct objfile *objfile;
-  register int bot, top;
-  register struct symbol *sym;
-  register CORE_ADDR sym_addr;
-  struct block *block;
-  int blocknum;
-
-  /* Info on best symbol seen so far */
-
-  register CORE_ADDR best_sym_addr = 0;
-  struct symbol *best_sym = 0;
-
-  /* FIXME -- we should pull in all the psymtabs, too!  */
-  ALL_SYMTABS (objfile, symtab)
-  {
-    /* Search the global and static blocks in this symtab for
-       the closest symbol-address to the desired address.  */
-
-    for (blocknum = GLOBAL_BLOCK; blocknum <= STATIC_BLOCK; blocknum++)
-      {
-       QUIT;
-       block = BLOCKVECTOR_BLOCK (BLOCKVECTOR (symtab), blocknum);
-       top = BLOCK_NSYMS (block);
-       for (bot = 0; bot < top; bot++)
-         {
-           sym = BLOCK_SYM (block, bot);
-           switch (SYMBOL_CLASS (sym))
-             {
-             case LOC_STATIC:
-             case LOC_LABEL:
-               sym_addr = SYMBOL_VALUE_ADDRESS (sym);
-               break;
-
-             case LOC_INDIRECT:
-               sym_addr = SYMBOL_VALUE_ADDRESS (sym);
-               /* An indirect symbol really lives at *sym_addr,
-                * so an indirection needs to be done.
-                * However, I am leaving this commented out because it's
-                * expensive, and it's possible that symbolization
-                * could be done without an active process (in
-                * case this read_memory will fail). RT
-                sym_addr = read_memory_unsigned_integer
-                (sym_addr, TARGET_PTR_BIT / TARGET_CHAR_BIT);
-                */
-               break;
-
-             case LOC_BLOCK:
-               sym_addr = BLOCK_START (SYMBOL_BLOCK_VALUE (sym));
-               break;
-
-             default:
-               continue;
-             }
-
-           if (sym_addr <= addr)
-             if (sym_addr > best_sym_addr)
-               {
-                 /* Quit if we found an exact match.  */
-                 best_sym = sym;
-                 best_sym_addr = sym_addr;
-                 best_symtab = symtab;
-                 if (sym_addr == addr)
-                   goto done;
-               }
-         }
-      }
-  }
-
-done:
-  if (symtabp)
-    *symtabp = best_symtab;
-  if (symaddrp)
-    *symaddrp = best_sym_addr;
-  return best_sym;
-}
-#endif /* 0 */
-
 /* Find the source file and line number for a given PC value and SECTION.
    Return a structure containing a symtab pointer, a line number,
    and a pc range for the entire source line.
@@ -1614,7 +2043,7 @@ find_pc_sect_line (CORE_ADDR pc, struct sec *section, int notcurrent)
      But what we want is the statement containing the instruction.
      Fudge the pc to make sure we get that.  */
 
-  INIT_SAL (&val);             /* initialize to zeroes */
+  init_sal (&val);             /* initialize to zeroes */
 
   /* It's tempting to assume that, if we can't find debugging info for
      any function enclosing PC, that we shouldn't search for line
@@ -1674,7 +2103,7 @@ find_pc_sect_line (CORE_ADDR pc, struct sec *section, int notcurrent)
   if (msymbol != NULL)
     if (MSYMBOL_TYPE (msymbol) == mst_solib_trampoline)
       {
-       mfunsym = lookup_minimal_symbol_text (SYMBOL_NAME (msymbol), NULL, NULL);
+       mfunsym = lookup_minimal_symbol_text (DEPRECATED_SYMBOL_NAME (msymbol), NULL, NULL);
        if (mfunsym == NULL)
          /* I eliminated this warning since it is coming out
           * in the following situation:
@@ -1685,12 +2114,12 @@ find_pc_sect_line (CORE_ADDR pc, struct sec *section, int notcurrent)
           * so of course we can't find the real func/line info,
           * but the "break" still works, and the warning is annoying.
           * So I commented out the warning. RT */
-         /* warning ("In stub for %s; unable to find real function/line info", SYMBOL_NAME(msymbol)) */ ;
+         /* warning ("In stub for %s; unable to find real function/line info", DEPRECATED_SYMBOL_NAME (msymbol)) */ ;
        /* fall through */
        else if (SYMBOL_VALUE (mfunsym) == SYMBOL_VALUE (msymbol))
          /* Avoid infinite recursion */
          /* See above comment about why warning is commented out */
-         /* warning ("In stub for %s; unable to find real function/line info", SYMBOL_NAME(msymbol)) */ ;
+         /* warning ("In stub for %s; unable to find real function/line info", DEPRECATED_SYMBOL_NAME (msymbol)) */ ;
        /* fall through */
        else
          return find_pc_line (SYMBOL_VALUE (mfunsym), 0);
@@ -1756,9 +2185,11 @@ find_pc_sect_line (CORE_ADDR pc, struct sec *section, int notcurrent)
          the first line, prev will not be set.  */
 
       /* Is this file's best line closer than the best in the other files?
-         If so, record this file, and its best line, as best so far.  */
+         If so, record this file, and its best line, as best so far.  Don't
+         save prev if it represents the end of a function (i.e. line number
+         0) instead of a real line.  */
 
-      if (prev && (!best || prev->pc > best->pc))
+      if (prev && prev->line && (!best || prev->pc > best->pc))
        {
          best = prev;
          best_symtab = s;
@@ -1796,6 +2227,13 @@ find_pc_sect_line (CORE_ADDR pc, struct sec *section, int notcurrent)
          val.end = alt->pc;
        }
     }
+  else if (best->line == 0)
+    {
+      /* If our best fit is in a range of PC's for which no line
+        number info is available (line number is zero) then we didn't
+        find any valid line information. */
+      val.pc = pc;
+    }
   else
     {
       val.symtab = best_symtab;
@@ -2379,21 +2817,70 @@ make_cleanup_free_search_symbols (struct symbol_search *symbols)
   return make_cleanup (do_free_search_symbols_cleanup, symbols);
 }
 
+/* Helper function for sort_search_symbols and qsort.  Can only
+   sort symbols, not minimal symbols.  */
+static int
+compare_search_syms (const void *sa, const void *sb)
+{
+  struct symbol_search **sym_a = (struct symbol_search **) sa;
+  struct symbol_search **sym_b = (struct symbol_search **) sb;
+
+  return strcmp (SYMBOL_PRINT_NAME ((*sym_a)->symbol),
+                SYMBOL_PRINT_NAME ((*sym_b)->symbol));
+}
+
+/* Sort the ``nfound'' symbols in the list after prevtail.  Leave
+   prevtail where it is, but update its next pointer to point to
+   the first of the sorted symbols.  */
+static struct symbol_search *
+sort_search_symbols (struct symbol_search *prevtail, int nfound)
+{
+  struct symbol_search **symbols, *symp, *old_next;
+  int i;
+
+  symbols = (struct symbol_search **) xmalloc (sizeof (struct symbol_search *)
+                                              * nfound);
+  symp = prevtail->next;
+  for (i = 0; i < nfound; i++)
+    {
+      symbols[i] = symp;
+      symp = symp->next;
+    }
+  /* Generally NULL.  */
+  old_next = symp;
+
+  qsort (symbols, nfound, sizeof (struct symbol_search *),
+        compare_search_syms);
+
+  symp = prevtail;
+  for (i = 0; i < nfound; i++)
+    {
+      symp->next = symbols[i];
+      symp = symp->next;
+    }
+  symp->next = old_next;
+
+  xfree (symbols);
+  return symp;
+}
 
 /* Search the symbol table for matches to the regular expression REGEXP,
    returning the results in *MATCHES.
 
    Only symbols of KIND are searched:
-   FUNCTIONS_NAMESPACE - search all functions
-   TYPES_NAMESPACE     - search all type names
-   METHODS_NAMESPACE   - search all methods NOT IMPLEMENTED
-   VARIABLES_NAMESPACE - search all symbols, excluding functions, type names,
+   FUNCTIONS_DOMAIN - search all functions
+   TYPES_DOMAIN     - search all type names
+   METHODS_DOMAIN   - search all methods NOT IMPLEMENTED
+   VARIABLES_DOMAIN - search all symbols, excluding functions, type names,
    and constants (enums)
 
    free_search_symbols should be called when *MATCHES is no longer needed.
+
+   The results are sorted locally; each symtab's global and static blocks are
+   separately alphabetized.
  */
 void
-search_symbols (char *regexp, namespace_enum kind, int nfiles, char *files[],
+search_symbols (char *regexp, domain_enum kind, int nfiles, char *files[],
                struct symbol_search **matches)
 {
   register struct symtab *s;
@@ -2430,13 +2917,13 @@ search_symbols (char *regexp, namespace_enum kind, int nfiles, char *files[],
   struct symbol_search *tail;
   struct cleanup *old_chain = NULL;
 
-  if (kind < VARIABLES_NAMESPACE)
-    error ("must search on specific namespace");
+  if (kind < VARIABLES_DOMAIN)
+    error ("must search on specific domain");
 
-  ourtype = types[(int) (kind - VARIABLES_NAMESPACE)];
-  ourtype2 = types2[(int) (kind - VARIABLES_NAMESPACE)];
-  ourtype3 = types3[(int) (kind - VARIABLES_NAMESPACE)];
-  ourtype4 = types4[(int) (kind - VARIABLES_NAMESPACE)];
+  ourtype = types[(int) (kind - VARIABLES_DOMAIN)];
+  ourtype2 = types2[(int) (kind - VARIABLES_DOMAIN)];
+  ourtype3 = types3[(int) (kind - VARIABLES_DOMAIN)];
+  ourtype4 = types4[(int) (kind - VARIABLES_DOMAIN)];
 
   sr = *matches = NULL;
   tail = NULL;
@@ -2516,12 +3003,13 @@ search_symbols (char *regexp, namespace_enum kind, int nfiles, char *files[],
            /* If it would match (logic taken from loop below)
               load the file and go on to the next one */
            if (file_matches (ps->filename, files, nfiles)
-               && ((regexp == NULL || SYMBOL_MATCHES_REGEXP (*psym))
-                   && ((kind == VARIABLES_NAMESPACE && SYMBOL_CLASS (*psym) != LOC_TYPEDEF
+               && ((regexp == NULL
+                    || re_exec (SYMBOL_NATURAL_NAME (*psym)) != 0)
+                   && ((kind == VARIABLES_DOMAIN && SYMBOL_CLASS (*psym) != LOC_TYPEDEF
                         && SYMBOL_CLASS (*psym) != LOC_BLOCK)
-                       || (kind == FUNCTIONS_NAMESPACE && SYMBOL_CLASS (*psym) == LOC_BLOCK)
-                       || (kind == TYPES_NAMESPACE && SYMBOL_CLASS (*psym) == LOC_TYPEDEF)
-                       || (kind == METHODS_NAMESPACE && SYMBOL_CLASS (*psym) == LOC_BLOCK))))
+                       || (kind == FUNCTIONS_DOMAIN && SYMBOL_CLASS (*psym) == LOC_BLOCK)
+                       || (kind == TYPES_DOMAIN && SYMBOL_CLASS (*psym) == LOC_TYPEDEF)
+                       || (kind == METHODS_DOMAIN && SYMBOL_CLASS (*psym) == LOC_BLOCK))))
              {
                PSYMTAB_TO_SYMTAB (ps);
                keep_going = 0;
@@ -2544,7 +3032,7 @@ search_symbols (char *regexp, namespace_enum kind, int nfiles, char *files[],
      any matching symbols without debug info.
    */
 
-  if (nfiles == 0 && (kind == VARIABLES_NAMESPACE || kind == FUNCTIONS_NAMESPACE))
+  if (nfiles == 0 && (kind == VARIABLES_DOMAIN || kind == FUNCTIONS_DOMAIN))
     {
       ALL_MSYMBOLS (objfile, msymbol)
       {
@@ -2553,14 +3041,21 @@ search_symbols (char *regexp, namespace_enum kind, int nfiles, char *files[],
            MSYMBOL_TYPE (msymbol) == ourtype3 ||
            MSYMBOL_TYPE (msymbol) == ourtype4)
          {
-           if (regexp == NULL || SYMBOL_MATCHES_REGEXP (msymbol))
+           if (regexp == NULL
+               || re_exec (SYMBOL_NATURAL_NAME (msymbol)) != 0)
              {
                if (0 == find_pc_symtab (SYMBOL_VALUE_ADDRESS (msymbol)))
                  {
-                   if (kind == FUNCTIONS_NAMESPACE
-                       || lookup_symbol (SYMBOL_NAME (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 (DEPRECATED_SYMBOL_NAME (msymbol),
                                          (struct block *) NULL,
-                                         VAR_NAMESPACE,
+                                         VAR_DOMAIN,
                                        0, (struct symtab **) NULL) == NULL)
                      found_misc = 1;
                  }
@@ -2580,22 +3075,21 @@ search_symbols (char *regexp, namespace_enum kind, int nfiles, char *files[],
     if (bv != prev_bv)
       for (i = GLOBAL_BLOCK; i <= STATIC_BLOCK; i++)
        {
+         struct symbol_search *prevtail = tail;
+         int nfound = 0;
          b = BLOCKVECTOR_BLOCK (bv, i);
-         /* Skip the sort if this block is always sorted.  */
-         if (!BLOCK_SHOULD_SORT (b))
-           sort_block_syms (b);
-         for (j = 0; j < BLOCK_NSYMS (b); j++)
+         ALL_BLOCK_SYMBOLS (b, j, sym)
            {
              QUIT;
-             sym = BLOCK_SYM (b, j);
              if (file_matches (s->filename, files, nfiles)
-                 && ((regexp == NULL || SYMBOL_MATCHES_REGEXP (sym))
-                     && ((kind == VARIABLES_NAMESPACE && SYMBOL_CLASS (sym) != LOC_TYPEDEF
+                 && ((regexp == NULL
+                      || re_exec (SYMBOL_NATURAL_NAME (sym)) != 0)
+                     && ((kind == VARIABLES_DOMAIN && SYMBOL_CLASS (sym) != LOC_TYPEDEF
                           && SYMBOL_CLASS (sym) != LOC_BLOCK
                           && SYMBOL_CLASS (sym) != LOC_CONST)
-                         || (kind == FUNCTIONS_NAMESPACE && SYMBOL_CLASS (sym) == LOC_BLOCK)
-                         || (kind == TYPES_NAMESPACE && SYMBOL_CLASS (sym) == LOC_TYPEDEF)
-                         || (kind == METHODS_NAMESPACE && SYMBOL_CLASS (sym) == LOC_BLOCK))))
+                         || (kind == FUNCTIONS_DOMAIN && SYMBOL_CLASS (sym) == LOC_BLOCK)
+                         || (kind == TYPES_DOMAIN && SYMBOL_CLASS (sym) == LOC_TYPEDEF)
+                         || (kind == METHODS_DOMAIN && SYMBOL_CLASS (sym) == LOC_BLOCK))))
                {
                  /* match */
                  psr = (struct symbol_search *) xmalloc (sizeof (struct symbol_search));
@@ -2605,14 +3099,27 @@ search_symbols (char *regexp, namespace_enum kind, int nfiles, char *files[],
                  psr->msymbol = NULL;
                  psr->next = NULL;
                  if (tail == NULL)
-                   {
-                     sr = psr;
-                     old_chain = make_cleanup_free_search_symbols (sr);
-                   }
+                   sr = psr;
                  else
                    tail->next = psr;
                  tail = psr;
+                 nfound ++;
+               }
+           }
+         if (nfound > 0)
+           {
+             if (prevtail == NULL)
+               {
+                 struct symbol_search dummy;
+
+                 dummy.next = sr;
+                 tail = sort_search_symbols (&dummy, nfound);
+                 sr = dummy.next;
+
+                 old_chain = make_cleanup_free_search_symbols (sr);
                }
+             else
+               tail = sort_search_symbols (prevtail, nfound);
            }
        }
     prev_bv = bv;
@@ -2621,7 +3128,7 @@ search_symbols (char *regexp, namespace_enum kind, int nfiles, char *files[],
   /* 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_NAMESPACE)
+  if (found_misc || kind != FUNCTIONS_DOMAIN)
     {
       ALL_MSYMBOLS (objfile, msymbol)
       {
@@ -2630,15 +3137,16 @@ search_symbols (char *regexp, namespace_enum kind, int nfiles, char *files[],
            MSYMBOL_TYPE (msymbol) == ourtype3 ||
            MSYMBOL_TYPE (msymbol) == ourtype4)
          {
-           if (regexp == NULL || SYMBOL_MATCHES_REGEXP (msymbol))
+           if (regexp == NULL
+               || re_exec (SYMBOL_NATURAL_NAME (msymbol)) != 0)
              {
                /* Functions:  Look up by address. */
-               if (kind != FUNCTIONS_NAMESPACE ||
+               if (kind != FUNCTIONS_DOMAIN ||
                    (0 == find_pc_symtab (SYMBOL_VALUE_ADDRESS (msymbol))))
                  {
                    /* Variables/Absolutes:  Look up by name */
-                   if (lookup_symbol (SYMBOL_NAME (msymbol),
-                                      (struct block *) NULL, VAR_NAMESPACE,
+                   if (lookup_symbol (DEPRECATED_SYMBOL_NAME (msymbol),
+                                      (struct block *) NULL, VAR_DOMAIN,
                                       0, (struct symtab **) NULL) == NULL)
                      {
                        /* match */
@@ -2673,7 +3181,7 @@ search_symbols (char *regexp, namespace_enum kind, int nfiles, char *files[],
    regarding the match to gdb_stdout.
  */
 static void
-print_symbol_info (namespace_enum kind, struct symtab *s, struct symbol *sym,
+print_symbol_info (domain_enum kind, struct symtab *s, struct symbol *sym,
                   int block, char *last)
 {
   if (last == NULL || strcmp (last, s->filename) != 0)
@@ -2683,49 +3191,25 @@ print_symbol_info (namespace_enum kind, struct symtab *s, struct symbol *sym,
       fputs_filtered (":\n", gdb_stdout);
     }
 
-  if (kind != TYPES_NAMESPACE && block == STATIC_BLOCK)
+  if (kind != TYPES_DOMAIN && block == STATIC_BLOCK)
     printf_filtered ("static ");
 
   /* Typedef that is not a C++ class */
-  if (kind == TYPES_NAMESPACE
-      && SYMBOL_NAMESPACE (sym) != STRUCT_NAMESPACE)
+  if (kind == TYPES_DOMAIN
+      && SYMBOL_DOMAIN (sym) != STRUCT_DOMAIN)
     typedef_print (SYMBOL_TYPE (sym), sym, gdb_stdout);
   /* variable, func, or typedef-that-is-c++-class */
-  else if (kind < TYPES_NAMESPACE ||
-          (kind == TYPES_NAMESPACE &&
-           SYMBOL_NAMESPACE (sym) == STRUCT_NAMESPACE))
+  else if (kind < TYPES_DOMAIN ||
+          (kind == TYPES_DOMAIN &&
+           SYMBOL_DOMAIN (sym) == STRUCT_DOMAIN))
     {
       type_print (SYMBOL_TYPE (sym),
                  (SYMBOL_CLASS (sym) == LOC_TYPEDEF
-                  ? "" : SYMBOL_SOURCE_NAME (sym)),
+                  ? "" : SYMBOL_PRINT_NAME (sym)),
                  gdb_stdout, 0);
 
       printf_filtered (";\n");
     }
-  else
-    {
-#if 0
-      /* Tiemann says: "info methods was never implemented."  */
-      char *demangled_name;
-      c_type_print_base (TYPE_FN_FIELD_TYPE (t, block),
-                        gdb_stdout, 0, 0);
-      c_type_print_varspec_prefix (TYPE_FN_FIELD_TYPE (t, block),
-                                  gdb_stdout, 0);
-      if (TYPE_FN_FIELD_STUB (t, block))
-       check_stub_method (TYPE_DOMAIN_TYPE (type), j, block);
-      demangled_name =
-       cplus_demangle (TYPE_FN_FIELD_PHYSNAME (t, block),
-                       DMGL_ANSI | DMGL_PARAMS);
-      if (demangled_name == NULL)
-       fprintf_filtered (stream, "<badly mangled name %s>",
-                         TYPE_FN_FIELD_PHYSNAME (t, block));
-      else
-       {
-         fputs_filtered (demangled_name, stream);
-         xfree (demangled_name);
-       }
-#endif
-    }
 }
 
 /* This help function for symtab_symbol_info() prints information
@@ -2737,14 +3221,14 @@ print_msymbol_info (struct minimal_symbol *msymbol)
   char *tmp;
 
   if (TARGET_ADDR_BIT <= 32)
-    tmp = longest_local_hex_string_custom (SYMBOL_VALUE_ADDRESS (msymbol)
-                                          & (CORE_ADDR) 0xffffffff,
-                                          "08l");
+    tmp = local_hex_string_custom (SYMBOL_VALUE_ADDRESS (msymbol)
+                                  & (CORE_ADDR) 0xffffffff,
+                                  "08l");
   else
-    tmp = longest_local_hex_string_custom (SYMBOL_VALUE_ADDRESS (msymbol),
-                                          "016l");
+    tmp = local_hex_string_custom (SYMBOL_VALUE_ADDRESS (msymbol),
+                                  "016l");
   printf_filtered ("%s  %s\n",
-                  tmp, SYMBOL_SOURCE_NAME (msymbol));
+                  tmp, SYMBOL_PRINT_NAME (msymbol));
 }
 
 /* This is the guts of the commands "info functions", "info types", and
@@ -2753,7 +3237,7 @@ print_msymbol_info (struct minimal_symbol *msymbol)
    matches.
  */
 static void
-symtab_symbol_info (char *regexp, namespace_enum kind, int from_tty)
+symtab_symbol_info (char *regexp, domain_enum kind, int from_tty)
 {
   static char *classnames[]
   =
@@ -2771,7 +3255,7 @@ symtab_symbol_info (char *regexp, namespace_enum kind, int from_tty)
   printf_filtered (regexp
                   ? "All %ss matching regular expression \"%s\":\n"
                   : "All defined %ss:\n",
-                  classnames[(int) (kind - VARIABLES_NAMESPACE)], regexp);
+                  classnames[(int) (kind - VARIABLES_DOMAIN)], regexp);
 
   for (p = symbols; p != NULL; p = p->next)
     {
@@ -2803,39 +3287,30 @@ symtab_symbol_info (char *regexp, namespace_enum kind, int from_tty)
 static void
 variables_info (char *regexp, int from_tty)
 {
-  symtab_symbol_info (regexp, VARIABLES_NAMESPACE, from_tty);
+  symtab_symbol_info (regexp, VARIABLES_DOMAIN, from_tty);
 }
 
 static void
 functions_info (char *regexp, int from_tty)
 {
-  symtab_symbol_info (regexp, FUNCTIONS_NAMESPACE, from_tty);
+  symtab_symbol_info (regexp, FUNCTIONS_DOMAIN, from_tty);
 }
 
 
 static void
 types_info (char *regexp, int from_tty)
 {
-  symtab_symbol_info (regexp, TYPES_NAMESPACE, from_tty);
-}
-
-#if 0
-/* Tiemann says: "info methods was never implemented."  */
-static void
-methods_info (char *regexp)
-{
-  symtab_symbol_info (regexp, METHODS_NAMESPACE, 0, from_tty);
+  symtab_symbol_info (regexp, TYPES_DOMAIN, from_tty);
 }
-#endif /* 0 */
 
 /* Breakpoint all functions matching regular expression. */
-#ifdef UI_OUT
+
 void
 rbreak_command_wrapper (char *regexp, int from_tty)
 {
   rbreak_command (regexp, from_tty);
 }
-#endif
+
 static void
 rbreak_command (char *regexp, int from_tty)
 {
@@ -2843,7 +3318,7 @@ rbreak_command (char *regexp, int from_tty)
   struct symbol_search *p;
   struct cleanup *old_chain;
 
-  search_symbols (regexp, FUNCTIONS_NAMESPACE, 0, (char **) NULL, &ss);
+  search_symbols (regexp, FUNCTIONS_DOMAIN, 0, (char **) NULL, &ss);
   old_chain = make_cleanup_free_search_symbols (ss);
 
   for (p = ss; p != NULL; p = p->next)
@@ -2851,14 +3326,14 @@ rbreak_command (char *regexp, int from_tty)
       if (p->msymbol == NULL)
        {
          char *string = (char *) alloca (strlen (p->symtab->filename)
-                                         + strlen (SYMBOL_NAME (p->symbol))
+                                         + strlen (DEPRECATED_SYMBOL_NAME (p->symbol))
                                          + 4);
          strcpy (string, p->symtab->filename);
          strcat (string, ":'");
-         strcat (string, SYMBOL_NAME (p->symbol));
+         strcat (string, DEPRECATED_SYMBOL_NAME (p->symbol));
          strcat (string, "'");
          break_command (string, from_tty);
-         print_symbol_info (FUNCTIONS_NAMESPACE,
+         print_symbol_info (FUNCTIONS_DOMAIN,
                             p->symtab,
                             p->symbol,
                             p->block,
@@ -2866,9 +3341,9 @@ rbreak_command (char *regexp, int from_tty)
        }
       else
        {
-         break_command (SYMBOL_NAME (p->msymbol), from_tty);
+         break_command (DEPRECATED_SYMBOL_NAME (p->msymbol), from_tty);
          printf_filtered ("<function, no debug info> %s;\n",
-                          SYMBOL_SOURCE_NAME (p->msymbol));
+                          SYMBOL_PRINT_NAME (p->msymbol));
        }
     }
 
@@ -2876,19 +3351,6 @@ rbreak_command (char *regexp, int from_tty)
 }
 \f
 
-/* Return Nonzero if block a is lexically nested within block b,
-   or if a and b have the same pc range.
-   Return zero otherwise. */
-int
-contained_in (struct block *a, struct block *b)
-{
-  if (!a || !b)
-    return 0;
-  return BLOCK_START (a) >= BLOCK_START (b)
-    && BLOCK_END (a) <= BLOCK_END (b);
-}
-\f
-
 /* Helper routine for make_symbol_completion_list.  */
 
 static int return_val_size;
@@ -2905,7 +3367,7 @@ static char **return_val;
        (SYMBOL_DEMANGLED_NAME (symbol), (sym_text), (len), (text), (word)); \
     else \
       completion_list_add_name \
-       (SYMBOL_NAME (symbol), (sym_text), (len), (text), (word)); \
+       (DEPRECATED_SYMBOL_NAME (symbol), (sym_text), (len), (text), (word)); \
   } while (0)
 
 /*  Test to see if the symbol specified by SYMNAME (which is already
@@ -3088,7 +3550,7 @@ make_symbol_completion_list (char *text, char *word)
   /* Search upwards from currently selected frame (so that we can
      complete on local vars.  */
 
-  for (b = get_selected_block (); b != NULL; b = BLOCK_SUPERBLOCK (b))
+  for (b = get_selected_block (0); b != NULL; b = BLOCK_SUPERBLOCK (b))
     {
       if (!BLOCK_SUPERBLOCK (b))
        {
@@ -3495,6 +3957,49 @@ in_prologue (CORE_ADDR pc, CORE_ADDR func_start)
 
 
 /* Begin overload resolution functions */
+
+static char *
+remove_params (const char *demangled_name)
+{
+  const char *argp;
+  char *new_name;
+  int depth;
+
+  if (demangled_name == NULL)
+    return NULL;
+
+  /* First find the end of the arg list.  */
+  argp = strrchr (demangled_name, ')');
+  if (argp == NULL)
+    return NULL;
+
+  /* Back up to the beginning.  */
+  depth = 1;
+
+  while (argp-- > demangled_name)
+    {
+      if (*argp == ')')
+       depth ++;
+      else if (*argp == '(')
+       {
+         depth --;
+
+         if (depth == 0)
+           break;
+       }
+    }
+  if (depth != 0)
+    internal_error (__FILE__, __LINE__,
+                   "bad demangled name %s\n", demangled_name);
+  while (argp[-1] == ' ' && argp > demangled_name)
+    argp --;
+
+  new_name = xmalloc (argp - demangled_name + 1);
+  memcpy (new_name, demangled_name, argp - demangled_name);
+  new_name[argp - demangled_name] = '\0';
+  return new_name;
+}
+
 /* Helper routine for make_symbol_completion_list.  */
 
 static int sym_return_val_size;
@@ -3510,14 +4015,21 @@ overload_list_add_symbol (struct symbol *sym, char *oload_name)
 {
   int newsize;
   int i;
+  char *sym_name;
+
+  /* If there is no type information, we can't do anything, so skip */
+  if (SYMBOL_TYPE (sym) == NULL)
+    return;
+
+  /* skip any symbols that we've already considered. */
+  for (i = 0; i < sym_return_val_index; ++i)
+    if (!strcmp (DEPRECATED_SYMBOL_NAME (sym), DEPRECATED_SYMBOL_NAME (sym_return_val[i])))
+      return;
 
   /* Get the demangled name without parameters */
-  char *sym_name = cplus_demangle (SYMBOL_NAME (sym), DMGL_ARM | DMGL_ANSI);
+  sym_name = remove_params (SYMBOL_DEMANGLED_NAME (sym));
   if (!sym_name)
-    {
-      sym_name = (char *) xmalloc (strlen (SYMBOL_NAME (sym)) + 1);
-      strcpy (sym_name, SYMBOL_NAME (sym));
-    }
+    return;
 
   /* skip symbols that cannot match */
   if (strcmp (sym_name, oload_name) != 0)
@@ -3526,14 +4038,7 @@ overload_list_add_symbol (struct symbol *sym, char *oload_name)
       return;
     }
 
-  /* If there is no type information, we can't do anything, so skip */
-  if (SYMBOL_TYPE (sym) == NULL)
-    return;
-
-  /* skip any symbols that we've already considered. */
-  for (i = 0; i < sym_return_val_index; ++i)
-    if (!strcmp (SYMBOL_NAME (sym), SYMBOL_NAME (sym_return_val[i])))
-      return;
+  xfree (sym_name);
 
   /* We have a match for an overload instance, so add SYM to the current list
    * of overload instances */
@@ -3544,8 +4049,6 @@ overload_list_add_symbol (struct symbol *sym, char *oload_name)
     }
   sym_return_val[sym_return_val_index++] = sym;
   sym_return_val[sym_return_val_index] = NULL;
-
-  xfree (sym_name);
 }
 
 /* Return a null-terminated list of pointers to function symbols that
@@ -3568,14 +4071,17 @@ make_symbol_overload_list (struct symbol *fsym)
   /* Length of name.  */
   int oload_name_len = 0;
 
-  /* Look for the symbol we are supposed to complete on.
-   * FIXME: This should be language-specific.  */
+  /* Look for the symbol we are supposed to complete on.  */
 
-  oload_name = cplus_demangle (SYMBOL_NAME (fsym), DMGL_ARM | DMGL_ANSI);
+  oload_name = remove_params (SYMBOL_DEMANGLED_NAME (fsym));
   if (!oload_name)
     {
-      oload_name = (char *) xmalloc (strlen (SYMBOL_NAME (fsym)) + 1);
-      strcpy (oload_name, SYMBOL_NAME (fsym));
+      sym_return_val_size = 1;
+      sym_return_val = (struct symbol **) xmalloc (2 * sizeof (struct symbol *));
+      sym_return_val[0] = fsym;
+      sym_return_val[1] = NULL;
+
+      return sym_return_val;
     }
   oload_name_len = strlen (oload_name);
 
@@ -3584,8 +4090,8 @@ make_symbol_overload_list (struct symbol *fsym)
   sym_return_val = (struct symbol **) xmalloc ((sym_return_val_size + 1) * sizeof (struct symbol *));
   sym_return_val[0] = NULL;
 
-  /* Look through the partial symtabs for all symbols which begin
-     by matching OLOAD_NAME.  Make sure we read that symbol table in. */
+  /* Read in all partial symtabs containing a partial symbol named
+     OLOAD_NAME.  */
 
   ALL_PSYMTABS (objfile, ps)
   {
@@ -3596,32 +4102,17 @@ make_symbol_overload_list (struct symbol *fsym)
     if (ps->readin)
       continue;
 
-    for (psym = objfile->global_psymbols.list + ps->globals_offset;
-        psym < (objfile->global_psymbols.list + ps->globals_offset
-                + ps->n_global_syms);
-        psym++)
-      {
-       /* If interrupted, then quit. */
-       QUIT;
-        /* This will cause the symbol table to be read if it has not yet been */
-        s = PSYMTAB_TO_SYMTAB (ps);
-      }
-
-    for (psym = objfile->static_psymbols.list + ps->statics_offset;
-        psym < (objfile->static_psymbols.list + ps->statics_offset
-                + ps->n_static_syms);
-        psym++)
-      {
-       QUIT;
-        /* This will cause the symbol table to be read if it has not yet been */
-        s = PSYMTAB_TO_SYMTAB (ps);
-      }
+    if ((lookup_partial_symbol (ps, oload_name, NULL, 1, VAR_DOMAIN)
+        != NULL)
+       || (lookup_partial_symbol (ps, oload_name, NULL, 0, VAR_DOMAIN)
+           != NULL))
+      PSYMTAB_TO_SYMTAB (ps);
   }
 
   /* Search upwards from currently selected frame (so that we can
      complete on local vars.  */
 
-  for (b = get_selected_block (); b != NULL; b = BLOCK_SUPERBLOCK (b))
+  for (b = get_selected_block (0); b != NULL; b = BLOCK_SUPERBLOCK (b))
     {
       if (!BLOCK_SUPERBLOCK (b))
        {
@@ -3674,11 +4165,19 @@ struct symtabs_and_lines
 decode_line_spec (char *string, int funfirstline)
 {
   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, funfirstline,
-                       current_source_symtab, current_source_line,
+                       cursal.symtab, cursal.line,
                        (char ***) NULL);
+
   if (*string)
     error ("Junk at end of line specification: %s", string);
   return sals;
@@ -3735,13 +4234,6 @@ _initialize_symtab (void)
   add_info ("types", types_info,
            "All type names, or those matching REGEXP.");
 
-#if 0
-  add_info ("methods", methods_info,
-           "All method names, or those matching REGEXP::REGEXP.\n\
-If the class qualifier is omitted, it is assumed to be the current scope.\n\
-If the first REGEXP is omitted, then all methods matching the second REGEXP\n\
-are listed.");
-#endif
   add_info ("sources", sources_info,
            "Source files in the program.");
 
This page took 0.059249 seconds and 4 git commands to generate.