diff options
Diffstat (limited to 'meta/recipes-devtools/binutils/binutils/0037-2011-12-19-Chung-Lin-Tang-cltang-codesourcery.com.patch')
-rw-r--r-- | meta/recipes-devtools/binutils/binutils/0037-2011-12-19-Chung-Lin-Tang-cltang-codesourcery.com.patch | 1068 |
1 files changed, 0 insertions, 1068 deletions
diff --git a/meta/recipes-devtools/binutils/binutils/0037-2011-12-19-Chung-Lin-Tang-cltang-codesourcery.com.patch b/meta/recipes-devtools/binutils/binutils/0037-2011-12-19-Chung-Lin-Tang-cltang-codesourcery.com.patch deleted file mode 100644 index 4b0caafb48..0000000000 --- a/meta/recipes-devtools/binutils/binutils/0037-2011-12-19-Chung-Lin-Tang-cltang-codesourcery.com.patch +++ /dev/null @@ -1,1068 +0,0 @@ -Upstream-Status: Backport - -From 7e2b7154b03e4c77233171eec5cba8d113e04fea Mon Sep 17 00:00:00 2001 -From: cltang <cltang> -Date: Mon, 19 Dec 2011 10:49:24 +0000 -Subject: [PATCH 037/262] 2011-12-19 Chung-Lin Tang - <cltang@codesourcery.com> - - Backport from mainline: - - 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. ---- - bfd/ChangeLog | 32 ++++++++ - bfd/bfd-in2.h | 9 +++ - bfd/elf32-mips.c | 114 ++++++++++++++++++++++++++ - bfd/elf64-mips.c | 219 ++++++++++++++++++++++++++++++++++++++++++++++++++ - bfd/elfn32-mips.c | 219 ++++++++++++++++++++++++++++++++++++++++++++++++++ - bfd/elfxx-mips.c | 48 +++++++++-- - bfd/libbfd.h | 7 ++ - bfd/reloc.c | 17 ++++ - gas/ChangeLog | 16 ++++ - gas/config/tc-mips.c | 62 ++++++++++---- - include/ChangeLog | 8 ++ - include/elf/mips.h | 9 ++- - 12 files changed, 739 insertions(+), 21 deletions(-) - -diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h -index 22fcdf6..cd90740 100644 ---- a/bfd/bfd-in2.h -+++ b/bfd/bfd-in2.h -@@ -2780,6 +2780,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, -diff --git a/bfd/elf32-mips.c b/bfd/elf32-mips.c -index fd3d4ba..61e8b45 100644 ---- a/bfd/elf32-mips.c -+++ b/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[] = -diff --git a/bfd/elf64-mips.c b/bfd/elf64-mips.c -index 3feb1bb..bdd0c19 100644 ---- a/bfd/elf64-mips.c -+++ b/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[] = - 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 */ -+ 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[] = -diff --git a/bfd/elfn32-mips.c b/bfd/elfn32-mips.c -index 00ec8b0..2189566 100644 ---- a/bfd/elfn32-mips.c -+++ b/bfd/elfn32-mips.c -@@ -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[] = - 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 */ -+ 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[] = -diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c -index 9f3833b..fa906cd 100644 ---- a/bfd/elfxx-mips.c -+++ b/bfd/elfxx-mips.c -@@ -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: -@@ -7813,8 +7845,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: -@@ -7827,6 +7857,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: -@@ -8063,12 +8098,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)) - { -@@ -8078,6 +8115,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. */ -diff --git a/bfd/libbfd.h b/bfd/libbfd.h -index 200a6fa..0395ec2 100644 ---- a/bfd/libbfd.h -+++ b/bfd/libbfd.h -@@ -1086,6 +1086,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", -diff --git a/bfd/reloc.c b/bfd/reloc.c -index 6ac7148..ef55cc3 100644 ---- a/bfd/reloc.c -+++ b/bfd/reloc.c -@@ -2247,6 +2247,23 @@ 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 - BFD_RELOC_MICROMIPS_LITERAL -diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c -index 0e4c66e..0fb3a6e 100644 ---- a/gas/config/tc-mips.c -+++ b/gas/config/tc-mips.c -@@ -1352,6 +1352,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); -@@ -1431,6 +1433,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}, -@@ -14040,7 +14044,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} - }; - - -@@ -15369,6 +15380,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: -@@ -15378,6 +15391,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 */ - -@@ -16547,12 +16567,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; -@@ -16561,19 +16583,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 (); - } - -@@ -16582,7 +16598,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. */ -@@ -16590,7 +16606,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 -diff --git a/include/elf/mips.h b/include/elf/mips.h -index db5fa54..c2c5922 100644 ---- a/include/elf/mips.h -+++ b/include/elf/mips.h -@@ -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) --- -1.7.9.5 - |