]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
2003-03-06 David Carlton <carlton@math.stanford.edu>
authorDavid Carlton <carlton@bactrian.org>
Fri, 7 Mar 2003 00:31:46 +0000 (00:31 +0000)
committerDavid Carlton <carlton@bactrian.org>
Fri, 7 Mar 2003 00:31:46 +0000 (00:31 +0000)
* minsyms.c (add_minsym_to_hash_table): Use SYMBOL_LINKAGE_NAME.
(add_minsym_to_demangled_hash_table): Use SYMBOL_NATURAL_NAME.
(build_minimal_symbol_hash_tables): Add all minsyms to demangled
hash table.
(install_minimal_symbols): Use SYMBOL_LINKAGE_NAME.
(find_solib_trampoline_target): Ditto.
(compare_minimal_symbols): Ditto.
(compact_minimal_symbols): Ditto.
* symtab.h (DEPRECATED_SYMBOL_MATCHES_NAME): Delete.
* minsyms.c (lookup_minimal_symbol_text): Replace use of
DEPRECATED_SYMBOL_MATCHES_NAME by strcmp on linkage name.
(lookup_minimal_symbol_solib_trampoline): Ditto.
* symtab.h: Declare lookup_minimal_symbol_linkage,
lookup_minimal_symbol_natural.
* minsyms.c (lookup_minimal_symbol_aux): New function.
(lookup_minimal_symbol_linkage): Ditto.
(lookup_minimal_symbol_natural): Ditto.
(lookup_minimal_symbol): Move body into
lookup_minimal_symbol_aux.

2003-03-06  David Carlton  <carlton@math.stanford.edu>

* gdb.c++/templates.exp (do_tests): Make expressions for 'ptype
Bar' and 'ptype Qux' more generous.

gdb/ChangeLog
gdb/minsyms.c
gdb/symtab.h
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.c++/templates.exp

index 5528bbd6ce1967c8308cf58c59281883e707a258..2d29a275e305f8aff1b7e807e70714cfd9174648 100644 (file)
@@ -1,3 +1,25 @@
+2003-03-06  David Carlton  <carlton@math.stanford.edu>
+
+       * minsyms.c (add_minsym_to_hash_table): Use SYMBOL_LINKAGE_NAME.
+       (add_minsym_to_demangled_hash_table): Use SYMBOL_NATURAL_NAME.
+       (build_minimal_symbol_hash_tables): Add all minsyms to demangled
+       hash table.
+       (install_minimal_symbols): Use SYMBOL_LINKAGE_NAME.
+       (find_solib_trampoline_target): Ditto.
+       (compare_minimal_symbols): Ditto.
+       (compact_minimal_symbols): Ditto.
+       * symtab.h (DEPRECATED_SYMBOL_MATCHES_NAME): Delete.
+       * minsyms.c (lookup_minimal_symbol_text): Replace use of
+       DEPRECATED_SYMBOL_MATCHES_NAME by strcmp on linkage name.
+       (lookup_minimal_symbol_solib_trampoline): Ditto.
+       * symtab.h: Declare lookup_minimal_symbol_linkage,
+       lookup_minimal_symbol_natural.
+       * minsyms.c (lookup_minimal_symbol_aux): New function.
+       (lookup_minimal_symbol_linkage): Ditto.
+       (lookup_minimal_symbol_natural): Ditto.
+       (lookup_minimal_symbol): Move body into
+       lookup_minimal_symbol_aux.
+
 2003-03-05  Andrew Cagney  <cagney@redhat.com>
 
        * d10v-tdep.c (struct frame_extra_info): Delete unused structure.
index 9216d8684813f08ac36f02afaa66fba41c2a98ea..cf35c0e21339a6636224bb33faa10bdbdc9241fa 100644 (file)
@@ -76,6 +76,11 @@ static int msym_bunch_index;
 
 static int msym_count;
 
+static struct minimal_symbol *lookup_minimal_symbol_aux (const char *name,
+                                                        int linkage,
+                                                        const char *sfile,
+                                                        struct objfile *objf);
+
 /* Compute a hash code based using the same criteria as `strcmp_iw'.  */
 
 unsigned int
