diff options
author | Jason Eckhardt <jle@rice.edu> | 2000-08-21 23:26:19 +0000 |
---|---|---|
committer | Jason Eckhardt <jle@rice.edu> | 2000-08-21 23:26:19 +0000 |
commit | ded0649cd504e9895ab37f7ffae110d00ebbaaef (patch) | |
tree | 20ad6a27c89278c0940a7aa85e1dba3076e8e229 /gas/config/tc-i860.c | |
parent | c8c5888ebc7925fcc631e3a7be075ad6c5cc2ad1 (diff) | |
download | gdb-ded0649cd504e9895ab37f7ffae110d00ebbaaef.zip gdb-ded0649cd504e9895ab37f7ffae110d00ebbaaef.tar.gz gdb-ded0649cd504e9895ab37f7ffae110d00ebbaaef.tar.bz2 |
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.
Diffstat (limited to 'gas/config/tc-i860.c')
-rw-r--r-- | gas/config/tc-i860.c | 80 |
1 files changed, 56 insertions, 24 deletions
diff --git a/gas/config/tc-i860.c b/gas/config/tc-i860.c index 2255eee..56cad24 100644 --- a/gas/config/tc-i860.c +++ b/gas/config/tc-i860.c @@ -1298,10 +1298,15 @@ md_apply_fix3 (fix, valuep, seg) fix->fx_r_type = obtain_reloc_for_imm16 (fix, &val); /* Insert the immediate. */ - insn |= val & 0xffff; - bfd_putl32 (insn, buf); - - fix->fx_done = (fix->fx_addsy == 0); + if (fix->fx_addsy) + fix->fx_done = 0; + else + { + insn |= val & 0xffff; + bfd_putl32 (insn, buf); + fix->fx_r_type = BFD_RELOC_NONE; + fix->fx_done = 1; + } } 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); /* Insert the immediate. */ - insn |= val & 0x7ff; - insn |= (val & 0xf800) << 5; - bfd_putl32 (insn, buf); - - fix->fx_done = (fix->fx_addsy == 0); + if (fix->fx_addsy) + fix->fx_done = 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_BR16) { @@ -1327,12 +1337,19 @@ md_apply_fix3 (fix, valuep, seg) val = val >> 2; /* Insert the immediate. */ - insn |= (val & 0x7ff); - insn |= ((val & 0xf800) << 5); - bfd_putl32 (insn, buf); - - fix->fx_r_type = BFD_RELOC_860_PC16; - fix->fx_done = (fix->fx_addsy == 0); + if (fix->fx_addsy) + { + fix->fx_done = 0; + fix->fx_r_type = BFD_RELOC_860_PC16; + } + 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) { @@ -1343,11 +1360,18 @@ md_apply_fix3 (fix, valuep, seg) val >>= 2; /* Insert the immediate. */ - insn |= (val & 0x3ffffff); - bfd_putl32 (insn, buf); - - fix->fx_r_type = BFD_RELOC_860_PC26; - fix->fx_done = (fix->fx_addsy == 0); + if (fix->fx_addsy) + { + fix->fx_r_type = BFD_RELOC_860_PC26; + fix->fx_done = 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) { @@ -1359,10 +1383,18 @@ md_apply_fix3 (fix, valuep, seg) { /* I believe only fix-ups such as ".long .ep.main-main+0xc8000000" reach here (???). */ - insn |= (val & 0xffffffff); - bfd_putl32 (insn, buf); - fix->fx_r_type = BFD_RELOC_32; - fix->fx_done = (fix->fx_addsy == 0); + if (fix->fx_addsy) + { + fix->fx_r_type = BFD_RELOC_32; + 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. */ |