[toolchain/binutils/2.21]: add some more avr32 fixes
[openwrt/svn-archive/archive.git] / toolchain / binutils / patches / 2.21 / 700-avr32.patch
index c7e8ea3cf6ff782b6541efd23cd17c06ba7cbaea..b33a3b267e258308663367377325a86fd2ee07ca 100644 (file)
 +
 +void bfd_elf32_avr32_set_options(struct bfd_link_info *info,
 +                               int direct_data_refs);
---- a/bfd/elf-bfd.h
+--- b/bfd/elf-bfd.h
 +++ b/bfd/elf-bfd.h
-@@ -1553,6 +1553,10 @@ struct elf_obj_tdata
+@@ -406,6 +406,7 @@
+   ALPHA_ELF_DATA = 1,
+   ARM_ELF_DATA,
+   AVR_ELF_DATA,
++  AVR32_ELF_DATA,
+   BFIN_ELF_DATA,
+   CRIS_ELF_DATA,
+   FRV_ELF_DATA,
+@@ -1553,6 +1554,10 @@
       find_nearest_line.  */
    struct mips_elf_find_line *find_line_info;
  
  #ifdef ARCH_s390
    print_s390_disassembler_options (stream);
  #endif
+--- a/bfd/elf32-avr32.c
++++ b/bfd/elf32-avr32.c
+@@ -352,7 +352,8 @@ struct elf_avr32_link_hash_table
+   unsigned int relax_pass;
+ };
+ #define avr32_elf_hash_table(p)                               \
+-  ((struct elf_avr32_link_hash_table *)((p)->hash))
++  (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
++  == AVR32_ELF_DATA ? ((struct elf_avr32_link_hash_table *) ((p)->hash)) : NULL)
+ static struct bfd_hash_entry *
+ avr32_elf_link_hash_newfunc(struct bfd_hash_entry *entry,
+@@ -414,7 +415,8 @@ avr32_elf_link_hash_table_create(bfd *ab
+   if (! _bfd_elf_link_hash_table_init(&ret->root, abfd,
+                                     avr32_elf_link_hash_newfunc,
+-                      sizeof (struct elf_avr32_link_hash_entry)))
++                      sizeof (struct elf_avr32_link_hash_entry),
++                      AVR32_ELF_DATA))
+     {
+       free(ret);
+       return NULL;
+@@ -497,6 +499,9 @@ avr32_elf_create_got_section (bfd *dynob
+   htab = avr32_elf_hash_table(info);
+   flags = bed->dynamic_sec_flags;
++  if (htab == NULL)
++    return FALSE;
++
+   if (htab->sgot)
+     return TRUE;
+@@ -534,6 +539,9 @@ avr32_elf_create_dynamic_sections (bfd *
+   htab = avr32_elf_hash_table(info);
+   flags = bed->dynamic_sec_flags;
++  if (htab == NULL)
++    return FALSE;
++
+   if (!avr32_elf_create_got_section (dynobj, info))
+     return FALSE;
+@@ -574,6 +582,9 @@ avr32_check_relocs (bfd *abfd, struct bf
+   symtab_hdr = &elf_tdata(abfd)->symtab_hdr;
+   sym_hashes = elf_sym_hashes(abfd);
+   htab = avr32_elf_hash_table(info);
++  if (htab == NULL)
++    return FALSE;
++
+   local_got_ents = elf_local_got_ents(abfd);
+   sgot = htab->sgot;
+@@ -756,6 +767,9 @@ avr32_elf_adjust_dynamic_symbol(struct b
+   havr = (struct elf_avr32_link_hash_entry *)h;
+   dynobj = elf_hash_table(info)->dynobj;
++  if (htab == NULL)
++    return FALSE;
++
+   /* Make sure we know what is going on here.  */
+   BFD_ASSERT (dynobj != NULL
+             && (h->u.weakdef != NULL
+@@ -1066,6 +1080,9 @@ allocate_dynrelocs(struct elf_link_hash_
+   htab = avr32_elf_hash_table(info);
+   havr = (struct elf_avr32_link_hash_entry *)h;
++  if (htab == NULL)
++    return FALSE;
++
+   got = h->got.glist;
+   /* If got is NULL, the symbol is never referenced through the GOT */
+@@ -1117,6 +1134,9 @@ avr32_elf_size_dynamic_sections (bfd *ou
+   pr_debug("(4) size dynamic sections\n");
+   htab = avr32_elf_hash_table(info);
++  if (htab == NULL)
++    return FALSE;
++
+   dynobj = htab->root.dynobj;
+   BFD_ASSERT(dynobj != NULL);
+@@ -3260,6 +3280,9 @@ avr32_elf_relocate_section(bfd *output_b
+     return TRUE;
+   htab = avr32_elf_hash_table(info);
++  if (htab == NULL)
++    return FALSE;
++
+   symtab_hdr = &elf_tdata(input_bfd)->symtab_hdr;
+   sym_hashes = elf_sym_hashes(input_bfd);
+   local_got_ents = elf_local_got_ents(input_bfd);
+@@ -3582,6 +3605,9 @@ avr32_elf_finish_dynamic_symbol(bfd *out
+   pr_debug("(7) finish dynamic symbol: %s\n", h->root.root.string);
+   htab = avr32_elf_hash_table(info);
++  if (htab == NULL)
++    return FALSE;
++
+   got = h->got.glist;
+   if (got && got->refcount > 0)
+@@ -3648,6 +3674,9 @@ avr32_elf_finish_dynamic_sections(bfd *o
+   pr_debug("(8) finish dynamic sections\n");
+   htab = avr32_elf_hash_table(info);
++  if (htab == NULL)
++    return FALSE;
++
+   sgot = htab->sgot;
+   sdyn = bfd_get_section_by_name(htab->root.dynobj, ".dynamic");