Remove the object file specific fields from the partial symbol table
authorFred Fish <fnf@specifix.com>
Thu, 24 Oct 1991 08:42:20 +0000 (08:42 +0000)
committerFred Fish <fnf@specifix.com>
Thu, 24 Oct 1991 08:42:20 +0000 (08:42 +0000)
structure and replace them with a pointer to private data for each
different flavor of object file reader to initialize appropriately.

gdb/ChangeLog
gdb/dbxread.c
gdb/mipsread.c
gdb/symmisc.c
gdb/symtab.h

index c25b2c768086c6737a469808723198ed05af4e88..9429f38fdb83075a2858d1ec801b63d485c38ebe 100644 (file)
@@ -1,3 +1,10 @@
+Thu Oct 24 01:32:51 1991  Fred Fish  (fnf at cygnus.com)
+
+       * dbxread.c, mipsread.c symmisc.c, symtab.c:  Remove the object
+       file specific fields from the partial symbol table structure and
+       replace them with a pointer to private data for each different
+       flavor of object file reader to initialize appropriately.
+
 Tue Oct 22 18:04:32 1991  Stu Grossman  (grossman at cygnus.com)
 
        * infrun.c (wait_for_inferior):  Check return value from
index 02641a97f25f28586fd781d7caf5e7fefb942a44..dbb786a9ae8251a2d164359f0d3a43f2d1acca30 100644 (file)
@@ -126,6 +126,25 @@ struct dbx_symfile_info {
   int desc;                    /* File descriptor of symbol file */
 };
 
+/* Each partial symbol table entry contains a pointer to private data for the
+   read_symtab() function to use when expanding a partial symbol table entry
+   to a full symbol table entry.
+
+   For dbxread this structure contains the offset within the file symbol table
+   of first local symbol for this file, and length (in bytes) of the section
+   of the symbol table devoted to this file's symbols (actually, the section
+   bracketed may contain more than just this file's symbols).  If ldsymlen is
+   0, the only reason for this thing's existence is the dependency list.
+   Nothing else will happen when it is read in. */
+
+#define LDSYMOFF(p) (((struct symloc *)((p)->read_symtab_private))->ldsymoff)
+#define LDSYMLEN(p) (((struct symloc *)((p)->read_symtab_private))->ldsymlen)
+
+struct symloc {
+  int ldsymoff;
+  int ldsymlen;
+};
+
 extern void qsort ();
 extern double atof ();
 extern struct cmd_list_element *cmdlist;
@@ -2017,7 +2036,7 @@ read_dbx_symtab (symfile_name, addr,
             things like "break c-exp.y:435" need to work (I
             suppose the psymtab_include_list could be hashed or put
             in a binary tree, if profiling shows this is a major hog).  */
-         if (!strcmp (namestring, pst->filename))
+         if (pst && !strcmp (namestring, pst->filename))
            continue;
          {
            register int i;
@@ -2357,13 +2376,14 @@ read_dbx_symtab (symfile_name, addr,
   discard_cleanups (old_chain);
 }
 
-/*
- * Allocate and partially fill a partial symtab.  It will be
- * completely filled at the end of the symbol list.
+/* Allocate and partially fill a partial symtab.  It will be
+   completely filled at the end of the symbol list.
+
+   SYMFILE_NAME is the name of the symbol-file we are reading from, and ADDR
+   is the address relative to which its symbols are (incremental) or 0
+   (normal). */
+
 
- SYMFILE_NAME is the name of the symbol-file we are reading from, and ADDR
- is the address relative to which its symbols are (incremental) or 0
- (normal).  */
 static struct partial_symtab *
 start_psymtab (symfile_name, addr,
               filename, textlow, ldsymoff, global_syms, static_syms)
@@ -2392,7 +2412,9 @@ start_psymtab (symfile_name, addr,
   strcpy (result->filename, filename);
 
   result->textlow = textlow;
-  result->ldsymoff = ldsymoff;
+  result->read_symtab_private = (char *) obstack_alloc (psymbol_obstack,
+                                              sizeof (struct symloc));
+  LDSYMOFF(result) = ldsymoff;
 
   result->readin = 0;
   result->symtab = 0;
@@ -2450,7 +2472,7 @@ end_psymtab (pst, include_list, num_includes, capping_symbol_offset,
 {
   int i;
 
-  pst->ldsymlen = capping_symbol_offset - pst->ldsymoff;
+  LDSYMLEN(pst) = capping_symbol_offset - LDSYMOFF(pst);
   pst->texthigh = capping_text;
 
   pst->n_global_syms =
@@ -2485,8 +2507,10 @@ end_psymtab (pst, include_list, num_includes, capping_symbol_offset,
 
       subpst->symfile_name = pst->symfile_name;
       subpst->addr = pst->addr;
-      subpst->ldsymoff =
-       subpst->ldsymlen =
+      subpst->read_symtab_private = (char *) obstack_alloc (psymbol_obstack,
+                                                  sizeof (struct symloc));
+      LDSYMOFF(subpst) =
+       LDSYMLEN(subpst) =
          subpst->textlow =
            subpst->texthigh = 0;
 
@@ -2565,7 +2589,7 @@ psymtab_to_symtab_1 (pst, desc, stringtab, stringtab_size, sym_offset)
                             stringtab, stringtab_size, sym_offset);
       }
 
-  if (pst->ldsymlen)           /* Otherwise it's a dummy */
+  if (LDSYMLEN(pst))           /* Otherwise it's a dummy */
     {
       /* Init stuff necessary for reading in symbols */
       free_pendings = 0;
@@ -2578,8 +2602,8 @@ psymtab_to_symtab_1 (pst, desc, stringtab, stringtab_size, sym_offset)
       lseek (desc, sym_offset, L_SET);
       pst->symtab =
        read_ofile_symtab (desc, stringtab, stringtab_size,
-                          pst->ldsymoff,
-                          pst->ldsymlen, pst->textlow,
+                          LDSYMOFF(pst),
+                          LDSYMLEN(pst), pst->textlow,
                           pst->texthigh - pst->textlow, pst->addr);
       sort_symtab_syms (pst->symtab);
 
@@ -2615,7 +2639,7 @@ dbx_psymtab_to_symtab (pst)
       return;
     }
 
-  if (pst->ldsymlen || pst->number_of_dependencies)
+  if (LDSYMLEN(pst) || pst->number_of_dependencies)
     {
       /* Print the message now, before reading the string table,
         to avoid disconcerting pauses.  */
index 7083d3dc9d6d141488d4624cbf882e19cba37daa..b216ddefd10263d3e5420b18e1921308752c2b29 100644 (file)
@@ -57,6 +57,24 @@ struct coff_exec {
        struct external_aouthdr a;
 };
 
+/* Each partial symbol table entry contains a pointer to private data for the
+   read_symtab() function to use when expanding a partial symbol table entry
+   to a full symbol table entry.
+
+   For mipsread this structure contains the index of the FDR that this psymtab
+   represents and a pointer to the symbol table header HDRR from the symbol
+   file that the psymtab was created from.
+
+   Note: This code is currently untested.  -fnf */
+
+#define FDR_IDX(p) (((struct symloc *)((p)->read_symtab_private))->fdr_idx)
+#define CUR_HDR(p) (((struct symloc *)((p)->read_symtab_private))->cur_hdr)
+
+struct symloc {
+  int fdr_idx;
+  HDRR *cur_hdr;
+};
+
 /* Things we import explicitly from other modules */
 
 extern int          info_verbose;
@@ -305,8 +323,7 @@ mipscoff_psymtab_to_symtab(pst)
                fflush(stdout);
        }
        /* Restore the header and list of pending typedefs */
-       /* FIXME, we should use private data that is a proper pointer. */
-       cur_hdr = (HDRR *) pst->ldsymlen;
+       cur_hdr = CUR_HDR(pst);
 
        psymtab_to_symtab_1(pst, pst->filename);
 
@@ -1497,6 +1514,8 @@ parse_lines(fh, lt)
                                delta -= 16;
                        if (delta == -8) {
                                delta = (base[0] << 8) | base[1];
+                               if (delta >= 0x8000)
+                                       delta -= 0x10000;
                                base += 2;
                        }
                        lineno += delta;/* first delta is 0 */
@@ -1556,7 +1575,6 @@ parse_partial_symbols(end_of_text_seg)
        int end_of_text_seg;
 {
        int             f_idx, s_idx, h_max, stat_idx;
-       CORE_ADDR       dummy, *prevhigh;
        HDRR            *hdr;
        /* Running pointers */
        FDR             *fh;
@@ -1586,7 +1604,7 @@ parse_partial_symbols(end_of_text_seg)
        {
                struct partial_symtab * pst = new_psymtab("");
                fdr_to_pst[-1].pst = pst;
-               pst->ldsymoff = -1;
+               FDR_IDX(pst) = -1;
        }
 
        /* Now scan the FDRs, mostly for dependencies */
@@ -1696,6 +1714,7 @@ parse_partial_symbols(end_of_text_seg)
        for (f_idx = 0; f_idx < hdr->ifdMax; f_idx++) {
                fh = f_idx + (FDR *)(cur_hdr->cbFdOffset);
                pst = fdr_to_pst[f_idx].pst;
+               pst->texthigh = pst->textlow;
                
                for (s_idx = 0; s_idx < fh->csym; ) {
                        register struct partial_symbol *p;
@@ -1723,6 +1742,17 @@ parse_partial_symbols(end_of_text_seg)
                                /* Skip over procedure to next one. */
                                s_idx = (sh->index + (AUXU *)fh->iauxBase)
                                          ->isym;
+                                       {
+                                       long high;
+                                       long procaddr = sh->value;
+
+                                       sh = s_idx + (SYMR *) fh->isymBase - 1;
+                                       if (sh->st != stEnd)
+                                               continue;
+                                       high = procaddr + sh->value;
+                                       if (high > pst->texthigh)
+                                               pst->texthigh = high;
+                                       }
                                continue;
                        case stStatic:                  /* Variable */
                                SYMBOL_CLASS(p) = LOC_STATIC;
@@ -1734,9 +1764,12 @@ parse_partial_symbols(end_of_text_seg)
                        case stConstant:                /* Constant decl */
                                SYMBOL_CLASS(p) = LOC_CONST;
                                break;
-                       case stBlock:                   /* { }, str, un, enum */
-                               /* Eventually we want struct names and enum
-                                  values out of here.  FIXME */
+                       case stBlock:                   /* { }, str, un, enum*/
+                               if (sh->sc == scInfo) {
+                                      SYMBOL_NAMESPACE(p) = STRUCT_NAMESPACE;
+                                      SYMBOL_CLASS(p) = LOC_TYPEDEF;
+                                      pst->n_static_syms++;
+                               }
                                /* Skip over the block */
                                s_idx = sh->index;
                                continue;
@@ -1762,40 +1795,19 @@ parse_partial_symbols(end_of_text_seg)
                }
        }
 
-       /* The array (of lists) of globals must be sorted.
-          Take care, since we are at it, of pst->texthigh.
-
-          NOTE: The way we handle textlow/high is incorrect, but good
-          enough for a first approximation. The case we fail is on a
-          file "foo.c" that looks like
-               proc1() {...}
-               #include "bar.c"        -- this contains proc2()
-               proc3() {...}
-          where proc3() is attributed to bar.c.  But since this is a
-          dependent file it will cause loading of foo.c as well, so
-          everything will be fine at the end.  */
-
-       /* First, sort the psymtabs by their textlow addresses.  */
+       /* The array (of lists) of globals must be sorted. */
        reorder_psymtabs();
 
-       /* Now, rip through and fill in "texthigh" from the textlow
-          of the following psymtab.  Slimy but it might work.
-          Sort the global psymbols while we're at it.  */
-       prevhigh = &dummy;
+       /* Now sort the global psymbols.  */
        for (f_idx = 0; f_idx < hdr->ifdMax; f_idx++) {
                struct partial_symtab *pst = fdr_to_pst[f_idx].pst;
                if (pst->n_global_syms > 1)
                        qsort (global_psymbols.list + pst->globals_offset,
                                pst->n_global_syms, sizeof (struct partial_symbol),
                                compare_psymbols);
-               if (pst->textlow) {
-                       *prevhigh = pst->textlow;
-                       prevhigh = &pst->texthigh;
-               }
        }
 
        /* Mark the last code address, and remember it for later */
-       *prevhigh = end_of_text_seg;
        hdr->cbDnOffset = end_of_text_seg;
 
        free(&fdr_to_pst[-1]);
@@ -1837,7 +1849,7 @@ parse_fdr(f_idx, lev)
        }
 
        /* Make everything point to everything. */
-       pst->ldsymoff = f_idx;
+       FDR_IDX(pst) = f_idx;
        fdr_to_pst[f_idx].pst = pst;
        fh->ioptBase = (int)pst;
 
@@ -1900,11 +1912,11 @@ psymtab_to_symtab_1(pst, filename)
        /* How many symbols will we need */
        /* FIXME, this does not count enum values. */
        f_max = pst->n_global_syms + pst->n_static_syms;
-       if (pst->ldsymoff == -1) {
+       if (FDR_IDX(pst) == -1) {
                fh = 0;
                st = new_symtab( "unknown", f_max, 0);
        } else {
-               fh = (FDR *) (cur_hdr->cbFdOffset) + pst->ldsymoff;
+               fh = (FDR *) (cur_hdr->cbFdOffset) + FDR_IDX(pst);
                f_max += fh->csym + fh->cpd;
                st = new_symtab(pst->filename, 2 * f_max, 2 * fh->cline);
        }
@@ -1934,7 +1946,7 @@ psymtab_to_symtab_1(pst, filename)
 
        /* Now read the symbols for this symtab */
 
-       cur_fd = pst->ldsymoff;
+       cur_fd = FDR_IDX(pst);
        cur_fdr = fh;
        cur_stab = st;
 
@@ -2405,8 +2417,9 @@ new_psymtab(name)
        partial_symtab_list = pst;
 
        /* Keep a backpointer to the file's symbols */
-       /* FIXME, we should use private data that is a proper pointer. */
-       pst->ldsymlen = (int)cur_hdr;
+       pst->read_symtab_private = (char *) obstack_alloc (psymbol_obstack,
+                                                 sizeof (struct symloc));
+       CUR_HDR(pst) = cur_hdr;
 
        /* The way to turn this into a symtab is to call... */
        pst->read_symtab = mipscoff_psymtab_to_symtab;
@@ -2527,6 +2540,7 @@ new_type(name)
                obstack_alloc (symbol_obstack, sizeof (struct type));
 
        bzero (t, sizeof (*t));
+       TYPE_VPTR_FIELDNO (t) = -1;
        TYPE_NAME(t) = name;
        return t;
 }
@@ -2549,6 +2563,7 @@ make_type(code, length, uns, name)
        TYPE_LENGTH(type) = length;
        TYPE_FLAGS(type) = uns ? TYPE_FLAG_UNSIGNED : 0;
        TYPE_NAME(type) = name;
+       TYPE_VPTR_FIELDNO (type) = -1;
 
        return type;
 }
index 52f9fd7cd14aea5a2d7e2b4f6b2eee542b4fe462..fbcc79da615d1bb3a1e9ff1b5714c81fab77615c 100644 (file)
@@ -3,28 +3,30 @@
 
 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 "param.h"
 #include "symtab.h"
+#include "bfd.h"
+#include "symfile.h"
 #include "breakpoint.h"
 #include "command.h"
 
-#include <stdio.h>
 #include <obstack.h>
 \f
 /* Free all the symtabs that are currently installed,
@@ -94,7 +96,6 @@ free_symtab (s)
 {
   register int i, n;
   register struct blockvector *bv;
-  register struct typevector *tv;
 
   switch (s->free_code)
     {
@@ -114,9 +115,6 @@ free_symtab (s)
        free_symtab_block (BLOCKVECTOR_BLOCK (bv, i));
       /* Free the blockvector itself.  */
       free (bv);
-      /* Free the type vector.  */
-      tv = TYPEVECTOR (s);
-      free (tv);
       /* Also free the linetable.  */
       
     case free_linetable:
@@ -141,6 +139,7 @@ free_symtab (s)
 \f
 static int block_depth ();
 static void print_symbol ();
+static void print_partial_symbol ();
 
 void
 print_symtabs (filename)
@@ -314,10 +313,6 @@ print_symbol (symbol, depth, outfile)
                   BLOCK_START (SYMBOL_BLOCK_VALUE (symbol)));
          break;
 
-       case LOC_EXTERNAL:
-         fprintf (outfile, "external at 0x%x", SYMBOL_VALUE_ADDRESS (symbol));
-         break;
-
         default:
          fprintf (outfile, "botched symbol class %x", SYMBOL_CLASS (symbol));
          break;
@@ -326,6 +321,140 @@ print_symbol (symbol, depth, outfile)
   fprintf (outfile, "\n");
 }
 
+void
+print_partial_symtabs (filename)
+     char *filename;
+{
+  FILE *outfile;
+  struct partial_symtab *p;
+  struct cleanup *cleanups;
+  extern int fclose();
+
+  if (filename == 0)
+    error_no_arg ("file to write partial symbol data in");
+
+  filename = tilde_expand (filename);
+  make_cleanup (free, filename);
+  
+  outfile = fopen (filename, "w");
+  if (outfile == 0)
+    perror_with_name (filename);
+
+  cleanups = make_cleanup (fclose, outfile);
+  immediate_quit++;
+
+  for (p = partial_symtab_list; p; p = p->next)
+    {
+      fprintf_filtered (outfile, "Partial symtab for source file %s ",
+              p->filename);
+      fprintf_filtered (outfile, "(object 0x%x)\n\n", p);
+      fprintf_filtered (outfile, "  Full symbol table %s been read from %s\n",
+                       p->readin ? "has" : "has not yet",
+                       p->symfile_name);
+      if (p->readin)
+       fprintf_filtered (outfile, "  Was read into symtab at 0x%x by function at 0x%x\n",
+                         p->symtab, p->read_symtab);
+      fprintf_filtered (outfile, "  Relocate symbols by 0x%x\n", p->addr);
+      fprintf_filtered (outfile, "  Symbols cover text addresses 0x%x-0x%x\n",
+                       p->textlow, p->texthigh);
+      fprintf_filtered (outfile, "  Depends on %d other partial symtabs.\n",
+                       p->number_of_dependencies);
+      if (p->n_global_syms > 0)
+       print_partial_symbol (global_psymbols.list + p->globals_offset,
+                             p->n_global_syms, "Global", outfile);
+      if (p->n_static_syms > 0)
+       print_partial_symbol (static_psymbols.list + p->statics_offset,
+                             p->n_static_syms, "Static", outfile);
+      fprintf_filtered (outfile, "\n\n");
+    }
+
+  immediate_quit--;
+  do_cleanups (cleanups);
+}
+
+static void
+print_partial_symbol (p, count, what, outfile)
+struct partial_symbol *p;
+int count;
+char *what;
+FILE *outfile;
+{
+  char *space;
+  char *class;
+
+  fprintf_filtered (outfile, "  %s partial symbols:\n", what);
+  while (count-- > 0)
+    {
+      fprintf_filtered (outfile, "    `%s', ", SYMBOL_NAME(p));
+      switch (SYMBOL_NAMESPACE (p))
+       {
+       case UNDEF_NAMESPACE:
+         fputs_filtered ("undefined namespace, ", outfile);
+         break;
+       case VAR_NAMESPACE:
+         /* This is the usual thing -- don't print it */
+         break;
+       case STRUCT_NAMESPACE:
+         fputs_filtered ("struct namespace, ", outfile);
+         break;
+       case LABEL_NAMESPACE:
+         fputs_filtered ("label namespace, ", outfile);
+         break;
+       default:
+         fputs_filtered ("<invalid namespace>, ", outfile);
+         break;
+       }
+      switch (SYMBOL_CLASS (p))
+       {
+       case LOC_UNDEF:
+         fputs_filtered ("undefined", outfile);
+         break;
+       case LOC_CONST:
+         fputs_filtered ("constant int", outfile);
+         break;
+       case LOC_STATIC:
+         fputs_filtered ("static", outfile);
+         break;
+       case LOC_REGISTER:
+         fputs_filtered ("register", outfile);
+         break;
+       case LOC_ARG:
+         fputs_filtered ("pass by value", outfile);
+         break;
+       case LOC_REF_ARG:
+         fputs_filtered ("pass by reference", outfile);
+         break;
+       case LOC_REGPARM:
+         fputs_filtered ("register parameter", outfile);
+         break;
+       case LOC_LOCAL:
+         fputs_filtered ("stack parameter", outfile);
+         break;
+       case LOC_TYPEDEF:
+         fputs_filtered ("type", outfile);
+         break;
+       case LOC_LABEL:
+         fputs_filtered ("label", outfile);
+         break;
+       case LOC_BLOCK:
+         fputs_filtered ("function", outfile);
+         break;
+       case LOC_CONST_BYTES:
+         fputs_filtered ("constant bytes", outfile);
+         break;
+       case LOC_LOCAL_ARG:
+         fputs_filtered ("shuffled arg", outfile);
+         break;
+       default:
+         fputs_filtered ("<invalid location>", outfile);
+         break;
+       }
+      fputs_filtered (", ", outfile);
+      fprintf_filtered (outfile, "0x%x\n", SYMBOL_VALUE (p));
+      p++;
+    }
+}
+
 /* Return the nexting depth of a block within other blocks in its symtab.  */
 
 static int
@@ -356,5 +485,7 @@ _initialize_symmisc ()
   
   add_com ("printsyms", class_obscure, print_symtabs,
           "Print dump of current symbol definitions to file OUTFILE.");
+  add_com ("printpsyms", class_obscure, print_partial_symtabs,
+          "Print dump of current partial symbol definitions to file OUTFILE.");
 }
 
index ac0b8bc2e0c2a761a68f1fff523bb2d31dc7bfd4..b29f4402e6c36874696972b86d37d844dba25ddf 100644 (file)
@@ -1,21 +1,21 @@
 /* Symbol table definitions for GDB.
-   Copyright (C) 1986, 1989 Free Software Foundation, Inc.
+   Copyright (C) 1986, 1989, 1991 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.  */
 
 #if !defined (SYMTAB_H)
 #define SYMTAB_H 1
@@ -59,7 +59,7 @@ extern void free ();
 /* Actually, the misc function list is used to store *all* of the
    global symbols (text, data, bss, and abs).  It is sometimes used
    to figure out what symtabs to read in.  The "type" field is used
-   occasionally.
+   occasionally.  Calling it the misc "function" vector is now a misnomer.
 
    The misc_info field is available for machine-specific information
    that can be cached along with a misc function vector entry.  The
@@ -83,19 +83,6 @@ struct misc_function
 struct misc_function *misc_function_vector;
 int misc_function_count;
 \f
-enum language {language_unknown, language_c};
-
-/* All data types of symbols in the compiled program
-   are represented by `struct type' objects.
-   All of these objects are pointed to by the typevector.
-   The type vector may have empty slots that contain zero.  */
-
-struct typevector
-{
-  int length;                  /* Number of types described */
-  struct type *type[1];
-};
-
 /* Different kinds of data types are distinguished by the `code' field.  */
 
 enum type_code
@@ -119,6 +106,10 @@ enum type_code
   TYPE_CODE_MEMBER,            /* Member type */
   TYPE_CODE_METHOD,            /* Method type */
   TYPE_CODE_REF,               /* C++ Reference types */
+
+  /* Modula-2 */
+  TYPE_CODE_CHAR,              /* *real* character type */
+  TYPE_CODE_BOOL,              /* Builtin Modula-2 BOOLEAN */
 };
 
 /* This appears in a type's flags word for an unsigned integer type.  */
@@ -403,11 +394,6 @@ enum address_class
   LOC_LABEL,           /* Value is address SYMBOL_VALUE_ADDRESS in the code */
   LOC_BLOCK,           /* Value is address SYMBOL_VALUE_BLOCK of a
                           `struct block'.  Function names have this class. */
-  LOC_EXTERNAL,                /* Value is at address SYMBOL_VALUE_ADDRESS not in
-                          this compilation.
-                          This is used only in psymtabs; in symtabs
-                          LOC_STATIC is used instead (since in that case
-                          we take the time to find the address).  */
   LOC_CONST_BYTES,     /* Value is a constant byte-sequence pointed to by
                           SYMBOL_VALUE_ADDRESS, in target byte order.  */
   LOC_LOCAL_ARG,       /* Value is arg at spec'd offset in stack frame.
@@ -442,7 +428,7 @@ struct symbol
                                   LOC_REF_ARG, LOC_REGPARM, LOC_LOCAL */
       struct block *block;      /* for LOC_BLOCK */
       char *bytes;             /* for LOC_CONST_BYTES */
-      CORE_ADDR address;       /* for LOC_STATIC, LOC_LABEL, LOC_EXTERNAL */
+      CORE_ADDR address;       /* for LOC_STATIC, LOC_LABEL */
       struct symbol *chain;    /* for opaque typedef struct chain */
     }
   value;
@@ -528,8 +514,6 @@ struct symtab
     struct blockvector *blockvector;
     /* Table mapping core addresses to line numbers for this file.  */
     struct linetable *linetable;
-    /* Vector containing all types defined for this symtab.  */
-    struct typevector *typevector;
     /* Name of this source file.  */
     char *filename;
     /* Directory in which it was compiled, or NULL if we don't know.  */
@@ -587,15 +571,6 @@ struct partial_symtab
      relocate by this amount when reading in symbols from the symbol
      file.  */
   CORE_ADDR addr;
-
-  /* Offset within loader symbol table of first local symbol for this
-     file and length (in bytes) of the section of the symbol table
-     devoted to this file's symbols (actually, the section bracketed
-     may contain more than just this files symbols
-     If ldsymlen is 0, the only reason for this things existence is
-     the dependency list below.  Nothing else will happen when it is
-     read in.  */
-  int ldsymoff, ldsymlen;
   /* Range of text addresses covered by this file; texthigh is the
      beginning of the next section. */
   CORE_ADDR textlow, texthigh;
@@ -608,14 +583,15 @@ struct partial_symtab
   /* Global symbol list.  This list will be sorted after readin to
      improve access.  Binary search will be the usual method of
      finding a symbol within it. globals_offset is an integer offset
-     within ps_globals */
+     within global_psymbols[].  */
   int globals_offset, n_global_syms;
   /* Static symbol list.  This list will *not* be sorted after readin;
      to find a symbol in it, exhaustive search must be used.  This is
      reasonable because searches through this list will eventually
      lead to either the read in of a files symbols for real (assumed
      to take a *lot* of time; check) or an error (and we don't care
-     how long errors take). */
+     how long errors take).  This is an offset and size within
+     static_psymbols[].  */
   int statics_offset, n_static_syms;
   /* Pointer to symtab eventually allocated for this source file, 0 if
      !readin or if we haven't looked for the symtab after it was readin.  */
@@ -623,6 +599,12 @@ struct partial_symtab
   /* Pointer to function which will read in the symtab corresponding to
      this psymtab.  */
   void (*read_symtab) ();
+  /* Information that lets read_symtab() locate the part of the symbol table
+     that this psymtab corresponds to.  This information is private to the
+     format-dependent symbol reading routines.  For further detail examine
+     the various symbol reading modules.  Should really be (void *) but is
+     (char *) as with other such gdb variables.  (FIXME) */
+  char *read_symtab_private;
   /* Non-zero if the symtab corresponding to this psymtab has been
      readin */
   unsigned char readin;
@@ -652,8 +634,6 @@ int current_source_line;
 #define BLOCKLIST(symtab) (symtab)->blockvector
 #define BLOCKVECTOR(symtab) (symtab)->blockvector
 
-#define TYPEVECTOR(symtab) (symtab)->typevector
-
 #define LINELIST(symtab) (symtab)->linetable
 #define LINETABLE(symtab) (symtab)->linetable
 \f
@@ -664,9 +644,6 @@ int current_source_line;
 #define BLOCKVECTOR_NBLOCKS(blocklist) (blocklist)->nblocks
 #define BLOCKVECTOR_BLOCK(blocklist,n) (blocklist)->block[n]
 
-#define TYPEVECTOR_NTYPES(typelist) (typelist)->length
-#define TYPEVECTOR_TYPE(typelist,n) (typelist)->type[n]
-
 #define BLOCK_START(bl) (bl)->startaddr
 #define BLOCK_END(bl) (bl)->endaddr
 #define BLOCK_NSYMS(bl) (bl)->nsyms
@@ -809,7 +786,7 @@ extern struct type *create_array_type ();
 extern struct symbol *block_function ();
 extern struct symbol *find_pc_function ();
 extern int find_pc_partial_function ();
-extern void clearpc_function_cache ();
+extern void clear_pc_function_cache ();
 extern struct partial_symtab *lookup_partial_symtab ();
 extern struct partial_symtab *find_pc_psymtab ();
 extern struct symtab *find_pc_symtab ();
@@ -856,6 +833,13 @@ extern struct type *builtin_type_error;
 extern struct type *builtin_type_long_long;
 extern struct type *builtin_type_unsigned_long_long;
 
+/* Modula-2 types */
+extern struct type *builtin_type_m2_char;
+extern struct type *builtin_type_m2_int;
+extern struct type *builtin_type_m2_card;
+extern struct type *builtin_type_m2_real;
+extern struct type *builtin_type_m2_bool;
+
 /* LONG_LONG is defined if the host has "long long".  */
 #ifdef LONG_LONG
 #define BUILTIN_TYPE_LONGEST builtin_type_long_long
@@ -930,4 +914,11 @@ char **make_symbol_completion_list ();
 /* The entry point of a file we are reading.  */
 extern CORE_ADDR entry_point;
 
+/* Maximum and minimum values of built-in types */
+#define        MAX_OF_TYPE(t)  \
+   TYPE_UNSIGNED(t) ? UMAX_OF_SIZE(TYPE_LENGTH(t)) : MAX_OF_SIZE(TYPE_LENGTH(t))
+
+#define MIN_OF_TYPE(t) \
+   TYPE_UNSIGNED(t) ? UMIN_OF_SIZE(TYPE_LENGTH(t)) : MIN_OF_SIZE(TYPE_LENGTH(t))
+
 #endif /* symtab.h not already included.  */