2000-09-12 Jason Eckhardt <jle@cygnus.com>
authorJason Eckhardt <jle@rice.edu>
Tue, 12 Sep 2000 14:34:59 +0000 (14:34 +0000)
committerJason Eckhardt <jle@rice.edu>
Tue, 12 Sep 2000 14:34:59 +0000 (14:34 +0000)
* elf32-i860.c (elf32_i860_relocate_pc26): New function
and prototype.
(elf32_i860_relocate_section): Invoke new function from here.

bfd/ChangeLog
bfd/elf32-i860.c

index 6e331ac4c31b170992d7234291486a96563c8c56..42f812fdf1ea0b06f93d806cfa9e63fb113447b6 100644 (file)
@@ -1,3 +1,9 @@
+2000-09-12  Jason Eckhardt  <jle@cygnus.com>
+
+       * elf32-i860.c (elf32_i860_relocate_pc26): New function
+       and prototype.
+       (elf32_i860_relocate_section): Invoke new function from here.
+
 2000-09-11  Michael Sokolov  <msokolov@ivan.Harhan.ORG>
 
        * elf.c (_bfd_elf_make_section_from_shdr): Make debug_sec_names
index 1acc4ddc8f3f44c34c49bbec671101fc20620893..a0668da16633de74dda8f96f9064fa6ddaf5ea4a 100644 (file)
@@ -42,6 +42,9 @@ static bfd_reloc_status_type elf32_i860_relocate_splitn
 static bfd_reloc_status_type elf32_i860_relocate_pc16
   PARAMS ((bfd *,  asection *, Elf_Internal_Rela *, bfd_byte *, bfd_vma));
 
+static bfd_reloc_status_type elf32_i860_relocate_pc26
+  PARAMS ((bfd *,  asection *, Elf_Internal_Rela *, bfd_byte *, bfd_vma));
+
 static bfd_reloc_status_type elf32_i860_relocate_highadj
   PARAMS ((bfd *,  Elf_Internal_Rela *, bfd_byte *, bfd_vma));
 
@@ -763,6 +766,39 @@ elf32_i860_relocate_pc16 (input_bfd, input_section, rello, contents, value)
 }
 
 
+/* Specialized relocation handler for R_860_PC26.  This relocation
+   involves a 26-bit, PC-relative field which must be adjusted by 4.  */
+static bfd_reloc_status_type
+elf32_i860_relocate_pc26 (input_bfd, input_section, rello, contents, value)
+     bfd *input_bfd;
+     asection *input_section;
+     Elf_Internal_Rela *rello;
+     bfd_byte *contents;
+     bfd_vma value;
+{
+  bfd_vma insn;
+  reloc_howto_type *howto;
+  howto  = lookup_howto (ELF32_R_TYPE (rello->r_info));
+  insn = bfd_get_32 (input_bfd, contents + rello->r_offset);
+
+  /* Adjust for PC-relative relocation.  */
+  value -= (input_section->output_section->vma
+           + input_section->output_offset);
+  value -= rello->r_offset;
+
+  /* Relocate.  */
+  value += rello->r_addend;
+
+  /* Adjust value by 4 and insert the field.  */
+  value = ((value - 4) >> howto->rightshift) & howto->dst_mask; 
+  insn = (insn & ~howto->dst_mask) | value;
+
+  bfd_put_32 (input_bfd, insn, contents + rello->r_offset);
+  return bfd_reloc_ok;
+
+}
+
+
 /* Specialized relocation handler for R_860_HIGHADJ.  */
 static bfd_reloc_status_type
 elf32_i860_relocate_highadj (input_bfd, rel, contents, value)
@@ -967,6 +1003,11 @@ elf32_i860_relocate_section (output_bfd, info, input_bfd, input_section,
                                        contents, relocation);
          break;
 
+       case R_860_PC26:
+         r = elf32_i860_relocate_pc26 (input_bfd, input_section, rel,
+                                       contents, relocation);
+         break;
+
        case R_860_SPLIT0:
        case R_860_SPLIT1:
        case R_860_SPLIT2: