One more time...
[deliverable/binutils-gdb.git] / gdb / symtab.c
index 09f3282f26b97ae95856c67ea04fc16846269617..9814774b116d5e1650fc5df3b8f3c748d5eb6924 100644 (file)
@@ -1,32 +1,34 @@
 /* Symbol table lookup for the GNU debugger, GDB.
-   Copyright (C) 1986, 1987, 1988, 1989, 1990 Free Software Foundation, Inc.
+   Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992 Free Software Foundation, Inc.
 
 This file is part of GDB.
 
-GDB is free software; you can redistribute it and/or modify
+This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 1, or (at your option)
-any later version.
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
 
-GDB is distributed in the hope that it will be useful,
+This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
-along with GDB; see the file COPYING.  If not, write to
-the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+along with this program; if not, write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
-#include <stdio.h>
 #include "defs.h"
 #include "symtab.h"
-#include "param.h"
+#include "gdbtypes.h"
 #include "gdbcore.h"
 #include "frame.h"
 #include "target.h"
 #include "value.h"
 #include "symfile.h"
 #include "gdbcmd.h"
+#include "regex.h"
+#include "expression.h"
+#include "language.h"
 
 #include <obstack.h>
 #include <assert.h>
@@ -35,47 +37,70 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include <fcntl.h>
 #include <string.h>
 #include <sys/stat.h>
+#include <ctype.h>
 
-extern int close ();
-extern void qsort ();
-extern char *getenv ();
-
-extern char *cplus_demangle ();
-extern struct value *value_of_this ();
-extern void break_command ();
-extern void select_source_symtab ();
-
-/* Functions this file defines */
-static int find_line_common ();
-struct partial_symtab *lookup_partial_symtab ();
-static struct partial_symbol *lookup_partial_symbol ();
-
-/* These variables point to the objects
-   representing the predefined C data types.  */
-
-struct type *builtin_type_void;
-struct type *builtin_type_char;
-struct type *builtin_type_short;
-struct type *builtin_type_int;
-struct type *builtin_type_long;
-#ifdef LONG_LONG
-struct type *builtin_type_long_long;
-#endif
-struct type *builtin_type_unsigned_char;
-struct type *builtin_type_unsigned_short;
-struct type *builtin_type_unsigned_int;
-struct type *builtin_type_unsigned_long;
-#ifdef LONG_LONG
-struct type *builtin_type_unsigned_long_long;
-#endif
-struct type *builtin_type_float;
-struct type *builtin_type_double;
+/* Prototypes for local functions */
+
+extern int
+find_methods PARAMS ((struct type *, char *, char **, struct symbol **));
+
+static void
+completion_list_add_symbol PARAMS ((char *));
+
+static struct symtabs_and_lines
+decode_line_2 PARAMS ((struct symbol *[], int, int));
+
+static void
+rbreak_command PARAMS ((char *));
+
+static void
+types_info PARAMS ((char *));
+
+static void
+functions_info PARAMS ((char *));
+
+static void
+variables_info PARAMS ((char *));
+
+static void
+list_symbols PARAMS ((char *, int, int));
+
+static void
+sources_info PARAMS ((void));
+
+static void
+output_source_filename PARAMS ((char *, int *));
+
+static char *
+operator_chars PARAMS ((char *, char **));
+
+static int
+find_line_common PARAMS ((struct linetable *, int, int *));
+
+static struct partial_symbol *
+lookup_partial_symbol PARAMS ((struct partial_symtab *, const char *,
+                              int, enum namespace));
+
+static struct partial_symbol *
+lookup_demangled_partial_symbol PARAMS ((const struct partial_symtab *,
+                                        const char *));
+
+static struct symbol *
+lookup_demangled_block_symbol PARAMS ((const struct block *, const char *));
+
+static struct symtab *
+lookup_symtab_1 PARAMS ((char *));
+
+/* */
+
+/* The single non-language-specific builtin type */
 struct type *builtin_type_error;
 
 /* Block in which the most recently searched-for symbol was found.
    Might be better to make this a parameter to lookup_symbol and 
    value_of_this. */
-struct block *block_found;
+
+const struct block *block_found;
 
 char no_symtab_msg[] = "No symbol table is loaded.  Use the \"file\" command.";
 
@@ -91,44 +116,68 @@ lookup_symtab_1 (name)
   register struct partial_symtab *ps;
   register char *slash = strchr (name, '/');
   register int len = strlen (name);
+  register struct objfile *objfile;
 
-  for (s = symtab_list; s; s = s->next)
-    if (!strcmp (name, s->filename))
-      return s;
-
-  for (ps = partial_symtab_list; ps; ps = ps->next)
-    if (!strcmp (name, ps->filename))
-      {
-       if (ps->readin)
-         fatal ("Internal: readin pst found when no symtab found.");
-       return PSYMTAB_TO_SYMTAB (ps);
-      }
 
+  for (objfile = object_files; objfile != NULL; objfile = objfile -> next)
+    {
+      for (s = objfile -> symtabs; s != NULL; s = s -> next)
+       {
+         if (strcmp (name, s->filename) == 0)
+           {
+             return (s);
+           }
+       }
+    }
+  for (objfile = object_files; objfile != NULL; objfile = objfile -> next)
+    {
+      for (ps = objfile -> psymtabs; ps != NULL; ps = ps->next)
+       {
+         if (strcmp (name, ps -> filename) == 0)
+           {
+             if (ps -> readin)
+               {
+                 error ("Internal: readin pst for `%s' found when no symtab found.", name);
+               }
+             return (PSYMTAB_TO_SYMTAB (ps));
+           }
+       }
+    }
   if (!slash)
     {
-      for (s = symtab_list; s; s = s->next)
+      for (objfile = object_files; objfile != NULL; objfile = objfile -> next)
        {
-         int l = strlen (s->filename);
-
-         if (s->filename[l - len -1] == '/'
-             && !strcmp (s->filename + l - len, name))
-           return s;
+         for (s = objfile -> symtabs; s != NULL; s = s -> next)
+           {
+             int l = strlen (s->filename);
+             
+             if (s->filename[l - len -1] == '/'
+                 && (strcmp (s->filename + l - len, name) == 0))
+               {
+                 return (s);
+               }
+           }
        }
 
-      for (ps = partial_symtab_list; ps; ps = ps->next)
+      for (objfile = object_files; objfile != NULL; objfile = objfile -> next)
        {
-         int l = strlen (ps->filename);
-
-         if (ps->filename[l - len - 1] == '/'
-             && !strcmp (ps->filename + l - len, name))
+         for (ps = objfile -> psymtabs; ps != NULL; ps = ps -> next)
            {
-             if (ps->readin)
-               fatal ("Internal: readin pst found when no symtab found.");
-             return PSYMTAB_TO_SYMTAB (ps);
+             int l = strlen (ps -> filename);
+
+             if (ps -> filename[l - len - 1] == '/'
+                 && (strcmp (ps->filename + l - len, name) == 0))
+               {
+                 if (ps -> readin)
+                   {
+                     error ("Internal: readin pst for `%s' found when no symtab found.", name);
+                   }
+                 return (PSYMTAB_TO_SYMTAB (ps));
+               }
            }
        }
     }
-  return 0;
+  return (NULL);
 }
 
 /* Lookup the symbol table of a source file named NAME.  Try a couple
@@ -164,619 +213,98 @@ struct partial_symtab *
 lookup_partial_symtab (name)
 char *name;
 {
-  register struct partial_symtab *s;
+  register struct partial_symtab *pst;
+  register struct objfile *objfile;
   
-  for (s = partial_symtab_list; s; s = s->next)
-    if (!strcmp (name, s->filename))
-      return s;
-  
-  return 0;
-}
-\f
-/* Return a typename for a struct/union/enum type
-   without the tag qualifier.  If the type has a NULL name,
-   NULL is returned.  */
-char *
-type_name_no_tag (type)
-     register struct type *type;
-{
-  register char *name = TYPE_NAME (type);
-  char *strchr ();
-  if (name == 0)
-    return 0;
-
-#if 0
-  switch (TYPE_CODE (type))
+  for (objfile = object_files; objfile != NULL; objfile = objfile -> next)
     {
-    case TYPE_CODE_STRUCT:
-      return name + 7;
-    case TYPE_CODE_UNION:
-      return name + 6;
-    case TYPE_CODE_ENUM:
-      return name + 5;
-    }
-#endif
-
-  name = strchr (name, ' ');
-  if (name)
-    return name + 1;
-
-  return TYPE_NAME (type);
-}
-
-/* Added by Bryan Boreham, Kewill, Sun Sep 17 18:07:17 1989.
-
-   If this is a stubbed struct (i.e. declared as struct foo *), see if
-   we can find a full definition in some other file. If so, copy this
-   definition, so we can use it in future.  If not, set a flag so we 
-   don't waste too much time in future.
-
-   This used to be coded as a macro, but I don't think it is called 
-   often enough to merit such treatment.
-*/
-
-struct complaint stub_noname_complaint =
-  {"stub type has NULL name", 0, 0};
-
-void 
-check_stub_type(type)
-     struct type *type;
-{
-  if (TYPE_FLAGS(type) & TYPE_FLAG_STUB)
-    {
-      char* name= type_name_no_tag (type);
-      struct symbol *sym;
-      if (name == 0)
+      for (pst = objfile -> psymtabs; pst != NULL; pst = pst -> next)
        {
-         complain (&stub_noname_complaint, 0, 0);
-         return;
+         if (strcmp (name, pst -> filename) == 0)
+           {
+             return (pst);
+           }
        }
-      if (sym = lookup_symbol (name, 0, STRUCT_NAMESPACE, 0, 
-                              (struct symtab **)NULL) )
-       bcopy (SYMBOL_TYPE(sym), type, sizeof (struct type));
-    }
+    }  
+  return (NULL);
 }
-
+\f
 /* Demangle a GDB method stub type.  */
 char *
-gdb_mangle_typename (type)
+gdb_mangle_name (type, i, j)
      struct type *type;
