2009-06-16 H.J. Lu <hongjiu.lu@intel.com>
authorH.J. Lu <hjl.tools@gmail.com>
Tue, 16 Jun 2009 17:45:08 +0000 (17:45 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Tue, 16 Jun 2009 17:45:08 +0000 (17:45 +0000)
* elf-bfd.h (ELF_LOCAL_SYMBOL_HASH): New.

* elf32-i386.c (elf_i386_local_hash): Removed.
(elf_i386_local_htab_hash): Use ELF_LOCAL_SYMBOL_HASH.
(elf_i386_get_local_sym_hash): Likewise.

* elf64-x86-64.c (elf64_x86_64_local_hash): Removed.
(elf64_x86_64_local_htab_hash): Use ELF_LOCAL_SYMBOL_HASH.
(elf64_x86_64_get_local_sym_hash): Likewise.
* elfxx-ia64.c (elfNN_ia64_local_htab_hash): Likewise.
(get_local_sym_hash): Likewise.

bfd/ChangeLog
bfd/elf-bfd.h
bfd/elf32-i386.c
bfd/elf64-x86-64.c
bfd/elfxx-ia64.c

index 7d7e3ca3c7bf96e6c21136bae94364a7e91d5c33..ad5fd4f0240c5d71c0992a23df2b7fe5ea119ba1 100644 (file)
@@ -1,3 +1,17 @@
+2009-06-16  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * elf-bfd.h (ELF_LOCAL_SYMBOL_HASH): New.
+
+       * elf32-i386.c (elf_i386_local_hash): Removed.
+       (elf_i386_local_htab_hash): Use ELF_LOCAL_SYMBOL_HASH.
+       (elf_i386_get_local_sym_hash): Likewise.
+
+       * elf64-x86-64.c (elf64_x86_64_local_hash): Removed.
+       (elf64_x86_64_local_htab_hash): Use ELF_LOCAL_SYMBOL_HASH.
+       (elf64_x86_64_get_local_sym_hash): Likewise.
+       * elfxx-ia64.c (elfNN_ia64_local_htab_hash): Likewise.
+       (get_local_sym_hash): Likewise.
+
 2009-06-16  H.J. Lu  <hongjiu.lu@intel.com>
 
        * elfxx-ia64.c (elfNN_ia64_link_hash_table): Remove got_sec,
index a3ae6a20a18abc12f0b1972f9357465751acb981..b81f0097432a530b168c844a2abd37db7a3edc55 100644 (file)
@@ -2163,6 +2163,12 @@ extern bfd_boolean _bfd_elf_create_ifunc_sections
 /* Large common section.  */
 extern asection _bfd_elf_large_com_section;
 
+/* Hash for local symbol with the first section id, ID, in the input
+   file and the local symbol index, SYM.  */
+#define ELF_LOCAL_SYMBOL_HASH(ID, SYM) \
+  (((((ID) & 0xff) << 24) | (((ID) & 0xff00) << 8)) \
+   ^ (SYM) ^ ((ID) >> 16))
+
 /* This is the condition under which finish_dynamic_symbol will be called.
    If our finish_dynamic_symbol isn't called, we'll need to do something
    about initializing any .plt and .got entries in relocate_section.  */
index 610c709959f21f78bc0ec11cab6b62333ad65e0e..60a414237a71d82455a43d3ff21cd2db29b1461d 100644 (file)
@@ -745,13 +745,6 @@ elf_i386_link_hash_newfunc (struct bfd_hash_entry *entry,
   return entry;
 }
 
-static hashval_t
-elf_i386_local_hash (int id, int r_sym)
-{
-  return ((((id & 0xff) << 24) | ((id & 0xff00) << 8))
-         ^ r_sym ^ (id >> 16));
-}
-
 /* Compute a hash of a local hash entry.  We use elf_link_hash_entry
   for local symbol so that we can handle local STT_GNU_IFUNC symbols
   as global symbol.  We reuse indx and dynstr_index for local symbol
@@ -762,7 +755,7 @@ elf_i386_local_htab_hash (const void *ptr)
 {
   struct elf_link_hash_entry *h
     = (struct elf_link_hash_entry *) ptr;
-  return elf_i386_local_hash (h->indx, h->dynstr_index);
+  return ELF_LOCAL_SYMBOL_HASH (h->indx, h->dynstr_index);
 }
 
 /* Compare local hash entries.  */
@@ -787,8 +780,8 @@ elf_i386_get_local_sym_hash (struct elf_i386_link_hash_table *htab,
 {
   struct elf_i386_link_hash_entry e, *ret;
   asection *sec = abfd->sections;
-  hashval_t h = elf_i386_local_hash (sec->id,
-                                    ELF32_R_SYM (rel->r_info));
+  hashval_t h = ELF_LOCAL_SYMBOL_HASH (sec->id,
+                                      ELF32_R_SYM (rel->r_info));
   void **slot;
 
   e.elf.indx = sec->id;
index 06408b07bac3ca5e9f0eaa75eccde918415f6243..5947a3e82f820d60a8881308b562581b858d8f4d 100644 (file)
@@ -559,13 +559,6 @@ elf64_x86_64_link_hash_newfunc (struct bfd_hash_entry *entry,
   return entry;
 }
 
-static hashval_t
-elf64_x86_64_local_hash (int id, int r_sym)
-{
-  return ((((id & 0xff) << 24) | ((id & 0xff00) << 8))
-         ^ r_sym ^ (id >> 16));
-}
-
 /* Compute a hash of a local hash entry.  We use elf_link_hash_entry
   for local symbol so that we can handle local STT_GNU_IFUNC symbols
   as global symbol.  We reuse indx and dynstr_index for local symbol
@@ -576,7 +569,7 @@ elf64_x86_64_local_htab_hash (const void *ptr)
 {
   struct elf_link_hash_entry *h
     = (struct elf_link_hash_entry *) ptr;
-  return elf64_x86_64_local_hash (h->indx, h->dynstr_index);
+  return ELF_LOCAL_SYMBOL_HASH (h->indx, h->dynstr_index);
 }
 
 /* Compare local hash entries.  */
@@ -601,8 +594,8 @@ elf64_x86_64_get_local_sym_hash (struct elf64_x86_64_link_hash_table *htab,
 {
   struct elf64_x86_64_link_hash_entry e, *ret;
   asection *sec = abfd->sections;
-  hashval_t h = elf64_x86_64_local_hash (sec->id,
-                                        ELF64_R_SYM (rel->r_info));
+  hashval_t h = ELF_LOCAL_SYMBOL_HASH (sec->id,
+                                      ELF64_R_SYM (rel->r_info));
   void **slot;
 
   e.elf.indx = sec->id;
index 2123fe08972479da456eaaf450eab34714778f18..ccb849dc31eadf0ec288e77b0a56c63aec997f4e 100644 (file)
@@ -1809,8 +1809,7 @@ elfNN_ia64_local_htab_hash (const void *ptr)
   struct elfNN_ia64_local_hash_entry *entry
     = (struct elfNN_ia64_local_hash_entry *) ptr;
 
-  return (((entry->id & 0xff) << 24) | ((entry->id & 0xff00) << 8))
-         ^ entry->r_sym ^ (entry->id >> 16);
+  return ELF_LOCAL_SYMBOL_HASH (entry->id, entry->r_sym);
 }
 
 /* Compare local hash entries.  */
@@ -2033,8 +2032,8 @@ get_local_sym_hash (struct elfNN_ia64_link_hash_table *ia64_info,
 {
   struct elfNN_ia64_local_hash_entry e, *ret;
   asection *sec = abfd->sections;
-  hashval_t h = (((sec->id & 0xff) << 24) | ((sec->id & 0xff00) << 8))
-               ^ ELFNN_R_SYM (rel->r_info) ^ (sec->id >> 16);
+  hashval_t h = ELF_LOCAL_SYMBOL_HASH (sec->id,
+                                      ELFNN_R_SYM (rel->r_info));
   void **slot;
 
   e.id = sec->id;