summaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/binutils/binutils/0037-2011-12-19-Chung-Lin-Tang-cltang-codesourcery.com.patch
diff options
context:
space:
mode:
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.patch1068
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 4b0caaf..0000000
--- 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
-
OpenPOWER on IntegriCloud