+     int i, j;
 {
-  static struct type *last_type;
-  static char *mangled_typename;
-
-  if (type != last_type)
+  int mangled_name_len;
+  char *mangled_name;
+  struct fn_field *f = TYPE_FN_FIELDLIST1 (type, i);
+  struct fn_field *method = &f[j];
+  char *field_name = TYPE_FN_FIELDLIST_NAME (type, i);
+  int is_constructor = strcmp(field_name, TYPE_NAME (type)) == 0;
+
+  /* Need a new type prefix.  */
+  char *const_prefix = method->is_const ? "C" : "";
+  char *volatile_prefix = method->is_volatile ? "V" : "";
+  char *newname = type_name_no_tag (type);
+  char buf[20];
+  int len = strlen (newname);
+
+  sprintf (buf, "__%s%s%d", const_prefix, volatile_prefix, len);
+  mangled_name_len = ((is_constructor ? 0 : strlen (field_name))
+                         + strlen (buf) + len
+                         + strlen (TYPE_FN_FIELD_PHYSNAME (f, j))
+                         + 1);
+
+  /* Only needed for GNU-mangled names.  ANSI-mangled names
+     work with the normal mechanisms.  */
+  if (OPNAME_PREFIX_P (field_name))
     {
-      /* Need a new type prefix.  */
-      char *strchr ();
-      char *newname = type_name_no_tag (type);
-      char buf[20];
-      int len;
-
-      if (mangled_typename)
-       free (mangled_typename);
-
-      len = strlen (newname);
-      sprintf (buf, "__%d", len);
-      mangled_typename = (char *)xmalloc (strlen (buf) + len + 1);
-      strcpy (mangled_typename, buf);
-      strcat (mangled_typename, newname);
-      /* Now we have built "__#newname".  */
+      char *opname = cplus_mangle_opname (field_name + 3, 0);
+      if (opname == NULL)
+       error ("No mangling for \"%s\"", field_name);
+      mangled_name_len += strlen (opname);
+      mangled_name = (char *)xmalloc (mangled_name_len);
+
+      strncpy (mangled_name, field_name, 3);
+      mangled_name[3] = '\0';
+      strcat (mangled_name, opname);
     }
-  return mangled_typename;
-}
-
-/* Lookup a primitive type named NAME. 
-   Return zero if NAME is not a primitive type.*/
-
-struct type *
-lookup_primitive_typename (name)
-     char *name;
-{
-  if (!strcmp (name, "int"))
-    return builtin_type_int;
-  if (!strcmp (name, "long"))
-    return builtin_type_long;
-  if (!strcmp (name, "short"))
-    return builtin_type_short;
-  if (!strcmp (name, "char"))
-    return builtin_type_char;
-  if (!strcmp (name, "float"))
-    return builtin_type_float;
-  if (!strcmp (name, "double"))
-    return builtin_type_double;
-  if (!strcmp (name, "void"))
-    return builtin_type_void;
-  return 0;
-}
-
-/* Lookup a typedef or primitive type named NAME,
-   visible in lexical block BLOCK.
-   If NOERR is nonzero, return zero if NAME is not suitably defined.  */
-
-struct type *
-lookup_typename (name, block, noerr)
-     char *name;
-     struct block *block;
-     int noerr;
-{
-  register struct symbol *sym =
-    lookup_symbol (name, block, VAR_NAMESPACE, 0, (struct symtab **)NULL);
-  if (sym == 0 || SYMBOL_CLASS (sym) != LOC_TYPEDEF)
-    {
-      struct type *tmp;
-      tmp = lookup_primitive_typename (name);
-      if (!tmp && noerr)
-       return 0;
-      error ("No type named %s.", name);
-    }
-  return SYMBOL_TYPE (sym);
-}
-
-struct type *
-lookup_unsigned_typename (name)
-     char *name;
-{
-  if (!strcmp (name, "int"))
-    return builtin_type_unsigned_int;
-  if (!strcmp (name, "long"))
-    return builtin_type_unsigned_long;
-  if (!strcmp (name, "short"))
-    return builtin_type_unsigned_short;
-  if (!strcmp (name, "char"))
-    return builtin_type_unsigned_char;
-  error ("No type named unsigned %s.", name);
-  return (struct type *)-1;  /* for lint */
-}
-
-/* Lookup a structure type named "struct NAME",
-   visible in lexical block BLOCK.  */
-
-struct type *
-lookup_struct (name, block)
-     char *name;
-     struct block *block;
-{
-  register struct symbol *sym 
-    = lookup_symbol (name, block, STRUCT_NAMESPACE, 0, (struct symtab **)NULL);
-
-  if (sym == 0)
-    error ("No struct type named %s.", name);
-  if (TYPE_CODE (SYMBOL_TYPE (sym)) != TYPE_CODE_STRUCT)
-    error ("This context has class, union or enum %s, not a struct.", name);
-  return SYMBOL_TYPE (sym);
-}
-
-/* Lookup a union type named "union NAME",
-   visible in lexical block BLOCK.  */
-
-struct type *
-lookup_union (name, block)
-     char *name;
-     struct block *block;
-{
-  register struct symbol *sym 
-    = lookup_symbol (name, block, STRUCT_NAMESPACE, 0, (struct symtab **)NULL);
-
-  if (sym == 0)
-    error ("No union type named %s.", name);
-  if (TYPE_CODE (SYMBOL_TYPE (sym)) != TYPE_CODE_UNION)
-    error ("This context has class, struct or enum %s, not a union.", name);
-  return SYMBOL_TYPE (sym);
-}
-
-/* Lookup an enum type named "enum NAME",
-   visible in lexical block BLOCK.  */
-
-struct type *
-lookup_enum (name, block)
-     char *name;
-     struct block *block;
-{
-  register struct symbol *sym 
-    = lookup_symbol (name, block, STRUCT_NAMESPACE, 0, (struct symtab **)NULL);
-  if (sym == 0)
-    error ("No enum type named %s.", name);
-  if (TYPE_CODE (SYMBOL_TYPE (sym)) != TYPE_CODE_ENUM)
-    error ("This context has class, struct or union %s, not an enum.", name);
-  return SYMBOL_TYPE (sym);
-}
-
-/* Given a type TYPE, lookup the type of the component of type named
-   NAME.  */
-
-struct type *
-lookup_struct_elt_type (type, name)
-     struct type *type;
-     char *name;
-{
-  int i;
-
-  if (TYPE_CODE (type) != TYPE_CODE_STRUCT
-      && TYPE_CODE (type) != TYPE_CODE_UNION)
-    {
-      target_terminal_ours ();
-      fflush (stdout);
-      fprintf (stderr, "Type ");
-      type_print (type, "", stderr, -1);
-      error (" is not a structure or union type.");
-    }
-
-  for (i = TYPE_NFIELDS (type) - 1; i >= TYPE_N_BASECLASSES (type); i--)
-    if (!strcmp (TYPE_FIELD_NAME (type, i), name))
-      return TYPE_FIELD_TYPE (type, i);
-
-  target_terminal_ours ();
-  fflush (stdout);
-  fprintf (stderr, "Type ");
-  type_print (type, "", stderr, -1);
-  fprintf (stderr, " has no component named ");
-  fputs_filtered (name, stderr);
-  error (".");
-  return (struct type *)-1;    /* For lint */
-}
-
-/* Given a type TYPE, return a type of pointers to that type.
-   May need to construct such a type if this is the first use.
-
-   C++: use TYPE_MAIN_VARIANT and TYPE_CHAIN to keep pointer
-   to member types under control.  */
-
-struct type *
-lookup_pointer_type (type)
-     struct type *type;
-{
-  register struct type *ptype = TYPE_POINTER_TYPE (type);
-  if (ptype) return TYPE_MAIN_VARIANT (ptype);
-
-  /* This is the first time anyone wanted a pointer to a TYPE.  */
-  if (TYPE_FLAGS (type) & TYPE_FLAG_PERM)
-    ptype  = (struct type *) xmalloc (sizeof (struct type));
-  else
-    ptype  = (struct type *) obstack_alloc (symbol_obstack,
-                                           sizeof (struct type));
-
-  bzero (ptype, sizeof (struct type));
-  TYPE_MAIN_VARIANT (ptype) = ptype;
-  TYPE_TARGET_TYPE (ptype) = type;
-  TYPE_POINTER_TYPE (type) = ptype;
-  /* New type is permanent if type pointed to is permanent.  */
-  if (TYPE_FLAGS (type) & TYPE_FLAG_PERM)
-    TYPE_FLAGS (ptype) |= TYPE_FLAG_PERM;
-  /* We assume the machine has only one representation for pointers!  */
-  TYPE_LENGTH (ptype) = sizeof (char *);
-  TYPE_CODE (ptype) = TYPE_CODE_PTR;
-  return ptype;
-}
-
-struct type *
-lookup_reference_type (type)
-     struct type *type;
-{
-  register struct type *rtype = TYPE_REFERENCE_TYPE (type);
-  if (rtype) return TYPE_MAIN_VARIANT (rtype);
-
-  /* This is the first time anyone wanted a pointer to a TYPE.  */
-  if (TYPE_FLAGS (type) & TYPE_FLAG_PERM)
-    rtype  = (struct type *) xmalloc (sizeof (struct type));
   else
-    rtype  = (struct type *) obstack_alloc (symbol_obstack,
-                                           sizeof (struct type));
-
-  bzero (rtype, sizeof (struct type));
-  TYPE_MAIN_VARIANT (rtype) = rtype;
-  TYPE_TARGET_TYPE (rtype) = type;
-  TYPE_REFERENCE_TYPE (type) = rtype;
-  /* New type is permanent if type pointed to is permanent.  */
-  if (TYPE_FLAGS (type) & TYPE_FLAG_PERM)
-    TYPE_FLAGS (rtype) |= TYPE_FLAG_PERM;
-  /* We assume the machine has only one representation for pointers!  */
-  TYPE_LENGTH (rtype) = sizeof (char *);
-  TYPE_CODE (rtype) = TYPE_CODE_REF;
-  return rtype;
-}
-
-
-/* Implement direct support for MEMBER_TYPE in GNU C++.
-   May need to construct such a type if this is the first use.
-   The TYPE is the type of the member.  The DOMAIN is the type
-   of the aggregate that the member belongs to.  */
-
-struct type *
-lookup_member_type (type, domain)
-     struct type *type, *domain;
-{
-  register struct type *mtype = TYPE_MAIN_VARIANT (type);
-  struct type *main_type;
-
-  main_type = mtype;
-  while (mtype)
-    {
-      if (TYPE_DOMAIN_TYPE (mtype) == domain)
-       return mtype;
-      mtype = TYPE_NEXT_VARIANT (mtype);
-    }
-
-  /* This is the first time anyone wanted this member type.  */
-  if (TYPE_FLAGS (type) & TYPE_FLAG_PERM)
-    mtype  = (struct type *) xmalloc (sizeof (struct type));
-  else
-    mtype  = (struct type *) obstack_alloc (symbol_obstack,
-                                           sizeof (struct type));
-
-  bzero (mtype, sizeof (struct type));
-  if (main_type == 0)
-    main_type = mtype;
-  else
-    {
-      TYPE_NEXT_VARIANT (mtype) = TYPE_NEXT_VARIANT (main_type);
-      TYPE_NEXT_VARIANT (main_type) = mtype;
-    }
-  TYPE_MAIN_VARIANT (mtype) = main_type;
-  TYPE_TARGET_TYPE (mtype) = type;
-  TYPE_DOMAIN_TYPE (mtype) = domain;
-  /* New type is permanent if type pointed to is permanent.  */
-  if (TYPE_FLAGS (type) & TYPE_FLAG_PERM)
-    TYPE_FLAGS (mtype) |= TYPE_FLAG_PERM;
-
-  /* In practice, this is never used.  */
-  TYPE_LENGTH (mtype) = 1;
-  TYPE_CODE (mtype) = TYPE_CODE_MEMBER;
-
-#if 0
-  /* Now splice in the new member pointer type.  */
-  if (main_type)
     {
-      /* This type was not "smashed".  */
-      TYPE_CHAIN (mtype) = TYPE_CHAIN (main_type);
-      TYPE_CHAIN (main_type) = mtype;
+      mangled_name = (char *)xmalloc (mangled_name_len);
+      if (is_constructor)
+       mangled_name[0] = '\0';
+      else
+       strcpy (mangled_name, field_name);
     }
-#endif
+  strcat (mangled_name, buf);
+  strcat (mangled_name, newname);
+  strcat (mangled_name, TYPE_FN_FIELD_PHYSNAME (f, j));
 
-  return mtype;
+  return mangled_name;
 }
 
-struct type *
-lookup_method_type (type, domain, args)
-     struct type *type, *domain, **args;
+\f
+/* Find which partial symtab on contains PC.  Return 0 if none.  */
+
+struct partial_symtab *
+find_pc_psymtab (pc)
+     register CORE_ADDR pc;
 {
-  register struct type *mtype = TYPE_MAIN_VARIANT (type);
-  struct type *main_type;
+  register struct partial_symtab *pst;
+  register struct objfile *objfile;
 
-  main_type = mtype;
-  while (mtype)
+  for (objfile = object_files; objfile != NULL; objfile = objfile -> next)
     {
-      if (TYPE_DOMAIN_TYPE (mtype) == domain)
+      for (pst = objfile -> psymtabs; pst != NULL; pst = pst -> next)
        {
-         struct type **t1 = args;
-         struct type **t2 = TYPE_ARG_TYPES (mtype);
-         if (t2)
+         if (pc >= pst -> textlow && pc < pst -> texthigh)
            {
-             int i;
-             for (i = 0; t1[i] != 0 && t1[i]->code != TYPE_CODE_VOID; i++)
-               if (t1[i] != t2[i])
-                 break;
-             if (t1[i] == t2[i])
-               return mtype;
+             return (pst);
            }
        }
-      mtype = TYPE_NEXT_VARIANT (mtype);
     }
-
-  /* This is the first time anyone wanted this member type.  */
-  if (TYPE_FLAGS (type) & TYPE_FLAG_PERM)
-    mtype  = (struct type *) xmalloc (sizeof (struct type));
-  else
-    mtype  = (struct type *) obstack_alloc (symbol_obstack,
-                                           sizeof (struct type));
-
-  bzero (mtype, sizeof (struct type));
-  if (main_type == 0)
-    main_type = mtype;
-  else
-    {
-      TYPE_NEXT_VARIANT (mtype) = TYPE_NEXT_VARIANT (main_type);
-      TYPE_NEXT_VARIANT (main_type) = mtype;
-    }
-  TYPE_MAIN_VARIANT (mtype) = main_type;
-  TYPE_TARGET_TYPE (mtype) = type;
-  TYPE_DOMAIN_TYPE (mtype) = domain;
-  TYPE_ARG_TYPES (mtype) = args;
-  /* New type is permanent if type pointed to is permanent.  */
-  if (TYPE_FLAGS (type) & TYPE_FLAG_PERM)
-    TYPE_FLAGS (mtype) |= TYPE_FLAG_PERM;
-
-  /* In practice, this is never used.  */
-  TYPE_LENGTH (mtype) = 1;
-  TYPE_CODE (mtype) = TYPE_CODE_METHOD;
-
-#if 0
-  /* Now splice in the new member pointer type.  */
-  if (main_type)
-    {
-      /* This type was not "smashed".  */
-      TYPE_CHAIN (mtype) = TYPE_CHAIN (main_type);
-      TYPE_CHAIN (main_type) = mtype;
-    }
-#endif
-
-  return mtype;
-}
-
-#if 0
-/* Given a type TYPE, return a type which has offset OFFSET,
-   via_virtual VIA_VIRTUAL, and via_public VIA_PUBLIC.
-   May need to construct such a type if none exists.  */
-struct type *
-lookup_basetype_type (type, offset, via_virtual, via_public)
-     struct type *type;
-     int offset;
-     int via_virtual, via_public;
-{
-  register struct type *btype = TYPE_MAIN_VARIANT (type);
-  struct type *main_type;
-
-  if (offset != 0)
-    {
-      printf ("Internal error: type offset non-zero in lookup_basetype_type");
-      offset = 0;
-    }
-
-  main_type = btype;
-  while (btype)
-    {
-      if (/* TYPE_OFFSET (btype) == offset
-         && */ TYPE_VIA_PUBLIC (btype) == via_public
-         && TYPE_VIA_VIRTUAL (btype) == via_virtual)
-       return btype;
-      btype = TYPE_NEXT_VARIANT (btype);
-    }
-
-  /* This is the first time anyone wanted this member type.  */
-  if (TYPE_FLAGS (type) & TYPE_FLAG_PERM)
-    btype  = (struct type *) xmalloc (sizeof (struct type));
-  else
-    btype  = (struct type *) obstack_alloc (symbol_obstack,
-                                           sizeof (struct type));
-
-  if (main_type == 0)
-    {
-      main_type = btype;
-      bzero (btype, sizeof (struct type));
-      TYPE_MAIN_VARIANT (btype) = main_type;
-    }
-  else
-    {
-      bcopy (main_type, btype, sizeof (struct type));
-      TYPE_NEXT_VARIANT (main_type) = btype;
-    }
-/* TYPE_OFFSET (btype) = offset; */
-  if (via_public)
-    TYPE_FLAGS (btype) |= TYPE_FLAG_VIA_PUBLIC;
-  if (via_virtual)
-    TYPE_FLAGS (btype) |= TYPE_FLAG_VIA_VIRTUAL;
-  /* New type is permanent if type pointed to is permanent.  */
-  if (TYPE_FLAGS (type) & TYPE_FLAG_PERM)
-    TYPE_FLAGS (btype) |= TYPE_FLAG_PERM;
-
-  /* In practice, this is never used.  */
-  TYPE_LENGTH (btype) = 1;
-  TYPE_CODE (btype) = TYPE_CODE_STRUCT;
-
-  return btype;
-}
-#endif
-
-/* Given a type TYPE, return a type of functions that return that type.
-   May need to construct such a type if this is the first use.  */
-
-struct type *
-lookup_function_type (type)
-     struct type *type;
-{
-  register struct type *ptype = TYPE_FUNCTION_TYPE (type);
-  if (ptype) return ptype;
-
-  /* This is the first time anyone wanted a function returning a TYPE.  */
-  if (TYPE_FLAGS (type) & TYPE_FLAG_PERM)
-    ptype  = (struct type *) xmalloc (sizeof (struct type));
-  else
-    ptype  = (struct type *) obstack_alloc (symbol_obstack,
-                                           sizeof (struct type));
-
-  bzero (ptype, sizeof (struct type));
-  TYPE_TARGET_TYPE (ptype) = type;
-  TYPE_FUNCTION_TYPE (type) = ptype;
-  /* New type is permanent if type returned is permanent.  */
-  if (TYPE_FLAGS (type) & TYPE_FLAG_PERM)
-    TYPE_FLAGS (ptype) |= TYPE_FLAG_PERM;
-  TYPE_LENGTH (ptype) = 1;
-  TYPE_CODE (ptype) = TYPE_CODE_FUNC;
-  TYPE_NFIELDS (ptype) = 0;
-  return ptype;
-}
-\f
-/* Create an array type.  Elements will be of type TYPE, and there will
-   be NUM of them.
-
-   Eventually this should be extended to take two more arguments which
-   specify the bounds of the array and the type of the index.
-   It should also be changed to be a "lookup" function, with the
-   appropriate data structures added to the type field.
-   Then read array type should call here.  */
-
-struct type *
-create_array_type (element_type, number)
-     struct type *element_type;
-     int number;
-{
-  struct type *result_type = (struct type *)
-    obstack_alloc (symbol_obstack, sizeof (struct type));
-
-  bzero (result_type, sizeof (struct type));
-
-  TYPE_CODE (result_type) = TYPE_CODE_ARRAY;
-  TYPE_TARGET_TYPE (result_type) = element_type;
-  TYPE_LENGTH (result_type) = number * TYPE_LENGTH (element_type);
-  TYPE_NFIELDS (result_type) = 1;
-  TYPE_FIELDS (result_type) =
-    (struct field *) obstack_alloc (symbol_obstack, sizeof (struct field));
-  TYPE_FIELD_TYPE (result_type, 0) = builtin_type_int;
-  TYPE_VPTR_FIELDNO (result_type) = -1;
-
-  return result_type;
-}
-
-\f
-/* Smash TYPE to be a type of members of DOMAIN with type TO_TYPE.  */
-
-void
-smash_to_member_type (type, domain, to_type)
-     struct type *type, *domain, *to_type;
-{
-  bzero (type, sizeof (struct type));
-  TYPE_TARGET_TYPE (type) = to_type;
-  TYPE_DOMAIN_TYPE (type) = domain;
-
-  /* In practice, this is never needed.  */
-  TYPE_LENGTH (type) = 1;
-  TYPE_CODE (type) = TYPE_CODE_MEMBER;
-
-  TYPE_MAIN_VARIANT (type) = lookup_member_type (domain, to_type);
-}
-
-/* Smash TYPE to be a type of method of DOMAIN with type TO_TYPE.  */
-
-void
-smash_to_method_type (type, domain, to_type, args)
-     struct type *type, *domain, *to_type, **args;
-{
-  bzero (type, sizeof (struct type));
-  TYPE_TARGET_TYPE (type) = to_type;
-  TYPE_DOMAIN_TYPE (type) = domain;
-  TYPE_ARG_TYPES (type) = args;
-
-  /* In practice, this is never needed.  */
-  TYPE_LENGTH (type) = 1;
-  TYPE_CODE (type) = TYPE_CODE_METHOD;
-
-  TYPE_MAIN_VARIANT (type) = lookup_method_type (domain, to_type, args);
-}
-\f
-/* Find which partial symtab on the partial_symtab_list contains
-   PC.  Return 0 if none.  */
-
-struct partial_symtab *
-find_pc_psymtab (pc)
-     register CORE_ADDR pc;
-{
-  register struct partial_symtab *ps;
-
-  for (ps = partial_symtab_list; ps; ps = ps->next)
-    if (pc >= ps->textlow && pc < ps->texthigh)
-      return ps;
-
-  return 0;
+  return (NULL);
 }
 
 /* Find which partial symbol within a psymtab contains PC.  Return 0
@@ -796,8 +324,8 @@ find_pc_psymbol (psymtab, pc)
 
   best_pc = psymtab->textlow - 1;
 
-  for (p = static_psymbols.list + psymtab->statics_offset;
-       (p - (static_psymbols.list + psymtab->statics_offset)
+  for (p = psymtab->objfile->static_psymbols.list + psymtab->statics_offset;
+       (p - (psymtab->objfile->static_psymbols.list + psymtab->statics_offset)
        < psymtab->n_static_syms);
        p++)
     if (SYMBOL_NAMESPACE (p) == VAR_NAMESPACE
@@ -814,6 +342,40 @@ find_pc_psymbol (psymtab, pc)
 }
 
 \f
+/* Function called via iterate_over_msymbols() that tests a minimal symbol
+   to see if the minimal symbol's name is a C++ mangled name that matches
+   a user visible name.  The user visible name (pname) is passed as arg1
+   and the number of leading characters that must match in both the mangled
+   name and the user name (matchcount) is passed as arg2.  Returns a pointer
+   to the minimal symbol if it matches, NULL otherwise. */
+
+static PTR
+cplus_mangled_symbol (objfile, msymbol, arg1, arg2, arg3)
+  struct objfile *objfile;
+  struct minimal_symbol *msymbol;
+  PTR arg1;
+  PTR arg2;
+  PTR arg3;
+{
+  char *pname = (char *) arg1;
+  int matchcount = (int) arg2;
+  char *demangled;
+  struct minimal_symbol *foundit = NULL;
+
+  if (strncmp (msymbol -> name, pname, matchcount) == 0)
+    {
+      if ((demangled = cplus_demangle (msymbol -> name, -1)) != NULL)
+       {
+         if (strcmp (demangled, pname) == 0)
+           {
+             foundit = msymbol;
+           }
+         free (demangled);
+       }
+    }
+  return ((PTR) foundit);
+}
+
 /* Find the definition for a specified symbol name NAME
    in namespace NAMESPACE, visible from lexical block BLOCK.
    Returns the struct symbol pointer, or zero if no symbol is found.
@@ -827,9 +389,9 @@ find_pc_psymbol (psymtab, pc)
 
 struct symbol *
 lookup_symbol (name, block, namespace, is_a_field_of_this, symtab)
-     char *name;
-     register struct block *block;
-     enum namespace namespace;
+     const char *name;
+     register const struct block *block;
+     const enum namespace namespace;
      int *is_a_field_of_this;
      struct symtab **symtab;
 {
@@ -837,6 +399,10 @@ lookup_symbol (name, block, namespace, is_a_field_of_this, symtab)
   register struct symtab *s;
   register struct partial_symtab *ps;
   struct blockvector *bv;
+  register struct objfile *objfile;
+  register struct block *b;
+  register int found;
+  register struct minimal_symbol *msymbol;
 
   /* Search specified block and its superiors.  */
 
@@ -850,23 +416,64 @@ lookup_symbol (name, block, namespace, is_a_field_of_this, symtab)
            {
              /* Search the list of symtabs for one which contains the
                 address of the start of this block.  */
-             struct block *b;
-             for (s = symtab_list; s; s = s->next)
+             for (found = 0, objfile = object_files;
+                  !found && objfile != NULL;
+                  objfile = objfile -> next)
                {
-                 bv = BLOCKVECTOR (s);
-                 b = BLOCKVECTOR_BLOCK (bv, 0);
-                 if (BLOCK_START (b) <= BLOCK_START (block)
-                     && BLOCK_END (b) > BLOCK_START (block))
-                   break;
+                 for (s = objfile -> symtabs; s != NULL; s = s -> next)
+                   {
+                     bv = BLOCKVECTOR (s);
+                     b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
+                     if (BLOCK_START (b) <= BLOCK_START (block)
+                         && BLOCK_END (b) > BLOCK_START (block))
+                       {
+                         found++;
+                         break;
+                       }
+                   }
                }
              *symtab = s;
            }
 
-         return sym;
+         return (sym);
        }
       block = BLOCK_SUPERBLOCK (block);
     }
 
+  /* But that doesn't do any demangling for the STATIC_BLOCK.
+     I'm not sure whether demangling is needed in the case of
+     nested function in inner blocks; if so this needs to be changed.
+     
+     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.  */
+  if (namespace == VAR_NAMESPACE && block != NULL)
+    {
+      struct block *b;
+      /* Find the right symtab.  */
+      for (objfile = object_files; objfile != NULL; objfile = objfile -> next)
+       {
+         for (s = objfile -> symtabs; s != NULL; s = s -> next)
+           {
+             bv = BLOCKVECTOR (s);
+             b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
+             if (BLOCK_START (b) <= BLOCK_START (block)
+                 && BLOCK_END (b) > BLOCK_START (block))
+               {
+                 sym = lookup_demangled_block_symbol (b, name);
+                 if (sym)
+                   {
+                     block_found = b;
+                     if (symtab != NULL)
+                       *symtab = s;
+                     return sym;
+                   }
+               }
+           }
+       }
+    }
+
+
   /* 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)
@@ -885,63 +492,59 @@ lookup_symbol (name, block, namespace, is_a_field_of_this, symtab)
 
   /* Now search all global blocks.  Do the symtab's first, then
      check the psymtab's */
-
-  for (s = symtab_list; s; s = s->next)
+  
+  for (objfile = object_files; objfile != NULL; objfile = objfile -> next)
     {
-      bv = BLOCKVECTOR (s);
-      block = BLOCKVECTOR_BLOCK (bv, 0);
-      sym = lookup_block_symbol (block, name, namespace);
-      if (sym) 
+      for (s = objfile -> symtabs; s != NULL; s = s -> next)
        {
-         block_found = block;
-         if (symtab != NULL)
-           *symtab = s;
-         return sym;
+         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 sym;
+           }
        }
     }
 
   /* Check for the possibility of the symbol being a global function
-     that is stored on the misc function vector.  Eventually, all
+     that is stored in one of the minimal symbol tables.  Eventually, all
      global symbols might be resolved in this way.  */
   
   if (namespace == VAR_NAMESPACE)
     {
-      int ind = lookup_misc_func (name);
-
-      /* Look for a mangled C++ name for NAME. */
-      if (ind == -1)
+      msymbol = lookup_minimal_symbol (name, (struct objfile *) NULL);
+      if (msymbol == NULL)
        {
-         int name_len = strlen (name);
-
-         for (ind = misc_function_count; --ind >= 0; )
-             /* Assume orginal name is prefix of mangled name. */
-             if (!strncmp (misc_function_vector[ind].name, name, name_len))
-               {
-                 char *demangled =
-                     cplus_demangle(misc_function_vector[ind].name, -1);
-                 if (demangled != NULL)
-                   {
-                     int cond = strcmp (demangled, name);
-                     free (demangled);
-                     if (!cond)
-                         break;
-                   }
-               }
-         /* Loop terminates on no match with ind == -1. */
+         /* Look for a mangled C++ name for NAME. */
+         msymbol = (struct minimal_symbol *)
+           iterate_over_msymbols (cplus_mangled_symbol, (PTR) name,
+                                  (PTR) strlen (name), (PTR) NULL);
         }
-
-      if (ind != -1)
+      if (msymbol != NULL)
        {
-         s = find_pc_symtab (misc_function_vector[ind].address);
-         if (s)
+         s = find_pc_symtab (msymbol -> address);
+         /* If S is NULL, there are no debug symbols for this file.
+            Skip this stuff and check for matching static symbols below. */
+         if (s != NULL)
            {
              bv = BLOCKVECTOR (s);
-             block = BLOCKVECTOR_BLOCK (bv, 0);
-             sym = lookup_block_symbol (block, misc_function_vector[ind].name,
-                                        namespace);
-             /* sym == 0 if symbol was found in the misc_function_vector
+             block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
+             sym = lookup_block_symbol (block, msymbol -> name, 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, msymbol -> name,
+                                            namespace);
+               }
+
+             /* sym == 0 if symbol was found in the minimal symbol table
                 but not in the symtab.
-                Return 0 to use the misc_function definition of "foo_".
+                Return 0 to use the msymbol definition of "foo_".
 
                 This happens for Fortran  "foo_" symbols,
                 which are "foo" in the symtab.
@@ -952,62 +555,186 @@ lookup_symbol (name, block, namespace, is_a_field_of_this, symtab)
                 asm("_main:");
                 */
 
-             if (symtab != NULL)
-               *symtab = s;
-             return sym;
+             if (symtab != NULL)
+               *symtab = s;
+             return sym;
+           }
+       }
+    }
+      
+  for (objfile = object_files; objfile != NULL; objfile = objfile -> next)
+    {
+      for (ps = objfile -> psymtabs; ps != NULL; ps = ps->next)
+       {
+         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)
+               error ("Internal: global symbol `%s' found in psymtab but not in symtab", name);
+             if (symtab != NULL)
+               *symtab = s;
+             return sym;
+           }
+       }
+    }
+
+  /* Now search all per-file blocks.
+     Not strictly correct, but more useful than an error.
+     Do the symtabs first, then check the psymtabs */
+
+  for (objfile = object_files; objfile != NULL; objfile = objfile -> next)
+    {
+      for (s = objfile -> symtabs; s != NULL; s = s -> next)
+       {
+         bv = BLOCKVECTOR (s);
+         block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
+         sym = lookup_block_symbol (block, name, namespace);
+         if (sym) 
+           {
+             block_found = block;
+             if (symtab != NULL)
+               *symtab = s;
+             return sym;
+           }
+       }
+    }
+
+  for (objfile = object_files; objfile != NULL; objfile = objfile -> next)
+    {
+      for (ps = objfile -> psymtabs; ps != NULL; ps = ps -> next)
+       {
+         if (!ps->readin && lookup_partial_symbol (ps, name, 0, namespace))
+           {
+             s = PSYMTAB_TO_SYMTAB(ps);
+             bv = BLOCKVECTOR (s);
+             block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
+             sym = lookup_block_symbol (block, name, namespace);
+             if (!sym)
+               error ("Internal: static symbol `%s' found in psymtab but not in symtab", name);
+             if (symtab != NULL)
+               *symtab = s;
+             return sym;
+           }
+       }
+    }
+
+  /* Now search all per-file blocks for static mangled symbols.
+     Do the symtabs first, then check the psymtabs.  */
+
+  if (namespace == VAR_NAMESPACE)
+    {
+      for (objfile = object_files; objfile != NULL; objfile = objfile -> next)
+       {
+         for (s = objfile -> symtabs; s != NULL; s = s -> next)
+           {
+             bv = BLOCKVECTOR (s);
+             block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
+             sym = lookup_demangled_block_symbol (block, name);
+             if (sym) 
+               {
+                 block_found = block;
+                 if (symtab != NULL)
+                   *symtab = s;
+                 return sym;
+               }
+           }
+       }
+
+      for (objfile = object_files; objfile != NULL; objfile = objfile -> next)
+       {
+         for (ps = objfile -> psymtabs; ps != NULL; ps = ps -> next)
+           {
+             if (!ps->readin && lookup_demangled_partial_symbol (ps, name))
+               {
+                 s = PSYMTAB_TO_SYMTAB(ps);
+                 bv = BLOCKVECTOR (s);
+                 block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
+                 sym = lookup_demangled_block_symbol (block, name);
+                 if (!sym)
+                   error ("Internal: mangled static symbol `%s' found in psymtab but not in symtab", name);
+                 if (symtab != NULL)
+                   *symtab = s;
+                 return sym;
+               }
+           }
+       }
+    }
+
+  if (symtab != NULL)
+    *symtab = NULL;
+  return 0;
+}
+
+/* Look for a static demangled symbol in block BLOCK.  */
+
+static struct symbol *
+lookup_demangled_block_symbol (block, name)
+     register const struct block *block;
+     const char *name;
+{
+  register int bot, top, inc;
+  register struct symbol *sym;
+
+  bot = 0;
+  top = BLOCK_NSYMS (block);
+  inc = name[0];
+
+  while (bot < top)
+    {
+      sym = BLOCK_SYM (block, bot);
+      if (SYMBOL_NAME (sym)[0] == inc
+         && SYMBOL_NAMESPACE (sym) == VAR_NAMESPACE)
+       {
+         char *demangled = cplus_demangle(SYMBOL_NAME (sym), -1);
+         if (demangled != NULL)
+           {
+             int cond = strcmp (demangled, name);
+             free (demangled);
+             if (!cond)
+               return sym;
            }
        }
+      bot++;
     }
-      
-  for (ps = partial_symtab_list; ps; ps = ps->next)
-    if (!ps->readin && lookup_partial_symbol (ps, name, 1, namespace))
-      {
-       s = PSYMTAB_TO_SYMTAB(ps);
-       bv = BLOCKVECTOR (s);
-       block = BLOCKVECTOR_BLOCK (bv, 0);
-       sym = lookup_block_symbol (block, name, namespace);
-       if (!sym)
-         fatal ("Internal: global symbol found in psymtab but not in symtab");
-       if (symtab != NULL)
-         *symtab = s;
-       return sym;
-      }
 
-  /* Now search all per-file blocks.
-     Not strictly correct, but more useful than an error.
-     Do the symtabs first, then check the psymtabs */
+  return 0;
+}
+
+/* Look, in partial_symtab PST, for static mangled symbol NAME. */
+
+static struct partial_symbol *
+lookup_demangled_partial_symbol (pst, name)
+     const struct partial_symtab *pst;
+     const char *name;
+{
+  struct partial_symbol *start, *psym;
+  int length = pst->n_static_syms;
+  register int inc = name[0];
 
-  for (s = symtab_list; s; s = s->next)
+  if (!length)
+    return (struct partial_symbol *) 0;
+  
+  start = pst->objfile->static_psymbols.list + pst->statics_offset;
+  for (psym = start; psym < start + length; psym++)
     {
-      bv = BLOCKVECTOR (s);
-      block = BLOCKVECTOR_BLOCK (bv, 1);
-      sym = lookup_block_symbol (block, name, namespace);
-      if (sym) 
+      if (SYMBOL_NAME (psym)[0] == inc
+         && SYMBOL_NAMESPACE (psym) == VAR_NAMESPACE)
        {
-         block_found = block;
-         if (symtab != NULL)
-           *symtab = s;
-         return sym;
+         char *demangled = cplus_demangle(SYMBOL_NAME (psym), -1);
+         if (demangled != NULL)
+           {
+             int cond = strcmp (demangled, name);
+             free (demangled);
+             if (!cond)
+               return psym;
+           }
        }
     }
 
-  for (ps = partial_symtab_list; ps; ps = ps->next)
-    if (!ps->readin && lookup_partial_symbol (ps, name, 0, namespace))
-      {
-       s = PSYMTAB_TO_SYMTAB(ps);
-       bv = BLOCKVECTOR (s);
-       block = BLOCKVECTOR_BLOCK (bv, 1);
-       sym = lookup_block_symbol (block, name, namespace);
-       if (!sym)
-         fatal ("Internal: static symbol found in psymtab but not in symtab");
-       if (symtab != NULL)
-         *symtab = s;
-       return sym;
-      }
-
-  if (symtab != NULL)
-    *symtab = NULL;
-  return 0;
+  return (struct partial_symbol *) 0;
 }
 
 /* Look, in partial_symtab PST, for symbol NAME.  Check the global
@@ -1016,7 +743,7 @@ lookup_symbol (name, block, namespace, is_a_field_of_this, symtab)
 static struct partial_symbol *
 lookup_partial_symbol (pst, name, global, namespace)
      struct partial_symtab *pst;
-     char *name;
+     const char *name;
      int global;
      enum namespace namespace;
 {
@@ -1027,8 +754,8 @@ lookup_partial_symbol (pst, name, global, namespace)
     return (struct partial_symbol *) 0;
   
   start = (global ?
-          global_psymbols.list + pst->globals_offset :
-          static_psymbols.list + pst->statics_offset  );
+          pst->objfile->global_psymbols.list + pst->globals_offset :
+          pst->objfile->static_psymbols.list + pst->statics_offset  );
 
   if (global)                  /* This means we can use a binary */
                                /* search.  */
@@ -1073,13 +800,34 @@ lookup_partial_symbol (pst, name, global, namespace)
   return (struct partial_symbol *) 0;
 }
 
+/* Find the psymtab containing main(). */
+
+struct partial_symtab *
+find_main_psymtab ()
+{
+  register struct partial_symtab *pst;
+  register struct objfile *objfile;
+
+  for (objfile = object_files; objfile != NULL; objfile = objfile -> next)
+    {
+      for (pst = objfile -> psymtabs; pst; pst = pst->next)
+       {
+         if (lookup_partial_symbol (pst, "main", 1, VAR_NAMESPACE))
+           {
+             return (pst);
+           }
+       }
+    }
+  return (NULL);
+}
+
 /* Look for a symbol in block BLOCK.  */
 
 struct symbol *
 lookup_block_symbol (block, name, namespace)
-     register struct block *block;
-     char *name;
-     enum namespace namespace;
+     register const struct block *block;
+     const char *name;
+     const enum namespace namespace;
 {
   register int bot, top, inc;
   register struct symbol *sym, *parameter_sym;
@@ -1189,31 +937,44 @@ find_pc_symtab (pc)
 {
   register struct block *b;
   struct blockvector *bv;
-  register struct symtab *s;
+  register struct symtab *s = 0;
   register struct partial_symtab *ps;
+  register struct objfile *objfile;
+  register int found;
 
   /* Search all symtabs for one whose file contains our pc */
 
-  for (s = symtab_list; s; s = s->next)
+  for (found = 0, objfile = object_files;
+       !found && objfile != NULL;
+       objfile = objfile -> next)
     {
-      bv = BLOCKVECTOR (s);
-      b = BLOCKVECTOR_BLOCK (bv, 0);
-      if (BLOCK_START (b) <= pc
-         && BLOCK_END (b) > pc)
-       break;
+      for (s = objfile -> symtabs; s != NULL; s = s -> next)
+       {
+         bv = BLOCKVECTOR (s);
+         b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
+         if (BLOCK_START (b) <= pc
+             && BLOCK_END (b) > pc)
+           {
+             found++;
+             break;
+           }
+       }
     }
 
   if (!s)
     {
       ps = find_pc_psymtab (pc);
       if (ps && ps->readin)
-       fatal ("Internal error: pc in read in psymtab, but not in symtab.");
-
+       {
+         printf_filtered ("(Internal error: pc 0x%x in read in psymtab, but not in symtab.)\n", pc);
+       }
       if (ps)
-       s = PSYMTAB_TO_SYMTAB (ps);
+       {
+         s = PSYMTAB_TO_SYMTAB (ps);
+       }
     }
 
-  return s;
+  return (s);
 }
 
 /* Find the source file and line number for a given PC value.
@@ -1291,6 +1052,8 @@ find_pc_line (pc, notcurrent)
     {
       /* Find the best line in this symtab.  */
       l = LINETABLE (s);
+      if (!l)
+        continue;
       len = l->nitems;
       prev_line = -1;
       first_line = -1;
@@ -1320,10 +1083,10 @@ find_pc_line (pc, notcurrent)
          best_pc = prev_pc;
          best_line = prev_line;
          best_symtab = s;
-         if (i < len)
+         /* If another line is in the linetable, and its PC is closer
+            than the best_end we currently have, take it as best_end.  */
+         if (i < len && (best_end == 0 || best_end > item->pc))
            best_end = item->pc;
-         else
-           best_end = 0;
        }
       /* Is this file's first line closer than the first lines of other files?
         If so, record this file, and its first line, as best alternate.  */
@@ -1339,7 +1102,7 @@ find_pc_line (pc, notcurrent)
     {
       val.symtab = alt_symtab;
       val.line = alt_line - 1;
-      val.pc = BLOCK_END (BLOCKVECTOR_BLOCK (bv, 0));
+      val.pc = BLOCK_END (BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK));
       val.end = alt_pc;
     }
   else
@@ -1347,9 +1110,12 @@ find_pc_line (pc, notcurrent)
       val.symtab = best_symtab;
       val.line = best_line;
       val.pc = best_pc;
-      val.end = (best_end ? best_end
-                  : (alt_pc ? alt_pc
-                     : BLOCK_END (BLOCKVECTOR_BLOCK (bv, 0))));
+      if (best_end && (alt_pc == 0 || best_end < alt_pc))
+       val.end = best_end;
+      else if (alt_pc)
+       val.end = alt_pc;
+      else
+       val.end = BLOCK_END (BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK));
     }
   return val;
 }
@@ -1371,7 +1137,7 @@ find_line_pc (symtab, line)
     return 0;
   l = LINETABLE (symtab);
   ind = find_line_common(l, line, &dummy);
-  return ind ? l->item[ind].pc : 0;
+  return (ind >= 0) ? l->item[ind].pc : 0;
 }
 
 /* Find the range of pc values in a line.
@@ -1395,7 +1161,7 @@ find_line_pc_range (symtab, thisline, startptr, endptr)
 
   l = LINETABLE (symtab);
   ind = find_line_common (l, thisline, &exact_match);
-  if (ind)
+  if (ind >= 0)
     {
       *startptr = l->item[ind].pc;
       /* If we have not seen an entry for the specified line,
@@ -1418,7 +1184,7 @@ find_line_pc_range (symtab, thisline, startptr, endptr)
 
 /* Given a line table and a line number, return the index into the line
    table for the pc of the nearest line whose number is >= the specified one.
-   Return 0 if none is found.  The value is never zero is it is an index.
+   Return -1 if none is found.  The value is >= 0 if it is an index.
 
    Set *EXACT_MATCH nonzero if the value returned is an exact match.  */
 
@@ -1435,11 +1201,13 @@ find_line_common (l, lineno, exact_match)
      or 0 if none has been seen so far.
      BEST_INDEX identifies the item for it.  */
 
-  int best_index = 0;
+  int best_index = -1;
   int best = 0;
 
   if (lineno <= 0)
-    return 0;
+    return -1;
+  if (l == 0)
+    return -1;
 
   len = l->nitems;
   for (i = 0; i < len; i++)
@@ -1477,6 +1245,91 @@ find_pc_line_pc_range (pc, startptr, endptr)
   return sal.symtab != 0;
 }
 \f
+/* If P is of the form "operator[ \t]+..." where `...' is
+   some legitimate operator text, return a pointer to the
+   beginning of the substring of the operator text.
+   Otherwise, return "".  */
+static char *
+operator_chars (p, end)
+     char *p;
+     char **end;
+{
+  *end = "";
+  if (strncmp (p, "operator", 8))
+    return *end;
+  p += 8;
+
+  /* Don't get faked out by `operator' being part of a longer
+     identifier.  */
+  if (isalpha(*p) || *p == '_' || *p == '$' || *p == '\0')
+    return *end;
+
+  /* Allow some whitespace between `operator' and the operator symbol.  */
+  while (*p == ' ' || *p == '\t')
+    p++;
+
+  /* Recognize 'operator TYPENAME'. */
+
+  if (isalpha(*p) || *p == '_' || *p == '$')
+    {
+      register char *q = p+1;
+      while (isalnum(*q) || *q == '_' || *q == '$')
+       q++;
+      *end = q;
+      return p;
+    }
+
+  switch (*p)
+    {
+    case '!':
+    case '=':
+    case '*':
+    case '/':
+    case '%':
+    case '^':
+      if (p[1] == '=')
+       *end = p+2;
+      else
+       *end = p+1;
+      return p;
+    case '<':
+    case '>':
+    case '+':
+    case '-':
+    case '&':
+    case '|':
+      if (p[1] == '=' || p[1] == p[0])
+       *end = p+2;
+      else
+       *end = p+1;
+      return p;
+    case '~':
+    case ',':
+      *end = p+1;
+      return p;
+    case '(':
+      if (p[1] != ')')
+       error ("`operator ()' must be specified without whitespace in `()'");
+      *end = p+2;
+      return p;
+    case '?':
+      if (p[1] != ':')
+       error ("`operator ?:' must be specified without whitespace in `?:'");
+      *end = p+2;
+      return p;
+    case '[':
+      if (p[1] != ']')
+       error ("`operator []' must be specified without whitespace in `[]'");
+      *end = p+2;
+      return p;
+    default:
+      error ("`operator %s' not supported", p);
+      break;
+    }
+  *end = "";
+  return *end;
+}
+
 /* Recursive helper function for decode_line_1.
  * Look for methods named NAME in type T.
  * Return number of matches.
@@ -1487,7 +1340,7 @@ find_pc_line_pc_range (pc, startptr, endptr)
  */
 
 int
-find_methods(t, name, physnames, sym_arr)
+find_methods (t, name, physnames, sym_arr)
      struct type *t;
      char *name;
      char **physnames;
@@ -1539,7 +1392,7 @@ find_methods(t, name, physnames, sym_arr)
                 --field_counter)
              {
                char *phys_name;
-               if (TYPE_FLAGS (TYPE_FN_FIELD_TYPE (f, field_counter)) & TYPE_FLAG_STUB)
+               if (TYPE_FN_FIELD_STUB (f, field_counter))
                  check_stub_method (t, method_counter, field_counter);
                phys_name = TYPE_FN_FIELD_PHYSNAME (f, field_counter);
                physnames[i1] = (char*) alloca (strlen (phys_name) + 1);
@@ -1550,6 +1403,12 @@ find_methods(t, name, physnames, sym_arr)
                                             (int *) NULL,
                                             (struct symtab **) NULL);
                if (sym_arr[i1]) i1++;
+               else
+                 {
+                   fputs_filtered("(Cannot find method ", stdout);
+                   fputs_demangled(phys_name, stdout, 0);
+                   fputs_filtered(" - possibly inlined.)\n", stdout);
+                 }
              }
        }
     }
@@ -1579,7 +1438,7 @@ find_methods(t, name, physnames, sym_arr)
    FILE:FUNCTION -- likewise, but prefer functions in that file.
    *EXPR -- line in which address EXPR appears.
 
-   FUNCTION may be an undebuggable function found in misc_function_vector.
+   FUNCTION may be an undebuggable function found in minimal symbol table.
 
    If the argument FUNFIRSTLINE is nonzero, we want the first line
    of real code inside a function when a function is specified.
@@ -1600,10 +1459,10 @@ decode_line_1 (argptr, funfirstline, default_symtab, default_line)
      struct symtab *default_symtab;
      int default_line;
 {
-  struct symtabs_and_lines decode_line_2 ();
   struct symtabs_and_lines values;
   struct symtab_and_line val;
   register char *p, *p1;
+  char *q, *q1;
   register struct symtab *s;
 
   register struct symbol *sym;
@@ -1611,7 +1470,7 @@ decode_line_1 (argptr, funfirstline, default_symtab, default_line)
   struct symtab *sym_symtab;
 
   register CORE_ADDR pc;
-  register int i;
+  register struct minimal_symbol *msymbol;
   char *copy;
   struct symbol *sym_class;
   int i1;
@@ -1674,16 +1533,34 @@ decode_line_1 (argptr, funfirstline, default_symtab, default_line)
                                     (struct symtab **)NULL);
        
          if (sym_class &&
-             (TYPE_CODE (SYMBOL_TYPE (sym_class)) == TYPE_CODE_STRUCT
+             (   TYPE_CODE (SYMBOL_TYPE (sym_class)) == TYPE_CODE_STRUCT
               || TYPE_CODE (SYMBOL_TYPE (sym_class)) == TYPE_CODE_UNION))
            {
              /* Arg token is not digits => try it as a function name
                 Find the next token (everything up to end or next whitespace). */
              p = *argptr;
              while (*p && *p != ' ' && *p != '\t' && *p != ',' && *p !=':') p++;
-             copy = (char *) alloca (p - *argptr + 1);
-             bcopy (*argptr, copy, p - *argptr);
-             copy[p - *argptr] = '\0';
+             q = operator_chars (*argptr, &q1);
+
+             if (q1 - q)
+               {
+                 char *opname;
+                 char *tmp = alloca (q1 - q + 1);
+                 memcpy (tmp, q, q1 - q);
+                 tmp[q1 - q] = '\0';
+                 opname = cplus_mangle_opname (tmp, 1);
+                 if (opname == NULL)
+                   error ("No mangling for \"%s\"", tmp);
+                 copy = (char*) alloca (3 + strlen(opname));
+                 sprintf (copy, "__%s", opname);
+                 p = q1;
+               }
+             else
+               {
+                 copy = (char *) alloca (p - *argptr + 1 + (q1 - q));
+                 bcopy (*argptr, copy, p - *argptr);
+                 copy[p - *argptr] = '\0';
+               }
 
              /* no line number may be specified */
              while (*p == ' ' || *p == '\t') p++;
@@ -1739,7 +1616,24 @@ decode_line_1 (argptr, funfirstline, default_symtab, default_line)
                  return decode_line_2 (sym_arr, i1, funfirstline);
                }
              else
-               error ("that class does not have any method named %s",copy);
+               {
+                 char *tmp;
+
+                 if (OPNAME_PREFIX_P (copy))
+                   {
+                     tmp = (char *)alloca (strlen (copy+3) + 9);
+                     strcpy (tmp, "operator ");
+                     strcat (tmp, copy+3);
+                   }
+                 else
+                   tmp = copy;
+                 if (tmp[0] == '~')
+                   error ("The class `%s' does not have destructor defined",
+                          sym_class->name);
+                 else
+                   error ("The class %s does not have any method named %s",
+                          sym_class->name, tmp);
+               }
            }
          else
            /* The quotes are important if copy is empty.  */
