summaryrefslogtreecommitdiff
path: root/bfd/elf32-i860.c
diff options
context:
space:
mode:
authorJason Eckhardt <jle@rice.edu>2000-09-12 14:34:59 +0000
committerJason Eckhardt <jle@rice.edu>2000-09-12 14:34:59 +0000
commit15baf4f22a50a70c8e4ae23440216beccd54c3ec (patch)
tree64f8dcdd661fd168887490c6cd673dc35611ad5a /bfd/elf32-i860.c
parent7de71fc9ac800fea8d76212410fc3d145e753a91 (diff)
downloadbinutils-redhat-15baf4f22a50a70c8e4ae23440216beccd54c3ec.tar.gz
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.
Diffstat (limited to 'bfd/elf32-i860.c')
-rw-r--r--bfd/elf32-i860.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/bfd/elf32-i860.c b/bfd/elf32-i860.c
index 1acc4ddc8f..a0668da166 100644
--- a/bfd/elf32-i860.c
+++ b/bfd/elf32-i860.c
@@ -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: