2000-08-21 Jason Eckhardt <jle@cygnus.com>
bfd: * elf32-i860.c (elf32_i860_relocate_pc16): Just write the immediate field with the newly relocated value instead of adding it to the existing immediate field. (elf32_i860_relocate_splitn): Likewise. (elf32_i860_relocate_highadj): Likewise. gas: * config/tc-i860.c (md_apply_fix3): Do not insert the immediate if the fixup resulted in a relocation.
This commit is contained in:
parent
c8c5888ebc
commit
ded0649cd5
4 changed files with 75 additions and 41 deletions
|
@ -1,3 +1,11 @@
|
||||||
|
2000-08-21 Jason Eckhardt <jle@cygnus.com>
|
||||||
|
|
||||||
|
* elf32-i860.c (elf32_i860_relocate_pc16): Just write the immediate
|
||||||
|
field with the newly relocated value instead of adding it to the
|
||||||
|
existing immediate field.
|
||||||
|
(elf32_i860_relocate_splitn): Likewise.
|
||||||
|
(elf32_i860_relocate_highadj): Likewise.
|
||||||
|
|
||||||
2000-08-16 Jason Eckhardt <jle@cygnus.com>
|
2000-08-16 Jason Eckhardt <jle@cygnus.com>
|
||||||
|
|
||||||
* elf32-i860.c (elf32_i860_relocate_pc16): Implemented function (it
|
* elf32-i860.c (elf32_i860_relocate_pc16): Implemented function (it
|
||||||
|
|
|
@ -709,20 +709,15 @@ elf32_i860_relocate_splitn (input_bfd, rello, contents, value)
|
||||||
bfd_byte *contents;
|
bfd_byte *contents;
|
||||||
bfd_vma value;
|
bfd_vma value;
|
||||||
{
|
{
|
||||||
bfd_vma insn, t;
|
bfd_vma insn;
|
||||||
reloc_howto_type *howto;
|
reloc_howto_type *howto;
|
||||||
howto = lookup_howto (ELF32_R_TYPE (rello->r_info));
|
howto = lookup_howto (ELF32_R_TYPE (rello->r_info));
|
||||||
insn = bfd_get_32 (input_bfd, contents + rello->r_offset);
|
insn = bfd_get_32 (input_bfd, contents + 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. */
|
/* Relocate. */
|
||||||
value += (rello->r_addend + t);
|
value += rello->r_addend;
|
||||||
|
|
||||||
/* Separate the fields and re-insert. */
|
/* Separate the fields and insert. */
|
||||||
value = (((value & 0xf8) << 5) | (value & 0x7ff)) & howto->dst_mask;
|
value = (((value & 0xf8) << 5) | (value & 0x7ff)) & howto->dst_mask;
|
||||||
insn = (insn & ~howto->dst_mask) | value;
|
insn = (insn & ~howto->dst_mask) | value;
|
||||||
|
|
||||||
|
@ -742,7 +737,7 @@ elf32_i860_relocate_pc16 (input_bfd, input_section, rello, contents, value)
|
||||||
bfd_byte *contents;
|
bfd_byte *contents;
|
||||||
bfd_vma value;
|
bfd_vma value;
|
||||||
{
|
{
|
||||||
bfd_vma insn, t;
|
bfd_vma insn;
|
||||||
reloc_howto_type *howto;
|
reloc_howto_type *howto;
|
||||||
howto = lookup_howto (ELF32_R_TYPE (rello->r_info));
|
howto = lookup_howto (ELF32_R_TYPE (rello->r_info));
|
||||||
insn = bfd_get_32 (input_bfd, contents + rello->r_offset);
|
insn = bfd_get_32 (input_bfd, contents + rello->r_offset);
|
||||||
|
@ -752,15 +747,10 @@ elf32_i860_relocate_pc16 (input_bfd, input_section, rello, contents, value)
|
||||||
+ input_section->output_offset);
|
+ input_section->output_offset);
|
||||||
value -= rello->r_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. */
|
/* Relocate. */
|
||||||
value += (rello->r_addend + t);
|
value += rello->r_addend;
|
||||||
|
|
||||||
/* Separate the fields and re-insert. */
|
/* Separate the fields and insert. */
|
||||||
value = (((value & 0xf8) << 5) | (value & 0x7ff)) & howto->dst_mask;
|
value = (((value & 0xf8) << 5) | (value & 0x7ff)) & howto->dst_mask;
|
||||||
insn = (insn & ~howto->dst_mask) | value;
|
insn = (insn & ~howto->dst_mask) | value;
|
||||||
|
|
||||||
|
@ -785,7 +775,6 @@ elf32_i860_relocate_highadj (input_bfd, rel, contents, value)
|
||||||
value += ((rel->r_addend & 0x8000) << 1);
|
value += ((rel->r_addend & 0x8000) << 1);
|
||||||
value += rel->r_addend;
|
value += rel->r_addend;
|
||||||
value = ((value >> 16) & 0xffff);
|
value = ((value >> 16) & 0xffff);
|
||||||
value = (value + (insn & 0xffff)) & 0xffff;
|
|
||||||
|
|
||||||
insn = (insn & 0xffff0000) | value;
|
insn = (insn & 0xffff0000) | value;
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
2000-08-21 Jason Eckhardt <jle@cygnus.com>
|
||||||
|
|
||||||
|
* config/tc-i860.c (md_apply_fix3): Do not insert the immediate
|
||||||
|
if the fixup resulted in a relocation.
|
||||||
|
|
||||||
2000-08-18 Nick Clifton <nickc@redhat.com>
|
2000-08-18 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
* config/tc-arm.c (decode_shift): Replace as_tsktsk with as_warn.
|
* config/tc-arm.c (decode_shift): Replace as_tsktsk with as_warn.
|
||||||
|
|
|
@ -1298,10 +1298,15 @@ md_apply_fix3 (fix, valuep, seg)
|
||||||
fix->fx_r_type = obtain_reloc_for_imm16 (fix, &val);
|
fix->fx_r_type = obtain_reloc_for_imm16 (fix, &val);
|
||||||
|
|
||||||
/* Insert the immediate. */
|
/* Insert the immediate. */
|
||||||
insn |= val & 0xffff;
|
if (fix->fx_addsy)
|
||||||
bfd_putl32 (insn, buf);
|
fix->fx_done = 0;
|
||||||
|
else
|
||||||
fix->fx_done = (fix->fx_addsy == 0);
|
{
|
||||||
|
insn |= val & 0xffff;
|
||||||
|
bfd_putl32 (insn, buf);
|
||||||
|
fix->fx_r_type = BFD_RELOC_NONE;
|
||||||
|
fix->fx_done = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (fup & OP_IMM_U16)
|
else if (fup & OP_IMM_U16)
|
||||||
{
|
{
|
||||||
|
@ -1312,11 +1317,16 @@ md_apply_fix3 (fix, valuep, seg)
|
||||||
fix->fx_r_type = obtain_reloc_for_imm16 (fix, &val);
|
fix->fx_r_type = obtain_reloc_for_imm16 (fix, &val);
|
||||||
|
|
||||||
/* Insert the immediate. */
|
/* Insert the immediate. */
|
||||||
insn |= val & 0x7ff;
|
if (fix->fx_addsy)
|
||||||
insn |= (val & 0xf800) << 5;
|
fix->fx_done = 0;
|
||||||
bfd_putl32 (insn, buf);
|
else
|
||||||
|
{
|
||||||
fix->fx_done = (fix->fx_addsy == 0);
|
insn |= val & 0x7ff;
|
||||||
|
insn |= (val & 0xf800) << 5;
|
||||||
|
bfd_putl32 (insn, buf);
|
||||||
|
fix->fx_r_type = BFD_RELOC_NONE;
|
||||||
|
fix->fx_done = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (fup & OP_IMM_BR16)
|
else if (fup & OP_IMM_BR16)
|
||||||
{
|
{
|
||||||
|
@ -1327,12 +1337,19 @@ md_apply_fix3 (fix, valuep, seg)
|
||||||
val = val >> 2;
|
val = val >> 2;
|
||||||
|
|
||||||
/* Insert the immediate. */
|
/* Insert the immediate. */
|
||||||
insn |= (val & 0x7ff);
|
if (fix->fx_addsy)
|
||||||
insn |= ((val & 0xf800) << 5);
|
{
|
||||||
bfd_putl32 (insn, buf);
|
fix->fx_done = 0;
|
||||||
|
fix->fx_r_type = BFD_RELOC_860_PC16;
|
||||||
fix->fx_r_type = BFD_RELOC_860_PC16;
|
}
|
||||||
fix->fx_done = (fix->fx_addsy == 0);
|
else
|
||||||
|
{
|
||||||
|
insn |= (val & 0x7ff);
|
||||||
|
insn |= ((val & 0xf800) << 5);
|
||||||
|
bfd_putl32 (insn, buf);
|
||||||
|
fix->fx_r_type = BFD_RELOC_NONE;
|
||||||
|
fix->fx_done = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (fup & OP_IMM_BR26)
|
else if (fup & OP_IMM_BR26)
|
||||||
{
|
{
|
||||||
|
@ -1343,11 +1360,18 @@ md_apply_fix3 (fix, valuep, seg)
|
||||||
val >>= 2;
|
val >>= 2;
|
||||||
|
|
||||||
/* Insert the immediate. */
|
/* Insert the immediate. */
|
||||||
insn |= (val & 0x3ffffff);
|
if (fix->fx_addsy)
|
||||||
bfd_putl32 (insn, buf);
|
{
|
||||||
|
fix->fx_r_type = BFD_RELOC_860_PC26;
|
||||||
fix->fx_r_type = BFD_RELOC_860_PC26;
|
fix->fx_done = 0;
|
||||||
fix->fx_done = (fix->fx_addsy == 0);
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
insn |= (val & 0x3ffffff);
|
||||||
|
bfd_putl32 (insn, buf);
|
||||||
|
fix->fx_r_type = BFD_RELOC_NONE;
|
||||||
|
fix->fx_done = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (fup != OP_NONE)
|
else if (fup != OP_NONE)
|
||||||
{
|
{
|
||||||
|
@ -1359,10 +1383,18 @@ md_apply_fix3 (fix, valuep, seg)
|
||||||
{
|
{
|
||||||
/* I believe only fix-ups such as ".long .ep.main-main+0xc8000000"
|
/* I believe only fix-ups such as ".long .ep.main-main+0xc8000000"
|
||||||
reach here (???). */
|
reach here (???). */
|
||||||
insn |= (val & 0xffffffff);
|
if (fix->fx_addsy)
|
||||||
bfd_putl32 (insn, buf);
|
{
|
||||||
fix->fx_r_type = BFD_RELOC_32;
|
fix->fx_r_type = BFD_RELOC_32;
|
||||||
fix->fx_done = (fix->fx_addsy == 0);
|
fix->fx_done = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
insn |= (val & 0xffffffff);
|
||||||
|
bfd_putl32 (insn, buf);
|
||||||
|
fix->fx_r_type = BFD_RELOC_NONE;
|
||||||
|
fix->fx_done = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return value ignored. */
|
/* Return value ignored. */
|
||||||
|
|
Loading…
Reference in a new issue