2000-09-12 Jason Eckhardt <jle@cygnus.com>
[deliverable/binutils-gdb.git] / bfd / elf32-i860.c
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:
This page took 0.023975 seconds and 4 git commands to generate.