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 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 @@
1Upstream-Status: Backport
2
3From 7e2b7154b03e4c77233171eec5cba8d113e04fea Mon Sep 17 00:00:00 2001
4From: cltang <cltang>
5Date: Mon, 19 Dec 2011 10:49:24 +0000
6Subject: [PATCH 037/262] 2011-12-19 Chung-Lin Tang
7 <cltang@codesourcery.com>
8
9 Backport from mainline:
10
11 2011-12-19 Chung-Lin Tang <cltang@codesourcery.com>
12
13 gas/
14 * config/tc-mips.c (mips_pseudo_table): Add tprelword/tpreldword
15 entries.
16 (mips16_percent_op): Add MIPS16 TLS relocation ops.
17 (md_apply_fix): Add BFD_RELOC_MIPS16_TLS_* switch cases.
18 (s_tls_rel_directive): Rename from s_dtprel_internal(). Abstract out
19 directive string and reloc type as function parameters. Update
20 comments.
21 (s_dtprelword,s_dtpreldword): Change to use s_tls_rel_directive().
22 (s_tprelword,s_tpreldword): New functions.
23
24 include/
25 * elf/mips.h (elf_mips_reloc_type): Add R_MIPS16_TLS_* entries.
26
27 bfd/
28 * reloc.c (BFD_RELOC_MIPS16_TLS_GD,BFD_RELOC_MIPS16_TLS_LDM,
29 BFD_RELOC_MIPS16_TLS_DTPREL_HI16,BFD_RELOC_MIPS16_TLS_DTPREL_LO16,
30 BFD_RELOC_MIPS16_TLS_GOTTPREL,BFD_RELOC_MIPS16_TLS_TPREL_HI16,
31 BFD_RELOC_MIPS16_TLS_TPREL_LO16): New relocations for MIPS16 TLS.
32 * bfd-in2.h (bfd_reloc_code_real): Regenerate.
33 * libbfd.h (bfd_reloc_code_real_names): Regenerate.
34 * elf32-mips.c (elf_mips16_howto_table_rel): Add R_MIPS16_TLS_*
35 entries.
36 (mips16_reloc_map): Add BFD_RELOC_MIPS16_TLS_* to R_MIPS16_TLS_*
37 mappings.
38 * elfn32-mips.c (elf_mips16_howto_table_rel,
39 elf_mips16_howto_table_rela): Add R_MIPS16_TLS_* entries.
40 (mips16_reloc_map): Add BFD_RELOC_MIPS16_TLS_* to R_MIPS16_TLS_*
41 mappings.
42 * elf64-mips.c (mips16_elf64_howto_table_rel,
43 mips16_elf64_howto_table_rela): Add R_MIPS16_TLS_* entries.
44 (mips16_reloc_map): Add BFD_RELOC_MIPS16_TLS_* to R_MIPS16_TLS_*
45 mappings.
46 * elfxx-mips.c (TLS_RELOC_P,mips16_reloc_p,
47 _bfd_mips_elf_check_relocs): Add cases for R_MIPS16_TLS_* relocations.
48 (tls_gd_reloc_p): Add R_MIPS16_TLS_GD case.
49 (tls_ldm_reloc_p): Add R_MIPS16_TLS_LDM case.
50 (tls_gottprel_reloc_p): Add R_MIPS16_TLS_GOTTPREL case.
51 (mips_elf_calculate_relocation): Add cases for R_MIPS16_TLS_*,
52 R_MIPS_TLS_DTPREL32/64, and R_MIPS_TLS_TPREL32/64 relocations.
53---
54 bfd/ChangeLog | 32 ++++++++
55 bfd/bfd-in2.h | 9 +++
56 bfd/elf32-mips.c | 114 ++++++++++++++++++++++++++
57 bfd/elf64-mips.c | 219 ++++++++++++++++++++++++++++++++++++++++++++++++++
58 bfd/elfn32-mips.c | 219 ++++++++++++++++++++++++++++++++++++++++++++++++++
59 bfd/elfxx-mips.c | 48 +++++++++--
60 bfd/libbfd.h | 7 ++
61 bfd/reloc.c | 17 ++++
62 gas/ChangeLog | 16 ++++
63 gas/config/tc-mips.c | 62 ++++++++++----
64 include/ChangeLog | 8 ++
65 include/elf/mips.h | 9 ++-
66 12 files changed, 739 insertions(+), 21 deletions(-)
67
68diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
69index 22fcdf6..cd90740 100644
70--- a/bfd/bfd-in2.h
71+++ b/bfd/bfd-in2.h
72@@ -2780,6 +2780,15 @@ to compensate for the borrow when the low bits are added. */
73 /* MIPS16 low 16 bits. */
74 BFD_RELOC_MIPS16_LO16,
75
76+/* MIPS16 TLS relocations */
77+ BFD_RELOC_MIPS16_TLS_GD,
78+ BFD_RELOC_MIPS16_TLS_LDM,
79+ BFD_RELOC_MIPS16_TLS_DTPREL_HI16,
80+ BFD_RELOC_MIPS16_TLS_DTPREL_LO16,
81+ BFD_RELOC_MIPS16_TLS_GOTTPREL,
82+ BFD_RELOC_MIPS16_TLS_TPREL_HI16,
83+ BFD_RELOC_MIPS16_TLS_TPREL_LO16,
84+
85 /* Relocation against a MIPS literal section. */
86 BFD_RELOC_MIPS_LITERAL,
87 BFD_RELOC_MICROMIPS_LITERAL,
88diff --git a/bfd/elf32-mips.c b/bfd/elf32-mips.c
89index fd3d4ba..61e8b45 100644
90--- a/bfd/elf32-mips.c
91+++ b/bfd/elf32-mips.c
92@@ -830,6 +830,111 @@ static reloc_howto_type elf_mips16_howto_table_rel[] =
93 0x0000ffff, /* src_mask */
94 0x0000ffff, /* dst_mask */
95 FALSE), /* pcrel_offset */
96+
97+ /* MIPS16 TLS general dynamic variable reference. */
98+ HOWTO (R_MIPS16_TLS_GD, /* type */
99+ 0, /* rightshift */
100+ 2, /* size (0 = byte, 1 = short, 2 = long) */
101+ 16, /* bitsize */
102+ FALSE, /* pc_relative */
103+ 0, /* bitpos */
104+ complain_overflow_signed, /* complain_on_overflow */
105+ _bfd_mips_elf_generic_reloc, /* special_function */
106+ "R_MIPS16_TLS_GD", /* name */
107+ TRUE, /* partial_inplace */
108+ 0x0000ffff, /* src_mask */
109+ 0x0000ffff, /* dst_mask */
110+ FALSE), /* pcrel_offset */
111+
112+ /* MIPS16 TLS local dynamic variable reference. */
113+ HOWTO (R_MIPS16_TLS_LDM, /* type */
114+ 0, /* rightshift */
115+ 2, /* size (0 = byte, 1 = short, 2 = long) */
116+ 16, /* bitsize */
117+ FALSE, /* pc_relative */
118+ 0, /* bitpos */
119+ complain_overflow_signed, /* complain_on_overflow */
120+ _bfd_mips_elf_generic_reloc, /* special_function */
121+ "R_MIPS16_TLS_LDM", /* name */
122+ TRUE, /* partial_inplace */
123+ 0x0000ffff, /* src_mask */
124+ 0x0000ffff, /* dst_mask */
125+ FALSE), /* pcrel_offset */
126+
127+ /* MIPS16 TLS local dynamic offset. */
128+ HOWTO (R_MIPS16_TLS_DTPREL_HI16, /* type */
129+ 0, /* rightshift */
130+ 2, /* size (0 = byte, 1 = short, 2 = long) */
131+ 16, /* bitsize */
132+ FALSE, /* pc_relative */
133+ 0, /* bitpos */
134+ complain_overflow_signed, /* complain_on_overflow */
135+ _bfd_mips_elf_generic_reloc, /* special_function */
136+ "R_MIPS16_TLS_DTPREL_HI16", /* name */
137+ TRUE, /* partial_inplace */
138+ 0x0000ffff, /* src_mask */
139+ 0x0000ffff, /* dst_mask */
140+ FALSE), /* pcrel_offset */
141+
142+ /* MIPS16 TLS local dynamic offset. */
143+ HOWTO (R_MIPS16_TLS_DTPREL_LO16, /* type */
144+ 0, /* rightshift */
145+ 2, /* size (0 = byte, 1 = short, 2 = long) */
146+ 16, /* bitsize */
147+ FALSE, /* pc_relative */
148+ 0, /* bitpos */
149+ complain_overflow_signed, /* complain_on_overflow */
150+ _bfd_mips_elf_generic_reloc, /* special_function */
151+ "R_MIPS16_TLS_DTPREL_LO16", /* name */
152+ TRUE, /* partial_inplace */
153+ 0x0000ffff, /* src_mask */
154+ 0x0000ffff, /* dst_mask */
155+ FALSE), /* pcrel_offset */
156+
157+ /* MIPS16 TLS thread pointer offset. */
158+ HOWTO (R_MIPS16_TLS_GOTTPREL, /* type */
159+ 0, /* rightshift */
160+ 2, /* size (0 = byte, 1 = short, 2 = long) */
161+ 16, /* bitsize */
162+ FALSE, /* pc_relative */
163+ 0, /* bitpos */
164+ complain_overflow_signed, /* complain_on_overflow */
165+ _bfd_mips_elf_generic_reloc, /* special_function */
166+ "R_MIPS16_TLS_GOTTPREL", /* name */
167+ TRUE, /* partial_inplace */
168+ 0x0000ffff, /* src_mask */
169+ 0x0000ffff, /* dst_mask */
170+ FALSE), /* pcrel_offset */
171+
172+ /* MIPS16 TLS thread pointer offset. */
173+ HOWTO (R_MIPS16_TLS_TPREL_HI16, /* type */
174+ 0, /* rightshift */
175+ 2, /* size (0 = byte, 1 = short, 2 = long) */
176+ 16, /* bitsize */
177+ FALSE, /* pc_relative */
178+ 0, /* bitpos */
179+ complain_overflow_signed, /* complain_on_overflow */
180+ _bfd_mips_elf_generic_reloc, /* special_function */
181+ "R_MIPS16_TLS_TPREL_HI16", /* name */
182+ TRUE, /* partial_inplace */
183+ 0x0000ffff, /* src_mask */
184+ 0x0000ffff, /* dst_mask */
185+ FALSE), /* pcrel_offset */
186+
187+ /* MIPS16 TLS thread pointer offset. */
188+ HOWTO (R_MIPS16_TLS_TPREL_LO16, /* type */
189+ 0, /* rightshift */
190+ 2, /* size (0 = byte, 1 = short, 2 = long) */
191+ 16, /* bitsize */
192+ FALSE, /* pc_relative */
193+ 0, /* bitpos */
194+ complain_overflow_signed, /* complain_on_overflow */
195+ _bfd_mips_elf_generic_reloc, /* special_function */
196+ "R_MIPS16_TLS_TPREL_LO16", /* name */
197+ TRUE, /* partial_inplace */
198+ 0x0000ffff, /* src_mask */
199+ 0x0000ffff, /* dst_mask */
200+ FALSE), /* pcrel_offset */
201 };
202
203 static reloc_howto_type elf_micromips_howto_table_rel[] =
204@@ -1796,6 +1901,15 @@ static const struct elf_reloc_map mips16_reloc_map[] =
205 { BFD_RELOC_MIPS16_CALL16, R_MIPS16_CALL16 - R_MIPS16_min },
206 { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
207 { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
208+ { BFD_RELOC_MIPS16_TLS_GD, R_MIPS16_TLS_GD - R_MIPS16_min },
209+ { BFD_RELOC_MIPS16_TLS_LDM, R_MIPS16_TLS_LDM - R_MIPS16_min },
210+ { BFD_RELOC_MIPS16_TLS_DTPREL_HI16,
211+ R_MIPS16_TLS_DTPREL_HI16 - R_MIPS16_min },
212+ { BFD_RELOC_MIPS16_TLS_DTPREL_LO16,
213+ R_MIPS16_TLS_DTPREL_LO16 - R_MIPS16_min },
214+ { BFD_RELOC_MIPS16_TLS_GOTTPREL, R_MIPS16_TLS_GOTTPREL - R_MIPS16_min },
215+ { BFD_RELOC_MIPS16_TLS_TPREL_HI16, R_MIPS16_TLS_TPREL_HI16 - R_MIPS16_min },
216+ { BFD_RELOC_MIPS16_TLS_TPREL_LO16, R_MIPS16_TLS_TPREL_LO16 - R_MIPS16_min }
217 };
218
219 static const struct elf_reloc_map micromips_reloc_map[] =
220diff --git a/bfd/elf64-mips.c b/bfd/elf64-mips.c
221index 3feb1bb..bdd0c19 100644
222--- a/bfd/elf64-mips.c
223+++ b/bfd/elf64-mips.c
224@@ -1590,6 +1590,111 @@ static reloc_howto_type mips16_elf64_howto_table_rel[] =
225 0x0000ffff, /* src_mask */
226 0x0000ffff, /* dst_mask */
227 FALSE), /* pcrel_offset */
228+
229+ /* MIPS16 TLS general dynamic variable reference. */
230+ HOWTO (R_MIPS16_TLS_GD, /* type */
231+ 0, /* rightshift */
232+ 2, /* size (0 = byte, 1 = short, 2 = long) */
233+ 16, /* bitsize */
234+ FALSE, /* pc_relative */
235+ 0, /* bitpos */
236+ complain_overflow_signed, /* complain_on_overflow */
237+ _bfd_mips_elf_generic_reloc, /* special_function */
238+ "R_MIPS16_TLS_GD", /* name */
239+ TRUE, /* partial_inplace */
240+ 0x0000ffff, /* src_mask */
241+ 0x0000ffff, /* dst_mask */
242+ FALSE), /* pcrel_offset */
243+
244+ /* MIPS16 TLS local dynamic variable reference. */
245+ HOWTO (R_MIPS16_TLS_LDM, /* type */
246+ 0, /* rightshift */
247+ 2, /* size (0 = byte, 1 = short, 2 = long) */
248+ 16, /* bitsize */
249+ FALSE, /* pc_relative */
250+ 0, /* bitpos */
251+ complain_overflow_signed, /* complain_on_overflow */
252+ _bfd_mips_elf_generic_reloc, /* special_function */
253+ "R_MIPS16_TLS_LDM", /* name */
254+ TRUE, /* partial_inplace */
255+ 0x0000ffff, /* src_mask */
256+ 0x0000ffff, /* dst_mask */
257+ FALSE), /* pcrel_offset */
258+
259+ /* MIPS16 TLS local dynamic offset. */
260+ HOWTO (R_MIPS16_TLS_DTPREL_HI16, /* type */
261+ 0, /* rightshift */
262+ 2, /* size (0 = byte, 1 = short, 2 = long) */
263+ 16, /* bitsize */
264+ FALSE, /* pc_relative */
265+ 0, /* bitpos */
266+ complain_overflow_signed, /* complain_on_overflow */
267+ _bfd_mips_elf_generic_reloc, /* special_function */
268+ "R_MIPS16_TLS_DTPREL_HI16", /* name */
269+ TRUE, /* partial_inplace */
270+ 0x0000ffff, /* src_mask */
271+ 0x0000ffff, /* dst_mask */
272+ FALSE), /* pcrel_offset */
273+
274+ /* MIPS16 TLS local dynamic offset. */
275+ HOWTO (R_MIPS16_TLS_DTPREL_LO16, /* type */
276+ 0, /* rightshift */
277+ 2, /* size (0 = byte, 1 = short, 2 = long) */
278+ 16, /* bitsize */
279+ FALSE, /* pc_relative */
280+ 0, /* bitpos */
281+ complain_overflow_signed, /* complain_on_overflow */
282+ _bfd_mips_elf_generic_reloc, /* special_function */
283+ "R_MIPS16_TLS_DTPREL_LO16", /* name */
284+ TRUE, /* partial_inplace */
285+ 0x0000ffff, /* src_mask */
286+ 0x0000ffff, /* dst_mask */
287+ FALSE), /* pcrel_offset */
288+
289+ /* MIPS16 TLS thread pointer offset. */
290+ HOWTO (R_MIPS16_TLS_GOTTPREL, /* type */
291+ 0, /* rightshift */
292+ 2, /* size (0 = byte, 1 = short, 2 = long) */
293+ 16, /* bitsize */
294+ FALSE, /* pc_relative */
295+ 0, /* bitpos */
296+ complain_overflow_signed, /* complain_on_overflow */
297+ _bfd_mips_elf_generic_reloc, /* special_function */
298+ "R_MIPS16_TLS_GOTTPREL", /* name */
299+ TRUE, /* partial_inplace */
300+ 0x0000ffff, /* src_mask */
301+ 0x0000ffff, /* dst_mask */
302+ FALSE), /* pcrel_offset */
303+
304+ /* MIPS16 TLS thread pointer offset. */
305+ HOWTO (R_MIPS16_TLS_TPREL_HI16, /* type */
306+ 0, /* rightshift */
307+ 2, /* size (0 = byte, 1 = short, 2 = long) */
308+ 16, /* bitsize */
309+ FALSE, /* pc_relative */
310+ 0, /* bitpos */
311+ complain_overflow_signed, /* complain_on_overflow */
312+ _bfd_mips_elf_generic_reloc, /* special_function */
313+ "R_MIPS16_TLS_TPREL_HI16", /* name */
314+ TRUE, /* partial_inplace */
315+ 0x0000ffff, /* src_mask */
316+ 0x0000ffff, /* dst_mask */
317+ FALSE), /* pcrel_offset */
318+
319+ /* MIPS16 TLS thread pointer offset. */
320+ HOWTO (R_MIPS16_TLS_TPREL_LO16, /* type */
321+ 0, /* rightshift */
322+ 2, /* size (0 = byte, 1 = short, 2 = long) */
323+ 16, /* bitsize */
324+ FALSE, /* pc_relative */
325+ 0, /* bitpos */
326+ complain_overflow_signed, /* complain_on_overflow */
327+ _bfd_mips_elf_generic_reloc, /* special_function */
328+ "R_MIPS16_TLS_TPREL_LO16", /* name */
329+ TRUE, /* partial_inplace */
330+ 0x0000ffff, /* src_mask */
331+ 0x0000ffff, /* dst_mask */
332+ FALSE), /* pcrel_offset */
333 };
334
335 static reloc_howto_type mips16_elf64_howto_table_rela[] =
336@@ -1686,6 +1791,111 @@ static reloc_howto_type mips16_elf64_howto_table_rela[] =
337 0x0000ffff, /* src_mask */
338 0x0000ffff, /* dst_mask */
339 FALSE), /* pcrel_offset */
340+
341+ /* MIPS16 TLS general dynamic variable reference. */
342+ HOWTO (R_MIPS16_TLS_GD, /* type */
343+ 0, /* rightshift */
344+ 2, /* size (0 = byte, 1 = short, 2 = long) */
345+ 16, /* bitsize */
346+ FALSE, /* pc_relative */
347+ 0, /* bitpos */
348+ complain_overflow_signed, /* complain_on_overflow */
349+ _bfd_mips_elf_generic_reloc, /* special_function */
350+ "R_MIPS16_TLS_GD", /* name */
351+ FALSE, /* partial_inplace */
352+ 0x0000ffff, /* src_mask */
353+ 0x0000ffff, /* dst_mask */
354+ FALSE), /* pcrel_offset */
355+
356+ /* MIPS16 TLS local dynamic variable reference. */
357+ HOWTO (R_MIPS16_TLS_LDM, /* type */
358+ 0, /* rightshift */
359+ 2, /* size (0 = byte, 1 = short, 2 = long) */
360+ 16, /* bitsize */
361+ FALSE, /* pc_relative */
362+ 0, /* bitpos */
363+ complain_overflow_signed, /* complain_on_overflow */
364+ _bfd_mips_elf_generic_reloc, /* special_function */
365+ "R_MIPS16_TLS_LDM", /* name */
366+ FALSE, /* partial_inplace */
367+ 0x0000ffff, /* src_mask */
368+ 0x0000ffff, /* dst_mask */
369+ FALSE), /* pcrel_offset */
370+
371+ /* MIPS16 TLS local dynamic offset. */
372+ HOWTO (R_MIPS16_TLS_DTPREL_HI16, /* type */
373+ 0, /* rightshift */
374+ 2, /* size (0 = byte, 1 = short, 2 = long) */
375+ 16, /* bitsize */
376+ FALSE, /* pc_relative */
377+ 0, /* bitpos */
378+ complain_overflow_signed, /* complain_on_overflow */
379+ _bfd_mips_elf_generic_reloc, /* special_function */
380+ "R_MIPS16_TLS_DTPREL_HI16", /* name */
381+ FALSE, /* partial_inplace */
382+ 0x0000ffff, /* src_mask */
383+ 0x0000ffff, /* dst_mask */
384+ FALSE), /* pcrel_offset */
385+
386+ /* MIPS16 TLS local dynamic offset. */
387+ HOWTO (R_MIPS16_TLS_DTPREL_LO16, /* type */
388+ 0, /* rightshift */
389+ 2, /* size (0 = byte, 1 = short, 2 = long) */
390+ 16, /* bitsize */
391+ FALSE, /* pc_relative */
392+ 0, /* bitpos */
393+ complain_overflow_signed, /* complain_on_overflow */
394+ _bfd_mips_elf_generic_reloc, /* special_function */
395+ "R_MIPS16_TLS_DTPREL_LO16", /* name */
396+ FALSE, /* partial_inplace */
397+ 0x0000ffff, /* src_mask */
398+ 0x0000ffff, /* dst_mask */
399+ FALSE), /* pcrel_offset */
400+
401+ /* MIPS16 TLS thread pointer offset. */
402+ HOWTO (R_MIPS16_TLS_GOTTPREL, /* type */
403+ 0, /* rightshift */
404+ 2, /* size (0 = byte, 1 = short, 2 = long) */
405+ 16, /* bitsize */
406+ FALSE, /* pc_relative */
407+ 0, /* bitpos */
408+ complain_overflow_signed, /* complain_on_overflow */
409+ _bfd_mips_elf_generic_reloc, /* special_function */
410+ "R_MIPS16_TLS_GOTTPREL", /* name */
411+ FALSE, /* partial_inplace */
412+ 0x0000ffff, /* src_mask */
413+ 0x0000ffff, /* dst_mask */
414+ FALSE), /* pcrel_offset */
415+
416+ /* MIPS16 TLS thread pointer offset. */
417+ HOWTO (R_MIPS16_TLS_TPREL_HI16, /* type */
418+ 0, /* rightshift */
419+ 2, /* size (0 = byte, 1 = short, 2 = long) */
420+ 16, /* bitsize */
421+ FALSE, /* pc_relative */
422+ 0, /* bitpos */
423+ complain_overflow_signed, /* complain_on_overflow */
424+ _bfd_mips_elf_generic_reloc, /* special_function */
425+ "R_MIPS16_TLS_TPREL_HI16", /* name */
426+ FALSE, /* partial_inplace */
427+ 0x0000ffff, /* src_mask */
428+ 0x0000ffff, /* dst_mask */
429+ FALSE), /* pcrel_offset */
430+
431+ /* MIPS16 TLS thread pointer offset. */
432+ HOWTO (R_MIPS16_TLS_TPREL_LO16, /* type */
433+ 0, /* rightshift */
434+ 2, /* size (0 = byte, 1 = short, 2 = long) */
435+ 16, /* bitsize */
436+ FALSE, /* pc_relative */
437+ 0, /* bitpos */
438+ complain_overflow_signed, /* complain_on_overflow */
439+ _bfd_mips_elf_generic_reloc, /* special_function */
440+ "R_MIPS16_TLS_TPREL_LO16", /* name */
441+ FALSE, /* partial_inplace */
442+ 0x0000ffff, /* src_mask */
443+ 0x0000ffff, /* dst_mask */
444+ FALSE), /* pcrel_offset */
445 };
446
447 static reloc_howto_type micromips_elf64_howto_table_rel[] =
448@@ -2908,6 +3118,15 @@ static const struct elf_reloc_map mips16_reloc_map[] =
449 { BFD_RELOC_MIPS16_CALL16, R_MIPS16_CALL16 - R_MIPS16_min },
450 { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
451 { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
452+ { BFD_RELOC_MIPS16_TLS_GD, R_MIPS16_TLS_GD - R_MIPS16_min },
453+ { BFD_RELOC_MIPS16_TLS_LDM, R_MIPS16_TLS_LDM - R_MIPS16_min },
454+ { BFD_RELOC_MIPS16_TLS_DTPREL_HI16,
455+ R_MIPS16_TLS_DTPREL_HI16 - R_MIPS16_min },
456+ { BFD_RELOC_MIPS16_TLS_DTPREL_LO16,
457+ R_MIPS16_TLS_DTPREL_LO16 - R_MIPS16_min },
458+ { BFD_RELOC_MIPS16_TLS_GOTTPREL, R_MIPS16_TLS_GOTTPREL - R_MIPS16_min },
459+ { BFD_RELOC_MIPS16_TLS_TPREL_HI16, R_MIPS16_TLS_TPREL_HI16 - R_MIPS16_min },
460+ { BFD_RELOC_MIPS16_TLS_TPREL_LO16, R_MIPS16_TLS_TPREL_LO16 - R_MIPS16_min }
461 };
462
463 static const struct elf_reloc_map micromips_reloc_map[] =
464diff --git a/bfd/elfn32-mips.c b/bfd/elfn32-mips.c
465index 00ec8b0..2189566 100644
466--- a/bfd/elfn32-mips.c
467+++ b/bfd/elfn32-mips.c
468@@ -1555,6 +1555,111 @@ static reloc_howto_type elf_mips16_howto_table_rel[] =
469 0x0000ffff, /* src_mask */
470 0x0000ffff, /* dst_mask */
471 FALSE), /* pcrel_offset */
472+
473+ /* MIPS16 TLS general dynamic variable reference. */
474+ HOWTO (R_MIPS16_TLS_GD, /* type */
475+ 0, /* rightshift */
476+ 2, /* size (0 = byte, 1 = short, 2 = long) */
477+ 16, /* bitsize */
478+ FALSE, /* pc_relative */
479+ 0, /* bitpos */
480+ complain_overflow_signed, /* complain_on_overflow */
481+ _bfd_mips_elf_generic_reloc, /* special_function */
482+ "R_MIPS16_TLS_GD", /* name */
483+ TRUE, /* partial_inplace */
484+ 0x0000ffff, /* src_mask */
485+ 0x0000ffff, /* dst_mask */
486+ FALSE), /* pcrel_offset */
487+
488+ /* MIPS16 TLS local dynamic variable reference. */
489+ HOWTO (R_MIPS16_TLS_LDM, /* type */
490+ 0, /* rightshift */
491+ 2, /* size (0 = byte, 1 = short, 2 = long) */
492+ 16, /* bitsize */
493+ FALSE, /* pc_relative */
494+ 0, /* bitpos */
495+ complain_overflow_signed, /* complain_on_overflow */
496+ _bfd_mips_elf_generic_reloc, /* special_function */
497+ "R_MIPS16_TLS_LDM", /* name */
498+ TRUE, /* partial_inplace */
499+ 0x0000ffff, /* src_mask */
500+ 0x0000ffff, /* dst_mask */
501+ FALSE), /* pcrel_offset */
502+
503+ /* MIPS16 TLS local dynamic offset. */
504+ HOWTO (R_MIPS16_TLS_DTPREL_HI16, /* type */
505+ 0, /* rightshift */
506+ 2, /* size (0 = byte, 1 = short, 2 = long) */
507+ 16, /* bitsize */
508+ FALSE, /* pc_relative */
509+ 0, /* bitpos */
510+ complain_overflow_signed, /* complain_on_overflow */
511+ _bfd_mips_elf_generic_reloc, /* special_function */
512+ "R_MIPS16_TLS_DTPREL_HI16", /* name */
513+ TRUE, /* partial_inplace */
514+ 0x0000ffff, /* src_mask */
515+ 0x0000ffff, /* dst_mask */
516+ FALSE), /* pcrel_offset */
517+
518+ /* MIPS16 TLS local dynamic offset. */
519+ HOWTO (R_MIPS16_TLS_DTPREL_LO16, /* type */
520+ 0, /* rightshift */
521+ 2, /* size (0 = byte, 1 = short, 2 = long) */
522+ 16, /* bitsize */
523+ FALSE, /* pc_relative */
524+ 0, /* bitpos */
525+ complain_overflow_signed, /* complain_on_overflow */
526+ _bfd_mips_elf_generic_reloc, /* special_function */
527+ "R_MIPS16_TLS_DTPREL_LO16", /* name */
528+ TRUE, /* partial_inplace */
529+ 0x0000ffff, /* src_mask */
530+ 0x0000ffff, /* dst_mask */
531+ FALSE), /* pcrel_offset */
532+
533+ /* MIPS16 TLS thread pointer offset. */
534+ HOWTO (R_MIPS16_TLS_GOTTPREL, /* type */
535+ 0, /* rightshift */
536+ 2, /* size (0 = byte, 1 = short, 2 = long) */
537+ 16, /* bitsize */
538+ FALSE, /* pc_relative */
539+ 0, /* bitpos */
540+ complain_overflow_signed, /* complain_on_overflow */
541+ _bfd_mips_elf_generic_reloc, /* special_function */
542+ "R_MIPS16_TLS_GOTTPREL", /* name */
543+ TRUE, /* partial_inplace */
544+ 0x0000ffff, /* src_mask */
545+ 0x0000ffff, /* dst_mask */
546+ FALSE), /* pcrel_offset */
547+
548+ /* MIPS16 TLS thread pointer offset. */
549+ HOWTO (R_MIPS16_TLS_TPREL_HI16, /* type */
550+ 0, /* rightshift */
551+ 2, /* size (0 = byte, 1 = short, 2 = long) */
552+ 16, /* bitsize */
553+ FALSE, /* pc_relative */
554+ 0, /* bitpos */
555+ complain_overflow_signed, /* complain_on_overflow */
556+ _bfd_mips_elf_generic_reloc, /* special_function */
557+ "R_MIPS16_TLS_TPREL_HI16", /* name */
558+ TRUE, /* partial_inplace */
559+ 0x0000ffff, /* src_mask */
560+ 0x0000ffff, /* dst_mask */
561+ FALSE), /* pcrel_offset */
562+
563+ /* MIPS16 TLS thread pointer offset. */
564+ HOWTO (R_MIPS16_TLS_TPREL_LO16, /* type */
565+ 0, /* rightshift */
566+ 2, /* size (0 = byte, 1 = short, 2 = long) */
567+ 16, /* bitsize */
568+ FALSE, /* pc_relative */
569+ 0, /* bitpos */
570+ complain_overflow_signed, /* complain_on_overflow */
571+ _bfd_mips_elf_generic_reloc, /* special_function */
572+ "R_MIPS16_TLS_TPREL_LO16", /* name */
573+ TRUE, /* partial_inplace */
574+ 0x0000ffff, /* src_mask */
575+ 0x0000ffff, /* dst_mask */
576+ FALSE), /* pcrel_offset */
577 };
578
579 static reloc_howto_type elf_mips16_howto_table_rela[] =
580@@ -1651,6 +1756,111 @@ static reloc_howto_type elf_mips16_howto_table_rela[] =
581 0x0000ffff, /* src_mask */
582 0x0000ffff, /* dst_mask */
583 FALSE), /* pcrel_offset */
584+
585+ /* MIPS16 TLS general dynamic variable reference. */
586+ HOWTO (R_MIPS16_TLS_GD, /* type */
587+ 0, /* rightshift */
588+ 2, /* size (0 = byte, 1 = short, 2 = long) */
589+ 16, /* bitsize */
590+ FALSE, /* pc_relative */
591+ 0, /* bitpos */
592+ complain_overflow_signed, /* complain_on_overflow */
593+ _bfd_mips_elf_generic_reloc, /* special_function */
594+ "R_MIPS16_TLS_GD", /* name */
595+ FALSE, /* partial_inplace */
596+ 0x0000ffff, /* src_mask */
597+ 0x0000ffff, /* dst_mask */
598+ FALSE), /* pcrel_offset */
599+
600+ /* MIPS16 TLS local dynamic variable reference. */
601+ HOWTO (R_MIPS16_TLS_LDM, /* type */
602+ 0, /* rightshift */
603+ 2, /* size (0 = byte, 1 = short, 2 = long) */
604+ 16, /* bitsize */
605+ FALSE, /* pc_relative */
606+ 0, /* bitpos */
607+ complain_overflow_signed, /* complain_on_overflow */
608+ _bfd_mips_elf_generic_reloc, /* special_function */
609+ "R_MIPS16_TLS_LDM", /* name */
610+ FALSE, /* partial_inplace */
611+ 0x0000ffff, /* src_mask */
612+ 0x0000ffff, /* dst_mask */
613+ FALSE), /* pcrel_offset */
614+
615+ /* MIPS16 TLS local dynamic offset. */
616+ HOWTO (R_MIPS16_TLS_DTPREL_HI16, /* type */
617+ 0, /* rightshift */
618+ 2, /* size (0 = byte, 1 = short, 2 = long) */
619+ 16, /* bitsize */
620+ FALSE, /* pc_relative */
621+ 0, /* bitpos */
622+ complain_overflow_signed, /* complain_on_overflow */
623+ _bfd_mips_elf_generic_reloc, /* special_function */
624+ "R_MIPS16_TLS_DTPREL_HI16", /* name */
625+ FALSE, /* partial_inplace */
626+ 0x0000ffff, /* src_mask */
627+ 0x0000ffff, /* dst_mask */
628+ FALSE), /* pcrel_offset */
629+
630+ /* MIPS16 TLS local dynamic offset. */
631+ HOWTO (R_MIPS16_TLS_DTPREL_LO16, /* type */
632+ 0, /* rightshift */
633+ 2, /* size (0 = byte, 1 = short, 2 = long) */
634+ 16, /* bitsize */
635+ FALSE, /* pc_relative */
636+ 0, /* bitpos */
637+ complain_overflow_signed, /* complain_on_overflow */
638+ _bfd_mips_elf_generic_reloc, /* special_function */
639+ "R_MIPS16_TLS_DTPREL_LO16", /* name */
640+ FALSE, /* partial_inplace */
641+ 0x0000ffff, /* src_mask */
642+ 0x0000ffff, /* dst_mask */
643+ FALSE), /* pcrel_offset */
644+
645+ /* MIPS16 TLS thread pointer offset. */
646+ HOWTO (R_MIPS16_TLS_GOTTPREL, /* type */
647+ 0, /* rightshift */
648+ 2, /* size (0 = byte, 1 = short, 2 = long) */
649+ 16, /* bitsize */
650+ FALSE, /* pc_relative */
651+ 0, /* bitpos */
652+ complain_overflow_signed, /* complain_on_overflow */
653+ _bfd_mips_elf_generic_reloc, /* special_function */
654+ "R_MIPS16_TLS_GOTTPREL", /* name */
655+ FALSE, /* partial_inplace */
656+ 0x0000ffff, /* src_mask */
657+ 0x0000ffff, /* dst_mask */
658+ FALSE), /* pcrel_offset */
659+
660+ /* MIPS16 TLS thread pointer offset. */
661+ HOWTO (R_MIPS16_TLS_TPREL_HI16, /* type */
662+ 0, /* rightshift */
663+ 2, /* size (0 = byte, 1 = short, 2 = long) */
664+ 16, /* bitsize */
665+ FALSE, /* pc_relative */
666+ 0, /* bitpos */
667+ complain_overflow_signed, /* complain_on_overflow */
668+ _bfd_mips_elf_generic_reloc, /* special_function */
669+ "R_MIPS16_TLS_TPREL_HI16", /* name */
670+ FALSE, /* partial_inplace */
671+ 0x0000ffff, /* src_mask */
672+ 0x0000ffff, /* dst_mask */
673+ FALSE), /* pcrel_offset */
674+
675+ /* MIPS16 TLS thread pointer offset. */
676+ HOWTO (R_MIPS16_TLS_TPREL_LO16, /* type */
677+ 0, /* rightshift */
678+ 2, /* size (0 = byte, 1 = short, 2 = long) */
679+ 16, /* bitsize */
680+ FALSE, /* pc_relative */
681+ 0, /* bitpos */
682+ complain_overflow_signed, /* complain_on_overflow */
683+ _bfd_mips_elf_generic_reloc, /* special_function */
684+ "R_MIPS16_TLS_TPREL_LO16", /* name */
685+ FALSE, /* partial_inplace */
686+ 0x0000ffff, /* src_mask */
687+ 0x0000ffff, /* dst_mask */
688+ FALSE), /* pcrel_offset */
689 };
690
691 static reloc_howto_type elf_micromips_howto_table_rel[] =
692@@ -2724,6 +2934,15 @@ static const struct elf_reloc_map mips16_reloc_map[] =
693 { BFD_RELOC_MIPS16_CALL16, R_MIPS16_CALL16 - R_MIPS16_min },
694 { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
695 { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
696+ { BFD_RELOC_MIPS16_TLS_GD, R_MIPS16_TLS_GD - R_MIPS16_min },
697+ { BFD_RELOC_MIPS16_TLS_LDM, R_MIPS16_TLS_LDM - R_MIPS16_min },
698+ { BFD_RELOC_MIPS16_TLS_DTPREL_HI16,
699+ R_MIPS16_TLS_DTPREL_HI16 - R_MIPS16_min },
700+ { BFD_RELOC_MIPS16_TLS_DTPREL_LO16,
701+ R_MIPS16_TLS_DTPREL_LO16 - R_MIPS16_min },
702+ { BFD_RELOC_MIPS16_TLS_GOTTPREL, R_MIPS16_TLS_GOTTPREL - R_MIPS16_min },
703+ { BFD_RELOC_MIPS16_TLS_TPREL_HI16, R_MIPS16_TLS_TPREL_HI16 - R_MIPS16_min },
704+ { BFD_RELOC_MIPS16_TLS_TPREL_LO16, R_MIPS16_TLS_TPREL_LO16 - R_MIPS16_min }
705 };
706
707 static const struct elf_reloc_map micromips_reloc_map[] =
708diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c
709index 9f3833b..fa906cd 100644
710--- a/bfd/elfxx-mips.c
711+++ b/bfd/elfxx-mips.c
712@@ -529,6 +529,13 @@ struct mips_htab_traverse_info
713 || r_type == R_MIPS_TLS_TPREL64 \
714 || r_type == R_MIPS_TLS_TPREL_HI16 \
715 || r_type == R_MIPS_TLS_TPREL_LO16 \
716+ || r_type == R_MIPS16_TLS_GD \
717+ || r_type == R_MIPS16_TLS_LDM \
718+ || r_type == R_MIPS16_TLS_DTPREL_HI16 \
719+ || r_type == R_MIPS16_TLS_DTPREL_LO16 \
720+ || r_type == R_MIPS16_TLS_GOTTPREL \
721+ || r_type == R_MIPS16_TLS_TPREL_HI16 \
722+ || r_type == R_MIPS16_TLS_TPREL_LO16 \
723 || r_type == R_MICROMIPS_TLS_GD \
724 || r_type == R_MICROMIPS_TLS_LDM \
725 || r_type == R_MICROMIPS_TLS_DTPREL_HI16 \
726@@ -1885,6 +1892,13 @@ mips16_reloc_p (int r_type)
727 case R_MIPS16_CALL16:
728 case R_MIPS16_HI16:
729 case R_MIPS16_LO16:
730+ case R_MIPS16_TLS_GD:
731+ case R_MIPS16_TLS_LDM:
732+ case R_MIPS16_TLS_DTPREL_HI16:
733+ case R_MIPS16_TLS_DTPREL_LO16:
734+ case R_MIPS16_TLS_GOTTPREL:
735+ case R_MIPS16_TLS_TPREL_HI16:
736+ case R_MIPS16_TLS_TPREL_LO16:
737 return TRUE;
738
739 default:
740@@ -2012,19 +2026,25 @@ micromips_branch_reloc_p (int r_type)
741 static inline bfd_boolean
742 tls_gd_reloc_p (unsigned int r_type)
743 {
744- return r_type == R_MIPS_TLS_GD || r_type == R_MICROMIPS_TLS_GD;
745+ return (r_type == R_MIPS_TLS_GD
746+ || r_type == R_MIPS16_TLS_GD
747+ || r_type == R_MICROMIPS_TLS_GD);
748 }
749
750 static inline bfd_boolean
751 tls_ldm_reloc_p (unsigned int r_type)
752 {
753- return r_type == R_MIPS_TLS_LDM || r_type == R_MICROMIPS_TLS_LDM;
754+ return (r_type == R_MIPS_TLS_LDM
755+ || r_type == R_MIPS16_TLS_LDM
756+ || r_type == R_MICROMIPS_TLS_LDM);
757 }
758
759 static inline bfd_boolean
760 tls_gottprel_reloc_p (unsigned int r_type)
761 {
762- return r_type == R_MIPS_TLS_GOTTPREL || r_type == R_MICROMIPS_TLS_GOTTPREL;
763+ return (r_type == R_MIPS_TLS_GOTTPREL
764+ || r_type == R_MIPS16_TLS_GOTTPREL
765+ || r_type == R_MICROMIPS_TLS_GOTTPREL);
766 }
767
768 void
769@@ -5361,6 +5381,9 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
770 case R_MIPS_TLS_GD:
771 case R_MIPS_TLS_GOTTPREL:
772 case R_MIPS_TLS_LDM:
773+ case R_MIPS16_TLS_GD:
774+ case R_MIPS16_TLS_GOTTPREL:
775+ case R_MIPS16_TLS_LDM:
776 case R_MICROMIPS_TLS_GD:
777 case R_MICROMIPS_TLS_GOTTPREL:
778 case R_MICROMIPS_TLS_LDM:
779@@ -5530,6 +5553,7 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
780 break;
781
782 case R_MIPS_TLS_DTPREL_HI16:
783+ case R_MIPS16_TLS_DTPREL_HI16:
784 case R_MICROMIPS_TLS_DTPREL_HI16:
785 value = (mips_elf_high (addend + symbol - dtprel_base (info))
786 & howto->dst_mask);
787@@ -5538,17 +5562,22 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
788 case R_MIPS_TLS_DTPREL_LO16:
789 case R_MIPS_TLS_DTPREL32:
790 case R_MIPS_TLS_DTPREL64:
791+ case R_MIPS16_TLS_DTPREL_LO16:
792 case R_MICROMIPS_TLS_DTPREL_LO16:
793 value = (symbol + addend - dtprel_base (info)) & howto->dst_mask;
794 break;
795
796 case R_MIPS_TLS_TPREL_HI16:
797+ case R_MIPS16_TLS_TPREL_HI16:
798 case R_MICROMIPS_TLS_TPREL_HI16:
799 value = (mips_elf_high (addend + symbol - tprel_base (info))
800 & howto->dst_mask);
801 break;
802
803 case R_MIPS_TLS_TPREL_LO16:
804+ case R_MIPS_TLS_TPREL32:
805+ case R_MIPS_TLS_TPREL64:
806+ case R_MIPS16_TLS_TPREL_LO16:
807 case R_MICROMIPS_TLS_TPREL_LO16:
808 value = (symbol + addend - tprel_base (info)) & howto->dst_mask;
809 break;
810@@ -5681,6 +5710,9 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
811 case R_MIPS_TLS_GOTTPREL:
812 case R_MIPS_TLS_LDM:
813 case R_MIPS_GOT_DISP:
814+ case R_MIPS16_TLS_GD:
815+ case R_MIPS16_TLS_GOTTPREL:
816+ case R_MIPS16_TLS_LDM:
817 case R_MICROMIPS_TLS_GD:
818 case R_MICROMIPS_TLS_GOTTPREL:
819 case R_MICROMIPS_TLS_LDM:
820@@ -7813,8 +7845,6 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
821 can_make_dynamic_p = FALSE;
822 switch (r_type)
823 {
824- case R_MIPS16_GOT16:
825- case R_MIPS16_CALL16:
826 case R_MIPS_GOT16:
827 case R_MIPS_CALL16:
828 case R_MIPS_CALL_HI16:
829@@ -7827,6 +7857,11 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
830 case R_MIPS_TLS_GOTTPREL:
831 case R_MIPS_TLS_GD:
832 case R_MIPS_TLS_LDM:
833+ case R_MIPS16_GOT16:
834+ case R_MIPS16_CALL16:
835+ case R_MIPS16_TLS_GOTTPREL:
836+ case R_MIPS16_TLS_GD:
837+ case R_MIPS16_TLS_LDM:
838 case R_MICROMIPS_GOT16:
839 case R_MICROMIPS_CALL16:
840 case R_MICROMIPS_CALL_HI16:
841@@ -8063,12 +8098,14 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
842 break;
843
844 case R_MIPS_TLS_GOTTPREL:
845+ case R_MIPS16_TLS_GOTTPREL:
846 case R_MICROMIPS_TLS_GOTTPREL:
847 if (info->shared)
848 info->flags |= DF_STATIC_TLS;
849 /* Fall through */
850
851 case R_MIPS_TLS_LDM:
852+ case R_MIPS16_TLS_LDM:
853 case R_MICROMIPS_TLS_LDM:
854 if (tls_ldm_reloc_p (r_type))
855 {
856@@ -8078,6 +8115,7 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
857 /* Fall through */
858
859 case R_MIPS_TLS_GD:
860+ case R_MIPS16_TLS_GD:
861 case R_MICROMIPS_TLS_GD:
862 /* This symbol requires a global offset table entry, or two
863 for TLS GD relocations. */
864diff --git a/bfd/libbfd.h b/bfd/libbfd.h
865index 200a6fa..0395ec2 100644
866--- a/bfd/libbfd.h
867+++ b/bfd/libbfd.h
868@@ -1086,6 +1086,13 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
869 "BFD_RELOC_MIPS16_HI16",
870 "BFD_RELOC_MIPS16_HI16_S",
871 "BFD_RELOC_MIPS16_LO16",
872+ "BFD_RELOC_MIPS16_TLS_GD",
873+ "BFD_RELOC_MIPS16_TLS_LDM",
874+ "BFD_RELOC_MIPS16_TLS_DTPREL_HI16",
875+ "BFD_RELOC_MIPS16_TLS_DTPREL_LO16",
876+ "BFD_RELOC_MIPS16_TLS_GOTTPREL",
877+ "BFD_RELOC_MIPS16_TLS_TPREL_HI16",
878+ "BFD_RELOC_MIPS16_TLS_TPREL_LO16",
879 "BFD_RELOC_MIPS_LITERAL",
880 "BFD_RELOC_MICROMIPS_LITERAL",
881 "BFD_RELOC_MICROMIPS_7_PCREL_S1",
882diff --git a/bfd/reloc.c b/bfd/reloc.c
883index 6ac7148..ef55cc3 100644
884--- a/bfd/reloc.c
885+++ b/bfd/reloc.c
886@@ -2247,6 +2247,23 @@ ENUMDOC
887 MIPS16 low 16 bits.
888
889 ENUM
890+ BFD_RELOC_MIPS16_TLS_GD
891+ENUMX
892+ BFD_RELOC_MIPS16_TLS_LDM
893+ENUMX
894+ BFD_RELOC_MIPS16_TLS_DTPREL_HI16
895+ENUMX
896+ BFD_RELOC_MIPS16_TLS_DTPREL_LO16
897+ENUMX
898+ BFD_RELOC_MIPS16_TLS_GOTTPREL
899+ENUMX
900+ BFD_RELOC_MIPS16_TLS_TPREL_HI16
901+ENUMX
902+ BFD_RELOC_MIPS16_TLS_TPREL_LO16
903+ENUMDOC
904+ MIPS16 TLS relocations
905+
906+ENUM
907 BFD_RELOC_MIPS_LITERAL
908 ENUMX
909 BFD_RELOC_MICROMIPS_LITERAL
910diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c
911index 0e4c66e..0fb3a6e 100644
912--- a/gas/config/tc-mips.c
913+++ b/gas/config/tc-mips.c
914@@ -1352,6 +1352,8 @@ static void s_cprestore (int);
915 static void s_cpreturn (int);
916 static void s_dtprelword (int);
917 static void s_dtpreldword (int);
918+static void s_tprelword (int);
919+static void s_tpreldword (int);
920 static void s_gpvalue (int);
921 static void s_gpword (int);
922 static void s_gpdword (int);
923@@ -1431,6 +1433,8 @@ static const pseudo_typeS mips_pseudo_table[] =
924 {"cpreturn", s_cpreturn, 0},
925 {"dtprelword", s_dtprelword, 0},
926 {"dtpreldword", s_dtpreldword, 0},
927+ {"tprelword", s_tprelword, 0},
928+ {"tpreldword", s_tpreldword, 0},
929 {"gpvalue", s_gpvalue, 0},
930 {"gpword", s_gpword, 0},
931 {"gpdword", s_gpdword, 0},
932@@ -14040,7 +14044,14 @@ static const struct percent_op_match mips16_percent_op[] =
933 {"%gprel", BFD_RELOC_MIPS16_GPREL},
934 {"%got", BFD_RELOC_MIPS16_GOT16},
935 {"%call16", BFD_RELOC_MIPS16_CALL16},
936- {"%hi", BFD_RELOC_MIPS16_HI16_S}
937+ {"%hi", BFD_RELOC_MIPS16_HI16_S},
938+ {"%tlsgd", BFD_RELOC_MIPS16_TLS_GD},
939+ {"%tlsldm", BFD_RELOC_MIPS16_TLS_LDM},
940+ {"%dtprel_hi", BFD_RELOC_MIPS16_TLS_DTPREL_HI16},
941+ {"%dtprel_lo", BFD_RELOC_MIPS16_TLS_DTPREL_LO16},
942+ {"%tprel_hi", BFD_RELOC_MIPS16_TLS_TPREL_HI16},
943+ {"%tprel_lo", BFD_RELOC_MIPS16_TLS_TPREL_LO16},
944+ {"%gottprel", BFD_RELOC_MIPS16_TLS_GOTTPREL}
945 };
946
947
948@@ -15369,6 +15380,8 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
949 case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
950 case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
951 case BFD_RELOC_MIPS_TLS_GOTTPREL:
952+ case BFD_RELOC_MIPS_TLS_TPREL32:
953+ case BFD_RELOC_MIPS_TLS_TPREL64:
954 case BFD_RELOC_MIPS_TLS_TPREL_HI16:
955 case BFD_RELOC_MIPS_TLS_TPREL_LO16:
956 case BFD_RELOC_MICROMIPS_TLS_GD:
957@@ -15378,6 +15391,13 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
958 case BFD_RELOC_MICROMIPS_TLS_GOTTPREL:
959 case BFD_RELOC_MICROMIPS_TLS_TPREL_HI16:
960 case BFD_RELOC_MICROMIPS_TLS_TPREL_LO16:
961+ case BFD_RELOC_MIPS16_TLS_GD:
962+ case BFD_RELOC_MIPS16_TLS_LDM:
963+ case BFD_RELOC_MIPS16_TLS_DTPREL_HI16:
964+ case BFD_RELOC_MIPS16_TLS_DTPREL_LO16:
965+ case BFD_RELOC_MIPS16_TLS_GOTTPREL:
966+ case BFD_RELOC_MIPS16_TLS_TPREL_HI16:
967+ case BFD_RELOC_MIPS16_TLS_TPREL_LO16:
968 S_SET_THREAD_LOCAL (fixP->fx_addsy);
969 /* fall through */
970
971@@ -16547,12 +16567,14 @@ s_cpreturn (int ignore ATTRIBUTE_UNUSED)
972 demand_empty_rest_of_line ();
973 }
974
975-/* Handle the .dtprelword and .dtpreldword pseudo-ops. They generate
976- a 32-bit or 64-bit DTP-relative relocation (BYTES says which) for
977- use in DWARF debug information. */
978+/* Handle a .dtprelword, .dtpreldword, .tprelword, or .tpreldword
979+ pseudo-op; DIRSTR says which. The pseudo-op generates a BYTES-size
980+ DTP- or TP-relative relocation of type RTYPE, for use in either DWARF
981+ debug information or MIPS16 TLS. */
982
983 static void
984-s_dtprel_internal (size_t bytes)
985+s_tls_rel_directive (const size_t bytes, const char *dirstr,
986+ bfd_reloc_code_real_type rtype)
987 {
988 expressionS ex;
989 char *p;
990@@ -16561,19 +16583,13 @@ s_dtprel_internal (size_t bytes)
991
992 if (ex.X_op != O_symbol)
993 {
994- as_bad (_("Unsupported use of %s"), (bytes == 8
995- ? ".dtpreldword"
996- : ".dtprelword"));
997+ as_bad (_("Unsupported use of %s"), dirstr);
998 ignore_rest_of_line ();
999 }
1000
1001 p = frag_more (bytes);
1002 md_number_to_chars (p, 0, bytes);
1003- fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE,
1004- (bytes == 8
1005- ? BFD_RELOC_MIPS_TLS_DTPREL64
1006- : BFD_RELOC_MIPS_TLS_DTPREL32));
1007-
1008+ fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE, rtype);
1009 demand_empty_rest_of_line ();
1010 }
1011
1012@@ -16582,7 +16598,7 @@ s_dtprel_internal (size_t bytes)
1013 static void
1014 s_dtprelword (int ignore ATTRIBUTE_UNUSED)
1015 {
1016- s_dtprel_internal (4);
1017+ s_tls_rel_directive (4, ".dtprelword", BFD_RELOC_MIPS_TLS_DTPREL32);
1018 }
1019
1020 /* Handle .dtpreldword. */
1021@@ -16590,7 +16606,23 @@ s_dtprelword (int ignore ATTRIBUTE_UNUSED)
1022 static void
1023 s_dtpreldword (int ignore ATTRIBUTE_UNUSED)
1024 {
1025- s_dtprel_internal (8);
1026+ s_tls_rel_directive (8, ".dtpreldword", BFD_RELOC_MIPS_TLS_DTPREL64);
1027+}
1028+
1029+/* Handle .tprelword. */
1030+
1031+static void
1032+s_tprelword (int ignore ATTRIBUTE_UNUSED)
1033+{
1034+ s_tls_rel_directive (4, ".tprelword", BFD_RELOC_MIPS_TLS_TPREL32);
1035+}
1036+
1037+/* Handle .tpreldword. */
1038+
1039+static void
1040+s_tpreldword (int ignore ATTRIBUTE_UNUSED)
1041+{
1042+ s_tls_rel_directive (8, ".tpreldword", BFD_RELOC_MIPS_TLS_TPREL64);
1043 }
1044
1045 /* Handle the .gpvalue pseudo-op. This is used when generating NewABI PIC
1046diff --git a/include/elf/mips.h b/include/elf/mips.h
1047index db5fa54..c2c5922 100644
1048--- a/include/elf/mips.h
1049+++ b/include/elf/mips.h
1050@@ -98,7 +98,14 @@ START_RELOC_NUMBERS (elf_mips_reloc_type)
1051 RELOC_NUMBER (R_MIPS16_CALL16, 103)
1052 RELOC_NUMBER (R_MIPS16_HI16, 104)
1053 RELOC_NUMBER (R_MIPS16_LO16, 105)
1054- FAKE_RELOC (R_MIPS16_max, 106)
1055+ RELOC_NUMBER (R_MIPS16_TLS_GD, 106)
1056+ RELOC_NUMBER (R_MIPS16_TLS_LDM, 107)
1057+ RELOC_NUMBER (R_MIPS16_TLS_DTPREL_HI16, 108)
1058+ RELOC_NUMBER (R_MIPS16_TLS_DTPREL_LO16, 109)
1059+ RELOC_NUMBER (R_MIPS16_TLS_GOTTPREL, 110)
1060+ RELOC_NUMBER (R_MIPS16_TLS_TPREL_HI16, 111)
1061+ RELOC_NUMBER (R_MIPS16_TLS_TPREL_LO16, 112)
1062+ FAKE_RELOC (R_MIPS16_max, 113)
1063 /* These relocations are specific to VxWorks. */
1064 RELOC_NUMBER (R_MIPS_COPY, 126)
1065 RELOC_NUMBER (R_MIPS_JUMP_SLOT, 127)
1066--
10671.7.9.5
1068