summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2009-06-16 17:45:08 +0000
committerH.J. Lu <hjl.tools@gmail.com>2009-06-16 17:45:08 +0000
commitd2149d727fa0cc33a0cd4a8eee78b9fe4108bede (patch)
tree418cd30479f1c64c09eef349a30bdb0bad00e961
parentcc3bd654e497aad7fa2793a7b6eac941e41fe4a8 (diff)
downloadbinutils-gdb-d2149d727fa0cc33a0cd4a8eee78b9fe4108bede.tar.gz
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.
-rw-r--r--bfd/ChangeLog14
-rw-r--r--bfd/elf-bfd.h6
-rw-r--r--bfd/elf32-i386.c13
-rw-r--r--bfd/elf64-x86-64.c13
-rw-r--r--bfd/elfxx-ia64.c7
5 files changed, 29 insertions, 24 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 7d7e3ca3c7b..ad5fd4f0240 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,19 @@
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,
rel_got_sec and plt_sec.
(elfNN_ia64_relax_section): Updated.
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
index a3ae6a20a18..b81f0097432 100644
--- a/bfd/elf-bfd.h
+++ b/bfd/elf-bfd.h
@@ -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. */
diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c
index 610c709959f..60a414237a7 100644
--- a/bfd/elf32-i386.c
+++ b/bfd/elf32-i386.c
@@ -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;
diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
index 06408b07bac..5947a3e82f8 100644
--- a/bfd/elf64-x86-64.c
+++ b/bfd/elf64-x86-64.c
@@ -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;
diff --git a/bfd/elfxx-ia64.c b/bfd/elfxx-ia64.c
index 2123fe08972..ccb849dc31e 100644
--- a/bfd/elfxx-ia64.c
+++ b/bfd/elfxx-ia64.c
@@ -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;