llvm/llvm/test/CodeGen/PowerPC/aix-tls-ie-xcoff-reloc.ll

; RUN: llc -verify-machineinstrs -mcpu=pwr7 -mtriple=powerpc64-ibm-aix-xcoff \
; RUN:   -xcoff-traceback-table=false -data-sections=false -filetype=obj -o %t.o < %s
; RUN: llvm-readobj --relocs --expand-relocs %t.o | FileCheck -D#NFA=2 --check-prefix=REL64 %s
; RUN: llvm-readobj --syms %t.o | FileCheck -D#NFA=2 --check-prefix=SYM64 %s
; RUN: llvm-objdump -D -r --symbol-description %t.o | FileCheck -D#NFA=2 --check-prefix=DIS64 %s

; RUN: llc -verify-machineinstrs -mcpu=pwr7 -mtriple=powerpc64-ibm-aix-xcoff -code-model=small \
; RUN:   -xcoff-traceback-table=false -data-sections=false -filetype=obj -o %t.o < %s
; RUN: llvm-readobj --relocs --expand-relocs %t.o | FileCheck -D#NFA=2 --check-prefix=REL64 %s
; RUN: llvm-readobj --syms %t.o | FileCheck -D#NFA=2 --check-prefix=SYM64 %s
; RUN: llvm-objdump -D -r --symbol-description %t.o | FileCheck -D#NFA=2 --check-prefix=DIS64 %s

; RUN: llc -verify-machineinstrs -mcpu=pwr7 -mtriple=powerpc-ibm-aix-xcoff \
; RUN:   -xcoff-traceback-table=false -data-sections=false -filetype=obj -o %t.o < %s
; RUN: llvm-readobj --relocs --expand-relocs %t.o | FileCheck -D#NFA=2 --check-prefix=REL32 %s
; RUN: llvm-readobj --syms %t.o | FileCheck -D#NFA=2 --check-prefix=SYM32 %s
; RUN: llvm-objdump -D -r --symbol-description %t.o | FileCheck -D#NFA=2 --check-prefix=DIS32 %s

; RUN: llc -verify-machineinstrs -mcpu=pwr7 -mtriple=powerpc-ibm-aix-xcoff -code-model=small \
; RUN:   -xcoff-traceback-table=false -data-sections=false -filetype=obj -o %t.o < %s
; RUN: llvm-readobj --relocs --expand-relocs %t.o | FileCheck -D#NFA=2 --check-prefix=REL32 %s
; RUN: llvm-readobj --syms %t.o | FileCheck -D#NFA=2 --check-prefix=SYM32 %s
; RUN: llvm-objdump -D -r --symbol-description %t.o | FileCheck -D#NFA=2 --check-prefix=DIS32 %s

@global_int_nonzero = thread_local(initialexec) global i32 1, align 4
@intern_int_zero = internal thread_local(initialexec) global i32 0, align 4

define void @store_intern_int_zero(i32 noundef signext %i) {
entry:
  %addr = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @intern_int_zero)
  store i32 %i, ptr %addr, align 4
  ret void
}

define signext i32 @load_global_int_nonzero() {
entry:
  %addr = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @global_int_nonzero)
  %val = load i32, ptr %addr, align 4
  ret i32 %val
}

define signext i32 @load_intern_int_zero() {
entry:
  %addr = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @intern_int_zero)
  %val = load i32, ptr %addr, align 4
  ret i32 %val
}

declare nonnull ptr @llvm.threadlocal.address.p0(ptr nonnull)

