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