mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-27 03:51:15 +08:00
[ bfd/ChangeLog ]
2004-04-24 Chris Demetriou <cgd@broadcom.com> * elf32-mips.c (elf_mips_gnu_rel_hi16, elf_mips_gnu_rel_lo16) (elf_mips_gnu_pcrel64, elf_mips_gnu_pcrel32): Remove. (bfd_elf32_bfd_reloc_type_lookup): Remove cases for BFD_RELOC_PCREL_HI16_S, BFD_RELOC_PCREL_LO16, BFD_RELOC_64_PCREL, and BFD_RELOC_32_PCREL. (mips_elf32_rtype_to_howto): Remove cases for R_MIPS_GNU_REL_HI16, R_MIPS_GNU_REL_LO16, R_MIPS_PC64, R_MIPS_PC32. * elfxx-mips.c (mips_elf_calculate_relocation): Likewise. (_bfd_mips_elf_lo16_reloc): Remove handling for R_MIPS_GNU_REL_HI16. (mips_elf_next_relocation): Move comment about matching HI/LO relocations to... (_bfd_mips_elf_relocate_section): Here. Remove handling for R_MIPS_GNU_REL_HI16. [ include/elf/ChangeLog ] 2004-04-24 Chris Demetriou <cgd@broadcom.com> * mips.h (R_MIPS_PC32, R_MIPS_PC64, R_MIPS_GNU_REL_LO16) (R_MIPS_GNU_REL_HI16): Remove. (R_MIPS_GNU_REL16_S2): Update comment. [ ld/testsuite/ChangeLog ] 2004-04-24 Chris Demetriou <cgd@broadcom.com> * ld-elf/merge.d: XFAIL on all MIPS targets.
This commit is contained in:
parent
38cc9c28f4
commit
4030e8f624
@ -1,3 +1,19 @@
|
||||
2004-04-24 Chris Demetriou <cgd@broadcom.com>
|
||||
|
||||
* elf32-mips.c (elf_mips_gnu_rel_hi16, elf_mips_gnu_rel_lo16)
|
||||
(elf_mips_gnu_pcrel64, elf_mips_gnu_pcrel32): Remove.
|
||||
(bfd_elf32_bfd_reloc_type_lookup): Remove cases for
|
||||
BFD_RELOC_PCREL_HI16_S, BFD_RELOC_PCREL_LO16, BFD_RELOC_64_PCREL,
|
||||
and BFD_RELOC_32_PCREL.
|
||||
(mips_elf32_rtype_to_howto): Remove cases for R_MIPS_GNU_REL_HI16,
|
||||
R_MIPS_GNU_REL_LO16, R_MIPS_PC64, R_MIPS_PC32.
|
||||
* elfxx-mips.c (mips_elf_calculate_relocation): Likewise.
|
||||
(_bfd_mips_elf_lo16_reloc): Remove handling for R_MIPS_GNU_REL_HI16.
|
||||
(mips_elf_next_relocation): Move comment about matching HI/LO
|
||||
relocations to...
|
||||
(_bfd_mips_elf_relocate_section): Here. Remove handling for
|
||||
R_MIPS_GNU_REL_HI16.
|
||||
|
||||
2004-04-23 Chris Demetriou <cgd@broadcom.com>
|
||||
|
||||
* coff-mips.c (mips_relhi_reloc, mips_rello_reloc)
|
||||
|
@ -599,39 +599,6 @@ static reloc_howto_type elf_mips16_gprel_howto =
|
||||
0x07ff001f, /* dst_mask */
|
||||
FALSE); /* pcrel_offset */
|
||||
|
||||
/* GNU extensions for embedded-pic. */
|
||||
/* High 16 bits of symbol value, pc-relative. */
|
||||
static reloc_howto_type elf_mips_gnu_rel_hi16 =
|
||||
HOWTO (R_MIPS_GNU_REL_HI16, /* type */
|
||||
16, /* rightshift */
|
||||
2, /* size (0 = byte, 1 = short, 2 = long) */
|
||||
16, /* bitsize */
|
||||
TRUE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
_bfd_mips_elf_hi16_reloc, /* special_function */
|
||||
"R_MIPS_GNU_REL_HI16", /* name */
|
||||
TRUE, /* partial_inplace */
|
||||
0xffff, /* src_mask */
|
||||
0xffff, /* dst_mask */
|
||||
TRUE); /* pcrel_offset */
|
||||
|
||||
/* Low 16 bits of symbol value, pc-relative. */
|
||||
static reloc_howto_type elf_mips_gnu_rel_lo16 =
|
||||
HOWTO (R_MIPS_GNU_REL_LO16, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size (0 = byte, 1 = short, 2 = long) */
|
||||
16, /* bitsize */
|
||||
TRUE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
_bfd_mips_elf_lo16_reloc, /* special_function */
|
||||
"R_MIPS_GNU_REL_LO16", /* name */
|
||||
TRUE, /* partial_inplace */
|
||||
0xffff, /* src_mask */
|
||||
0xffff, /* dst_mask */
|
||||
TRUE); /* pcrel_offset */
|
||||
|
||||
/* 16 bit offset for pc-relative branches. */
|
||||
static reloc_howto_type elf_mips_gnu_rel16_s2 =
|
||||
HOWTO (R_MIPS_GNU_REL16_S2, /* type */
|
||||
@ -648,38 +615,6 @@ static reloc_howto_type elf_mips_gnu_rel16_s2 =
|
||||
0xffff, /* dst_mask */
|
||||
TRUE); /* pcrel_offset */
|
||||
|
||||
/* 64 bit pc-relative. */
|
||||
static reloc_howto_type elf_mips_gnu_pcrel64 =
|
||||
HOWTO (R_MIPS_PC64, /* type */
|
||||
0, /* rightshift */
|
||||
4, /* size (0 = byte, 1 = short, 2 = long) */
|
||||
64, /* bitsize */
|
||||
TRUE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_signed, /* complain_on_overflow */
|
||||
_bfd_mips_elf_generic_reloc, /* special_function */
|
||||
"R_MIPS_PC64", /* name */
|
||||
TRUE, /* partial_inplace */
|
||||
MINUS_ONE, /* src_mask */
|
||||
MINUS_ONE, /* dst_mask */
|
||||
TRUE); /* pcrel_offset */
|
||||
|
||||
/* 32 bit pc-relative. */
|
||||
static reloc_howto_type elf_mips_gnu_pcrel32 =
|
||||
HOWTO (R_MIPS_PC32, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size (0 = byte, 1 = short, 2 = long) */
|
||||
32, /* bitsize */
|
||||
TRUE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_signed, /* complain_on_overflow */
|
||||
_bfd_mips_elf_generic_reloc, /* special_function */
|
||||
"R_MIPS_PC32", /* name */
|
||||
TRUE, /* partial_inplace */
|
||||
0xffffffff, /* src_mask */
|
||||
0xffffffff, /* dst_mask */
|
||||
TRUE); /* pcrel_offset */
|
||||
|
||||
/* GNU extension to record C++ vtable hierarchy */
|
||||
static reloc_howto_type elf_mips_gnu_vtinherit_howto =
|
||||
HOWTO (R_MIPS_GNU_VTINHERIT, /* type */
|
||||
@ -1134,16 +1069,8 @@ bfd_elf32_bfd_reloc_type_lookup (bfd *abfd, bfd_reloc_code_real_type code)
|
||||
return &elf_mips_gnu_vtinherit_howto;
|
||||
case BFD_RELOC_VTABLE_ENTRY:
|
||||
return &elf_mips_gnu_vtentry_howto;
|
||||
case BFD_RELOC_PCREL_HI16_S:
|
||||
return &elf_mips_gnu_rel_hi16;
|
||||
case BFD_RELOC_PCREL_LO16:
|
||||
return &elf_mips_gnu_rel_lo16;
|
||||
case BFD_RELOC_16_PCREL_S2:
|
||||
return &elf_mips_gnu_rel16_s2;
|
||||
case BFD_RELOC_64_PCREL:
|
||||
return &elf_mips_gnu_pcrel64;
|
||||
case BFD_RELOC_32_PCREL:
|
||||
return &elf_mips_gnu_pcrel32;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1163,16 +1090,8 @@ mips_elf32_rtype_to_howto (unsigned int r_type,
|
||||
return &elf_mips_gnu_vtinherit_howto;
|
||||
case R_MIPS_GNU_VTENTRY:
|
||||
return &elf_mips_gnu_vtentry_howto;
|
||||
case R_MIPS_GNU_REL_HI16:
|
||||
return &elf_mips_gnu_rel_hi16;
|
||||
case R_MIPS_GNU_REL_LO16:
|
||||
return &elf_mips_gnu_rel_lo16;
|
||||
case R_MIPS_GNU_REL16_S2:
|
||||
return &elf_mips_gnu_rel16_s2;
|
||||
case R_MIPS_PC64:
|
||||
return &elf_mips_gnu_pcrel64;
|
||||
case R_MIPS_PC32:
|
||||
return &elf_mips_gnu_pcrel32;
|
||||
default:
|
||||
BFD_ASSERT (r_type < (unsigned int) R_MIPS_max);
|
||||
return &elf_mips_howto_table_rel[r_type];
|
||||
|
@ -1220,13 +1220,6 @@ _bfd_mips_elf_lo16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
|
||||
carry or borrow will induce a change of +1 or -1 in the high part. */
|
||||
hi->rel.addend += (vallo + 0x8000) & 0xffff;
|
||||
|
||||
/* R_MIPS_GNU_REL_HI16 relocations are relative to the address of the
|
||||
lo16 relocation, not their own address. If we're calculating the
|
||||
final value, and hence subtracting the "PC", subtract the offset
|
||||
of the lo16 relocation from here. */
|
||||
if (output_bfd == NULL && hi->rel.howto->type == R_MIPS_GNU_REL_HI16)
|
||||
hi->rel.addend -= reloc_entry->address - hi->rel.address;
|
||||
|
||||
ret = _bfd_mips_elf_generic_reloc (abfd, &hi->rel, symbol, hi->data,
|
||||
hi->input_section, output_bfd,
|
||||
error_message);
|
||||
@ -2728,12 +2721,6 @@ mips_elf_next_relocation (bfd *abfd ATTRIBUTE_UNUSED, unsigned int r_type,
|
||||
const Elf_Internal_Rela *relocation,
|
||||
const Elf_Internal_Rela *relend)
|
||||
{
|
||||
/* According to the MIPS ELF ABI, the R_MIPS_LO16 relocation must be
|
||||
immediately following. However, for the IRIX6 ABI, the next
|
||||
relocation may be a composed relocation consisting of several
|
||||
relocations for the same address. In that case, the R_MIPS_LO16
|
||||
relocation may occur as one of these. We permit a similar
|
||||
extension in general, as that is useful for GCC. */
|
||||
while (relocation < relend)
|
||||
{
|
||||
if (ELF_R_TYPE (abfd, relocation->r_info) == r_type)
|
||||
@ -3348,29 +3335,12 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
|
||||
value &= howto->dst_mask;
|
||||
break;
|
||||
|
||||
case R_MIPS_PC32:
|
||||
case R_MIPS_PC64:
|
||||
case R_MIPS_GNU_REL_LO16:
|
||||
value = symbol + addend - p;
|
||||
value &= howto->dst_mask;
|
||||
break;
|
||||
|
||||
case R_MIPS_GNU_REL16_S2:
|
||||
value = symbol + _bfd_mips_elf_sign_extend (addend, 18) - p;
|
||||
overflowed_p = mips_elf_overflow_p (value, 18);
|
||||
value = (value >> 2) & howto->dst_mask;
|
||||
break;
|
||||
|
||||
case R_MIPS_GNU_REL_HI16:
|
||||
/* Instead of subtracting 'p' here, we should be subtracting the
|
||||
equivalent value for the LO part of the reloc, since the value
|
||||
here is relative to that address. Because that's not easy to do,
|
||||
we adjust 'addend' in _bfd_mips_elf_relocate_section(). See also
|
||||
the comment there for more information. */
|
||||
value = mips_elf_high (addend + symbol - p);
|
||||
value &= howto->dst_mask;
|
||||
break;
|
||||
|
||||
case R_MIPS16_26:
|
||||
/* The calculation for R_MIPS16_26 is just the same as for an
|
||||
R_MIPS_26. It's only the storage of the relocated field into
|
||||
@ -6229,7 +6199,6 @@ _bfd_mips_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
|
||||
combination of the addend stored in two different
|
||||
relocations. */
|
||||
if (r_type == R_MIPS_HI16
|
||||
|| r_type == R_MIPS_GNU_REL_HI16
|
||||
|| (r_type == R_MIPS_GOT16
|
||||
&& mips_elf_local_relocation_p (input_bfd, rel,
|
||||
local_sections, FALSE)))
|
||||
@ -6237,7 +6206,6 @@ _bfd_mips_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
|
||||
bfd_vma l;
|
||||
const Elf_Internal_Rela *lo16_relocation;
|
||||
reloc_howto_type *lo16_howto;
|
||||
unsigned int lo;
|
||||
|
||||
/* The combined value is the sum of the HI16 addend,
|
||||
left-shifted by sixteen bits, and the LO16
|
||||
@ -6245,18 +6213,25 @@ _bfd_mips_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
|
||||
a `lui' of the HI16 value, and then an `addiu' of
|
||||
the LO16 value.)
|
||||
|
||||
Scan ahead to find a matching LO16 relocation. */
|
||||
if (r_type == R_MIPS_GNU_REL_HI16)
|
||||
lo = R_MIPS_GNU_REL_LO16;
|
||||
else
|
||||
lo = R_MIPS_LO16;
|
||||
lo16_relocation = mips_elf_next_relocation (input_bfd, lo,
|
||||
Scan ahead to find a matching LO16 relocation.
|
||||
|
||||
According to the MIPS ELF ABI, the R_MIPS_LO16
|
||||
relocation must be immediately following.
|
||||
However, for the IRIX6 ABI, the next relocation
|
||||
may be a composed relocation consisting of
|
||||
several relocations for the same address. In
|
||||
that case, the R_MIPS_LO16 relocation may occur
|
||||
as one of these. We permit a similar extension
|
||||
in general, as that is useful for GCC. */
|
||||
lo16_relocation = mips_elf_next_relocation (input_bfd,
|
||||
R_MIPS_LO16,
|
||||
rel, relend);
|
||||
if (lo16_relocation == NULL)
|
||||
return FALSE;
|
||||
|
||||
/* Obtain the addend kept there. */
|
||||
lo16_howto = MIPS_ELF_RTYPE_TO_HOWTO (input_bfd, lo, FALSE);
|
||||
lo16_howto = MIPS_ELF_RTYPE_TO_HOWTO (input_bfd,
|
||||
R_MIPS_LO16, FALSE);
|
||||
l = mips_elf_obtain_contents (lo16_howto, lo16_relocation,
|
||||
input_bfd, contents);
|
||||
l &= lo16_howto->src_mask;
|
||||
@ -6267,16 +6242,6 @@ _bfd_mips_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
|
||||
|
||||
/* Compute the combined addend. */
|
||||
addend += l;
|
||||
|
||||
/* If PC-relative, subtract the difference between the
|
||||
address of the LO part of the reloc and the address of
|
||||
the HI part. The relocation is relative to the LO
|
||||
part, but mips_elf_calculate_relocation() doesn't
|
||||
know its address or the difference from the HI part, so
|
||||
we subtract that difference here. See also the
|
||||
comment in mips_elf_calculate_relocation(). */
|
||||
if (r_type == R_MIPS_GNU_REL_HI16)
|
||||
addend -= (lo16_relocation->r_offset - rel->r_offset);
|
||||
}
|
||||
else if (r_type == R_MIPS16_GPREL)
|
||||
{
|
||||
@ -6334,8 +6299,7 @@ _bfd_mips_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
|
||||
else
|
||||
{
|
||||
if (r_type == R_MIPS_HI16
|
||||
|| r_type == R_MIPS_GOT16
|
||||
|| r_type == R_MIPS_GNU_REL_HI16)
|
||||
|| r_type == R_MIPS_GOT16)
|
||||
addend = mips_elf_high (addend);
|
||||
else if (r_type == R_MIPS_HIGHER)
|
||||
addend = mips_elf_higher (addend);
|
||||
|
@ -1,3 +1,9 @@
|
||||
2004-04-24 Chris Demetriou <cgd@broadcom.com>
|
||||
|
||||
* mips.h (R_MIPS_PC32, R_MIPS_PC64, R_MIPS_GNU_REL_LO16)
|
||||
(R_MIPS_GNU_REL_HI16): Remove.
|
||||
(R_MIPS_GNU_REL16_S2): Update comment.
|
||||
|
||||
2004-30-30 Galit Heller <Galit.Heller@nsc.com>
|
||||
Tomer Levi <Tomer.Levi@nsc.com>
|
||||
|
||||
|
@ -76,12 +76,8 @@ START_RELOC_NUMBERS (elf_mips_reloc_type)
|
||||
/* These relocs are used for the mips16. */
|
||||
RELOC_NUMBER (R_MIPS16_26, 100)
|
||||
RELOC_NUMBER (R_MIPS16_GPREL, 101)
|
||||
/* These are GNU extensions to handle embedded-pic. */
|
||||
RELOC_NUMBER (R_MIPS_PC32, 248)
|
||||
RELOC_NUMBER (R_MIPS_PC64, 249)
|
||||
/* FIXME: this relocation is used internally by gas. */
|
||||
RELOC_NUMBER (R_MIPS_GNU_REL16_S2, 250)
|
||||
RELOC_NUMBER (R_MIPS_GNU_REL_LO16, 251)
|
||||
RELOC_NUMBER (R_MIPS_GNU_REL_HI16, 252)
|
||||
/* These are GNU extensions to enable C++ vtable garbage collection. */
|
||||
RELOC_NUMBER (R_MIPS_GNU_VTINHERIT, 253)
|
||||
RELOC_NUMBER (R_MIPS_GNU_VTENTRY, 254)
|
||||
|
@ -1,3 +1,7 @@
|
||||
2004-04-24 Chris Demetriou <cgd@broadcom.com>
|
||||
|
||||
* ld-elf/merge.d: XFAIL on all MIPS targets.
|
||||
|
||||
2004-04-24 Alan Modra <amodra@bigpond.net.au>
|
||||
|
||||
* ld-powerpc/tlsexe32.d: Update.
|
||||
|
@ -3,7 +3,7 @@
|
||||
#objdump: -s
|
||||
#xfail: "arc-*-*" "avr-*-*" "cris-*-*" "dlx-*-*" "fr30-*-*" "frv-*-*"
|
||||
#xfail: "hppa*-*-*" "h8300-*-*" "i960-*-*" "ip2k-*-*" "m32r-*-*" "mcore-*-*"
|
||||
#xfail: "mn10*-*-*" "mips64*-*-linux*" "openrisc-*-*" "pj-*-*" "sparc*-*-*"
|
||||
#xfail: "mn10*-*-*" "mips*-*-*" "openrisc-*-*" "pj-*-*" "sparc*-*-*"
|
||||
#xfail: "xtensa-*-*"
|
||||
|
||||
.*: file format .*elf.*
|
||||
|
Loading…
Reference in New Issue
Block a user