diff --git a/llvm/lib/MC/XCOFFObjectWriter.cpp b/llvm/lib/MC/XCOFFObjectWriter.cpp --- a/llvm/lib/MC/XCOFFObjectWriter.cpp +++ b/llvm/lib/MC/XCOFFObjectWriter.cpp @@ -178,15 +178,19 @@ CsectGroup FuncDSCsects; CsectGroup TOCCsects; CsectGroup BSSCsects; + CsectGroup TDataCsects; + CsectGroup TBSSCsects; // The Predefined sections. Section Text; Section Data; Section BSS; + Section TData; + Section TBSS; // All the XCOFF sections, in the order they will appear in the section header // table. - std::array
Sections{{&Text, &Data, &BSS}}; + std::array
Sections{{&Text, &Data, &BSS, &TData, &TBSS}}; CsectGroup &getCsectGroup(const MCSectionXCOFF *MCSec); @@ -250,7 +254,11 @@ Data(".data", XCOFF::STYP_DATA, /* IsVirtual */ false, CsectGroups{&DataCsects, &FuncDSCsects, &TOCCsects}), BSS(".bss", XCOFF::STYP_BSS, /* IsVirtual */ true, - CsectGroups{&BSSCsects}) {} + CsectGroups{&BSSCsects}), + TData(".tdata", XCOFF::STYP_TDATA, /* IsVirtual */ false, + CsectGroups{&TDataCsects}), + TBSS(".tbss", XCOFF::STYP_TBSS, /* IsVirtual */ true, + CsectGroups{&TBSSCsects}) {} void XCOFFObjectWriter::reset() { // Clear the mappings we created. @@ -297,6 +305,16 @@ "Mapping invalid csect. CSECT with bss storage class must be " "common type."); return BSSCsects; + case XCOFF::XMC_TL: + assert(XCOFF::XTY_SD == MCSec->getCSectType() && + "Mapping invalid csect. CSECT with tdata storage class must be " + "an initialized csect."); + return TDataCsects; + case XCOFF::XMC_UL: + assert(XCOFF::XTY_SD != MCSec->getCSectType() && + "Mapping invalid csect. CSECT with tbss storage class must not be " + "an initialized csect."); + return TBSSCsects; case XCOFF::XMC_TC0: assert(XCOFF::XTY_SD == MCSec->getCSectType() && "Only an initialized csect can contain TOC-base."); diff --git a/llvm/test/CodeGen/PowerPC/aix-tls-xcoff-variables-data-sect-off.ll b/llvm/test/CodeGen/PowerPC/aix-tls-xcoff-variables-data-sect-off.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/PowerPC/aix-tls-xcoff-variables-data-sect-off.ll @@ -0,0 +1,435 @@ +; This file tests the codegen of tls variables in AIX XCOFF object files with data section off. + +; RUN: llc -mtriple powerpc-ibm-aix-xcoff -data-sections=false -filetype=obj -o %t.o < %s +; RUN: llvm-readobj --section-headers --file-header %t.o | \ +; RUN: FileCheck --check-prefix=OBJ %s +; RUN: llvm-readobj --syms %t.o | FileCheck --check-prefix=SYMS %s + +; RUN: not --crash llc -mtriple powerpc64-ibm-aix-xcoff -data-sections=false -filetype=obj < %s 2>&1 | \ +; RUN: FileCheck --check-prefix=XCOFF64 %s +; XCOFF64: LLVM ERROR: 64-bit XCOFF object files are not supported yet. + +; OBJ: File: {{.*}}aix-tls-xcoff-variables-data-sect-off.ll.tmp.o +; OBJ-NEXT: Format: aixcoff-rs6000 +; OBJ-NEXT: Arch: powerpc +; OBJ-NEXT: AddressSize: 32bit +; OBJ-NEXT: FileHeader { +; OBJ-NEXT: Magic: 0x1DF +; OBJ-NEXT: NumberOfSections: 3 +; OBJ-NEXT: TimeStamp: None (0x0) +; OBJ-NEXT: SymbolTableOffset: 0xBC +; OBJ-NEXT: SymbolTableEntries: 33 +; OBJ-NEXT: OptionalHeaderSize: 0x0 +; OBJ-NEXT: Flags: 0x0 +; OBJ-NEXT: } + +; OBJ: Sections [ +; OBJ: Section { +; OBJ-NEXT: Index: 1 +; OBJ-NEXT: Name: .text +; OBJ-NEXT: PhysicalAddress: 0x0 +; OBJ-NEXT: VirtualAddress: 0x0 +; OBJ-NEXT: Size: 0x0 +; OBJ-NEXT: RawDataOffset: 0x8C +; OBJ-NEXT: RelocationPointer: 0x0 +; OBJ-NEXT: LineNumberPointer: 0x0 +; OBJ-NEXT: NumberOfRelocations: 0 +; OBJ-NEXT: NumberOfLineNumbers: 0 +; OBJ-NEXT: Type: STYP_TEXT (0x20) +; OBJ-NEXT: } + +; OBJ: Section { +; OBJ-NEXT: Index: 2 +; OBJ-NEXT: Name: .tdata +; OBJ-NEXT: PhysicalAddress: 0x0 +; OBJ-NEXT: VirtualAddress: 0x0 +; OBJ-NEXT: Size: 0x30 +; OBJ-NEXT: RawDataOffset: 0x8C +; OBJ-NEXT: RelocationPointer: 0x0 +; OBJ-NEXT: LineNumberPointer: 0x0 +; OBJ-NEXT: NumberOfRelocations: 0 +; OBJ-NEXT: NumberOfLineNumbers: 0 +; OBJ-NEXT: Type: STYP_TDATA (0x400) +; OBJ-NEXT: } + +; OBJ: Section { +; OBJ-NEXT: Index: 3 +; OBJ-NEXT: Name: .tbss +; OBJ-NEXT: PhysicalAddress: 0x30 +; OBJ-NEXT: VirtualAddress: 0x30 +; OBJ-NEXT: Size: 0x18 +; OBJ-NEXT: RawDataOffset: 0x0 +; OBJ-NEXT: RelocationPointer: 0x0 +; OBJ-NEXT: LineNumberPointer: 0x0 +; OBJ-NEXT: NumberOfRelocations: 0 +; OBJ-NEXT: NumberOfLineNumbers: 0 +; OBJ-NEXT: Type: STYP_TBSS (0x800) +; OBJ-NEXT: } +; OBJ: ] + +; SYMS: File: {{.*}}aix-tls-xcoff-variables-data-sect-off.ll.tmp.o +; SYMS-NEXT: Format: aixcoff-rs6000 +; SYMS-NEXT: Arch: powerpc +; SYMS-NEXT: AddressSize: 32bit +; SYMS: Symbols [ +; SYMS-NEXT: Symbol { +; SYMS-NEXT: Index: 0 +; SYMS-NEXT: Name: .file +; SYMS-NEXT: Value (SymbolTableIndex): 0x0 +; SYMS-NEXT: Section: N_DEBUG +; SYMS-NEXT: Source Language ID: TB_C (0x0) +; SYMS-NEXT: CPU Version ID: 0x0 +; SYMS-NEXT: StorageClass: C_FILE (0x67) +; SYMS-NEXT: NumberOfAuxEntries: 0 +; SYMS-NEXT: } +; SYMS-NEXT: Symbol { +; SYMS-NEXT: Index: [[#INDX:]] +; SYMS-NEXT: Name: tls_global_int_external_uninitialized +; SYMS-NEXT: Value (RelocatableAddress): 0x0 +; SYMS-NEXT: Section: N_UNDEF +; SYMS-NEXT: Type: 0x0 +; SYMS-NEXT: StorageClass: C_EXT (0x2) +; SYMS-NEXT: NumberOfAuxEntries: 1 +; SYMS-NEXT: CSECT Auxiliary Entry { +; SYMS-NEXT: Index: [[#INDX+1]] +; SYMS-NEXT: SectionLen: 0 +; SYMS-NEXT: ParameterHashIndex: 0x0 +; SYMS-NEXT: TypeChkSectNum: 0x0 +; SYMS-NEXT: SymbolAlignmentLog2: 0 +; SYMS-NEXT: SymbolType: XTY_ER (0x0) +; SYMS-NEXT: StorageMappingClass: 0x15 +; SYMS-NEXT: StabInfoIndex: 0x0 +; SYMS-NEXT: StabSectNum: 0x0 +; SYMS-NEXT: } +; SYMS-NEXT: } +; SYMS-NEXT: Symbol { +; SYMS-NEXT: Index: [[#INDX+2]] +; SYMS-NEXT: Name: tls_global_double_external_uninitialized +; SYMS-NEXT: Value (RelocatableAddress): 0x0 +; SYMS-NEXT: Section: N_UNDEF +; SYMS-NEXT: Type: 0x0 +; SYMS-NEXT: StorageClass: C_EXT (0x2) +; SYMS-NEXT: NumberOfAuxEntries: 1 +; SYMS-NEXT: CSECT Auxiliary Entry { +; SYMS-NEXT: Index: [[#INDX+3]] +; SYMS-NEXT: SectionLen: 0 +; SYMS-NEXT: ParameterHashIndex: 0x0 +; SYMS-NEXT: TypeChkSectNum: 0x0 +; SYMS-NEXT: SymbolAlignmentLog2: 0 +; SYMS-NEXT: SymbolType: XTY_ER (0x0) +; SYMS-NEXT: StorageMappingClass: 0x15 +; SYMS-NEXT: StabInfoIndex: 0x0 +; SYMS-NEXT: StabSectNum: 0x0 +; SYMS-NEXT: } +; SYMS-NEXT: } + + +; SYMS-NEXT: Symbol { +; SYMS-NEXT: Index: [[#INDX+4]] +; SYMS-NEXT: Name: .text +; SYMS-NEXT: Value (RelocatableAddress): 0x0 +; SYMS-NEXT: Section: .text +; SYMS-NEXT: Type: 0x0 +; SYMS-NEXT: StorageClass: C_HIDEXT (0x6B) +; SYMS-NEXT: NumberOfAuxEntries: 1 +; SYMS-NEXT: CSECT Auxiliary Entry { +; SYMS-NEXT: Index: [[#INDX+5]] +; SYMS-NEXT: SectionLen: 0 +; SYMS-NEXT: ParameterHashIndex: 0x0 +; SYMS-NEXT: TypeChkSectNum: 0x0 +; SYMS-NEXT: SymbolAlignmentLog2: 2 +; SYMS-NEXT: SymbolType: XTY_SD (0x1) +; SYMS-NEXT: StorageMappingClass: XMC_PR (0x0) +; SYMS-NEXT: StabInfoIndex: 0x0 +; SYMS-NEXT: StabSectNum: 0x0 +; SYMS-NEXT: } +; SYMS-NEXT: } + +; SYMS: Symbol { +; SYMS-NEXT: Index: [[#INDX+6]] +; SYMS-NEXT: Name: .tdata +; SYMS-NEXT: Value (RelocatableAddress): 0x0 +; SYMS-NEXT: Section: .tdata +; SYMS-NEXT: Type: 0x0 +; SYMS-NEXT: StorageClass: C_HIDEXT (0x6B) +; SYMS-NEXT: NumberOfAuxEntries: 1 +; SYMS-NEXT: CSECT Auxiliary Entry { +; SYMS-NEXT: Index: [[#INDX+7]] +; SYMS-NEXT: SectionLen: 48 +; SYMS-NEXT: ParameterHashIndex: 0x0 +; SYMS-NEXT: TypeChkSectNum: 0x0 +; SYMS-NEXT: SymbolAlignmentLog2: 3 +; SYMS-NEXT: SymbolType: XTY_SD (0x1) +; SYMS-NEXT: StorageMappingClass: XMC_TL (0x14) +; SYMS-NEXT: StabInfoIndex: 0x0 +; SYMS-NEXT: StabSectNum: 0x0 +; SYMS-NEXT: } +; SYMS-NEXT: } + + +; SYMS: Symbol { +; SYMS-NEXT: Index: [[#INDX+8]] +; SYMS-NEXT: Name: tls_global_int_external_val_initialized +; SYMS-NEXT: Value (RelocatableAddress): 0x0 +; SYMS-NEXT: Section: .tdata +; SYMS-NEXT: Type: 0x0 +; SYMS-NEXT: StorageClass: C_EXT (0x2) +; SYMS-NEXT: NumberOfAuxEntries: 1 +; SYMS-NEXT: CSECT Auxiliary Entry { +; SYMS-NEXT: Index: [[#INDX+9]] +; SYMS-NEXT: ContainingCsectSymbolIndex: 7 +; SYMS-NEXT: ParameterHashIndex: 0x0 +; SYMS-NEXT: TypeChkSectNum: 0x0 +; SYMS-NEXT: SymbolAlignmentLog2: 0 +; SYMS-NEXT: SymbolType: XTY_LD (0x2) +; SYMS-NEXT: StorageMappingClass: XMC_TL (0x14) +; SYMS-NEXT: StabInfoIndex: 0x0 +; SYMS-NEXT: StabSectNum: 0x0 +; SYMS-NEXT: } +; SYMS-NEXT: } + +; SYMS: Symbol { +; SYMS-NEXT: Index: [[#INDX+10]] +; SYMS-NEXT: Name: tls_global_int_external_zero_initialized +; SYMS-NEXT: Value (RelocatableAddress): 0x4 +; SYMS-NEXT: Section: .tdata +; SYMS-NEXT: Type: 0x0 +; SYMS-NEXT: StorageClass: C_EXT (0x2) +; SYMS-NEXT: NumberOfAuxEntries: 1 +; SYMS-NEXT: CSECT Auxiliary Entry { +; SYMS-NEXT: Index: [[#INDX+11]] +; SYMS-NEXT: ContainingCsectSymbolIndex: 7 +; SYMS-NEXT: ParameterHashIndex: 0x0 +; SYMS-NEXT: TypeChkSectNum: 0x0 +; SYMS-NEXT: SymbolAlignmentLog2: 0 +; SYMS-NEXT: SymbolType: XTY_LD (0x2) +; SYMS-NEXT: StorageMappingClass: XMC_TL (0x14) +; SYMS-NEXT: StabInfoIndex: 0x0 +; SYMS-NEXT: StabSectNum: 0x0 +; SYMS-NEXT: } +; SYMS-NEXT: } + +; SYMS: Symbol { +; SYMS-NEXT: Index: [[#INDX+12]] +; SYMS-NEXT: Name: tls_global_int_local_val_initialized +; SYMS-NEXT: Value (RelocatableAddress): 0x8 +; SYMS-NEXT: Section: .tdata +; SYMS-NEXT: Type: 0x0 +; SYMS-NEXT: StorageClass: C_HIDEXT (0x6B) +; SYMS-NEXT: NumberOfAuxEntries: 1 +; SYMS-NEXT: CSECT Auxiliary Entry { +; SYMS-NEXT: Index: [[#INDX+13]] +; SYMS-NEXT: ContainingCsectSymbolIndex: 7 +; SYMS-NEXT: ParameterHashIndex: 0x0 +; SYMS-NEXT: TypeChkSectNum: 0x0 +; SYMS-NEXT: SymbolAlignmentLog2: 0 +; SYMS-NEXT: SymbolType: XTY_LD (0x2) +; SYMS-NEXT: StorageMappingClass: XMC_TL (0x14) +; SYMS-NEXT: StabInfoIndex: 0x0 +; SYMS-NEXT: StabSectNum: 0x0 +; SYMS-NEXT: } +; SYMS-NEXT: } + +; SYMS: Symbol { +; SYMS-NEXT: Index: [[#INDX+14]] +; SYMS-NEXT: Name: tls_global_int_weak_zero_initialized +; SYMS-NEXT: Value (RelocatableAddress): 0xC +; SYMS-NEXT: Section: .tdata +; SYMS-NEXT: Type: 0x0 +; SYMS-NEXT: StorageClass: C_WEAKEXT (0x6F) +; SYMS-NEXT: NumberOfAuxEntries: 1 +; SYMS-NEXT: CSECT Auxiliary Entry { +; SYMS-NEXT: Index: [[#INDX+15]] +; SYMS-NEXT: ContainingCsectSymbolIndex: 7 +; SYMS-NEXT: ParameterHashIndex: 0x0 +; SYMS-NEXT: TypeChkSectNum: 0x0 +; SYMS-NEXT: SymbolAlignmentLog2: 0 +; SYMS-NEXT: SymbolType: XTY_LD (0x2) +; SYMS-NEXT: StorageMappingClass: XMC_TL (0x14) +; SYMS-NEXT: StabInfoIndex: 0x0 +; SYMS-NEXT: StabSectNum: 0x0 +; SYMS-NEXT: } +; SYMS-NEXT: } + +; SYMS: Symbol { +; SYMS-NEXT: Index: [[#INDX+16]] +; SYMS-NEXT: Name: tls_global_int_weak_val_initialized +; SYMS-NEXT: Value (RelocatableAddress): 0x10 +; SYMS-NEXT: Section: .tdata +; SYMS-NEXT: Type: 0x0 +; SYMS-NEXT: StorageClass: C_WEAKEXT (0x6F) +; SYMS-NEXT: NumberOfAuxEntries: 1 +; SYMS-NEXT: CSECT Auxiliary Entry { +; SYMS-NEXT: Index: [[#INDX+17]] +; SYMS-NEXT: ContainingCsectSymbolIndex: 7 +; SYMS-NEXT: ParameterHashIndex: 0x0 +; SYMS-NEXT: TypeChkSectNum: 0x0 +; SYMS-NEXT: SymbolAlignmentLog2: 0 +; SYMS-NEXT: SymbolType: XTY_LD (0x2) +; SYMS-NEXT: StorageMappingClass: XMC_TL (0x14) +; SYMS-NEXT: StabInfoIndex: 0x0 +; SYMS-NEXT: StabSectNum: 0x0 +; SYMS-NEXT: } +; SYMS-NEXT: } + +; SYMS: Symbol { +; SYMS-NEXT: Index: [[#INDX+18]] +; SYMS-NEXT: Name: tls_global_long_long_internal_val_initialized +; SYMS-NEXT: Value (RelocatableAddress): 0x18 +; SYMS-NEXT: Section: .tdata +; SYMS-NEXT: Type: 0x0 +; SYMS-NEXT: StorageClass: C_HIDEXT (0x6B) +; SYMS-NEXT: NumberOfAuxEntries: 1 +; SYMS-NEXT: CSECT Auxiliary Entry { +; SYMS-NEXT: Index: [[#INDX+19]] +; SYMS-NEXT: ContainingCsectSymbolIndex: 7 +; SYMS-NEXT: ParameterHashIndex: 0x0 +; SYMS-NEXT: TypeChkSectNum: 0x0 +; SYMS-NEXT: SymbolAlignmentLog2: 0 +; SYMS-NEXT: SymbolType: XTY_LD (0x2) +; SYMS-NEXT: StorageMappingClass: XMC_TL (0x14) +; SYMS-NEXT: StabInfoIndex: 0x0 +; SYMS-NEXT: StabSectNum: 0x0 +; SYMS-NEXT: } +; SYMS-NEXT: } + +; SYMS: Symbol { +; SYMS-NEXT: Index: [[#INDX+20]] +; SYMS-NEXT: Name: tls_global_long_long_weak_val_initialized +; SYMS-NEXT: Value (RelocatableAddress): 0x20 +; SYMS-NEXT: Section: .tdata +; SYMS-NEXT: Type: 0x0 +; SYMS-NEXT: StorageClass: C_WEAKEXT (0x6F) +; SYMS-NEXT: NumberOfAuxEntries: 1 +; SYMS-NEXT: CSECT Auxiliary Entry { +; SYMS-NEXT: Index: [[#INDX+21]] +; SYMS-NEXT: ContainingCsectSymbolIndex: 7 +; SYMS-NEXT: ParameterHashIndex: 0x0 +; SYMS-NEXT: TypeChkSectNum: 0x0 +; SYMS-NEXT: SymbolAlignmentLog2: 0 +; SYMS-NEXT: SymbolType: XTY_LD (0x2) +; SYMS-NEXT: StorageMappingClass: XMC_TL (0x14) +; SYMS-NEXT: StabInfoIndex: 0x0 +; SYMS-NEXT: StabSectNum: 0x0 +; SYMS-NEXT: } +; SYMS-NEXT: } + +; SYMS: Symbol { +; SYMS-NEXT: Index: [[#INDX+22]] +; SYMS-NEXT: Name: tls_global_long_long_weak_zero_initialized +; SYMS-NEXT: Value (RelocatableAddress): 0x28 +; SYMS-NEXT: Section: .tdata +; SYMS-NEXT: Type: 0x0 +; SYMS-NEXT: StorageClass: C_WEAKEXT (0x6F) +; SYMS-NEXT: NumberOfAuxEntries: 1 +; SYMS-NEXT: CSECT Auxiliary Entry { +; SYMS-NEXT: Index: [[#INDX+23]] +; SYMS-NEXT: ContainingCsectSymbolIndex: 7 +; SYMS-NEXT: ParameterHashIndex: 0x0 +; SYMS-NEXT: TypeChkSectNum: 0x0 +; SYMS-NEXT: SymbolAlignmentLog2: 0 +; SYMS-NEXT: SymbolType: XTY_LD (0x2) +; SYMS-NEXT: StorageMappingClass: XMC_TL (0x14) +; SYMS-NEXT: StabInfoIndex: 0x0 +; SYMS-NEXT: StabSectNum: 0x0 +; SYMS-NEXT: } +; SYMS-NEXT: } + +; SYMS: Symbol { +; SYMS-NEXT: Index: [[#INDX+24]] +; SYMS-NEXT: Name: tls_global_int_local_zero_initialized +; SYMS-NEXT: Value (RelocatableAddress): 0x30 +; SYMS-NEXT: Section: .tbss +; SYMS-NEXT: Type: 0x0 +; SYMS-NEXT: StorageClass: C_HIDEXT (0x6B) +; SYMS-NEXT: NumberOfAuxEntries: 1 +; SYMS-NEXT: CSECT Auxiliary Entry { +; SYMS-NEXT: Index: [[#INDX+25]] +; SYMS-NEXT: SectionLen: 4 +; SYMS-NEXT: ParameterHashIndex: 0x0 +; SYMS-NEXT: TypeChkSectNum: 0x0 +; SYMS-NEXT: SymbolAlignmentLog2: 2 +; SYMS-NEXT: SymbolType: XTY_CM (0x3) +; SYMS-NEXT: StorageMappingClass: 0x15 +; SYMS-NEXT: StabInfoIndex: 0x0 +; SYMS-NEXT: StabSectNum: 0x0 +; SYMS-NEXT: } +; SYMS-NEXT: } + +; SYMS: Symbol { +; SYMS-NEXT: Index: [[#INDX+26]] +; SYMS-NEXT: Name: tls_global_int_common_zero_initialized +; SYMS-NEXT: Value (RelocatableAddress): 0x34 +; SYMS-NEXT: Section: .tbss +; SYMS-NEXT: Type: 0x0 +; SYMS-NEXT: StorageClass: C_EXT (0x2) +; SYMS-NEXT: NumberOfAuxEntries: 1 +; SYMS-NEXT: CSECT Auxiliary Entry { +; SYMS-NEXT: Index: [[#INDX+27]] +; SYMS-NEXT: SectionLen: 4 +; SYMS-NEXT: ParameterHashIndex: 0x0 +; SYMS-NEXT: TypeChkSectNum: 0x0 +; SYMS-NEXT: SymbolAlignmentLog2: 2 +; SYMS-NEXT: SymbolType: XTY_CM (0x3) +; SYMS-NEXT: StorageMappingClass: 0x15 +; SYMS-NEXT: StabInfoIndex: 0x0 +; SYMS-NEXT: StabSectNum: 0x0 +; SYMS-NEXT: } +; SYMS-NEXT: } + +; SYMS: Symbol { +; SYMS-NEXT: Index: [[#INDX+28]] +; SYMS-NEXT: Name: tls_global_double_common_zero_initialized +; SYMS-NEXT: Value (RelocatableAddress): 0x38 +; SYMS-NEXT: Section: .tbss +; SYMS-NEXT: Type: 0x0 +; SYMS-NEXT: StorageClass: C_EXT (0x2) +; SYMS-NEXT: NumberOfAuxEntries: 1 +; SYMS-NEXT: CSECT Auxiliary Entry { +; SYMS-NEXT: Index: [[#INDX+29]] +; SYMS-NEXT: SectionLen: 8 +; SYMS-NEXT: ParameterHashIndex: 0x0 +; SYMS-NEXT: TypeChkSectNum: 0x0 +; SYMS-NEXT: SymbolAlignmentLog2: 3 +; SYMS-NEXT: SymbolType: XTY_CM (0x3) +; SYMS-NEXT: StorageMappingClass: 0x15 +; SYMS-NEXT: StabInfoIndex: 0x0 +; SYMS-NEXT: StabSectNum: 0x0 +; SYMS-NEXT: } +; SYMS-NEXT: } + +; SYMS: Symbol { +; SYMS-NEXT: Index: [[#INDX+30]] +; SYMS-NEXT: Name: tls_global_long_long_internal_zero_initialized +; SYMS-NEXT: Value (RelocatableAddress): 0x40 +; SYMS-NEXT: Section: .tbss +; SYMS-NEXT: Type: 0x0 +; SYMS-NEXT: StorageClass: C_HIDEXT (0x6B) +; SYMS-NEXT: NumberOfAuxEntries: 1 +; SYMS-NEXT: CSECT Auxiliary Entry { +; SYMS-NEXT: Index: [[#INDX+31]] +; SYMS-NEXT: SectionLen: 8 +; SYMS-NEXT: ParameterHashIndex: 0x0 +; SYMS-NEXT: TypeChkSectNum: 0x0 +; SYMS-NEXT: SymbolAlignmentLog2: 3 +; SYMS-NEXT: SymbolType: XTY_CM (0x3) +; SYMS-NEXT: StorageMappingClass: 0x15 +; SYMS-NEXT: StabInfoIndex: 0x0 +; SYMS-NEXT: StabSectNum: 0x0 +; SYMS-NEXT: } +; SYMS-NEXT: } + +@tls_global_int_external_val_initialized = thread_local global i32 1, align 4 +@tls_global_int_external_zero_initialized = thread_local global i32 0, align 4 +@tls_global_int_local_val_initialized = internal thread_local global i32 2, align 4 +@tls_global_int_local_zero_initialized = internal thread_local global i32 0, align 4 +@tls_global_int_weak_zero_initialized = weak thread_local global i32 0, align 4 +@tls_global_int_common_zero_initialized = common thread_local global i32 0, align 4 +@tls_global_int_weak_val_initialized = weak thread_local global i32 1, align 4 +@tls_global_int_external_uninitialized = external thread_local global i32, align 4 +@tls_global_double_common_zero_initialized = common thread_local global double 0.000000e+00, align 8 +@tls_global_double_external_uninitialized = external thread_local global i64, align 8 +@tls_global_long_long_internal_val_initialized = internal thread_local global i64 1, align 8 +@tls_global_long_long_internal_zero_initialized = internal thread_local global i64 0, align 8 +@tls_global_long_long_weak_val_initialized = weak thread_local global i64 1, align 8 +@tls_global_long_long_weak_zero_initialized = weak thread_local global i64 0, align 8 diff --git a/llvm/test/CodeGen/PowerPC/aix-tls-xcoff-variables.ll b/llvm/test/CodeGen/PowerPC/aix-tls-xcoff-variables.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/PowerPC/aix-tls-xcoff-variables.ll @@ -0,0 +1,413 @@ +; This file tests the codegen of tls variables in AIX XCOFF object files with data section ON. + +; RUN: llc -mtriple powerpc-ibm-aix-xcoff -filetype=obj -o %t.o < %s +; RUN: llvm-readobj --section-headers --file-header %t.o | \ +; RUN: FileCheck --check-prefix=OBJ %s +; RUN: llvm-readobj --syms %t.o | FileCheck --check-prefix=SYMS %s + +; RUN: not --crash llc -mtriple powerpc64-ibm-aix-xcoff -filetype=obj < %s 2>&1 | \ +; RUN: FileCheck --check-prefix=XCOFF64 %s +; XCOFF64: LLVM ERROR: 64-bit XCOFF object files are not supported yet. + +; OBJ: File: {{.*}}aix-tls-xcoff-variables.ll.tmp.o +; OBJ-NEXT: Format: aixcoff-rs6000 +; OBJ-NEXT: Arch: powerpc +; OBJ-NEXT: AddressSize: 32bit +; OBJ-NEXT: FileHeader { +; OBJ-NEXT: Magic: 0x1DF +; OBJ-NEXT: NumberOfSections: 3 +; OBJ-NEXT: TimeStamp: None (0x0) +; OBJ-NEXT: SymbolTableOffset: 0xBC +; OBJ-NEXT: SymbolTableEntries: 31 +; OBJ-NEXT: OptionalHeaderSize: 0x0 +; OBJ-NEXT: Flags: 0x0 +; OBJ-NEXT: } + +; OBJ: Sections [ +; OBJ: Section { +; OBJ-NEXT: Index: 1 +; OBJ-NEXT: Name: .text +; OBJ-NEXT: PhysicalAddress: 0x0 +; OBJ-NEXT: VirtualAddress: 0x0 +; OBJ-NEXT: Size: 0x0 +; OBJ-NEXT: RawDataOffset: 0x8C +; OBJ-NEXT: RelocationPointer: 0x0 +; OBJ-NEXT: LineNumberPointer: 0x0 +; OBJ-NEXT: NumberOfRelocations: 0 +; OBJ-NEXT: NumberOfLineNumbers: 0 +; OBJ-NEXT: Type: STYP_TEXT (0x20) +; OBJ-NEXT: } + +; OBJ: Section { +; OBJ-NEXT: Index: 2 +; OBJ-NEXT: Name: .tdata +; OBJ-NEXT: PhysicalAddress: 0x0 +; OBJ-NEXT: VirtualAddress: 0x0 +; OBJ-NEXT: Size: 0x30 +; OBJ-NEXT: RawDataOffset: 0x8C +; OBJ-NEXT: RelocationPointer: 0x0 +; OBJ-NEXT: LineNumberPointer: 0x0 +; OBJ-NEXT: NumberOfRelocations: 0 +; OBJ-NEXT: NumberOfLineNumbers: 0 +; OBJ-NEXT: Type: STYP_TDATA (0x400) +; OBJ-NEXT: } + +; OBJ: Section { +; OBJ-NEXT: Index: 3 +; OBJ-NEXT: Name: .tbss +; OBJ-NEXT: PhysicalAddress: 0x30 +; OBJ-NEXT: VirtualAddress: 0x30 +; OBJ-NEXT: Size: 0x18 +; OBJ-NEXT: RawDataOffset: 0x0 +; OBJ-NEXT: RelocationPointer: 0x0 +; OBJ-NEXT: LineNumberPointer: 0x0 +; OBJ-NEXT: NumberOfRelocations: 0 +; OBJ-NEXT: NumberOfLineNumbers: 0 +; OBJ-NEXT: Type: STYP_TBSS (0x800) +; OBJ-NEXT: } +; OBJ: ] + +; SYMS: File: {{.*}}aix-tls-xcoff-variables.ll.tmp.o +; SYMS-NEXT: Format: aixcoff-rs6000 +; SYMS-NEXT: Arch: powerpc +; SYMS-NEXT: AddressSize: 32bit +; SYMS: Symbols [ +; SYMS-NEXT: Symbol { +; SYMS-NEXT: Index: 0 +; SYMS-NEXT: Name: .file +; SYMS-NEXT: Value (SymbolTableIndex): 0x0 +; SYMS-NEXT: Section: N_DEBUG +; SYMS-NEXT: Source Language ID: TB_C (0x0) +; SYMS-NEXT: CPU Version ID: 0x0 +; SYMS-NEXT: StorageClass: C_FILE (0x67) +; SYMS-NEXT: NumberOfAuxEntries: 0 +; SYMS-NEXT: } +; SYMS-NEXT: Symbol { +; SYMS-NEXT: Index: [[#INDX:]] +; SYMS-NEXT: Name: tls_global_int_external_uninitialized +; SYMS-NEXT: Value (RelocatableAddress): 0x0 +; SYMS-NEXT: Section: N_UNDEF +; SYMS-NEXT: Type: 0x0 +; SYMS-NEXT: StorageClass: C_EXT (0x2) +; SYMS-NEXT: NumberOfAuxEntries: 1 +; SYMS-NEXT: CSECT Auxiliary Entry { +; SYMS-NEXT: Index: [[#INDX+1]] +; SYMS-NEXT: SectionLen: 0 +; SYMS-NEXT: ParameterHashIndex: 0x0 +; SYMS-NEXT: TypeChkSectNum: 0x0 +; SYMS-NEXT: SymbolAlignmentLog2: 0 +; SYMS-NEXT: SymbolType: XTY_ER (0x0) +; SYMS-NEXT: StorageMappingClass: 0x15 +; SYMS-NEXT: StabInfoIndex: 0x0 +; SYMS-NEXT: StabSectNum: 0x0 +; SYMS-NEXT: } +; SYMS-NEXT: } +; SYMS-NEXT: Symbol { +; SYMS-NEXT: Index: [[#INDX+2]] +; SYMS-NEXT: Name: tls_global_double_external_uninitialized +; SYMS-NEXT: Value (RelocatableAddress): 0x0 +; SYMS-NEXT: Section: N_UNDEF +; SYMS-NEXT: Type: 0x0 +; SYMS-NEXT: StorageClass: C_EXT (0x2) +; SYMS-NEXT: NumberOfAuxEntries: 1 +; SYMS-NEXT: CSECT Auxiliary Entry { +; SYMS-NEXT: Index: [[#INDX+3]] +; SYMS-NEXT: SectionLen: 0 +; SYMS-NEXT: ParameterHashIndex: 0x0 +; SYMS-NEXT: TypeChkSectNum: 0x0 +; SYMS-NEXT: SymbolAlignmentLog2: 0 +; SYMS-NEXT: SymbolType: XTY_ER (0x0) +; SYMS-NEXT: StorageMappingClass: 0x15 +; SYMS-NEXT: StabInfoIndex: 0x0 +; SYMS-NEXT: StabSectNum: 0x0 +; SYMS-NEXT: } +; SYMS-NEXT: } + + +; SYMS-NEXT: Symbol { +; SYMS-NEXT: Index: [[#INDX+4]] +; SYMS-NEXT: Name: .text +; SYMS-NEXT: Value (RelocatableAddress): 0x0 +; SYMS-NEXT: Section: .text +; SYMS-NEXT: Type: 0x0 +; SYMS-NEXT: StorageClass: C_HIDEXT (0x6B) +; SYMS-NEXT: NumberOfAuxEntries: 1 +; SYMS-NEXT: CSECT Auxiliary Entry { +; SYMS-NEXT: Index: [[#INDX+5]] +; SYMS-NEXT: SectionLen: 0 +; SYMS-NEXT: ParameterHashIndex: 0x0 +; SYMS-NEXT: TypeChkSectNum: 0x0 +; SYMS-NEXT: SymbolAlignmentLog2: 2 +; SYMS-NEXT: SymbolType: XTY_SD (0x1) +; SYMS-NEXT: StorageMappingClass: XMC_PR (0x0) +; SYMS-NEXT: StabInfoIndex: 0x0 +; SYMS-NEXT: StabSectNum: 0x0 +; SYMS-NEXT: } +; SYMS-NEXT: } + +; SYMS: Symbol { +; SYMS-NEXT: Index: [[#INDX+6]] +; SYMS-NEXT: Name: tls_global_int_external_val_initialized +; SYMS-NEXT: Value (RelocatableAddress): 0x0 +; SYMS-NEXT: Section: .tdata +; SYMS-NEXT: Type: 0x0 +; SYMS-NEXT: StorageClass: C_EXT (0x2) +; SYMS-NEXT: NumberOfAuxEntries: 1 +; SYMS-NEXT: CSECT Auxiliary Entry { +; SYMS-NEXT: Index: [[#INDX+7]] +; SYMS-NEXT: SectionLen: 4 +; SYMS-NEXT: ParameterHashIndex: 0x0 +; SYMS-NEXT: TypeChkSectNum: 0x0 +; SYMS-NEXT: SymbolAlignmentLog2: 2 +; SYMS-NEXT: SymbolType: XTY_SD (0x1) +; SYMS-NEXT: StorageMappingClass: XMC_TL (0x14) +; SYMS-NEXT: StabInfoIndex: 0x0 +; SYMS-NEXT: StabSectNum: 0x0 +; SYMS-NEXT: } +; SYMS-NEXT: } + +; SYMS: Symbol { +; SYMS-NEXT: Index: [[#INDX+8]] +; SYMS-NEXT: Name: tls_global_int_external_zero_initialized +; SYMS-NEXT: Value (RelocatableAddress): 0x4 +; SYMS-NEXT: Section: .tdata +; SYMS-NEXT: Type: 0x0 +; SYMS-NEXT: StorageClass: C_EXT (0x2) +; SYMS-NEXT: NumberOfAuxEntries: 1 +; SYMS-NEXT: CSECT Auxiliary Entry { +; SYMS-NEXT: Index: [[#INDX+9]] +; SYMS-NEXT: SectionLen: 4 +; SYMS-NEXT: ParameterHashIndex: 0x0 +; SYMS-NEXT: TypeChkSectNum: 0x0 +; SYMS-NEXT: SymbolAlignmentLog2: 2 +; SYMS-NEXT: SymbolType: XTY_SD (0x1) +; SYMS-NEXT: StorageMappingClass: XMC_TL (0x14) +; SYMS-NEXT: StabInfoIndex: 0x0 +; SYMS-NEXT: StabSectNum: 0x0 +; SYMS-NEXT: } +; SYMS-NEXT: } + +; SYMS: Symbol { +; SYMS-NEXT: Index: [[#INDX+10]] +; SYMS-NEXT: Name: tls_global_int_local_val_initialized +; SYMS-NEXT: Value (RelocatableAddress): 0x8 +; SYMS-NEXT: Section: .tdata +; SYMS-NEXT: Type: 0x0 +; SYMS-NEXT: StorageClass: C_HIDEXT (0x6B) +; SYMS-NEXT: NumberOfAuxEntries: 1 +; SYMS-NEXT: CSECT Auxiliary Entry { +; SYMS-NEXT: Index: [[#INDX+11]] +; SYMS-NEXT: SectionLen: 4 +; SYMS-NEXT: ParameterHashIndex: 0x0 +; SYMS-NEXT: TypeChkSectNum: 0x0 +; SYMS-NEXT: SymbolAlignmentLog2: 2 +; SYMS-NEXT: SymbolType: XTY_SD (0x1) +; SYMS-NEXT: StorageMappingClass: XMC_TL (0x14) +; SYMS-NEXT: StabInfoIndex: 0x0 +; SYMS-NEXT: StabSectNum: 0x0 +; SYMS-NEXT: } +; SYMS-NEXT: } + +; SYMS: Symbol { +; SYMS-NEXT: Index: [[#INDX+12]] +; SYMS-NEXT: Name: tls_global_int_weak_zero_initialized +; SYMS-NEXT: Value (RelocatableAddress): 0xC +; SYMS-NEXT: Section: .tdata +; SYMS-NEXT: Type: 0x0 +; SYMS-NEXT: StorageClass: C_WEAKEXT (0x6F) +; SYMS-NEXT: NumberOfAuxEntries: 1 +; SYMS-NEXT: CSECT Auxiliary Entry { +; SYMS-NEXT: Index: [[#INDX+13]] +; SYMS-NEXT: SectionLen: 4 +; SYMS-NEXT: ParameterHashIndex: 0x0 +; SYMS-NEXT: TypeChkSectNum: 0x0 +; SYMS-NEXT: SymbolAlignmentLog2: 2 +; SYMS-NEXT: SymbolType: XTY_SD (0x1) +; SYMS-NEXT: StorageMappingClass: XMC_TL (0x14) +; SYMS-NEXT: StabInfoIndex: 0x0 +; SYMS-NEXT: StabSectNum: 0x0 +; SYMS-NEXT: } +; SYMS-NEXT: } + +; SYMS: Symbol { +; SYMS-NEXT: Index: [[#INDX+14]] +; SYMS-NEXT: Name: tls_global_int_weak_val_initialized +; SYMS-NEXT: Value (RelocatableAddress): 0x10 +; SYMS-NEXT: Section: .tdata +; SYMS-NEXT: Type: 0x0 +; SYMS-NEXT: StorageClass: C_WEAKEXT (0x6F) +; SYMS-NEXT: NumberOfAuxEntries: 1 +; SYMS-NEXT: CSECT Auxiliary Entry { +; SYMS-NEXT: Index: [[#INDX+15]] +; SYMS-NEXT: SectionLen: 4 +; SYMS-NEXT: ParameterHashIndex: 0x0 +; SYMS-NEXT: TypeChkSectNum: 0x0 +; SYMS-NEXT: SymbolAlignmentLog2: 2 +; SYMS-NEXT: SymbolType: XTY_SD (0x1) +; SYMS-NEXT: StorageMappingClass: XMC_TL (0x14) +; SYMS-NEXT: StabInfoIndex: 0x0 +; SYMS-NEXT: StabSectNum: 0x0 +; SYMS-NEXT: } +; SYMS-NEXT: } + +; SYMS: Symbol { +; SYMS-NEXT: Index: [[#INDX+16]] +; SYMS-NEXT: Name: tls_global_long_long_internal_val_initialized +; SYMS-NEXT: Value (RelocatableAddress): 0x18 +; SYMS-NEXT: Section: .tdata +; SYMS-NEXT: Type: 0x0 +; SYMS-NEXT: StorageClass: C_HIDEXT (0x6B) +; SYMS-NEXT: NumberOfAuxEntries: 1 +; SYMS-NEXT: CSECT Auxiliary Entry { +; SYMS-NEXT: Index: [[#INDX+17]] +; SYMS-NEXT: SectionLen: 8 +; SYMS-NEXT: ParameterHashIndex: 0x0 +; SYMS-NEXT: TypeChkSectNum: 0x0 +; SYMS-NEXT: SymbolAlignmentLog2: 3 +; SYMS-NEXT: SymbolType: XTY_SD (0x1) +; SYMS-NEXT: StorageMappingClass: XMC_TL (0x14) +; SYMS-NEXT: StabInfoIndex: 0x0 +; SYMS-NEXT: StabSectNum: 0x0 +; SYMS-NEXT: } +; SYMS-NEXT: } + +; SYMS: Symbol { +; SYMS-NEXT: Index: [[#INDX+18]] +; SYMS-NEXT: Name: tls_global_long_long_weak_val_initialized +; SYMS-NEXT: Value (RelocatableAddress): 0x20 +; SYMS-NEXT: Section: .tdata +; SYMS-NEXT: Type: 0x0 +; SYMS-NEXT: StorageClass: C_WEAKEXT (0x6F) +; SYMS-NEXT: NumberOfAuxEntries: 1 +; SYMS-NEXT: CSECT Auxiliary Entry { +; SYMS-NEXT: Index: [[#INDX+19]] +; SYMS-NEXT: SectionLen: 8 +; SYMS-NEXT: ParameterHashIndex: 0x0 +; SYMS-NEXT: TypeChkSectNum: 0x0 +; SYMS-NEXT: SymbolAlignmentLog2: 3 +; SYMS-NEXT: SymbolType: XTY_SD (0x1) +; SYMS-NEXT: StorageMappingClass: XMC_TL (0x14) +; SYMS-NEXT: StabInfoIndex: 0x0 +; SYMS-NEXT: StabSectNum: 0x0 +; SYMS-NEXT: } +; SYMS-NEXT: } + +; SYMS: Symbol { +; SYMS-NEXT: Index: [[#INDX+20]] +; SYMS-NEXT: Name: tls_global_long_long_weak_zero_initialized +; SYMS-NEXT: Value (RelocatableAddress): 0x28 +; SYMS-NEXT: Section: .tdata +; SYMS-NEXT: Type: 0x0 +; SYMS-NEXT: StorageClass: C_WEAKEXT (0x6F) +; SYMS-NEXT: NumberOfAuxEntries: 1 +; SYMS-NEXT: CSECT Auxiliary Entry { +; SYMS-NEXT: Index: [[#INDX+21]] +; SYMS-NEXT: SectionLen: 8 +; SYMS-NEXT: ParameterHashIndex: 0x0 +; SYMS-NEXT: TypeChkSectNum: 0x0 +; SYMS-NEXT: SymbolAlignmentLog2: 3 +; SYMS-NEXT: SymbolType: XTY_SD (0x1) +; SYMS-NEXT: StorageMappingClass: XMC_TL (0x14) +; SYMS-NEXT: StabInfoIndex: 0x0 +; SYMS-NEXT: StabSectNum: 0x0 +; SYMS-NEXT: } +; SYMS-NEXT: } + +; SYMS: Symbol { +; SYMS-NEXT: Index: [[#INDX+22]] +; SYMS-NEXT: Name: tls_global_int_local_zero_initialized +; SYMS-NEXT: Value (RelocatableAddress): 0x30 +; SYMS-NEXT: Section: .tbss +; SYMS-NEXT: Type: 0x0 +; SYMS-NEXT: StorageClass: C_HIDEXT (0x6B) +; SYMS-NEXT: NumberOfAuxEntries: 1 +; SYMS-NEXT: CSECT Auxiliary Entry { +; SYMS-NEXT: Index: [[#INDX+23]] +; SYMS-NEXT: SectionLen: 4 +; SYMS-NEXT: ParameterHashIndex: 0x0 +; SYMS-NEXT: TypeChkSectNum: 0x0 +; SYMS-NEXT: SymbolAlignmentLog2: 2 +; SYMS-NEXT: SymbolType: XTY_CM (0x3) +; SYMS-NEXT: StorageMappingClass: 0x15 +; SYMS-NEXT: StabInfoIndex: 0x0 +; SYMS-NEXT: StabSectNum: 0x0 +; SYMS-NEXT: } +; SYMS-NEXT: } + +; SYMS: Symbol { +; SYMS-NEXT: Index: [[#INDX+24]] +; SYMS-NEXT: Name: tls_global_int_common_zero_initialized +; SYMS-NEXT: Value (RelocatableAddress): 0x34 +; SYMS-NEXT: Section: .tbss +; SYMS-NEXT: Type: 0x0 +; SYMS-NEXT: StorageClass: C_EXT (0x2) +; SYMS-NEXT: NumberOfAuxEntries: 1 +; SYMS-NEXT: CSECT Auxiliary Entry { +; SYMS-NEXT: Index: [[#INDX+25]] +; SYMS-NEXT: SectionLen: 4 +; SYMS-NEXT: ParameterHashIndex: 0x0 +; SYMS-NEXT: TypeChkSectNum: 0x0 +; SYMS-NEXT: SymbolAlignmentLog2: 2 +; SYMS-NEXT: SymbolType: XTY_CM (0x3) +; SYMS-NEXT: StorageMappingClass: 0x15 +; SYMS-NEXT: StabInfoIndex: 0x0 +; SYMS-NEXT: StabSectNum: 0x0 +; SYMS-NEXT: } +; SYMS-NEXT: } + +; SYMS: Symbol { +; SYMS-NEXT: Index: [[#INDX+26]] +; SYMS-NEXT: Name: tls_global_double_common_zero_initialized +; SYMS-NEXT: Value (RelocatableAddress): 0x38 +; SYMS-NEXT: Section: .tbss +; SYMS-NEXT: Type: 0x0 +; SYMS-NEXT: StorageClass: C_EXT (0x2) +; SYMS-NEXT: NumberOfAuxEntries: 1 +; SYMS-NEXT: CSECT Auxiliary Entry { +; SYMS-NEXT: Index: [[#INDX+27]] +; SYMS-NEXT: SectionLen: 8 +; SYMS-NEXT: ParameterHashIndex: 0x0 +; SYMS-NEXT: TypeChkSectNum: 0x0 +; SYMS-NEXT: SymbolAlignmentLog2: 3 +; SYMS-NEXT: SymbolType: XTY_CM (0x3) +; SYMS-NEXT: StorageMappingClass: 0x15 +; SYMS-NEXT: StabInfoIndex: 0x0 +; SYMS-NEXT: StabSectNum: 0x0 +; SYMS-NEXT: } +; SYMS-NEXT: } + +; SYMS: Symbol { +; SYMS-NEXT: Index: [[#INDX+28]] +; SYMS-NEXT: Name: tls_global_long_long_internal_zero_initialized +; SYMS-NEXT: Value (RelocatableAddress): 0x40 +; SYMS-NEXT: Section: .tbss +; SYMS-NEXT: Type: 0x0 +; SYMS-NEXT: StorageClass: C_HIDEXT (0x6B) +; SYMS-NEXT: NumberOfAuxEntries: 1 +; SYMS-NEXT: CSECT Auxiliary Entry { +; SYMS-NEXT: Index: [[#INDX+29]] +; SYMS-NEXT: SectionLen: 8 +; SYMS-NEXT: ParameterHashIndex: 0x0 +; SYMS-NEXT: TypeChkSectNum: 0x0 +; SYMS-NEXT: SymbolAlignmentLog2: 3 +; SYMS-NEXT: SymbolType: XTY_CM (0x3) +; SYMS-NEXT: StorageMappingClass: 0x15 +; SYMS-NEXT: StabInfoIndex: 0x0 +; SYMS-NEXT: StabSectNum: 0x0 +; SYMS-NEXT: } +; SYMS-NEXT: } + +@tls_global_int_external_val_initialized = thread_local global i32 1, align 4 +@tls_global_int_external_zero_initialized = thread_local global i32 0, align 4 +@tls_global_int_local_val_initialized = internal thread_local global i32 2, align 4 +@tls_global_int_local_zero_initialized = internal thread_local global i32 0, align 4 +@tls_global_int_weak_zero_initialized = weak thread_local global i32 0, align 4 +@tls_global_int_common_zero_initialized = common thread_local global i32 0, align 4 +@tls_global_int_weak_val_initialized = weak thread_local global i32 1, align 4 +@tls_global_int_external_uninitialized = external thread_local global i32, align 4 +@tls_global_double_common_zero_initialized = common thread_local global double 0.000000e+00, align 8 +@tls_global_double_external_uninitialized = external thread_local global i64, align 8 +@tls_global_long_long_internal_val_initialized = internal thread_local global i64 1, align 8 +@tls_global_long_long_internal_zero_initialized = internal thread_local global i64 0, align 8 +@tls_global_long_long_weak_val_initialized = weak thread_local global i64 1, align 8 +@tls_global_long_long_weak_zero_initialized = weak thread_local global i64 0, align 8