Fix tagged pointer support
[deliverable/binutils-gdb.git] / gdb / dictionary.c
index 1ffa4f321802a11eeff0415bba3ebf3cc23efef9..da8b7da2085ed775b4cd80c7c83d3ff243171a33 100644 (file)
@@ -1,6 +1,6 @@
 /* Routines for name->symbol lookups in GDB.
    
-   Copyright (C) 2003-2017 Free Software Foundation, Inc.
+   Copyright (C) 2003-2018 Free Software Foundation, Inc.
 
    Contributed by David Carlton <carlton@bactrian.org> and by Kealia,
    Inc.
@@ -26,6 +26,7 @@
 #include "symtab.h"
 #include "buildsym.h"
 #include "dictionary.h"
+#include "safe-ctype.h"
 
 /* This file implements dictionaries, which are tables that associate
    symbols to names.  They are represented by an opaque type 'struct
@@ -115,11 +116,9 @@ 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,
-                                     symbol_compare_ftype *equiv,
+                                     const lookup_name_info &name,
                                      struct dict_iterator *iterator);
-  struct symbol *(*iter_match_next) (const char *name,
-                                    symbol_compare_ftype *equiv,
+  struct symbol *(*iter_match_next) (const lookup_name_info &name,
                                     struct dict_iterator *iterator);
   /* A size function, for maint print symtabs.  */
   int (*size) (const struct dictionary *dict);
