diff --git a/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp b/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp --- a/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp +++ b/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp @@ -170,6 +170,11 @@ TOCType_EHBlock }; + // Controls whether or not to emit a .ref reference to __tls_get_addr. + // This is currently used for TLS models that do not generate calls to + // TLS functions, such as for the local-exec model on AIX 64-bit. + bool HasRefGetTLSAddr = false; + MCSymbol *lookUpOrCreateTOCEntry(const MCSymbol *Sym, TOCEntryType Type, MCSymbolRefExpr::VariantKind Kind = MCSymbolRefExpr::VariantKind::VK_None); @@ -612,12 +617,20 @@ /// This helper function creates the TlsGetAddr MCSymbol for AIX. We will /// create the csect and use the qual-name symbol instead of creating just the /// external symbol. -static MCSymbol *createMCSymbolForTlsGetAddr(MCContext &Ctx, unsigned MIOpc) { - StringRef SymName = - MIOpc == PPC::GETtlsTpointer32AIX ? ".__get_tpointer" : ".__tls_get_addr"; +static MCSymbol * +createMCSymbolForTlsGetAddr(MCContext &Ctx, unsigned MIOpc, + XCOFF::StorageMappingClass SMC = XCOFF::XMC_PR) { + StringRef SymName; + if (MIOpc == PPC::GETtlsTpointer32AIX) + SymName = ".__get_tpointer"; + else { + SymName = ".__tls_get_addr"; + if (SMC == XCOFF::XMC_DS) + SymName = "__tls_get_addr"; + } return Ctx .getXCOFFSection(SymName, SectionKind::getText(), - XCOFF::CsectProperties(XCOFF::XMC_PR, XCOFF::XTY_ER)) + XCOFF::CsectProperties(SMC, XCOFF::XTY_ER)) ->getQualNameSymbol(); } @@ -832,8 +845,11 @@ // local-exec and initial-exec can use MO_TPREL_FLAG. assert(MO.isGlobal() && "Only expecting a global MachineOperand here!\n"); TLSModel::Model Model = TM.getTLSModel(MO.getGlobal()); - if (Model == TLSModel::LocalExec) + if (Model == TLSModel::LocalExec) { + if (IsPPC64) + HasRefGetTLSAddr = true; return MCSymbolRefExpr::VariantKind::VK_PPC_AIX_TLSLE; + } llvm_unreachable("Only expecting local-exec accesses!"); } // For GD TLS access on AIX, we have two TOC entries for the symbol (one for @@ -2850,6 +2866,21 @@ OutStreamer->doFinalizationAtSectionEnd( OutStreamer->getContext().getObjectFileInfo()->getTextSection()); + // Add a single .ref reference to __tls_get_addr[DS] for the local-exec TLS + // model on AIX 64-bit. For TLS models that do not generate calls to TLS + // functions, this reference to __tls_get_addr helps generate a linker error + // to an undefined symbol to __tls_get_addr, which indicates to the user that + // compiling with -pthread is required for programs that use TLS variables. + if (HasRefGetTLSAddr) { + // Specifically for 64-bit AIX, a load from the TOC is generated to load + // the variable offset needed for local-exec accesses. + MCSymbol *TlsGetAddrDescriptor = + createMCSymbolForTlsGetAddr(OutContext, PPC::LDtoc, XCOFF::XMC_DS); + + ExtSymSDNodeSymbols.insert(TlsGetAddrDescriptor); + OutStreamer->emitXCOFFRefDirective(TlsGetAddrDescriptor); + } + for (MCSymbol *Sym : ExtSymSDNodeSymbols) OutStreamer->emitSymbolAttribute(Sym, MCSA_Extern); return PPCAsmPrinter::doFinalization(M); diff --git a/llvm/test/CodeGen/PowerPC/aix-tls-le-ldst-double.ll b/llvm/test/CodeGen/PowerPC/aix-tls-le-ldst-double.ll --- a/llvm/test/CodeGen/PowerPC/aix-tls-le-ldst-double.ll +++ b/llvm/test/CodeGen/PowerPC/aix-tls-le-ldst-double.ll @@ -635,6 +635,13 @@ ret double %add } +; (64-bit only) External symbol reference checks for __tls_get_addr[DS] + +; SMALL64: .ref __tls_get_addr[DS] +; SMALL64: .extern __tls_get_addr[DS] +; LARGE64: .ref __tls_get_addr[DS] +; LARGE64: .extern __tls_get_addr[DS] + ; TOC Entry Checks. ; SMALL64-LABEL: .toc diff --git a/llvm/test/CodeGen/PowerPC/aix-tls-le-ldst-float.ll b/llvm/test/CodeGen/PowerPC/aix-tls-le-ldst-float.ll --- a/llvm/test/CodeGen/PowerPC/aix-tls-le-ldst-float.ll +++ b/llvm/test/CodeGen/PowerPC/aix-tls-le-ldst-float.ll @@ -635,6 +635,13 @@ ret float %add } +; (64-bit only) External symbol reference checks for __tls_get_addr[DS] + +; SMALL64: .ref __tls_get_addr[DS] +; SMALL64: .extern __tls_get_addr[DS] +; LARGE64: .ref __tls_get_addr[DS] +; LARGE64: .extern __tls_get_addr[DS] + ; TOC Entry Checks. ; SMALL64-LABEL: .toc diff --git a/llvm/test/CodeGen/PowerPC/aix-tls-le-ldst-int.ll b/llvm/test/CodeGen/PowerPC/aix-tls-le-ldst-int.ll --- a/llvm/test/CodeGen/PowerPC/aix-tls-le-ldst-int.ll +++ b/llvm/test/CodeGen/PowerPC/aix-tls-le-ldst-int.ll @@ -651,6 +651,13 @@ ret i32 %add } +; (64-bit only) External symbol reference checks for __tls_get_addr[DS] + +; SMALL64: .ref __tls_get_addr[DS] +; SMALL64: .extern __tls_get_addr[DS] +; LARGE64: .ref __tls_get_addr[DS] +; LARGE64: .extern __tls_get_addr[DS] + ; TOC Entry Checks. ; SMALL64-LABEL: .toc diff --git a/llvm/test/CodeGen/PowerPC/aix-tls-le-ldst-longlong.ll b/llvm/test/CodeGen/PowerPC/aix-tls-le-ldst-longlong.ll --- a/llvm/test/CodeGen/PowerPC/aix-tls-le-ldst-longlong.ll +++ b/llvm/test/CodeGen/PowerPC/aix-tls-le-ldst-longlong.ll @@ -707,6 +707,13 @@ ret i64 %add } +; (64-bit only) External symbol reference checks for __tls_get_addr[DS] + +; SMALL64: .ref __tls_get_addr[DS] +; SMALL64: .extern __tls_get_addr[DS] +; LARGE64: .ref __tls_get_addr[DS] +; LARGE64: .extern __tls_get_addr[DS] + ; TOC Entry Checks. ; SMALL64-LABEL: .toc diff --git a/llvm/test/CodeGen/PowerPC/aix-tls-le-xcoff-reloc-large.ll b/llvm/test/CodeGen/PowerPC/aix-tls-le-xcoff-reloc-large.ll --- a/llvm/test/CodeGen/PowerPC/aix-tls-le-xcoff-reloc-large.ll +++ b/llvm/test/CodeGen/PowerPC/aix-tls-le-xcoff-reloc-large.ll @@ -31,42 +31,49 @@ ; RELOC-NEXT: AddressSize: 64bit ; RELOC-NEXT: Relocations [ ; RELOC: Virtual Address: 0x2 -; RELOC-NEXT: Symbol: IThreadLocalVarUninit (15) +; RELOC-NEXT: Symbol: IThreadLocalVarUninit (17) ; RELOC-NEXT: IsSigned: No ; RELOC-NEXT: FixupBitValue: 0 ; RELOC-NEXT: Length: 16 ; RELOC-NEXT: Type: R_TOCU (0x30) ; RELOC-NEXT: } ; RELOC: Virtual Address: 0x6 -; RELOC-NEXT: Symbol: IThreadLocalVarUninit (15) +; RELOC-NEXT: Symbol: IThreadLocalVarUninit (17) ; RELOC-NEXT: IsSigned: No ; RELOC-NEXT: FixupBitValue: 0 ; RELOC-NEXT: Length: 16 ; RELOC-NEXT: Type: R_TOCL (0x31) ; RELOC-NEXT: } ; RELOC: Virtual Address: 0x12 -; RELOC-NEXT: Symbol: ThreadLocalVarInit (17) +; RELOC-NEXT: Symbol: ThreadLocalVarInit (19) ; RELOC-NEXT: IsSigned: No ; RELOC-NEXT: FixupBitValue: 0 ; RELOC-NEXT: Length: 16 ; RELOC-NEXT: Type: R_TOCU (0x30) ; RELOC-NEXT: } ; RELOC: Virtual Address: 0x1A -; RELOC-NEXT: Symbol: ThreadLocalVarInit (17) +; RELOC-NEXT: Symbol: ThreadLocalVarInit (19) ; RELOC-NEXT: IsSigned: No ; RELOC-NEXT: FixupBitValue: 0 ; RELOC-NEXT: Length: 16 ; RELOC-NEXT: Type: R_TOCL (0x31) ; RELOC-NEXT: } +; RELOC: Virtual Address: 0x0 +; RELOC-NEXT: Symbol: __tls_get_addr (1) +; RELOC-NEXT: IsSigned: No +; RELOC-NEXT: FixupBitValue: 0 +; RELOC-NEXT: Length: 1 +; RELOC-NEXT: Type: R_REF (0xF) +; RELOC-NEXT: } ; RELOC: Virtual Address: 0x68 -; RELOC-NEXT: Symbol: IThreadLocalVarUninit (23) +; RELOC-NEXT: Symbol: IThreadLocalVarUninit (25) ; RELOC-NEXT: IsSigned: No ; RELOC-NEXT: FixupBitValue: 0 ; RELOC-NEXT: Length: 64 ; RELOC-NEXT: Type: R_TLS_LE (0x23) ; RELOC-NEXT: } ; RELOC: Virtual Address: 0x70 -; RELOC-NEXT: Symbol: ThreadLocalVarInit (21) +; RELOC-NEXT: Symbol: ThreadLocalVarInit (23) ; RELOC-NEXT: IsSigned: No ; RELOC-NEXT: FixupBitValue: 0 ; RELOC-NEXT: Length: 64 @@ -78,7 +85,25 @@ ; SYM-NEXT: Arch: powerpc64 ; SYM-NEXT: AddressSize: 64bit ; SYM-NEXT: Symbols [ -; SYM: Index: 15 +; SYM: Index: 1 +; SYM-NEXT: Name: __tls_get_addr +; SYM-NEXT: Value (RelocatableAddress): 0x0 +; SYM-NEXT: Section: N_UNDEF +; SYM-NEXT: Type: 0x0 +; SYM-NEXT: StorageClass: C_EXT (0x2) +; SYM-NEXT: NumberOfAuxEntries: 1 +; SYM-NEXT: CSECT Auxiliary Entry { +; SYM-NEXT: Index: 2 +; SYM-NEXT: SectionLen: 0 +; SYM-NEXT: ParameterHashIndex: 0x0 +; SYM-NEXT: TypeChkSectNum: 0x0 +; SYM-NEXT: SymbolAlignmentLog2: 0 +; SYM-NEXT: SymbolType: XTY_ER (0x0) +; SYM-NEXT: StorageMappingClass: XMC_DS (0xA) +; SYM-NEXT: Auxiliary Type: AUX_CSECT (0xFB) +; SYM-NEXT: } +; SYM-NEXT: } +; SYM: Index: 17 ; SYM-NEXT: Name: IThreadLocalVarUninit ; SYM-NEXT: Value (RelocatableAddress): 0x68 ; SYM-NEXT: Section: .data @@ -86,7 +111,7 @@ ; SYM-NEXT: StorageClass: C_HIDEXT (0x6B) ; SYM-NEXT: NumberOfAuxEntries: 1 ; SYM-NEXT: CSECT Auxiliary Entry { -; SYM-NEXT: Index: 16 +; SYM-NEXT: Index: 18 ; SYM-NEXT: SectionLen: 8 ; SYM-NEXT: ParameterHashIndex: 0x0 ; SYM-NEXT: TypeChkSectNum: 0x0 @@ -96,7 +121,7 @@ ; SYM-NEXT: Auxiliary Type: AUX_CSECT (0xFB) ; SYM-NEXT: } ; SYM-NEXT: } -; SYM: Index: 17 +; SYM: Index: 19 ; SYM-NEXT: Name: ThreadLocalVarInit ; SYM-NEXT: Value (RelocatableAddress): 0x70 ; SYM-NEXT: Section: .data @@ -104,7 +129,7 @@ ; SYM-NEXT: StorageClass: C_HIDEXT (0x6B) ; SYM-NEXT: NumberOfAuxEntries: 1 ; SYM-NEXT: CSECT Auxiliary Entry { -; SYM-NEXT: Index: 18 +; SYM-NEXT: Index: 20 ; SYM-NEXT: SectionLen: 8 ; SYM-NEXT: ParameterHashIndex: 0x0 ; SYM-NEXT: TypeChkSectNum: 0x0 @@ -114,7 +139,7 @@ ; SYM-NEXT: Auxiliary Type: AUX_CSECT (0xFB) ; SYM-NEXT: } ; SYM-NEXT: } -; SYM: Index: 21 +; SYM: Index: 23 ; SYM-NEXT: Name: ThreadLocalVarInit ; SYM-NEXT: Value (RelocatableAddress): 0x0 ; SYM-NEXT: Section: .tdata @@ -122,7 +147,7 @@ ; SYM-NEXT: StorageClass: C_EXT (0x2) ; SYM-NEXT: NumberOfAuxEntries: 1 ; SYM-NEXT: CSECT Auxiliary Entry { -; SYM-NEXT: Index: 22 +; SYM-NEXT: Index: 24 ; SYM-NEXT: SectionLen: 8 ; SYM-NEXT: ParameterHashIndex: 0x0 ; SYM-NEXT: TypeChkSectNum: 0x0 @@ -132,7 +157,7 @@ ; SYM-NEXT: Auxiliary Type: AUX_CSECT (0xFB) ; SYM-NEXT: } ; SYM-NEXT: } -; SYM: Index: 23 +; SYM: Index: 25 ; SYM-NEXT: Name: IThreadLocalVarUninit ; SYM-NEXT: Value (RelocatableAddress): 0x8 ; SYM-NEXT: Section: .tbss @@ -140,7 +165,7 @@ ; SYM-NEXT: StorageClass: C_HIDEXT (0x6B) ; SYM-NEXT: NumberOfAuxEntries: 1 ; SYM-NEXT: CSECT Auxiliary Entry { -; SYM-NEXT: Index: 24 +; SYM-NEXT: Index: 26 ; SYM-NEXT: SectionLen: 8 ; SYM-NEXT: ParameterHashIndex: 0x0 ; SYM-NEXT: TypeChkSectNum: 0x0 @@ -153,64 +178,65 @@ ; DIS: {{.*}}aix-tls-le-xcoff-reloc-large.ll.tmp.o: file format aix5coff64-rs6000 ; DIS: Disassembly of section .text: -; DIS: 0000000000000000 (idx: 3) .storeITLUninit: +; DIS: 0000000000000000 (idx: 5) .storeITLUninit: ; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} addis 4, 2, 0 -; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TOCU (idx: 15) IThreadLocalVarUninit[TE] +; DIS-NEXT: {{0*}}[[#ADDR]]: R_REF (idx: 1) __tls_get_addr[DS] +; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TOCU (idx: 17) IThreadLocalVarUninit[TE] ; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} ld 4, 0(4) -; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TOCL (idx: 15) IThreadLocalVarUninit[TE] +; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TOCL (idx: 17) IThreadLocalVarUninit[TE] ; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stdx 3, 13, 4 ; DIS-NEXT: blr -; DIS: 0000000000000010 (idx: 5) .loadTLInit: +; DIS: 0000000000000010 (idx: 7) .loadTLInit: ; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} addis 3, 2, 0 -; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TOCU (idx: 17) ThreadLocalVarInit[TE] +; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TOCU (idx: 19) ThreadLocalVarInit[TE] ; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} addis 4, 2, 0 -; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TOCU (idx: 19) VarInit[TE] +; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TOCU (idx: 21) VarInit[TE] ; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} ld 3, 8(3) -; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TOCL (idx: 17) ThreadLocalVarInit[TE] +; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TOCL (idx: 19) ThreadLocalVarInit[TE] ; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} ld 4, 16(4) -; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TOCL (idx: 19) VarInit[TE] +; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TOCL (idx: 21) VarInit[TE] ; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} ldx 3, 13, 3 ; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} ld 4, 0(4) ; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} add 3, 4, 3 ; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} blr ; DIS: Disassembly of section .data: -; DIS: 0000000000000030 (idx: 7) VarInit[RW]: +; DIS: 0000000000000030 (idx: 9) VarInit[RW]: ; DIS-NEXT: 30: 00 00 00 00 ; DIS-NEXT: 34: 00 00 00 57 -; DIS: 0000000000000038 (idx: 9) storeITLUninit[DS]: +; DIS: 0000000000000038 (idx: 11) storeITLUninit[DS]: ; DIS-NEXT: 38: 00 00 00 00 -; DIS-NEXT: 0000000000000038: R_POS (idx: 3) .storeITLUninit +; DIS-NEXT: 0000000000000038: R_POS (idx: 5) .storeITLUninit ; DIS-NEXT: 3c: 00 00 00 00 ; DIS-NEXT: 40: 00 00 00 00 -; DIS-NEXT: 0000000000000040: R_POS (idx: 13) TOC[TC0] +; DIS-NEXT: 0000000000000040: R_POS (idx: 15) TOC[TC0] ; DIS-NEXT: 44: 00 00 00 68 -; DIS: 0000000000000050 (idx: 11) loadTLInit[DS]: +; DIS: 0000000000000050 (idx: 13) loadTLInit[DS]: ; DIS-NEXT: 50: 00 00 00 00 -; DIS-NEXT: 0000000000000050: R_POS (idx: 5) .loadTLInit +; DIS-NEXT: 0000000000000050: R_POS (idx: 7) .loadTLInit ; DIS-NEXT: 54: 00 00 00 10 ; DIS-NEXT: 58: 00 00 00 00 -; DIS-NEXT: 0000000000000058: R_POS (idx: 13) TOC[TC0] +; DIS-NEXT: 0000000000000058: R_POS (idx: 15) TOC[TC0] ; DIS-NEXT: 5c: 00 00 00 68 -; DIS: 0000000000000068 (idx: 15) IThreadLocalVarUninit[TE]: +; DIS: 0000000000000068 (idx: 17) IThreadLocalVarUninit[TE]: ; DIS-NEXT: 68: 00 00 00 00 -; DIS-NEXT: 0000000000000068: R_TLS_LE (idx: 23) IThreadLocalVarUninit[UL] +; DIS-NEXT: 0000000000000068: R_TLS_LE (idx: 25) IThreadLocalVarUninit[UL] ; DIS-NEXT: 6c: 00 00 00 00 -; DIS: 0000000000000070 (idx: 17) ThreadLocalVarInit[TE]: +; DIS: 0000000000000070 (idx: 19) ThreadLocalVarInit[TE]: ; DIS-NEXT: 70: 00 00 00 00 -; DIS-NEXT: 0000000000000070: R_TLS_LE (idx: 21) ThreadLocalVarInit[TL] +; DIS-NEXT: 0000000000000070: R_TLS_LE (idx: 23) ThreadLocalVarInit[TL] ; DIS-NEXT: 74: 00 00 00 00 -; DIS: 0000000000000078 (idx: 19) VarInit[TE]: +; DIS: 0000000000000078 (idx: 21) VarInit[TE]: ; DIS-NEXT: 78: 00 00 00 00 -; DIS-NEXT: 0000000000000078: R_POS (idx: 7) VarInit[RW] +; DIS-NEXT: 0000000000000078: R_POS (idx: 9) VarInit[RW] ; DIS-NEXT: 7c: 00 00 00 30 ; DIS: Disassembly of section .tdata: -; DIS: 0000000000000000 (idx: 21) ThreadLocalVarInit[TL]: +; DIS: 0000000000000000 (idx: 23) ThreadLocalVarInit[TL]: ; DIS-NEXT: 0: 00 00 00 00 ; DIS-NEXT: 4: 00 00 00 01 ; DIS: Disassembly of section .tbss: -; DIS: 0000000000000008 (idx: 23) IThreadLocalVarUninit[UL]: +; DIS: 0000000000000008 (idx: 25) IThreadLocalVarUninit[UL]: ; DIS-NEXT: ... diff --git a/llvm/test/CodeGen/PowerPC/aix-tls-le-xcoff-reloc.ll b/llvm/test/CodeGen/PowerPC/aix-tls-le-xcoff-reloc.ll --- a/llvm/test/CodeGen/PowerPC/aix-tls-le-xcoff-reloc.ll +++ b/llvm/test/CodeGen/PowerPC/aix-tls-le-xcoff-reloc.ll @@ -31,28 +31,35 @@ ; RELOC-NEXT: AddressSize: 64bit ; RELOC-NEXT: Relocations [ ; RELOC: Virtual Address: 0x2 -; RELOC-NEXT: Symbol: IThreadLocalVarUninit (17) +; RELOC-NEXT: Symbol: IThreadLocalVarUninit (19) ; RELOC-NEXT: IsSigned: No ; RELOC-NEXT: FixupBitValue: 0 ; RELOC-NEXT: Length: 16 ; RELOC-NEXT: Type: R_TOC (0x3) ; RELOC-NEXT: } ; RELOC: Virtual Address: 0x12 -; RELOC-NEXT: Symbol: ThreadLocalVarInit (19) +; RELOC-NEXT: Symbol: ThreadLocalVarInit (21) ; RELOC-NEXT: IsSigned: No ; RELOC-NEXT: FixupBitValue: 0 ; RELOC-NEXT: Length: 16 ; RELOC-NEXT: Type: R_TOC (0x3) ; RELOC-NEXT: } +; RELOC: Virtual Address: 0x0 +; RELOC-NEXT: Symbol: __tls_get_addr (1) +; RELOC-NEXT: IsSigned: No +; RELOC-NEXT: FixupBitValue: 0 +; RELOC-NEXT: Length: 1 +; RELOC-NEXT: Type: R_REF (0xF) +; RELOC-NEXT: } ; RELOC: Virtual Address: 0x60 -; RELOC-NEXT: Symbol: IThreadLocalVarUninit (27) +; RELOC-NEXT: Symbol: IThreadLocalVarUninit (29) ; RELOC-NEXT: IsSigned: No ; RELOC-NEXT: FixupBitValue: 0 ; RELOC-NEXT: Length: 64 ; RELOC-NEXT: Type: R_TLS_LE (0x23) ; RELOC-NEXT: } ; RELOC: Virtual Address: 0x68 -; RELOC-NEXT: Symbol: ThreadLocalVarInit (25) +; RELOC-NEXT: Symbol: ThreadLocalVarInit (27) ; RELOC-NEXT: IsSigned: No ; RELOC-NEXT: FixupBitValue: 0 ; RELOC-NEXT: Length: 64 @@ -64,7 +71,25 @@ ; SYM-NEXT: Arch: powerpc64 ; SYM-NEXT: AddressSize: 64bit ; SYM-NEXT: Symbols [ -; SYM: Index: 17 +; SYM: Index: 1 +; SYM-NEXT: Name: __tls_get_addr +; SYM-NEXT: Value (RelocatableAddress): 0x0 +; SYM-NEXT: Section: N_UNDEF +; SYM-NEXT: Type: 0x0 +; SYM-NEXT: StorageClass: C_EXT (0x2) +; SYM-NEXT: NumberOfAuxEntries: 1 +; SYM-NEXT: CSECT Auxiliary Entry { +; SYM-NEXT: Index: 2 +; SYM-NEXT: SectionLen: 0 +; SYM-NEXT: ParameterHashIndex: 0x0 +; SYM-NEXT: TypeChkSectNum: 0x0 +; SYM-NEXT: SymbolAlignmentLog2: 0 +; SYM-NEXT: SymbolType: XTY_ER (0x0) +; SYM-NEXT: StorageMappingClass: XMC_DS (0xA) +; SYM-NEXT: Auxiliary Type: AUX_CSECT (0xFB) +; SYM-NEXT: } +; SYM-NEXT: } +; SYM: Index: 19 ; SYM-NEXT: Name: IThreadLocalVarUninit ; SYM-NEXT: Value (RelocatableAddress): 0x60 ; SYM-NEXT: Section: .data @@ -72,7 +97,7 @@ ; SYM-NEXT: StorageClass: C_HIDEXT (0x6B) ; SYM-NEXT: NumberOfAuxEntries: 1 ; SYM-NEXT: CSECT Auxiliary Entry { -; SYM-NEXT: Index: 18 +; SYM-NEXT: Index: 20 ; SYM-NEXT: SectionLen: 8 ; SYM-NEXT: ParameterHashIndex: 0x0 ; SYM-NEXT: TypeChkSectNum: 0x0 @@ -82,7 +107,7 @@ ; SYM-NEXT: Auxiliary Type: AUX_CSECT (0xFB) ; SYM-NEXT: } ; SYM-NEXT: } -; SYM: Index: 19 +; SYM: Index: 21 ; SYM-NEXT: Name: ThreadLocalVarInit ; SYM-NEXT: Value (RelocatableAddress): 0x68 ; SYM-NEXT: Section: .data @@ -90,7 +115,7 @@ ; SYM-NEXT: StorageClass: C_HIDEXT (0x6B) ; SYM-NEXT: NumberOfAuxEntries: 1 ; SYM-NEXT: CSECT Auxiliary Entry { -; SYM-NEXT: Index: 20 +; SYM-NEXT: Index: 22 ; SYM-NEXT: SectionLen: 8 ; SYM-NEXT: ParameterHashIndex: 0x0 ; SYM-NEXT: TypeChkSectNum: 0x0 @@ -100,7 +125,7 @@ ; SYM-NEXT: Auxiliary Type: AUX_CSECT (0xFB) ; SYM-NEXT: } ; SYM-NEXT: } -; SYM: Index: 25 +; SYM: Index: 27 ; SYM-NEXT: Name: ThreadLocalVarInit ; SYM-NEXT: Value (RelocatableAddress): 0x0 ; SYM-NEXT: Section: .tdata @@ -108,8 +133,8 @@ ; SYM-NEXT: StorageClass: C_EXT (0x2) ; SYM-NEXT: NumberOfAuxEntries: 1 ; SYM-NEXT: CSECT Auxiliary Entry { -; SYM-NEXT: Index: 26 -; SYM-NEXT: ContainingCsectSymbolIndex: 23 +; SYM-NEXT: Index: 28 +; SYM-NEXT: ContainingCsectSymbolIndex: 25 ; SYM-NEXT: ParameterHashIndex: 0x0 ; SYM-NEXT: TypeChkSectNum: 0x0 ; SYM-NEXT: SymbolAlignmentLog2: 0 @@ -118,7 +143,7 @@ ; SYM-NEXT: Auxiliary Type: AUX_CSECT (0xFB) ; SYM-NEXT: } ; SYM-NEXT: } -; SYM: Index: 27 +; SYM: Index: 29 ; SYM-NEXT: Name: IThreadLocalVarUninit ; SYM-NEXT: Value (RelocatableAddress): 0x4 ; SYM-NEXT: Section: .tbss @@ -126,7 +151,7 @@ ; SYM-NEXT: StorageClass: C_HIDEXT (0x6B) ; SYM-NEXT: NumberOfAuxEntries: 1 ; SYM-NEXT: CSECT Auxiliary Entry { -; SYM-NEXT: Index: 28 +; SYM-NEXT: Index: 30 ; SYM-NEXT: SectionLen: 4 ; SYM-NEXT: ParameterHashIndex: 0x0 ; SYM-NEXT: TypeChkSectNum: 0x0 @@ -139,16 +164,17 @@ ; DIS: {{.*}}aix-tls-le-xcoff-reloc.ll.tmp.o: file format aix5coff64-rs6000 ; DIS: Disassembly of section .text: -; DIS: 0000000000000000 (idx: 3) .storeITLUninit: +; DIS: 0000000000000000 (idx: 5) .storeITLUninit: ; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} ld 4, 0(2) -; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TOC (idx: 17) IThreadLocalVarUninit[TC] +; DIS-NEXT: {{0*}}[[#ADDR]]: R_REF (idx: 1) __tls_get_addr[DS] +; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TOC (idx: 19) IThreadLocalVarUninit[TC] ; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stwx 3, 13, 4 ; DIS-NEXT: blr -; DIS: 0000000000000010 (idx: 5) .loadTLInit: +; DIS: 0000000000000010 (idx: 7) .loadTLInit: ; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} ld 3, 8(2) -; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TOC (idx: 19) ThreadLocalVarInit[TC] +; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TOC (idx: 21) ThreadLocalVarInit[TC] ; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} ld 4, 16(2) -; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TOC (idx: 21) VarInit[TC] +; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TOC (idx: 23) VarInit[TC] ; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} lwzx 3, 13, 3 ; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} lwz 4, 0(4) ; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} add 3, 4, 3 @@ -156,37 +182,37 @@ ; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} blr ; DIS: Disassembly of section .data: -; DIS: 000000000000002c (idx: 9) VarInit: +; DIS: 000000000000002c (idx: 11) VarInit: ; DIS-NEXT: 2c: 00 00 00 57 -; DIS: 0000000000000030 (idx: 11) storeITLUninit[DS]: +; DIS: 0000000000000030 (idx: 13) storeITLUninit[DS]: ; DIS-NEXT: 30: 00 00 00 00 -; DIS-NEXT: 0000000000000030: R_POS (idx: 3) .storeITLUninit +; DIS-NEXT: 0000000000000030: R_POS (idx: 5) .storeITLUninit ; DIS-NEXT: 34: 00 00 00 00 ; DIS-NEXT: 38: 00 00 00 00 -; DIS-NEXT: 0000000000000038: R_POS (idx: 15) TOC[TC0] +; DIS-NEXT: 0000000000000038: R_POS (idx: 17) TOC[TC0] ; DIS-NEXT: 3c: 00 00 00 60 -; DIS: 0000000000000048 (idx: 13) loadTLInit[DS]: +; DIS: 0000000000000048 (idx: 15) loadTLInit[DS]: ; DIS-NEXT: 48: 00 00 00 00 -; DIS-NEXT: 0000000000000048: R_POS (idx: 5) .loadTLInit +; DIS-NEXT: 0000000000000048: R_POS (idx: 7) .loadTLInit ; DIS-NEXT: 4c: 00 00 00 10 ; DIS-NEXT: 50: 00 00 00 00 -; DIS-NEXT: 0000000000000050: R_POS (idx: 15) TOC[TC0] +; DIS-NEXT: 0000000000000050: R_POS (idx: 17) TOC[TC0] ; DIS-NEXT: 54: 00 00 00 60 -; DIS: 0000000000000060 (idx: 17) IThreadLocalVarUninit[TC]: +; DIS: 0000000000000060 (idx: 19) IThreadLocalVarUninit[TC]: ; DIS-NEXT: 60: 00 00 00 00 -; DIS-NEXT: 0000000000000060: R_TLS_LE (idx: 27) IThreadLocalVarUninit[UL] -; DIS: 0000000000000068 (idx: 19) ThreadLocalVarInit[TC]: +; DIS-NEXT: 0000000000000060: R_TLS_LE (idx: 29) IThreadLocalVarUninit[UL] +; DIS: 0000000000000068 (idx: 21) ThreadLocalVarInit[TC]: ; DIS-NEXT: 68: 00 00 00 00 -; DIS-NEXT: 0000000000000068: R_TLS_LE (idx: 25) ThreadLocalVarInit -; DIS: 0000000000000070 (idx: 21) VarInit[TC]: +; DIS-NEXT: 0000000000000068: R_TLS_LE (idx: 27) ThreadLocalVarInit +; DIS: 0000000000000070 (idx: 23) VarInit[TC]: ; DIS-NEXT: 70: 00 00 00 00 -; DIS-NEXT: 0000000000000070: R_POS (idx: 9) VarInit +; DIS-NEXT: 0000000000000070: R_POS (idx: 11) VarInit ; DIS: Disassembly of section .tdata: -; DIS: 0000000000000000 (idx: 25) ThreadLocalVarInit: +; DIS: 0000000000000000 (idx: 27) ThreadLocalVarInit: ; DIS-NEXT: 0: 00 00 00 01 ; DIS: Disassembly of section .tbss: -; DIS: 0000000000000004 (idx: 27) IThreadLocalVarUninit[UL]: +; DIS: 0000000000000004 (idx: 29) IThreadLocalVarUninit[UL]: ; DIS-NEXT: ...