# REQUIRES: ppc # RUN: llvm-mc -filetype=obj -triple=powerpc64le-unknown-linux %s -o %t.o # RUN: llvm-mc -filetype=obj -triple=powerpc64le-unknown-linux %p/Inputs/ppc64-tls.s -o %t2.o # RUN: ld.lld -shared %t2.o -o %t3.so # RUN: ld.lld %t.o %t3.so -o %t # RUN: llvm-objdump --section-headers %t | FileCheck --check-prefix=CheckGot %s # RUN: llvm-objdump -D %t | FileCheck --check-prefix=Dis %s # RUN: llvm-readelf -relocations --wide %t | FileCheck --check-prefix=OutputRelocs %s # RUN: llvm-mc -filetype=obj -triple=powerpc64-unknown-linux %s -o %t.o # RUN: llvm-mc -filetype=obj -triple=powerpc64-unknown-linux %p/Inputs/ppc64-tls.s -o %t2.o # RUN: ld.lld -shared %t2.o -o %t3.so # RUN: ld.lld %t.o %t3.so -o %t # RUN: llvm-objdump --section-headers %t | FileCheck --check-prefix=CheckGot %s # RUN: llvm-objdump -D %t | FileCheck --check-prefix=Dis %s # RUN: llvm-readelf -relocations --wide %t | FileCheck --check-prefix=OutputRelocs %s .text .abiversion 2 .globl _start .p2align 4 .type _start,@function _start: .Lfunc_gep0: addis 2, 12, .TOC.-.Lfunc_gep0@ha addi 2, 2, .TOC.-.Lfunc_gep0@l .Lfunc_lep0: .localentry _start, .Lfunc_lep0-.Lfunc_gep0 mflr 0 std 0, 16(1) stdu 1, -32(1) addis 3, 2, a@got@tlsgd@ha addi 3, 3, a@got@tlsgd@l bl __tls_get_addr(a@tlsgd) nop lwa 3, 0(3) addi 1, 1, 32 ld 0, 16(1) mtlr 0 blr .globl other_reg .p2align 4 .type other_reg,@function other_reg: .Lfunc_gep1: addis 2, 12, .TOC.-.Lfunc_gep1@ha addi 2, 2, .TOC.-.Lfunc_gep1@l .Lfunc_lep1: .localentry other_reg, .Lfunc_lep1-.Lfunc_gep1 mflr 0 std 0, 16(1) stdu 1, -32(1) addis 5, 2, a@got@tlsgd@ha addi 3, 5, a@got@tlsgd@l bl __tls_get_addr(a@tlsgd) nop lwa 4, 0(3) addis 30, 2, b@got@tlsgd@ha addi 3, 30, b@got@tlsgd@l bl __tls_get_addr(b@tlsgd) nop lwa 3, 0(3) add 3, 4, 3 addi 1, 1, 32 ld 0, 16(1) mtlr 0 blr .globl __tls_get_addr .type __tls_get_addr,@function __tls_get_addr: # CheckGot: .got 00000018 00000000100200c0 DATA # .got is at 0x100200c0 so the toc-base is 100280c0. # `a` is at .got[1], we expect the offsets to be: # Ha(a) = ((0x100200c8 - 0x100280c0) + 0x8000) >> 16 = 0 # Lo(a) = (0x100200c8 - 0x100280c0) = -32760 # Dis-LABEL: _start # Dis: addis 3, 2, 0 # Dis-NEXT: ld 3, -32760(3) # Dis-NEXT: nop # Dis-NEXT: add 3, 3, 13 # Dis-LABEL: other_reg # Dis: addis 5, 2, 0 # Dis-NEXT: ld 3, -32760(5) # Dis-NEXT: nop # Dis-NEXT: add 3, 3, 13 # Dis: addis 30, 2, 0 # Dis: ld 3, -32752(30) # Dis-NEXT: nop # Dis-NEXT: add 3, 3, 13 # Verify that the only dynamic relocations we emit are TPREL ones rather then # the DTPMOD64/DTPREL64 pair for general-dynamic. # OutputRelocs: Relocation section '.rela.dyn' at offset 0x{{[0-9a-f]+}} contains 2 entries: # OutputRelocs-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend # OutputRelocs-NEXT: {{[0-9a-f]+}} {{[0-9a-f]+}} R_PPC64_TPREL64 {{[0-9a-f]+}} a + 0 # OutputRelocs-NEXT: {{[0-9a-f]+}} {{[0-9a-f]+}} R_PPC64_TPREL64 {{[0-9a-f]+}} b + 0