summaryrefslogtreecommitdiff
path: root/bfd/elf32-i860.c
diff options
context:
space:
mode:
authorJason Eckhardt <jle@rice.edu>2000-08-16 21:58:55 +0000
committerJason Eckhardt <jle@rice.edu>2000-08-16 21:58:55 +0000
commitd5902f09c5c7e0bc43cbfb23b7d9ca1303e923e8 (patch)
tree514a07d97d8b860363695b5e85eef8afa38fd8a9 /bfd/elf32-i860.c
parentcd3bbb050bb7e9c7398bde1552687574e7095c03 (diff)
downloadbinutils-redhat-d5902f09c5c7e0bc43cbfb23b7d9ca1303e923e8.tar.gz
2000-08-16 Jason Eckhardt <jle@cygnus.com>
* elf32-i860.c (elf32_i860_relocate_pc16): Implemented function (it was previously just a stub).
Diffstat (limited to 'bfd/elf32-i860.c')
-rw-r--r--bfd/elf32-i860.c40
1 files changed, 30 insertions, 10 deletions
diff --git a/bfd/elf32-i860.c b/bfd/elf32-i860.c
index 40dd5f2317..bc100933ac 100644
--- a/bfd/elf32-i860.c
+++ b/bfd/elf32-i860.c
@@ -39,10 +39,8 @@ static void elf32_i860_info_to_howto_rela
static bfd_reloc_status_type elf32_i860_relocate_splitn
PARAMS ((bfd *, Elf_Internal_Rela *, bfd_byte *, bfd_vma));
-#if 0
static bfd_reloc_status_type elf32_i860_relocate_pc16
- PARAMS ((bfd *, Elf_Internal_Rela *, bfd_byte *, bfd_vma));
-#endif
+ 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));
@@ -733,19 +731,43 @@ elf32_i860_relocate_splitn (input_bfd, rello, contents, value)
}
-#if 0
/* Specialized relocation handler for R_860_PC16. This relocation
involves a 16-bit, PC-relative field that is split into two contiguous
parts. */
static bfd_reloc_status_type
-elf32_i860_relocate_pc16 (input_bfd, rello, contents, value)
+elf32_i860_relocate_pc16 (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, t;
+ 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;
+
+ /* Remove encode bits and intervening bits. Then concatenate the
+ two fields into one 16-bit quantity. */
+ t = (insn & howto->src_mask);
+ t = ((t >> 5) & 0xf8) | (t & 0x7ff);
+
+ /* Relocate. */
+ value += (rello->r_addend + t);
+
+ /* Separate the fields and re-insert. */
+ value = (((value & 0xf8) << 5) | (value & 0x7ff)) & howto->dst_mask;
+ insn = (insn & ~howto->dst_mask) | value;
+
+ bfd_put_32 (input_bfd, insn, contents + rello->r_offset);
+ return bfd_reloc_ok;
+
}
-#endif
/* Specialized relocation handler for R_860_HIGHADJ. */
@@ -948,12 +970,10 @@ elf32_i860_relocate_section (output_bfd, info, input_bfd, input_section,
relocation);
break;
-#if 0
case R_860_PC16:
- r = elf32_i860_relocate_pc16 (input_bfd, rel, contents,
- relocation);
+ r = elf32_i860_relocate_pc16 (input_bfd, input_section, rel,
+ contents, relocation);
break;
-#endif
case R_860_SPLIT0:
case R_860_SPLIT1: