2004-01-09 Elena Zannoni <ezannoni@redhat.com>
[deliverable/binutils-gdb.git] / gdb / buildsym.c
index d3c9ddfc175b46e2c58fa53075bd5787f8eabc63..93090ede2667a7bbfbda4c0fe913f45a00bacbac 100644 (file)
@@ -45,6 +45,7 @@
 #include "demangle.h"          /* Needed by SYMBOL_INIT_DEMANGLED_NAME.  */
 #include "block.h"
 #include "cp-support.h"
+#include "dictionary.h"
 
 /* Ask buildsym.h to define the vars it normally declares `extern'.  */
 #define        EXTERN
@@ -83,7 +84,7 @@ static int compare_line_numbers (const void *ln1p, const void *ln2p);
 void
 add_free_pendings (struct pending *list)
 {
-  register struct pending *link = list;
+  struct pending *link = list;
 
   if (list)
     {
@@ -101,7 +102,7 @@ add_free_pendings (struct pending *list)
 void
 add_symbol_to_list (struct symbol *symbol, struct pending **listhead)
 {
-  register struct pending *link;
+  struct pending *link;
 
   /* If this is an alias for another symbol, don't add it.  */
   if (symbol->ginfo.name && symbol->ginfo.name[0] == '#')
@@ -163,7 +164,6 @@ find_symbol_in_list (struct pending *list, char *name, int length)
 /* At end of reading syms, or in case of quit, really free as many
    `struct pending's as we can easily find. */
 
-/* ARGSUSED */
 void
 really_free_pendings (void *dummy)
 {
@@ -225,66 +225,22 @@ finish_block (struct symbol *symbol, struct pending **listhead,
              CORE_ADDR start, CORE_ADDR end,
              struct objfile *objfile)
 {
-  register struct pending *next, *next1;
-  register struct block *block;
-  register struct pending_block *pblock;
+  struct pending *next, *next1;
+  struct block *block;
+  struct pending_block *pblock;
   struct pending_block *opblock;
-  register int i;
-  register int j;
-
-  /* Count the length of the list of symbols.  */
 
-  for (next = *listhead, i = 0;
-       next;
-       i += next->nsyms, next = next->next)
-    {
-      /* EMPTY */ ;
-    }
-
-  /* Copy the symbols into the block.  */
+  block = allocate_block (&objfile->symbol_obstack);
 
   if (symbol)
     {
-      block = (struct block *) 
-       obstack_alloc (&objfile->symbol_obstack,
-                      (sizeof (struct block) + 
-                       ((i - 1) * sizeof (struct symbol *))));
-      BLOCK_NSYMS (block) = i;
-      for (next = *listhead; next; next = next->next)
-       for (j = next->nsyms - 1; j >= 0; j--)
-         {
-           BLOCK_SYM (block, --i) = next->symbol[j];
-         }
+      BLOCK_DICT (block) = dict_create_linear (&objfile->symbol_obstack,
+                                              *listhead);
     }
   else
     {
-      int htab_size = BLOCK_HASHTABLE_SIZE (i);
-
-      block = (struct block *) 
-       obstack_alloc (&objfile->symbol_obstack,
-                      (sizeof (struct block) + 
-                       ((htab_size - 1) * sizeof (struct symbol *))));
-      for (j = 0; j < htab_size; j++)
-       {
-         BLOCK_BUCKET (block, j) = 0;
-       }
-      BLOCK_BUCKETS (block) = htab_size;
-      for (next = *listhead; next; next = next->next)
-       {
-         for (j = next->nsyms - 1; j >= 0; j--)
-           {
-             struct symbol *sym;
-             unsigned int hash_index;
-             const char *name = SYMBOL_DEMANGLED_NAME (next->symbol[j]);
-             if (name == NULL)
-               name = DEPRECATED_SYMBOL_NAME (next->symbol[j]);
-             hash_index = msymbol_hash_iw (name);
-             hash_index = hash_index % BLOCK_BUCKETS (block);
-             sym = BLOCK_BUCKET (block, hash_index);
-             BLOCK_BUCKET (block, hash_index) = next->symbol[j];
-             next->symbol[j]->hash_next = sym;
-           }
-       }
+      BLOCK_DICT (block) = dict_create_hashed (&objfile->symbol_obstack,
+                                              *listhead);
     }
 
   BLOCK_START (block) = start;
@@ -300,9 +256,9 @@ finish_block (struct symbol *symbol, struct pending **listhead,
   if (symbol)
     {
       struct type *ftype = SYMBOL_TYPE (symbol);
+      struct dict_iterator iter;
       SYMBOL_BLOCK_VALUE (symbol) = block;
       BLOCK_FUNCTION (block) = symbol;
-      BLOCK_HASHTABLE (block) = 0;
 
       if (TYPE_NFIELDS (ftype) <= 0)
        {
@@ -311,7 +267,7 @@ finish_block (struct symbol *symbol, struct pending **listhead,
             parameter symbols. */
          int nparams = 0, iparams;
          struct symbol *sym;
-         ALL_BLOCK_SYMBOLS (block, i, sym)
+         ALL_BLOCK_SYMBOLS (block, iter, sym)
            {
              switch (SYMBOL_CLASS (sym))
                {
@@ -348,9 +304,12 @@ finish_block (struct symbol *symbol, struct pending **listhead,
              TYPE_FIELDS (ftype) = (struct field *)
                TYPE_ALLOC (ftype, nparams * sizeof (struct field));
 
-             for (i = iparams = 0; iparams < nparams; i++)
+             iparams = 0;
+             ALL_BLOCK_SYMBOLS (block, iter, sym)
                {
-                 sym = BLOCK_SYM (block, i);
+                 if (iparams == nparams)
+                   break;
+
                  switch (SYMBOL_CLASS (sym))
                    {
                    case LOC_ARG:
@@ -394,7 +353,6 @@ finish_block (struct symbol *symbol, struct pending **listhead,
   else
     {
       BLOCK_FUNCTION (block) = NULL;
-      BLOCK_HASHTABLE (block) = 1;
     }
 
   /* Now "free" the links of the list, and empty the list.  */
@@ -476,6 +434,7 @@ finish_block (struct symbol *symbol, struct pending **listhead,
   record_pending_block (objfile, block, opblock);
 }
 
+
 /* Record BLOCK on the list of all blocks in the file.  Put it after
    OPBLOCK, or at the beginning if opblock is NULL.  This puts the
    block in the list after all its subblocks.
@@ -487,7 +446,7 @@ void
 record_pending_block (struct objfile *objfile, struct block *block,
                      struct pending_block *opblock)
 {
-  register struct pending_block *pblock;
+  struct pending_block *pblock;
 
   pblock = (struct pending_block *)
     obstack_alloc (&objfile->symbol_obstack, sizeof (struct pending_block));
@@ -507,9 +466,9 @@ record_pending_block (struct objfile *objfile, struct block *block,
 static struct blockvector *
 make_blockvector (struct objfile *objfile)
 {
-  register struct pending_block *next;
-  register struct blockvector *blockvector;
-  register int i;
+  struct pending_block *next;
+  struct blockvector *blockvector;
+  int i;
 
   /* Count the length of the list of blocks.  */
 
@@ -579,7 +538,7 @@ make_blockvector (struct objfile *objfile)
 void
 start_subfile (char *name, char *dirname)
 {
-  register struct subfile *subfile;
+  struct subfile *subfile;
 
   /* See if this subfile is already known as a subfile of the current
      main source file.  */
@@ -633,17 +592,9 @@ start_subfile (char *name, char *dirname)
      later via a call to record_debugformat. */
   subfile->debugformat = NULL;
 
-#if 0 /* OBSOLETE CFront */
-// OBSOLETE   /* cfront output is a C program, so in most ways it looks like a C
-// OBSOLETE      program.  But to demangle we need to set the language to C++.  We
-// OBSOLETE      can distinguish cfront code by the fact that it has #line
-// OBSOLETE      directives which specify a file name ending in .C. */
-#endif /* OBSOLETE CFront */
-     
   /* If the filename of this subfile ends in .C, then change the
      language of any pending subfiles from C to C++.  We also accept
      any other C++ suffixes accepted by deduce_language_from_filename.  */
-  /* OBSOLETE     (in particular, some people use .cxx with cfront).  */
   /* Likewise for f2c.  */
 
   if (subfile->name)
@@ -717,7 +668,7 @@ patch_subfile_names (struct subfile *subfile, char *name)
 void
 push_subfile (void)
 {
-  register struct subfile_stack *tem
+  struct subfile_stack *tem
   = (struct subfile_stack *) xmalloc (sizeof (struct subfile_stack));
 
   tem->next = subfile_stack;
@@ -732,8 +683,8 @@ push_subfile (void)
 char *
 pop_subfile (void)
 {
-  register char *name;
-  register struct subfile_stack *link = subfile_stack;
+  char *name;
+  struct subfile_stack *link = subfile_stack;
 
   if (link == NULL)
     {
@@ -749,7 +700,7 @@ pop_subfile (void)
    line vector for SUBFILE.  */
 
 void
-record_line (register struct subfile *subfile, int line, CORE_ADDR pc)
+record_line (struct subfile *subfile, int line, CORE_ADDR pc)
 {
   struct linetable_entry *e;
   /* Ignore the dummy line number in libg.o */
@@ -864,10 +815,10 @@ start_symtab (char *name, char *dirname, CORE_ADDR start_addr)
 struct symtab *
 end_symtab (CORE_ADDR end_addr, struct objfile *objfile, int section)
 {
-  register struct symtab *symtab = NULL;
-  register struct blockvector *blockvector;
-  register struct subfile *subfile;
-  register struct context_stack *cstk;
+  struct symtab *symtab = NULL;
+  struct blockvector *blockvector;
+  struct subfile *subfile;
+  struct context_stack *cstk;
   struct subfile *nextsub;
 
   /* Finish the lexical context of the last function in the file; pop
@@ -1031,7 +982,7 @@ end_symtab (CORE_ADDR end_addr, struct objfile *objfile, int section)
              symtab->dirname = NULL;
            }
          symtab->free_code = free_linetable;
-         symtab->free_ptr = NULL;
+         symtab->free_func = NULL;
 
          /* Use whatever language we have been using for this
             subfile, not the one that was deduced in allocate_symtab
@@ -1096,7 +1047,7 @@ end_symtab (CORE_ADDR end_addr, struct objfile *objfile, int section)
 struct context_stack *
 push_context (int desc, CORE_ADDR valu)
 {
-  register struct context_stack *new;
+  struct context_stack *new;
 
   if (context_stack_depth == context_stack_size)
     {
@@ -1158,7 +1109,7 @@ record_debugformat (char *format)
 void
 merge_symbol_lists (struct pending **srclist, struct pending **targetlist)
 {
-  register int i;
+  int i;
 
   if (!srclist || !*srclist)
     return;
This page took 0.027945 seconds and 4 git commands to generate.