This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix IA-64 ld bootstrap tests


Hi!

The following patch fixes IA-64 ld bootstrap tests by never using
host pointer values as hash keys.
Alternatively, elfNN_ia64_obj_tdata could contain
struct bfd_hash_entry root;
struct elfNN_ia64_dyn_sym_info ** infos;
unsigned char * sec_merge_done;
so that get_local_sym_hash could be replaced with
elfNN_ia64_tdata(abfd)->infos[ELF_R_SYM (rel->r_info)]
and similarly with sec_merge_done array.

2002-11-29  Jakub Jelinek  <jakub@redhat.com>

	* elfxx-ia64.c (elfNN_ia64_obj_tdata): New struct.
	(elfNN_ia64_tdata): New macro.
	(elfNN_ia64_mkobject, elfNN_ia64_object_p): New functions.
	(get_local_sym_hash): Assign keys to input bfds instead of using
	their pointer addresses for hashing purposes.
	(bfd_elfNN_mkobject, elf_backend_object_p): Define.

--- bfd/elfxx-ia64.c.jj	2002-11-28 15:49:52.000000000 +0100
+++ bfd/elfxx-ia64.c	2002-11-29 01:38:39.000000000 +0100
@@ -152,6 +152,15 @@ struct elfNN_ia64_link_hash_table
   struct elfNN_ia64_local_hash_table loc_hash_table;
 };
 
+struct elfNN_ia64_obj_tdata
+{
+  struct elf_obj_tdata root;
+  unsigned long key;
+};
+
+#define elfNN_ia64_tdata(abfd) \
+  ((struct elfNN_ia64_obj_tdata *) (abfd)->tdata.any)
+
 #define elfNN_ia64_hash_table(p) \
   ((struct elfNN_ia64_link_hash_table *) ((p)->hash))
 
@@ -317,6 +326,8 @@ static boolean elfNN_ia64_print_private_
   PARAMS ((bfd *abfd, PTR ptr));
 static enum elf_reloc_type_class elfNN_ia64_reloc_type_class
   PARAMS ((const Elf_Internal_Rela *));
+static boolean elfNN_ia64_mkobject PARAMS ((bfd *));
+static boolean elfNN_ia64_object_p PARAMS ((bfd *));
 static boolean elfNN_ia64_hpux_vec
   PARAMS ((const bfd_target *vec));
 static void elfNN_hpux_post_process_headers
@@ -1834,26 +1845,22 @@ get_local_sym_hash (ia64_info, abfd, rel
      const Elf_Internal_Rela *rel;
      boolean create;
 {
-  char *addr_name;
-  size_t len;
+  char *addr_name [2 * sizeof (unsigned long) + 2];
   struct elfNN_ia64_local_hash_entry *ret;
+  static unsigned long key;
+
+  if (! elfNN_ia64_tdata (abfd)->key)
+    elfNN_ia64_tdata (abfd)->key = ++key;
 
   /* Construct a string for use in the elfNN_ia64_local_hash_table.
      name describes what was once anonymous memory.  */
 
-  len = sizeof (void*)*2 + 1 + sizeof (bfd_vma)*4 + 1 + 1;
-  len += 10;	/* %p slop */
-
-  addr_name = bfd_malloc (len);
-  if (addr_name == NULL)
-    return 0;
-  sprintf (addr_name, "%p:%lx",
-	   (void *) abfd, (unsigned long) ELFNN_R_SYM (rel->r_info));
+  sprintf (addr_name, "%lx:%lx", elfNN_ia64_tdata (abfd)->key,
+	   (unsigned long) ELFNN_R_SYM (rel->r_info));
 
   /* Collect the canonical entry data for this address.  */
   ret = elfNN_ia64_local_hash_lookup (&ia64_info->loc_hash_table,
 				      addr_name, create, create);
-  free (addr_name);
   return ret;
 }
 
@@ -4660,6 +4667,32 @@ elfNN_ia64_reloc_type_class (rela)
 }
 
 static boolean
+elfNN_ia64_mkobject (abfd)
+     bfd *abfd;
+{
+  bfd_size_type amt = sizeof (struct elfNN_ia64_obj_tdata);
+  abfd->tdata.any = bfd_zalloc (abfd, amt);
+  if (abfd->tdata.any == NULL)
+    return false;
+  return true;
+}
+
+static boolean
+elfNN_ia64_object_p (abfd)
+     bfd *abfd;
+{
+  /* Allocate our special target data.  */
+  struct elfNN_ia64_obj_tdata *new_tdata;
+  bfd_size_type amt = sizeof (struct elfNN_ia64_obj_tdata);
+  new_tdata = bfd_zalloc (abfd, amt);
+  if (new_tdata == NULL)
+    return false;
+  new_tdata->root = *abfd->tdata.elf_obj_data;
+  abfd->tdata.any = new_tdata;
+  return true;
+}
+
+static boolean
 elfNN_ia64_hpux_vec (const bfd_target *vec)
 {
   extern const bfd_target bfd_elfNN_ia64_hpux_big_vec;
@@ -4718,6 +4751,9 @@ elfNN_hpux_backend_section_from_bfd_sect
 #define elf_info_to_howto \
 	elfNN_ia64_info_to_howto
 
+#define bfd_elfNN_mkobject	elfNN_ia64_mkobject
+#define elf_backend_object_p	elfNN_ia64_object_p
+
 #define bfd_elfNN_bfd_reloc_type_lookup \
 	elfNN_ia64_reloc_type_lookup
 #define bfd_elfNN_bfd_is_local_label_name \

	Jakub


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]