; REL64:      File:
; REL64-NEXT: Format: aix5coff64-rs6000
; REL64-NEXT: Arch: powerpc64
; REL64-NEXT: AddressSize: 64bit
; REL64-NEXT: Relocations [
; REL64:       Virtual Address: 0x2
; REL64-NEXT:       Symbol: intern_int_zero ([[#NFA+17]])
; REL64-NEXT:       IsSigned: No
; REL64-NEXT:       FixupBitValue: 0
; REL64-NEXT:       Length: 16
; REL64-NEXT:       Type: R_TOC (0x3)
; REL64-NEXT:     }
; REL64:       Virtual Address: 0x12
; REL64-NEXT:       Symbol: global_int_nonzero ([[#NFA+19]])
; REL64-NEXT:       IsSigned: No
; REL64-NEXT:       FixupBitValue: 0
; REL64-NEXT:       Length: 16
; REL64-NEXT:       Type: R_TOC (0x3)
; REL64-NEXT:     }
; REL64:       Virtual Address: 0x22
; REL64-NEXT:       Symbol: intern_int_zero ([[#NFA+17]])
; REL64-NEXT:       IsSigned: No
; REL64-NEXT:       FixupBitValue: 0
; REL64-NEXT:       Length: 16
; REL64-NEXT:       Type: R_TOC (0x3)
; REL64-NEXT:     }
; REL64:       Virtual Address: 0x78
; REL64-NEXT:       Symbol: intern_int_zero ([[#NFA+25]])
; REL64-NEXT:       IsSigned: No
; REL64-NEXT:       FixupBitValue: 0
; REL64-NEXT:       Length: 64
; REL64-NEXT:       Type: R_TLS_IE (0x21)
; REL64-NEXT:     }
; REL64:       Virtual Address: 0x80
; REL64-NEXT:       Symbol: global_int_nonzero ([[#NFA+23]])
; REL64-NEXT:       IsSigned: No
; REL64-NEXT:       FixupBitValue: 0
; REL64-NEXT:       Length: 64
; REL64-NEXT:       Type: R_TLS_IE (0x21)
; REL64-NEXT:     }

; SYM64:      File:
; SYM64-NEXT: Format: aix5coff64-rs6000
; SYM64-NEXT: Arch: powerpc64
; SYM64-NEXT: AddressSize: 64bit
; SYM64-NEXT: Symbols [
; SYM64:          Name: intern_int_zero
; SYM64-NEXT:     Value (RelocatableAddress): 0x78
; SYM64-NEXT:     Section: .data
; SYM64-NEXT:     Type: 0x0
; SYM64-NEXT:     StorageClass: C_HIDEXT (0x6B)
; SYM64-NEXT:     NumberOfAuxEntries: 1
; SYM64-NEXT:     CSECT Auxiliary Entry {
; SYM64-NEXT:       Index: [[#INDX:]]
; SYM64-NEXT:       SectionLen: 8
; SYM64-NEXT:       ParameterHashIndex: 0x0
; SYM64-NEXT:       TypeChkSectNum: 0x0
; SYM64-NEXT:       SymbolAlignmentLog2: 3
; SYM64-NEXT:       SymbolType: XTY_SD (0x1)
; SYM64-NEXT:       StorageMappingClass: XMC_TC (0x3)
; SYM64-NEXT:       Auxiliary Type: AUX_CSECT (0xFB)
; SYM64-NEXT:     }
; SYM64-NEXT:   }
; SYM64:     Index: [[#INDX+1]]
; SYM64-NEXT:     Name: global_int_nonzero
; SYM64-NEXT:     Value (RelocatableAddress): 0x80
; SYM64-NEXT:     Section: .data
; SYM64-NEXT:     Type: 0x0
; SYM64-NEXT:     StorageClass: C_HIDEXT (0x6B)
; SYM64-NEXT:     NumberOfAuxEntries: 1
; SYM64-NEXT:     CSECT Auxiliary Entry {
; SYM64-NEXT:       Index: [[#INDX+2]]
; SYM64-NEXT:       SectionLen: 8
; SYM64-NEXT:       ParameterHashIndex: 0x0
; SYM64-NEXT:       TypeChkSectNum: 0x0
; SYM64-NEXT:       SymbolAlignmentLog2: 3
; SYM64-NEXT:       SymbolType: XTY_SD (0x1)
; SYM64-NEXT:       StorageMappingClass: XMC_TC (0x3)
; SYM64-NEXT:       Auxiliary Type: AUX_CSECT (0xFB)
; SYM64-NEXT:     }
; SYM64-NEXT:   }
; SYM64:     Index: [[#INDX+5]]
; SYM64-NEXT:     Name: global_int_nonzero
; SYM64-NEXT:     Value (RelocatableAddress): 0x0
; SYM64-NEXT:     Section: .tdata
; SYM64-NEXT:     Type: 0x0
; SYM64-NEXT:     StorageClass: C_EXT (0x2)
; SYM64-NEXT:     NumberOfAuxEntries: 1
; SYM64-NEXT:     CSECT Auxiliary Entry {
; SYM64-NEXT:       Index: [[#INDX+6]]
; SYM64-NEXT:       ContainingCsectSymbolIndex: [[#INDX+3]]
; SYM64-NEXT:       ParameterHashIndex: 0x0
; SYM64-NEXT:       TypeChkSectNum: 0x0
; SYM64-NEXT:       SymbolAlignmentLog2: 0
; SYM64-NEXT:       SymbolType: XTY_LD (0x2)
; SYM64-NEXT:       StorageMappingClass: XMC_TL (0x14)
; SYM64-NEXT:       Auxiliary Type: AUX_CSECT (0xFB)
; SYM64-NEXT:     }
; SYM64-NEXT:   }
; SYM64:     Index: [[#INDX+7]]
; SYM64-NEXT:     Name: intern_int_zero
; SYM64-NEXT:     Value (RelocatableAddress): 0x4
; SYM64-NEXT:     Section: .tbss
; SYM64-NEXT:     Type: 0x0
; SYM64-NEXT:     StorageClass: C_HIDEXT (0x6B)
; SYM64-NEXT:     NumberOfAuxEntries: 1
; SYM64-NEXT:     CSECT Auxiliary Entry {
; SYM64-NEXT:       Index: [[#INDX+8]]
; SYM64-NEXT:       SectionLen: 4
; SYM64-NEXT:       ParameterHashIndex: 0x0
; SYM64-NEXT:       TypeChkSectNum: 0x0
; SYM64-NEXT:       SymbolAlignmentLog2: 2
; SYM64-NEXT:       SymbolType: XTY_CM (0x3)
; SYM64-NEXT:       StorageMappingClass: XMC_UL (0x15)
; SYM64-NEXT:       Auxiliary Type: AUX_CSECT (0xFB)
; SYM64-NEXT:     }
; SYM64-NEXT:   }

; DIS64: {{.*}}: file format aix5coff64-rs6000
; DIS64: Disassembly of section .text:
; DIS64: (idx: [[#NFA+3]]) .store_intern_int_zero:
; DIS64-NEXT: ld 4, 0(2)
; DIS64-NEXT: (idx: [[#NFA+17]]) intern_int_zero[TC]
; DIS64-NEXT: stwx 3, 13, 4
; DIS64-NEXT: blr
; DIS64: (idx: [[#NFA+5]]) .load_global_int_nonzero:
; DIS64-NEXT: ld 3, 8(2)
; DIS64-NEXT: (idx: [[#NFA+19]]) global_int_nonzero[TC]
; DIS64-NEXT: lwax 3, 13, 3
; DIS64-NEXT: blr
; DIS64: (idx: [[#NFA+7]]) .load_intern_int_zero:
; DIS64-NEXT: ld 3, 0(2)
; DIS64-NEXT: (idx: [[#NFA+17]]) intern_int_zero[TC]
; DIS64-NEXT: lwax 3, 13, 3
; DIS64-NEXT: blr

; DIS64: Disassembly of section .data:
; DIS64: (idx: [[#NFA+9]]) store_intern_int_zero[DS]:
; DIS64: R_POS        (idx: [[#NFA+3]]) .store_intern_int_zero
; DIS64: R_POS        (idx: [[#NFA+15]]) TOC[TC0]
; DIS64: (idx: [[#NFA+11]]) load_global_int_nonzero[DS]:
; DIS64: R_POS        (idx: [[#NFA+5]]) .load_global_int_nonzero
; DIS64: R_POS        (idx: [[#NFA+15]]) TOC[TC0]
; DIS64: (idx: [[#NFA+13]]) load_intern_int_zero[DS]:
; DIS64: R_POS        (idx: [[#NFA+7]]) .load_intern_int_zero
; DIS64: R_POS        (idx: [[#NFA+15]]) TOC[TC0]
; DIS64: (idx: [[#NFA+17]]) intern_int_zero[TC]:
; DIS64: R_TLS_IE     (idx: [[#NFA+25]]) intern_int_zero[UL]
; DIS64: (idx: [[#NFA+19]]) global_int_nonzero[TC]:
; DIS64: R_TLS_IE     (idx: [[#NFA+23]]) global_int_nonzero

; DIS64: Disassembly of section .tdata:
; DIS64: (idx: [[#NFA+23]]) global_int_nonzero:

; DIS64: Disassembly of section .tbss:
; DIS64: (idx: [[#NFA+25]]) intern_int_zero[UL]:

; REL32:      File:
; REL32-NEXT: Format: aixcoff-rs6000
; REL32-NEXT: Arch: powerpc
; REL32-NEXT: AddressSize: 32bit
; REL32-NEXT: Relocations [
; REL32:       Virtual Address: 0xA
; REL32-NEXT:       Symbol: intern_int_zero ([[#NFA+19]])
; REL32-NEXT:       IsSigned: No
; REL32-NEXT:       FixupBitValue: 0
; REL32-NEXT:       Length: 16
; REL32-NEXT:       Type: R_TOC (0x3)
; REL32-NEXT:     }
; REL32:       Virtual Address: 0x10
; REL32-NEXT:       Symbol: .__get_tpointer ([[#NFA+1]])
; REL32-NEXT:       IsSigned: No
; REL32-NEXT:       FixupBitValue: 0
; REL32-NEXT:       Length: 26
; REL32-NEXT:       Type: R_RBA (0x18)
; REL32-NEXT:     }
; REL32:       Virtual Address: 0x3A
; REL32-NEXT:       Symbol: global_int_nonzero ([[#NFA+21]])
; REL32-NEXT:       IsSigned: No
; REL32-NEXT:       FixupBitValue: 0
; REL32-NEXT:       Length: 16
; REL32-NEXT:       Type: R_TOC (0x3)
; REL32-NEXT:     }
; REL32:       Virtual Address: 0x40
; REL32-NEXT:       Symbol: .__get_tpointer ([[#NFA+1]])
; REL32-NEXT:       IsSigned: No
; REL32-NEXT:       FixupBitValue: 0
; REL32-NEXT:       Length: 26
; REL32-NEXT:       Type: R_RBA (0x18)
; REL32-NEXT:     }
; REL32:       Virtual Address: 0x6A
; REL32-NEXT:       Symbol: intern_int_zero ([[#NFA+19]])
; REL32-NEXT:       IsSigned: No
; REL32-NEXT:       FixupBitValue: 0
; REL32-NEXT:       Length: 16
; REL32-NEXT:       Type: R_TOC (0x3)
; REL32-NEXT:     }
; REL32:       Virtual Address: 0x70
; REL32-NEXT:       Symbol: .__get_tpointer ([[#NFA+1]])
; REL32-NEXT:       IsSigned: No
; REL32-NEXT:       FixupBitValue: 0
; REL32-NEXT:       Length: 26
; REL32-NEXT:       Type: R_RBA (0x18)
; REL32-NEXT:     }
; REL32:       Virtual Address: 0xAC
; REL32-NEXT:       Symbol: intern_int_zero ([[#NFA+27]])
; REL32-NEXT:       IsSigned: No
; REL32-NEXT:       FixupBitValue: 0
; REL32-NEXT:       Length: 32
; REL32-NEXT:       Type: R_TLS_IE (0x21)
; REL32-NEXT:     }
; REL32:       Virtual Address: 0xB0
; REL32-NEXT:       Symbol: global_int_nonzero ([[#NFA+25]])
; REL32-NEXT:       IsSigned: No
; REL32-NEXT:       FixupBitValue: 0
; REL32-NEXT:       Length: 32
; REL32-NEXT:       Type: R_TLS_IE (0x21)
; REL32-NEXT:     }

; SYM32:      File:
; SYM32-NEXT: Format: aixcoff-rs6000
; SYM32-NEXT: Arch: powerpc
; SYM32-NEXT: AddressSize: 32bit
; SYM32-NEXT: Symbols [
; SYM32:          Name: intern_int_zero
; SYM32-NEXT:     Value (RelocatableAddress): 0xAC
; SYM32-NEXT:     Section: .data
; SYM32-NEXT:     Type: 0x0
; SYM32-NEXT:     StorageClass: C_HIDEXT (0x6B)
; SYM32-NEXT:     NumberOfAuxEntries: 1
; SYM32-NEXT:     CSECT Auxiliary Entry {
; SYM32-NEXT:       Index: [[#INDX:]]
; SYM32-NEXT:       SectionLen: 4
; SYM32-NEXT:       ParameterHashIndex: 0x0
; SYM32-NEXT:       TypeChkSectNum: 0x0
; SYM32-NEXT:       SymbolAlignmentLog2: 2
; SYM32-NEXT:       SymbolType: XTY_SD (0x1)
; SYM32-NEXT:       StorageMappingClass: XMC_TC (0x3)
; SYM32-NEXT:       StabInfoIndex: 0x0
; SYM32-NEXT:       StabSectNum: 0x0
; SYM32-NEXT:     }
; SYM32-NEXT:   }
; SYM32:     Index: [[#INDX+1]]
; SYM32-NEXT:     Name: global_int_nonzero
; SYM32-NEXT:     Value (RelocatableAddress): 0xB0
; SYM32-NEXT:     Section: .data
; SYM32-NEXT:     Type: 0x0
; SYM32-NEXT:     StorageClass: C_HIDEXT (0x6B)
; SYM32-NEXT:     NumberOfAuxEntries: 1
; SYM32-NEXT:     CSECT Auxiliary Entry {
; SYM32-NEXT:       Index: [[#INDX+2]]
; SYM32-NEXT:       SectionLen: 4
; SYM32-NEXT:       ParameterHashIndex: 0x0
; SYM32-NEXT:       TypeChkSectNum: 0x0
; SYM32-NEXT:       SymbolAlignmentLog2: 2
; SYM32-NEXT:       SymbolType: XTY_SD (0x1)
; SYM32-NEXT:       StorageMappingClass: XMC_TC (0x3)
; SYM32-NEXT:       StabInfoIndex: 0x0
; SYM32-NEXT:       StabSectNum: 0x0
; SYM32-NEXT:     }
; SYM32-NEXT:   }
; SYM32:     Index: [[#INDX+5]]
; SYM32-NEXT:     Name: global_int_nonzero
; SYM32-NEXT:     Value (RelocatableAddress): 0x0
; SYM32-NEXT:     Section: .tdata
; SYM32-NEXT:     Type: 0x0
; SYM32-NEXT:     StorageClass: C_EXT (0x2)
; SYM32-NEXT:     NumberOfAuxEntries: 1
; SYM32-NEXT:     CSECT Auxiliary Entry {
; SYM32-NEXT:       Index: [[#INDX+6]]
; SYM32-NEXT:       ContainingCsectSymbolIndex: [[#INDX+3]]
; SYM32-NEXT:       ParameterHashIndex: 0x0
; SYM32-NEXT:       TypeChkSectNum: 0x0
; SYM32-NEXT:       SymbolAlignmentLog2: 0
; SYM32-NEXT:       SymbolType: XTY_LD (0x2)
; SYM32-NEXT:       StorageMappingClass: XMC_TL (0x14)
; SYM32-NEXT:       StabInfoIndex: 0x0
; SYM32-NEXT:       StabSectNum: 0x0
; SYM32-NEXT:     }
; SYM32-NEXT:   }
; SYM32:     Index: [[#INDX+7]]
; SYM32-NEXT:     Name: intern_int_zero
; SYM32-NEXT:     Value (RelocatableAddress): 0x4
; SYM32-NEXT:     Section: .tbss
; SYM32-NEXT:     Type: 0x0
; SYM32-NEXT:     StorageClass: C_HIDEXT (0x6B)
; SYM32-NEXT:     NumberOfAuxEntries: 1
; SYM32-NEXT:     CSECT Auxiliary Entry {
; SYM32-NEXT:       Index: [[#INDX+8]]
; SYM32-NEXT:       SectionLen: 4
; SYM32-NEXT:       ParameterHashIndex: 0x0
; SYM32-NEXT:       TypeChkSectNum: 0x0
; SYM32-NEXT:       SymbolAlignmentLog2: 2
; SYM32-NEXT:       SymbolType: XTY_CM (0x3)
; SYM32-NEXT:       StorageMappingClass: XMC_UL (0x15)
; SYM32-NEXT:       StabInfoIndex: 0x0
; SYM32-NEXT:       StabSectNum: 0x0
; SYM32-NEXT:     }
; SYM32-NEXT:   }

; DIS32: file format aixcoff-rs6000
; DIS32: Disassembly of section .text:
; DIS32: (idx: [[#NFA+5]]) .store_intern_int_zero:
; DIS32: R_TOC        (idx: [[#NFA+19]]) intern_int_zero[TC]
; DIS32: R_RBA        (idx: [[#NFA+1]]) .__get_tpointer[PR]
; DIS32: blr
; DIS32: (idx: [[#NFA+7]]) .load_global_int_nonzero:
; DIS32: R_TOC        (idx: [[#NFA+21]]) global_int_nonzero[TC]
; DIS32: R_RBA        (idx: [[#NFA+1]]) .__get_tpointer[PR]
; DIS32: blr
; DIS32: (idx: [[#NFA+9]]) .load_intern_int_zero:
; DIS32: R_TOC        (idx: [[#NFA+19]]) intern_int_zero[TC]
; DIS32: R_RBA        (idx: [[#NFA+1]]) .__get_tpointer[PR]
; DIS32: blr

; DIS32: Disassembly of section .data:
; DIS32: (idx: [[#NFA+11]]) store_intern_int_zero[DS]:
; DIS32: R_POS        (idx: [[#NFA+5]]) .store_intern_int_zero
; DIS32: R_POS        (idx: [[#NFA+17]]) TOC[TC0]
; DIS32: (idx: [[#NFA+13]]) load_global_int_nonzero[DS]:
; DIS32: R_POS        (idx: [[#NFA+7]]) .load_global_int_nonzero
; DIS32: R_POS        (idx: [[#NFA+17]]) TOC[TC0]
; DIS32: (idx: [[#NFA+15]]) load_intern_int_zero[DS]:
; DIS32: R_POS        (idx: [[#NFA+9]]) .load_intern_int_zero
; DIS32: R_POS        (idx: [[#NFA+17]]) TOC[TC0]
; DIS32: (idx: [[#NFA+19]]) intern_int_zero[TC]:
; DIS32: R_TLS_IE     (idx: [[#NFA+27]]) intern_int_zero[UL]
; DIS32: (idx: [[#NFA+21]]) global_int_nonzero[TC]:
; DIS32: R_TLS_IE     (idx: [[#NFA+25]]) global_int_nonzero

; DIS32: Disassembly of section .tdata:
; DIS32: (idx: [[#NFA+25]]) global_int_nonzero:

; DIS32: Disassembly of section .tbss:
; DIS32: (idx: [[#NFA+27]]) intern_int_zero[UL]: