1# REQUIRES: ppc 2# RUN: split-file %s %t 3# RUN: llvm-mc -filetype=obj -triple=powerpc64le %t/asm -o %t.o 4# RUN: ld.lld -T %t/lds --shared -soname=t-ld %t.o -o %t-ld.so 5# RUN: ld.lld -T %t/lds %t.o -o %t-ldtole 6 7# RUN: llvm-readelf -r %t-ld.so | FileCheck %s --check-prefix=LD-RELOC 8# RUN: llvm-readelf -s %t-ld.so | FileCheck %s --check-prefix=LD-SYM 9# RUN: llvm-readelf -x .got %t-ld.so | FileCheck %s --check-prefix=LD-GOT 10# RUN: llvm-objdump -d --no-show-raw-insn --mcpu=pwr10 %t-ld.so | FileCheck %s --check-prefix=LD 11 12# RUN: llvm-readelf -r %t-ldtole | FileCheck %s --check-prefix=LDTOLE-RELOC 13# RUN: llvm-readelf -s %t-ldtole | FileCheck %s --check-prefix=LDTOLE-SYM 14# RUN: llvm-readelf -x .got %t-ldtole 2>&1 | FileCheck %s --check-prefix=LDTOLE-GOT 15# RUN: llvm-objdump -d --no-show-raw-insn --mcpu=pwr10 %t-ldtole | FileCheck %s --check-prefix=LDTOLE 16 17## This test checks the Local Dynamic PC Relative TLS implementation for lld. 18## LD - Local Dynamic with no relaxation possible 19## LDTOLE - Local Dynamic relaxed to Local Exec 20 21# LD-RELOC: Relocation section '.rela.dyn' at offset 0x10080 contains 1 entries: 22# LD-RELOC: 0000000001004168 0000000000000044 R_PPC64_DTPMOD64 0 23 24# LD-SYM: Symbol table '.symtab' contains 11 entries: 25# LD-SYM: 5: 0000000000000000 0 TLS LOCAL DEFAULT 13 x 26# LD-SYM-NEXT: 6: 0000000000000004 0 TLS LOCAL DEFAULT 13 y 27 28# LD-GOT: section '.got': 29# LD-GOT-NEXT: 0x01004160 60c10001 00000000 00000000 00000000 30# LD-GOT-NEXT: 0x01004170 00000000 00000000 31 32# LDTOLE-RELOC: There are no relocations in this file. 33 34# LDTOLE-SYM: Symbol table '.symtab' contains 9 entries: 35# LDTOLE-SYM: 5: 0000000000000000 0 TLS LOCAL DEFAULT 6 x 36# LDTOLE-SYM-NEXT: 6: 0000000000000004 0 TLS LOCAL DEFAULT 6 y 37 38# LDTOLE-GOT: section '.got': 39# LDTOLE-GOT-NEXT: 0x01004020 20c00001 00000000 40 41//--- lds 42SECTIONS { 43 .text_addr 0x1001000 : { *(.text_addr) } 44 .text_val 0x1002000 : { *(.text_val) } 45 .text_twoval 0x1003000 : { *(.text_twoval) } 46 .text_incrval 0x1004000 : { *(.text_incrval) } 47} 48 49//--- asm 50# LD-LABEL: <LDAddr>: 51# LD: paddi 3, 0, 12644, 1 52# LD-NEXT: bl 0x1001020 53# LD-NEXT: paddi 3, 3, -32768, 0 54# LD-NEXT: blr 55# LDTOLE-LABEL: <LDAddr>: 56# LDTOLE: paddi 3, 13, 4096, 0 57# LDTOLE-NEXT: nop 58# LDTOLE-NEXT: paddi 3, 3, -32768, 0 59# LDTOLE-NEXT: blr 60.section .text_addr, "ax", %progbits 61LDAddr: 62 ## TODO: Adding a reference to .TOC. since LLD doesn't gracefully handle the 63 ## case where we define a .got section but have no references to the toc base 64 ## yet. 65 addis 2, 12, .TOC.-LDAddr@ha 66 paddi 3, 0, x@got@tlsld@pcrel, 1 67 bl __tls_get_addr@notoc(x@tlsld) 68 paddi 3, 3, x@dtprel, 0 69 blr 70 71# LD-LABEL: <LDVal>: 72# LD: paddi 3, 0, 8552, 1 73# LD-NEXT: bl 0x1001020 74# LD-NEXT: paddi 3, 3, -32768, 0 75# LD-NEXT: lwz 3, 0(3) 76# LD-NEXT: blr 77# LDTOLE-LABEL: <LDVal>: 78# LDTOLE: paddi 3, 13, 4096, 0 79# LDTOLE-NEXT: nop 80# LDTOLE-NEXT: paddi 3, 3, -32768, 0 81# LDTOLE-NEXT: lwz 3, 0(3) 82# LDTOLE-NEXT: blr 83.section .text_val, "ax", %progbits 84LDVal: 85 paddi 3, 0, x@got@tlsld@pcrel, 1 86 bl __tls_get_addr@notoc(x@tlsld) 87 paddi 3, 3, x@dtprel, 0 88 lwz 3, 0(3) 89 blr 90 91# LD-LABEL: <LDTwoVal>: 92# LD: paddi 3, 0, 4456, 1 93# LD-NEXT: bl 0x1001020 94# LD-NEXT: paddi 3, 3, -32768, 0 95# LD-NEXT: lwz 2, 0(3) 96# LD-NEXT: paddi 3, 3, -32764, 0 97# LD-NEXT: lwz 3, 0(3) 98# LD-NEXT: blr 99# LDTOLE-LABEL: <LDTwoVal>: 100# LDTOLE: paddi 3, 13, 4096, 0 101# LDTOLE-NEXT: nop 102# LDTOLE-NEXT: paddi 3, 3, -32768, 0 103# LDTOLE-NEXT: lwz 2, 0(3) 104# LDTOLE-NEXT: paddi 3, 3, -32764, 0 105# LDTOLE-NEXT: lwz 3, 0(3) 106# LDTOLE-NEXT: blr 107.section .text_twoval, "ax", %progbits 108LDTwoVal: 109 paddi 3, 0, x@got@tlsld@pcrel, 1 110 bl __tls_get_addr@notoc(x@tlsld) 111 paddi 3, 3, x@dtprel, 0 112 lwz 2, 0(3) 113 paddi 3, 3, y@dtprel, 0 114 lwz 3, 0(3) 115 blr 116 117# LD-LABEL: <LDIncrementVal>: 118# LD: paddi 3, 0, 360, 1 119# LD-NEXT: bl 0x1001020 120# LD-NEXT: paddi 9, 3, -32764, 0 121# LD-NEXT: lwz 4, 0(9) 122# LD-NEXT: stw 5, 0(9) 123# LD-NEXT: blr 124# LDTOLE-LABEL: <LDIncrementVal>: 125# LDTOLE: paddi 3, 13, 4096, 0 126# LDTOLE-NEXT: nop 127# LDTOLE-NEXT: paddi 9, 3, -32764, 0 128# LDTOLE-NEXT: lwz 4, 0(9) 129# LDTOLE-NEXT: stw 5, 0(9) 130# LDTOLE-NEXT: blr 131.section .text_incrval, "ax", %progbits 132LDIncrementVal: 133 paddi 3, 0, y@got@tlsld@pcrel, 1 134 bl __tls_get_addr@notoc(y@tlsld) 135 paddi 9, 3, y@dtprel, 0 136 lwz 4, 0(9) 137 stw 5, 0(9) 138 blr 139 140.section .tbss,"awT",@nobits 141x: 142 .long 0 143y: 144 .long 0 145