@@ -1759,7 +1653,7 @@ decode_line_1 (argptr, funfirstline, default_symtab, default_line)
       s = lookup_symtab (copy);
       if (s == 0)
        {
-         if (symtab_list == 0 && partial_symtab_list == 0)
+         if (!have_full_symbols () && !have_partial_symbols ())
            error (no_symtab_msg);
          error ("No source file named %s.", copy);
        }
@@ -1792,8 +1686,6 @@ decode_line_1 (argptr, funfirstline, default_symtab, default_line)
 
       if (s == 0 && default_symtab == 0)
        {
-         if (symtab_list == 0 && partial_symtab_list == 0)
-           error (no_symtab_msg);
          select_source_symtab (0);
          default_symtab = current_source_symtab;
          default_line = current_source_line;
@@ -1838,6 +1730,7 @@ decode_line_1 (argptr, funfirstline, default_symtab, default_line)
 
   /* Arg token is not digits => try it as a variable name
      Find the next token (everything up to end or next whitespace).  */
+
   p = *argptr;
   while (*p && *p != ' ' && *p != '\t' && *p != ',') p++;
   copy = (char *) alloca (p - *argptr + 1);
@@ -1850,7 +1743,7 @@ decode_line_1 (argptr, funfirstline, default_symtab, default_line)
      If file specified, use that file's per-file block to start with.  */
 
   sym = lookup_symbol (copy,
-                      (s ? BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), 1)
+                      (s ? BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), STATIC_BLOCK)
                        : get_selected_block ()),
                       VAR_NAMESPACE, 0, &sym_symtab);
 
@@ -1867,7 +1760,16 @@ decode_line_1 (argptr, funfirstline, default_symtab, default_line)
          /* Convex: no need to suppress code on first line, if any */
          val.pc = pc;
 #else
-         val.pc = (val.end && val.pc != pc) ? val.end : pc;
+         /* If SKIP_PROLOGUE left us in mid-line, and the next line is still
+            part of the same function:
+               advance to next line, 
+               recalculate its line number (might not be N+1).  */
+         if (val.pc != pc && val.end &&
+             lookup_minimal_symbol_by_pc (pc) == lookup_minimal_symbol_by_pc (val.end)) {
+           pc = val.end;       /* First pc of next line */
+           val = find_pc_line (pc, 0);
+         }
+         val.pc = pc;
 #endif
          values.sals = (struct symtab_and_line *)xmalloc (sizeof (struct symtab_and_line));
          values.sals[0] = val;
@@ -1899,14 +1801,12 @@ decode_line_1 (argptr, funfirstline, default_symtab, default_line)
        error ("Line number not known for symbol \"%s\"", copy);
     }
 
-  if (symtab_list == 0 && partial_symtab_list == 0)
-    error (no_symtab_msg);
-
-  if ((i = lookup_misc_func (copy)) >= 0)
+  msymbol = lookup_minimal_symbol (copy, (struct objfile *) NULL);
+  if (msymbol != NULL)
     {
       val.symtab = 0;
       val.line = 0;
-      val.pc = misc_function_vector[i].address + FUNCTION_START_OFFSET;
+      val.pc = msymbol -> address + FUNCTION_START_OFFSET;
       if (funfirstline)
        SKIP_PROLOGUE (val.pc);
       values.sals = (struct symtab_and_line *)xmalloc (sizeof (struct symtab_and_line));
@@ -1915,6 +1815,10 @@ decode_line_1 (argptr, funfirstline, default_symtab, default_line)
       return values;
     }
 
+  if (!have_full_symbols () &&
+      !have_partial_symbols () && !have_minimal_symbols ())
+    error (no_symtab_msg);
+
   error ("Function %s not defined.", copy);
   return values;       /* for lint */
 }
@@ -1937,16 +1841,15 @@ decode_line_spec (string, funfirstline)
 /* Given a list of NELTS symbols in sym_arr (with corresponding
    mangled names in physnames), return a list of lines to operate on
    (ask user if necessary).  */
-struct symtabs_and_lines
+static struct symtabs_and_lines
 decode_line_2 (sym_arr, nelts, funfirstline)
      struct symbol *sym_arr[];
      int nelts;
      int funfirstline;
 {
-  char *getenv();
   struct symtabs_and_lines values, return_values;
   register CORE_ADDR pc;
-  char *args, *arg1, *command_line_input ();
+  char *args, *arg1;
   int i;
   char *prompt;
 
@@ -1981,7 +1884,7 @@ decode_line_2 (sym_arr, nelts, funfirstline)
   printf("%s ",prompt);
   fflush(stdout);
 
-  args = command_line_input (0, 0);
+  args = command_line_input ((char *) NULL, 0);
   
   if (args == 0)
     error_no_arg ("one or more choice numbers");
@@ -2032,19 +1935,6 @@ decode_line_2 (sym_arr, nelts, funfirstline)
   return return_values;
 }
 
-/* Return the index of misc function named NAME.  */
-
-int
-lookup_misc_func (name)
-     register char *name;
-{
-  register int i;
-
-  for (i = 0; i < misc_function_count; i++)
-    if (!strcmp (misc_function_vector[i].name, name))
-      return i;
-  return -1;           /* not found */
-}
 \f
 /* Slave routine for sources_info.  Force line breaks at ,'s.
    NAME is the name to print and *FIRST is nonzero if this is the first
@@ -2054,7 +1944,7 @@ output_source_filename (name, first)
      char *name;
      int *first;
 {
-  static int column;
+  static unsigned int column;
   /* Table of files printed so far.  Since a single source file can
      result in several partial symbol tables, we need to avoid printing
      it more than once.  Note: if some of the psymtabs are read in and
@@ -2089,7 +1979,7 @@ output_source_filename (name, first)
   if (tab_cur_size == tab_alloc_size)
     {
       tab_alloc_size *= 2;
-      tab = (char **) xrealloc (tab, tab_alloc_size * sizeof (*tab));
+      tab = (char **) xrealloc ((char *) tab, tab_alloc_size * sizeof (*tab));
     }
   tab[tab_cur_size++] = name;
 
@@ -2123,34 +2013,62 @@ sources_info ()
 {
   register struct symtab *s;
   register struct partial_symtab *ps;
+  register struct objfile *objfile;
   int first;
   
-  if (symtab_list == 0 && partial_symtab_list == 0)
+  if (!have_full_symbols () && !have_partial_symbols ())
     {
-      printf (no_symtab_msg);
-      return;
+      error (no_symtab_msg);
     }
   
   printf_filtered ("Source files for which symbols have been read in:\n\n");
 
   first = 1;
-  for (s = symtab_list; s; s = s->next)
-    output_source_filename (s->filename, &first);
+  for (objfile = object_files; objfile != NULL; objfile = objfile -> next)
+    {
+      for (s = objfile -> symtabs; s != NULL; s = s -> next)
+       {
+         output_source_filename (s -> filename, &first);
+       }
+    }
   printf_filtered ("\n\n");
   
   printf_filtered ("Source files for which symbols will be read in on demand:\n\n");
 
   first = 1;
-  for (ps = partial_symtab_list; ps; ps = ps->next)
-    if (!ps->readin)
-      output_source_filename (ps->filename, &first);
+  for (objfile = object_files; objfile != NULL; objfile = objfile -> next)
+    {
+      for (ps = objfile -> psymtabs; ps != NULL; ps = ps -> next)
+       {
+         if (!ps->readin)
+           {
+             output_source_filename (ps -> filename, &first);
+           }
+       }
+    }
   printf_filtered ("\n");
 }
 
+static int
+name_match(name)
+     char *name;
+{
+  char *demangled = cplus_demangle(name, -1);
+  if (demangled != NULL)
+    {
+      int cond = re_exec (demangled);
+      free (demangled);
+      return cond;
+    }
+  return re_exec(name);
+}
+#define NAME_MATCH(NAME) name_match(NAME)
+
 /* List all symbols (if REGEXP is 0) or all symbols matching REGEXP.
    If CLASS is zero, list all symbols except functions and type names.
    If CLASS is 1, list only functions.
    If CLASS is 2, list only type names.
+   If CLASS is 3, list only method names.
 
    BPT is non-zero if we should set a breakpoint at the functions
    we find.  */
@@ -2169,78 +2087,138 @@ list_symbols (regexp, class, bpt)
   register int i, j;
   register struct symbol *sym;
   struct partial_symbol *psym;
-  char *val;
+  struct objfile *objfile;
+  struct minimal_symbol *msymbol;
+  char *val, *q2;
+/*  char *mangled;*/
   static char *classnames[]
     = {"variable", "function", "type", "method"};
   int found_in_file = 0;
+  int found_misc = 0;
+  static enum minimal_symbol_type types[]
+    = {mst_data, mst_text, mst_abs, mst_unknown};
+  static enum minimal_symbol_type types2[]
+    = {mst_bss,  mst_text, mst_abs, mst_unknown};
+  enum minimal_symbol_type ourtype = types[class];
+  enum minimal_symbol_type ourtype2 = types2[class];
+
 
   if (regexp)
-    if (0 != (val = (char *) re_comp (regexp)))
-      error ("Invalid regexp (%s): %s", val, regexp);
+    {
+      /* Make sure spacing is right for C++ operators.
+        This is just a courtesy to make the matching less sensitive
+        to how many spaces the user leaves between 'operator'
+        and <TYPENAME> or <OPERATOR>. */
+      char *opend;
+      char *opname = operator_chars (regexp, &opend);
+      if (*opname)
+       {
+          int fix = -1; /* -1 means ok; otherwise number of spaces needed. */
+         if (isalpha(*opname) || *opname == '_' || *opname == '$')
+           {
+             /* There should 1 space between 'operator' and 'TYPENAME'. */
+             if (opname[-1] != ' ' || opname[-2] == ' ')
+               fix = 1;
+           }
+         else
+           {
+             /* There should 0 spaces between 'operator' and 'OPERATOR'. */
+             if (opname[-1] == ' ')
+               fix = 0;
+           }
+         /* If wrong number of spaces, fix it. */
+         if (fix >= 0)
+           {
+             char *tmp = (char*) alloca(opend-opname+10);
+             sprintf(tmp, "operator%.*s%s", fix, " ", opname);
+             regexp = tmp;
+           }
+        }
+      
+      if (0 != (val = re_comp (regexp)))
+       error ("Invalid regexp (%s): %s", val, regexp);
+    }
 
-  /* Search through the partial_symtab_list *first* for all symbols
+  /* Search through the partial symtabs *first* for all symbols
      matching the regexp.  That way we don't have to reproduce all of
      the machinery below. */
