| 
 | 1 | +# REQUIRES: loongarch  | 
 | 2 | +# RUN: rm -rf %t && split-file %s %t && cd %t  | 
 | 3 | +# RUN: llvm-mc -filetype=obj -triple=loongarch64 a.s -o a.64.o  | 
 | 4 | +# RUN: llvm-mc -filetype=obj -triple=loongarch64 c.s -o c.64.o  | 
 | 5 | +# RUN: ld.lld -shared -soname=c.64.so c.64.o -o c.64.so  | 
 | 6 | +# RUN: llvm-mc -filetype=obj -triple=loongarch32 --defsym ELF32=1 a.s -o a.32.o  | 
 | 7 | +# RUN: llvm-mc -filetype=obj -triple=loongarch32 --defsym ELF32=1 c.s -o c.32.o  | 
 | 8 | +# RUN: ld.lld -shared -soname=c.32.so c.32.o -o c.32.so  | 
 | 9 | + | 
 | 10 | +# RUN: ld.lld -shared -z now a.64.o c.64.o -o a.64.so  | 
 | 11 | +# RUN: llvm-readobj -r -x .got a.64.so | FileCheck --check-prefix=GD64-RELA %s  | 
 | 12 | +# RUN: llvm-objdump --no-show-raw-insn -h -d a.64.so | FileCheck %s --check-prefix=GD64  | 
 | 13 | + | 
 | 14 | +# RUN: ld.lld -shared -z now a.64.o c.64.o -o rel.64.so -z rel  | 
 | 15 | +# RUN: llvm-readobj -r -x .got rel.64.so | FileCheck --check-prefix=GD64-REL %s  | 
 | 16 | + | 
 | 17 | +## FIXME: The transition frome TLSDESC to IE/LE has not yet been implemented.  | 
 | 18 | +## Keep the dynamic relocations and hand them over to dynamic linker.  | 
 | 19 | + | 
 | 20 | +# RUN: ld.lld -e 0 -z now a.64.o c.64.o -o a.64.le  | 
 | 21 | +# RUN: llvm-readobj -r -x .got a.64.le | FileCheck --check-prefix=LE64-RELA %s  | 
 | 22 | + | 
 | 23 | +# RUN: ld.lld -e 0 -z now a.64.o c.64.so -o a.64.ie  | 
 | 24 | +# RUN: llvm-readobj -r -x .got a.64.ie | FileCheck --check-prefix=IE64-RELA %s  | 
 | 25 | + | 
 | 26 | +## 32-bit code is mostly the same. We only test a few variants.  | 
 | 27 | + | 
 | 28 | +# RUN: ld.lld -shared -z now a.32.o c.32.o -o rel.32.so -z rel  | 
 | 29 | +# RUN: llvm-readobj -r -x .got rel.32.so | FileCheck --check-prefix=GD32-REL %s  | 
 | 30 | + | 
 | 31 | +# GD64-RELA:      .rela.dyn {  | 
 | 32 | +# GD64-RELA-NEXT:   0x203F0 R_LARCH_TLS_DESC64 - 0x7FF  | 
 | 33 | +# GD64-RELA-NEXT:   0x203D0 R_LARCH_TLS_DESC64 a 0x0  | 
 | 34 | +# GD64-RELA-NEXT:   0x203E0 R_LARCH_TLS_DESC64 c 0x0  | 
 | 35 | +# GD64-RELA-NEXT: }  | 
 | 36 | +# GD64-RELA:      Hex dump of section '.got':  | 
 | 37 | +# GD64-RELA-NEXT: 0x000203d0 00000000 00000000 00000000 00000000 .  | 
 | 38 | +# GD64-RELA-NEXT: 0x000203e0 00000000 00000000 00000000 00000000 .  | 
 | 39 | +# GD64-RELA-NEXT: 0x000203f0 00000000 00000000 00000000 00000000 .  | 
 | 40 | + | 
 | 41 | +# GD64-REL:      .rel.dyn {  | 
 | 42 | +# GD64-REL-NEXT:   0x203D8 R_LARCH_TLS_DESC64 -  | 
 | 43 | +# GD64-REL-NEXT:   0x203B8 R_LARCH_TLS_DESC64 a  | 
 | 44 | +# GD64-REL-NEXT:   0x203C8 R_LARCH_TLS_DESC64 c  | 
 | 45 | +# GD64-REL-NEXT: }  | 
 | 46 | +# GD64-REL:      Hex dump of section '.got':  | 
 | 47 | +# GD64-REL-NEXT: 0x000203b8 00000000 00000000 00000000 00000000 .  | 
 | 48 | +# GD64-REL-NEXT: 0x000203c8 00000000 00000000 00000000 00000000 .  | 
 | 49 | +# GD64-REL-NEXT: 0x000203d8 00000000 00000000 ff070000 00000000 .  | 
 | 50 | + | 
 | 51 | +# GD64:      .got     00000030 00000000000203d0  | 
 | 52 | + | 
 | 53 | +## &.got[a]-. = 0x203d0 - 0x102e0 = 16444<<2  | 
 | 54 | +# GD64:        102e0: pcaddi $a0, 16444  | 
 | 55 | +# GD64-NEXT:          ld.d $ra, $a0, 0  | 
 | 56 | +# GD64-NEXT:          jirl $ra, $ra, 0  | 
 | 57 | +# GD64-NEXT:          add.d $a1, $a0, $tp  | 
 | 58 | + | 
 | 59 | +## &.got[b]-. = 0x203d0+32 - 0x102f0 = 16448<<2  | 
 | 60 | +# GD64:        102f0: pcaddi $a0, 16448  | 
 | 61 | +# GD64-NEXT:          ld.d $ra, $a0, 0  | 
 | 62 | +# GD64-NEXT:          jirl $ra, $ra, 0  | 
 | 63 | +# GD64-NEXT:          add.d $a2, $a0, $tp  | 
 | 64 | + | 
 | 65 | +## &.got[c]-. = 0x203d0+16 - 0x10300 = 16440<<2  | 
 | 66 | +# GD64:        10300: pcaddi $a0, 16440  | 
 | 67 | +# GD64-NEXT:          ld.d $ra, $a0, 0  | 
 | 68 | +# GD64-NEXT:          jirl $ra, $ra, 0  | 
 | 69 | +# GD64-NEXT:          add.d $a3, $a0, $tp  | 
 | 70 | + | 
 | 71 | +# LE64-RELA:      .rela.dyn {  | 
 | 72 | +# LE64-RELA-NEXT:   0x30240 R_LARCH_TLS_DESC64 - 0x8  | 
 | 73 | +# LE64-RELA-NEXT:   0x30250 R_LARCH_TLS_DESC64 - 0x800  | 
 | 74 | +# LE64-RELA-NEXT:   0x30260 R_LARCH_TLS_DESC64 - 0x7FF  | 
 | 75 | +# LE64-RELA-NEXT: }  | 
 | 76 | +# LE64-RELA:      Hex dump of section '.got':  | 
 | 77 | +# LE64-RELA-NEXT: 0x00030240 00000000 00000000 00000000 00000000 .  | 
 | 78 | +# LE64-RELA-NEXT: 0x00030250 00000000 00000000 00000000 00000000 .  | 
 | 79 | +# LE64-RELA-NEXT: 0x00030260 00000000 00000000 00000000 00000000 .  | 
 | 80 | + | 
 | 81 | +# IE64-RELA:      .rela.dyn {  | 
 | 82 | +# IE64-RELA-NEXT:   0x303C8 R_LARCH_TLS_DESC64 - 0x8  | 
 | 83 | +# IE64-RELA-NEXT:   0x303E8 R_LARCH_TLS_DESC64 - 0x7FF  | 
 | 84 | +# IE64-RELA-NEXT:   0x303D8 R_LARCH_TLS_DESC64 c 0x0  | 
 | 85 | +# IE64-RELA-NEXT: }  | 
 | 86 | +# IE64-RELA:      Hex dump of section '.got':  | 
 | 87 | +# IE64-RELA-NEXT: 0x000303c8 00000000 00000000 00000000 00000000 .  | 
 | 88 | +# IE64-RELA-NEXT: 0x000303d8 00000000 00000000 00000000 00000000 .  | 
 | 89 | +# IE64-RELA-NEXT: 0x000303e8 00000000 00000000 00000000 00000000 .  | 
 | 90 | + | 
 | 91 | +# GD32-REL:      .rel.dyn {  | 
 | 92 | +# GD32-REL-NEXT:    0x20264 R_LARCH_TLS_DESC32 -  | 
 | 93 | +# GD32-REL-NEXT:    0x20254 R_LARCH_TLS_DESC32 a  | 
 | 94 | +# GD32-REL-NEXT:    0x2025C R_LARCH_TLS_DESC32 c  | 
 | 95 | +# GD32-REL-NEXT: }  | 
 | 96 | +# GD32-REL:      Hex dump of section '.got':  | 
 | 97 | +# GD32-REL-NEXT: 0x00020254 00000000 00000000 00000000 00000000 .  | 
 | 98 | +# GD32-REL-NEXT: 0x00020264 00000000 ff070000                   .  | 
 | 99 | + | 
 | 100 | +#--- a.s  | 
 | 101 | +.macro add dst, src1, src2  | 
 | 102 | +.ifdef ELF32  | 
 | 103 | +add.w \dst, \src1, \src2  | 
 | 104 | +.else  | 
 | 105 | +add.d \dst, \src1, \src2  | 
 | 106 | +.endif  | 
 | 107 | +.endm  | 
 | 108 | +.macro load dst, src1, src2  | 
 | 109 | +.ifdef ELF32  | 
 | 110 | +ld.w \dst, \src1, \src2  | 
 | 111 | +.else  | 
 | 112 | +ld.d \dst, \src1, \src2  | 
 | 113 | +.endif  | 
 | 114 | +.endm  | 
 | 115 | + | 
 | 116 | +pcaddi $a0, %desc_pcrel_20(a)  | 
 | 117 | +load $ra, $a0, %desc_ld(a)  | 
 | 118 | +jirl $ra, $ra, %desc_call(a)  | 
 | 119 | +add $a1, $a0, $tp  | 
 | 120 | + | 
 | 121 | +pcaddi $a0, %desc_pcrel_20(b)  | 
 | 122 | +load $ra, $a0, %desc_ld(b)  | 
 | 123 | +jirl $ra, $ra, %desc_call(b)  | 
 | 124 | +add $a2, $a0, $tp  | 
 | 125 | + | 
 | 126 | +pcaddi $a0, %desc_pcrel_20(c)  | 
 | 127 | +load $ra, $a0, %desc_ld(c)  | 
 | 128 | +jirl $ra, $ra, %desc_call(c)  | 
 | 129 | +add $a3, $a0, $tp  | 
 | 130 | + | 
 | 131 | +.section .tbss,"awT",@nobits  | 
 | 132 | +.globl a  | 
 | 133 | +.zero 8  | 
 | 134 | +a:  | 
 | 135 | +.zero 2039  ## Place b at 0x7ff  | 
 | 136 | +b:  | 
 | 137 | +.zero 1  | 
 | 138 | + | 
 | 139 | +#--- c.s  | 
 | 140 | +.section .tbss,"awT",@nobits  | 
 | 141 | +.globl c  | 
 | 142 | +c: .zero 4  | 
0 commit comments