* Makefile.in (install-info): Prepend $(DESTDIR) to $(infodir).
[deliverable/binutils-gdb.git] / gdb / mdebugread.c
index bd0e124bc0d09685957d7c0fc6c4e061f347779d..ae1ea7d6cd676592211f919de64d332dd947d990 100644 (file)
@@ -1,7 +1,9 @@
 /* Read a symbol table in ECOFF format (Third-Eye).
-   Copyright 1986, 1987, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
-   1997, 1998, 1999, 2000, 2001, 2002, 2003
-   Free Software Foundation, Inc.
+
+   Copyright 1986, 1987, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
+   1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software
+   Foundation, Inc.
+
    Original version contributed by Alessandro Forin (af@cs.cmu.edu) at
    CMU.  Major work by Per Bothner, John Gilmore and Ian Lance Taylor
    at Cygnus Support.
@@ -53,6 +55,8 @@
 #include "complaints.h"
 #include "demangle.h"
 #include "gdb_assert.h"
+#include "block.h"
+#include "dictionary.h"
 
 /* These are needed if the tm.h file does not contain the necessary
    mips specific definitions.  */
@@ -283,9 +287,11 @@ static struct symbol *new_symbol (char *);
 
 static struct type *new_type (char *);
 
-static struct block *new_block (int);
+enum block_type { FUNCTION_BLOCK, NON_FUNCTION_BLOCK };
+
+static struct block *new_block (enum block_type);
 
-static struct symtab *new_symtab (char *, int, int, struct objfile *);
+static struct symtab *new_symtab (char *, int, struct objfile *);
 
 static struct linetable *new_linetable (int);
 
@@ -294,11 +300,9 @@ static struct blockvector *new_bvect (int);
 static struct type *parse_type (int, union aux_ext *, unsigned int, int *,
                                int, char *);
 
