Fix typo in last gdb/ChangeLog entry.
[deliverable/binutils-gdb.git] / gdb / dictionary.c
index f3ac3069adbea1cd70a7afca69ac4e0fdffbeb58..0a3a1039d12570e9145c3fb828671e5b7c14b8b1 100644 (file)
@@ -1,6 +1,6 @@
 /* Routines for name->symbol lookups in GDB.
    
-   Copyright (C) 2003, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+   Copyright (C) 2003, 2007-2012 Free Software Foundation, Inc.
 
    Contributed by David Carlton <carlton@bactrian.org> and by Kealia,
    Inc.
@@ -82,9 +82,7 @@
 
    * Define a function dict_<op> that looks up <op> in the dict_vector
    and calls the appropriate function.  Add a declaration for
-   dict_<op> to dictionary.h.
-   
-*/
+   dict_<op> to dictionary.h.  */
 
 /* An enum representing the various implementations of dictionaries.
    Used only for debugging.  */
@@ -118,13 +116,11 @@ struct dict_vector
   struct symbol *(*iterator_next) (struct dict_iterator *iterator);
   /* Functions to iterate over symbols with a given name.  */
   struct symbol *(*iter_match_first) (const struct dictionary *dict,
-                                    const char *name,
-                                    int (*equiv) (const char *,
-                                                  const char *),
-                                    struct dict_iterator *iterator);
+                                     const char *name,
+                                     symbol_compare_ftype *equiv,
+                                     struct dict_iterator *iterator);
   struct symbol *(*iter_match_next) (const char *name,
-                                    int (*equiv) (const char *,
-                                                  const char *),
+                                    symbol_compare_ftype *equiv,
                                     struct dict_iterator *iterator);
   /* A size function, for maint print symtabs.  */
   int (*size) (const struct dictionary *dict);
@@ -243,13 +239,11 @@ static struct symbol *iterator_next_hashed (struct dict_iterator *iterator);
 
 static struct symbol *iter_match_first_hashed (const struct dictionary *dict,
                                               const char *name,
-                                              int (*compare) (const char *,
-                                                              const char *),
+                                              symbol_compare_ftype *compare,
                                              struct dict_iterator *iterator);
 
 static struct symbol *iter_match_next_hashed (const char *name,
-                                             int (*compare) (const char *,
-                                                             const char *),
+                                             symbol_compare_ftype *compare,
                                              struct dict_iterator *iterator);
 
 static unsigned int dict_hash (const char *string);
@@ -277,13 +271,11 @@ static struct symbol *iterator_next_linear (struct dict_iterator *iterator);
 
 static struct symbol *iter_match_first_linear (const struct dictionary *dict,
                                               const char *name,
-                                              int (*compare) (const char *,
-                                                              const char *),
+                                              symbol_compare_ftype *compare,
                                               struct dict_iterator *iterator);
 
 static struct symbol *iter_match_next_linear (const char *name,
-                                             int (*compare) (const char *,
-                                                             const char *),
+                                             symbol_compare_ftype *compare,
                                              struct dict_iterator *iterator);
 
 static int size_linear (const struct dictionary *dict);
@@ -542,16 +534,15 @@ dict_iter_name_next (const char *name, struct dict_iterator *iterator)
 
 struct symbol *
 dict_iter_match_first (const struct dictionary *dict,
-                      const char *name,
-                      int (*compare) (const char *, const char *),
+                      const char *name, symbol_compare_ftype *compare,
                       struct dict_iterator *iterator)
 {
-  return (DICT_VECTOR (dict))->iter_match_first (dict, name, compare, iterator);
+  return (DICT_VECTOR (dict))->iter_match_first (dict, name,
+                                                compare, iterator);
 }
 
 struct symbol *
