| # 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 |