microMIPS/BFD: Add missing NewABI TLS and miscellaneous relocations

Complement commit df58fc944d ("MIPS: microMIPS ASE support"),
<https://sourceware.org/ml/binutils/2011-07/msg00198.html>, and add TLS
and a few miscellaneous relocations to NewABI microMIPS support, fixing
GAS assertion failures:

.../gas/testsuite/gas/mips/elf-rel28.s: Assembler messages:
.../gas/testsuite/gas/mips/elf-rel28.s:19: Internal error in append_insn at .../gas/config/tc-mips.c:7660.
Please report this bug.

observed if an attempt is made to assemble the `elf-rel28.s' test case
to microMIPS code.  The relocations are the same as with o32 support,
except for `partial_inplace' and `src_mask' updates for the respective
RELA variants.

	bfd/
	* elf64-mips.c (micromips_elf64_howto_table_rel): Add
	R_MICROMIPS_HI0_LO16, R_MICROMIPS_TLS_GD, R_MICROMIPS_TLS_LDM,
	R_MICROMIPS_TLS_DTPREL_HI16, R_MICROMIPS_TLS_DTPREL_LO16,
	R_MICROMIPS_TLS_GOTTPREL, R_MICROMIPS_TLS_TPREL_HI16,
	R_MICROMIPS_TLS_TPREL_LO16, R_MICROMIPS_GPREL7_S2 and
	R_MICROMIPS_PC23_S2 relocation entries.
	(micromips_elf64_howto_table_rela): Likewise.
	(micromips_reloc_map): Likewise.
	* elfn32-mips.c (elf_micromips_howto_table_rel): Likewise.
	(elf_micromips_howto_table_rela): Likewise.
	(micromips_reloc_map): Likewise.

	gas/
	* testsuite/gas/mips/elf-rel28-micromips-n32.d: New test.
	* testsuite/gas/mips/elf-rel28-micromips-n64.d: New test.
	* testsuite/gas/mips/mips.exp: Run the new tests.
This commit is contained in:
Maciej W. Rozycki 2018-07-02 23:57:22 +01:00
parent 30e5322741
commit 156f2c001e
7 changed files with 968 additions and 0 deletions

View File

@ -1,3 +1,17 @@
2018-07-02 Maciej W. Rozycki <macro@mips.com>
* elf64-mips.c (micromips_elf64_howto_table_rel): Add
R_MICROMIPS_HI0_LO16, R_MICROMIPS_TLS_GD, R_MICROMIPS_TLS_LDM,
R_MICROMIPS_TLS_DTPREL_HI16, R_MICROMIPS_TLS_DTPREL_LO16,
R_MICROMIPS_TLS_GOTTPREL, R_MICROMIPS_TLS_TPREL_HI16,
R_MICROMIPS_TLS_TPREL_LO16, R_MICROMIPS_GPREL7_S2 and
R_MICROMIPS_PC23_S2 relocation entries.
(micromips_elf64_howto_table_rela): Likewise.
(micromips_reloc_map): Likewise.
* elfn32-mips.c (elf_micromips_howto_table_rel): Likewise.
(elf_micromips_howto_table_rela): Likewise.
(micromips_reloc_map): Likewise.
2018-07-02 H.J. Lu <hongjiu.lu@intel.com>
PR ld/23324

View File

