]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - contrib/llvm/patches/patch-r262261-llvm-r200962-sparc.diff
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / contrib / llvm / patches / patch-r262261-llvm-r200962-sparc.diff
1 Pull 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
5 Introduced here: http://svnweb.freebsd.org/changeset/base/262261
6
7 Index: 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;
135 Index: 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
166 Index: 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;
195 Index: 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 {
260 Index: 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())) {
316 Index: 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 +