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<Section *const, 3> Sections{{&Text, &Data, &BSS}};
+  std::array<Section *const, 5> 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