diff options
author | Jason Eckhardt <jle@rice.edu> | 2000-09-12 14:34:59 +0000 |
---|---|---|
committer | Jason Eckhardt <jle@rice.edu> | 2000-09-12 14:34:59 +0000 |
commit | c1e8b7101fa30aef561e0c55504963e92d425a8f (patch) | |
tree | 32e970ed169190fb7cb6d6ff105e765334ab26b2 /bfd/elf32-i860.c | |
parent | 2748f097fdfadb9c36536686a75e13372a913efe (diff) | |
download | gdb-c1e8b7101fa30aef561e0c55504963e92d425a8f.zip gdb-c1e8b7101fa30aef561e0c55504963e92d425a8f.tar.gz gdb-c1e8b7101fa30aef561e0c55504963e92d425a8f.tar.bz2 |
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.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/bfd/elf32-i860.c b/bfd/elf32-i860.c index 1acc4dd..a0668da 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: |