-static struct symbol *mylookup_symbol (char *, struct block *, namespace_enum,
+static struct symbol *mylookup_symbol (char *, struct block *, domain_enum,
                                       enum address_class);
 
-static struct block *shrink_block (struct block *, struct symtab *);
-
 static void sort_blocks (struct symtab *);
 
 static struct partial_symtab *new_psymtab (char *, struct objfile *);
@@ -371,7 +375,7 @@ static FDR *
 get_rfd (int cf, int rf)
 {
   FDR *fdrs;
-  register FDR *f;
+  FDR *f;
   RFDT rfd;
 
   fdrs = debug_info->fdr;
@@ -482,7 +486,6 @@ static struct parse_stack
 
     int blocktype;
 
-    int maxsyms;               /* Max symbols in this block. */
     struct type *cur_type;     /* Type we parse fields for. */
     int cur_field;             /* Field number in cur_type. */
     CORE_ADDR procadr;         /* Start addres of this procedure */
@@ -507,7 +510,7 @@ push_parse_stack (void)
   /* Initialize new frame with previous content */
   if (top_stack)
     {
-      register struct parse_stack *prev = new->prev;
+      struct parse_stack *prev = new->prev;
 
       *new = *top_stack;
       top_stack->prev = new;
@@ -557,7 +560,7 @@ static struct mdebug_pending *
 is_pending_symbol (FDR *fh, char *sh)
 {
   int f_idx = fh - debug_info->fdr;
-  register struct mdebug_pending *p;
+  struct mdebug_pending *p;
 
   /* Linear search is ok, list is typically no more than 10 deep */
   for (p = pending_list[f_idx]; p; p = p->next)
@@ -669,7 +672,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
          /* It is a FORTRAN common block.  At least for SGI Fortran the
             address is not in the symbol; we need to fix it later in
             scan_file_globals.  */
-         int bucket = hashname (SYMBOL_NAME (s));
+         int bucket = hashname (DEPRECATED_SYMBOL_NAME (s));
          SYMBOL_VALUE_CHAIN (s) = global_sym_chain[bucket];
          global_sym_chain[bucket] = s;
        }
@@ -690,7 +693,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
       SYMBOL_VALUE (s) = svalue;
 
     data:                      /* Common code for symbols describing data */
-      SYMBOL_NAMESPACE (s) = VAR_NAMESPACE;
+      SYMBOL_DOMAIN (s) = VAR_DOMAIN;
       SYMBOL_CLASS (s) = class;
       add_symbol (s, b);
 
@@ -713,7 +716,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
        name = "this";          /* FIXME, not alloc'd in obstack */
       s = new_symbol (name);
 
-      SYMBOL_NAMESPACE (s) = VAR_NAMESPACE;
+      SYMBOL_DOMAIN (s) = VAR_DOMAIN;
       switch (sh->sc)
        {
        case scRegister:
@@ -742,7 +745,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
 
     case stLabel:              /* label, goes into current block */
       s = new_symbol (name);
-      SYMBOL_NAMESPACE (s) = VAR_NAMESPACE;    /* so that it can be used */
+      SYMBOL_DOMAIN (s) = VAR_DOMAIN;  /* so that it can be used */
       SYMBOL_CLASS (s) = LOC_LABEL;    /* but not misused */
       SYMBOL_VALUE_ADDRESS (s) = (CORE_ADDR) sh->value;
       SYMBOL_TYPE (s) = mdebug_type_int;
@@ -784,7 +787,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
           break;
         }
       s = new_symbol (name);
-      SYMBOL_NAMESPACE (s) = VAR_NAMESPACE;
+      SYMBOL_DOMAIN (s) = VAR_DOMAIN;
       SYMBOL_CLASS (s) = LOC_BLOCK;
       /* Type of the return value */
       if (SC_IS_UNDEF (sh->sc) || sh->sc == scNil)
@@ -792,7 +795,8 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
       else
        {
          t = parse_type (cur_fd, ax, sh->index + 1, 0, bigend, name);
-         if (STREQ (name, "malloc") && TYPE_CODE (t) == TYPE_CODE_VOID)
+         if (strcmp (name, "malloc") == 0
+             && TYPE_CODE (t) == TYPE_CODE_VOID)
            {
              /* I don't know why, but, at least under Alpha GNU/Linux,
                 when linking against a malloc without debugging
@@ -833,7 +837,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
        TYPE_FLAGS (SYMBOL_TYPE (s)) |= TYPE_FLAG_PROTOTYPED;
 
       /* Create and enter a new lexical context */
-      b = new_block (top_stack->maxsyms);
+      b = new_block (FUNCTION_BLOCK);
       SYMBOL_BLOCK_VALUE (s) = b;
       BLOCK_FUNCTION (b) = s;
       BLOCK_START (b) = BLOCK_END (b) = sh->value;
@@ -915,9 +919,13 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
                    method whose name is identical to the class name
                    (in particular constructor method names are different
                    from the class name).  There is therefore no risk that
-                   this check stops the count on the StEnd of a method.  */
-                if (strcmp (debug_info->ss + cur_fdr->issBase + tsym.iss,
-                            name) == 0)
+                   this check stops the count on the StEnd of a method.
+                  
+                  Also, assume that we're really at the end when tsym.iss
+                  is 0 (issNull).  */
+                if (tsym.iss == issNull
+                   || strcmp (debug_info->ss + cur_fdr->issBase + tsym.iss,
+                               name) == 0)
                   goto end_of_fields;
                 break;
 
@@ -1101,12 +1109,12 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
                            obstack_alloc (&current_objfile->symbol_obstack,
                                           sizeof (struct symbol)));
                memset (enum_sym, 0, sizeof (struct symbol));
-               SYMBOL_NAME (enum_sym) =
+               DEPRECATED_SYMBOL_NAME (enum_sym) =
                  obsavestring (f->name, strlen (f->name),
                                &current_objfile->symbol_obstack);
                SYMBOL_CLASS (enum_sym) = LOC_CONST;
                SYMBOL_TYPE (enum_sym) = t;
-               SYMBOL_NAMESPACE (enum_sym) = VAR_NAMESPACE;
+               SYMBOL_DOMAIN (enum_sym) = VAR_DOMAIN;
                SYMBOL_VALUE (enum_sym) = tsym.value;
                if (SYMBOL_VALUE (enum_sym) < 0)
                  unsigned_enum = 0;
@@ -1136,7 +1144,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
          }
 
        s = new_symbol (name);
-       SYMBOL_NAMESPACE (s) = STRUCT_NAMESPACE;
+       SYMBOL_DOMAIN (s) = STRUCT_DOMAIN;
        SYMBOL_CLASS (s) = LOC_TYPEDEF;
        SYMBOL_VALUE (s) = 0;
        SYMBOL_TYPE (s) = t;
@@ -1164,7 +1172,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
        }
 
       top_stack->blocktype = stBlock;
-      b = new_block (top_stack->maxsyms);
+      b = new_block (NON_FUNCTION_BLOCK);
       BLOCK_START (b) = sh->value + top_stack->procadr;
       BLOCK_SUPERBLOCK (b) = top_stack->cur_block;
       top_stack->cur_block = b;
@@ -1184,7 +1192,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
          /* Finished with procedure */
          struct blockvector *bv = BLOCKVECTOR (top_stack->cur_st);
          struct mips_extra_func_info *e;
-         struct block *b;
+         struct block *b = top_stack->cur_block;
          struct type *ftype = top_stack->cur_type;
          int i;
 
@@ -1192,7 +1200,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
 
          /* Make up special symbol to contain procedure specific info */
          s = new_symbol (MIPS_EFI_SYMBOL_NAME);
-         SYMBOL_NAMESPACE (s) = LABEL_NAMESPACE;
+         SYMBOL_DOMAIN (s) = LABEL_DOMAIN;
          SYMBOL_CLASS (s) = LOC_CONST;
          SYMBOL_TYPE (s) = mdebug_type_void;
          e = ((struct mips_extra_func_info *)
@@ -1204,9 +1212,6 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
          e->pdr.framereg = -1;
          add_symbol (s, top_stack->cur_block);
 
-         /* Reallocate symbols, saving memory */
-         b = shrink_block (top_stack->cur_block, top_stack->cur_st);
-
          /* f77 emits proc-level with address bounds==[0,0],
             So look for such child blocks, and patch them.  */
          for (i = 0; i < BLOCKVECTOR_NBLOCKS (bv); i++)
@@ -1231,13 +1236,17 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
 
              if (nparams > 0)
                {
+                 struct dict_iterator iter;
                  TYPE_NFIELDS (ftype) = nparams;
                  TYPE_FIELDS (ftype) = (struct field *)
                    TYPE_ALLOC (ftype, nparams * sizeof (struct field));
 
-                 for (i = iparams = 0; iparams < nparams; i++)
+                 iparams = 0;
+                 ALL_BLOCK_SYMBOLS (b, iter, sym)
                    {
-                     sym = BLOCK_SYM (b, i);
+                     if (iparams == nparams)
+                       break;
+
                      switch (SYMBOL_CLASS (sym))
                        {
                        case LOC_ARG:
@@ -1261,7 +1270,6 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
             displacement from the procedure`s start address of the
             end of this block. */
          BLOCK_END (top_stack->cur_block) = sh->value + top_stack->procadr;
-         shrink_block (top_stack->cur_block, top_stack->cur_st);
        }
       else if (sh->sc == scText && top_stack->blocktype == stNil)
        {
@@ -1337,7 +1345,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
       if (has_opaque_xref (cur_fdr, sh))
        break;
       s = new_symbol (name);
-      SYMBOL_NAMESPACE (s) = VAR_NAMESPACE;
+      SYMBOL_DOMAIN (s) = VAR_DOMAIN;
       SYMBOL_CLASS (s) = LOC_TYPEDEF;
       SYMBOL_BLOCK_VALUE (s) = top_stack->cur_block;
       SYMBOL_TYPE (s) = t;
@@ -1372,7 +1380,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
                 for anything except pointers or functions.  */
            }
          else
-           TYPE_NAME (SYMBOL_TYPE (s)) = SYMBOL_NAME (s);
+           TYPE_NAME (SYMBOL_TYPE (s)) = DEPRECATED_SYMBOL_NAME (s);
        }
       break;
 
@@ -1517,9 +1525,7 @@ parse_type (int fd, union aux_ext *ax, unsigned int aux_index, int *bs,
   if (t->fBitfield)
     {
       int width = AUX_GET_WIDTH (bigend, ax);
-
-      /* Inhibit core dumps with some cfront generated objects that
-         corrupt the TIR.  */
+      /* Inhibit core dumps if TIR is corrupted.  */
       if (bs == (int *) NULL)
        {
          /* Alpha cc -migrate encodes char and unsigned char types
@@ -1629,7 +1635,7 @@ parse_type (int fd, union aux_ext *ax, unsigned int aux_index, int *bs,
          if (name[0] == '.' || name[0] == '\0')
            TYPE_TAG_NAME (tp) = NULL;
          else if (TYPE_TAG_NAME (tp) == NULL
-                  || !STREQ (TYPE_TAG_NAME (tp), name))
+                  || strcmp (TYPE_TAG_NAME (tp), name) != 0)
            TYPE_TAG_NAME (tp) = obsavestring (name, strlen (name),
                                            &current_objfile->type_obstack);
        }
@@ -1664,7 +1670,8 @@ parse_type (int fd, union aux_ext *ax, unsigned int aux_index, int *bs,
              bad_tag_guess_complaint (sym_name);
              TYPE_CODE (tp) = type_code;
            }
-         if (TYPE_NAME (tp) == NULL || !STREQ (TYPE_NAME (tp), name))
+         if (TYPE_NAME (tp) == NULL
+             || strcmp (TYPE_NAME (tp), name) != 0)
            TYPE_NAME (tp) = obsavestring (name, strlen (name),
                                           &current_objfile->type_obstack);
        }
@@ -1918,19 +1925,19 @@ parse_procedure (PDR *pr, struct symtab *search_symtab,
          the same name exists, lookup_symbol will eventually read in the symtab
          for the global function and clobber cur_fdr.  */
       FDR *save_cur_fdr = cur_fdr;
-      s = lookup_symbol (sh_name, NULL, VAR_NAMESPACE, 0, NULL);
+      s = lookup_symbol (sh_name, NULL, VAR_DOMAIN, 0, NULL);
       cur_fdr = save_cur_fdr;
 #else
       s = mylookup_symbol
        (sh_name,
         BLOCKVECTOR_BLOCK (BLOCKVECTOR (search_symtab), STATIC_BLOCK),
-        VAR_NAMESPACE,
+        VAR_DOMAIN,
         LOC_BLOCK);
 #endif
     }
   else
     s = mylookup_symbol (sh_name, top_stack->cur_block,
-                        VAR_NAMESPACE, LOC_BLOCK);
+                        VAR_DOMAIN, LOC_BLOCK);
 
   if (s != 0)
     {
@@ -1944,7 +1951,7 @@ parse_procedure (PDR *pr, struct symtab *search_symtab,
 #else
 /* FIXME -- delete.  We can't do symbol allocation now; it's all done.  */
       s = new_symbol (sh_name);
-      SYMBOL_NAMESPACE (s) = VAR_NAMESPACE;
+      SYMBOL_DOMAIN (s) = VAR_DOMAIN;
       SYMBOL_CLASS (s) = LOC_BLOCK;
       /* Donno its type, hope int is ok */
       SYMBOL_TYPE (s) = lookup_function_type (mdebug_type_int);
@@ -1962,7 +1969,7 @@ parse_procedure (PDR *pr, struct symtab *search_symtab,
 #endif
     }
 
-  i = mylookup_symbol (MIPS_EFI_SYMBOL_NAME, b, LABEL_NAMESPACE, LOC_CONST);
+  i = mylookup_symbol (MIPS_EFI_SYMBOL_NAME, b, LABEL_DOMAIN, LOC_CONST);
 
   if (i)
     {
@@ -1984,7 +1991,8 @@ parse_procedure (PDR *pr, struct symtab *search_symtab,
 
       /* Correct incorrect setjmp procedure descriptor from the library
          to make backtrace through setjmp work.  */
-      if (e->pdr.pcreg == 0 && STREQ (sh_name, "setjmp"))
+      if (e->pdr.pcreg == 0
+         && strcmp (sh_name, "setjmp") == 0)
        {
          complaint (&symfile_complaints, "fixing bad setjmp PDR from libc");
          e->pdr.pcreg = RA_REGNUM;
@@ -2221,7 +2229,7 @@ parse_partial_symbols (struct objfile *objfile)
   char *ext_out;
   char *ext_out_end;
   EXTR *ext_block;
-  register EXTR *ext_in;
+  EXTR *ext_in;
   EXTR *ext_in_end;
   SYMR sh;
   struct partial_symtab *pst;
@@ -2605,7 +2613,8 @@ parse_partial_symbols (struct objfile *objfile)
                          ((char *) debug_info->external_sym
                           + (fh->isymBase + 1) * external_sym_size),
                          &sh);
-         if (STREQ (debug_info->ss + fh->issBase + sh.iss, stabs_symbol))
+         if (strcmp (debug_info->ss + fh->issBase + sh.iss,
+                     stabs_symbol) == 0)
            processing_gcc_compilation = 2;
        }
 
@@ -2926,12 +2935,13 @@ parse_partial_symbols (struct objfile *objfile)
                         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 (pst && STREQ (namestring, pst->filename))
+                     if (pst && strcmp (namestring, pst->filename) == 0)
                        continue;
                      {
-                       register int i;
+                       int i;
                        for (i = 0; i < includes_used; i++)
-                         if (STREQ (namestring, psymtab_include_list[i]))
+                         if (strcmp (namestring,
+                                     psymtab_include_list[i]) == 0)
                            {
                              i = -1;
                              break;
@@ -2948,7 +2958,7 @@ parse_partial_symbols (struct objfile *objfile)
                          psymtab_include_list = (char **)
                            alloca ((includes_allocated *= 2) *
                                    sizeof (char *));
-                         memcpy ((PTR) psymtab_include_list, (PTR) orig,
+                         memcpy (psymtab_include_list, orig,
                                  includes_used * sizeof (char *));
                        }
                      continue;
@@ -2994,7 +3004,7 @@ parse_partial_symbols (struct objfile *objfile)
                        namestring = STATIC_TRANSFORM_NAME (namestring);
 #endif
                        add_psymbol_to_list (namestring, p - namestring,
-                                            VAR_NAMESPACE, LOC_STATIC,
+                                            VAR_DOMAIN, LOC_STATIC,
                                             &objfile->static_psymbols,
                                             0, sh.value,
                                             psymtab_language, objfile);
@@ -3004,7 +3014,7 @@ parse_partial_symbols (struct objfile *objfile)
                        /* The addresses in these entries are reported to be
                           wrong.  See the code that reads 'G's for symtabs. */
                        add_psymbol_to_list (namestring, p - namestring,
-                                            VAR_NAMESPACE, LOC_STATIC,
+                                            VAR_DOMAIN, LOC_STATIC,
                                             &objfile->global_psymbols,
                                             0, sh.value,
                                             psymtab_language, objfile);
@@ -3022,7 +3032,7 @@ parse_partial_symbols (struct objfile *objfile)
                                && namestring[0] != ' '))
                          {
                            add_psymbol_to_list (namestring, p - namestring,
-                                                STRUCT_NAMESPACE, LOC_TYPEDEF,
+                                                STRUCT_DOMAIN, LOC_TYPEDEF,
                                                 &objfile->static_psymbols,
                                                 sh.value, 0,
                                                 psymtab_language, objfile);
@@ -3030,33 +3040,19 @@ parse_partial_symbols (struct objfile *objfile)
                              {
                                /* Also a typedef with the same name.  */
                                add_psymbol_to_list (namestring, p - namestring,
-                                                    VAR_NAMESPACE, LOC_TYPEDEF,
+                                                    VAR_DOMAIN, LOC_TYPEDEF,
                                                     &objfile->static_psymbols,
                                                     sh.value, 0,
                                                     psymtab_language, objfile);
                                p += 1;
                              }
-                           /* The semantics of C++ state that "struct foo { ... }"
-                              also defines a typedef for "foo".  Unfortuantely, cfront
-                              never makes the typedef when translating from C++ to C.
-                              We make the typedef here so that "ptype foo" works as
-                              expected for cfront translated code.  */
-                           else if (psymtab_language == language_cplus)
-                             {
-                               /* Also a typedef with the same name.  */
-                               add_psymbol_to_list (namestring, p - namestring,
-                                                    VAR_NAMESPACE, LOC_TYPEDEF,
-                                                    &objfile->static_psymbols,
-                                                    sh.value, 0,
-                                                    psymtab_language, objfile);
-                             }
                          }
                        goto check_enum;
                      case 't':
                        if (p != namestring)    /* a name is there, not just :T... */
                          {
                            add_psymbol_to_list (namestring, p - namestring,
-                                                VAR_NAMESPACE, LOC_TYPEDEF,
+                                                VAR_DOMAIN, LOC_TYPEDEF,
                                                 &objfile->static_psymbols,
                                                 sh.value, 0,
                                                 psymtab_language, objfile);
@@ -3118,7 +3114,7 @@ parse_partial_symbols (struct objfile *objfile)
                                /* Note that the value doesn't matter for
                                   enum constants in psymtabs, just in symtabs.  */
                                add_psymbol_to_list (p, q - p,
-                                                    VAR_NAMESPACE, LOC_CONST,
+                                                    VAR_DOMAIN, LOC_CONST,
                                                     &objfile->static_psymbols, 0,
                                                     0, psymtab_language, objfile);
                                /* Point past the name.  */
@@ -3135,7 +3131,7 @@ parse_partial_symbols (struct objfile *objfile)
                      case 'c':
                        /* Constant, e.g. from "const" in Pascal.  */
                        add_psymbol_to_list (namestring, p - namestring,
-                                            VAR_NAMESPACE, LOC_CONST,
+                                            VAR_DOMAIN, LOC_CONST,
                                             &objfile->static_psymbols, sh.value,
                                             0, psymtab_language, objfile);
                        continue;
@@ -3152,7 +3148,7 @@ parse_partial_symbols (struct objfile *objfile)
                          }
                        sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
                        add_psymbol_to_list (namestring, p - namestring,
-                                            VAR_NAMESPACE, LOC_BLOCK,
+                                            VAR_DOMAIN, LOC_BLOCK,
                                             &objfile->static_psymbols,
                                             0, sh.value,
                                             psymtab_language, objfile);
@@ -3173,7 +3169,7 @@ parse_partial_symbols (struct objfile *objfile)
                          }
                        sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
                        add_psymbol_to_list (namestring, p - namestring,
-                                            VAR_NAMESPACE, LOC_BLOCK,
+                                            VAR_DOMAIN, LOC_BLOCK,
                                             &objfile->global_psymbols,
                                             0, sh.value,
                                             psymtab_language, objfile);
@@ -3196,9 +3192,6 @@ parse_partial_symbols (struct objfile *objfile)
                      case '9':
                      case '-':
                      case '#':         /* for symbol identification (used in live ranges) */
-                       /* added to support cfront stabs strings */
-                     case 'Z':         /* for definition continuations */
-                     case 'P':         /* for prototypes */
                        continue;
 
                      case ':':
@@ -3406,12 +3399,12 @@ parse_partial_symbols (struct objfile *objfile)
                     symbol table.  */
                  if (sh.st == stProc)
                    add_psymbol_to_list (name, strlen (name),
-                                        VAR_NAMESPACE, LOC_BLOCK,
+                                        VAR_DOMAIN, LOC_BLOCK,
                                         &objfile->global_psymbols,
                                    0, sh.value, psymtab_language, objfile);
                  else
                    add_psymbol_to_list (name, strlen (name),
-                                        VAR_NAMESPACE, LOC_BLOCK,
+                                        VAR_DOMAIN, LOC_BLOCK,
                                         &objfile->static_psymbols,
                                    0, sh.value, psymtab_language, objfile);
 
@@ -3480,7 +3473,7 @@ parse_partial_symbols (struct objfile *objfile)
                      && sh.index != cur_sdx + 2)
                    {
                      add_psymbol_to_list (name, strlen (name),
-                                          STRUCT_NAMESPACE, LOC_TYPEDEF,
+                                          STRUCT_DOMAIN, LOC_TYPEDEF,
                                           &objfile->static_psymbols,
                                           0, (CORE_ADDR) 0,
                                           psymtab_language, objfile);
@@ -3521,7 +3514,7 @@ parse_partial_symbols (struct objfile *objfile)
                }
              /* Use this gdb symbol */
              add_psymbol_to_list (name, strlen (name),
-                                  VAR_NAMESPACE, class,
+                                  VAR_DOMAIN, class,
                                   &objfile->static_psymbols,
                                   0, sh.value, psymtab_language, objfile);
            skip:
@@ -3597,7 +3590,7 @@ parse_partial_symbols (struct objfile *objfile)
                }
              name = debug_info->ssext + psh->iss;
              add_psymbol_to_list (name, strlen (name),
-                                  VAR_NAMESPACE, class,
+                                  VAR_DOMAIN, class,
                                   &objfile->global_psymbols,
                                   0, svalue,
                                   psymtab_language, objfile);
@@ -3616,8 +3609,8 @@ parse_partial_symbols (struct objfile *objfile)
       if (objfile->ei.entry_point >= save_pst->textlow &&
          objfile->ei.entry_point < save_pst->texthigh)
        {
-         objfile->ei.entry_file_lowpc = save_pst->textlow;
-         objfile->ei.entry_file_highpc = save_pst->texthigh;
+         objfile->ei.deprecated_entry_file_lowpc = save_pst->textlow;
+         objfile->ei.deprecated_entry_file_highpc = save_pst->texthigh;
        }
 
       /* The objfile has its functions reordered if this partial symbol
@@ -3767,7 +3760,7 @@ handle_psymbol_enumerators (struct objfile *objfile, FDR *fh, int stype,
       /* Note that the value doesn't matter for enum constants
          in psymtabs, just in symtabs.  */
       add_psymbol_to_list (name, strlen (name),
-                          VAR_NAMESPACE, LOC_CONST,
+                          VAR_DOMAIN, LOC_CONST,
                           &objfile->static_psymbols, 0,
                           (CORE_ADDR) 0, psymtab_language, objfile);
       ext_sym += external_sym_size;
@@ -3875,8 +3868,8 @@ psymtab_to_symtab_1 (struct partial_symtab *pst, char *filename)
                      ((char *) debug_info->external_sym
                       + (fh->isymBase + 1) * external_sym_size),
                      &sh);
-      if (STREQ (debug_info->ss + fh->issBase + sh.iss,
-                stabs_symbol))
+      if (strcmp (debug_info->ss + fh->issBase + sh.iss,
+                 stabs_symbol) == 0)
        {
          /* We indicate that this is a GCC compilation so that certain
             features will be enabled in stabsread/dbxread.  */
@@ -3960,7 +3953,7 @@ psymtab_to_symtab_1 (struct partial_symtab *pst, char *filename)
                  struct symbol *s = new_symbol (MIPS_EFI_SYMBOL_NAME);
 
                  memset (e, 0, sizeof (struct mips_extra_func_info));
-                 SYMBOL_NAMESPACE (s) = LABEL_NAMESPACE;
+                 SYMBOL_DOMAIN (s) = LABEL_DOMAIN;
                  SYMBOL_CLASS (s) = LOC_CONST;
                  SYMBOL_TYPE (s) = mdebug_type_void;
                  SYMBOL_VALUE (s) = (long) e;
@@ -3997,10 +3990,6 @@ psymtab_to_symtab_1 (struct partial_symtab *pst, char *filename)
          end_stabs ();
        }
 
-      /* Sort the symbol table now, we are done adding symbols to it.
-         We must do this before parse_procedure calls lookup_symbol.  */
-      sort_symtab_syms (st);
-
       /* There used to be a call to sort_blocks here, but this should not
          be necessary for stabs symtabs.  And as sort_blocks modifies the
          start address of the GLOBAL_BLOCK to the FIRST_LOCAL_BLOCK,
@@ -4054,19 +4043,15 @@ psymtab_to_symtab_1 (struct partial_symtab *pst, char *filename)
       int maxlines;
       EXTR *ext_ptr;
 
-      /* How many symbols will we need */
-      /* FIXME, this does not count enum values. */
-      f_max = pst->n_global_syms + pst->n_static_syms;
       if (fh == 0)
        {
          maxlines = 0;
-         st = new_symtab ("unknown", f_max, 0, pst->objfile);
+         st = new_symtab ("unknown", 0, pst->objfile);
        }
       else
        {
-         f_max += fh->csym + fh->cpd;
          maxlines = 2 * fh->cline;
-         st = new_symtab (pst->filename, 2 * f_max, maxlines, pst->objfile);
+         st = new_symtab (pst->filename, maxlines, pst->objfile);
 
          /* The proper language was already determined when building
             the psymtab, use it.  */
@@ -4086,7 +4071,6 @@ psymtab_to_symtab_1 (struct partial_symtab *pst, char *filename)
       BLOCK_START (top_stack->cur_block) = pst->textlow;
       BLOCK_END (top_stack->cur_block) = 0;
       top_stack->blocktype = stFile;
-      top_stack->maxsyms = 2 * f_max;
       top_stack->cur_type = 0;
       top_stack->procadr = 0;
       top_stack->numargs = 0;
@@ -4170,10 +4154,6 @@ psymtab_to_symtab_1 (struct partial_symtab *pst, char *filename)
       top_stack->cur_block = BLOCKVECTOR_BLOCK (BLOCKVECTOR (top_stack->cur_st),
                                                GLOBAL_BLOCK);
       top_stack->blocktype = stFile;
-      top_stack->maxsyms
-       = (debug_info->symbolic_header.isymMax
-          + debug_info->symbolic_header.ipdMax
-          + debug_info->symbolic_header.iextMax);
 
       ext_ptr = PST_PRIVATE (pst)->extern_tab;
       for (i = PST_PRIVATE (pst)->extern_count; --i >= 0; ext_ptr++)
@@ -4195,9 +4175,6 @@ psymtab_to_symtab_1 (struct partial_symtab *pst, char *filename)
 
       st->primary = 1;
 
-      /* Sort the symbol table now, we are done adding symbols to it. */
-      sort_symtab_syms (st);
-
       sort_blocks (st);
     }
 
@@ -4443,64 +4420,36 @@ cross_ref (int fd, union aux_ext *ax, struct type **tpp, enum type_code type_cod
    keeping the symtab sorted */
 
 static struct symbol *
-mylookup_symbol (char *name, register struct block *block,
-                namespace_enum namespace, enum address_class class)
+mylookup_symbol (char *name, struct block *block,
+                domain_enum domain, enum address_class class)
 {
-  int i, inc;
+  struct dict_iterator iter;
+  int inc;
   struct symbol *sym;
 
   inc = name[0];
-  ALL_BLOCK_SYMBOLS (block, i, sym)
+  ALL_BLOCK_SYMBOLS (block, iter, sym)
     {
-      if (SYMBOL_NAME (sym)[0] == inc
-         && SYMBOL_NAMESPACE (sym) == namespace
+      if (DEPRECATED_SYMBOL_NAME (sym)[0] == inc
+         && SYMBOL_DOMAIN (sym) == domain
          && SYMBOL_CLASS (sym) == class
-         && strcmp (SYMBOL_NAME (sym), name) == 0)
+         && strcmp (DEPRECATED_SYMBOL_NAME (sym), name) == 0)
        return sym;
     }
 
   block = BLOCK_SUPERBLOCK (block);
   if (block)
-    return mylookup_symbol (name, block, namespace, class);
+    return mylookup_symbol (name, block, domain, class);
   return 0;
 }
 
 
-/* Add a new symbol S to a block B.
-   Infrequently, we will need to reallocate the block to make it bigger.
-   We only detect this case when adding to top_stack->cur_block, since
-   that's the only time we know how big the block is.  FIXME.  */
+/* Add a new symbol S to a block B.  */
 
 static void
 add_symbol (struct symbol *s, struct block *b)
 {
-  int nsyms = BLOCK_NSYMS (b)++;
-  struct block *origb;
-  struct parse_stack *stackp;
-
-  if (b == top_stack->cur_block &&
-      nsyms >= top_stack->maxsyms)
-    {
-      complaint (&symfile_complaints, "block containing %s overfilled",
-                SYMBOL_NAME (s));
-      /* In this case shrink_block is actually grow_block, since
-         BLOCK_NSYMS(b) is larger than its current size.  */
-      origb = b;
-      b = shrink_block (top_stack->cur_block, top_stack->cur_st);
-
-      /* Now run through the stack replacing pointers to the
-         original block.  shrink_block has already done this
-         for the blockvector and BLOCK_FUNCTION.  */
-      for (stackp = top_stack; stackp; stackp = stackp->next)
-       {
-         if (stackp->cur_block == origb)
-           {
-             stackp->cur_block = b;
-             stackp->maxsyms = BLOCK_NSYMS (b);
-           }
-       }
-    }
-  BLOCK_SYM (b, nsyms) = s;
+  dict_add_symbol (BLOCK_DICT (b), s);
 }
 
 /* Add a new block B to a symtab S */
@@ -4560,7 +4509,7 @@ add_line (struct linetable *lt, int lineno, CORE_ADDR adr, int last)
 static int
 compare_blocks (const void *arg1, const void *arg2)
 {
-  register int addr_diff;
+  LONGEST addr_diff;
   struct block **b1 = (struct block **) arg1;
   struct block **b2 = (struct block **) arg2;
 
@@ -4601,8 +4550,8 @@ sort_blocks (struct symtab *s)
           compare_blocks);
 
   {
-    register CORE_ADDR high = 0;
-    register int i, j = BLOCKVECTOR_NBLOCKS (bv);
+    CORE_ADDR high = 0;
+    int i, j = BLOCKVECTOR_NBLOCKS (bv);
 
     for (i = FIRST_LOCAL_BLOCK; i < j; i++)
       if (high < BLOCK_END (BLOCKVECTOR_BLOCK (bv, i)))
@@ -4622,11 +4571,11 @@ sort_blocks (struct symtab *s)
 
 /* Constructor/restructor/destructor procedures */
 
-/* Allocate a new symtab for NAME.  Needs an estimate of how many symbols
-   MAXSYMS and linenumbers MAXLINES we'll put in it */
+/* Allocate a new symtab for NAME.  Needs an estimate of how many
+   linenumbers MAXLINES we'll put in it */
 
 static struct symtab *
-new_symtab (char *name, int maxsyms, int maxlines, struct objfile *objfile)
+new_symtab (char *name, int maxlines, struct objfile *objfile)
 {
   struct symtab *s = allocate_symtab (name, objfile);
 
@@ -4634,8 +4583,10 @@ new_symtab (char *name, int maxsyms, int maxlines, struct objfile *objfile)
 
   /* All symtabs must have at least two blocks */
   BLOCKVECTOR (s) = new_bvect (2);
-  BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), GLOBAL_BLOCK) = new_block (maxsyms);
-  BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), STATIC_BLOCK) = new_block (maxsyms);
+  BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), GLOBAL_BLOCK)
+    = new_block (NON_FUNCTION_BLOCK);
+  BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), STATIC_BLOCK)
+    = new_block (NON_FUNCTION_BLOCK);
   BLOCK_SUPERBLOCK (BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), STATIC_BLOCK)) =
     BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), GLOBAL_BLOCK);
 
@@ -4719,48 +4670,25 @@ new_bvect (int nblocks)
   return bv;
 }
 
-/* Allocate and zero a new block of MAXSYMS symbols */
+/* Allocate and zero a new block, and set its BLOCK_DICT.  If function
+   is non-zero, assume the block is associated to a function, and make
+   sure that the symbols are stored linearly; otherwise, store them
+   hashed.  */
 
 static struct block *
-new_block (int maxsyms)
+new_block (enum block_type type)
 {
-  int size = sizeof (struct block) + (maxsyms - 1) * sizeof (struct symbol *);
-
-  return (struct block *) xzalloc (size);
-}
-
-/* Ooops, too big. Shrink block B in symtab S to its minimal size.
-   Shrink_block can also be used by add_symbol to grow a block.  */
+  /* FIXME: carlton/2003-09-11: This should use allocate_block to
+     allocate the block.  Which, in turn, suggests that the block
+     should be allocated on an obstack.  */
+  struct block *retval = xzalloc (sizeof (struct block));
 
-static struct block *
-shrink_block (struct block *b, struct symtab *s)
-{
-  struct block *new;
-  struct blockvector *bv = BLOCKVECTOR (s);
-  int i;
+  if (type == FUNCTION_BLOCK)
+    BLOCK_DICT (retval) = dict_create_linear_expandable ();
+  else
+    BLOCK_DICT (retval) = dict_create_hashed_expandable ();
 
-  /* Just reallocate it and fix references to the old one */
-
-  new = (struct block *) xrealloc ((void *) b,
-                                  (sizeof (struct block)
-                                   + ((BLOCK_NSYMS (b) - 1)
-                                      * sizeof (struct symbol *))));
-
-  /* FIXME: Not worth hashing this block as it's built.  */
-  /* All callers should have created the block with new_block (), which
-     would mean it was not previously hashed.  Make sure.  */
-  gdb_assert (BLOCK_HASHTABLE (new) == 0);
-
-  /* Should chase pointers to old one.  Fortunately, that`s just
-     the block`s function and inferior blocks */
-  if (BLOCK_FUNCTION (new) && SYMBOL_BLOCK_VALUE (BLOCK_FUNCTION (new)) == b)
-    SYMBOL_BLOCK_VALUE (BLOCK_FUNCTION (new)) = new;
-  for (i = 0; i < BLOCKVECTOR_NBLOCKS (bv); i++)
-    if (BLOCKVECTOR_BLOCK (bv, i) == b)
-      BLOCKVECTOR_BLOCK (bv, i) = new;
-    else if (BLOCK_SUPERBLOCK (BLOCKVECTOR_BLOCK (bv, i)) == b)
-      BLOCK_SUPERBLOCK (BLOCKVECTOR_BLOCK (bv, i)) = new;
-  return new;
+  return retval;
 }
 
 /* Create a new symbol with printname NAME */
@@ -4773,10 +4701,8 @@ new_symbol (char *name)
                                     sizeof (struct symbol)));
 
   memset (s, 0, sizeof (*s));
-  SYMBOL_NAME (s) = obsavestring (name, strlen (name),
-                                 &current_objfile->symbol_obstack);
   SYMBOL_LANGUAGE (s) = psymtab_language;
-  SYMBOL_INIT_DEMANGLED_NAME (s, &current_objfile->symbol_obstack);
+  SYMBOL_SET_NAMES (s, name, strlen (name), current_objfile);
   return s;
 }
 
@@ -4804,6 +4730,14 @@ elfmdebug_build_psymtabs (struct objfile *objfile,
 {
   bfd *abfd = objfile->obfd;
   struct ecoff_debug_info *info;
+  struct cleanup *back_to;
+
+  /* FIXME: It's not clear whether we should be getting minimal symbol
+     information from .mdebug in an ELF file, or whether we will.
+     Re-initialize the minimal symbol reader in case we do.  */
+
+  init_minimal_symbol_collection ();
+  back_to = make_cleanup_discard_minimal_symbols ();
 
   info = ((struct ecoff_debug_info *)
          obstack_alloc (&objfile->psymbol_obstack,
@@ -4814,6 +4748,9 @@ elfmdebug_build_psymtabs (struct objfile *objfile,
           bfd_errmsg (bfd_get_error ()));
 
   mdebug_build_psymtabs (objfile, swap, info);
+
+  install_minimal_symbols (objfile);
+  do_cleanups (back_to);
 }
 \f
 
@@ -4846,16 +4783,16 @@ fixup_sigtramp (void)
   /* We have to handle the following cases here:
      a) The Mips library has a sigtramp label within sigvec.
      b) Irix has a _sigtramp which we want to use, but it also has sigvec.  */
-  s = lookup_symbol ("sigvec", 0, VAR_NAMESPACE, 0, NULL);
+  s = lookup_symbol ("sigvec", 0, VAR_DOMAIN, 0, NULL);
   if (s != 0)
     {
       b0 = SYMBOL_BLOCK_VALUE (s);
-      s = lookup_symbol ("sigtramp", b0, VAR_NAMESPACE, 0, NULL);
+      s = lookup_symbol ("sigtramp", b0, VAR_DOMAIN, 0, NULL);
     }
   if (s == 0)
     {
       /* No sigvec or no sigtramp inside sigvec, try _sigtramp.  */
-      s = lookup_symbol ("_sigtramp", 0, VAR_NAMESPACE, 0, NULL);
+      s = lookup_symbol ("_sigtramp", 0, VAR_DOMAIN, 0, NULL);
     }
 
   /* But maybe this program uses its own version of sigvec */
@@ -4881,14 +4818,14 @@ fixup_sigtramp (void)
    * needed info.  Note we make it a nested procedure of sigvec,
    * which is the way the (assembly) code is actually written.
    */
-  SYMBOL_NAMESPACE (s) = VAR_NAMESPACE;
+  SYMBOL_DOMAIN (s) = VAR_DOMAIN;
   SYMBOL_CLASS (s) = LOC_BLOCK;
   SYMBOL_TYPE (s) = init_type (TYPE_CODE_FUNC, 4, 0, (char *) NULL,
                               st->objfile);
   TYPE_TARGET_TYPE (SYMBOL_TYPE (s)) = mdebug_type_void;
 
   /* Need a block to allocate MIPS_EFI_SYMBOL_NAME in */
-  b = new_block (1);
+  b = new_block (NON_FUNCTION_BLOCK);
   SYMBOL_BLOCK_VALUE (s) = b;
   BLOCK_START (b) = sigtramp_address;
   BLOCK_END (b) = sigtramp_end;
@@ -4925,13 +4862,13 @@ fixup_sigtramp (void)
     current_objfile = st->objfile;     /* Keep new_symbol happy */
     s = new_symbol (MIPS_EFI_SYMBOL_NAME);
     SYMBOL_VALUE (s) = (long) e;
-    SYMBOL_NAMESPACE (s) = LABEL_NAMESPACE;
+    SYMBOL_DOMAIN (s) = LABEL_DOMAIN;
     SYMBOL_CLASS (s) = LOC_CONST;
     SYMBOL_TYPE (s) = mdebug_type_void;
     current_objfile = NULL;
   }
 
-  BLOCK_SYM (b, BLOCK_NSYMS (b)++) = s;
+  dict_add_symbol (BLOCK_DICT (b), s);
 }
 
 #endif /* TM_MIPS_H */
This page took 0.037426 seconds and 4 git commands to generate.