@ -2421,6 +2421,166 @@ static reloc_howto_type micromips_elf64_howto_table_rel[] =
0, /* src_mask */
0x00000000, /* dst_mask */
FALSE), /* pcrel_offset */
/* Low 16 bits of symbol value. Note that the high 16 bits of symbol values
must be zero. This is used for relaxation. */
HOWTO (R_MICROMIPS_HI0_LO16, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
_bfd_mips_elf_generic_reloc, /* special_function */
"R_MICROMIPS_HI0_LO16",/* name */
TRUE, /* partial_inplace */
0x0000ffff, /* src_mask */
0x0000ffff, /* dst_mask */
FALSE), /* pcrel_offset */
EMPTY_HOWTO (158),
EMPTY_HOWTO (159),
EMPTY_HOWTO (160),
EMPTY_HOWTO (161),
/* TLS general dynamic variable reference. */
HOWTO (R_MICROMIPS_TLS_GD, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
_bfd_mips_elf_generic_reloc, /* special_function */
"R_MICROMIPS_TLS_GD", /* name */
TRUE, /* partial_inplace */
0x0000ffff, /* src_mask */
0x0000ffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* TLS local dynamic variable reference. */
HOWTO (R_MICROMIPS_TLS_LDM, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
_bfd_mips_elf_generic_reloc, /* special_function */
"R_MICROMIPS_TLS_LDM", /* name */
TRUE, /* partial_inplace */
0x0000ffff, /* src_mask */
0x0000ffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* TLS local dynamic offset. */
HOWTO (R_MICROMIPS_TLS_DTPREL_HI16, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
_bfd_mips_elf_generic_reloc, /* special_function */
"R_MICROMIPS_TLS_DTPREL_HI16", /* name */
TRUE, /* partial_inplace */
0x0000ffff, /* src_mask */
0x0000ffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* TLS local dynamic offset. */
HOWTO (R_MICROMIPS_TLS_DTPREL_LO16, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
_bfd_mips_elf_generic_reloc, /* special_function */
"R_MICROMIPS_TLS_DTPREL_LO16", /* name */
TRUE, /* partial_inplace */
0x0000ffff, /* src_mask */
0x0000ffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* TLS thread pointer offset. */
HOWTO (R_MICROMIPS_TLS_GOTTPREL, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
_bfd_mips_elf_generic_reloc, /* special_function */
"R_MICROMIPS_TLS_GOTTPREL", /* name */
TRUE, /* partial_inplace */
0x0000ffff, /* src_mask */
0x0000ffff, /* dst_mask */
FALSE), /* pcrel_offset */
EMPTY_HOWTO (167),
EMPTY_HOWTO (168),
/* TLS thread pointer offset. */
HOWTO (R_MICROMIPS_TLS_TPREL_HI16, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
_bfd_mips_elf_generic_reloc, /* special_function */
"R_MICROMIPS_TLS_TPREL_HI16", /* name */
TRUE, /* partial_inplace */
0x0000ffff, /* src_mask */
0x0000ffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* TLS thread pointer offset. */
HOWTO (R_MICROMIPS_TLS_TPREL_LO16, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
_bfd_mips_elf_generic_reloc, /* special_function */
"R_MICROMIPS_TLS_TPREL_LO16", /* name */
TRUE, /* partial_inplace */
0x0000ffff, /* src_mask */
0x0000ffff, /* dst_mask */
FALSE), /* pcrel_offset */
EMPTY_HOWTO (171),
/* GP- and PC-relative relocations. */
HOWTO (R_MICROMIPS_GPREL7_S2, /* type */
2, /* rightshift */
1, /* size (0 = byte, 1 = short, 2 = long) */
7, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
_bfd_mips_elf32_gprel16_reloc, /* special_function */
"R_MICROMIPS_GPREL7_S2", /* name */
TRUE, /* partial_inplace */
0x0000007f, /* src_mask */
0x0000007f, /* dst_mask */
FALSE), /* pcrel_offset */
HOWTO (R_MICROMIPS_PC23_S2, /* type */
2, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
23, /* bitsize */
TRUE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
_bfd_mips_elf_generic_reloc, /* special_function */
"R_MICROMIPS_PC23_S2", /* name */
TRUE, /* partial_inplace */
0x007fffff, /* src_mask */
0x007fffff, /* dst_mask */
TRUE), /* pcrel_offset */
};
static reloc_howto_type micromips_elf64_howto_table_rela[] =
@ -2763,6 +2923,166 @@ static reloc_howto_type micromips_elf64_howto_table_rela[] =
0, /* src_mask */
0x00000000, /* dst_mask */
FALSE), /* pcrel_offset */
/* Low 16 bits of symbol value. Note that the high 16 bits of symbol values
must be zero. This is used for relaxation. */
HOWTO (R_MICROMIPS_HI0_LO16, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
_bfd_mips_elf_generic_reloc, /* special_function */
"R_MICROMIPS_HI0_LO16",/* name */
FALSE, /* partial_inplace */
0, /* src_mask */
0x0000ffff, /* dst_mask */
FALSE), /* pcrel_offset */
EMPTY_HOWTO (158),
EMPTY_HOWTO (159),
EMPTY_HOWTO (160),
EMPTY_HOWTO (161),
/* TLS general dynamic variable reference. */
HOWTO (R_MICROMIPS_TLS_GD, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
_bfd_mips_elf_generic_reloc, /* special_function */
"R_MICROMIPS_TLS_GD", /* name */
FALSE, /* partial_inplace */
0, /* src_mask */
0x0000ffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* TLS local dynamic variable reference. */
HOWTO (R_MICROMIPS_TLS_LDM, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
_bfd_mips_elf_generic_reloc, /* special_function */
"R_MICROMIPS_TLS_LDM", /* name */
FALSE, /* partial_inplace */
0, /* src_mask */
0x0000ffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* TLS local dynamic offset. */
HOWTO (R_MICROMIPS_TLS_DTPREL_HI16, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
_bfd_mips_elf_generic_reloc, /* special_function */
"R_MICROMIPS_TLS_DTPREL_HI16", /* name */
FALSE, /* partial_inplace */
0, /* src_mask */
0x0000ffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* TLS local dynamic offset. */
HOWTO (R_MICROMIPS_TLS_DTPREL_LO16, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
_bfd_mips_elf_generic_reloc, /* special_function */
"R_MICROMIPS_TLS_DTPREL_LO16", /* name */
FALSE, /* partial_inplace */
0, /* src_mask */
0x0000ffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* TLS thread pointer offset. */
HOWTO (R_MICROMIPS_TLS_GOTTPREL, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
_bfd_mips_elf_generic_reloc, /* special_function */
"R_MICROMIPS_TLS_GOTTPREL", /* name */
FALSE, /* partial_inplace */
0, /* src_mask */
0x0000ffff, /* dst_mask */
FALSE), /* pcrel_offset */
EMPTY_HOWTO (167),
EMPTY_HOWTO (168),
/* TLS thread pointer offset. */
HOWTO (R_MICROMIPS_TLS_TPREL_HI16, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
_bfd_mips_elf_generic_reloc, /* special_function */
"R_MICROMIPS_TLS_TPREL_HI16", /* name */
FALSE, /* partial_inplace */
0, /* src_mask */
0x0000ffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* TLS thread pointer offset. */
HOWTO (R_MICROMIPS_TLS_TPREL_LO16, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
_bfd_mips_elf_generic_reloc, /* special_function */
"R_MICROMIPS_TLS_TPREL_LO16", /* name */
FALSE, /* partial_inplace */
0, /* src_mask */
0x0000ffff, /* dst_mask */
FALSE), /* pcrel_offset */
EMPTY_HOWTO (171),
/* GP- and PC-relative relocations. */
HOWTO (R_MICROMIPS_GPREL7_S2, /* type */
2, /* rightshift */
1, /* size (0 = byte, 1 = short, 2 = long) */
7, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
_bfd_mips_elf32_gprel16_reloc, /* special_function */
"R_MICROMIPS_GPREL7_S2", /* name */
FALSE, /* partial_inplace */
0, /* src_mask */
0x0000007f, /* dst_mask */
FALSE), /* pcrel_offset */
HOWTO (R_MICROMIPS_PC23_S2, /* type */
2, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
23, /* bitsize */
TRUE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
_bfd_mips_elf_generic_reloc, /* special_function */
"R_MICROMIPS_PC23_S2", /* name */
FALSE, /* partial_inplace */
0, /* src_mask */
0x007fffff, /* dst_mask */
TRUE), /* pcrel_offset */
};
/* GNU extension to record C++ vtable hierarchy */
@ -3463,6 +3783,21 @@ static const struct elf_reloc_map micromips_reloc_map[] =
{ BFD_RELOC_MICROMIPS_CALL_LO16, R_MICROMIPS_CALL_LO16 - R_MICROMIPS_min },
{ BFD_RELOC_MICROMIPS_SCN_DISP, R_MICROMIPS_SCN_DISP - R_MICROMIPS_min },
{ BFD_RELOC_MICROMIPS_JALR, R_MICROMIPS_JALR - R_MICROMIPS_min },
/* There is no BFD reloc for R_MICROMIPS_HI0_LO16. */
{ BFD_RELOC_MICROMIPS_TLS_GD, R_MICROMIPS_TLS_GD - R_MICROMIPS_min },
{ BFD_RELOC_MICROMIPS_TLS_LDM, R_MICROMIPS_TLS_LDM - R_MICROMIPS_min },
{ BFD_RELOC_MICROMIPS_TLS_DTPREL_HI16,
R_MICROMIPS_TLS_DTPREL_HI16 - R_MICROMIPS_min },
{ BFD_RELOC_MICROMIPS_TLS_DTPREL_LO16,
R_MICROMIPS_TLS_DTPREL_LO16 - R_MICROMIPS_min },
{ BFD_RELOC_MICROMIPS_TLS_GOTTPREL,
R_MICROMIPS_TLS_GOTTPREL - R_MICROMIPS_min },
{ BFD_RELOC_MICROMIPS_TLS_TPREL_HI16,
R_MICROMIPS_TLS_TPREL_HI16 - R_MICROMIPS_min },
{ BFD_RELOC_MICROMIPS_TLS_TPREL_LO16,
R_MICROMIPS_TLS_TPREL_LO16 - R_MICROMIPS_min },
/* There is no BFD reloc for R_MICROMIPS_GPREL7_S2. */
/* There is no BFD reloc for R_MICROMIPS_PC23_S2. */
};
/* Given a BFD reloc type, return a howto structure. */

View File

@ -2399,6 +2399,166 @@ static reloc_howto_type elf_micromips_howto_table_rel[] =
0, /* src_mask */
0x00000000, /* dst_mask */
FALSE), /* pcrel_offset */
/* Low 16 bits of symbol value. Note that the high 16 bits of symbol values
must be zero. This is used for relaxation. */
HOWTO (R_MICROMIPS_HI0_LO16, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
_bfd_mips_elf_generic_reloc, /* special_function */
"R_MICROMIPS_HI0_LO16",/* name */
TRUE, /* partial_inplace */
0x0000ffff, /* src_mask */
0x0000ffff, /* dst_mask */
FALSE), /* pcrel_offset */
EMPTY_HOWTO (158),
EMPTY_HOWTO (159),
EMPTY_HOWTO (160),
EMPTY_HOWTO (161),
/* TLS general dynamic variable reference. */
HOWTO (R_MICROMIPS_TLS_GD, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
_bfd_mips_elf_generic_reloc, /* special_function */
"R_MICROMIPS_TLS_GD", /* name */
TRUE, /* partial_inplace */
0x0000ffff, /* src_mask */
0x0000ffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* TLS local dynamic variable reference. */
HOWTO (R_MICROMIPS_TLS_LDM, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
_bfd_mips_elf_generic_reloc, /* special_function */
"R_MICROMIPS_TLS_LDM", /* name */
TRUE, /* partial_inplace */
0x0000ffff, /* src_mask */
0x0000ffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* TLS local dynamic offset. */
HOWTO (R_MICROMIPS_TLS_DTPREL_HI16, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
_bfd_mips_elf_generic_reloc, /* special_function */
"R_MICROMIPS_TLS_DTPREL_HI16", /* name */
TRUE, /* partial_inplace */
0x0000ffff, /* src_mask */
0x0000ffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* TLS local dynamic offset. */
HOWTO (R_MICROMIPS_TLS_DTPREL_LO16, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
_bfd_mips_elf_generic_reloc, /* special_function */
"R_MICROMIPS_TLS_DTPREL_LO16", /* name */
TRUE, /* partial_inplace */
0x0000ffff, /* src_mask */
0x0000ffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* TLS thread pointer offset. */
HOWTO (R_MICROMIPS_TLS_GOTTPREL, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
_bfd_mips_elf_generic_reloc, /* special_function */
"R_MICROMIPS_TLS_GOTTPREL", /* name */
TRUE, /* partial_inplace */
0x0000ffff, /* src_mask */
0x0000ffff, /* dst_mask */
FALSE), /* pcrel_offset */
EMPTY_HOWTO (167),
EMPTY_HOWTO (168),
/* TLS thread pointer offset. */
HOWTO (R_MICROMIPS_TLS_TPREL_HI16, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
_bfd_mips_elf_generic_reloc, /* special_function */
"R_MICROMIPS_TLS_TPREL_HI16", /* name */
TRUE, /* partial_inplace */
0x0000ffff, /* src_mask */
0x0000ffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* TLS thread pointer offset. */
HOWTO (R_MICROMIPS_TLS_TPREL_LO16, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
_bfd_mips_elf_generic_reloc, /* special_function */
"R_MICROMIPS_TLS_TPREL_LO16", /* name */
TRUE, /* partial_inplace */
0x0000ffff, /* src_mask */
0x0000ffff, /* dst_mask */
FALSE), /* pcrel_offset */
EMPTY_HOWTO (171),
/* GP- and PC-relative relocations. */
HOWTO (R_MICROMIPS_GPREL7_S2, /* type */
2, /* rightshift */
1, /* size (0 = byte, 1 = short, 2 = long) */
7, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
_bfd_mips_elf32_gprel16_reloc, /* special_function */
"R_MICROMIPS_GPREL7_S2", /* name */
TRUE, /* partial_inplace */
0x0000007f, /* src_mask */
0x0000007f, /* dst_mask */
FALSE), /* pcrel_offset */
HOWTO (R_MICROMIPS_PC23_S2, /* type */
2, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
23, /* bitsize */
TRUE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
_bfd_mips_elf_generic_reloc, /* special_function */
"R_MICROMIPS_PC23_S2", /* name */
TRUE, /* partial_inplace */
0x007fffff, /* src_mask */
0x007fffff, /* dst_mask */
TRUE), /* pcrel_offset */
};
static reloc_howto_type elf_micromips_howto_table_rela[] =
@ -2741,6 +2901,166 @@ static reloc_howto_type elf_micromips_howto_table_rela[] =
0, /* src_mask */
0x00000000, /* dst_mask */
FALSE), /* pcrel_offset */
/* Low 16 bits of symbol value. Note that the high 16 bits of symbol values
must be zero. This is used for relaxation. */
HOWTO (R_MICROMIPS_HI0_LO16, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
_bfd_mips_elf_generic_reloc, /* special_function */
"R_MICROMIPS_HI0_LO16",/* name */
FALSE, /* partial_inplace */
0, /* src_mask */
0x0000ffff, /* dst_mask */
FALSE), /* pcrel_offset */
EMPTY_HOWTO (158),
EMPTY_HOWTO (159),
EMPTY_HOWTO (160),
EMPTY_HOWTO (161),
/* TLS general dynamic variable reference. */
HOWTO (R_MICROMIPS_TLS_GD, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
_bfd_mips_elf_generic_reloc, /* special_function */
"R_MICROMIPS_TLS_GD", /* name */
FALSE, /* partial_inplace */
0, /* src_mask */
0x0000ffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* TLS local dynamic variable reference. */
HOWTO (R_MICROMIPS_TLS_LDM, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
_bfd_mips_elf_generic_reloc, /* special_function */
"R_MICROMIPS_TLS_LDM", /* name */
FALSE, /* partial_inplace */
0, /* src_mask */
0x0000ffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* TLS local dynamic offset. */
HOWTO (R_MICROMIPS_TLS_DTPREL_HI16, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
_bfd_mips_elf_generic_reloc, /* special_function */
"R_MICROMIPS_TLS_DTPREL_HI16", /* name */
FALSE, /* partial_inplace */
0, /* src_mask */
0x0000ffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* TLS local dynamic offset. */
HOWTO (R_MICROMIPS_TLS_DTPREL_LO16, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
_bfd_mips_elf_generic_reloc, /* special_function */
"R_MICROMIPS_TLS_DTPREL_LO16", /* name */
FALSE, /* partial_inplace */
0, /* src_mask */
0x0000ffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* TLS thread pointer offset. */
HOWTO (R_MICROMIPS_TLS_GOTTPREL, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
_bfd_mips_elf_generic_reloc, /* special_function */
"R_MICROMIPS_TLS_GOTTPREL", /* name */
FALSE, /* partial_inplace */
0, /* src_mask */
0x0000ffff, /* dst_mask */
FALSE), /* pcrel_offset */
EMPTY_HOWTO (167),
EMPTY_HOWTO (168),
/* TLS thread pointer offset. */
HOWTO (R_MICROMIPS_TLS_TPREL_HI16, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
_bfd_mips_elf_generic_reloc, /* special_function */
"R_MICROMIPS_TLS_TPREL_HI16", /* name */
FALSE, /* partial_inplace */
0, /* src_mask */
0x0000ffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* TLS thread pointer offset. */
HOWTO (R_MICROMIPS_TLS_TPREL_LO16, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
_bfd_mips_elf_generic_reloc, /* special_function */
"R_MICROMIPS_TLS_TPREL_LO16", /* name */
FALSE, /* partial_inplace */
0, /* src_mask */
0x0000ffff, /* dst_mask */
FALSE), /* pcrel_offset */
EMPTY_HOWTO (171),
/* GP- and PC-relative relocations. */
HOWTO (R_MICROMIPS_GPREL7_S2, /* type */
2, /* rightshift */
1, /* size (0 = byte, 1 = short, 2 = long) */
7, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
_bfd_mips_elf32_gprel16_reloc, /* special_function */
"R_MICROMIPS_GPREL7_S2", /* name */
FALSE, /* partial_inplace */
0, /* src_mask */
0x0000007f, /* dst_mask */
FALSE), /* pcrel_offset */
HOWTO (R_MICROMIPS_PC23_S2, /* type */
2, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
23, /* bitsize */
TRUE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
_bfd_mips_elf_generic_reloc, /* special_function */
"R_MICROMIPS_PC23_S2", /* name */
FALSE, /* partial_inplace */
0, /* src_mask */
0x007fffff, /* dst_mask */
TRUE), /* pcrel_offset */
};
/* GNU extension to record C++ vtable hierarchy */
@ -3291,6 +3611,21 @@ static const struct elf_reloc_map micromips_reloc_map[] =
{ BFD_RELOC_MICROMIPS_CALL_LO16, R_MICROMIPS_CALL_LO16 - R_MICROMIPS_min },
{ BFD_RELOC_MICROMIPS_SCN_DISP, R_MICROMIPS_SCN_DISP - R_MICROMIPS_min },
{ BFD_RELOC_MICROMIPS_JALR, R_MICROMIPS_JALR - R_MICROMIPS_min },
/* There is no BFD reloc for R_MICROMIPS_HI0_LO16. */
{ BFD_RELOC_MICROMIPS_TLS_GD, R_MICROMIPS_TLS_GD - R_MICROMIPS_min },
{ BFD_RELOC_MICROMIPS_TLS_LDM, R_MICROMIPS_TLS_LDM - R_MICROMIPS_min },
{ BFD_RELOC_MICROMIPS_TLS_DTPREL_HI16,
R_MICROMIPS_TLS_DTPREL_HI16 - R_MICROMIPS_min },
{ BFD_RELOC_MICROMIPS_TLS_DTPREL_LO16,
R_MICROMIPS_TLS_DTPREL_LO16 - R_MICROMIPS_min },
{ BFD_RELOC_MICROMIPS_TLS_GOTTPREL,
R_MICROMIPS_TLS_GOTTPREL - R_MICROMIPS_min },
{ BFD_RELOC_MICROMIPS_TLS_TPREL_HI16,
R_MICROMIPS_TLS_TPREL_HI16 - R_MICROMIPS_min },
{ BFD_RELOC_MICROMIPS_TLS_TPREL_LO16,
R_MICROMIPS_TLS_TPREL_LO16 - R_MICROMIPS_min },
/* There is no BFD reloc for R_MICROMIPS_GPREL7_S2. */
/* There is no BFD reloc for R_MICROMIPS_PC23_S2. */
};
/* Given a BFD reloc type, return a howto structure. */

View File

@ -1,3 +1,9 @@
2018-07-02 Maciej W. Rozycki <macro@mips.com>
* testsuite/gas/mips/elf-rel28-micromips-n32.d: New test.
* testsuite/gas/mips/elf-rel28-micromips-n64.d: New test.
* testsuite/gas/mips/mips.exp: Run the new tests.
2018-07-02 Thomas Preud'homme <thomas.preudhomme@arm.com>
* config/tc-arm.c (cpu_arch_ver): Use symbolic TAG_CPU_ARCH macros

View File

@ -0,0 +1,96 @@
#source: elf-rel28.s
#as: -march=from-abi -mmicromips -n32
#objdump: -dr
#name: MIPS ELF reloc 28 (microMIPS, n32)
.*: file format .*
Disassembly of section \.text:
.* <foo>:
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MICROMIPS_CALL_HI16 bar
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MICROMIPS_CALL_LO16 bar
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MICROMIPS_CALL16 bar
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MICROMIPS_GOT_DISP bar
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MICROMIPS_GOT_PAGE bar
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MICROMIPS_GOT_OFST bar
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MICROMIPS_GOT_HI16 bar
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MICROMIPS_GOT_LO16 bar
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MICROMIPS_GOT16 bar
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MICROMIPS_GPREL16 bar
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MIPS_16 bar
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MICROMIPS_HIGHEST bar
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MICROMIPS_HIGHER bar
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MICROMIPS_SUB bar
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MICROMIPS_TLS_GD bar
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MICROMIPS_TLS_LDM bar
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MICROMIPS_TLS_DTPREL_HI16 bar
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MICROMIPS_TLS_DTPREL_LO16 bar
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MICROMIPS_TLS_TPREL_HI16 bar
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MICROMIPS_TLS_TPREL_LO16 bar
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MICROMIPS_TLS_GOTTPREL bar
.*: d884 0000 sd a0,0\(a0\)
.*: R_MICROMIPS_CALL_HI16 bar
.*: d884 0000 sd a0,0\(a0\)
.*: R_MICROMIPS_CALL_LO16 bar
.*: d884 0000 sd a0,0\(a0\)
.*: R_MICROMIPS_CALL16 bar
.*: d884 0000 sd a0,0\(a0\)
.*: R_MICROMIPS_GOT_DISP bar
.*: d884 0000 sd a0,0\(a0\)
.*: R_MICROMIPS_GOT_PAGE bar
.*: d884 0000 sd a0,0\(a0\)
.*: R_MICROMIPS_GOT_OFST bar
.*: d884 0000 sd a0,0\(a0\)
.*: R_MICROMIPS_GOT_HI16 bar
.*: d884 0000 sd a0,0\(a0\)
.*: R_MICROMIPS_GOT_LO16 bar
.*: d884 0000 sd a0,0\(a0\)
.*: R_MICROMIPS_GOT16 bar
.*: d884 0000 sd a0,0\(a0\)
.*: R_MICROMIPS_GPREL16 bar
.*: d884 0000 sd a0,0\(a0\)
.*: R_MIPS_16 bar
.*: d884 0000 sd a0,0\(a0\)
.*: R_MICROMIPS_HIGHEST bar
.*: d884 0000 sd a0,0\(a0\)
.*: R_MICROMIPS_HIGHER bar
.*: d884 0000 sd a0,0\(a0\)
.*: R_MICROMIPS_SUB bar
.*: d884 0000 sd a0,0\(a0\)
.*: R_MICROMIPS_TLS_GD bar
.*: d884 0000 sd a0,0\(a0\)
.*: R_MICROMIPS_TLS_LDM bar
.*: d884 0000 sd a0,0\(a0\)
.*: R_MICROMIPS_TLS_DTPREL_HI16 bar
.*: d884 0000 sd a0,0\(a0\)
.*: R_MICROMIPS_TLS_DTPREL_LO16 bar
.*: d884 0000 sd a0,0\(a0\)
.*: R_MICROMIPS_TLS_TPREL_HI16 bar
.*: d884 0000 sd a0,0\(a0\)
.*: R_MICROMIPS_TLS_TPREL_LO16 bar
.*: d884 0000 sd a0,0\(a0\)
.*: R_MICROMIPS_TLS_GOTTPREL bar
\.\.\.

View File

@ -0,0 +1,180 @@
#source: elf-rel28.s
#as: -march=from-abi -mmicromips -64
#objdump: -dr
#name: MIPS ELF reloc 28 (microMIPS, n64)
.*: file format .*
Disassembly of section \.text:
.* <foo>:
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MICROMIPS_CALL_HI16 bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MICROMIPS_CALL_LO16 bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MICROMIPS_CALL16 bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MICROMIPS_GOT_DISP bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MICROMIPS_GOT_PAGE bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MICROMIPS_GOT_OFST bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MICROMIPS_GOT_HI16 bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MICROMIPS_GOT_LO16 bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MICROMIPS_GOT16 bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MICROMIPS_GPREL16 bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MIPS_16 bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MICROMIPS_HIGHEST bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MICROMIPS_HIGHER bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MICROMIPS_SUB bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MICROMIPS_TLS_GD bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MICROMIPS_TLS_LDM bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MICROMIPS_TLS_DTPREL_HI16 bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MICROMIPS_TLS_DTPREL_LO16 bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MICROMIPS_TLS_TPREL_HI16 bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MICROMIPS_TLS_TPREL_LO16 bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: dc84 0000 ld a0,0\(a0\)
.*: R_MICROMIPS_TLS_GOTTPREL bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: d884 0000 sd a0,0\(a0\)
.*: R_MICROMIPS_CALL_HI16 bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: d884 0000 sd a0,0\(a0\)
.*: R_MICROMIPS_CALL_LO16 bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: d884 0000 sd a0,0\(a0\)
.*: R_MICROMIPS_CALL16 bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: d884 0000 sd a0,0\(a0\)
.*: R_MICROMIPS_GOT_DISP bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: d884 0000 sd a0,0\(a0\)
.*: R_MICROMIPS_GOT_PAGE bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: d884 0000 sd a0,0\(a0\)
.*: R_MICROMIPS_GOT_OFST bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: d884 0000 sd a0,0\(a0\)
.*: R_MICROMIPS_GOT_HI16 bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: d884 0000 sd a0,0\(a0\)
.*: R_MICROMIPS_GOT_LO16 bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: d884 0000 sd a0,0\(a0\)
.*: R_MICROMIPS_GOT16 bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: d884 0000 sd a0,0\(a0\)
.*: R_MICROMIPS_GPREL16 bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: d884 0000 sd a0,0\(a0\)
.*: R_MIPS_16 bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: d884 0000 sd a0,0\(a0\)
.*: R_MICROMIPS_HIGHEST bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: d884 0000 sd a0,0\(a0\)
.*: R_MICROMIPS_HIGHER bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: d884 0000 sd a0,0\(a0\)
.*: R_MICROMIPS_SUB bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: d884 0000 sd a0,0\(a0\)
.*: R_MICROMIPS_TLS_GD bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: d884 0000 sd a0,0\(a0\)
.*: R_MICROMIPS_TLS_LDM bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: d884 0000 sd a0,0\(a0\)
.*: R_MICROMIPS_TLS_DTPREL_HI16 bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: d884 0000 sd a0,0\(a0\)
.*: R_MICROMIPS_TLS_DTPREL_LO16 bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: d884 0000 sd a0,0\(a0\)
.*: R_MICROMIPS_TLS_TPREL_HI16 bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: d884 0000 sd a0,0\(a0\)
.*: R_MICROMIPS_TLS_TPREL_LO16 bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
.*: d884 0000 sd a0,0\(a0\)
.*: R_MICROMIPS_TLS_GOTTPREL bar
.*: R_MIPS_NONE \*ABS\*
.*: R_MIPS_NONE \*ABS\*
\.\.\.

View File

@ -1221,7 +1221,9 @@ if { [istarget mips*-*-vxworks*] } {
if $has_newabi {
run_dump_test "elf-rel28-n32"
run_dump_test "elf-rel28-micromips-n32"
run_dump_test "elf-rel28-n64"
run_dump_test "elf-rel28-micromips-n64"
run_dump_test_arches "elf-rel29" [mips_arch_list_matching mips3]
}
run_list_test_arches "elf-rel30" "-32" [mips_arch_list_all]