-  for (ps = partial_symtab_list; ps; ps = ps->next)
-    {
-      struct partial_symbol *bound, *gbound, *sbound;
-      int keep_going = 1;
 
-      if (ps->readin) continue;
-      
-      gbound = global_psymbols.list + ps->globals_offset + ps->n_global_syms;
-      sbound = static_psymbols.list + ps->statics_offset + ps->n_static_syms;
-      bound = gbound;
-
-      /* Go through all of the symbols stored in a partial
-        symtab in one loop. */
-      psym = global_psymbols.list + ps->globals_offset;
-      while (keep_going)
+  for (objfile = object_files; objfile != NULL; objfile = objfile -> next)
+    {
+      for (ps = objfile -> psymtabs; ps != NULL; ps = ps -> next)
        {
-         if (psym >= bound)
+         struct partial_symbol *bound, *gbound, *sbound;
+         int keep_going = 1;
+         
+         if (ps->readin) continue;
+         
+         gbound = objfile->global_psymbols.list + ps->globals_offset + ps->n_global_syms;
+         sbound = objfile->static_psymbols.list + ps->statics_offset + ps->n_static_syms;
+         bound = gbound;
+         
+         /* Go through all of the symbols stored in a partial
+            symtab in one loop. */
+         psym = objfile->global_psymbols.list + ps->globals_offset;
+         while (keep_going)
            {
-             if (bound == gbound && ps->n_static_syms != 0)
+             if (psym >= bound)
                {
-                 psym = static_psymbols.list + ps->statics_offset;
-                 bound = sbound;
+                 if (bound == gbound && ps->n_static_syms != 0)
+                   {
+                     psym = objfile->static_psymbols.list + ps->statics_offset;
+                     bound = sbound;
+                   }
+                 else
+                   keep_going = 0;
+                 continue;
                }
              else
-               keep_going = 0;
-           }
-         else
-           {
-             QUIT;
-
-             /* If it would match (logic taken from loop below)
-                load the file and go on to the next one */
-             if ((regexp == 0 || re_exec (SYMBOL_NAME (psym)))
-                 && ((class == 0 && SYMBOL_CLASS (psym) != LOC_TYPEDEF
-                      && SYMBOL_CLASS (psym) != LOC_BLOCK)
-                     || (class == 1 && SYMBOL_CLASS (psym) == LOC_BLOCK)
-                     || (class == 2 && SYMBOL_CLASS (psym) == LOC_TYPEDEF)
-                     || (class == 3 && SYMBOL_CLASS (psym) == LOC_BLOCK)))
                {
-                 (void) PSYMTAB_TO_SYMTAB(ps);
-                 keep_going = 0;
+                 QUIT;
+
+                 /* If it would match (logic taken from loop below)
+                    load the file and go on to the next one */
+                 if ((regexp == 0 || NAME_MATCH (SYMBOL_NAME (psym)))
+                     && ((class == 0 && SYMBOL_CLASS (psym) != LOC_TYPEDEF
+                          && SYMBOL_CLASS (psym) != LOC_BLOCK)
+                         || (class == 1 && SYMBOL_CLASS (psym) == LOC_BLOCK)
+                         || (class == 2 && SYMBOL_CLASS (psym) == LOC_TYPEDEF)
+                         || (class == 3 && SYMBOL_CLASS (psym) == LOC_BLOCK)))
+                   {
+                     (void) PSYMTAB_TO_SYMTAB(ps);
+                     keep_going = 0;
+                   }
                }
+             psym++;
            }
-         psym++;
        }
     }
 
-  /* Here, *if* the class is correct (function only, right now), we
-     search through the misc function vector for symbols that
+  /* Here, we search through the minimal symbol tables for functions that
      match, and call find_pc_symtab on them to force their symbols to
      be read.  The symbol will then be found during the scan of symtabs
-     below.  */
+     below.  If find_pc_symtab fails, set found_misc so that we will
+     rescan to print any matching symbols without debug info.  */
 
   if (class == 1)
     {
-      for (i = 0; i < misc_function_count; i++)
-       if (regexp == 0 || re_exec (misc_function_vector[i].name))
-         {
-           (void) find_pc_symtab (misc_function_vector[i].address);
-         }
+      for (objfile = object_files; objfile != NULL; objfile = objfile -> next)
+       {
+         for (msymbol = objfile -> msymbols;
+              msymbol -> name != NULL; msymbol++)
+           {
+             if (msymbol -> type == ourtype || msymbol -> type == ourtype2)
+               {
+                 if (regexp == 0 || NAME_MATCH (msymbol -> name))
+                   {
+                     if (0 == find_pc_symtab (msymbol -> address))
+                       {
+                         found_misc = 1;
+                       }
+                   }
+               }
+           }
+       }
     }
 
   /* Printout here so as to get after the "Reading in symbols"
@@ -2252,86 +2230,123 @@ list_symbols (regexp, class, bpt)
          classnames[class],
          regexp);
 
-  for (s = symtab_list; s; s = s->next)
+  for (objfile = object_files; objfile != NULL; objfile = objfile -> next)
     {
-      found_in_file = 0;
-      bv = BLOCKVECTOR (s);
-      /* Often many files share a blockvector.
-        Scan each blockvector only once so that
-        we don't get every symbol many times.
-        It happens that the first symtab in the list
-        for any given blockvector is the main file.  */
-      if (bv != prev_bv)
-       for (i = 0; i < 2; i++)
-         {
-           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++)
+      for (s = objfile -> symtabs; s != NULL; s = s -> next)
+       {
+         found_in_file = 0;
+         bv = BLOCKVECTOR (s);
+         /* Often many files share a blockvector.
+            Scan each blockvector only once so that
+            we don't get every symbol many times.
+            It happens that the first symtab in the list
+            for any given blockvector is the main file.  */
+         if (bv != prev_bv)
+           for (i = GLOBAL_BLOCK; i <= STATIC_BLOCK; i++)
              {
-               QUIT;
-               sym = BLOCK_SYM (b, j);
-               if ((regexp == 0 || re_exec (SYMBOL_NAME (sym)))
-                   && ((class == 0 && SYMBOL_CLASS (sym) != LOC_TYPEDEF
-                        && SYMBOL_CLASS (sym) != LOC_BLOCK)
-                       || (class == 1 && SYMBOL_CLASS (sym) == LOC_BLOCK)
-                       || (class == 2 && SYMBOL_CLASS (sym) == LOC_TYPEDEF)
-                       || (class == 3 && SYMBOL_CLASS (sym) == LOC_BLOCK)))
+               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++)
                  {
-                   if (bpt)
-                     {
-                       /* Set a breakpoint here, if it's a function */
-                       if (class == 1)
-                         break_command (SYMBOL_NAME(sym), 0);
-                     }
-                   else if (!found_in_file)
-                     {
-                       fputs_filtered ("\nFile ", stdout);
-                       fputs_filtered (s->filename, stdout);
-                       fputs_filtered (":\n", stdout);
-                     }
-                   found_in_file = 1;
-
-                   if (class != 2 && i == 1)
-                     printf_filtered ("static ");
-                   if (class == 2
-                       && SYMBOL_NAMESPACE (sym) != STRUCT_NAMESPACE)
-                     printf_filtered ("typedef ");
-
-                   if (class < 3)
+                   QUIT;
+                   sym = BLOCK_SYM (b, j);
+                   if ((regexp == 0 || NAME_MATCH (SYMBOL_NAME (sym)))
+                       && ((class == 0 && SYMBOL_CLASS (sym) != LOC_TYPEDEF
+                            && SYMBOL_CLASS (sym) != LOC_BLOCK)
+                           || (class == 1 && SYMBOL_CLASS (sym) == LOC_BLOCK)
+                           || (class == 2 && SYMBOL_CLASS (sym) == LOC_TYPEDEF)
+                           || (class == 3 && SYMBOL_CLASS (sym) == LOC_BLOCK)))
                      {
-                       type_print (SYMBOL_TYPE (sym),
-                                   (SYMBOL_CLASS (sym) == LOC_TYPEDEF
-                                    ? "" : SYMBOL_NAME (sym)),
-                                   stdout, 0);
-
+                       if (bpt)
+                         {
+                           /* Set a breakpoint here, if it's a function */
+                           if (class == 1)
+                             break_command (SYMBOL_NAME(sym), 0);
+                         }
+                       else if (!found_in_file)
+                         {
+                           fputs_filtered ("\nFile ", stdout);
+                           fputs_filtered (s->filename, stdout);
+                           fputs_filtered (":\n", stdout);
+                         }
+                       found_in_file = 1;
+                       
+                       if (class != 2 && i == STATIC_BLOCK)
+                         printf_filtered ("static ");
+                       
+                       /* Typedef that is not a C++ class */
                        if (class == 2
-                           && SYMBOL_NAMESPACE (sym) != STRUCT_NAMESPACE
-                           && (TYPE_NAME ((SYMBOL_TYPE (sym))) == 0
-                               || 0 != strcmp (TYPE_NAME ((SYMBOL_TYPE (sym))),
-                                               SYMBOL_NAME (sym))))
+                           && SYMBOL_NAMESPACE (sym) != STRUCT_NAMESPACE)
+                         typedef_print (SYMBOL_TYPE(sym), sym, stdout);
+                       /* variable, func, or typedef-that-is-c++-class */
+                       else if (class < 2 || 
+                                (class == 2 && 
+                                 SYMBOL_NAMESPACE(sym) == STRUCT_NAMESPACE))
                          {
-                           fputs_filtered (" ", stdout);
-                           fprint_symbol (stdout, SYMBOL_NAME (sym));
+                           type_print (SYMBOL_TYPE (sym),
+                                       (SYMBOL_CLASS (sym) == LOC_TYPEDEF
+                                        ? "" : SYMBOL_NAME (sym)),
+                                       stdout, 0);
+                           
+                           printf_filtered (";\n");
                          }
-
-                       printf_filtered (";\n");
-                     }
-                   else
-                     {
+                       else
+                         {
 # if 0
-                       char buf[1024];
-                       type_print_base (TYPE_FN_FIELD_TYPE(t, i), stdout, 0, 0); 
-                       type_print_varspec_prefix (TYPE_FN_FIELD_TYPE(t, i), stdout, 0); 
-                       sprintf (buf, " %s::", type_name_no_tag (t));
-                       type_print_method_args (TYPE_FN_FIELD_ARGS (t, i), buf, name, stdout);
+                           char buf[1024];
+                           type_print_base (TYPE_FN_FIELD_TYPE(t, i), stdout, 0, 0); 
+                           type_print_varspec_prefix (TYPE_FN_FIELD_TYPE(t, i), stdout, 0); 
+                           sprintf (buf, " %s::", type_name_no_tag (t));
+                           type_print_method_args (TYPE_FN_FIELD_ARGS (t, i), buf, name, stdout);
 # endif
+                         }
                      }
                  }
              }
-         }
-      prev_bv = bv;
+         prev_bv = bv;
+       }
+    }
+
+  /* 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 || class != 1)
+    {
+      found_in_file = 0;
+      for (objfile = object_files; objfile != NULL; objfile = objfile -> next)
+       {
+         for (msymbol = objfile -> msymbols;
+              msymbol -> name != NULL; msymbol++)
+           {
+             if (msymbol -> type == ourtype || msymbol -> type == ourtype2)
+               {
+                 if (regexp == 0 || NAME_MATCH (msymbol -> name))
+                   {
+                     /* Functions:  Look up by address. */
+                     if (class != 1 &&
+                         (find_pc_symtab (msymbol -> address) != NULL))
+                       {
+                         /* Variables/Absolutes:  Look up by name */
+                         if (lookup_symbol (msymbol -> name, 
+                                            (struct block *) 0, VAR_NAMESPACE, 0,
+                                            (struct symtab **) 0) == NULL)
+                           {
+                             if (!found_in_file)
+                               {
+                                 printf_filtered ("\nNon-debugging symbols:\n");
+                                 found_in_file = 1;
+                               }
+                             printf_filtered ("        %08x  %s\n",
+                                              msymbol -> address,
+                                              msymbol -> name);
+                           }
+                       }
+                   }
+               }
+           }
+       }
     }
 }
 
@@ -2349,14 +2364,12 @@ functions_info (regexp)
   list_symbols (regexp, 1, 0);
 }
 
-#if 0
 static void
 types_info (regexp)
      char *regexp;
 {
   list_symbols (regexp, 2, 0);
 }
-#endif
 
 #if 0
 /* Tiemann says: "info methods was never implemented."  */
@@ -2376,32 +2389,6 @@ rbreak_command (regexp)
   list_symbols (regexp, 1, 1);
 }
 \f
