use bound_minsym as result for lookup_minimal_symbol et al
[deliverable/binutils-gdb.git] / gdb / minsyms.c
index e2079301fad7ce8aa1b3983901b7014d1a03ea47..8335d51dc7bec6c49e9b5704b835ae26a3299d6b 100644 (file)
@@ -1,5 +1,5 @@
 /* GDB routines for manipulating the minimal symbol tables.
-   Copyright (C) 1992-2013 Free Software Foundation, Inc.
+   Copyright (C) 1992-2014 Free Software Foundation, Inc.
    Contributed by Cygnus Support, using pieces from other GDB modules.
 
    This file is part of GDB.
@@ -38,7 +38,7 @@
 
 #include "defs.h"
 #include <ctype.h>
-#include "gdb_string.h"
+#include <string.h>
 #include "symtab.h"
 #include "bfd.h"
 #include "filenames.h"
@@ -116,7 +116,7 @@ add_minsym_to_hash_table (struct minimal_symbol *sym,
   if (sym->hash_next == NULL)
     {
       unsigned int hash
-       = msymbol_hash (SYMBOL_LINKAGE_NAME (sym)) % MINIMAL_SYMBOL_HASH_SIZE;
+       = msymbol_hash (MSYMBOL_LINKAGE_NAME (sym)) % MINIMAL_SYMBOL_HASH_SIZE;
 
       sym->hash_next = table[hash];
       table[hash] = sym;
@@ -131,7 +131,7 @@ add_minsym_to_demangled_hash_table (struct minimal_symbol *sym,
 {
   if (sym->demangled_hash_next == NULL)
     {
-      unsigned int hash = msymbol_hash_iw (SYMBOL_SEARCH_NAME (sym))
+      unsigned int hash = msymbol_hash_iw (MSYMBOL_SEARCH_NAME (sym))
        % MINIMAL_SYMBOL_HASH_SIZE;
 
       sym->demangled_hash_next = table[hash];
@@ -159,9 +159,9 @@ add_minsym_to_demangled_hash_table (struct minimal_symbol *sym,
    Obviously, there must be distinct mangled names for each of these,
    but the demangled names are all the same: S::S or S::~S.  */
 
