1 Upstream-Status: Backport
3 From 7e2b7154b03e4c77233171eec5cba8d113e04fea Mon Sep 17 00:00:00 2001
5 Date: Mon, 19 Dec 2011 10:49:24 +0000
6 Subject: [PATCH 037/262] 2011-12-19 Chung-Lin Tang
7 <cltang@codesourcery.com>
9 Backport from mainline:
11 2011-12-19 Chung-Lin Tang <cltang@codesourcery.com>
14 * config/tc-mips.c (mips_pseudo_table): Add tprelword/tpreldword
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
21 (s_dtprelword,s_dtpreldword): Change to use s_tls_rel_directive().
22 (s_tprelword,s_tpreldword): New functions.
25 * elf/mips.h (elf_mips_reloc_type): Add R_MIPS16_TLS_* entries.
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_*
36 (mips16_reloc_map): Add BFD_RELOC_MIPS16_TLS_* to R_MIPS16_TLS_*
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_*
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_*
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.
54 bfd/ChangeLog | 32 ++++++++
56 bfd/elf32-mips.c | 114 ++++++++++++++++++++++++++
57 bfd/elf64-mips.c | 219 ++++++++++++++++++++++++++++++++++++++++++++++++++
58 bfd/elfn32-mips.c | 219 ++++++++++++++++++++++++++++++++++++++++++++++++++
59 bfd/elfxx-mips.c | 48 +++++++++--
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(-)
68 diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
69 index 22fcdf6..cd90740 100644
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,
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,
85 /* Relocation against a MIPS literal section. */
86 BFD_RELOC_MIPS_LITERAL,
87 BFD_RELOC_MICROMIPS_LITERAL,
88 diff --git a/bfd/elf32-mips.c b/bfd/elf32-mips.c
89 index 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 */
97 + /* MIPS16 TLS general dynamic variable reference. */
98 + HOWTO (R_MIPS16_TLS_GD, /* type */
100 + 2, /* size (0 = byte, 1 = short, 2 = long) */
102 + FALSE, /* pc_relative */
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 */
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) */
117 + FALSE, /* pc_relative */
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 */
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) */
132 + FALSE, /* pc_relative */
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 */
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) */
147 + FALSE, /* pc_relative */
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 */
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) */
162 + FALSE, /* pc_relative */
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 */
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) */
177 + FALSE, /* pc_relative */
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 */
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) */
192 + FALSE, /* pc_relative */
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 */
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 }
219 static const struct elf_reloc_map micromips_reloc_map[] =
220 diff --git a/bfd/elf64-mips.c b/bfd/elf64-mips.c
221 index 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 */
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) */
234 + FALSE, /* pc_relative */
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 */
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) */
249 + FALSE, /* pc_relative */
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 */
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) */
264 + FALSE, /* pc_relative */
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 */
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) */
279 + FALSE, /* pc_relative */
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 */
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) */
294 + FALSE, /* pc_relative */
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 */
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) */
309 + FALSE, /* pc_relative */
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 */
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) */
324 + FALSE, /* pc_relative */
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 */
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 */
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) */
346 + FALSE, /* pc_relative */
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 */
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) */
361 + FALSE, /* pc_relative */
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 */
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) */
376 + FALSE, /* pc_relative */
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 */
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) */
391 + FALSE, /* pc_relative */
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 */
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) */
406 + FALSE, /* pc_relative */
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 */
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) */
421 + FALSE, /* pc_relative */
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 */
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) */
436 + FALSE, /* pc_relative */
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 */
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 }
463 static const struct elf_reloc_map micromips_reloc_map[] =
464 diff --git a/bfd/elfn32-mips.c b/bfd/elfn32-mips.c
465 index 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 */
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) */
478 + FALSE, /* pc_relative */
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 */
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) */
493 + FALSE, /* pc_relative */
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 */
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) */
508 + FALSE, /* pc_relative */
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 */
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) */
523 + FALSE, /* pc_relative */
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 */
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) */
538 + FALSE, /* pc_relative */
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 */
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) */
553 + FALSE, /* pc_relative */
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 */
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) */
568 + FALSE, /* pc_relative */
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 */
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 */
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) */
590 + FALSE, /* pc_relative */
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 */
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) */
605 + FALSE, /* pc_relative */
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 */
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) */
620 + FALSE, /* pc_relative */
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 */
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) */
635 + FALSE, /* pc_relative */
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 */
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) */
650 + FALSE, /* pc_relative */
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 */
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) */
665 + FALSE, /* pc_relative */
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 */
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) */
680 + FALSE, /* pc_relative */
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 */
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 }
707 static const struct elf_reloc_map micromips_reloc_map[] =
708 diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c
709 index 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:
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:
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)
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);
750 static inline bfd_boolean
751 tls_ldm_reloc_p (unsigned int r_type)
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);
759 static inline bfd_boolean
760 tls_gottprel_reloc_p (unsigned int r_type)
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);
769 @@ -5361,6 +5381,9 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
771 case R_MIPS_TLS_GOTTPREL:
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,
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))
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;
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))
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;
810 @@ -5681,6 +5710,9 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
811 case R_MIPS_TLS_GOTTPREL:
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;
824 - case R_MIPS16_GOT16:
825 - case R_MIPS16_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:
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,
844 case R_MIPS_TLS_GOTTPREL:
845 + case R_MIPS16_TLS_GOTTPREL:
846 case R_MICROMIPS_TLS_GOTTPREL:
848 info->flags |= DF_STATIC_TLS;
852 + case R_MIPS16_TLS_LDM:
853 case R_MICROMIPS_TLS_LDM:
854 if (tls_ldm_reloc_p (r_type))
856 @@ -8078,6 +8115,7 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
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. */
864 diff --git a/bfd/libbfd.h b/bfd/libbfd.h
865 index 200a6fa..0395ec2 100644
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",
882 diff --git a/bfd/reloc.c b/bfd/reloc.c
883 index 6ac7148..ef55cc3 100644
886 @@ -2247,6 +2247,23 @@ ENUMDOC
890 + BFD_RELOC_MIPS16_TLS_GD
892 + BFD_RELOC_MIPS16_TLS_LDM
894 + BFD_RELOC_MIPS16_TLS_DTPREL_HI16
896 + BFD_RELOC_MIPS16_TLS_DTPREL_LO16
898 + BFD_RELOC_MIPS16_TLS_GOTTPREL
900 + BFD_RELOC_MIPS16_TLS_TPREL_HI16
902 + BFD_RELOC_MIPS16_TLS_TPREL_LO16
904 + MIPS16 TLS relocations
907 BFD_RELOC_MIPS_LITERAL
909 BFD_RELOC_MICROMIPS_LITERAL
910 diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c
911 index 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}
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);
971 @@ -16547,12 +16567,14 @@ s_cpreturn (int ignore ATTRIBUTE_UNUSED)
972 demand_empty_rest_of_line ();
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. */
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)
990 @@ -16561,19 +16583,13 @@ s_dtprel_internal (size_t bytes)
992 if (ex.X_op != O_symbol)
994 - as_bad (_("Unsupported use of %s"), (bytes == 8
997 + as_bad (_("Unsupported use of %s"), dirstr);
998 ignore_rest_of_line ();
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,
1005 - ? BFD_RELOC_MIPS_TLS_DTPREL64
1006 - : BFD_RELOC_MIPS_TLS_DTPREL32));
1008 + fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE, rtype);
1009 demand_empty_rest_of_line ();
1012 @@ -16582,7 +16598,7 @@ s_dtprel_internal (size_t bytes)
1014 s_dtprelword (int ignore ATTRIBUTE_UNUSED)
1016 - s_dtprel_internal (4);
1017 + s_tls_rel_directive (4, ".dtprelword", BFD_RELOC_MIPS_TLS_DTPREL32);
1020 /* Handle .dtpreldword. */
1021 @@ -16590,7 +16606,23 @@ s_dtprelword (int ignore ATTRIBUTE_UNUSED)
1023 s_dtpreldword (int ignore ATTRIBUTE_UNUSED)
1025 - s_dtprel_internal (8);
1026 + s_tls_rel_directive (8, ".dtpreldword", BFD_RELOC_MIPS_TLS_DTPREL64);
1029 +/* Handle .tprelword. */
1032 +s_tprelword (int ignore ATTRIBUTE_UNUSED)
1034 + s_tls_rel_directive (4, ".tprelword", BFD_RELOC_MIPS_TLS_TPREL32);
1037 +/* Handle .tpreldword. */
1040 +s_tpreldword (int ignore ATTRIBUTE_UNUSED)
1042 + s_tls_rel_directive (8, ".tpreldword", BFD_RELOC_MIPS_TLS_TPREL64);
1045 /* Handle the .gpvalue pseudo-op. This is used when generating NewABI PIC
1046 diff --git a/include/elf/mips.h b/include/elf/mips.h
1047 index 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)