1263320SdimPull in r200962 from upstream llvm trunk (by Venkatraman Govindaraju):
2263320Sdim
3263320Sdim  [Sparc] Emit relocations for Thread Local Storage (TLS) when integrated assembler is used.
4263320Sdim
5269012SemasteIntroduced here: http://svnweb.freebsd.org/changeset/base/262261
6263320Sdim
7263320SdimIndex: lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp
8263320Sdim===================================================================
9263320Sdim--- lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp
10263320Sdim+++ lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp
11263320Sdim@@ -26,31 +26,65 @@ static unsigned adjustFixupValue(unsigned Kind, ui
12263320Sdim   case FK_Data_4:
13263320Sdim   case FK_Data_8:
14263320Sdim     return Value;
15263320Sdim+
16263320Sdim   case Sparc::fixup_sparc_wplt30:
17263320Sdim   case Sparc::fixup_sparc_call30:
18263320Sdim     return (Value >> 2) & 0x3fffffff;
19263320Sdim+
20263320Sdim   case Sparc::fixup_sparc_br22:
21263320Sdim     return (Value >> 2) & 0x3fffff;
22263320Sdim+
23263320Sdim   case Sparc::fixup_sparc_br19:
24263320Sdim     return (Value >> 2) & 0x7ffff;
25263320Sdim+
26263320Sdim   case Sparc::fixup_sparc_pc22:
27263320Sdim   case Sparc::fixup_sparc_got22:
28263320Sdim+  case Sparc::fixup_sparc_tls_gd_hi22:
29263320Sdim+  case Sparc::fixup_sparc_tls_ldm_hi22:
30263320Sdim+  case Sparc::fixup_sparc_tls_ie_hi22:
31263320Sdim   case Sparc::fixup_sparc_hi22:
32263320Sdim     return (Value >> 10) & 0x3fffff;
33263320Sdim+
34263320Sdim   case Sparc::fixup_sparc_pc10:
35263320Sdim   case Sparc::fixup_sparc_got10:
36263320Sdim+  case Sparc::fixup_sparc_tls_gd_lo10:
37263320Sdim+  case Sparc::fixup_sparc_tls_ldm_lo10:
38263320Sdim+  case Sparc::fixup_sparc_tls_ie_lo10:
39263320Sdim   case Sparc::fixup_sparc_lo10:
40263320Sdim     return Value & 0x3ff;
41263320Sdim+
42263320Sdim+  case Sparc::fixup_sparc_tls_ldo_hix22:
43263320Sdim+  case Sparc::fixup_sparc_tls_le_hix22:
44263320Sdim+    return (~Value >> 10) & 0x3fffff;
45263320Sdim+
46263320Sdim+  case Sparc::fixup_sparc_tls_ldo_lox10:
47263320Sdim+  case Sparc::fixup_sparc_tls_le_lox10:
48263320Sdim+    return (~(~Value & 0x3ff)) & 0x1fff;
49263320Sdim+
50263320Sdim   case Sparc::fixup_sparc_h44:
51263320Sdim     return (Value >> 22) & 0x3fffff;
52263320Sdim+
53263320Sdim   case Sparc::fixup_sparc_m44:
54263320Sdim     return (Value >> 12) & 0x3ff;
55263320Sdim+
56263320Sdim   case Sparc::fixup_sparc_l44:
57263320Sdim     return Value & 0xfff;
58263320Sdim+
59263320Sdim   case Sparc::fixup_sparc_hh:
60263320Sdim     return (Value >> 42) & 0x3fffff;
61263320Sdim+
62263320Sdim   case Sparc::fixup_sparc_hm:
63263320Sdim     return (Value >> 32) & 0x3ff;
64263320Sdim+
65263320Sdim+  case Sparc::fixup_sparc_tls_gd_add:
66263320Sdim+  case Sparc::fixup_sparc_tls_gd_call:
67263320Sdim+  case Sparc::fixup_sparc_tls_ldm_add:
68263320Sdim+  case Sparc::fixup_sparc_tls_ldm_call:
69263320Sdim+  case Sparc::fixup_sparc_tls_ldo_add:
70263320Sdim+  case Sparc::fixup_sparc_tls_ie_ld:
71263320Sdim+  case Sparc::fixup_sparc_tls_ie_ldx:
72263320Sdim+  case Sparc::fixup_sparc_tls_ie_add:
73263320Sdim+    return 0;
74263320Sdim   }
75263320Sdim }
76263320Sdim 
77263320Sdim@@ -81,7 +115,25 @@ namespace {
78263320Sdim         { "fixup_sparc_pc10",      22,     10,  MCFixupKindInfo::FKF_IsPCRel },
79263320Sdim         { "fixup_sparc_got22",     10,     22,  0 },
80263320Sdim         { "fixup_sparc_got10",     22,     10,  0 },
81263320Sdim-        { "fixup_sparc_wplt30",     2,     30,  MCFixupKindInfo::FKF_IsPCRel }
82263320Sdim+        { "fixup_sparc_wplt30",     2,     30,  MCFixupKindInfo::FKF_IsPCRel },
83263320Sdim+        { "fixup_sparc_tls_gd_hi22",   10, 22,  0 },
84263320Sdim+        { "fixup_sparc_tls_gd_lo10",   22, 10,  0 },
85263320Sdim+        { "fixup_sparc_tls_gd_add",     0,  0,  0 },
86263320Sdim+        { "fixup_sparc_tls_gd_call",    0,  0,  0 },
87263320Sdim+        { "fixup_sparc_tls_ldm_hi22",  10, 22,  0 },
88263320Sdim+        { "fixup_sparc_tls_ldm_lo10",  22, 10,  0 },
89263320Sdim+        { "fixup_sparc_tls_ldm_add",    0,  0,  0 },
90263320Sdim+        { "fixup_sparc_tls_ldm_call",   0,  0,  0 },
91263320Sdim+        { "fixup_sparc_tls_ldo_hix22", 10, 22,  0 },
92263320Sdim+        { "fixup_sparc_tls_ldo_lox10", 22, 10,  0 },
93263320Sdim+        { "fixup_sparc_tls_ldo_add",    0,  0,  0 },
94263320Sdim+        { "fixup_sparc_tls_ie_hi22",   10, 22,  0 },
95263320Sdim+        { "fixup_sparc_tls_ie_lo10",   22, 10,  0 },
96263320Sdim+        { "fixup_sparc_tls_ie_ld",      0,  0,  0 },
97263320Sdim+        { "fixup_sparc_tls_ie_ldx",     0,  0,  0 },
98263320Sdim+        { "fixup_sparc_tls_ie_add",     0,  0,  0 },
99263320Sdim+        { "fixup_sparc_tls_le_hix22",   0,  0,  0 },
100263320Sdim+        { "fixup_sparc_tls_le_lox10",   0,  0,  0 }
101263320Sdim       };
102263320Sdim 
103263320Sdim       if (Kind < FirstTargetFixupKind)
104263320Sdim@@ -101,11 +153,28 @@ namespace {
105263320Sdim                            bool &IsResolved) {
106263320Sdim       switch ((Sparc::Fixups)Fixup.getKind()) {
107263320Sdim       default: break;
108263320Sdim-      case Sparc::fixup_sparc_wplt30: IsResolved = false; break;
109263320Sdim+      case Sparc::fixup_sparc_wplt30:
110263320Sdim+      case Sparc::fixup_sparc_tls_gd_hi22:
111263320Sdim+      case Sparc::fixup_sparc_tls_gd_lo10:
112263320Sdim+      case Sparc::fixup_sparc_tls_gd_add:
113263320Sdim+      case Sparc::fixup_sparc_tls_gd_call:
114263320Sdim+      case Sparc::fixup_sparc_tls_ldm_hi22:
115263320Sdim+      case Sparc::fixup_sparc_tls_ldm_lo10:
116263320Sdim+      case Sparc::fixup_sparc_tls_ldm_add:
117263320Sdim+      case Sparc::fixup_sparc_tls_ldm_call:
118263320Sdim+      case Sparc::fixup_sparc_tls_ldo_hix22:
119263320Sdim+      case Sparc::fixup_sparc_tls_ldo_lox10:
120263320Sdim+      case Sparc::fixup_sparc_tls_ldo_add:
121263320Sdim+      case Sparc::fixup_sparc_tls_ie_hi22:
122263320Sdim+      case Sparc::fixup_sparc_tls_ie_lo10:
123263320Sdim+      case Sparc::fixup_sparc_tls_ie_ld:
124263320Sdim+      case Sparc::fixup_sparc_tls_ie_ldx:
125263320Sdim+      case Sparc::fixup_sparc_tls_ie_add:
126263320Sdim+      case Sparc::fixup_sparc_tls_le_hix22:
127263320Sdim+      case Sparc::fixup_sparc_tls_le_lox10:  IsResolved = false; break;
128263320Sdim       }
129263320Sdim     }
130263320Sdim 
131263320Sdim-
132263320Sdim     bool mayNeedRelaxation(const MCInst &Inst) const {
133263320Sdim       // FIXME.
134263320Sdim       return false;
135263320SdimIndex: lib/Target/Sparc/MCTargetDesc/SparcFixupKinds.h
136263320Sdim===================================================================
137263320Sdim--- lib/Target/Sparc/MCTargetDesc/SparcFixupKinds.h
138263320Sdim+++ lib/Target/Sparc/MCTargetDesc/SparcFixupKinds.h
139263320Sdim@@ -63,6 +63,26 @@ namespace llvm {
140263320Sdim       /// fixup_sparc_wplt30
141263320Sdim       fixup_sparc_wplt30,
142263320Sdim 
143263320Sdim+      /// fixups for Thread Local Storage
144263320Sdim+      fixup_sparc_tls_gd_hi22,
145263320Sdim+      fixup_sparc_tls_gd_lo10,
146263320Sdim+      fixup_sparc_tls_gd_add,
147263320Sdim+      fixup_sparc_tls_gd_call,
148263320Sdim+      fixup_sparc_tls_ldm_hi22,
149263320Sdim+      fixup_sparc_tls_ldm_lo10,
150263320Sdim+      fixup_sparc_tls_ldm_add,
151263320Sdim+      fixup_sparc_tls_ldm_call,
152263320Sdim+      fixup_sparc_tls_ldo_hix22,
153263320Sdim+      fixup_sparc_tls_ldo_lox10,
154263320Sdim+      fixup_sparc_tls_ldo_add,
155263320Sdim+      fixup_sparc_tls_ie_hi22,
156263320Sdim+      fixup_sparc_tls_ie_lo10,
157263320Sdim+      fixup_sparc_tls_ie_ld,
158263320Sdim+      fixup_sparc_tls_ie_ldx,
159263320Sdim+      fixup_sparc_tls_ie_add,
160263320Sdim+      fixup_sparc_tls_le_hix22,
161263320Sdim+      fixup_sparc_tls_le_lox10,
162263320Sdim+
163263320Sdim       // Marker
164263320Sdim       LastTargetFixupKind,
165263320Sdim       NumTargetFixupKinds = LastTargetFixupKind - FirstTargetFixupKind
166263320SdimIndex: lib/Target/Sparc/MCTargetDesc/SparcELFObjectWriter.cpp
167263320Sdim===================================================================
168263320Sdim--- lib/Target/Sparc/MCTargetDesc/SparcELFObjectWriter.cpp
169263320Sdim+++ lib/Target/Sparc/MCTargetDesc/SparcELFObjectWriter.cpp
170263320Sdim@@ -91,6 +91,24 @@ unsigned SparcELFObjectWriter::GetRelocType(const
171263320Sdim   case Sparc::fixup_sparc_hm:    return ELF::R_SPARC_HM10;
172263320Sdim   case Sparc::fixup_sparc_got22: return ELF::R_SPARC_GOT22;
173263320Sdim   case Sparc::fixup_sparc_got10: return ELF::R_SPARC_GOT10;
174263320Sdim+  case Sparc::fixup_sparc_tls_gd_hi22:   return ELF::R_SPARC_TLS_GD_HI22;
175263320Sdim+  case Sparc::fixup_sparc_tls_gd_lo10:   return ELF::R_SPARC_TLS_GD_LO10;
176263320Sdim+  case Sparc::fixup_sparc_tls_gd_add:    return ELF::R_SPARC_TLS_GD_ADD;
177263320Sdim+  case Sparc::fixup_sparc_tls_gd_call:   return ELF::R_SPARC_TLS_GD_CALL;
178263320Sdim+  case Sparc::fixup_sparc_tls_ldm_hi22:  return ELF::R_SPARC_TLS_LDM_HI22;
179263320Sdim+  case Sparc::fixup_sparc_tls_ldm_lo10:  return ELF::R_SPARC_TLS_LDM_LO10;
180263320Sdim+  case Sparc::fixup_sparc_tls_ldm_add:   return ELF::R_SPARC_TLS_LDM_ADD;
181263320Sdim+  case Sparc::fixup_sparc_tls_ldm_call:  return ELF::R_SPARC_TLS_LDM_CALL;
182263320Sdim+  case Sparc::fixup_sparc_tls_ldo_hix22: return ELF::R_SPARC_TLS_LDO_HIX22;
183263320Sdim+  case Sparc::fixup_sparc_tls_ldo_lox10: return ELF::R_SPARC_TLS_LDO_LOX10;
184263320Sdim+  case Sparc::fixup_sparc_tls_ldo_add:   return ELF::R_SPARC_TLS_LDO_ADD;
185263320Sdim+  case Sparc::fixup_sparc_tls_ie_hi22:   return ELF::R_SPARC_TLS_IE_HI22;
186263320Sdim+  case Sparc::fixup_sparc_tls_ie_lo10:   return ELF::R_SPARC_TLS_IE_LO10;
187263320Sdim+  case Sparc::fixup_sparc_tls_ie_ld:     return ELF::R_SPARC_TLS_IE_LD;
188263320Sdim+  case Sparc::fixup_sparc_tls_ie_ldx:    return ELF::R_SPARC_TLS_IE_LDX;
189263320Sdim+  case Sparc::fixup_sparc_tls_ie_add:    return ELF::R_SPARC_TLS_IE_ADD;
190263320Sdim+  case Sparc::fixup_sparc_tls_le_hix22:  return ELF::R_SPARC_TLS_LE_HIX22;
191263320Sdim+  case Sparc::fixup_sparc_tls_le_lox10:  return ELF::R_SPARC_TLS_LE_LOX10;
192263320Sdim   }
193263320Sdim 
194263320Sdim   return ELF::R_SPARC_NONE;
195263320SdimIndex: lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp
196263320Sdim===================================================================
197263320Sdim--- lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp
198263320Sdim+++ lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp
199263320Sdim@@ -135,6 +135,25 @@ Sparc::Fixups SparcMCExpr::getFixupKind(SparcMCExp
200263320Sdim   case VK_Sparc_PC10:     return Sparc::fixup_sparc_pc10;
201263320Sdim   case VK_Sparc_GOT22:    return Sparc::fixup_sparc_got22;
202263320Sdim   case VK_Sparc_GOT10:    return Sparc::fixup_sparc_got10;
203263320Sdim+  case VK_Sparc_WPLT30:   return Sparc::fixup_sparc_wplt30;
204263320Sdim+  case VK_Sparc_TLS_GD_HI22:   return Sparc::fixup_sparc_tls_gd_hi22;
205263320Sdim+  case VK_Sparc_TLS_GD_LO10:   return Sparc::fixup_sparc_tls_gd_lo10;
206263320Sdim+  case VK_Sparc_TLS_GD_ADD:    return Sparc::fixup_sparc_tls_gd_add;
207263320Sdim+  case VK_Sparc_TLS_GD_CALL:   return Sparc::fixup_sparc_tls_gd_call;
208263320Sdim+  case VK_Sparc_TLS_LDM_HI22:  return Sparc::fixup_sparc_tls_ldm_hi22;
209263320Sdim+  case VK_Sparc_TLS_LDM_LO10:  return Sparc::fixup_sparc_tls_ldm_lo10;
210263320Sdim+  case VK_Sparc_TLS_LDM_ADD:   return Sparc::fixup_sparc_tls_ldm_add;
211263320Sdim+  case VK_Sparc_TLS_LDM_CALL:  return Sparc::fixup_sparc_tls_ldm_call;
212263320Sdim+  case VK_Sparc_TLS_LDO_HIX22: return Sparc::fixup_sparc_tls_ldo_hix22;
213263320Sdim+  case VK_Sparc_TLS_LDO_LOX10: return Sparc::fixup_sparc_tls_ldo_lox10;
214263320Sdim+  case VK_Sparc_TLS_LDO_ADD:   return Sparc::fixup_sparc_tls_ldo_add;
215263320Sdim+  case VK_Sparc_TLS_IE_HI22:   return Sparc::fixup_sparc_tls_ie_hi22;
216263320Sdim+  case VK_Sparc_TLS_IE_LO10:   return Sparc::fixup_sparc_tls_ie_lo10;
217263320Sdim+  case VK_Sparc_TLS_IE_LD:     return Sparc::fixup_sparc_tls_ie_ld;
218263320Sdim+  case VK_Sparc_TLS_IE_LDX:    return Sparc::fixup_sparc_tls_ie_ldx;
219263320Sdim+  case VK_Sparc_TLS_IE_ADD:    return Sparc::fixup_sparc_tls_ie_add;
220263320Sdim+  case VK_Sparc_TLS_LE_HIX22:  return Sparc::fixup_sparc_tls_le_hix22;
221263320Sdim+  case VK_Sparc_TLS_LE_LOX10:  return Sparc::fixup_sparc_tls_le_lox10;
222263320Sdim   }
223263320Sdim }
224263320Sdim 
225263320Sdim@@ -147,7 +166,33 @@ SparcMCExpr::EvaluateAsRelocatableImpl(MCValue &Re
226263320Sdim }
227263320Sdim 
228263320Sdim static void fixELFSymbolsInTLSFixupsImpl(const MCExpr *Expr, MCAssembler &Asm) {
229263320Sdim-  assert(0 && "Implement fixELFSymbolsInTLSFixupsImpl!");
230263320Sdim+  switch (Expr->getKind()) {
231263320Sdim+  case MCExpr::Target:
232263320Sdim+    llvm_unreachable("Can't handle nested target expr!");
233263320Sdim+    break;
234263320Sdim+
235263320Sdim+  case MCExpr::Constant:
236263320Sdim+    break;
237263320Sdim+
238263320Sdim+  case MCExpr::Binary: {
239263320Sdim+    const MCBinaryExpr *BE = cast<MCBinaryExpr>(Expr);
240263320Sdim+    fixELFSymbolsInTLSFixupsImpl(BE->getLHS(), Asm);
241263320Sdim+    fixELFSymbolsInTLSFixupsImpl(BE->getRHS(), Asm);
242263320Sdim+    break;
243263320Sdim+  }
244263320Sdim+
245263320Sdim+  case MCExpr::SymbolRef: {
246263320Sdim+    const MCSymbolRefExpr &SymRef = *cast<MCSymbolRefExpr>(Expr);
247263320Sdim+    MCSymbolData &SD = Asm.getOrCreateSymbolData(SymRef.getSymbol());
248263320Sdim+    MCELF::SetType(SD, ELF::STT_TLS);
249263320Sdim+    break;
250263320Sdim+  }
251263320Sdim+
252263320Sdim+  case MCExpr::Unary:
253263320Sdim+    fixELFSymbolsInTLSFixupsImpl(cast<MCUnaryExpr>(Expr)->getSubExpr(), Asm);
254263320Sdim+    break;
255263320Sdim+  }
256263320Sdim+
257263320Sdim }
258263320Sdim 
259263320Sdim void SparcMCExpr::fixELFSymbolsInTLSFixups(MCAssembler &Asm) const {
260263320SdimIndex: lib/Target/Sparc/MCTargetDesc/SparcMCCodeEmitter.cpp
261263320Sdim===================================================================
262263320Sdim--- lib/Target/Sparc/MCTargetDesc/SparcMCCodeEmitter.cpp
263263320Sdim+++ lib/Target/Sparc/MCTargetDesc/SparcMCCodeEmitter.cpp
264263320Sdim@@ -20,6 +20,7 @@
265263320Sdim #include "llvm/MC/MCExpr.h"
266263320Sdim #include "llvm/MC/MCInst.h"
267263320Sdim #include "llvm/MC/MCRegisterInfo.h"
268263320Sdim+#include "llvm/MC/MCSymbol.h"
269263320Sdim #include "llvm/ADT/Statistic.h"
270263320Sdim #include "llvm/Support/raw_ostream.h"
271263320Sdim 
272263320Sdim@@ -76,6 +77,21 @@ EncodeInstruction(const MCInst &MI, raw_ostream &O
273263320Sdim     OS << (char)(Bits >> 24);
274263320Sdim     Bits <<= 8;
275263320Sdim   }
276263320Sdim+  unsigned tlsOpNo = 0;
277263320Sdim+  switch (MI.getOpcode()) {
278263320Sdim+  default: break;
279263320Sdim+  case SP::TLS_CALL:   tlsOpNo = 1; break;
280263320Sdim+  case SP::TLS_ADDrr:
281263320Sdim+  case SP::TLS_ADDXrr:
282263320Sdim+  case SP::TLS_LDrr:
283263320Sdim+  case SP::TLS_LDXrr:  tlsOpNo = 3; break;
284263320Sdim+  }
285263320Sdim+  if (tlsOpNo != 0) {
286263320Sdim+    const MCOperand &MO = MI.getOperand(tlsOpNo);
287263320Sdim+    uint64_t op = getMachineOpValue(MI, MO, Fixups);
288263320Sdim+    assert(op == 0 && "Unexpected operand value!");
289263320Sdim+    (void)op; // suppress warning.
290263320Sdim+  }
291263320Sdim 
292263320Sdim   ++MCNumEmitted;  // Keep track of the # of mi's emitted.
293263320Sdim }
294263320Sdim@@ -114,6 +130,21 @@ getCallTargetOpValue(const MCInst &MI, unsigned Op
295263320Sdim   if (MO.isReg() || MO.isImm())
296263320Sdim     return getMachineOpValue(MI, MO, Fixups);
297263320Sdim 
298263320Sdim+  if (MI.getOpcode() == SP::TLS_CALL) {
299263320Sdim+    // No fixups for __tls_get_addr. Will emit for fixups for tls_symbol in
300263320Sdim+    // EncodeInstruction.
301263320Sdim+#ifndef NDEBUG
302263320Sdim+    // Verify that the callee is actually __tls_get_addr.
303263320Sdim+    const SparcMCExpr *SExpr = dyn_cast<SparcMCExpr>(MO.getExpr());
304263320Sdim+    assert(SExpr && SExpr->getSubExpr()->getKind() == MCExpr::SymbolRef &&
305263320Sdim+           "Unexpected expression in TLS_CALL");
306263320Sdim+    const MCSymbolRefExpr *SymExpr = cast<MCSymbolRefExpr>(SExpr->getSubExpr());
307263320Sdim+    assert(SymExpr->getSymbol().getName() == "__tls_get_addr" &&
308263320Sdim+           "Unexpected function for TLS_CALL");
309263320Sdim+#endif
310263320Sdim+    return 0;
311263320Sdim+  }
312263320Sdim+
313263320Sdim   MCFixupKind fixupKind = (MCFixupKind)Sparc::fixup_sparc_call30;
314263320Sdim 
315263320Sdim   if (const SparcMCExpr *SExpr = dyn_cast<SparcMCExpr>(MO.getExpr())) {
316263320SdimIndex: test/CodeGen/SPARC/tls.ll
317263320Sdim===================================================================
318263320Sdim--- test/CodeGen/SPARC/tls.ll
319263320Sdim+++ test/CodeGen/SPARC/tls.ll
320263320Sdim@@ -3,6 +3,10 @@
321263320Sdim ; RUN: llc <%s -march=sparc   -relocation-model=pic    | FileCheck %s --check-prefix=pic
322263320Sdim ; RUN: llc <%s -march=sparcv9 -relocation-model=pic    | FileCheck %s --check-prefix=pic
323263320Sdim 
324263320Sdim+; RUN: llc <%s -march=sparc   -relocation-model=static -filetype=obj | llvm-readobj -r | FileCheck %s --check-prefix=v8abs-obj
325263320Sdim+; RUN: llc <%s -march=sparcv9 -relocation-model=static -filetype=obj | llvm-readobj -r | FileCheck %s --check-prefix=v9abs-obj
326263320Sdim+; RUN: llc <%s -march=sparc   -relocation-model=pic    -filetype=obj | llvm-readobj -r | FileCheck %s --check-prefix=pic-obj
327263320Sdim+; RUN: llc <%s -march=sparcv9 -relocation-model=pic    -filetype=obj | llvm-readobj -r | FileCheck %s --check-prefix=pic-obj
328263320Sdim 
329263320Sdim @local_symbol = internal thread_local global i32 0
330263320Sdim @extern_symbol = external thread_local global i32
331263320Sdim@@ -69,3 +73,47 @@ entry:
332263320Sdim   store i32 %1, i32* @extern_symbol, align 4
333263320Sdim   ret i32 %1
334263320Sdim }
335263320Sdim+
336263320Sdim+
337263320Sdim+; v8abs-obj: Relocations [
338263320Sdim+; v8abs-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_LE_HIX22 local_symbol 0x0
339263320Sdim+; v8abs-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_LE_LOX10 local_symbol 0x0
340263320Sdim+; v8abs-obj:    0x{{[0-9,A-F]+}} R_SPARC_HI22 _GLOBAL_OFFSET_TABLE_ 0x0
341263320Sdim+; v8abs-obj:    0x{{[0-9,A-F]+}} R_SPARC_LO10 _GLOBAL_OFFSET_TABLE_ 0x0
342263320Sdim+; v8abs-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_IE_HI22 extern_symbol 0x0
343263320Sdim+; v8abs-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_IE_LO10 extern_symbol 0x0
344263320Sdim+; v8abs-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_IE_LD extern_symbol 0x0
345263320Sdim+; v8abs-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_IE_ADD extern_symbol 0x0
346263320Sdim+; v8abs-obj: ]
347263320Sdim+
348263320Sdim+; v9abs-obj: Relocations [
349263320Sdim+; v9abs-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_LE_HIX22 local_symbol 0x0
350263320Sdim+; v9abs-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_LE_LOX10 local_symbol 0x0
351263320Sdim+; v9abs-obj:    0x{{[0-9,A-F]+}} R_SPARC_H44 _GLOBAL_OFFSET_TABLE_ 0x0
352263320Sdim+; v9abs-obj:    0x{{[0-9,A-F]+}} R_SPARC_M44 _GLOBAL_OFFSET_TABLE_ 0x0
353263320Sdim+; v9abs-obj:    0x{{[0-9,A-F]+}} R_SPARC_L44 _GLOBAL_OFFSET_TABLE_ 0x0
354263320Sdim+; v9abs-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_IE_HI22 extern_symbol 0x0
355263320Sdim+; v9abs-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_IE_LO10 extern_symbol 0x0
356263320Sdim+; v9abs-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_IE_LDX extern_symbol 0x0
357263320Sdim+; v9abs-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_IE_ADD extern_symbol 0x0
358263320Sdim+; v9abs-obj: ]
359263320Sdim+
360263320Sdim+; pic-obj: Relocations [
361263320Sdim+; pic-obj:  Section (2) .rela.text {
362263320Sdim+; pic-obj:    0x{{[0-9,A-F]+}} R_SPARC_PC22 _GLOBAL_OFFSET_TABLE_ 0x4
363263320Sdim+; pic-obj:    0x{{[0-9,A-F]+}} R_SPARC_PC10 _GLOBAL_OFFSET_TABLE_ 0x8
364263320Sdim+; pic-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_LDO_HIX22 local_symbol 0x0
365263320Sdim+; pic-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_LDO_LOX10 local_symbol 0x0
366263320Sdim+; pic-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_LDM_HI22 local_symbol 0x0
367263320Sdim+; pic-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_LDM_LO10 local_symbol 0x0
368263320Sdim+; pic-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_LDM_ADD local_symbol 0x0
369263320Sdim+; pic-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_LDM_CALL local_symbol 0x0
370263320Sdim+; pic-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_LDO_ADD local_symbol 0x0
371263320Sdim+; pic-obj:    0x{{[0-9,A-F]+}} R_SPARC_PC22 _GLOBAL_OFFSET_TABLE_ 0x4
372263320Sdim+; pic-obj:    0x{{[0-9,A-F]+}} R_SPARC_PC10 _GLOBAL_OFFSET_TABLE_ 0x8
373263320Sdim+; pic-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_GD_HI22 extern_symbol 0x0
374263320Sdim+; pic-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_GD_LO10 extern_symbol 0x0
375263320Sdim+; pic-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_GD_ADD extern_symbol 0x0
376263320Sdim+; pic-obj:    0x{{[0-9,A-F]+}} R_SPARC_TLS_GD_CALL extern_symbol 0x0
377263320Sdim+; pic-obj: ]
378263320Sdim+
379