@@ -113,7 +118,8 @@ add_minsym_to_hash_table (struct minimal_symbol *sym,
 {
   if (sym->hash_next == NULL)
     {
-      unsigned int hash = msymbol_hash (DEPRECATED_SYMBOL_NAME (sym)) % MINIMAL_SYMBOL_HASH_SIZE;
+      unsigned int hash
+       = msymbol_hash (SYMBOL_LINKAGE_NAME (sym)) % MINIMAL_SYMBOL_HASH_SIZE;
       sym->hash_next = table[hash];
       table[hash] = sym;
     }
@@ -123,11 +129,13 @@ add_minsym_to_hash_table (struct minimal_symbol *sym,
    TABLE.  */
 static void
 add_minsym_to_demangled_hash_table (struct minimal_symbol *sym,
-                                  struct minimal_symbol **table)
+                                   struct minimal_symbol **table)
 {
   if (sym->demangled_hash_next == NULL)
     {
-      unsigned int hash = msymbol_hash_iw (SYMBOL_DEMANGLED_NAME (sym)) % MINIMAL_SYMBOL_HASH_SIZE;
+      unsigned int hash
+       = (msymbol_hash_iw (SYMBOL_NATURAL_NAME (sym))
+          % MINIMAL_SYMBOL_HASH_SIZE);
       sym->demangled_hash_next = table[hash];
       table[hash] = sym;
     }
@@ -144,11 +152,53 @@ add_minsym_to_demangled_hash_table (struct minimal_symbol *sym,
    Note:  One instance where there may be duplicate minimal symbols with
    the same name is when the symbol tables for a shared library and the
    symbol tables for an executable contain global symbols with the same
-   names (the dynamic linker deals with the duplication).  */
+   names (the dynamic linker deals with the duplication).
+
+   This function first searches for matches via linkage names; if it
+   doesn't find a match there, it then searches via natural names.  */
 
 struct minimal_symbol *
 lookup_minimal_symbol (register const char *name, const char *sfile,
                       struct objfile *objf)
+{
+  struct minimal_symbol *msymbol;
+
+  msymbol = lookup_minimal_symbol_linkage (name, sfile, objf);
+
+  if (msymbol != NULL)
+    return msymbol;
+  else
+    return lookup_minimal_symbol_natural (name, sfile, objf);
+}
+
+/* Search for a minimal symbol via linkage names; args are as in
+   lookup_minimal_symbol.  */
+
+struct minimal_symbol *
+lookup_minimal_symbol_linkage (const char *name, const char *sfile,
+                              struct objfile *objf)
+{
+  return lookup_minimal_symbol_aux (name, 1, sfile, objf);
+}
+
+/* Search for a minimal symbol via natural names; args are as in
+   lookup_minimal_symbol.  */
+
+struct minimal_symbol *
+lookup_minimal_symbol_natural (const char *name, const char *sfile,
+                              struct objfile *objf)
+{
+  return lookup_minimal_symbol_aux (name, 0, sfile, objf);
+}
+
+/* Helper function for lookup_minimal_symbol and friends, which only
+   searches for matches via linkage names or natural names but not
+   both.  Args are in lookup_minimal_symbol; if LINKAGE is non-zero,
+   search in linkage names, if zero, search in natural names.  */
+
+static struct minimal_symbol *
+lookup_minimal_symbol_aux (const char *name, int linkage,
+                          const char *sfile, struct objfile *objf)
 {
   struct objfile *objfile;
   struct minimal_symbol *msymbol;
@@ -156,8 +206,12 @@ lookup_minimal_symbol (register const char *name, const char *sfile,
   struct minimal_symbol *found_file_symbol = NULL;
   struct minimal_symbol *trampoline_symbol = NULL;
 
-  unsigned int hash = msymbol_hash (name) % MINIMAL_SYMBOL_HASH_SIZE;
-  unsigned int dem_hash = msymbol_hash_iw (name) % MINIMAL_SYMBOL_HASH_SIZE;
+  unsigned int hash;
+
+  if (linkage)
+    hash = msymbol_hash (name) % MINIMAL_SYMBOL_HASH_SIZE;
+  else
+    hash = msymbol_hash_iw (name) % MINIMAL_SYMBOL_HASH_SIZE;
 
 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
   if (sfile != NULL)
@@ -174,66 +228,61 @@ lookup_minimal_symbol (register const char *name, const char *sfile,
     {
       if (objf == NULL || objf == objfile)
        {
-         /* Do two passes: the first over the ordinary hash table,
-            and the second over the demangled hash table.  */
-        int pass;
+         if (linkage)
+           msymbol = objfile->msymbol_hash[hash];
+         else
+           msymbol = objfile->msymbol_demangled_hash[hash];
 
-        for (pass = 1; pass <= 2 && found_symbol == NULL; pass++)
+         while (msymbol != NULL && found_symbol == NULL)
            {
-            /* Select hash list according to pass.  */
-            if (pass == 1)
-              msymbol = objfile->msymbol_hash[hash];
-            else
-              msymbol = objfile->msymbol_demangled_hash[dem_hash];
-
-            while (msymbol != NULL && found_symbol == NULL)
+             if (linkage
+                 ? strcmp (SYMBOL_LINKAGE_NAME (msymbol), name) == 0
+                 : SYMBOL_MATCHES_NATURAL_NAME (msymbol, name))
                {
-                if (DEPRECATED_SYMBOL_MATCHES_NAME (msymbol, name))
+                 switch (MSYMBOL_TYPE (msymbol))
                    {
-                    switch (MSYMBOL_TYPE (msymbol))
-                      {
-                      case mst_file_text:
-                      case mst_file_data:
-                      case mst_file_bss:
+                   case mst_file_text:
+                   case mst_file_data:
+                   case mst_file_bss:
 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
-                        if (sfile == NULL || STREQ (msymbol->filename, sfile))
-                          found_file_symbol = msymbol;
+                     if (sfile == NULL || STREQ (msymbol->filename, sfile))
+                       found_file_symbol = msymbol;
 #else
-                        /* We have neither the ability nor the need to
-                           deal with the SFILE parameter.  If we find
-                           more than one symbol, just return the latest
-                           one (the user can't expect useful behavior in
-                           that case).  */
-                        found_file_symbol = msymbol;
+                     /* We have neither the ability nor the need to
+                        deal with the SFILE parameter.  If we find
+                        more than one symbol, just return the latest
+                        one (the user can't expect useful behavior in
+                        that case).  */
+                     found_file_symbol = msymbol;
 #endif
-                        break;
-
-                      case mst_solib_trampoline:
-
-                        /* If a trampoline symbol is found, we prefer to
-                           keep looking for the *real* symbol. If the
-                           actual symbol is not found, then we'll use the
-                           trampoline entry. */
-                        if (trampoline_symbol == NULL)
-                          trampoline_symbol = msymbol;
-                        break;
-
-                      case mst_unknown:
-                      default:
-                        found_symbol = msymbol;
-                        break;
-                      }
-                   }
+                     break;
+
+                   case mst_solib_trampoline:
 
-                /* Find the next symbol on the hash chain.  */
-                if (pass == 1)
-                  msymbol = msymbol->hash_next;
-                else
-                  msymbol = msymbol->demangled_hash_next;
+                     /* If a trampoline symbol is found, we prefer to
+                        keep looking for the *real* symbol. If the
+                        actual symbol is not found, then we'll use the
+                        trampoline entry. */
+                     if (trampoline_symbol == NULL)
+                       trampoline_symbol = msymbol;
+                     break;
+
+                   case mst_unknown:
+                   default:
+                     found_symbol = msymbol;
+                     break;
+                   }
                }
+
+             /* Find the next symbol on the hash chain.  */
+             if (linkage)
+               msymbol = msymbol->hash_next;
+             else
+               msymbol = msymbol->demangled_hash_next;
            }
        }
     }
+
   /* External symbols are best.  */
   if (found_symbol)
     return found_symbol;
@@ -288,7 +337,7 @@ lookup_minimal_symbol_text (register const char *name, const char *sfile,
               msymbol != NULL && found_symbol == NULL;
               msymbol = msymbol->hash_next)
            {
-             if (DEPRECATED_SYMBOL_MATCHES_NAME (msymbol, name) &&
+             if (strcmp (SYMBOL_LINKAGE_NAME (msymbol), name) == 0 &&
                  (MSYMBOL_TYPE (msymbol) == mst_text ||
                   MSYMBOL_TYPE (msymbol) == mst_file_text))
                {
@@ -364,7 +413,7 @@ lookup_minimal_symbol_solib_trampoline (register const char *name,
               msymbol != NULL && found_symbol == NULL;
               msymbol = msymbol->hash_next)
            {
-             if (DEPRECATED_SYMBOL_MATCHES_NAME (msymbol, name) &&
+             if (strcmp (SYMBOL_LINKAGE_NAME (msymbol), name) == 0 &&
                  MSYMBOL_TYPE (msymbol) == mst_solib_trampoline)
                return msymbol;
            }
@@ -659,8 +708,8 @@ compare_minimal_symbols (const void *fn1p, const void *fn2p)
   else
     /* addrs are equal: sort by name */
     {
-      char *name1 = DEPRECATED_SYMBOL_NAME (fn1);
-      char *name2 = DEPRECATED_SYMBOL_NAME (fn2);
+      char *name1 = SYMBOL_LINKAGE_NAME (fn1);
+      char *name2 = SYMBOL_LINKAGE_NAME (fn2);
 
       if (name1 && name2)      /* both have names */
        return strcmp (name1, name2);
@@ -752,7 +801,8 @@ compact_minimal_symbols (struct minimal_symbol *msymbol, int mcount,
        {
          if (SYMBOL_VALUE_ADDRESS (copyfrom) ==
              SYMBOL_VALUE_ADDRESS ((copyfrom + 1)) &&
-             (STREQ (DEPRECATED_SYMBOL_NAME (copyfrom), DEPRECATED_SYMBOL_NAME ((copyfrom + 1)))))
+             (STREQ (SYMBOL_LINKAGE_NAME (copyfrom),
+                     SYMBOL_LINKAGE_NAME ((copyfrom + 1)))))
            {
              if (MSYMBOL_TYPE ((copyfrom + 1)) == mst_unknown)
                {
@@ -795,9 +845,8 @@ build_minimal_symbol_hash_tables (struct objfile *objfile)
       add_minsym_to_hash_table (msym, objfile->msymbol_hash);
 
       msym->demangled_hash_next = 0;
-      if (SYMBOL_DEMANGLED_NAME (msym) != NULL)
-       add_minsym_to_demangled_hash_table (msym,
-                                            objfile->msymbol_demangled_hash);
+      add_minsym_to_demangled_hash_table (msym,
+                                         objfile->msymbol_demangled_hash);
     }
 }
 
@@ -867,9 +916,9 @@ install_minimal_symbols (struct objfile *objfile)
          for (bindex = 0; bindex < msym_bunch_index; bindex++, mcount++)
            {
              msymbols[mcount] = bunch->contents[bindex];
-             if (DEPRECATED_SYMBOL_NAME (&msymbols[mcount])[0] == leading_char)
+             if (SYMBOL_LINKAGE_NAME (&msymbols[mcount])[0] == leading_char)
                {
-                 DEPRECATED_SYMBOL_NAME (&msymbols[mcount])++;
+                 SYMBOL_LINKAGE_NAME (&msymbols[mcount])++;
                }
            }
          msym_bunch_index = BUNCH_SIZE;
@@ -898,7 +947,7 @@ install_minimal_symbols (struct objfile *objfile)
          symbol count does *not* include this null symbol, which is why it
          is indexed by mcount and not mcount-1. */
 
-      DEPRECATED_SYMBOL_NAME (&msymbols[mcount]) = NULL;
+      SYMBOL_LINKAGE_NAME (&msymbols[mcount]) = NULL;
       SYMBOL_VALUE_ADDRESS (&msymbols[mcount]) = 0;
       MSYMBOL_INFO (&msymbols[mcount]) = NULL;
       MSYMBOL_TYPE (&msymbols[mcount]) = mst_unknown;
@@ -918,7 +967,7 @@ install_minimal_symbols (struct objfile *objfile)
 
        for (i = 0; i < mcount; i++)
          {
-           const char *name = DEPRECATED_SYMBOL_NAME (&objfile->msymbols[i]);
+           const char *name = SYMBOL_LINKAGE_NAME (&objfile->msymbols[i]);
            if (name[0] == '_' && name[1] == 'Z')
              {
                set_cp_abi_as_auto_default ("gnu-v3");
@@ -981,7 +1030,8 @@ find_solib_trampoline_target (CORE_ADDR pc)
       ALL_MSYMBOLS (objfile, msymbol)
       {
        if (MSYMBOL_TYPE (msymbol) == mst_text
-           && STREQ (DEPRECATED_SYMBOL_NAME (msymbol), DEPRECATED_SYMBOL_NAME (tsymbol)))
+           && STREQ (SYMBOL_LINKAGE_NAME (msymbol),
+                     SYMBOL_LINKAGE_NAME (tsymbol)))
          return SYMBOL_VALUE_ADDRESS (msymbol);
       }
     }
index ace4f3408f36e45f76b4b56c710741727f3062cb..9c784a7eefd22a4ccd6f3fa0d343ffb8ec54d8db 100644 (file)
@@ -211,23 +211,6 @@ extern const char *symbol_demangled_name (const struct general_symbol_info
 #define SYMBOL_PRINT_NAME(symbol)                                      \
   (demangle ? SYMBOL_NATURAL_NAME (symbol) : SYMBOL_LINKAGE_NAME (symbol))
 
-/* Macro that tests a symbol for a match against a specified name string.
-   First test the unencoded name, then looks for and test a C++ encoded
-   name if it exists.  Note that whitespace is ignored while attempting to
-   match a C++ encoded name, so that "foo::bar(int,long)" is the same as
-   "foo :: bar (int, long)".
-   Evaluates to zero if the match fails, or nonzero if it succeeds. */
-
-/* FIXME: carlton/2003-02-27: This is an unholy mixture of linkage
-   names and natural names.  If you want to test the linkage names
-   with strcmp, do that.  If you want to test the natural names with
-   strcmp_iw, use SYMBOL_MATCHES_NATURAL_NAME.  */
-
-#define DEPRECATED_SYMBOL_MATCHES_NAME(symbol, name)                   \
-  (STREQ (DEPRECATED_SYMBOL_NAME (symbol), (name))                     \
-   || (SYMBOL_DEMANGLED_NAME (symbol) != NULL                          \
-       && strcmp_iw (SYMBOL_DEMANGLED_NAME (symbol), (name)) == 0))
-
 /* Macro that tests a symbol for a match against a specified name
    string.  It tests against SYMBOL_NATURAL_NAME, and it ignores
    whitespace and trailing parentheses.  (See strcmp_iw for details
@@ -1141,6 +1124,14 @@ extern struct minimal_symbol *lookup_minimal_symbol (const char *,
                                                     const char *,
                                                     struct objfile *);
 
+extern struct minimal_symbol *lookup_minimal_symbol_linkage (const char *,
+                                                            const char *,
+                                                            struct objfile *);
+
+extern struct minimal_symbol *lookup_minimal_symbol_natural (const char *,
+                                                            const char *,
+                                                            struct objfile *);
+
 extern struct minimal_symbol *lookup_minimal_symbol_text (const char *,
                                                          const char *,
                                                          struct objfile *);
index 4c46ecbe10aca38e891319f6a337a2fd27e17a5f..1bc95db498b63490dba6e5f8297435d1546b51d2 100644 (file)
@@ -1,3 +1,8 @@
+2003-03-06  David Carlton  <carlton@math.stanford.edu>
+
+       * gdb.c++/templates.exp (do_tests): Make expressions for 'ptype
+       Bar' and 'ptype Qux' more generous.
+
 2003-03-04  David Carlton  <carlton@math.stanford.edu>
 
        * gdb.c++/templates.exp (do_tests): Accept valid const in "print
index bee78a9c2b7c7a7867d0304a42c978ae0ab82a36..9bef50cef162fc8955807f1312d6ca08fadc04d9 100644 (file)
@@ -353,7 +353,7 @@ send_gdb "ptype Bar\n"
 gdb_expect {   
     -re "type = template <(class |)T, (class |)sz> (class |)Bar \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*T t;\r\n\\}\r\ntemplate instantiations:\r\n\[ \t\]*(class |)Bar<int,(\\(int\\)|)1>\r\n\[ \t\]*(class |)Bar<int,(\\(int\\)|)33>\r\n$gdb_prompt $" { pass "ptype Bar" }
     -re "type = <(class |)T, (class |)sz> (class |)Bar \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*T t;\r\n\\}\r\n$gdb_prompt $" { xfail "ptype Bar" }
-    -re "ptype Bar\r\ntype = class Bar<int,33> {\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*int t;\r\n\r\n\[ \t\]*int bar\\(int, int\\);\r\n}\r\n$gdb_prompt $"
+    -re "ptype Bar\r\ntype = class Bar<int, ?33> {\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*int t;\r\n\r\n\[ \t\]*int bar\\(int, int\\);\r\n}\r\n$gdb_prompt $"
     { # GCC 3.1, DWARF-2 output.
        kfail "gdb/57" "ptype Bar" }
     -re "No symbol \"Bar\" in current context.\r\n$gdb_prompt $"
@@ -461,7 +461,7 @@ send_gdb "ptype Spec\n"
 gdb_expect {   
     -re "type = template <(class |)T1, (class |)T2> (class |)Spec \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\\}\r\ntemplate instantiations:\r\n\[ \t\]*(class |)Spec<int,int \\*>\r\n\[ \t\]*(class |)Spec<int,char>\r\n$gdb_prompt $" { pass "ptype Spec" }
     -re "type = <(class |)T1, (class |)T2> (class |)Spec \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\\}\r\n$gdb_prompt $" { xfail "ptype Spec" }
-    -re "type = class Spec<int,char> {\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\r\n\[ \t\]*int spec\\(char\\);\r\n}\r\n$gdb_prompt $"
+    -re "type = class Spec<int, ?char> {\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\r\n\[ \t\]*int spec\\(char\\);\r\n}\r\n$gdb_prompt $"
     { # GCC 3.1, DWARF-2 output.
        kfail "gdb/57" "ptype Spec" }
     -re "No symbol \"Spec\" in current context.\r\n$gdb_prompt $"