patch-r262261-llvm-r200962-sparc.diff revision 269012
1Pull in r200962 from upstream llvm trunk (by Venkatraman Govindaraju):
2
3  [Sparc] Emit relocations for Thread Local Storage (TLS) when integrated assembler is used.
4
5Introduced here: http://svnweb.freebsd.org/changeset/base/262261
6
7Index: lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp
8===================================================================
9--- lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp
10+++ lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp
11@@ -26,31 +26,65 @@ static unsigned adjustFixupValue(unsigned Kind, ui
12   case FK_Data_4:
13   case FK_Data_8:
14     return Value;
15+
16   case Sparc::fixup_sparc_wplt30:
17   case Sparc::fixup_sparc_call30:
18     return (Value >> 2) & 0x3fffffff;
19+
20   case Sparc::fixup_sparc_br22:
21     return (Value >> 2) & 0x3fffff;
22+
23   case Sparc::fixup_sparc_br19:
24     return (Value >> 2) & 0x7ffff;
25+
26   case Sparc::fixup_sparc_pc22:
27   case Sparc::fixup_sparc_got22:
28+  case Sparc::fixup_sparc_tls_gd_hi22:
29+  case Sparc::fixup_sparc_tls_ldm_hi22:
30+  case Sparc::fixup_sparc_tls_ie_hi22:
31   case Sparc::fixup_sparc_hi22:
32     return (Value >> 10) & 0x3fffff;
33+
34   case Sparc::fixup_sparc_pc10:
35   case Sparc::fixup_sparc_got10:
36+  case Sparc::fixup_sparc_tls_gd_lo10:
37+  case Sparc::fixup_sparc_tls_ldm_lo10:
38+  case Sparc::fixup_sparc_tls_ie_lo10:
39   case Sparc::fixup_sparc_lo10:
40     return Value & 0x3ff;
41+
42+  case Sparc::fixup_sparc_tls_ldo_hix22:
43+  case Sparc::fixup_sparc_tls_le_hix22:
44+    return (~Value >> 10) & 0x3fffff;
45+
46+  case Sparc::fixup_sparc_tls_ldo_lox10:
47+  case Sparc::fixup_sparc_tls_le_lox10:
48+    return (~(~Value & 0x3ff)) & 0x1fff;
49+
50   case Sparc::fixup_sparc_h44:
51     return (Value >> 22) & 0x3fffff;
52+
53   case Sparc::fixup_sparc_m44:
54     return (Value >> 12) & 0x3ff;
55+
56   case Sparc::fixup_sparc_l44:
57     return Value & 0xfff;
58+
59   case Sparc::fixup_sparc_hh:
60     return (Value >> 42) & 0x3fffff;
61+
62   case Sparc::fixup_sparc_hm:
63     return (Value >> 32) & 0x3ff;
64+
65+  case Sparc::fixup_sparc_tls_gd_add:
66+  case Sparc::fixup_sparc_tls_gd_call:
67+  case Sparc::fixup_sparc_tls_ldm_add:
68+  case Sparc::fixup_sparc_tls_ldm_call:
69+  case Sparc::fixup_sparc_tls_ldo_add:
70+  case Sparc::fixup_sparc_tls_ie_ld:
71+  case Sparc::fixup_sparc_tls_ie_ldx:
72+  case Sparc::fixup_sparc_tls_ie_add:
73+    return 0;
74   }
75 }
76 
77@@ -81,7 +115,25 @@ namespace {
78         { "fixup_sparc_pc10",      22,     10,  MCFixupKindInfo::FKF_IsPCRel },
79         { "fixup_sparc_got22",     10,     22,  0 },
80         { "fixup_sparc_got10",     22,     10,  0 },
81-        { "fixup_sparc_wplt30",     2,     30,  MCFixupKindInfo::FKF_IsPCRel }
82+        { "fixup_sparc_wplt30",     2,     30,  MCFixupKindInfo::FKF_IsPCRel },
83+        { "fixup_sparc_tls_gd_hi22",   10, 22,  0 },
84+        { "fixup_sparc_tls_gd_lo10",   22, 10,  0 },
85+        { "fixup_sparc_tls_gd_add",     0,  0,  0 },
86+        { "fixup_sparc_tls_gd_call",    0,  0,  0 },
87+        { "fixup_sparc_tls_ldm_hi22",  10, 22,  0 },
88+        { "fixup_sparc_tls_ldm_lo10",  22, 10,  0 },
89+        { "fixup_sparc_tls_ldm_add",    0,  0,  0 },
90+        { "fixup_sparc_tls_ldm_call",   0,  0,  0 },
91+        { "fixup_sparc_tls_ldo_hix22", 10, 22,  0 },
92+        { "fixup_sparc_tls_ldo_lox10", 22, 10,  0 },
93+        { "fixup_sparc_tls_ldo_add",    0,  0,  0 },
94+        { "fixup_sparc_tls_ie_hi22",   10, 22,  0 },
95+        { "fixup_sparc_tls_ie_lo10",   22, 10,  0 },
96+        { "fixup_sparc_tls_ie_ld",      0,  0,  0 },
97+        { "fixup_sparc_tls_ie_ldx",     0,  0,  0 },
98+        { "fixup_sparc_tls_ie_add",     0,  0,  0 },
99+        { "fixup_sparc_tls_le_hix22",   0,  0,  0 },
100+        { "fixup_sparc_tls_le_lox10",   0,  0,  0 }
101       };
102 
103       if (Kind < FirstTargetFixupKind)
104@@ -101,11 +153,28 @@ namespace {
105                            bool &IsResolved) {
106       switch ((Sparc::Fixups)Fixup.getKind()) {
107       default: break;
108-      case Sparc::fixup_sparc_wplt30: IsResolved = false; break;
109+      case Sparc::fixup_sparc_wplt30:
110+      case Sparc::fixup_sparc_tls_gd_hi22:
111+      case Sparc::fixup_sparc_tls_gd_lo10:
112+      case Sparc::fixup_sparc_tls_gd_add:
113+      case Sparc::fixup_sparc_tls_gd_call:
114+      case Sparc::fixup_sparc_tls_ldm_hi22:
115+      case Sparc::fixup_sparc_tls_ldm_lo10:
116+      case Sparc::fixup_sparc_tls_ldm_add:
117+      case Sparc::fixup_sparc_tls_ldm_call:
118+      case Sparc::fixup_sparc_tls_ldo_hix22:
119+      case Sparc::fixup_sparc_tls_ldo_lox10:
120+      case Sparc::fixup_sparc_tls_ldo_add:
121+      case Sparc::fixup_sparc_tls_ie_hi22:
122+      case Sparc::fixup_sparc_tls_ie_lo10:
123+      case Sparc::fixup_sparc_tls_ie_ld:
124+      case Sparc::fixup_sparc_tls_ie_ldx:
125+      case Sparc::fixup_sparc_tls_ie_add:
126+      case Sparc::fixup_sparc_tls_le_hix22:
127+      case Sparc::fixup_sparc_tls_le_lox10:  IsResolved = false; break;
128       }
129     }
130 
131-
132     bool mayNeedRelaxation(const MCInst &Inst) const {
133       // FIXME.
134       return false;
135Index: lib/Target/Sparc/MCTargetDesc/SparcFixupKinds.h
136===================================================================
137--- lib/Target/Sparc/MCTargetDesc/SparcFixupKinds.h
138+++ lib/Target/Sparc/MCTargetDesc/SparcFixupKinds.h
139@@ -63,6 +63,26 @@ namespace llvm {
140       /// fixup_sparc_wplt30
141       fixup_sparc_wplt30,
142 
143+      /// fixups for Thread Local Storage
144+      fixup_sparc_tls_gd_hi22,
145+      fixup_sparc_tls_gd_lo10,
146+      fixup_sparc_tls_gd_add,
147+      fixup_sparc_tls_gd_call,
148+      fixup_sparc_tls_ldm_hi22,
149+      fixup_sparc_tls_ldm_lo10,
150+      fixup_sparc_tls_ldm_add,
151+      fixup_sparc_tls_ldm_call,
152+      fixup_sparc_tls_ldo_hix22,
153+      fixup_sparc_tls_ldo_lox10,
154+      fixup_sparc_tls_ldo_add,
155+      fixup_sparc_tls_ie_hi22,
156+      fixup_sparc_tls_ie_lo10,
157+      fixup_sparc_tls_ie_ld,
158+      fixup_sparc_tls_ie_ldx,
159+      fixup_sparc_tls_ie_add,
160+      fixup_sparc_tls_le_hix22,
161+      fixup_sparc_tls_le_lox10,
162+
163       // Marker
164       LastTargetFixupKind,
165       NumTargetFixupKinds = LastTargetFixupKind - FirstTargetFixupKind
166Index: lib/Target/Sparc/MCTargetDesc/SparcELFObjectWriter.cpp
167===================================================================
168--- lib/Target/Sparc/MCTargetDesc/SparcELFObjectWriter.cpp
169+++ lib/Target/Sparc/MCTargetDesc/SparcELFObjectWriter.cpp
170@@ -91,6 +91,24 @@ unsigned SparcELFObjectWriter::GetRelocType(const
171   case Sparc::fixup_sparc_hm:    return ELF::R_SPARC_HM10;
172   case Sparc::fixup_sparc_got22: return ELF::R_SPARC_GOT22;
173   case Sparc::fixup_sparc_got10: return ELF::R_SPARC_GOT10;
174+  case Sparc::fixup_sparc_tls_gd_hi22:   return ELF::R_SPARC_TLS_GD_HI22;
175+  case Sparc::fixup_sparc_tls_gd_lo10:   return ELF::R_SPARC_TLS_GD_LO10;
176+  case Sparc::fixup_sparc_tls_gd_add:    return ELF::R_SPARC_TLS_GD_ADD;
177+  case Sparc::fixup_sparc_tls_gd_call:   return ELF::R_SPARC_TLS_GD_CALL;
178+  case Sparc::fixup_sparc_tls_ldm_hi22:  return ELF::R_SPARC_TLS_LDM_HI22;
179+  case Sparc::fixup_sparc_tls_ldm_lo10:  return ELF::R_SPARC_TLS_LDM_LO10;
180+  case Sparc::fixup_sparc_tls_ldm_add:   return ELF::R_SPARC_TLS_LDM_ADD;
181+  case Sparc::fixup_sparc_tls_ldm_call:  return ELF::R_SPARC_TLS_LDM_CALL;
182+  case Sparc::fixup_sparc_tls_ldo_hix22: return ELF::R_SPARC_TLS_LDO_HIX22;
183+  case Sparc::fixup_sparc_tls_ldo_lox10: return ELF::R_SPARC_TLS_LDO_LOX10;
184+  case Sparc::fixup_sparc_tls_ldo_add:   return ELF::R_SPARC_TLS_LDO_ADD;
185+  case Sparc::fixup_sparc_tls_ie_hi22:   return ELF::R_SPARC_TLS_IE_HI22;
186+  case Sparc::fixup_sparc_tls_ie_lo10:   return ELF::R_SPARC_TLS_IE_LO10;
187+  case Sparc::fixup_sparc_tls_ie_ld:     return ELF::R_SPARC_TLS_IE_LD;
188+  case Sparc::fixup_sparc_tls_ie_ldx:    return ELF::R_SPARC_TLS_IE_LDX;
189+  case Sparc::fixup_sparc_tls_ie_add:    return ELF::R_SPARC_TLS_IE_ADD;
190+  case Sparc::fixup_sparc_tls_le_hix22:  return ELF::R_SPARC_TLS_LE_HIX22;
191+  case Sparc::fixup_sparc_tls_le_lox10:  return ELF::R_SPARC_TLS_LE_LOX10;
192   }
193 
194   return ELF::R_SPARC_NONE;
195Index: lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp
196===================================================================
197--- lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp
198+++ lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp
199@@ -135,6 +135,25 @@ Sparc::Fixups SparcMCExpr::getFixupKind(SparcMCExp
200   case VK_Sparc_PC10:     return Sparc::fixup_sparc_pc10;
201   case VK_Sparc_GOT22:    return Sparc::fixup_sparc_got22;
202   case VK_Sparc_GOT10:    return Sparc::fixup_sparc_got10;
203+  case VK_Sparc_WPLT30:   return Sparc::fixup_sparc_wplt30;
204+  case VK_Sparc_TLS_GD_HI22:   return Sparc::fixup_sparc_tls_gd_hi22;
205+  case VK_Sparc_TLS_GD_LO10:   return Sparc::fixup_sparc_tls_gd_lo10;
206+  case VK_Sparc_TLS_GD_ADD:    return Sparc::fixup_sparc_tls_gd_add;
207+  case VK_Sparc_TLS_GD_CALL:   return Sparc::fixup_sparc_tls_gd_call;
208+  case VK_Sparc_TLS_LDM_HI22:  return Sparc::fixup_sparc_tls_ldm_hi22;
209+  case VK_Sparc_TLS_LDM_LO10:  return Sparc::fixup_sparc_tls_ldm_lo10;
210+  case VK_Sparc_TLS_LDM_ADD:   return Sparc::fixup_sparc_tls_ldm_add;
211+  case VK_Sparc_TLS_LDM_CALL:  return Sparc::fixup_sparc_tls_ldm_call;
212+  case VK_Sparc_TLS_LDO_HIX22: return Sparc::fixup_sparc_tls_ldo_hix22;
213+  case VK_Sparc_TLS_LDO_LOX10: return Sparc::fixup_sparc_tls_ldo_lox10;
214+  case VK_Sparc_TLS_LDO_ADD:   return Sparc::fixup_sparc_tls_ldo_add;
215+  case VK_Sparc_TLS_IE_HI22:   return Sparc::fixup_sparc_tls_ie_hi22;
216+  case VK_Sparc_TLS_IE_LO10:   return Sparc::fixup_sparc_tls_ie_lo10;
217+  case VK_Sparc_TLS_IE_LD:     return Sparc::fixup_sparc_tls_ie_ld;
218+  case VK_Sparc_TLS_IE_LDX:    return Sparc::fixup_sparc_tls_ie_ldx;
219+  case VK_Sparc_TLS_IE_ADD:    return Sparc::fixup_sparc_tls_ie_add;
220+  case VK_Sparc_TLS_LE_HIX22:  return Sparc::fixup_sparc_tls_le_hix22;
221+  case VK_Sparc_TLS_LE_LOX10:  return Sparc::fixup_sparc_tls_le_lox10;
222   }
223 }
224 
225@@ -147,7 +166,33 @@ SparcMCExpr::EvaluateAsRelocatableImpl(MCValue &Re
226 }
227 
228 static void fixELFSymbolsInTLSFixupsImpl(const MCExpr *Expr, MCAssembler &Asm) {
229-  assert(0 && "Implement fixELFSymbolsInTLSFixupsImpl!");
230+  switch (Expr->getKind()) {
231+  case MCExpr::Target:
232+    llvm_unreachable("Can't handle nested target expr!");
233+    break;
234+
235+  case MCExpr::Constant:
236+    break;
237+
238+  case MCExpr::Binary: {
239+    const MCBinaryExpr *BE = cast<MCBinaryExpr>(Expr);
240+    fixELFSymbolsInTLSFixupsImpl(BE->getLHS(), Asm);
241+    fixELFSymbolsInTLSFixupsImpl(BE->getRHS(), Asm);
242+    break;
243+  }
244+
245+  case MCExpr::SymbolRef: {
246+    const MCSymbolRefExpr &SymRef = *cast<MCSymbolRefExpr>(Expr);
247+    MCSymbolData &SD = Asm.getOrCreateSymbolData(SymRef.getSymbol());
248+    MCELF::SetType(SD, ELF::STT_TLS);
249+    break;
250+  }
251+
252+  case MCExpr::Unary:
253+    fixELFSymbolsInTLSFixupsImpl(cast<MCUnaryExpr>(Expr)->getSubExpr(), Asm);
254+    break;
255+  }
256+
257 }
258 
259 void SparcMCExpr::fixELFSymbolsInTLSFixups(MCAssembler &Asm) const {
260Index: lib/Target/Sparc/MCTargetDesc/SparcMCCodeEmitter.cpp
261===================================================================
262--- lib/Target/Sparc/MCTargetDesc/SparcMCCodeEmitter.cpp
263+++ lib/Target/Sparc/MCTargetDesc/SparcMCCodeEmitter.cpp
264@@ -20,6 +20,7 @@
265 #include "llvm/MC/MCExpr.h"
266 #include "llvm/MC/MCInst.h"
267 #include "llvm/MC/MCRegisterInfo.h"
268+#include "llvm/MC/MCSymbol.h"
269 #include "llvm/ADT/Statistic.h"
270 #include "llvm/Support/raw_ostream.h"
271 
272@@ -76,6 +77,21 @@ EncodeInstruction(const MCInst &MI, raw_ostream &O
273     OS << (char)(Bits >> 24);
274     Bits <<= 8;
275   }
276+  unsigned tlsOpNo = 0;
277+  switch (MI.getOpcode()) {
278+  default: break;
279+  case SP::TLS_CALL:   tlsOpNo = 1; break;
280+  case SP::TLS_ADDrr:
281+  case SP::TLS_ADDXrr:
282+  case SP::TLS_LDrr:
283+  case SP::TLS_LDXrr:  tlsOpNo = 3; break;
284+  }
285+  if (tlsOpNo != 0) {
286+    const MCOperand &MO = MI.getOperand(tlsOpNo);
287+    uint64_t op = getMachineOpValue(MI, MO, Fixups);
288+    assert(op == 0 && "Unexpected operand value!");
289+    (void)op; // suppress warning.
290+  }
291 
292   ++MCNumEmitted;  // Keep track of the # of mi's emitted.
293 }
294@@ -114,6 +130,21 @@ getCallTargetOpValue(const MCInst &MI, unsigned Op
295   if (MO.isReg() || MO.isImm())
296     return getMachineOpValue(MI, MO, Fixups);
297 
298+  if (MI.getOpcode() == SP::TLS_CALL) {
299+    // No fixups for __tls_get_addr. Will emit for fixups for tls_symbol in
300+    // EncodeInstruction.
301+#ifndef NDEBUG
302+    // Verify that the callee is actually __tls_get_addr.
303+    const SparcMCExpr *SExpr = dyn_cast<SparcMCExpr>(MO.getExpr());
304+    assert(SExpr && SExpr->getSubExpr()->getKind() == MCExpr::SymbolRef &&
305+           "Unexpected expression in TLS_CALL");
306+    const MCSymbolRefExpr *SymExpr = cast<MCSymbolRefExpr>(SExpr->getSubExpr());
307+    assert(SymExpr->getSymbol().getName() == "__tls_get_addr" &&
308+           "Unexpected function for TLS_CALL");
309+#endif
310+    return 0;
311+  }
312+
313   MCFixupKind fixupKind = (MCFixupKind)Sparc::fixup_sparc_call30;
314 
315   if (const SparcMCExpr *SExpr = dyn_cast<SparcMCExpr>(MO.getExpr())) {
316Index: test/CodeGen/SPARC/tls.ll
317===================================================================
318--- test/CodeGen/SPARC/tls.ll
319+++ test/CodeGen/SPARC/tls.ll
320@@ -3,6 +3,10 @@
321 ; RUN: llc <%s -march=sparc   -relocation-model=pic    | FileCheck %s --check-prefix=pic
322 ; RUN: llc <%s -march=sparcv9 -relocation-model=pic    | FileCheck %s --check-prefix=pic
323 
324+; RUN: llc <%s -march=sparc   -relocation-model=static -filetype=obj | llvm-readobj -r | FileCheck %s --check-prefix=v8abs-obj
325+; RUN: llc <%s -march=sparcv9 -relocation-model=static -filetype=obj | llvm-readobj -r | FileCheck %s --check-prefix=v9abs-obj
326+; RUN: llc <%s -march=sparc   -relocation-model=pic    -filetype=obj | llvm-readobj -r | FileCheck %s --check-prefix=pic-obj
327+; RUN: llc <%s -march=sparcv9 -relocation-model=pic    -filetype=obj | llvm-readobj -r | FileCheck %s --check-prefix=pic-obj
328 
329 @local_symbol = internal thread_local global i32 0
330 @extern_symbol = external thread_local global i32
331@@ -69,3 +73,47 @@ entry:
332   store i32 %1, i32* @extern_symbol, align 4
333   ret i32 %1
334 }
335+
336+
337+; v8abs-obj: Relocations [
338+; v8abs-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_LE_HIX22 local_symbol 0x0
339+; v8abs-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_LE_LOX10 local_symbol 0x0
340+; v8abs-obj:    0x{{[0-9,A-F]+}} R_SPARC_HI22 _GLOBAL_OFFSET_TABLE_ 0x0
341+; v8abs-obj:    0x{{[0-9,A-F]+}} R_SPARC_LO10 _GLOBAL_OFFSET_TABLE_ 0x0
342+; v8abs-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_IE_HI22 extern_symbol 0x0
343+; v8abs-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_IE_LO10 extern_symbol 0x0
344+; v8abs-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_IE_LD extern_symbol 0x0
345+; v8abs-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_IE_ADD extern_symbol 0x0
346+; v8abs-obj: ]
347+
348+; v9abs-obj: Relocations [
349+; v9abs-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_LE_HIX22 local_symbol 0x0
350+; v9abs-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_LE_LOX10 local_symbol 0x0
351+; v9abs-obj:    0x{{[0-9,A-F]+}} R_SPARC_H44 _GLOBAL_OFFSET_TABLE_ 0x0
352+; v9abs-obj:    0x{{[0-9,A-F]+}} R_SPARC_M44 _GLOBAL_OFFSET_TABLE_ 0x0
353+; v9abs-obj:    0x{{[0-9,A-F]+}} R_SPARC_L44 _GLOBAL_OFFSET_TABLE_ 0x0
354+; v9abs-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_IE_HI22 extern_symbol 0x0
355+; v9abs-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_IE_LO10 extern_symbol 0x0
356+; v9abs-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_IE_LDX extern_symbol 0x0
357+; v9abs-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_IE_ADD extern_symbol 0x0
358+; v9abs-obj: ]
359+
360+; pic-obj: Relocations [
361+; pic-obj:  Section (2) .rela.text {
362+; pic-obj:    0x{{[0-9,A-F]+}} R_SPARC_PC22 _GLOBAL_OFFSET_TABLE_ 0x4
363+; pic-obj:    0x{{[0-9,A-F]+}} R_SPARC_PC10 _GLOBAL_OFFSET_TABLE_ 0x8
364+; pic-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_LDO_HIX22 local_symbol 0x0
365+; pic-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_LDO_LOX10 local_symbol 0x0
366+; pic-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_LDM_HI22 local_symbol 0x0
367+; pic-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_LDM_LO10 local_symbol 0x0
368+; pic-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_LDM_ADD local_symbol 0x0
369+; pic-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_LDM_CALL local_symbol 0x0
370+; pic-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_LDO_ADD local_symbol 0x0
371+; pic-obj:    0x{{[0-9,A-F]+}} R_SPARC_PC22 _GLOBAL_OFFSET_TABLE_ 0x4
372+; pic-obj:    0x{{[0-9,A-F]+}} R_SPARC_PC10 _GLOBAL_OFFSET_TABLE_ 0x8
373+; pic-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_GD_HI22 extern_symbol 0x0
374+; pic-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_GD_LO10 extern_symbol 0x0
375+; pic-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_GD_ADD extern_symbol 0x0
376+; pic-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_GD_CALL extern_symbol 0x0
377+; pic-obj: ]
378+
379