2013-05-06 Paul Brook <paul@codesourcery.com>
include/elf/ * mips.h (R_MIPS_PC32): Update comment. * elf64-mips.c (elf_mips_gnu_pcrel32): New. (bfd_elf64_bfd_reloc_type_lookup, bfd_elf64_bfd_reloc_name_lookup, mips_elf64_rtype_to_howto): Handle R_MIPS_PC32. * elfn32-mips.c (elf_mips_gnu_pcrel32): New. (bfd_elfn32_bfd_reloc_type_lookup, bfd_elfn32_bfd_reloc_name_lookup, mips_elfn32_rtype_to_howto): Handle R_MIPS_PC32. 2013-05-06 Paul Brook <paul@codesourcery.com> Catherine Moore <clm@codesourcery.com> gas/ * config/tc-mips.c (md_pcrel_from): Handle BFD_RELOC_32_PCREL. (limited_pcrel_reloc_p): Likewise. (md_apply_fix): Likewise. (tc_gen_reloc): Likewise.
This commit is contained in:
parent
2de39019a2
commit
b47468a6db
7 changed files with 83 additions and 5 deletions
|
@ -1,3 +1,12 @@
|
|||
2013-05-06 Paul Brook <paul@codesourcery.com>
|
||||
|
||||
* elf64-mips.c (elf_mips_gnu_pcrel32): New.
|
||||
(bfd_elf64_bfd_reloc_type_lookup, bfd_elf64_bfd_reloc_name_lookup,
|
||||
mips_elf64_rtype_to_howto): Handle R_MIPS_PC32.
|
||||
* elfn32-mips.c (elf_mips_gnu_pcrel32): New.
|
||||
(bfd_elfn32_bfd_reloc_type_lookup, bfd_elfn32_bfd_reloc_name_lookup,
|
||||
mips_elfn32_rtype_to_howto): Handle R_MIPS_PC32.
|
||||
|
||||
2013-05-06 Alan Modra <amodra@gmail.com>
|
||||
|
||||
* elf64-ppc.c (opd_entry_value): Handle case where symbol
|
||||
|
|
|
@ -2622,6 +2622,23 @@ static reloc_howto_type elf_mips_gnu_rela16_s2 =
|
|||
0, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
TRUE); /* pcrel_offset */
|
||||
|
||||
/* 32 bit pc-relative. Used for compact EH tables. */
|
||||
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 */
|
||||
|
||||
|
||||
/* Originally a VxWorks extension, but now used for other systems too. */
|
||||
static reloc_howto_type elf_mips_copy_howto =
|
||||
|
@ -3257,6 +3274,8 @@ bfd_elf64_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
|
|||
return &elf_mips_gnu_vtinherit_howto;
|
||||
case BFD_RELOC_VTABLE_ENTRY:
|
||||
return &elf_mips_gnu_vtentry_howto;
|
||||
case BFD_RELOC_32_PCREL:
|
||||
return &elf_mips_gnu_pcrel32;
|
||||
case BFD_RELOC_MIPS_COPY:
|
||||
return &elf_mips_copy_howto;
|
||||
case BFD_RELOC_MIPS_JUMP_SLOT:
|
||||
|
@ -3304,6 +3323,8 @@ bfd_elf64_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
|
|||
return &elf_mips_gnu_rel16_s2;
|
||||
if (strcasecmp (elf_mips_gnu_rela16_s2.name, r_name) == 0)
|
||||
return &elf_mips_gnu_rela16_s2;
|
||||
if (strcasecmp (elf_mips_gnu_pcrel32.name, r_name) == 0)
|
||||
return &elf_mips_gnu_pcrel32;
|
||||
if (strcasecmp (elf_mips_copy_howto.name, r_name) == 0)
|
||||
return &elf_mips_copy_howto;
|
||||
if (strcasecmp (elf_mips_jump_slot_howto.name, r_name) == 0)
|
||||
|
@ -3328,6 +3349,8 @@ mips_elf64_rtype_to_howto (unsigned int r_type, bfd_boolean rela_p)
|
|||
return &elf_mips_gnu_rela16_s2;
|
||||
else
|
||||
return &elf_mips_gnu_rel16_s2;
|
||||
case R_MIPS_PC32:
|
||||
return &elf_mips_gnu_pcrel32;
|
||||
case R_MIPS_COPY:
|
||||
return &elf_mips_copy_howto;
|
||||
case R_MIPS_JUMP_SLOT:
|
||||
|
|
|
@ -2587,6 +2587,23 @@ static reloc_howto_type elf_mips_gnu_rela16_s2 =
|
|||
0, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
TRUE); /* pcrel_offset */
|
||||
|
||||
/* 32 bit pc-relative. Used for compact EH tables. */
|
||||
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 */
|
||||
|
||||
|
||||
/* Originally a VxWorks extension, but now used for other systems too. */
|
||||
static reloc_howto_type elf_mips_copy_howto =
|
||||
|
@ -3073,6 +3090,8 @@ bfd_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
|
|||
return &elf_mips_gnu_vtinherit_howto;
|
||||
case BFD_RELOC_VTABLE_ENTRY:
|
||||
return &elf_mips_gnu_vtentry_howto;
|
||||
case BFD_RELOC_32_PCREL:
|
||||
return &elf_mips_gnu_pcrel32;
|
||||
case BFD_RELOC_MIPS_COPY:
|
||||
return &elf_mips_copy_howto;
|
||||
case BFD_RELOC_MIPS_JUMP_SLOT:
|
||||
|
@ -3121,6 +3140,8 @@ bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
|
|||
return &elf_mips_gnu_rel16_s2;
|
||||
if (strcasecmp (elf_mips_gnu_rela16_s2.name, r_name) == 0)
|
||||
return &elf_mips_gnu_rela16_s2;
|
||||
if (strcasecmp (elf_mips_gnu_pcrel32.name, r_name) == 0)
|
||||
return &elf_mips_gnu_pcrel32;
|
||||
if (strcasecmp (elf_mips_copy_howto.name, r_name) == 0)
|
||||
return &elf_mips_copy_howto;
|
||||
if (strcasecmp (elf_mips_jump_slot_howto.name, r_name) == 0)
|
||||
|
@ -3145,6 +3166,8 @@ mips_elf_n32_rtype_to_howto (unsigned int r_type, bfd_boolean rela_p)
|
|||
return &elf_mips_gnu_rela16_s2;
|
||||
else
|
||||
return &elf_mips_gnu_rel16_s2;
|
||||
case R_MIPS_PC32:
|
||||
return &elf_mips_gnu_pcrel32;
|
||||
case R_MIPS_COPY:
|
||||
return &elf_mips_copy_howto;
|
||||
case R_MIPS_JUMP_SLOT:
|
||||
|
|
|
@ -1,3 +1,12 @@
|
|||
2013-05-06 Paul Brook <paul@codesourcery.com>
|
||||
Catherine Moore <clm@codesourcery.com>
|
||||
|
||||
gas/
|
||||
* config/tc-mips.c (md_pcrel_from): Handle BFD_RELOC_32_PCREL.
|
||||
(limited_pcrel_reloc_p): Likewise.
|
||||
(md_apply_fix): Likewise.
|
||||
(tc_gen_reloc): Likewise.
|
||||
|
||||
2013-05-06 Richard Sandiford <rdsandiford@googlemail.com>
|
||||
|
||||
* config/tc-mips.c (limited_pcrel_reloc_p): New function.
|
||||
|
|
|
@ -2758,10 +2758,14 @@ limited_pcrel_reloc_p (bfd_reloc_code_real_type reloc)
|
|||
case BFD_RELOC_MICROMIPS_16_PCREL_S1:
|
||||
return TRUE;
|
||||
|
||||
case BFD_RELOC_32_PCREL:
|
||||
return HAVE_64BIT_ADDRESSES;
|
||||
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/* Return true if the given relocation might need a matching %lo().
|
||||
This is only "might" because SVR4 R_MIPS_GOT16 relocations only
|
||||
need a matching %lo() when applied to local symbols. */
|
||||
|
@ -15415,6 +15419,9 @@ md_pcrel_from (fixS *fixP)
|
|||
/* Return the address of the delay slot. */
|
||||
return addr + 4;
|
||||
|
||||
case BFD_RELOC_32_PCREL:
|
||||
return addr;
|
||||
|
||||
default:
|
||||
/* We have no relocation type for PC relative MIPS16 instructions. */
|
||||
if (fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != now_seg)
|
||||
|
@ -15637,7 +15644,8 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
|
|||
gas_assert (!fixP->fx_pcrel || fixP->fx_r_type == BFD_RELOC_16_PCREL_S2
|
||||
|| fixP->fx_r_type == BFD_RELOC_MICROMIPS_7_PCREL_S1
|
||||
|| fixP->fx_r_type == BFD_RELOC_MICROMIPS_10_PCREL_S1
|
||||
|| fixP->fx_r_type == BFD_RELOC_MICROMIPS_16_PCREL_S1);
|
||||
|| fixP->fx_r_type == BFD_RELOC_MICROMIPS_16_PCREL_S1
|
||||
|| fixP->fx_r_type == BFD_RELOC_32_PCREL);
|
||||
|
||||
/* Don't treat parts of a composite relocation as done. There are two
|
||||
reasons for this:
|
||||
|
@ -15785,6 +15793,7 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
|
|||
|
||||
case BFD_RELOC_RVA:
|
||||
case BFD_RELOC_32:
|
||||
case BFD_RELOC_32_PCREL:
|
||||
case BFD_RELOC_16:
|
||||
/* If we are deleting this reloc entry, we must fill in the
|
||||
value now. This can happen if we have a .word which is not
|
||||
|
@ -17917,7 +17926,8 @@ tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
|
|||
gas_assert (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2
|
||||
|| fixp->fx_r_type == BFD_RELOC_MICROMIPS_7_PCREL_S1
|
||||
|| fixp->fx_r_type == BFD_RELOC_MICROMIPS_10_PCREL_S1
|
||||
|| fixp->fx_r_type == BFD_RELOC_MICROMIPS_16_PCREL_S1);
|
||||
|| fixp->fx_r_type == BFD_RELOC_MICROMIPS_16_PCREL_S1
|
||||
|| fixp->fx_r_type == BFD_RELOC_32_PCREL);
|
||||
|
||||
/* At this point, fx_addnumber is "symbol offset - pcrel address".
|
||||
Relocations want only the symbol offset. */
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2013-05-06 Paul Brook <paul@codesourcery.com>
|
||||
|
||||
include/elf/
|
||||
* mips.h (R_MIPS_PC32): Update comment.
|
||||
|
||||
2013-04-03 Jason Merrill <jason@redhat.com>
|
||||
|
||||
Demangle C++11 ref-qualifier.
|
||||
|
|
|
@ -152,9 +152,8 @@ START_RELOC_NUMBERS (elf_mips_reloc_type)
|
|||
FAKE_RELOC (R_MICROMIPS_max, 174)
|
||||
|
||||
/* This was a GNU extension used by embedded-PIC. It was co-opted by
|
||||
mips-linux for exception-handling data. It is no longer used, but
|
||||
should continue to be supported by the linker for backward
|
||||
compatibility. (GCC stopped using it in May, 2004.) */
|
||||
mips-linux for exception-handling data. GCC stopped using it in
|
||||
May, 2004, then started using it again for compact unwind tables. */
|
||||
RELOC_NUMBER (R_MIPS_PC32, 248)
|
||||
/* FIXME: this relocation is used internally by gas. */
|
||||
RELOC_NUMBER (R_MIPS_GNU_REL16_S2, 250)
|
||||
|
|
Loading…
Reference in a new issue