2011-12-19 Chung-Lin Tang <cltang@codesourcery.com>
gas/ * config/tc-mips.c (mips_pseudo_table): Add tprelword/tpreldword entries. (mips16_percent_op): Add MIPS16 TLS relocation ops. (md_apply_fix): Add BFD_RELOC_MIPS16_TLS_* switch cases. (s_tls_rel_directive): Rename from s_dtprel_internal(). Abstract out directive string and reloc type as function parameters. Update comments. (s_dtprelword,s_dtpreldword): Change to use s_tls_rel_directive(). (s_tprelword,s_tpreldword): New functions. include/ * elf/mips.h (elf_mips_reloc_type): Add R_MIPS16_TLS_* entries. bfd/ * reloc.c (BFD_RELOC_MIPS16_TLS_GD,BFD_RELOC_MIPS16_TLS_LDM, BFD_RELOC_MIPS16_TLS_DTPREL_HI16,BFD_RELOC_MIPS16_TLS_DTPREL_LO16, BFD_RELOC_MIPS16_TLS_GOTTPREL,BFD_RELOC_MIPS16_TLS_TPREL_HI16, BFD_RELOC_MIPS16_TLS_TPREL_LO16): New relocations for MIPS16 TLS. * bfd-in2.h (bfd_reloc_code_real): Regenerate. * libbfd.h (bfd_reloc_code_real_names): Regenerate. * elf32-mips.c (elf_mips16_howto_table_rel): Add R_MIPS16_TLS_* entries. (mips16_reloc_map): Add BFD_RELOC_MIPS16_TLS_* to R_MIPS16_TLS_* mappings. * elfn32-mips.c (elf_mips16_howto_table_rel, elf_mips16_howto_table_rela): Add R_MIPS16_TLS_* entries. (mips16_reloc_map): Add BFD_RELOC_MIPS16_TLS_* to R_MIPS16_TLS_* mappings. * elf64-mips.c (mips16_elf64_howto_table_rel, mips16_elf64_howto_table_rela): Add R_MIPS16_TLS_* entries. (mips16_reloc_map): Add BFD_RELOC_MIPS16_TLS_* to R_MIPS16_TLS_* mappings. * elfxx-mips.c (TLS_RELOC_P,mips16_reloc_p, _bfd_mips_elf_check_relocs): Add cases for R_MIPS16_TLS_* relocations. (tls_gd_reloc_p): Add R_MIPS16_TLS_GD case. (tls_ldm_reloc_p): Add R_MIPS16_TLS_LDM case. (tls_gottprel_reloc_p): Add R_MIPS16_TLS_GOTTPREL case. (mips_elf_calculate_relocation): Add cases for R_MIPS16_TLS_*, R_MIPS_TLS_DTPREL32/64, and R_MIPS_TLS_TPREL32/64 relocations.
This commit is contained in:
parent
8f0c309a21
commit
d0f1368214
12 changed files with 727 additions and 21 deletions
|
@ -1,3 +1,31 @@
|
|||
2011-12-19 Chung-Lin Tang <cltang@codesourcery.com>
|
||||
|
||||
* reloc.c (BFD_RELOC_MIPS16_TLS_GD,BFD_RELOC_MIPS16_TLS_LDM,
|
||||
BFD_RELOC_MIPS16_TLS_DTPREL_HI16,BFD_RELOC_MIPS16_TLS_DTPREL_LO16,
|
||||
BFD_RELOC_MIPS16_TLS_GOTTPREL,BFD_RELOC_MIPS16_TLS_TPREL_HI16,
|
||||
BFD_RELOC_MIPS16_TLS_TPREL_LO16): New relocations for MIPS16 TLS.
|
||||
* bfd-in2.h (bfd_reloc_code_real): Regenerate.
|
||||
* libbfd.h (bfd_reloc_code_real_names): Regenerate.
|
||||
* elf32-mips.c (elf_mips16_howto_table_rel): Add R_MIPS16_TLS_*
|
||||
entries.
|
||||
(mips16_reloc_map): Add BFD_RELOC_MIPS16_TLS_* to R_MIPS16_TLS_*
|
||||
mappings.
|
||||
* elfn32-mips.c (elf_mips16_howto_table_rel,
|
||||
elf_mips16_howto_table_rela): Add R_MIPS16_TLS_* entries.
|
||||
(mips16_reloc_map): Add BFD_RELOC_MIPS16_TLS_* to R_MIPS16_TLS_*
|
||||
mappings.
|
||||
* elf64-mips.c (mips16_elf64_howto_table_rel,
|
||||
mips16_elf64_howto_table_rela): Add R_MIPS16_TLS_* entries.
|
||||
(mips16_reloc_map): Add BFD_RELOC_MIPS16_TLS_* to R_MIPS16_TLS_*
|
||||
mappings.
|
||||
* elfxx-mips.c (TLS_RELOC_P,mips16_reloc_p,
|
||||
_bfd_mips_elf_check_relocs): Add cases for R_MIPS16_TLS_* relocations.
|
||||
(tls_gd_reloc_p): Add R_MIPS16_TLS_GD case.
|
||||
(tls_ldm_reloc_p): Add R_MIPS16_TLS_LDM case.
|
||||
(tls_gottprel_reloc_p): Add R_MIPS16_TLS_GOTTPREL case.
|
||||
(mips_elf_calculate_relocation): Add cases for R_MIPS16_TLS_*,
|
||||
R_MIPS_TLS_DTPREL32/64, and R_MIPS_TLS_TPREL32/64 relocations.
|
||||
|
||||
2011-12-19 Chung-Lin Tang <cltang@codesourcery.com>
|
||||
Catherine Moore <clm@codesourcery.com>
|
||||
Sandra Loosemore <sandra@codesourcery.com>
|
||||
|
|
|
@ -2786,6 +2786,15 @@ to compensate for the borrow when the low bits are added. */
|
|||
/* MIPS16 low 16 bits. */
|
||||
BFD_RELOC_MIPS16_LO16,
|
||||
|
||||
/* MIPS16 TLS relocations */
|
||||
BFD_RELOC_MIPS16_TLS_GD,
|
||||
BFD_RELOC_MIPS16_TLS_LDM,
|
||||
BFD_RELOC_MIPS16_TLS_DTPREL_HI16,
|
||||
BFD_RELOC_MIPS16_TLS_DTPREL_LO16,
|
||||
BFD_RELOC_MIPS16_TLS_GOTTPREL,
|
||||
BFD_RELOC_MIPS16_TLS_TPREL_HI16,
|
||||
BFD_RELOC_MIPS16_TLS_TPREL_LO16,
|
||||
|
||||
/* Relocation against a MIPS literal section. */
|
||||
BFD_RELOC_MIPS_LITERAL,
|
||||
BFD_RELOC_MICROMIPS_LITERAL,
|
||||
|
|
114
bfd/elf32-mips.c
114
bfd/elf32-mips.c
|
@ -830,6 +830,111 @@ static reloc_howto_type elf_mips16_howto_table_rel[] =
|
|||
0x0000ffff, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* MIPS16 TLS general dynamic variable reference. */
|
||||
HOWTO (R_MIPS16_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_MIPS16_TLS_GD", /* name */
|
||||
TRUE, /* partial_inplace */
|
||||
0x0000ffff, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* MIPS16 TLS local dynamic variable reference. */
|
||||
HOWTO (R_MIPS16_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_MIPS16_TLS_LDM", /* name */
|
||||
TRUE, /* partial_inplace */
|
||||
0x0000ffff, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* MIPS16 TLS local dynamic offset. */
|
||||
HOWTO (R_MIPS16_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_MIPS16_TLS_DTPREL_HI16", /* name */
|
||||
TRUE, /* partial_inplace */
|
||||
0x0000ffff, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* MIPS16 TLS local dynamic offset. */
|
||||
HOWTO (R_MIPS16_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_MIPS16_TLS_DTPREL_LO16", /* name */
|
||||
TRUE, /* partial_inplace */
|
||||
0x0000ffff, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* MIPS16 TLS thread pointer offset. */
|
||||
HOWTO (R_MIPS16_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_MIPS16_TLS_GOTTPREL", /* name */
|
||||
TRUE, /* partial_inplace */
|
||||
0x0000ffff, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* MIPS16 TLS thread pointer offset. */
|
||||
HOWTO (R_MIPS16_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_MIPS16_TLS_TPREL_HI16", /* name */
|
||||
TRUE, /* partial_inplace */
|
||||
0x0000ffff, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* MIPS16 TLS thread pointer offset. */
|
||||
HOWTO (R_MIPS16_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_MIPS16_TLS_TPREL_LO16", /* name */
|
||||
TRUE, /* partial_inplace */
|
||||
0x0000ffff, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
};
|
||||
|
||||
static reloc_howto_type elf_micromips_howto_table_rel[] =
|
||||
|
@ -1796,6 +1901,15 @@ static const struct elf_reloc_map mips16_reloc_map[] =
|
|||
{ BFD_RELOC_MIPS16_CALL16, R_MIPS16_CALL16 - R_MIPS16_min },
|
||||
{ BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
|
||||
{ BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
|
||||
{ BFD_RELOC_MIPS16_TLS_GD, R_MIPS16_TLS_GD - R_MIPS16_min },
|
||||
{ BFD_RELOC_MIPS16_TLS_LDM, R_MIPS16_TLS_LDM - R_MIPS16_min },
|
||||
{ BFD_RELOC_MIPS16_TLS_DTPREL_HI16,
|
||||
R_MIPS16_TLS_DTPREL_HI16 - R_MIPS16_min },
|
||||
{ BFD_RELOC_MIPS16_TLS_DTPREL_LO16,
|
||||
R_MIPS16_TLS_DTPREL_LO16 - R_MIPS16_min },
|
||||
{ BFD_RELOC_MIPS16_TLS_GOTTPREL, R_MIPS16_TLS_GOTTPREL - R_MIPS16_min },
|
||||
{ BFD_RELOC_MIPS16_TLS_TPREL_HI16, R_MIPS16_TLS_TPREL_HI16 - R_MIPS16_min },
|
||||
{ BFD_RELOC_MIPS16_TLS_TPREL_LO16, R_MIPS16_TLS_TPREL_LO16 - R_MIPS16_min }
|
||||
};
|
||||
|
||||
static const struct elf_reloc_map micromips_reloc_map[] =
|
||||
|
|
219
bfd/elf64-mips.c
219
bfd/elf64-mips.c
|
@ -1590,6 +1590,111 @@ static reloc_howto_type mips16_elf64_howto_table_rel[] =
|
|||
0x0000ffff, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* MIPS16 TLS general dynamic variable reference. */
|
||||
HOWTO (R_MIPS16_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_MIPS16_TLS_GD", /* name */
|
||||
TRUE, /* partial_inplace */
|
||||
0x0000ffff, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* MIPS16 TLS local dynamic variable reference. */
|
||||
HOWTO (R_MIPS16_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_MIPS16_TLS_LDM", /* name */
|
||||
TRUE, /* partial_inplace */
|
||||
0x0000ffff, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* MIPS16 TLS local dynamic offset. */
|
||||
HOWTO (R_MIPS16_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_MIPS16_TLS_DTPREL_HI16", /* name */
|
||||
TRUE, /* partial_inplace */
|
||||
0x0000ffff, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* MIPS16 TLS local dynamic offset. */
|
||||
HOWTO (R_MIPS16_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_MIPS16_TLS_DTPREL_LO16", /* name */
|
||||
TRUE, /* partial_inplace */
|
||||
0x0000ffff, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* MIPS16 TLS thread pointer offset. */
|
||||
HOWTO (R_MIPS16_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_MIPS16_TLS_GOTTPREL", /* name */
|
||||
TRUE, /* partial_inplace */
|
||||
0x0000ffff, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* MIPS16 TLS thread pointer offset. */
|
||||
HOWTO (R_MIPS16_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_MIPS16_TLS_TPREL_HI16", /* name */
|
||||
TRUE, /* partial_inplace */
|
||||
0x0000ffff, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* MIPS16 TLS thread pointer offset. */
|
||||
HOWTO (R_MIPS16_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_MIPS16_TLS_TPREL_LO16", /* name */
|
||||
TRUE, /* partial_inplace */
|
||||
0x0000ffff, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
};
|
||||
|
||||
static reloc_howto_type mips16_elf64_howto_table_rela[] =
|
||||
|
@ -1686,6 +1791,111 @@ static reloc_howto_type mips16_elf64_howto_table_rela[] =
|
|||
0, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* MIPS16 TLS general dynamic variable reference. */
|
||||
HOWTO (R_MIPS16_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_MIPS16_TLS_GD", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0x0000ffff, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* MIPS16 TLS local dynamic variable reference. */
|
||||
HOWTO (R_MIPS16_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_MIPS16_TLS_LDM", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0x0000ffff, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* MIPS16 TLS local dynamic offset. */
|
||||
HOWTO (R_MIPS16_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_MIPS16_TLS_DTPREL_HI16", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0x0000ffff, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* MIPS16 TLS local dynamic offset. */
|
||||
HOWTO (R_MIPS16_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_MIPS16_TLS_DTPREL_LO16", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0x0000ffff, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* MIPS16 TLS thread pointer offset. */
|
||||
HOWTO (R_MIPS16_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_MIPS16_TLS_GOTTPREL", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0x0000ffff, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* MIPS16 TLS thread pointer offset. */
|
||||
HOWTO (R_MIPS16_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_MIPS16_TLS_TPREL_HI16", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0x0000ffff, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* MIPS16 TLS thread pointer offset. */
|
||||
HOWTO (R_MIPS16_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_MIPS16_TLS_TPREL_LO16", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0x0000ffff, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
};
|
||||
|
||||
static reloc_howto_type micromips_elf64_howto_table_rel[] =
|
||||
|
@ -2908,6 +3118,15 @@ static const struct elf_reloc_map mips16_reloc_map[] =
|
|||
{ BFD_RELOC_MIPS16_CALL16, R_MIPS16_CALL16 - R_MIPS16_min },
|
||||
{ BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
|
||||
{ BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
|
||||
{ BFD_RELOC_MIPS16_TLS_GD, R_MIPS16_TLS_GD - R_MIPS16_min },
|
||||
{ BFD_RELOC_MIPS16_TLS_LDM, R_MIPS16_TLS_LDM - R_MIPS16_min },
|
||||
{ BFD_RELOC_MIPS16_TLS_DTPREL_HI16,
|
||||
R_MIPS16_TLS_DTPREL_HI16 - R_MIPS16_min },
|
||||
{ BFD_RELOC_MIPS16_TLS_DTPREL_LO16,
|
||||
R_MIPS16_TLS_DTPREL_LO16 - R_MIPS16_min },
|
||||
{ BFD_RELOC_MIPS16_TLS_GOTTPREL, R_MIPS16_TLS_GOTTPREL - R_MIPS16_min },
|
||||
{ BFD_RELOC_MIPS16_TLS_TPREL_HI16, R_MIPS16_TLS_TPREL_HI16 - R_MIPS16_min },
|
||||
{ BFD_RELOC_MIPS16_TLS_TPREL_LO16, R_MIPS16_TLS_TPREL_LO16 - R_MIPS16_min }
|
||||
};
|
||||
|
||||
static const struct elf_reloc_map micromips_reloc_map[] =
|
||||
|
|
|
@ -1555,6 +1555,111 @@ static reloc_howto_type elf_mips16_howto_table_rel[] =
|
|||
0x0000ffff, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* MIPS16 TLS general dynamic variable reference. */
|
||||
HOWTO (R_MIPS16_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_MIPS16_TLS_GD", /* name */
|
||||
TRUE, /* partial_inplace */
|
||||
0x0000ffff, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* MIPS16 TLS local dynamic variable reference. */
|
||||
HOWTO (R_MIPS16_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_MIPS16_TLS_LDM", /* name */
|
||||
TRUE, /* partial_inplace */
|
||||
0x0000ffff, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* MIPS16 TLS local dynamic offset. */
|
||||
HOWTO (R_MIPS16_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_MIPS16_TLS_DTPREL_HI16", /* name */
|
||||
TRUE, /* partial_inplace */
|
||||
0x0000ffff, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* MIPS16 TLS local dynamic offset. */
|
||||
HOWTO (R_MIPS16_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_MIPS16_TLS_DTPREL_LO16", /* name */
|
||||
TRUE, /* partial_inplace */
|
||||
0x0000ffff, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* MIPS16 TLS thread pointer offset. */
|
||||
HOWTO (R_MIPS16_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_MIPS16_TLS_GOTTPREL", /* name */
|
||||
TRUE, /* partial_inplace */
|
||||
0x0000ffff, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* MIPS16 TLS thread pointer offset. */
|
||||
HOWTO (R_MIPS16_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_MIPS16_TLS_TPREL_HI16", /* name */
|
||||
TRUE, /* partial_inplace */
|
||||
0x0000ffff, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* MIPS16 TLS thread pointer offset. */
|
||||
HOWTO (R_MIPS16_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_MIPS16_TLS_TPREL_LO16", /* name */
|
||||
TRUE, /* partial_inplace */
|
||||
0x0000ffff, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
};
|
||||
|
||||
static reloc_howto_type elf_mips16_howto_table_rela[] =
|
||||
|
@ -1651,6 +1756,111 @@ static reloc_howto_type elf_mips16_howto_table_rela[] =
|
|||
0, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* MIPS16 TLS general dynamic variable reference. */
|
||||
HOWTO (R_MIPS16_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_MIPS16_TLS_GD", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0x0000ffff, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* MIPS16 TLS local dynamic variable reference. */
|
||||
HOWTO (R_MIPS16_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_MIPS16_TLS_LDM", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0x0000ffff, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* MIPS16 TLS local dynamic offset. */
|
||||
HOWTO (R_MIPS16_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_MIPS16_TLS_DTPREL_HI16", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0x0000ffff, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* MIPS16 TLS local dynamic offset. */
|
||||
HOWTO (R_MIPS16_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_MIPS16_TLS_DTPREL_LO16", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0x0000ffff, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* MIPS16 TLS thread pointer offset. */
|
||||
HOWTO (R_MIPS16_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_MIPS16_TLS_GOTTPREL", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0x0000ffff, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* MIPS16 TLS thread pointer offset. */
|
||||
HOWTO (R_MIPS16_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_MIPS16_TLS_TPREL_HI16", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0x0000ffff, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* MIPS16 TLS thread pointer offset. */
|
||||
HOWTO (R_MIPS16_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_MIPS16_TLS_TPREL_LO16", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0x0000ffff, /* src_mask */
|
||||
0x0000ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
};
|
||||
|
||||
static reloc_howto_type elf_micromips_howto_table_rel[] =
|
||||
|
@ -2724,6 +2934,15 @@ static const struct elf_reloc_map mips16_reloc_map[] =
|
|||
{ BFD_RELOC_MIPS16_CALL16, R_MIPS16_CALL16 - R_MIPS16_min },
|
||||
{ BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
|
||||
{ BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
|
||||
{ BFD_RELOC_MIPS16_TLS_GD, R_MIPS16_TLS_GD - R_MIPS16_min },
|
||||
{ BFD_RELOC_MIPS16_TLS_LDM, R_MIPS16_TLS_LDM - R_MIPS16_min },
|
||||
{ BFD_RELOC_MIPS16_TLS_DTPREL_HI16,
|
||||
R_MIPS16_TLS_DTPREL_HI16 - R_MIPS16_min },
|
||||
{ BFD_RELOC_MIPS16_TLS_DTPREL_LO16,
|
||||
R_MIPS16_TLS_DTPREL_LO16 - R_MIPS16_min },
|
||||
{ BFD_RELOC_MIPS16_TLS_GOTTPREL, R_MIPS16_TLS_GOTTPREL - R_MIPS16_min },
|
||||
{ BFD_RELOC_MIPS16_TLS_TPREL_HI16, R_MIPS16_TLS_TPREL_HI16 - R_MIPS16_min },
|
||||
{ BFD_RELOC_MIPS16_TLS_TPREL_LO16, R_MIPS16_TLS_TPREL_LO16 - R_MIPS16_min }
|
||||
};
|
||||
|
||||
static const struct elf_reloc_map micromips_reloc_map[] =
|
||||
|
|
|
@ -529,6 +529,13 @@ struct mips_htab_traverse_info
|
|||
|| r_type == R_MIPS_TLS_TPREL64 \
|
||||
|| r_type == R_MIPS_TLS_TPREL_HI16 \
|
||||
|| r_type == R_MIPS_TLS_TPREL_LO16 \
|
||||
|| r_type == R_MIPS16_TLS_GD \
|
||||
|| r_type == R_MIPS16_TLS_LDM \
|
||||
|| r_type == R_MIPS16_TLS_DTPREL_HI16 \
|
||||
|| r_type == R_MIPS16_TLS_DTPREL_LO16 \
|
||||
|| r_type == R_MIPS16_TLS_GOTTPREL \
|
||||
|| r_type == R_MIPS16_TLS_TPREL_HI16 \
|
||||
|| r_type == R_MIPS16_TLS_TPREL_LO16 \
|
||||
|| r_type == R_MICROMIPS_TLS_GD \
|
||||
|| r_type == R_MICROMIPS_TLS_LDM \
|
||||
|| r_type == R_MICROMIPS_TLS_DTPREL_HI16 \
|
||||
|
@ -1885,6 +1892,13 @@ mips16_reloc_p (int r_type)
|
|||
case R_MIPS16_CALL16:
|
||||
case R_MIPS16_HI16:
|
||||
case R_MIPS16_LO16:
|
||||
case R_MIPS16_TLS_GD:
|
||||
case R_MIPS16_TLS_LDM:
|
||||
case R_MIPS16_TLS_DTPREL_HI16:
|
||||
case R_MIPS16_TLS_DTPREL_LO16:
|
||||
case R_MIPS16_TLS_GOTTPREL:
|
||||
case R_MIPS16_TLS_TPREL_HI16:
|
||||
case R_MIPS16_TLS_TPREL_LO16:
|
||||
return TRUE;
|
||||
|
||||
default:
|
||||
|
@ -2012,19 +2026,25 @@ micromips_branch_reloc_p (int r_type)
|
|||
static inline bfd_boolean
|
||||
tls_gd_reloc_p (unsigned int r_type)
|
||||
{
|
||||
return r_type == R_MIPS_TLS_GD || r_type == R_MICROMIPS_TLS_GD;
|
||||
return (r_type == R_MIPS_TLS_GD
|
||||
|| r_type == R_MIPS16_TLS_GD
|
||||
|| r_type == R_MICROMIPS_TLS_GD);
|
||||
}
|
||||
|
||||
static inline bfd_boolean
|
||||
tls_ldm_reloc_p (unsigned int r_type)
|
||||
{
|
||||
return r_type == R_MIPS_TLS_LDM || r_type == R_MICROMIPS_TLS_LDM;
|
||||
return (r_type == R_MIPS_TLS_LDM
|
||||
|| r_type == R_MIPS16_TLS_LDM
|
||||
|| r_type == R_MICROMIPS_TLS_LDM);
|
||||
}
|
||||
|
||||
static inline bfd_boolean
|
||||
tls_gottprel_reloc_p (unsigned int r_type)
|
||||
{
|
||||
return r_type == R_MIPS_TLS_GOTTPREL || r_type == R_MICROMIPS_TLS_GOTTPREL;
|
||||
return (r_type == R_MIPS_TLS_GOTTPREL
|
||||
|| r_type == R_MIPS16_TLS_GOTTPREL
|
||||
|| r_type == R_MICROMIPS_TLS_GOTTPREL);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -5361,6 +5381,9 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
|
|||
case R_MIPS_TLS_GD:
|
||||
case R_MIPS_TLS_GOTTPREL:
|
||||
case R_MIPS_TLS_LDM:
|
||||
case R_MIPS16_TLS_GD:
|
||||
case R_MIPS16_TLS_GOTTPREL:
|
||||
case R_MIPS16_TLS_LDM:
|
||||
case R_MICROMIPS_TLS_GD:
|
||||
case R_MICROMIPS_TLS_GOTTPREL:
|
||||
case R_MICROMIPS_TLS_LDM:
|
||||
|
@ -5530,6 +5553,7 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
|
|||
break;
|
||||
|
||||
case R_MIPS_TLS_DTPREL_HI16:
|
||||
case R_MIPS16_TLS_DTPREL_HI16:
|
||||
case R_MICROMIPS_TLS_DTPREL_HI16:
|
||||
value = (mips_elf_high (addend + symbol - dtprel_base (info))
|
||||
& howto->dst_mask);
|
||||
|
@ -5538,17 +5562,22 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
|
|||
case R_MIPS_TLS_DTPREL_LO16:
|
||||
case R_MIPS_TLS_DTPREL32:
|
||||
case R_MIPS_TLS_DTPREL64:
|
||||
case R_MIPS16_TLS_DTPREL_LO16:
|
||||
case R_MICROMIPS_TLS_DTPREL_LO16:
|
||||
value = (symbol + addend - dtprel_base (info)) & howto->dst_mask;
|
||||
break;
|
||||
|
||||
case R_MIPS_TLS_TPREL_HI16:
|
||||
case R_MIPS16_TLS_TPREL_HI16:
|
||||
case R_MICROMIPS_TLS_TPREL_HI16:
|
||||
value = (mips_elf_high (addend + symbol - tprel_base (info))
|
||||
& howto->dst_mask);
|
||||
break;
|
||||
|
||||
case R_MIPS_TLS_TPREL_LO16:
|
||||
case R_MIPS_TLS_TPREL32:
|
||||
case R_MIPS_TLS_TPREL64:
|
||||
case R_MIPS16_TLS_TPREL_LO16:
|
||||
case R_MICROMIPS_TLS_TPREL_LO16:
|
||||
value = (symbol + addend - tprel_base (info)) & howto->dst_mask;
|
||||
break;
|
||||
|
@ -5681,6 +5710,9 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
|
|||
case R_MIPS_TLS_GOTTPREL:
|
||||
case R_MIPS_TLS_LDM:
|
||||
case R_MIPS_GOT_DISP:
|
||||
case R_MIPS16_TLS_GD:
|
||||
case R_MIPS16_TLS_GOTTPREL:
|
||||
case R_MIPS16_TLS_LDM:
|
||||
case R_MICROMIPS_TLS_GD:
|
||||
case R_MICROMIPS_TLS_GOTTPREL:
|
||||
case R_MICROMIPS_TLS_LDM:
|
||||
|
@ -7814,8 +7846,6 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
|||
can_make_dynamic_p = FALSE;
|
||||
switch (r_type)
|
||||
{
|
||||
case R_MIPS16_GOT16:
|
||||
case R_MIPS16_CALL16:
|
||||
case R_MIPS_GOT16:
|
||||
case R_MIPS_CALL16:
|
||||
case R_MIPS_CALL_HI16:
|
||||
|
@ -7828,6 +7858,11 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
|||
case R_MIPS_TLS_GOTTPREL:
|
||||
case R_MIPS_TLS_GD:
|
||||
case R_MIPS_TLS_LDM:
|
||||
case R_MIPS16_GOT16:
|
||||
case R_MIPS16_CALL16:
|
||||
case R_MIPS16_TLS_GOTTPREL:
|
||||
case R_MIPS16_TLS_GD:
|
||||
case R_MIPS16_TLS_LDM:
|
||||
case R_MICROMIPS_GOT16:
|
||||
case R_MICROMIPS_CALL16:
|
||||
case R_MICROMIPS_CALL_HI16:
|
||||
|
@ -8064,12 +8099,14 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
|||
break;
|
||||
|
||||
case R_MIPS_TLS_GOTTPREL:
|
||||
case R_MIPS16_TLS_GOTTPREL:
|
||||
case R_MICROMIPS_TLS_GOTTPREL:
|
||||
if (info->shared)
|
||||
info->flags |= DF_STATIC_TLS;
|
||||
/* Fall through */
|
||||
|
||||
case R_MIPS_TLS_LDM:
|
||||
case R_MIPS16_TLS_LDM:
|
||||
case R_MICROMIPS_TLS_LDM:
|
||||
if (tls_ldm_reloc_p (r_type))
|
||||
{
|
||||
|
@ -8079,6 +8116,7 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
|||
/* Fall through */
|
||||
|
||||
case R_MIPS_TLS_GD:
|
||||
case R_MIPS16_TLS_GD:
|
||||
case R_MICROMIPS_TLS_GD:
|
||||
/* This symbol requires a global offset table entry, or two
|
||||
for TLS GD relocations. */
|
||||
|
|
|
@ -1090,6 +1090,13 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
|
|||
"BFD_RELOC_MIPS16_HI16",
|
||||
"BFD_RELOC_MIPS16_HI16_S",
|
||||
"BFD_RELOC_MIPS16_LO16",
|
||||
"BFD_RELOC_MIPS16_TLS_GD",
|
||||
"BFD_RELOC_MIPS16_TLS_LDM",
|
||||
"BFD_RELOC_MIPS16_TLS_DTPREL_HI16",
|
||||
"BFD_RELOC_MIPS16_TLS_DTPREL_LO16",
|
||||
"BFD_RELOC_MIPS16_TLS_GOTTPREL",
|
||||
"BFD_RELOC_MIPS16_TLS_TPREL_HI16",
|
||||
"BFD_RELOC_MIPS16_TLS_TPREL_LO16",
|
||||
"BFD_RELOC_MIPS_LITERAL",
|
||||
"BFD_RELOC_MICROMIPS_LITERAL",
|
||||
"BFD_RELOC_MICROMIPS_7_PCREL_S1",
|
||||
|
|
17
bfd/reloc.c
17
bfd/reloc.c
|
@ -2246,6 +2246,23 @@ ENUM
|
|||
ENUMDOC
|
||||
MIPS16 low 16 bits.
|
||||
|
||||
ENUM
|
||||
BFD_RELOC_MIPS16_TLS_GD
|
||||
ENUMX
|
||||
BFD_RELOC_MIPS16_TLS_LDM
|
||||
ENUMX
|
||||
BFD_RELOC_MIPS16_TLS_DTPREL_HI16
|
||||
ENUMX
|
||||
BFD_RELOC_MIPS16_TLS_DTPREL_LO16
|
||||
ENUMX
|
||||
BFD_RELOC_MIPS16_TLS_GOTTPREL
|
||||
ENUMX
|
||||
BFD_RELOC_MIPS16_TLS_TPREL_HI16
|
||||
ENUMX
|
||||
BFD_RELOC_MIPS16_TLS_TPREL_LO16
|
||||
ENUMDOC
|
||||
MIPS16 TLS relocations
|
||||
|
||||
ENUM
|
||||
BFD_RELOC_MIPS_LITERAL
|
||||
ENUMX
|
||||
|
|
|
@ -1,3 +1,15 @@
|
|||
2011-12-19 Chung-Lin Tang <cltang@codesourcery.com>
|
||||
|
||||
* config/tc-mips.c (mips_pseudo_table): Add tprelword/tpreldword
|
||||
entries.
|
||||
(mips16_percent_op): Add MIPS16 TLS relocation ops.
|
||||
(md_apply_fix): Add BFD_RELOC_MIPS16_TLS_* switch cases.
|
||||
(s_tls_rel_directive): Rename from s_dtprel_internal(). Abstract out
|
||||
directive string and reloc type as function parameters. Update
|
||||
comments.
|
||||
(s_dtprelword,s_dtpreldword): Change to use s_tls_rel_directive().
|
||||
(s_tprelword,s_tpreldword): New functions.
|
||||
|
||||
2011-12-15 Tristan Gingold <gingold@adacore.com>
|
||||
|
||||
* config/obj-macho.c (obj_mach_o_fileprop): Fix typo.
|
||||
|
|
|
@ -1356,6 +1356,8 @@ static void s_cprestore (int);
|
|||
static void s_cpreturn (int);
|
||||
static void s_dtprelword (int);
|
||||
static void s_dtpreldword (int);
|
||||
static void s_tprelword (int);
|
||||
static void s_tpreldword (int);
|
||||
static void s_gpvalue (int);
|
||||
static void s_gpword (int);
|
||||
static void s_gpdword (int);
|
||||
|
@ -1435,6 +1437,8 @@ static const pseudo_typeS mips_pseudo_table[] =
|
|||
{"cpreturn", s_cpreturn, 0},
|
||||
{"dtprelword", s_dtprelword, 0},
|
||||
{"dtpreldword", s_dtpreldword, 0},
|
||||
{"tprelword", s_tprelword, 0},
|
||||
{"tpreldword", s_tpreldword, 0},
|
||||
{"gpvalue", s_gpvalue, 0},
|
||||
{"gpword", s_gpword, 0},
|
||||
{"gpdword", s_gpdword, 0},
|
||||
|
@ -14073,7 +14077,14 @@ static const struct percent_op_match mips16_percent_op[] =
|
|||
{"%gprel", BFD_RELOC_MIPS16_GPREL},
|
||||
{"%got", BFD_RELOC_MIPS16_GOT16},
|
||||
{"%call16", BFD_RELOC_MIPS16_CALL16},
|
||||
{"%hi", BFD_RELOC_MIPS16_HI16_S}
|
||||
{"%hi", BFD_RELOC_MIPS16_HI16_S},
|
||||
{"%tlsgd", BFD_RELOC_MIPS16_TLS_GD},
|
||||
{"%tlsldm", BFD_RELOC_MIPS16_TLS_LDM},
|
||||
{"%dtprel_hi", BFD_RELOC_MIPS16_TLS_DTPREL_HI16},
|
||||
{"%dtprel_lo", BFD_RELOC_MIPS16_TLS_DTPREL_LO16},
|
||||
{"%tprel_hi", BFD_RELOC_MIPS16_TLS_TPREL_HI16},
|
||||
{"%tprel_lo", BFD_RELOC_MIPS16_TLS_TPREL_LO16},
|
||||
{"%gottprel", BFD_RELOC_MIPS16_TLS_GOTTPREL}
|
||||
};
|
||||
|
||||
|
||||
|
@ -15402,6 +15413,8 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
|
|||
case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
|
||||
case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
|
||||
case BFD_RELOC_MIPS_TLS_GOTTPREL:
|
||||
case BFD_RELOC_MIPS_TLS_TPREL32:
|
||||
case BFD_RELOC_MIPS_TLS_TPREL64:
|
||||
case BFD_RELOC_MIPS_TLS_TPREL_HI16:
|
||||
case BFD_RELOC_MIPS_TLS_TPREL_LO16:
|
||||
case BFD_RELOC_MICROMIPS_TLS_GD:
|
||||
|
@ -15411,6 +15424,13 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
|
|||
case BFD_RELOC_MICROMIPS_TLS_GOTTPREL:
|
||||
case BFD_RELOC_MICROMIPS_TLS_TPREL_HI16:
|
||||
case BFD_RELOC_MICROMIPS_TLS_TPREL_LO16:
|
||||
case BFD_RELOC_MIPS16_TLS_GD:
|
||||
case BFD_RELOC_MIPS16_TLS_LDM:
|
||||
case BFD_RELOC_MIPS16_TLS_DTPREL_HI16:
|
||||
case BFD_RELOC_MIPS16_TLS_DTPREL_LO16:
|
||||
case BFD_RELOC_MIPS16_TLS_GOTTPREL:
|
||||
case BFD_RELOC_MIPS16_TLS_TPREL_HI16:
|
||||
case BFD_RELOC_MIPS16_TLS_TPREL_LO16:
|
||||
S_SET_THREAD_LOCAL (fixP->fx_addsy);
|
||||
/* fall through */
|
||||
|
||||
|
@ -16580,12 +16600,14 @@ s_cpreturn (int ignore ATTRIBUTE_UNUSED)
|
|||
demand_empty_rest_of_line ();
|
||||
}
|
||||
|
||||
/* Handle the .dtprelword and .dtpreldword pseudo-ops. They generate
|
||||
a 32-bit or 64-bit DTP-relative relocation (BYTES says which) for
|
||||
use in DWARF debug information. */
|
||||
/* Handle a .dtprelword, .dtpreldword, .tprelword, or .tpreldword
|
||||
pseudo-op; DIRSTR says which. The pseudo-op generates a BYTES-size
|
||||
DTP- or TP-relative relocation of type RTYPE, for use in either DWARF
|
||||
debug information or MIPS16 TLS. */
|
||||
|
||||
static void
|
||||
s_dtprel_internal (size_t bytes)
|
||||
s_tls_rel_directive (const size_t bytes, const char *dirstr,
|
||||
bfd_reloc_code_real_type rtype)
|
||||
{
|
||||
expressionS ex;
|
||||
char *p;
|
||||
|
@ -16594,19 +16616,13 @@ s_dtprel_internal (size_t bytes)
|
|||
|
||||
if (ex.X_op != O_symbol)
|
||||
{
|
||||
as_bad (_("Unsupported use of %s"), (bytes == 8
|
||||
? ".dtpreldword"
|
||||
: ".dtprelword"));
|
||||
as_bad (_("Unsupported use of %s"), dirstr);
|
||||
ignore_rest_of_line ();
|
||||
}
|
||||
|
||||
p = frag_more (bytes);
|
||||
md_number_to_chars (p, 0, bytes);
|
||||
fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE,
|
||||
(bytes == 8
|
||||
? BFD_RELOC_MIPS_TLS_DTPREL64
|
||||
: BFD_RELOC_MIPS_TLS_DTPREL32));
|
||||
|
||||
fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE, rtype);
|
||||
demand_empty_rest_of_line ();
|
||||
}
|
||||
|
||||
|
@ -16615,7 +16631,7 @@ s_dtprel_internal (size_t bytes)
|
|||
static void
|
||||
s_dtprelword (int ignore ATTRIBUTE_UNUSED)
|
||||
{
|
||||
s_dtprel_internal (4);
|
||||
s_tls_rel_directive (4, ".dtprelword", BFD_RELOC_MIPS_TLS_DTPREL32);
|
||||
}
|
||||
|
||||
/* Handle .dtpreldword. */
|
||||
|
@ -16623,7 +16639,23 @@ s_dtprelword (int ignore ATTRIBUTE_UNUSED)
|
|||
static void
|
||||
s_dtpreldword (int ignore ATTRIBUTE_UNUSED)
|
||||
{
|
||||
s_dtprel_internal (8);
|
||||
s_tls_rel_directive (8, ".dtpreldword", BFD_RELOC_MIPS_TLS_DTPREL64);
|
||||
}
|
||||
|
||||
/* Handle .tprelword. */
|
||||
|
||||
static void
|
||||
s_tprelword (int ignore ATTRIBUTE_UNUSED)
|
||||
{
|
||||
s_tls_rel_directive (4, ".tprelword", BFD_RELOC_MIPS_TLS_TPREL32);
|
||||
}
|
||||
|
||||
/* Handle .tpreldword. */
|
||||
|
||||
static void
|
||||
s_tpreldword (int ignore ATTRIBUTE_UNUSED)
|
||||
{
|
||||
s_tls_rel_directive (8, ".tpreldword", BFD_RELOC_MIPS_TLS_TPREL64);
|
||||
}
|
||||
|
||||
/* Handle the .gpvalue pseudo-op. This is used when generating NewABI PIC
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2011-12-19 Chung-Lin Tang <cltang@codesourcery.com>
|
||||
|
||||
* elf/mips.h (elf_mips_reloc_type): Add R_MIPS16_TLS_* entries.
|
||||
|
||||
2011-12-14 Iain Sandoe <iains@gcc.gnu.org>
|
||||
|
||||
* mach-o/loader.h (bfd_mach_o_section_type): define
|
||||
|
|
|
@ -98,7 +98,14 @@ START_RELOC_NUMBERS (elf_mips_reloc_type)
|
|||
RELOC_NUMBER (R_MIPS16_CALL16, 103)
|
||||
RELOC_NUMBER (R_MIPS16_HI16, 104)
|
||||
RELOC_NUMBER (R_MIPS16_LO16, 105)
|
||||
FAKE_RELOC (R_MIPS16_max, 106)
|
||||
RELOC_NUMBER (R_MIPS16_TLS_GD, 106)
|
||||
RELOC_NUMBER (R_MIPS16_TLS_LDM, 107)
|
||||
RELOC_NUMBER (R_MIPS16_TLS_DTPREL_HI16, 108)
|
||||
RELOC_NUMBER (R_MIPS16_TLS_DTPREL_LO16, 109)
|
||||
RELOC_NUMBER (R_MIPS16_TLS_GOTTPREL, 110)
|
||||
RELOC_NUMBER (R_MIPS16_TLS_TPREL_HI16, 111)
|
||||
RELOC_NUMBER (R_MIPS16_TLS_TPREL_LO16, 112)
|
||||
FAKE_RELOC (R_MIPS16_max, 113)
|
||||
/* These relocations are specific to VxWorks. */
|
||||
RELOC_NUMBER (R_MIPS_COPY, 126)
|
||||
RELOC_NUMBER (R_MIPS_JUMP_SLOT, 127)
|
||||
|
|
Loading…
Add table
Reference in a new issue