@@ -239,12 +238,10 @@ static struct symbol *iterator_first_hashed (const struct dictionary *dict,
 static struct symbol *iterator_next_hashed (struct dict_iterator *iterator);
 
 static struct symbol *iter_match_first_hashed (const struct dictionary *dict,
-                                              const char *name,
-                                              symbol_compare_ftype *compare,
+                                              const lookup_name_info &name,
                                              struct dict_iterator *iterator);
 
-static struct symbol *iter_match_next_hashed (const char *name,
-                                             symbol_compare_ftype *compare,
+static struct symbol *iter_match_next_hashed (const lookup_name_info &name,
                                              struct dict_iterator *iterator);
 
 /* Functions only for DICT_HASHED.  */
@@ -269,12 +266,10 @@ static struct symbol *iterator_first_linear (const struct dictionary *dict,
 static struct symbol *iterator_next_linear (struct dict_iterator *iterator);
 
 static struct symbol *iter_match_first_linear (const struct dictionary *dict,
-                                              const char *name,
-                                              symbol_compare_ftype *compare,
+                                              const lookup_name_info &name,
                                               struct dict_iterator *iterator);
 
-static struct symbol *iter_match_next_linear (const char *name,
-                                             symbol_compare_ftype *compare,
+static struct symbol *iter_match_next_linear (const lookup_name_info &name,
                                              struct dict_iterator *iterator);
 
 static int size_linear (const struct dictionary *dict);
@@ -526,19 +521,18 @@ dict_iterator_next (struct dict_iterator *iterator)
 
 struct symbol *
 dict_iter_match_first (const struct dictionary *dict,
-                      const char *name, symbol_compare_ftype *compare,
+                      const lookup_name_info &name,
                       struct dict_iterator *iterator)
 {
-  return (DICT_VECTOR (dict))->iter_match_first (dict, name,
-                                                compare, iterator);
+  return (DICT_VECTOR (dict))->iter_match_first (dict, name, iterator);
 }
 
 struct symbol *
-dict_iter_match_next (const char *name, symbol_compare_ftype *compare,
+dict_iter_match_next (const lookup_name_info &name,
                      struct dict_iterator *iterator)
 {
   return (DICT_VECTOR (DICT_ITERATOR_DICT (iterator)))
-    ->iter_match_next (name, compare, iterator);
+    ->iter_match_next (name, iterator);
 }
 
 int
@@ -629,13 +623,15 @@ iterator_hashed_advance (struct dict_iterator *iterator)
 }
 
 static struct symbol *
-iter_match_first_hashed (const struct dictionary *dict, const char *name,
-                        symbol_compare_ftype *compare,
+iter_match_first_hashed (const struct dictionary *dict,
+                        const lookup_name_info &name,
                         struct dict_iterator *iterator)
 {
-  unsigned int hash_index
-    = (search_name_hash (DICT_LANGUAGE (dict)->la_language, name)
-       % DICT_HASHED_NBUCKETS (dict));
+  const language_defn *lang = DICT_LANGUAGE (dict);
+  unsigned int hash_index = (name.search_name_hash (lang->la_language)
+                            % DICT_HASHED_NBUCKETS (dict));
+  symbol_name_matcher_ftype *matches_name
+    = get_symbol_name_matcher (lang, name);
   struct symbol *sym;
 
   DICT_ITERATOR_DICT (iterator) = dict;
@@ -649,11 +645,8 @@ iter_match_first_hashed (const struct dictionary *dict, const char *name,
        sym = sym->hash_next)
     {
       /* Warning: the order of arguments to compare matters!  */
-      if (compare (SYMBOL_SEARCH_NAME (sym), name) == 0)
-       {
-         break;
-       }
-       
+      if (matches_name (SYMBOL_SEARCH_NAME (sym), name, NULL))
+       break;
     }
 
   DICT_ITERATOR_CURRENT (iterator) = sym;
@@ -661,16 +654,19 @@ iter_match_first_hashed (const struct dictionary *dict, const char *name,
 }
 
 static struct symbol *
-iter_match_next_hashed (const char *name, symbol_compare_ftype *compare,
+iter_match_next_hashed (const lookup_name_info &name,
                        struct dict_iterator *iterator)
 {
+  const language_defn *lang = DICT_LANGUAGE (DICT_ITERATOR_DICT (iterator));
+  symbol_name_matcher_ftype *matches_name
+    = get_symbol_name_matcher (lang, name);
   struct symbol *next;
 
   for (next = DICT_ITERATOR_CURRENT (iterator)->hash_next;
        next != NULL;
        next = next->hash_next)
     {
-      if (compare (SYMBOL_SEARCH_NAME (next), name) == 0)
+      if (matches_name (SYMBOL_SEARCH_NAME (next), name, NULL))
        break;
     }
 
@@ -795,17 +791,6 @@ default_search_name_hash (const char *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 '$':
@@ -827,14 +812,25 @@ default_search_name_hash (const char *string0)
                return hash;
              hash = 0;
              string += 2;
-             break;
+             continue;
            }
-         /* FALL THROUGH */
-       default:
-         hash = SYMBOL_HASH_NEXT (hash, *string);
-         string += 1;
+         break;
+       case 'T':
+         /* 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;
          break;
        }
+
+      hash = SYMBOL_HASH_NEXT (hash, *string);
+      string += 1;
     }
   return hash;
 }
@@ -863,27 +859,32 @@ iterator_next_linear (struct dict_iterator *iterator)
 
 static struct symbol *
 iter_match_first_linear (const struct dictionary *dict,
-                        const char *name, symbol_compare_ftype *compare,
+                        const lookup_name_info &name,
                         struct dict_iterator *iterator)
 {
   DICT_ITERATOR_DICT (iterator) = dict;
   DICT_ITERATOR_INDEX (iterator) = -1;
 
-  return iter_match_next_linear (name, compare, iterator);
+  return iter_match_next_linear (name, iterator);
 }
 
 static struct symbol *
-iter_match_next_linear (const char *name, symbol_compare_ftype *compare,
+iter_match_next_linear (const lookup_name_info &name,
                        struct dict_iterator *iterator)
 {
   const struct dictionary *dict = DICT_ITERATOR_DICT (iterator);
+  const language_defn *lang = DICT_LANGUAGE (dict);
+  symbol_name_matcher_ftype *matches_name
+    = get_symbol_name_matcher (lang, name);
+
   int i, nsyms = DICT_LINEAR_NSYMS (dict);
   struct symbol *sym, *retval = NULL;
 
   for (i = DICT_ITERATOR_INDEX (iterator) + 1; i < nsyms; ++i)
     {
       sym = DICT_LINEAR_SYM (dict, i);
-      if (compare (SYMBOL_SEARCH_NAME (sym), name) == 0)
+
+      if (matches_name (SYMBOL_SEARCH_NAME (sym), name, NULL))
        {
          retval = sym;
          break;
This page took 0.027366 seconds and 4 git commands to generate.