2003-07-16 Andrew Cagney <cagney@redhat.com>
[deliverable/binutils-gdb.git] / gdb / buildsym.c
index 5e9ac84b4e32eb91428335e85633596b58415f2a..f0d75ce3f52ce64c1d82460c9738bf7d70a52137 100644 (file)
 #include "filenames.h"         /* For DOSish file names */
 #include "macrotab.h"
 #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
 /**/
@@ -90,7 +94,10 @@ add_free_pendings (struct pending *list)
     }
 }
       
-/* Add a symbol to one of the lists of symbols.  */
+/* Add a symbol to one of the lists of symbols.  While we're at it, if
+   we're in the C++ case and don't have full namespace debugging info,
+   check to see if it references an anonymous namespace; if so, add an
+   appropriate using directive.  */
 
 void
 add_symbol_to_list (struct symbol *symbol, struct pending **listhead)
@@ -121,6 +128,12 @@ add_symbol_to_list (struct symbol *symbol, struct pending **listhead)
     }
 
   (*listhead)->symbol[(*listhead)->nsyms++] = symbol;
+
+  /* Check to see if we might need to look for a mention of anonymous
+     namespaces.  */
+  
+  if (SYMBOL_LANGUAGE (symbol) == language_cplus)
+    cp_scan_for_anonymous_namespaces (symbol);
 }
 
 /* Find a symbol named NAME on a LIST.  NAME need not be
@@ -136,7 +149,7 @@ find_symbol_in_list (struct pending *list, char *name, int length)
     {
       for (j = list->nsyms; --j >= 0;)
        {
-         pp = SYMBOL_NAME (list->symbol[j]);
+         pp = DEPRECATED_SYMBOL_NAME (list->symbol[j]);
          if (*pp == *name && strncmp (pp, name, length) == 0 &&
              pp[length] == '\0')
            {
@@ -217,68 +230,29 @@ finish_block (struct symbol *symbol, struct pending **listhead,
   register struct block *block;
   register 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.  */
+  /* Initialize the block's dictionary.  */
 
   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];
-         }
+       obstack_alloc (&objfile->symbol_obstack, sizeof (struct block));
+      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 = 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;
-           }
-       }
+       obstack_alloc (&objfile->symbol_obstack, sizeof (struct block));
+      BLOCK_DICT (block) = dict_create_hashed (&objfile->symbol_obstack,
+                                              *listhead);
     }
 
   BLOCK_START (block) = start;
   BLOCK_END (block) = end;
   /* Superblock filled in when containing block is made */
   BLOCK_SUPERBLOCK (block) = NULL;
+  BLOCK_NAMESPACE (block) = NULL;
 
   BLOCK_GCC_COMPILED (block) = processing_gcc_compilation;
 
@@ -287,9 +261,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)
        {
@@ -298,7 +272,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))
                {
@@ -308,6 +282,7 @@ finish_block (struct symbol *symbol, struct pending **listhead,
                case LOC_REGPARM_ADDR:
                case LOC_BASEREG_ARG:
                case LOC_LOCAL_ARG:
+               case LOC_COMPUTED_ARG:
                  nparams++;
                  break;
                case LOC_UNDEF:
@@ -323,6 +298,7 @@ finish_block (struct symbol *symbol, struct pending **listhead,
                case LOC_BASEREG:
                case LOC_UNRESOLVED:
                case LOC_OPTIMIZED_OUT:
+               case LOC_COMPUTED:
                default:
                  break;
                }
@@ -333,9 +309,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:
@@ -344,6 +323,7 @@ finish_block (struct symbol *symbol, struct pending **listhead,
                    case LOC_REGPARM_ADDR:
                    case LOC_BASEREG_ARG:
                    case LOC_LOCAL_ARG:
+                   case LOC_COMPUTED_ARG:
                      TYPE_FIELD_TYPE (ftype, iparams) = SYMBOL_TYPE (sym);
                      TYPE_FIELD_ARTIFICIAL (ftype, iparams) = 0;
                      iparams++;
@@ -361,17 +341,23 @@ finish_block (struct symbol *symbol, struct pending **listhead,
                    case LOC_BASEREG:
                    case LOC_UNRESOLVED:
                    case LOC_OPTIMIZED_OUT:
+                   case LOC_COMPUTED:
                    default:
                      break;
                    }
                }
            }
        }
+
+      /* If we're in the C++ case, set the block's scope.  */
+      if (SYMBOL_LANGUAGE (symbol) == language_cplus)
+       {
+         cp_set_block_scope (symbol, block, &objfile->symbol_obstack);
+       }
     }
   else
     {
       BLOCK_FUNCTION (block) = NULL;
-      BLOCK_HASHTABLE (block) = 1;
     }
 
   /* Now "free" the links of the list, and empty the list.  */
@@ -394,7 +380,7 @@ finish_block (struct symbol *symbol, struct pending **listhead,
        {
          complaint (&symfile_complaints,
                     "block end address less than block start address in %s (patched it)",
-                    SYMBOL_SOURCE_NAME (symbol));
+                    SYMBOL_PRINT_NAME (symbol));
        }
       else
        {
@@ -428,7 +414,7 @@ finish_block (struct symbol *symbol, struct pending **listhead,
                {
                  complaint (&symfile_complaints,
                             "inner block not inside outer block in %s",
-                            SYMBOL_SOURCE_NAME (symbol));
+                            SYMBOL_PRINT_NAME (symbol));
                }
              else
                {
@@ -453,6 +439,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.
@@ -809,6 +796,10 @@ start_symtab (char *name, char *dirname, CORE_ADDR start_addr)
     }
   context_stack_depth = 0;
 
+  /* Set up support for C++ namespace support, in case we need it.  */
+
+  cp_initialize_namespace ();
+
   /* Initialize the list of sub source files with one entry for this
      file (the top-level source file).  */
 
@@ -930,6 +921,8 @@ end_symtab (CORE_ADDR end_addr, struct objfile *objfile, int section)
       finish_block (0, &global_symbols, 0, last_source_start_addr, end_addr,
                    objfile);
       blockvector = make_blockvector (objfile);
+      cp_finalize_namespace (BLOCKVECTOR_BLOCK (blockvector, STATIC_BLOCK),
+                            &objfile->symbol_obstack);
     }
 
 #ifndef PROCESS_LINENUMBER_HOOK
@@ -1002,7 +995,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
This page took 0.028703 seconds and 4 git commands to generate.