164 lines · plain
1# REQUIRES: loongarch2# RUN: rm -rf %t && split-file %s %t && cd %t3# RUN: llvm-mc -filetype=obj -triple=loongarch64 a.s -o a.64.o4# RUN: llvm-mc -filetype=obj -triple=loongarch64 c.s -o c.64.o5# RUN: ld.lld -shared -soname=c.64.so c.64.o -o c.64.so6# RUN: llvm-mc -filetype=obj -triple=loongarch32 --defsym ELF32=1 a.s -o a.32.o7# RUN: llvm-mc -filetype=obj -triple=loongarch32 --defsym ELF32=1 c.s -o c.32.o8# RUN: ld.lld -shared -soname=c.32.so c.32.o -o c.32.so9 10# RUN: ld.lld -shared -z now a.64.o c.64.o -o a.64.so11# RUN: llvm-readobj -r -x .got a.64.so | FileCheck --check-prefix=GD64-RELA %s12# RUN: llvm-objdump --no-show-raw-insn -h -d a.64.so | FileCheck %s --check-prefix=GD6413 14# RUN: ld.lld -shared -z now a.64.o c.64.o -o rel.64.so -z rel15# RUN: llvm-readobj -r -x .got rel.64.so | FileCheck --check-prefix=GD64-REL %s16 17## Transition from TLSDESC to IE/LE.18# RUN: ld.lld -e 0 -z now a.64.o c.64.o -o a.64.le19# RUN: llvm-readobj -r -x .got a.64.le 2>&1 | FileCheck --check-prefix=LE64-RELA %s20# RUN: llvm-objdump --no-show-raw-insn -d a.64.le | FileCheck --check-prefix=LE64 %s21 22# RUN: ld.lld -e 0 -z now a.64.o c.64.so -o a.64.ie23# RUN: llvm-readobj -r -x .got a.64.ie | FileCheck --check-prefix=IE64-RELA %s24# RUN: llvm-objdump --no-show-raw-insn -d a.64.ie | FileCheck --check-prefix=IE64 %s25 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 rel29# RUN: llvm-readobj -r -x .got rel.32.so | FileCheck --check-prefix=GD32-REL %s30 31# GD64-RELA: .rela.dyn {32# GD64-RELA-NEXT: 0x203F0 R_LARCH_TLS_DESC64 - 0x7FF33# GD64-RELA-NEXT: 0x203D0 R_LARCH_TLS_DESC64 a 0x034# GD64-RELA-NEXT: 0x203E0 R_LARCH_TLS_DESC64 c 0x035# 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 a44# GD64-REL-NEXT: 0x203C8 R_LARCH_TLS_DESC64 c45# 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 00000000000203d052 53## &.got[a]-. = 0x203d0 - 0x102e0 = 16444<<254# GD64: 102e0: pcaddi $a0, 1644455# GD64-NEXT: ld.d $ra, $a0, 056# GD64-NEXT: jirl $ra, $ra, 057# GD64-NEXT: add.d $a1, $a0, $tp58 59## &.got[b]-. = 0x203d0+32 - 0x102f0 = 16448<<260# GD64: 102f0: pcaddi $a0, 1644861# GD64-NEXT: ld.d $ra, $a0, 062# GD64-NEXT: jirl $ra, $ra, 063# GD64-NEXT: add.d $a2, $a0, $tp64 65## &.got[c]-. = 0x203d0+16 - 0x10300 = 16440<<266# GD64: 10300: pcaddi $a0, 1644067# GD64-NEXT: ld.d $ra, $a0, 068# GD64-NEXT: jirl $ra, $ra, 069# GD64-NEXT: add.d $a3, $a0, $tp70 71# LE64-RELA: could not find section '.got'72 73# LE64-LABEL: <.text>:74## st_value(a) = 875# LE64-NEXT: nop76# LE64-NEXT: nop77# LE64-NEXT: ori $a0, $zero, 878# LE64-NEXT: add.d $a1, $a0, $tp79## st_value(b) = 204780# LE64-NEXT: nop81# LE64-NEXT: nop82# LE64-NEXT: ori $a0, $zero, 204783# LE64-NEXT: add.d $a2, $a0, $tp84## st_value(c) = 204885# LE64-NEXT: nop86# LE64-NEXT: nop87# LE64-NEXT: ori $a0, $zero, 204888# LE64-NEXT: add.d $a3, $a0, $tp89 90# IE64-RELA: .rela.dyn {91# IE64-RELA-NEXT: 0x30398 R_LARCH_TLS_TPREL64 c 0x092# IE64-RELA-NEXT: }93# IE64-RELA: Hex dump of section '.got':94# IE64-RELA-NEXT: 0x00030398 00000000 00000000 .95 96## a and b are optimized to use LE. c is optimized to IE.97# IE64-LABEL: <.text>:98# IE64-NEXT: nop99# IE64-NEXT: nop100# IE64-NEXT: ori $a0, $zero, 8101# IE64-NEXT: add.d $a1, $a0, $tp102# IE64-NEXT: nop103# IE64-NEXT: nop104# IE64-NEXT: ori $a0, $zero, 2047105# IE64-NEXT: add.d $a2, $a0, $tp106## &.got[c]-. = 0x30398 - 0x202ac: 0x10 pages, page offset 0x398107# IE64-NEXT: nop108# IE64-NEXT: 202ac: pcalau12i $a0, 16109# IE64-NEXT: ld.d $a0, $a0, 920110# IE64-NEXT: add.d $a3, $a0, $tp111 112# GD32-REL: .rel.dyn {113# GD32-REL-NEXT: 0x20264 R_LARCH_TLS_DESC32 -114# GD32-REL-NEXT: 0x20254 R_LARCH_TLS_DESC32 a115# GD32-REL-NEXT: 0x2025C R_LARCH_TLS_DESC32 c116# GD32-REL-NEXT: }117# GD32-REL: Hex dump of section '.got':118# GD32-REL-NEXT: 0x00020254 00000000 00000000 00000000 00000000 .119# GD32-REL-NEXT: 0x00020264 00000000 ff070000 .120 121#--- a.s122.macro add dst, src1, src2123.ifdef ELF32124add.w \dst, \src1, \src2125.else126add.d \dst, \src1, \src2127.endif128.endm129.macro load dst, src1, src2130.ifdef ELF32131ld.w \dst, \src1, \src2132.else133ld.d \dst, \src1, \src2134.endif135.endm136 137pcaddi $a0, %desc_pcrel_20(a)138load $ra, $a0, %desc_ld(a)139jirl $ra, $ra, %desc_call(a)140add $a1, $a0, $tp141 142pcaddi $a0, %desc_pcrel_20(b)143load $ra, $a0, %desc_ld(b)144jirl $ra, $ra, %desc_call(b)145add $a2, $a0, $tp146 147pcaddi $a0, %desc_pcrel_20(c)148load $ra, $a0, %desc_ld(c)149jirl $ra, $ra, %desc_call(c)150add $a3, $a0, $tp151 152.section .tbss,"awT",@nobits153.globl a154.zero 8155a:156.zero 2039 ## Place b at 0x7ff157b:158.zero 1159 160#--- c.s161.section .tbss,"awT",@nobits162.globl c163c: .zero 4164