-dict_iter_match_next (const char *name,
-                     int (*compare) (const char *, const char *),
+dict_iter_match_next (const char *name, symbol_compare_ftype *compare,
                      struct dict_iterator *iterator)
 {
   return (DICT_VECTOR (DICT_ITERATOR_DICT (iterator)))
@@ -646,9 +637,8 @@ iterator_hashed_advance (struct dict_iterator *iterator)
 }
 
 static struct symbol *
-iter_match_first_hashed (const struct dictionary *dict,
-                        const char *name,
-                        int (*compare) (const char *, const char *),
+iter_match_first_hashed (const struct dictionary *dict, const char *name,
+                        symbol_compare_ftype *compare,
                         struct dict_iterator *iterator)
 {
   unsigned int hash_index = dict_hash (name) % DICT_HASHED_NBUCKETS (dict);
@@ -677,8 +667,7 @@ iter_match_first_hashed (const struct dictionary *dict,
 }
 
 static struct symbol *
-iter_match_next_hashed (const char *name,
-                       int (*compare) (const char *, const char *),
+iter_match_next_hashed (const char *name, symbol_compare_ftype *compare,
                        struct dict_iterator *iterator)
 {
   struct symbol *next;
@@ -786,7 +775,7 @@ expand_hashtable (struct dictionary *dict)
    comparison operators hash to the same value.  */
 
 static unsigned int
-dict_hash (const char *string)
+dict_hash (const char *string0)
 {
   /* The Ada-encoded version of a name P1.P2...Pn has either the form
      P1__P2__...Pn<suffix> or _ada_P1__P2__...Pn<suffix> (where the Pi
@@ -796,29 +785,50 @@ dict_hash (const char *string)
      does this for a superset of both valid Pi and of <suffix>, but 
      in other cases it simply returns msymbol_hash_iw(STRING0).  */
 
+  const char *string;
   unsigned int hash;
-  int c;
 
-  if (*string == '_' && strncmp (string, "_ada_", 5) == 0)
-    string += 5;
+  string = string0;
+  if (*string == '_')
+    {
+      if (strncmp (string, "_ada_", 5) == 0)
+       string += 5;
+      else
+       return msymbol_hash_iw (string0);
+    }
 
   hash = 0;
   while (*string)
     {
+      /* Ignore "TKB" suffixes.
+
+        These are used by Ada for subprograms implementing a task body.
+        For instance for a task T inside package Pck, the name of the
+        subprogram implementing T's body is `pck__tTKB'.  We need to
+        ignore the "TKB" suffix because searches for this task body
+        subprogram are going to be performed using `pck__t' (the encoded
+        version of the natural name `pck.t').  */
+      if (strcmp (string, "TKB") == 0)
+       return hash;
+
       switch (*string)
        {
        case '$':
        case '.':
        case 'X':
-       case '(':
-         return hash;
+         if (string0 == string)
+           return msymbol_hash_iw (string0);
+         else
+           return hash;
        case ' ':
-         string += 1;
-         break;
+       case '(':
+         return msymbol_hash_iw (string0);
        case '_':
-         if (string[1] == '_')
+         if (string[1] == '_' && string != string0)
            {
-             if (((c = string[2]) < 'a' || c > 'z') && c != 'O')
+             int c = string[2];
+
+             if ((c < 'a' || c > 'z') && c != 'O')
                return hash;
              hash = 0;
              string += 2;
@@ -826,7 +836,7 @@ dict_hash (const char *string)
            }
          /* FALL THROUGH */
        default:
-         hash = hash * 67 + *string - 113;
+         hash = SYMBOL_HASH_NEXT (hash, *string);
          string += 1;
          break;
        }
@@ -858,8 +868,7 @@ iterator_next_linear (struct dict_iterator *iterator)
 
 static struct symbol *
 iter_match_first_linear (const struct dictionary *dict,
-                        const char *name,
-                        int (*compare) (const char *, const char *),
+                        const char *name, symbol_compare_ftype *compare,
                         struct dict_iterator *iterator)
 {
   DICT_ITERATOR_DICT (iterator) = dict;
@@ -869,8 +878,7 @@ iter_match_first_linear (const struct dictionary *dict,
 }
 
 static struct symbol *
-iter_match_next_linear (const char *name,
-                       int (*compare) (const char *, const char *),
+iter_match_next_linear (const char *name, symbol_compare_ftype *compare,
                        struct dict_iterator *iterator)
 {
   const struct dictionary *dict = DICT_ITERATOR_DICT (iterator);
This page took 0.025813 seconds and 4 git commands to generate.