Update the FSF address in the copyright/GPL notice
[deliverable/binutils-gdb.git] / bfd / elf32-m32r.c
index fc95840900c140215d9f62fe5f380ab96d6c0e49..bd61c5e05b04ab71b35a2896a4e06d61fcce94a5 100644 (file)
@@ -1,5 +1,5 @@
 /* M32R-specific support for 32-bit ELF.
-   Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
+   Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
    Free Software Foundation, Inc.
 
    This file is part of BFD, the Binary File Descriptor library.
@@ -16,7 +16,7 @@
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02110-1301, USA.  */
 
 #include "bfd.h"
 #include "sysdep.h"
@@ -56,10 +56,6 @@ static bfd_boolean m32r_elf_add_symbol_hook
 static bfd_boolean m32r_elf_relocate_section
   PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
           Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
-#if 0 /* not yet */
-static bfd_boolean m32r_elf_relax_delete_bytes
-  PARAMS ((bfd *, asection *, bfd_vma, int));
-#endif
 static bfd_reloc_status_type m32r_elf_final_sda_base
   PARAMS ((bfd *, struct bfd_link_info *, const char **, bfd_vma *));
 static bfd_boolean m32r_elf_object_p
@@ -1258,6 +1254,7 @@ struct m32r_reloc_map
   unsigned char elf_reloc_val;
 };
 
+#ifdef USE_M32R_OLD_RELOC
 static const struct m32r_reloc_map m32r_reloc_map_old[] =
 {
   { BFD_RELOC_NONE, R_M32R_NONE },
@@ -1274,7 +1271,7 @@ static const struct m32r_reloc_map m32r_reloc_map_old[] =
   { BFD_RELOC_VTABLE_INHERIT, R_M32R_GNU_VTINHERIT },
   { BFD_RELOC_VTABLE_ENTRY, R_M32R_GNU_VTENTRY },
 };
-
+#else
 static const struct m32r_reloc_map m32r_reloc_map[] =
 {
   { BFD_RELOC_NONE, R_M32R_NONE },
@@ -1309,6 +1306,7 @@ static const struct m32r_reloc_map m32r_reloc_map[] =
   { BFD_RELOC_M32R_GOTOFF_HI_SLO, R_M32R_GOTOFF_HI_SLO },
   { BFD_RELOC_M32R_GOTOFF_LO, R_M32R_GOTOFF_LO },
 };
+#endif
 
 static reloc_howto_type *
 bfd_elf32_bfd_reloc_type_lookup (abfd, code)
@@ -1350,7 +1348,7 @@ m32r_info_to_howto_rel (abfd, cache_ptr, dst)
   unsigned int r_type;
 
   r_type = ELF32_R_TYPE (dst->r_info);
-  BFD_ASSERT (ELF32_R_TYPE(dst->r_info) <= (unsigned int) R_M32R_GNU_VTENTRY)
+  BFD_ASSERT (ELF32_R_TYPE(dst->r_info) <= (unsigned int) R_M32R_GNU_VTENTRY);
   cache_ptr->howto = &m32r_elf_howto_table[r_type];
 }
 
@@ -1955,7 +1953,7 @@ printf("m32r_elf_adjust_dynamic_symbol()\n");
   /* Make sure we know what is going on here.  */
   BFD_ASSERT (dynobj != NULL
               && (h->needs_plt
-                  || h->weakdef != NULL
+                  || h->u.weakdef != NULL
                   || (h->def_dynamic
                       && h->ref_regular
                       && !h->def_regular)));
@@ -1990,12 +1988,12 @@ printf("m32r_elf_adjust_dynamic_symbol()\n");
   /* If this is a weak symbol, and there is a real definition, the
      processor independent code will have arranged for us to see the
      real definition first, and we can just use the same value.  */
-  if (h->weakdef != NULL)
+  if (h->u.weakdef != NULL)
     {
-      BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
-                  || h->weakdef->root.type == bfd_link_hash_defweak);
-      h->root.u.def.section = h->weakdef->root.u.def.section;
-      h->root.u.def.value = h->weakdef->root.u.def.value;
+      BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
+                  || h->u.weakdef->root.type == bfd_link_hash_defweak);
+      h->root.u.def.section = h->u.weakdef->root.u.def.section;
+      h->root.u.def.value = h->u.weakdef->root.u.def.value;
       return TRUE;
     }
 
@@ -2828,7 +2826,7 @@ m32r_elf_relocate_section (output_bfd, info, input_bfd, input_section,
             case R_M32R_GOTOFF:
               /* Relocation is relative to the start of the global offset
                  table (for ld24 rx, #uimm24). eg access at label+addend
-                
+
                  ld24 rx. #label@GOTOFF + addend
                  sub  rx, r12.  */
 
@@ -3236,8 +3234,8 @@ m32r_elf_relocate_section (output_bfd, info, input_bfd, input_section,
            {
            case bfd_reloc_overflow:
              if (! ((*info->callbacks->reloc_overflow)
-                    (info, name, howto->name, (bfd_vma) 0,
-                     input_bfd, input_section, offset)))
+                    (info, (h ? &h->root : NULL), name, howto->name,
+                     (bfd_vma) 0, input_bfd, input_section, offset)))
                return FALSE;
              break;
 
@@ -3617,541 +3615,6 @@ printf("m32r_elf_finish_dynamic_sections()\n");
   return TRUE;
 }
 
-\f
-#if 0 /* relaxing not supported yet */
-
-/* This function handles relaxing for the m32r.
-   Relaxing on the m32r is tricky because of instruction alignment
-   requirements (4 byte instructions must be aligned on 4 byte boundaries).
-
-   The following relaxing opportunities are handled:
-
-   seth/add3/jl -> bl24 or bl8
-   seth/add3 -> ld24
-
-   It would be nice to handle bl24 -> bl8 but given:
-
-   - 4 byte insns must be on 4 byte boundaries
-   - branch instructions only branch to insns on 4 byte boundaries
-
-   this isn't much of a win because the insn in the 2 "deleted" bytes
-   must become a nop.  With some complexity some real relaxation could be
-   done but the frequency just wouldn't make it worth it; it's better to
-   try to do all the code compaction one can elsewhere.
-   When the chip supports parallel 16 bit insns, things may change.
-*/
-
-static bfd_boolean
-m32r_elf_relax_section (abfd, sec, link_info, again)
-     bfd *abfd;
-     asection *sec;
-     struct bfd_link_info *link_info;
-     bfd_boolean *again;
-{
-  Elf_Internal_Shdr *symtab_hdr;
-  /* The Rela structures are used here because that's what
-     _bfd_elf_link_read_relocs uses [for convenience - it sets the addend
-     field to 0].  */
-  Elf_Internal_Rela *internal_relocs = NULL;
-  Elf_Internal_Rela *irel, *irelend;
-  bfd_byte *contents = NULL;
-  Elf_Internal_Sym *isymbuf = NULL;
-
-  /* Assume nothing changes.  */
-  *again = FALSE;
-
-  /* We don't have to do anything for a relocatable link, if
-     this section does not have relocs, or if this is not a
-     code section.  */
-  if (link_info->relocatable
-      || (sec->flags & SEC_RELOC) == 0
-      || sec->reloc_count == 0
-      || (sec->flags & SEC_CODE) == 0
-      || 0 /* FIXME: check SHF_M32R_CAN_RELAX */)
-    return TRUE;
-
-  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
-
-  /* Get a copy of the native relocations.  */
-  internal_relocs = (_bfd_elf_link_read_relocs
-                    (abfd, sec, (PTR) NULL, (Elf_Internal_Rela *) NULL,
-                     link_info->keep_memory));
-  if (internal_relocs == NULL)
-    goto error_return;
-
-  /* Walk through them looking for relaxing opportunities.  */
-  irelend = internal_relocs + sec->reloc_count;
-  for (irel = internal_relocs; irel < irelend; irel++)
-    {
-      bfd_vma symval;
-
-      /* If this isn't something that can be relaxed, then ignore
-        this reloc.  */
-      if (ELF32_R_TYPE (irel->r_info) != (int) R_M32R_HI16_SLO)
-       continue;
-
-      /* Get the section contents if we haven't done so already.  */
-      if (contents == NULL)
-       {
-         /* Get cached copy if it exists.  */
-         if (elf_section_data (sec)->this_hdr.contents != NULL)
-           contents = elf_section_data (sec)->this_hdr.contents;
-         else
-           {
-             /* Go get them off disk.  */
-             if (!bfd_malloc_and_get_section (abfd, sec, &contents))
-               goto error_return;
-           }
-       }
-
-      /* Read this BFD's local symbols if we haven't done so already.  */
-      if (isymbuf == NULL && symtab_hdr->sh_info != 0)
-       {
-         isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
-         if (isymbuf == NULL)
-           isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
-                                           symtab_hdr->sh_info, 0,
-                                           NULL, NULL, NULL);
-         if (isymbuf == NULL)
-           goto error_return;
-       }
-
-      /* Get the value of the symbol referred to by the reloc.  */
-      if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
-       {
-         /* A local symbol.  */
-         Elf_Internal_Sym *isym;
-         asection *sym_sec;
-
-         isym = isymbuf + ELF32_R_SYM (irel->r_info),
-         sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
-         symval = (isym->st_value
-                   + sym_sec->output_section->vma
-                   + sym_sec->output_offset);
-       }
-      else
-       {
-         unsigned long indx;
-         struct elf_link_hash_entry *h;
-
-         /* An external symbol.  */
-         indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
-         h = elf_sym_hashes (abfd)[indx];
-         BFD_ASSERT (h != NULL);
-         if (h->root.type != bfd_link_hash_defined
-             && h->root.type != bfd_link_hash_defweak)
-           {
-             /* This appears to be a reference to an undefined
-                 symbol.  Just ignore it--it will be caught by the
-                 regular reloc processing.  */
-             continue;
-           }
-
-         symval = (h->root.u.def.value
-                   + h->root.u.def.section->output_section->vma
-                   + h->root.u.def.section->output_offset);
-       }
-
-      /* For simplicity of coding, we are going to modify the section
-        contents, the section relocs, and the BFD symbol table.  We
-        must tell the rest of the code not to free up this
-        information.  It would be possible to instead create a table
-        of changes which have to be made, as is done in coff-mips.c;
-        that would be more work, but would require less memory when
-        the linker is run.  */
-
-      /* Try to change a seth/add3/jl subroutine call to bl24 or bl8.
-        This sequence is generated by the compiler when compiling in
-        32 bit mode.  Also look for seth/add3 -> ld24.  */
-
-      if (ELF32_R_TYPE (irel->r_info) == (int) R_M32R_HI16_SLO)
-       {
-         Elf_Internal_Rela *nrel;
-         bfd_vma pc = (sec->output_section->vma + sec->output_offset
-                       + irel->r_offset);
-         bfd_signed_vma pcrel_value = symval - pc;
-         unsigned int code,reg;
-         int addend,nop_p,bl8_p,to_delete;
-
-         /* The tests are ordered so that we get out as quickly as possible
-            if this isn't something we can relax, taking into account that
-            we are looking for two separate possibilities (jl/ld24).  */
-
-         /* Do nothing if no room in the section for this to be what we're
-            looking for.  */
-         if (irel->r_offset > sec->size - 8)
-           continue;
-
-         /* Make sure the next relocation applies to the next
-            instruction and that it's the add3's reloc.  */
-         nrel = irel + 1;
-         if (nrel == irelend
-             || irel->r_offset + 4 != nrel->r_offset
-             || ELF32_R_TYPE (nrel->r_info) != (int) R_M32R_LO16)
-           continue;
-
-         /* See if the instructions are seth/add3.  */
-         /* FIXME: This is where macros from cgen can come in.  */
-         code = bfd_get_16 (abfd, contents + irel->r_offset + 0);
-         if ((code & 0xf0ff) != 0xd0c0)
-           continue; /* not seth rN,foo */
-         reg = (code & 0x0f00) >> 8;
-         code = bfd_get_16 (abfd, contents + irel->r_offset + 4);
-         if (code != (0x80a0 | reg | (reg << 8)))
-           continue; /* not add3 rN,rN,foo */
-
-         /* At this point we've confirmed we have seth/add3.  Now check
-            whether the next insn is a jl, in which case try to change this
-            to bl24 or bl8.  */
-
-         /* Ensure the branch target is in range.
-            The bl24 instruction has a 24 bit operand which is the target
-            address right shifted by 2, giving a signed range of 26 bits.
-            Note that 4 bytes are added to the high value because the target
-            will be at least 4 bytes closer if we can relax.  It'll actually
-            be 4 or 8 bytes closer, but we don't know which just yet and
-            the difference isn't significant enough to worry about.  */
-#if !USE_REL /* put in for learning purposes */
-         pcrel_value += irel->r_addend;
-#else
-         addend = bfd_get_signed_16 (abfd, contents + irel->r_offset + 2);
-         pcrel_value += addend;
-#endif
-
-         if (pcrel_value >= -(1 << 25) && pcrel_value < (1 << 25) + 4
-             /* Do nothing if no room in the section for this to be what we're
-                looking for.  */
-             && (irel->r_offset <= sec->size - 12)
-             /* Ensure the next insn is "jl rN".  */
-             && ((code = bfd_get_16 (abfd, contents + irel->r_offset + 8)),
-                 code != (0x1ec0 | reg)))
-           {
-             /* We can relax to bl24/bl8.  */
-
-             /* See if there's a nop following the jl.
-                Also see if we can use a bl8 insn.  */
-             code = bfd_get_16 (abfd, contents + irel->r_offset + 10);
-             nop_p = (code & 0x7fff) == NOP_INSN;
-             bl8_p = pcrel_value >= -0x200 && pcrel_value < 0x200;
-
-             if (bl8_p)
-               {
-                 /* Change "seth rN,foo" to "bl8 foo || nop".
-                    We OR in CODE just in case it's not a nop (technically,
-                    CODE currently must be a nop, but for cleanness we
-                    allow it to be anything).  */
-#if !USE_REL /* put in for learning purposes */
-                 code = 0x7e000000 | MAKE_PARALLEL (code);
-#else
-                 code = (0x7e000000 + (((addend >> 2) & 0xff) << 16)) | MAKE_PARALLEL (code);
-#endif
-                 to_delete = 8;
-               }
-             else
-               {
-                 /* Change the seth rN,foo to a bl24 foo.  */
-#if !USE_REL /* put in for learning purposes */
-                 code = 0xfe000000;
-#else
-                 code = 0xfe000000 + ((addend >> 2) & 0xffffff);
-#endif
-                 to_delete = nop_p ? 8 : 4;
-               }
-
-             bfd_put_32 (abfd, code, contents + irel->r_offset);
-
-             /* Set the new reloc type.  */
-             irel->r_info = ELF32_R_INFO (ELF32_R_SYM (nrel->r_info),
-                                          bl8_p ? R_M32R_10_PCREL : R_M32R_26_PCREL);
-
-             /* Delete the add3 reloc by making it a null reloc.  */
-             nrel->r_info = ELF32_R_INFO (ELF32_R_SYM (nrel->r_info),
-                                          R_M32R_NONE);
-           }
-         else if (addend >= 0
-                  && symval + addend <= 0xffffff)
-           {
-             /* We can relax to ld24.  */
-
-             code = 0xe0000000 | (reg << 24) | (addend & 0xffffff);
-             bfd_put_32 (abfd, code, contents + irel->r_offset);
-             to_delete = 4;
-             /* Tell the following code a nop filler isn't needed.  */
-             nop_p = 1;
-           }
-         else
-           {
-             /* Can't do anything here.  */
-             continue;
-           }
-
-         /* Note that we've changed the relocs, section contents, etc.  */
-         elf_section_data (sec)->relocs = internal_relocs;
-         elf_section_data (sec)->this_hdr.contents = contents;
-         symtab_hdr->contents = (unsigned char *) isymbuf;
-
-         /* Delete TO_DELETE bytes of data.  */
-         if (!m32r_elf_relax_delete_bytes (abfd, sec,
-                                           irel->r_offset + 4, to_delete))
-           goto error_return;
-
-         /* Now that the following bytes have been moved into place, see if
-            we need to replace the jl with a nop.  This happens when we had
-            to use a bl24 insn and the insn following the jl isn't a nop.
-            Technically, this situation can't happen (since the insn can
-            never be executed) but to be clean we do this.  When the chip
-            supports parallel 16 bit insns things may change.
-            We don't need to do this in the case of relaxing to ld24,
-            and the above code sets nop_p so this isn't done.  */
-         if (! nop_p && to_delete == 4)
-           bfd_put_16 (abfd, NOP_INSN, contents + irel->r_offset + 4);
-
-         /* That will change things, so we should relax again.
-            Note that this is not required, and it may be slow.  */
-         *again = TRUE;
-
-         continue;
-       }
-
-      /* loop to try the next reloc */
-    }
-
-  if (isymbuf != NULL
-      && symtab_hdr->contents != (unsigned char *) isymbuf)
-    {
-      if (! link_info->keep_memory)
-       free (isymbuf);
-      else
-       {
-         /* Cache the symbols for elf_link_input_bfd.  */
-         symtab_hdr->contents = (unsigned char *) isymbuf;
-       }
-    }
-
-  if (contents != NULL
-      && elf_section_data (sec)->this_hdr.contents != contents)
-    {
-      if (! link_info->keep_memory)
-       free (contents);
-      else
-       {
-         /* Cache the section contents for elf_link_input_bfd.  */
-         elf_section_data (sec)->this_hdr.contents = contents;
-       }
-    }
-
-  if (internal_relocs != NULL
-      && elf_section_data (sec)->relocs != internal_relocs)
-    free (internal_relocs);
-
-  return TRUE;
-
- error_return:
-  if (isymbuf != NULL
-      && symtab_hdr->contents != (unsigned char *) isymbuf)
-    free (isymbuf);
-  if (contents != NULL
-      && elf_section_data (sec)->this_hdr.contents != contents)
-    free (contents);
-  if (internal_relocs != NULL
-      && elf_section_data (sec)->relocs != internal_relocs)
-    free (internal_relocs);
-
-  return FALSE;
-}
-
-/* Delete some bytes from a section while relaxing.  */
-
-static bfd_boolean
-m32r_elf_relax_delete_bytes (abfd, sec, addr, count)
-     bfd *abfd;
-     asection *sec;
-     bfd_vma addr;
-     int count;
-{
-  Elf_Internal_Shdr *symtab_hdr;
-  int shndx;
-  bfd_byte *contents;
-  Elf_Internal_Rela *irel, *irelend;
-  Elf_Internal_Rela *irelalign;
-  bfd_vma toaddr;
-  Elf_Internal_Sym *isym, *isymend;
-  struct elf_link_hash_entry **sym_hashes;
-  struct elf_link_hash_entry **end_hashes;
-  unsigned int symcount;
-
-  shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
-
-  contents = elf_section_data (sec)->this_hdr.contents;
-
-  /* The deletion must stop at the next ALIGN reloc for an aligment
-     power larger than the number of bytes we are deleting.  */
-
-  irelalign = NULL;
-  toaddr = sec->size;
-
-  irel = elf_section_data (sec)->relocs;
-  irelend = irel + sec->reloc_count;
-
-  /* Actually delete the bytes.  */
-  memmove (contents + addr, contents + addr + count, toaddr - addr - count);
-  sec->size -= count;
-
-  /* Adjust all the relocs.  */
-  for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
-    {
-      /* Get the new reloc address.  */
-      if ((irel->r_offset > addr
-          && irel->r_offset < toaddr))
-       irel->r_offset -= count;
-    }
-
-  /* Adjust the local symbols defined in this section.  */
-  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
-  isym = (Elf_Internal_Sym *) symtab_hdr->contents;
-  for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
-    {
-      if (isym->st_shndx == shndx
-         && isym->st_value > addr
-         && isym->st_value < toaddr)
-       isym->st_value -= count;
-    }
-
-  /* Now adjust the global symbols defined in this section.  */
-  symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
-             - symtab_hdr->sh_info);
-  sym_hashes = elf_sym_hashes (abfd);
-  end_hashes = sym_hashes + symcount;
-  for (; sym_hashes < end_hashes; sym_hashes++)
-    {
-      struct elf_link_hash_entry *sym_hash = *sym_hashes;
-
-      if ((sym_hash->root.type == bfd_link_hash_defined
-          || sym_hash->root.type == bfd_link_hash_defweak)
-         && sym_hash->root.u.def.section == sec
-         && sym_hash->root.u.def.value > addr
-         && sym_hash->root.u.def.value < toaddr)
-       {
-         sym_hash->root.u.def.value -= count;
-       }
-    }
-
-  return TRUE;
-}
-
-/* This is a version of bfd_generic_get_relocated_section_contents
-   which uses m32r_elf_relocate_section.  */
-
-static bfd_byte *
-m32r_elf_get_relocated_section_contents (output_bfd, link_info, link_order,
-                                        data, relocatable, symbols)
-     bfd *output_bfd;
-     struct bfd_link_info *link_info;
-     struct bfd_link_order *link_order;
-     bfd_byte *data;
-     bfd_boolean relocatable;
-     asymbol **symbols;
-{
-  Elf_Internal_Shdr *symtab_hdr;
-  asection *input_section = link_order->u.indirect.section;
-  bfd *input_bfd = input_section->owner;
-  asection **sections = NULL;
-  Elf_Internal_Rela *internal_relocs = NULL;
-  Elf_Internal_Sym *isymbuf = NULL;
-  bfd_size_type amt;
-
-  /* We only need to handle the case of relaxing, or of having a
-     particular set of section contents, specially.  */
-  if (relocatable
-      || elf_section_data (input_section)->this_hdr.contents == NULL)
-    return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
-                                                      link_order, data,
-                                                      relocatable,
-                                                      symbols);
-
-  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
-
-  memcpy (data, elf_section_data (input_section)->this_hdr.contents,
-         input_section->size);
-
-  if ((input_section->flags & SEC_RELOC) != 0
-      && input_section->reloc_count > 0)
-    {
-      Elf_Internal_Sym *isymp;
-      asection **secpp;
-      Elf32_External_Sym *esym, *esymend;
-
-      internal_relocs = (_bfd_elf_link_read_relocs
-                        (input_bfd, input_section, (PTR) NULL,
-                         (Elf_Internal_Rela *) NULL, FALSE));
-      if (internal_relocs == NULL)
-       goto error_return;
-
-      if (symtab_hdr->sh_info != 0)
-       {
-         isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
-         if (isymbuf == NULL)
-           isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
-                                           symtab_hdr->sh_info, 0,
-                                           NULL, NULL, NULL);
-         if (isymbuf == NULL)
-           goto error_return;
-       }
-
-      amt = symtab_hdr->sh_info;
-      amt *= sizeof (asection *);
-      sections = (asection **) bfd_malloc (amt);
-      if (sections == NULL && symtab_hdr->sh_info > 0)
-       goto error_return;
-
-      isymend = isymbuf + symtab_hdr->sh_info;
-      for (isym = isymbuf, secpp = sections; isym < isymend; ++isym, ++secpp)
-       {
-         asection *isec;
-
-         if (isym->st_shndx == SHN_UNDEF)
-           isec = bfd_und_section_ptr;
-         else if (isym->st_shndx == SHN_ABS)
-           isec = bfd_abs_section_ptr;
-         else if (isym->st_shndx == SHN_COMMON)
-           isec = bfd_com_section_ptr;
-         else if (isym->st_shndx == SHN_M32R_SCOMMON)
-           isec = &m32r_elf_scom_section;
-         else
-           isec = bfd_section_from_elf_index (input_bfd, isym->st_shndx);
-
-         *secpp = isec;
-       }
-
-      if (! m32r_elf_relocate_section (output_bfd, link_info, input_bfd,
-                                      input_section, data, internal_relocs,
-                                      isymbuf, sections))
-       goto error_return;
-
-      if (sections != NULL)
-       free (sections);
-      if (isymbuf != NULL
-         && symtab_hdr->contents != (unsigned char *) isymbuf)
-       free (isymbuf);
-      if (elf_section_data (input_section)->relocs != internal_relocs)
-       free (internal_relocs);
-    }
-
-  return data;
-
- error_return:
-  if (sections != NULL)
-    free (sections);
-  if (isymbuf != NULL
-      && symtab_hdr->contents != (unsigned char *) isymbuf)
-    free (isymbuf);
-  if (internal_relocs != NULL
-      && elf_section_data (input_section)->relocs != internal_relocs)
-    free (internal_relocs);
-  return NULL;
-}
-
-#endif /* #if 0 */
 \f
 /* Set the right machine number.  */
 static bfd_boolean
@@ -4271,7 +3734,7 @@ m32r_elf_print_private_bfd_data (abfd, ptr)
 {
   FILE * file = (FILE *) ptr;
 
-  BFD_ASSERT (abfd != NULL && ptr != NULL)
+  BFD_ASSERT (abfd != NULL && ptr != NULL);
 
   _bfd_elf_print_private_bfd_data (abfd, ptr);
 
@@ -4341,8 +3804,6 @@ m32r_elf_gc_sweep_hook (abfd, info, sec, relocs)
   struct elf_link_hash_entry **sym_hashes;
   bfd_signed_vma *local_got_refcounts;
   const Elf_Internal_Rela *rel, *relend;
-  unsigned long r_symndx;
-  struct elf_link_hash_entry *h;
 
   elf_section_data (sec)->local_dynrel = NULL;
 
@@ -4352,84 +3813,91 @@ m32r_elf_gc_sweep_hook (abfd, info, sec, relocs)
 
   relend = relocs + sec->reloc_count;
   for (rel = relocs; rel < relend; rel++)
-    switch (ELF32_R_TYPE (rel->r_info))
-      {
-      case R_M32R_GOT16_HI_ULO:
-      case R_M32R_GOT16_HI_SLO:
-      case R_M32R_GOT16_LO:
-      case R_M32R_GOTOFF:
-      case R_M32R_GOTOFF_HI_ULO:
-      case R_M32R_GOTOFF_HI_SLO:
-      case R_M32R_GOTOFF_LO:
-      case R_M32R_GOT24:
-      case R_M32R_GOTPC_HI_ULO:
-      case R_M32R_GOTPC_HI_SLO:
-      case R_M32R_GOTPC_LO:
-      case R_M32R_GOTPC24:
-       r_symndx = ELF32_R_SYM (rel->r_info);
-       if (r_symndx >= symtab_hdr->sh_info)
-         {
-           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
-           if (h->got.refcount > 0)
-             h->got.refcount--;
-         }
-       else
-         {
-           if (local_got_refcounts && local_got_refcounts[r_symndx] > 0)
-             local_got_refcounts[r_symndx]--;
-         }
-        break;
+    {
+      unsigned long r_symndx;
+      struct elf_link_hash_entry *h = NULL;
 
-      case R_M32R_16_RELA:
-      case R_M32R_24_RELA:
-      case R_M32R_32_RELA:
-      case R_M32R_HI16_ULO_RELA:
-      case R_M32R_HI16_SLO_RELA:
-      case R_M32R_LO16_RELA:
-      case R_M32R_SDA16_RELA:
-      case R_M32R_18_PCREL_RELA:
-      case R_M32R_26_PCREL_RELA:
-        r_symndx = ELF32_R_SYM (rel->r_info);
-        if (r_symndx >= symtab_hdr->sh_info)
-          {
-            struct elf_m32r_link_hash_entry *eh;
-            struct elf_m32r_dyn_relocs **pp;
-            struct elf_m32r_dyn_relocs *p;
+      r_symndx = ELF32_R_SYM (rel->r_info);
+      if (r_symndx >= symtab_hdr->sh_info)
+       {
+         h = sym_hashes[r_symndx - symtab_hdr->sh_info];
+         while (h->root.type == bfd_link_hash_indirect
+                || h->root.type == bfd_link_hash_warning)
+           h = (struct elf_link_hash_entry *) h->root.u.i.link;
+       }
 
-            h = sym_hashes[r_symndx - symtab_hdr->sh_info];
+      switch (ELF32_R_TYPE (rel->r_info))
+       {
+       case R_M32R_GOT16_HI_ULO:
+       case R_M32R_GOT16_HI_SLO:
+       case R_M32R_GOT16_LO:
+       case R_M32R_GOTOFF:
+       case R_M32R_GOTOFF_HI_ULO:
+       case R_M32R_GOTOFF_HI_SLO:
+       case R_M32R_GOTOFF_LO:
+       case R_M32R_GOT24:
+       case R_M32R_GOTPC_HI_ULO:
+       case R_M32R_GOTPC_HI_SLO:
+       case R_M32R_GOTPC_LO:
+       case R_M32R_GOTPC24:
+         if (h != NULL)
+           {
+             if (h->got.refcount > 0)
+               h->got.refcount--;
+           }
+         else
+           {
+             if (local_got_refcounts && local_got_refcounts[r_symndx] > 0)
+               local_got_refcounts[r_symndx]--;
+           }
+         break;
+
+       case R_M32R_16_RELA:
+       case R_M32R_24_RELA:
+       case R_M32R_32_RELA:
+       case R_M32R_HI16_ULO_RELA:
+       case R_M32R_HI16_SLO_RELA:
+       case R_M32R_LO16_RELA:
+       case R_M32R_SDA16_RELA:
+       case R_M32R_18_PCREL_RELA:
+       case R_M32R_26_PCREL_RELA:
+         if (h != NULL)
+           {
+             struct elf_m32r_link_hash_entry *eh;
+             struct elf_m32r_dyn_relocs **pp;
+             struct elf_m32r_dyn_relocs *p;
 
-            if (!info->shared && h->plt.refcount > 0)
-              h->plt.refcount -= 1;
+             if (!info->shared && h->plt.refcount > 0)
+               h->plt.refcount -= 1;
 
-            eh = (struct elf_m32r_link_hash_entry *) h;
+             eh = (struct elf_m32r_link_hash_entry *) h;
 
-            for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
-              if (p->sec == sec)
-                {
-                  if (ELF32_R_TYPE (rel->r_info) == R_M32R_26_PCREL_RELA
-                      || ELF32_R_TYPE (rel->r_info) == R_M32R_26_PCREL_RELA)
-                    p->pc_count -= 1;
-                  p->count -= 1;
-                  if (p->count == 0)
-                    *pp = p->next;
-                  break;
-                }
-          }
-        break;
+             for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
+               if (p->sec == sec)
+                 {
+                   if (ELF32_R_TYPE (rel->r_info) == R_M32R_26_PCREL_RELA
+                       || ELF32_R_TYPE (rel->r_info) == R_M32R_26_PCREL_RELA)
+                     p->pc_count -= 1;
+                   p->count -= 1;
+                   if (p->count == 0)
+                     *pp = p->next;
+                   break;
+                 }
+           }
+         break;
 
-      case R_M32R_26_PLTREL:
-       r_symndx = ELF32_R_SYM (rel->r_info);
-       if (r_symndx >= symtab_hdr->sh_info)
-         {
-           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
-           if (h->plt.refcount > 0)
-             h->plt.refcount--;
-         }
-       break;
+       case R_M32R_26_PLTREL:
+         if (h != NULL)
+           {
+             if (h->plt.refcount > 0)
+               h->plt.refcount--;
+           }
+         break;
 
-      default:
-       break;
-      }
+       default:
+         break;
+       }
+    }
 
   return TRUE;
 }
@@ -4827,13 +4295,6 @@ m32r_elf_reloc_type_class (rela)
 #define elf_backend_fake_sections       m32r_elf_fake_sections
 #endif
 
-#if 0 /* not yet */
-/* relax support */
-#define bfd_elf32_bfd_relax_section            m32r_elf_relax_section
-#define bfd_elf32_bfd_get_relocated_section_contents \
-                                       m32r_elf_get_relocated_section_contents
-#endif
-
 #define elf_backend_object_p                   m32r_elf_object_p
 #define elf_backend_final_write_processing     m32r_elf_final_write_processing
 #define bfd_elf32_bfd_merge_private_bfd_data   m32r_elf_merge_private_bfd_data
This page took 0.032548 seconds and 4 git commands to generate.