CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
294 lines
11 KiB
ArmAsm
294 lines
11 KiB
ArmAsm
# REQUIRES: loongarch
|
|
# RUN: rm -rf %t && split-file %s %t && cd %t
|
|
# RUN: llvm-mc -filetype=obj -triple=loongarch64 -mattr=+relax a.s -o a.64.o
|
|
# RUN: llvm-mc -filetype=obj -triple=loongarch64 -mattr=+relax c.s -o c.64.o
|
|
# RUN: ld.lld --relax -shared -soname=c.64.so c.64.o -o c.64.so
|
|
|
|
## Test the TLSDESC relaxation.
|
|
# RUN: ld.lld --relax -shared -z now a.64.o c.64.o -o a.64.so
|
|
# RUN: llvm-readobj -r -x .got a.64.so | FileCheck --check-prefix=GD64-RELA %s
|
|
# RUN: llvm-objdump --no-show-raw-insn -dr -h a.64.so | FileCheck %s --check-prefix=GD64
|
|
|
|
## Transition from TLSDESC to IE/LE. Also check --emit-relocs.
|
|
# RUN: ld.lld -e 0 -z now --emit-relocs a.64.o c.64.o -o a.64.le
|
|
# RUN: llvm-readobj -r -x .got a.64.le 2>&1 | FileCheck --check-prefix=LE64-RELA %s
|
|
# RUN: llvm-objdump --no-show-raw-insn -dr -h a.64.le | FileCheck %s --check-prefix=LE64
|
|
|
|
# RUN: ld.lld --no-relax -e 0 -z now a.64.o c.64.o -o a.64.le.norelax
|
|
# RUN: llvm-objdump --no-show-raw-insn -d -h a.64.le.norelax | FileCheck %s --check-prefix=LE64-NORELAX
|
|
|
|
# RUN: ld.lld --relax -e 0 -z now --emit-relocs a.64.o c.64.so -o a.64.ie
|
|
# RUN: llvm-readobj -r -x .got a.64.ie | FileCheck --check-prefix=IE64-RELA %s
|
|
# RUN: llvm-objdump --no-show-raw-insn -dr -h a.64.ie | FileCheck %s --check-prefix=IE64
|
|
|
|
# RUN: ld.lld --no-relax -e 0 -z now a.64.o c.64.so -o a.64.ie.norelax
|
|
# RUN: llvm-objdump --no-show-raw-insn -d -h a.64.ie.norelax | FileCheck %s --check-prefix=IE64-NORELAX
|
|
|
|
# GD64-RELA: .rela.dyn {
|
|
# GD64-RELA-NEXT: 0x20460 R_LARCH_TLS_DESC64 - 0x7FF
|
|
# GD64-RELA-NEXT: 0x20430 R_LARCH_TLS_DESC64 a 0x0
|
|
# GD64-RELA-NEXT: 0x20440 R_LARCH_TLS_DESC64 c 0x0
|
|
# GD64-RELA-NEXT: 0x20450 R_LARCH_TLS_DESC64 d 0x0
|
|
# GD64-RELA-NEXT: }
|
|
# GD64-RELA: Hex dump of section '.got':
|
|
# GD64-RELA-NEXT: 0x00020430 00000000 00000000 00000000 00000000 .
|
|
# GD64-RELA-NEXT: 0x00020440 00000000 00000000 00000000 00000000 .
|
|
# GD64-RELA-NEXT: 0x00020450 00000000 00000000 00000000 00000000 .
|
|
# GD64-RELA-NEXT: 0x00020460 00000000 00000000 00000000 00000000 .
|
|
|
|
# GD64: .got 00000040 0000000000020430
|
|
|
|
## &.got[a]-. = 0x20430 - 0x10318 = 16454<<2
|
|
# GD64: 10318: pcaddi $a0, 16454
|
|
# GD64-NEXT: ld.d $ra, $a0, 0
|
|
# GD64-NEXT: jirl $ra, $ra, 0
|
|
# GD64-NEXT: add.d $a1, $a0, $tp
|
|
|
|
## &.got[b]-. = 0x20430+48 - 0x10328: 0x10 pages, page offset 0x460
|
|
## R_LARCH_RELAX does not appear in pairs. No relaxation.
|
|
# GD64: 10328: pcalau12i $a0, 16
|
|
# GD64-NEXT: addi.d $a0, $a0, 1120
|
|
# GD64-NEXT: ld.d $ra, $a0, 0
|
|
# GD64-NEXT: jirl $ra, $ra, 0
|
|
# GD64-NEXT: add.d $a2, $a0, $tp
|
|
|
|
## &.got[c]-. = 0x20430+16 - 0x1033c: 0x10 pages, page offset 0x440
|
|
## Without R_LARCH_RELAX relocation. No relaxation.
|
|
# GD64: 1033c: pcalau12i $a0, 16
|
|
# GD64-NEXT: addi.d $t0, $zero, 0
|
|
# GD64-NEXT: addi.d $a0, $a0, 1088
|
|
# GD64-NEXT: addi.d $t0, $t0, 1
|
|
# GD64-NEXT: ld.d $ra, $a0, 0
|
|
# GD64-NEXT: addi.d $t0, $t0, 1
|
|
# GD64-NEXT: jirl $ra, $ra, 0
|
|
# GD64-NEXT: add.d $a3, $a0, $tp
|
|
|
|
## &.got[d]-. = 0x20430+32 - 0x1035c = 16445<<2
|
|
# GD64: 1035c: pcaddi $a0, 16445
|
|
# GD64-NEXT: ld.d $ra, $a0, 0
|
|
# GD64-NEXT: jirl $ra, $ra, 0
|
|
# GD64-NEXT: add.d $a4, $a0, $tp
|
|
|
|
# LE64-RELA: could not find section '.got'
|
|
|
|
## a@tprel = 0x8
|
|
# LE64: 20158: ori $a0, $zero, 8
|
|
# LE64-NEXT: R_LARCH_TLS_DESC_PC_HI20 a
|
|
# LE64-NEXT: R_LARCH_RELAX *ABS*
|
|
# LE64-NEXT: R_LARCH_TLS_DESC_PC_LO12 a
|
|
# LE64-NEXT: R_LARCH_RELAX *ABS*
|
|
# LE64-NEXT: R_LARCH_TLS_DESC_LD a
|
|
# LE64-NEXT: R_LARCH_RELAX *ABS*
|
|
# LE64-NEXT: R_LARCH_TLS_DESC_CALL a
|
|
# LE64-NEXT: R_LARCH_RELAX *ABS*
|
|
# LE64-NEXT: add.d $a1, $a0, $tp
|
|
|
|
## b@tprel = 0x7ff
|
|
# LE64: 20160: nop
|
|
# LE64-NEXT: R_LARCH_TLS_DESC_PC_HI20 b
|
|
# LE64-NEXT: R_LARCH_RELAX *ABS*
|
|
# LE64-NEXT: R_LARCH_TLS_DESC_PC_LO12 b
|
|
# LE64-NEXT: nop
|
|
# LE64-NEXT: R_LARCH_TLS_DESC_LD b
|
|
# LE64-NEXT: ori $a0, $zero, 2047
|
|
# LE64-NEXT: R_LARCH_TLS_DESC_CALL b
|
|
# LE64-NEXT: add.d $a2, $a0, $tp
|
|
|
|
## c@tprel = 0x800
|
|
## Without R_LARCH_RELAX relocation. No relaxation.
|
|
# LE64: 20170: nop
|
|
# LE64-NEXT: R_LARCH_TLS_DESC_PC_HI20 c
|
|
# LE64-NEXT: addi.d $t0, $zero, 0
|
|
# LE64-NEXT: nop
|
|
# LE64-NEXT: R_LARCH_TLS_DESC_PC_LO12 c
|
|
# LE64-NEXT: addi.d $t0, $t0, 1
|
|
# LE64-NEXT: nop
|
|
# LE64-NEXT: R_LARCH_TLS_DESC_LD c
|
|
# LE64-NEXT: addi.d $t0, $t0, 1
|
|
# LE64-NEXT: ori $a0, $zero, 2048
|
|
# LE64-NEXT: R_LARCH_TLS_DESC_CALL c
|
|
# LE64-NEXT: add.d $a3, $a0, $tp
|
|
|
|
## d@tprel = 0x1000
|
|
# LE64: 20190: lu12i.w $a0, 1
|
|
# LE64-NEXT: R_LARCH_TLS_DESC_PC_HI20 d
|
|
# LE64-NEXT: R_LARCH_RELAX *ABS*
|
|
# LE64-NEXT: R_LARCH_TLS_DESC_PC_LO12 d
|
|
# LE64-NEXT: R_LARCH_RELAX *ABS*
|
|
# LE64-NEXT: R_LARCH_TLS_DESC_LD d
|
|
# LE64-NEXT: ori $a0, $a0, 0
|
|
# LE64-NEXT: R_LARCH_TLS_DESC_CALL d
|
|
# LE64-NEXT: add.d $a4, $a0, $tp
|
|
|
|
## a@tprel = 0x8
|
|
# LE64-NORELAX: 20158: nop
|
|
# LE64-NORELAX-NEXT: nop
|
|
# LE64-NORELAX-NEXT: nop
|
|
# LE64-NORELAX-NEXT: ori $a0, $zero, 8
|
|
# LE64-NORELAX-NEXT: add.d $a1, $a0, $tp
|
|
|
|
## b@tprel = 0x7ff
|
|
# LE64-NORELAX: 2016c: nop
|
|
# LE64-NORELAX-NEXT: nop
|
|
# LE64-NORELAX-NEXT: nop
|
|
# LE64-NORELAX-NEXT: ori $a0, $zero, 2047
|
|
# LE64-NORELAX-NEXT: add.d $a2, $a0, $tp
|
|
|
|
## c@tprel = 0x800
|
|
## Without R_LARCH_RELAX relocation. No relaxation.
|
|
# LE64-NORELAX: 20180: nop
|
|
# LE64-NORELAX-NEXT: addi.d $t0, $zero, 0
|
|
# LE64-NORELAX-NEXT: nop
|
|
# LE64-NORELAX-NEXT: addi.d $t0, $t0, 1
|
|
# LE64-NORELAX-NEXT: nop
|
|
# LE64-NORELAX-NEXT: addi.d $t0, $t0, 1
|
|
# LE64-NORELAX-NEXT: ori $a0, $zero, 2048
|
|
# LE64-NORELAX-NEXT: add.d $a3, $a0, $tp
|
|
|
|
## d@tprel = 0x1000
|
|
# LE64-NORELAX: 201a0: nop
|
|
# LE64-NORELAX-NEXT: nop
|
|
# LE64-NORELAX-NEXT: lu12i.w $a0, 1
|
|
# LE64-NORELAX-NEXT: ori $a0, $a0, 0
|
|
# LE64-NORELAX-NEXT: add.d $a4, $a0, $tp
|
|
|
|
# IE64-RELA: .rela.dyn {
|
|
# IE64-RELA-NEXT: 0x303F0 R_LARCH_TLS_TPREL64 c 0x0
|
|
# IE64-RELA-NEXT: 0x303F8 R_LARCH_TLS_TPREL64 d 0x0
|
|
# IE64-RELA-NEXT: }
|
|
# IE64-RELA: Hex dump of section '.got':
|
|
# IE64-RELA-NEXT: 0x000303f0 00000000 00000000 00000000 00000000 .
|
|
|
|
# IE64: .got 00000010 00000000000303f0
|
|
|
|
## a and b are optimized to use LE. c and d are optimized to IE.
|
|
## a@tprel = 0x8
|
|
# IE64: 202c8: ori $a0, $zero, 8
|
|
# IE64-NEXT: R_LARCH_TLS_DESC_PC_HI20 a
|
|
# IE64-NEXT: R_LARCH_RELAX *ABS*
|
|
# IE64-NEXT: R_LARCH_TLS_DESC_PC_LO12 a
|
|
# IE64-NEXT: R_LARCH_RELAX *ABS*
|
|
# IE64-NEXT: R_LARCH_TLS_DESC_LD a
|
|
# IE64-NEXT: R_LARCH_RELAX *ABS*
|
|
# IE64-NEXT: R_LARCH_TLS_DESC_CALL a
|
|
# IE64-NEXT: R_LARCH_RELAX *ABS*
|
|
# IE64-NEXT: add.d $a1, $a0, $tp
|
|
|
|
## b@tprel = 0x7ff
|
|
# IE64: 202d0: nop
|
|
# IE64-NEXT: R_LARCH_TLS_DESC_PC_HI20 b
|
|
# IE64-NEXT: R_LARCH_RELAX *ABS*
|
|
# IE64-NEXT: R_LARCH_TLS_DESC_PC_LO12 b
|
|
# IE64-NEXT: nop
|
|
# IE64-NEXT: R_LARCH_TLS_DESC_LD b
|
|
# IE64-NEXT: ori $a0, $zero, 2047
|
|
# IE64-NEXT: R_LARCH_TLS_DESC_CALL b
|
|
# IE64-NEXT: add.d $a2, $a0, $tp
|
|
|
|
## &.got[c]-. = 0x303f0 - 0x202f0: 0x10 pages, page offset 0x3f0
|
|
## Without R_LARCH_RELAX relocation. No relaxation.
|
|
# IE64: 202e0: nop
|
|
# IE64-NEXT: R_LARCH_TLS_DESC_PC_HI20 c
|
|
# IE64-NEXT: addi.d $t0, $zero, 0
|
|
# IE64-NEXT: nop
|
|
# IE64-NEXT: R_LARCH_TLS_DESC_PC_LO12 c
|
|
# IE64-NEXT: addi.d $t0, $t0, 1
|
|
# IE64-NEXT: pcalau12i $a0, 16
|
|
# IE64-NEXT: R_LARCH_TLS_DESC_LD c
|
|
# IE64-NEXT: addi.d $t0, $t0, 1
|
|
# IE64-NEXT: ld.d $a0, $a0, 1008
|
|
# IE64-NEXT: R_LARCH_TLS_DESC_CALL c
|
|
# IE64-NEXT: add.d $a3, $a0, $tp
|
|
|
|
## &.got[d]-. = 0x303f0+8 - 0x20300: 0x10 pages, page offset 0x3f8
|
|
# IE64: 20300: pcalau12i $a0, 16
|
|
# IE64-NEXT: R_LARCH_TLS_DESC_PC_HI20 d
|
|
# IE64-NEXT: R_LARCH_RELAX *ABS*
|
|
# IE64-NEXT: R_LARCH_TLS_DESC_PC_LO12 d
|
|
# IE64-NEXT: R_LARCH_RELAX *ABS*
|
|
# IE64-NEXT: R_LARCH_TLS_DESC_LD d
|
|
# IE64-NEXT: ld.d $a0, $a0, 1016
|
|
# IE64-NEXT: R_LARCH_TLS_DESC_CALL d
|
|
# IE64-NEXT: add.d $a4, $a0, $tp
|
|
|
|
# IE64-NORELAX: .got 00000010 0000000000030408
|
|
|
|
## a@tprel = 0x8
|
|
# IE64-NORELAX: 202c8: nop
|
|
# IE64-NORELAX-NEXT: nop
|
|
# IE64-NORELAX-NEXT: nop
|
|
# IE64-NORELAX-NEXT: ori $a0, $zero, 8
|
|
# IE64-NORELAX-NEXT: add.d $a1, $a0, $tp
|
|
|
|
## b@tprel = 0x7ff
|
|
# IE64-NORELAX: 202dc: nop
|
|
# IE64-NORELAX-NEXT: nop
|
|
# IE64-NORELAX-NEXT: nop
|
|
# IE64-NORELAX-NEXT: ori $a0, $zero, 2047
|
|
# IE64-NORELAX-NEXT: add.d $a2, $a0, $tp
|
|
|
|
## &.got[c]-. = 0x30408 - 0x20300: 0x10 pages, page offset 0x408
|
|
## Without R_LARCH_RELAX relocation. No relaxation.
|
|
# IE64-NORELAX: 202f0: nop
|
|
# IE64-NORELAX-NEXT: addi.d $t0, $zero, 0
|
|
# IE64-NORELAX-NEXT: nop
|
|
# IE64-NORELAX-NEXT: addi.d $t0, $t0, 1
|
|
# IE64-NORELAX-NEXT: pcalau12i $a0, 16
|
|
# IE64-NORELAX-NEXT: addi.d $t0, $t0, 1
|
|
# IE64-NORELAX-NEXT: ld.d $a0, $a0, 1032
|
|
# IE64-NORELAX-NEXT: add.d $a3, $a0, $tp
|
|
|
|
## &.got[d]-. = 0x30408+8 - 0x20318: 0x10 pages, page offset 0x410
|
|
# IE64-NORELAX: 20310: nop
|
|
# IE64-NORELAX-NEXT: nop
|
|
# IE64-NORELAX-NEXT: pcalau12i $a0, 16
|
|
# IE64-NORELAX-NEXT: ld.d $a0, $a0, 1040
|
|
# IE64-NORELAX-NEXT: add.d $a4, $a0, $tp
|
|
|
|
#--- a.s
|
|
la.tls.desc $a0, a
|
|
add.d $a1, $a0, $tp
|
|
|
|
# ADDI.D does not have R_LARCH_RELAX. No relaxation when it is not optimized to IE/LE (--shared).
|
|
pcalau12i $a0, %desc_pc_hi20(b)
|
|
.reloc .-4, R_LARCH_RELAX, 0
|
|
addi.d $a0, $a0, %desc_pc_lo12(b)
|
|
ld.d $ra, $a0, %desc_ld(b)
|
|
jirl $ra, $ra, %desc_call(b)
|
|
add.d $a2, $a0, $tp
|
|
|
|
# TLSDESC to LE. No relaxation.
|
|
pcalau12i $a0, %desc_pc_hi20(c)
|
|
addi.d $t0, $zero, 0
|
|
addi.d $a0, $a0, %desc_pc_lo12(c)
|
|
addi.d $t0, $t0, 1
|
|
ld.d $ra, $a0, %desc_ld(c)
|
|
addi.d $t0, $t0, 1
|
|
jirl $ra, $ra, %desc_call(c)
|
|
add.d $a3, $a0, $tp
|
|
|
|
# PCALAU12I and ADDI.D have R_LARCH_RELAX. We perform relaxation.
|
|
pcalau12i $a0, %desc_pc_hi20(d)
|
|
.reloc .-4, R_LARCH_RELAX, 0
|
|
addi.d $a0, $a0, %desc_pc_lo12(d)
|
|
.reloc .-4, R_LARCH_RELAX, 0
|
|
ld.d $ra, $a0, %desc_ld(d)
|
|
jirl $ra, $ra, %desc_call(d)
|
|
add.d $a4, $a0, $tp
|
|
|
|
.section .tbss,"awT",@nobits
|
|
.globl a
|
|
.zero 8
|
|
a:
|
|
.zero 2039 ## Place b at 0x7ff
|
|
b:
|
|
.zero 1
|
|
|
|
#--- c.s
|
|
.section .tbss,"awT",@nobits
|
|
.globl c, d
|
|
c:
|
|
.zero 2048 ## Place d at 0x1000
|
|
d:
|
|
.zero 4
|