From: cgd Date: Wed, 30 Jan 2002 02:14:18 +0000 (+0000) Subject: 2002-01-29 Chris Demetriou X-Git-Tag: cygwin_daemon_merge_HEAD~686 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=564b937687aa3f2a61fbe3ca18e74e6c6eaa9d3f;p=pf3gnuchains%2Fpf3gnuchains4x.git 2002-01-29 Chris Demetriou * config/tc-mips.c (tc_gen_reloc): Arrange for BFD_RELOC_PCREL_HI16_S relocations to be output relative to their LO16 parts, even for ELF. --- diff --git a/gas/ChangeLog b/gas/ChangeLog index 5ee5bbf73c..08d43c04a9 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,9 @@ +2002-01-29 Chris Demetriou + + * config/tc-mips.c (tc_gen_reloc): Arrange for + BFD_RELOC_PCREL_HI16_S relocations to be output relative to + their LO16 parts, even for ELF. + 2002-01-29 Daniel Jacobowitz * config/tc-i386.c: Protect definitions of true and false diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c index daecc988a0..0da9b8b101 100644 --- a/gas/config/tc-mips.c +++ b/gas/config/tc-mips.c @@ -12269,32 +12269,43 @@ tc_gen_reloc (section, fixp) as_fatal (_("Double check fx_r_type in tc-mips.c:tc_gen_reloc")); fixp->fx_r_type = BFD_RELOC_GPREL32; } - else if (fixp->fx_pcrel == 0 || OUTPUT_FLAVOR == bfd_target_elf_flavour) - reloc->addend = fixp->fx_addnumber; else if (fixp->fx_r_type == BFD_RELOC_PCREL_LO16) { - /* We use a special addend for an internal RELLO reloc. */ - if (symbol_section_p (fixp->fx_addsy)) - reloc->addend = reloc->address - S_GET_VALUE (fixp->fx_subsy); + if (OUTPUT_FLAVOR == bfd_target_elf_flavour) + reloc->addend = fixp->fx_addnumber; else - reloc->addend = fixp->fx_addnumber + reloc->address; + { + /* We use a special addend for an internal RELLO reloc. */ + if (symbol_section_p (fixp->fx_addsy)) + reloc->addend = reloc->address - S_GET_VALUE (fixp->fx_subsy); + else + reloc->addend = fixp->fx_addnumber + reloc->address; + } } else if (fixp->fx_r_type == BFD_RELOC_PCREL_HI16_S) { assert (fixp->fx_next != NULL && fixp->fx_next->fx_r_type == BFD_RELOC_PCREL_LO16); - /* We use a special addend for an internal RELHI reloc. The - reloc is relative to the RELLO; adjust the addend + + /* The reloc is relative to the RELLO; adjust the addend accordingly. */ - if (symbol_section_p (fixp->fx_addsy)) - reloc->addend = (fixp->fx_next->fx_frag->fr_address - + fixp->fx_next->fx_where - - S_GET_VALUE (fixp->fx_subsy)); + if (OUTPUT_FLAVOR == bfd_target_elf_flavour) + reloc->addend = fixp->fx_next->fx_addnumber; else - reloc->addend = (fixp->fx_addnumber - + fixp->fx_next->fx_frag->fr_address - + fixp->fx_next->fx_where); + { + /* We use a special addend for an internal RELHI reloc. */ + if (symbol_section_p (fixp->fx_addsy)) + reloc->addend = (fixp->fx_next->fx_frag->fr_address + + fixp->fx_next->fx_where + - S_GET_VALUE (fixp->fx_subsy)); + else + reloc->addend = (fixp->fx_addnumber + + fixp->fx_next->fx_frag->fr_address + + fixp->fx_next->fx_where); + } } + else if (fixp->fx_pcrel == 0 || OUTPUT_FLAVOR == bfd_target_elf_flavour) + reloc->addend = fixp->fx_addnumber; else { if (OUTPUT_FLAVOR != bfd_target_aout_flavour)