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