-/* Initialize the standard C scalar types.  */
-
-static
-struct type *
-init_type (code, length, uns, name)
-     enum type_code code;
-     int length, uns;
-     char *name;
-{
-  register struct type *type;
-
-  type = (struct type *) xmalloc (sizeof (struct type));
-  bzero (type, sizeof *type);
-  TYPE_MAIN_VARIANT (type) = type;
-  TYPE_CODE (type) = code;
-  TYPE_LENGTH (type) = length;
-  TYPE_FLAGS (type) = uns ? TYPE_FLAG_UNSIGNED : 0;
-  TYPE_FLAGS (type) |= TYPE_FLAG_PERM;
-  TYPE_NFIELDS (type) = 0;
-  TYPE_NAME (type) = name;
-
-  /* C++ fancies.  */
-  TYPE_NFN_FIELDS (type) = 0;
-  TYPE_N_BASECLASSES (type) = 0;
-  return type;
-}
 
 /* Return Nonzero if block a is lexically nested within block b,
    or if a and b have the same pc range.
@@ -2422,14 +2409,13 @@ contained_in (a, b)
 int return_val_size, return_val_index;
 char **return_val;
 
-void
+static void
 completion_list_add_symbol (symname)
      char *symname;
 {
   if (return_val_index + 3 > return_val_size)
-    return_val =
-      (char **)xrealloc (return_val,
-                        (return_val_size *= 2) * sizeof (char *));
+    return_val = (char **) xrealloc ((char *) return_val,
+                                    (return_val_size *= 2) * sizeof (char *));
   
   return_val[return_val_index] =
     (char *)xmalloc (1 + strlen (symname));
@@ -2453,8 +2439,9 @@ make_symbol_completion_list (text)
 {
   register struct symtab *s;
   register struct partial_symtab *ps;
+  register struct minimal_symbol *msymbol;
+  register struct objfile *objfile;
   register struct block *b, *surrounding_static_block = 0;
-  extern struct block *get_selected_block ();
   register int i, j;
   struct partial_symbol *psym;
 
@@ -2468,41 +2455,52 @@ make_symbol_completion_list (text)
   /* Look through the partial symtabs for all symbols which begin
      by matching TEXT.  Add each one that you find to the list.  */
 
-  for (ps = partial_symtab_list; ps; ps = ps->next)
+  for (objfile = object_files; objfile != NULL; objfile = objfile -> next)
     {
-      /* If the psymtab's been read in we'll get it when we search
-        through the blockvector.  */
-      if (ps->readin) continue;
-
-      for (psym = global_psymbols.list + ps->globals_offset;
-          psym < (global_psymbols.list + ps->globals_offset
-                  + ps->n_global_syms);
-          psym++)
+      for (ps = objfile -> psymtabs; ps != NULL; ps = ps -> next)
        {
-         QUIT;                 /* If interrupted, then quit. */
-         if ((strncmp (SYMBOL_NAME (psym), text, text_len) == 0))
-           completion_list_add_symbol (SYMBOL_NAME (psym));
-       }
-      
-      for (psym = static_psymbols.list + ps->statics_offset;
-          psym < (static_psymbols.list + ps->statics_offset
-                  + ps->n_static_syms);
-          psym++)
-       {
-         QUIT;
-         if ((strncmp (SYMBOL_NAME (psym), text, text_len) == 0))
-           completion_list_add_symbol (SYMBOL_NAME (psym));
+         /* If the psymtab's been read in we'll get it when we search
+            through the blockvector.  */
+         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++)
+           {
+             QUIT;                     /* If interrupted, then quit. */
+             if ((strncmp (SYMBOL_NAME (psym), text, text_len) == 0))
+               completion_list_add_symbol (SYMBOL_NAME (psym));
+           }
+         
+         for (psym = objfile->static_psymbols.list + ps->statics_offset;
+              psym < (objfile->static_psymbols.list + ps->statics_offset
+                      + ps->n_static_syms);
+              psym++)
+           {
+             QUIT;
+             if ((strncmp (SYMBOL_NAME (psym), text, text_len) == 0))
+               completion_list_add_symbol (SYMBOL_NAME (psym));
+           }
        }
     }
 
-  /* At this point scan through the misc function vector and add each
+  /* At this point scan through the misc symbol vectors and add each
      symbol you find to the list.  Eventually we want to ignore
      anything that isn't a text symbol (everything else will be
      handled by the psymtab code above).  */
 
-  for (i = 0; i < misc_function_count; i++)
-    if (!strncmp (text, misc_function_vector[i].name, text_len))
-      completion_list_add_symbol (misc_function_vector[i].name);
+  for (objfile = object_files; objfile != NULL; objfile = objfile -> next)
+    {
+      for (msymbol = objfile -> msymbols;
+          msymbol ->name != NULL; msymbol++)
+       {
+         if (strncmp (text, msymbol -> name, text_len) == 0)
+           {
+             completion_list_add_symbol (msymbol -> name);
+           }
+       }
+    }
 
   /* Search upwards from currently selected frame (so that we can
      complete on local vars.  */
@@ -2538,30 +2536,81 @@ make_symbol_completion_list (text)
   /* Go through the symtabs and check the externs and statics for
      symbols which match.  */
 
-  for (s = symtab_list; s; s = s->next)
+  for (objfile = object_files; objfile != NULL; objfile = objfile -> next)
     {
-      b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), 0);
-      
-      for (i = 0; i < BLOCK_NSYMS (b); i++)
-       if (!strncmp (SYMBOL_NAME (BLOCK_SYM (b, i)), text, text_len))
-         completion_list_add_symbol (SYMBOL_NAME (BLOCK_SYM (b, i)));
+      for (s = objfile ->symtabs; s != NULL; s = s -> next)
+       {
+         b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), GLOBAL_BLOCK);
+         
+         for (i = 0; i < BLOCK_NSYMS (b); i++)
+           if (!strncmp (SYMBOL_NAME (BLOCK_SYM (b, i)), text, text_len))
+             completion_list_add_symbol (SYMBOL_NAME (BLOCK_SYM (b, i)));
+       }
     }
 
-  for (s = symtab_list; s; s = s->next)
+  for (objfile = object_files; objfile != NULL; objfile = objfile -> next)
     {
-      b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), 1);
-
-      /* Don't do this block twice.  */
-      if (b == surrounding_static_block) continue;
-      
-      for (i = 0; i < BLOCK_NSYMS (b); i++)
-       if (!strncmp (SYMBOL_NAME (BLOCK_SYM (b, i)), text, text_len))
-         completion_list_add_symbol (SYMBOL_NAME (BLOCK_SYM (b, i)));
+      for (s = objfile -> symtabs; s != NULL; s = s -> next)
+       {
+         b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), STATIC_BLOCK);
+         
+         /* Don't do this block twice.  */
+         if (b == surrounding_static_block) continue;
+         
+         for (i = 0; i < BLOCK_NSYMS (b); i++)
+           if (!strncmp (SYMBOL_NAME (BLOCK_SYM (b, i)), text, text_len))
+             completion_list_add_symbol (SYMBOL_NAME (BLOCK_SYM (b, i)));
+       }
     }
 
   return (return_val);
 }
 \f
+#if 0
+/* Add the type of the symbol sym to the type of the current
+   function whose block we are in (assumed).  The type of
+   this current function is contained in *TYPE.
+   
+   This basically works as follows:  When we find a function
+   symbol (N_FUNC with a 'f' or 'F' in the symbol name), we record
+   a pointer to its type in the global in_function_type.  Every 
+   time we come across a parameter symbol ('p' in its name), then
+   this procedure adds the name and type of that parameter
+   to the function type pointed to by *TYPE.  (Which should correspond
+   to in_function_type if it was called correctly).
+
+   Note that since we are modifying a type, the result of 
+   lookup_function_type() should be bcopy()ed before calling
+   this.  When not in strict typing mode, the expression
+   evaluator can choose to ignore this.
+
+   Assumption:  All of a function's parameter symbols will
+   appear before another function symbol is found.  The parameters 
+   appear in the same order in the argument list as they do in the
+   symbol table. */
+
+void
+add_param_to_type (type,sym)
+   struct type **type;
+   struct symbol *sym;
+{
+   int num = ++(TYPE_NFIELDS(*type));
+
+   if(TYPE_NFIELDS(*type)-1)
+      TYPE_FIELDS(*type) = (struct field *)
+         (*current_objfile->xrealloc) ((char *)(TYPE_FIELDS(*type)),
+                                       num*sizeof(struct field));
+   else
+      TYPE_FIELDS(*type) = (struct field *)
+         (*current_objfile->xmalloc) (num*sizeof(struct field));
+   
+   TYPE_FIELD_BITPOS(*type,num-1) = num-1;
+   TYPE_FIELD_BITSIZE(*type,num-1) = 0;
+   TYPE_FIELD_TYPE(*type,num-1) = SYMBOL_TYPE(sym);
+   TYPE_FIELD_NAME(*type,num-1) = SYMBOL_NAME(sym);
+}
+#endif 
+\f
 void
 _initialize_symtab ()
 {
@@ -2569,8 +2618,8 @@ _initialize_symtab ()
            "All global and static variable names, or those matching REGEXP.");
   add_info ("functions", functions_info,
            "All function names, or those matching REGEXP.");
-#if 0
-  /* This command has at least the following problems:
+
+  /* FIXME:  This command has at least the following problems:
      1.  It prints builtin types (in a very strange and confusing fashion).
      2.  It doesn't print right, e.g. with
          typedef struct foo *FOO
@@ -2579,13 +2628,13 @@ _initialize_symtab ()
      I also think "ptype" or "whatis" is more likely to be useful (but if
      there is much disagreement "info types" can be fixed).  */
   add_info ("types", types_info,
-           "All types names, or those matching REGEXP.");
-#endif
+           "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 ommited, it is assumed to be the current scope.\n\
-If the first REGEXP is ommited, then all methods matching the second REGEXP\n\
+If the first REGEXP is omitted, then all methods matching the second REGEXP\n\
 are listed.");
 #endif
   add_info ("sources", sources_info,
@@ -2594,29 +2643,7 @@ are listed.");
   add_com ("rbreak", no_class, rbreak_command,
            "Set a breakpoint for all functions matching REGEXP.");
 
-  /* FIXME:  The code below assumes that the sizes of the basic data
-     types are the same on the host and target machines!!!  */
-
-  builtin_type_void = init_type (TYPE_CODE_VOID, 1, 0, "void");
-
-  builtin_type_float = init_type (TYPE_CODE_FLT, sizeof (float), 0, "float");
-  builtin_type_double = init_type (TYPE_CODE_FLT, sizeof (double), 0, "double");
-
-  builtin_type_char = init_type (TYPE_CODE_INT, sizeof (char), 0, "char");
-  builtin_type_short = init_type (TYPE_CODE_INT, sizeof (short), 0, "short");
-  builtin_type_long = init_type (TYPE_CODE_INT, sizeof (long), 0, "long");
-  builtin_type_int = init_type (TYPE_CODE_INT, sizeof (int), 0, "int");
-
-  builtin_type_unsigned_char = init_type (TYPE_CODE_INT, sizeof (char), 1, "unsigned char");
-  builtin_type_unsigned_short = init_type (TYPE_CODE_INT, sizeof (short), 1, "unsigned short");
-  builtin_type_unsigned_long = init_type (TYPE_CODE_INT, sizeof (long), 1, "unsigned long");
-  builtin_type_unsigned_int = init_type (TYPE_CODE_INT, sizeof (int), 1, "unsigned int");
-#ifdef LONG_LONG
-  builtin_type_long_long =
-    init_type (TYPE_CODE_INT, sizeof (long long), 0, "long long");
-  builtin_type_unsigned_long_long = 
-    init_type (TYPE_CODE_INT, sizeof (long long), 1, "unsigned long long");
-#endif
-  builtin_type_error = init_type (TYPE_CODE_ERROR, 0, 0, "<unknown type>");
+  /* Initialize the one built-in type that isn't language dependent... */
+  builtin_type_error = init_type (TYPE_CODE_ERROR, 0, 0,
+                                 "<unknown type>", (struct objfile *) NULL);
 }
-
This page took 0.053834 seconds and 4 git commands to generate.