2009-02-25 H.J. Lu <hongjiu.lu@intel.com>
authorH.J. Lu <hjl.tools@gmail.com>
Wed, 25 Feb 2009 14:39:35 +0000 (14:39 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Wed, 25 Feb 2009 14:39:35 +0000 (14:39 +0000)
* elf.c (elf_find_function): Use is_function_type to check
function symbol.

bfd/ChangeLog
bfd/elf.c

index df8618d036989eaa8d4a4ae324ceeb600c6709a5..4d5838791cf88f3afe28ddb1bbe4c89fe766b5ee 100644 (file)
@@ -1,3 +1,8 @@
+2009-02-25  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * elf.c (elf_find_function): Use is_function_type to check
+       function symbol.
+
 2009-02-24  Sterling Augustine  <sterling@jaw.hq.tensilica.com>
 
        * xtensa-modules.c: Revert to previous version 1.11 due
index 44af469e1ff9c1aa471a7770bbb34c574a16d1af..97ac5cbc42de63430dc4b776c0c8c72481258960 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -7041,7 +7041,7 @@ _bfd_elf_set_arch_mach (bfd *abfd,
    for error reporting.  */
 
 static bfd_boolean
-elf_find_function (bfd *abfd ATTRIBUTE_UNUSED,
+elf_find_function (bfd *abfd,
                   asection *section,
                   asymbol **symbols,
                   bfd_vma offset,
@@ -7061,6 +7061,7 @@ elf_find_function (bfd *abfd ATTRIBUTE_UNUSED,
      make a better choice of file name for local symbols by ignoring
      file symbols appearing after a given local symbol.  */
   enum { nothing_seen, symbol_seen, file_after_symbol_seen } state;
+  const struct elf_backend_data *bed = get_elf_backend_data (abfd);
 
   filename = NULL;
   func = NULL;
@@ -7071,20 +7072,22 @@ elf_find_function (bfd *abfd ATTRIBUTE_UNUSED,
   for (p = symbols; *p != NULL; p++)
     {
       elf_symbol_type *q;
+      unsigned int type;
 
       q = (elf_symbol_type *) *p;
 
-      switch (ELF_ST_TYPE (q->internal_elf_sym.st_info))
+      type = ELF_ST_TYPE (q->internal_elf_sym.st_info);
+      switch (type)
        {
-       default:
-         break;
        case STT_FILE:
          file = &q->symbol;
          if (state == symbol_seen)
            state = file_after_symbol_seen;
          continue;
+       default:
+         if (!bed->is_function_type (type))
+           break;
        case STT_NOTYPE:
-       case STT_FUNC:
          if (bfd_get_section (&q->symbol) == section
              && q->symbol.value >= low_func
              && q->symbol.value <= offset)