-static struct bound_minimal_symbol
-lookup_minimal_symbol_internal (const char *name, const char *sfile,
-                               struct objfile *objf)
+struct bound_minimal_symbol
+lookup_minimal_symbol (const char *name, const char *sfile,
+                      struct objfile *objf)
 {
   struct objfile *objfile;
   struct bound_minimal_symbol found_symbol = { NULL, NULL };
@@ -221,13 +221,13 @@ lookup_minimal_symbol_internal (const char *name, const char *sfile,
 
                      cmp = (case_sensitivity == case_sensitive_on
                             ? strcmp : strcasecmp);
-                     match = cmp (SYMBOL_LINKAGE_NAME (msymbol),
+                     match = cmp (MSYMBOL_LINKAGE_NAME (msymbol),
                                   modified_name) == 0;
                    }
                  else
                    {
                      /* The function respects CASE_SENSITIVITY.  */
-                     match = SYMBOL_MATCHES_SEARCH_NAME (msymbol,
+                     match = MSYMBOL_MATCHES_SEARCH_NAME (msymbol,
                                                          modified_name);
                    }
 
@@ -294,23 +294,10 @@ lookup_minimal_symbol_internal (const char *name, const char *sfile,
 
 /* See minsyms.h.  */
 
-struct minimal_symbol *
-lookup_minimal_symbol (const char *name, const char *sfile,
-                      struct objfile *objf)
-{
-  struct bound_minimal_symbol bms = lookup_minimal_symbol_internal (name,
-                                                                   sfile,
-                                                                   objf);
-
-  return bms.minsym;
-}
-
-/* See minsyms.h.  */
-
 struct bound_minimal_symbol
 lookup_bound_minimal_symbol (const char *name)
 {
-  return lookup_minimal_symbol_internal (name, NULL, NULL);
+  return lookup_minimal_symbol (name, NULL, NULL);
 }
 
 /* See minsyms.h.  */
@@ -331,7 +318,7 @@ iterate_over_minimal_symbols (struct objfile *objf, const char *name,
   cmp = (case_sensitivity == case_sensitive_on ? strcmp : strcasecmp);
   while (iter)
     {
-      if (cmp (SYMBOL_LINKAGE_NAME (iter), name) == 0)
+      if (cmp (MSYMBOL_LINKAGE_NAME (iter), name) == 0)
        (*callback) (iter, user_data);
       iter = iter->hash_next;
     }
@@ -341,7 +328,7 @@ iterate_over_minimal_symbols (struct objfile *objf, const char *name,
   iter = objf->msymbol_demangled_hash[hash];
   while (iter)
     {
-      if (SYMBOL_MATCHES_SEARCH_NAME (iter, name))
+      if (MSYMBOL_MATCHES_SEARCH_NAME (iter, name))
        (*callback) (iter, user_data);
       iter = iter->demangled_hash_next;
     }
@@ -349,28 +336,28 @@ iterate_over_minimal_symbols (struct objfile *objf, const char *name,
 
 /* See minsyms.h.  */
 
-struct minimal_symbol *
+struct bound_minimal_symbol
 lookup_minimal_symbol_text (const char *name, struct objfile *objf)
 {
   struct objfile *objfile;
   struct minimal_symbol *msymbol;
-  struct minimal_symbol *found_symbol = NULL;
-  struct minimal_symbol *found_file_symbol = NULL;
+  struct bound_minimal_symbol found_symbol = { NULL, NULL };
+  struct bound_minimal_symbol found_file_symbol = { NULL, NULL };
 
   unsigned int hash = msymbol_hash (name) % MINIMAL_SYMBOL_HASH_SIZE;
 
   for (objfile = object_files;
-       objfile != NULL && found_symbol == NULL;
+       objfile != NULL && found_symbol.minsym == NULL;
        objfile = objfile->next)
     {
       if (objf == NULL || objf == objfile
          || objf == objfile->separate_debug_objfile_backlink)
        {
          for (msymbol = objfile->msymbol_hash[hash];
-              msymbol != NULL && found_symbol == NULL;
+              msymbol != NULL && found_symbol.minsym == NULL;
               msymbol = msymbol->hash_next)
            {
-             if (strcmp (SYMBOL_LINKAGE_NAME (msymbol), name) == 0 &&
+             if (strcmp (MSYMBOL_LINKAGE_NAME (msymbol), name) == 0 &&
                  (MSYMBOL_TYPE (msymbol) == mst_text
                   || MSYMBOL_TYPE (msymbol) == mst_text_gnu_ifunc
                   || MSYMBOL_TYPE (msymbol) == mst_file_text))
@@ -378,10 +365,12 @@ lookup_minimal_symbol_text (const char *name, struct objfile *objf)
                  switch (MSYMBOL_TYPE (msymbol))
                    {
                    case mst_file_text:
-                     found_file_symbol = msymbol;
+                     found_file_symbol.minsym = msymbol;
+                     found_file_symbol.objfile = objfile;
                      break;
                    default:
-                     found_symbol = msymbol;
+                     found_symbol.minsym = msymbol;
+                     found_symbol.objfile = objfile;
                      break;
                    }
                }
@@ -389,14 +378,11 @@ lookup_minimal_symbol_text (const char *name, struct objfile *objf)
        }
     }
   /* External symbols are best.  */
-  if (found_symbol)
+  if (found_symbol.minsym)
     return found_symbol;
 
   /* File-local symbols are next best.  */
-  if (found_file_symbol)
-    return found_file_symbol;
-
-  return NULL;
+  return found_file_symbol;
 }
 
 /* See minsyms.h.  */
@@ -421,8 +407,8 @@ lookup_minimal_symbol_by_pc_name (CORE_ADDR pc, const char *name,
               msymbol != NULL;
               msymbol = msymbol->hash_next)
            {
-             if (SYMBOL_VALUE_ADDRESS (msymbol) == pc
-                 && strcmp (SYMBOL_LINKAGE_NAME (msymbol), name) == 0)
+             if (MSYMBOL_VALUE_ADDRESS (msymbol) == pc
+                 && strcmp (MSYMBOL_LINKAGE_NAME (msymbol), name) == 0)
                return msymbol;
            }
        }
@@ -433,35 +419,39 @@ lookup_minimal_symbol_by_pc_name (CORE_ADDR pc, const char *name,
 
 /* See minsyms.h.  */
 
-struct minimal_symbol *
+struct bound_minimal_symbol
 lookup_minimal_symbol_solib_trampoline (const char *name,
                                        struct objfile *objf)
 {
   struct objfile *objfile;
   struct minimal_symbol *msymbol;
-  struct minimal_symbol *found_symbol = NULL;
+  struct bound_minimal_symbol found_symbol = { NULL, NULL };
 
   unsigned int hash = msymbol_hash (name) % MINIMAL_SYMBOL_HASH_SIZE;
 
   for (objfile = object_files;
-       objfile != NULL && found_symbol == NULL;
+       objfile != NULL;
        objfile = objfile->next)
     {
       if (objf == NULL || objf == objfile
          || objf == objfile->separate_debug_objfile_backlink)
        {
          for (msymbol = objfile->msymbol_hash[hash];
-              msymbol != NULL && found_symbol == NULL;
+              msymbol != NULL;
               msymbol = msymbol->hash_next)
            {
-             if (strcmp (SYMBOL_LINKAGE_NAME (msymbol), name) == 0 &&
+             if (strcmp (MSYMBOL_LINKAGE_NAME (msymbol), name) == 0 &&
                  MSYMBOL_TYPE (msymbol) == mst_solib_trampoline)
-               return msymbol;
+               {
+                 found_symbol.objfile = objfile;
+                 found_symbol.minsym = msymbol;
+                 return found_symbol;
+               }
            }
        }
     }
 
-  return NULL;
+  return found_symbol;
 }
 
 /* Search through the minimal symbol table for each objfile and find
@@ -545,14 +535,14 @@ lookup_minimal_symbol_by_pc_section_1 (CORE_ADDR pc,
             Warning: this code is trickier than it would appear at first.  */
 
          /* Should also require that pc is <= end of objfile.  FIXME!  */
-         if (pc >= SYMBOL_VALUE_ADDRESS (&msymbol[lo]))
+         if (pc >= MSYMBOL_VALUE_ADDRESS (&msymbol[lo]))
            {
-             while (SYMBOL_VALUE_ADDRESS (&msymbol[hi]) > pc)
+             while (MSYMBOL_VALUE_ADDRESS (&msymbol[hi]) > pc)
                {
                  /* pc is still strictly less than highest address.  */
                  /* Note "new" will always be >= lo.  */
                  new = (lo + hi) / 2;
-                 if ((SYMBOL_VALUE_ADDRESS (&msymbol[new]) >= pc) ||
+                 if ((MSYMBOL_VALUE_ADDRESS (&msymbol[new]) >= pc) ||
                      (lo == new))
                    {
                      hi = new;
@@ -567,8 +557,8 @@ lookup_minimal_symbol_by_pc_section_1 (CORE_ADDR pc,
                 hi to point to the last one.  That way we can find the
                 right symbol if it has an index greater than hi.  */
              while (hi < objfile->minimal_symbol_count - 1
-                    && (SYMBOL_VALUE_ADDRESS (&msymbol[hi])
-                        == SYMBOL_VALUE_ADDRESS (&msymbol[hi + 1])))
+                    && (MSYMBOL_VALUE_ADDRESS (&msymbol[hi])
+                        == MSYMBOL_VALUE_ADDRESS (&msymbol[hi + 1])))
                hi++;
 
              /* Skip various undesirable symbols.  */
@@ -598,9 +588,9 @@ lookup_minimal_symbol_by_pc_section_1 (CORE_ADDR pc,
                      /* Some types of debug info, such as COFF,
                         don't fill the bfd_section member, so don't
                         throw away symbols on those platforms.  */
-                     && SYMBOL_OBJ_SECTION (objfile, &msymbol[hi]) != NULL
+                     && MSYMBOL_OBJ_SECTION (objfile, &msymbol[hi]) != NULL
                      && (!matching_obj_sections
-                         (SYMBOL_OBJ_SECTION (objfile, &msymbol[hi]),
+                         (MSYMBOL_OBJ_SECTION (objfile, &msymbol[hi]),
                           section)))
                    {
                      hi--;
@@ -616,10 +606,10 @@ lookup_minimal_symbol_by_pc_section_1 (CORE_ADDR pc,
                      && MSYMBOL_TYPE (&msymbol[hi - 1]) == want_type
                      && (MSYMBOL_SIZE (&msymbol[hi])
                          == MSYMBOL_SIZE (&msymbol[hi - 1]))
-                     && (SYMBOL_VALUE_ADDRESS (&msymbol[hi])
-                         == SYMBOL_VALUE_ADDRESS (&msymbol[hi - 1]))
-                     && (SYMBOL_OBJ_SECTION (objfile, &msymbol[hi])
-                         == SYMBOL_OBJ_SECTION (objfile, &msymbol[hi - 1])))
+                     && (MSYMBOL_VALUE_ADDRESS (&msymbol[hi])
+                         == MSYMBOL_VALUE_ADDRESS (&msymbol[hi - 1]))
+                     && (MSYMBOL_OBJ_SECTION (objfile, &msymbol[hi])
+                         == MSYMBOL_OBJ_SECTION (objfile, &msymbol[hi - 1])))
                    {
                      hi--;
                      continue;
@@ -646,9 +636,9 @@ lookup_minimal_symbol_by_pc_section_1 (CORE_ADDR pc,
                     the cancellable variants, but both have sizes.  */
                  if (hi > 0
                      && MSYMBOL_SIZE (&msymbol[hi]) != 0
-                     && pc >= (SYMBOL_VALUE_ADDRESS (&msymbol[hi])
+                     && pc >= (MSYMBOL_VALUE_ADDRESS (&msymbol[hi])
                                + MSYMBOL_SIZE (&msymbol[hi]))
-                     && pc < (SYMBOL_VALUE_ADDRESS (&msymbol[hi - 1])
+                     && pc < (MSYMBOL_VALUE_ADDRESS (&msymbol[hi - 1])
                               + MSYMBOL_SIZE (&msymbol[hi - 1])))
                    {
                      hi--;
@@ -678,7 +668,7 @@ lookup_minimal_symbol_by_pc_section_1 (CORE_ADDR pc,
 
              if (hi >= 0
                  && MSYMBOL_SIZE (&msymbol[hi]) != 0
-                 && pc >= (SYMBOL_VALUE_ADDRESS (&msymbol[hi])
+                 && pc >= (MSYMBOL_VALUE_ADDRESS (&msymbol[hi])
                            + MSYMBOL_SIZE (&msymbol[hi])))
                {
                  if (best_zero_sized != -1)
@@ -694,8 +684,8 @@ lookup_minimal_symbol_by_pc_section_1 (CORE_ADDR pc,
 
              if (hi >= 0
                  && ((best_symbol == NULL) ||
-                     (SYMBOL_VALUE_ADDRESS (best_symbol) <
-                      SYMBOL_VALUE_ADDRESS (&msymbol[hi]))))
+                     (MSYMBOL_VALUE_ADDRESS (best_symbol) <
+                      MSYMBOL_VALUE_ADDRESS (&msymbol[hi]))))
                {
                  best_symbol = &msymbol[hi];
                  best_objfile = objfile;
@@ -826,7 +816,7 @@ lookup_minimal_symbol_and_objfile (const char *name)
           msym != NULL;
           msym = msym->hash_next)
        {
-         if (strcmp (SYMBOL_LINKAGE_NAME (msym), name) == 0)
+         if (strcmp (MSYMBOL_LINKAGE_NAME (msym), name) == 0)
            {
              result.minsym = msym;
              result.objfile = objfile;
@@ -843,8 +833,6 @@ lookup_minimal_symbol_and_objfile (const char *name)
 /* Return leading symbol character for a BFD.  If BFD is NULL,
    return the leading symbol character from the main objfile.  */
 
-static int get_symbol_leading_char (bfd *);
-
 static int
 get_symbol_leading_char (bfd *abfd)
 {
@@ -937,17 +925,17 @@ prim_record_minimal_symbol_full (const char *name, int name_len, int copy_name,
 
   if (msym_bunch_index == BUNCH_SIZE)
     {
-      new = XCALLOC (1, struct msym_bunch);
+      new = XCNEW (struct msym_bunch);
       msym_bunch_index = 0;
       new->next = msym_bunch;
       msym_bunch = new;
     }
   msymbol = &msym_bunch->contents[msym_bunch_index];
-  SYMBOL_SET_LANGUAGE (msymbol, language_auto, &objfile->objfile_obstack);
-  SYMBOL_SET_NAMES (msymbol, name, name_len, copy_name, objfile);
+  MSYMBOL_SET_LANGUAGE (msymbol, language_auto, &objfile->objfile_obstack);
+  MSYMBOL_SET_NAMES (msymbol, name, name_len, copy_name, objfile);
 
-  SYMBOL_VALUE_ADDRESS (msymbol) = address;
-  SYMBOL_SECTION (msymbol) = section;
+  SET_MSYMBOL_VALUE_ADDRESS (msymbol, address);
+  MSYMBOL_SECTION (msymbol) = section;
 
   MSYMBOL_TYPE (msymbol) = ms_type;
   MSYMBOL_TARGET_FLAG_1 (msymbol) = 0;
@@ -993,19 +981,19 @@ compare_minimal_symbols (const void *fn1p, const void *fn2p)
   fn1 = (const struct minimal_symbol *) fn1p;
   fn2 = (const struct minimal_symbol *) fn2p;
 
-  if (SYMBOL_VALUE_ADDRESS (fn1) < SYMBOL_VALUE_ADDRESS (fn2))
+  if (MSYMBOL_VALUE_ADDRESS (fn1) < MSYMBOL_VALUE_ADDRESS (fn2))
     {
       return (-1);             /* addr 1 is less than addr 2.  */
     }
-  else if (SYMBOL_VALUE_ADDRESS (fn1) > SYMBOL_VALUE_ADDRESS (fn2))
+  else if (MSYMBOL_VALUE_ADDRESS (fn1) > MSYMBOL_VALUE_ADDRESS (fn2))
     {
       return (1);              /* addr 1 is greater than addr 2.  */
     }
   else
     /* addrs are equal: sort by name */
     {
-      const char *name1 = SYMBOL_LINKAGE_NAME (fn1);
-      const char *name2 = SYMBOL_LINKAGE_NAME (fn2);
+      const char *name1 = MSYMBOL_LINKAGE_NAME (fn1);
+      const char *name2 = MSYMBOL_LINKAGE_NAME (fn2);
 
       if (name1 && name2)      /* both have names */
        return strcmp (name1, name2);
@@ -1097,10 +1085,10 @@ compact_minimal_symbols (struct minimal_symbol *msymbol, int mcount,
       copyfrom = copyto = msymbol;
       while (copyfrom < msymbol + mcount - 1)
        {
-         if (SYMBOL_VALUE_ADDRESS (copyfrom)
-             == SYMBOL_VALUE_ADDRESS ((copyfrom + 1))
-             && strcmp (SYMBOL_LINKAGE_NAME (copyfrom),
-                        SYMBOL_LINKAGE_NAME ((copyfrom + 1))) == 0)
+         if (MSYMBOL_VALUE_ADDRESS (copyfrom)
+             == MSYMBOL_VALUE_ADDRESS ((copyfrom + 1))
+             && strcmp (MSYMBOL_LINKAGE_NAME (copyfrom),
+                        MSYMBOL_LINKAGE_NAME ((copyfrom + 1))) == 0)
            {
              if (MSYMBOL_TYPE ((copyfrom + 1)) == mst_unknown)
                {
@@ -1143,7 +1131,7 @@ build_minimal_symbol_hash_tables (struct objfile *objfile)
       add_minsym_to_hash_table (msym, objfile->msymbol_hash);
 
       msym->demangled_hash_next = 0;
-      if (SYMBOL_SEARCH_NAME (msym) != SYMBOL_LINKAGE_NAME (msym))
+      if (MSYMBOL_SEARCH_NAME (msym) != MSYMBOL_LINKAGE_NAME (msym))
        add_minsym_to_demangled_hash_table (msym,
                                             objfile->msymbol_demangled_hash);
     }
@@ -1187,7 +1175,7 @@ install_minimal_symbols (struct objfile *objfile)
        {
          fprintf_unfiltered (gdb_stdlog,
                              "Installing %d minimal symbols of objfile %s.\n",
-                             msym_count, objfile->name);
+                             msym_count, objfile_name (objfile));
        }
 
       /* Allocate enough space in the obstack, into which we will gather the
@@ -1279,7 +1267,7 @@ terminate_minimal_symbol_table (struct objfile *objfile)
     memset (m, 0, sizeof (*m));
     /* Don't rely on these enumeration values being 0's.  */
     MSYMBOL_TYPE (m) = mst_unknown;
-    SYMBOL_SET_LANGUAGE (m, language_unknown, &objfile->objfile_obstack);
+    MSYMBOL_SET_LANGUAGE (m, language_unknown, &objfile->objfile_obstack);
   }
 }
 
@@ -1336,27 +1324,73 @@ find_solib_trampoline_target (struct frame_info *frame, CORE_ADDR pc)
       {
        if ((MSYMBOL_TYPE (msymbol) == mst_text
            || MSYMBOL_TYPE (msymbol) == mst_text_gnu_ifunc)
-           && strcmp (SYMBOL_LINKAGE_NAME (msymbol),
-                      SYMBOL_LINKAGE_NAME (tsymbol)) == 0)
-         return SYMBOL_VALUE_ADDRESS (msymbol);
+           && strcmp (MSYMBOL_LINKAGE_NAME (msymbol),
+                      MSYMBOL_LINKAGE_NAME (tsymbol)) == 0)
+         return MSYMBOL_VALUE_ADDRESS (msymbol);
 
        /* Also handle minimal symbols pointing to function descriptors.  */
        if (MSYMBOL_TYPE (msymbol) == mst_data
-           && strcmp (SYMBOL_LINKAGE_NAME (msymbol),
-                      SYMBOL_LINKAGE_NAME (tsymbol)) == 0)
+           && strcmp (MSYMBOL_LINKAGE_NAME (msymbol),
+                      MSYMBOL_LINKAGE_NAME (tsymbol)) == 0)
          {
            CORE_ADDR func;
 
            func = gdbarch_convert_from_func_ptr_addr
                    (get_objfile_arch (objfile),
-                    SYMBOL_VALUE_ADDRESS (msymbol),
+                    MSYMBOL_VALUE_ADDRESS (msymbol),
                     &current_target);
 
            /* Ignore data symbols that are not function descriptors.  */
-           if (func != SYMBOL_VALUE_ADDRESS (msymbol))
+           if (func != MSYMBOL_VALUE_ADDRESS (msymbol))
              return func;
          }
       }
     }
   return 0;
 }
+
+/* See minsyms.h.  */
+
+CORE_ADDR
+minimal_symbol_upper_bound (struct bound_minimal_symbol minsym)
+{
+  int i;
+  short section;
+  struct obj_section *obj_section;
+  CORE_ADDR result;
+  struct minimal_symbol *msymbol;
+
+  gdb_assert (minsym.minsym != NULL);
+
+  /* If the minimal symbol has a size, use it.  Otherwise use the
+     lesser of the next minimal symbol in the same section, or the end
+     of the section, as the end of the function.  */
+
+  if (MSYMBOL_SIZE (minsym.minsym) != 0)
+    return MSYMBOL_VALUE_ADDRESS (minsym.minsym) + MSYMBOL_SIZE (minsym.minsym);
+
+  /* Step over other symbols at this same address, and symbols in
+     other sections, to find the next symbol in this section with a
+     different address.  */
+
+  msymbol = minsym.minsym;
+  section = MSYMBOL_SECTION (msymbol);
+  for (i = 1; MSYMBOL_LINKAGE_NAME (msymbol + i) != NULL; i++)
+    {
+      if (MSYMBOL_VALUE_ADDRESS (msymbol + i) != MSYMBOL_VALUE_ADDRESS (msymbol)
+         && MSYMBOL_SECTION (msymbol + i) == section)
+       break;
+    }
+
+  obj_section = MSYMBOL_OBJ_SECTION (minsym.objfile, minsym.minsym);
+  if (MSYMBOL_LINKAGE_NAME (msymbol + i) != NULL
+      && (MSYMBOL_VALUE_ADDRESS (msymbol + i)
+         < obj_section_endaddr (obj_section)))
+    result = MSYMBOL_VALUE_ADDRESS (msymbol + i);
+  else
+    /* We got the start address from the last msymbol in the objfile.
+       So the end address is the end of the section.  */
+    result = obj_section_endaddr (obj_section);
+
+  return result;
+}
This page took 0.034676 seconds and 4 git commands to generate.