* elf-bfd.h (struct sym_sec_cache): Delete "sec". Add "shndx".
authorAlan Modra <amodra@gmail.com>
Wed, 18 Jul 2007 11:23:37 +0000 (11:23 +0000)
committerAlan Modra <amodra@gmail.com>
Wed, 18 Jul 2007 11:23:37 +0000 (11:23 +0000)
* elf.c (bfd_section_from_r_symndx): Don't cache bfd section of
symbol.  Instead cache ELF section index.  Remove redundant
checks of st_shndx.

bfd/ChangeLog
bfd/elf-bfd.h
bfd/elf.c

index 6f8051c6dc158756e80eef652fc1769d764cf709..eb639c4b4f7aab19b67657c78926d3620906ee1b 100644 (file)
@@ -1,3 +1,10 @@
+2007-07-18  Alan Modra  <amodra@bigpond.net.au>
+
+       * elf-bfd.h (struct sym_sec_cache): Delete "sec".  Add "shndx".
+       * elf.c (bfd_section_from_r_symndx): Don't cache bfd section of
+       symbol.  Instead cache ELF section index.  Remove redundant
+       checks of st_shndx.
+
 2007-07-15  Mike Frysinger  <vapier@gentoo.org>
 
        * trad-core.c (NBPG): If not defined, set to getpagesize().
index 572e89b3d5633aac21fccd39bf1fc81125933407..5db52f3c9fc08eeb5dff10b5eca9a5121e385681 100644 (file)
@@ -423,7 +423,7 @@ struct sym_sec_cache
 {
   bfd *abfd;
   unsigned long indx[LOCAL_SYM_CACHE_SIZE];
-  asection *sec[LOCAL_SYM_CACHE_SIZE];
+  unsigned int shndx[LOCAL_SYM_CACHE_SIZE];
 };
 \f
 /* Constant information held for an ELF backend.  */
index 9fb5f24c3b604054bda53f11f383ee01c6894939..cf7436f59ae38770199d04a8a172acc64213ed77 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -2273,36 +2273,35 @@ bfd_section_from_r_symndx (bfd *abfd,
                           asection *sec,
                           unsigned long r_symndx)
 {
-  Elf_Internal_Shdr *symtab_hdr;
-  unsigned char esym[sizeof (Elf64_External_Sym)];
-  Elf_External_Sym_Shndx eshndx;
-  Elf_Internal_Sym isym;
   unsigned int ent = r_symndx % LOCAL_SYM_CACHE_SIZE;
+  asection *s;
 
-  if (cache->abfd == abfd && cache->indx[ent] == r_symndx)
-    return cache->sec[ent];
+  if (cache->abfd != abfd || cache->indx[ent] != r_symndx)
+    {
+      Elf_Internal_Shdr *symtab_hdr;
+      unsigned char esym[sizeof (Elf64_External_Sym)];
+      Elf_External_Sym_Shndx eshndx;
+      Elf_Internal_Sym isym;
 
-  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
-  if (bfd_elf_get_elf_syms (abfd, symtab_hdr, 1, r_symndx,
-                           &isym, esym, &eshndx) == NULL)
-    return NULL;
+      symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
+      if (bfd_elf_get_elf_syms (abfd, symtab_hdr, 1, r_symndx,
+                               &isym, esym, &eshndx) == NULL)
+       return NULL;
 
-  if (cache->abfd != abfd)
-    {
-      memset (cache->indx, -1, sizeof (cache->indx));
-      cache->abfd = abfd;
-    }
-  cache->indx[ent] = r_symndx;
-  cache->sec[ent] = sec;
-  if ((isym.st_shndx != SHN_UNDEF && isym.st_shndx < SHN_LORESERVE)
-      || isym.st_shndx > SHN_HIRESERVE)
-    {
-      asection *s;
-      s = bfd_section_from_elf_index (abfd, isym.st_shndx);
-      if (s != NULL)
-       cache->sec[ent] = s;
+      if (cache->abfd != abfd)
+       {
+         memset (cache->indx, -1, sizeof (cache->indx));
+         cache->abfd = abfd;
+       }
+      cache->indx[ent] = r_symndx;
+      cache->shndx[ent] = isym.st_shndx;
     }
-  return cache->sec[ent];
+
+  s = bfd_section_from_elf_index (abfd, cache->shndx[ent]);
+  if (s != NULL)
+    return s;
+
+  return sec;
 }
 
 /* Given an ELF section number, retrieve the corresponding BFD