Skip to content

[lld][LoongArch] Support relaxation during TLSDESC GD/LD to IE/LE conversion #123730

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 37 commits into
base: users/ylzsx/r-tlsdesc-to-iele-norelax
Choose a base branch
from
Open
Changes from 1 commit
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
ea9fea2
Relax PCHi20Lo12.
ylzsx Dec 27, 2024
95f4540
la.pcrel relax test modify.
ylzsx Dec 24, 2024
7b133c2
Add test for PCHi20Lo12
ylzsx Dec 27, 2024
abc1a45
Add test for got symbols relaxation.
ylzsx Dec 30, 2024
1b1804e
Modify test. NFC
ylzsx Jan 15, 2025
30cb382
Add check for register.
ylzsx Jan 20, 2025
f1f995b
Relax call36/tail36.
ylzsx Dec 26, 2024
f227ae5
modify test for call36/tail36.
ylzsx Dec 27, 2024
f2aae15
Modify test. Add the option --relax.
ylzsx Jan 16, 2025
7993434
Relax TLS LE/GD/LD.
ylzsx Dec 27, 2024
1e9aa52
Add test for TLSLD/TLSGD when relax enabled.
ylzsx Dec 29, 2024
91da25e
Modify test for TLSLE when relax enabled.
ylzsx Dec 31, 2024
2066c5f
Add test for loongarch-relax-tls-le.s and modify loongarch-relax-emit…
ylzsx Dec 31, 2024
b57c40e
Modify test. Add --relax option.
ylzsx Jan 16, 2025
56c24f9
Relax TLSDESC code sequence.
ylzsx Dec 31, 2024
880523c
Add test loongarch-relax-tlsdesc.s
ylzsx Dec 31, 2024
a48a2b9
Relax desc_pc_hi20+desc_pc_lo12 ==> desc_pcrel_20
ylzsx Jan 2, 2025
576773c
Modify test loongarch-relax-tlsdesc.s
ylzsx Jan 4, 2025
b2f11e3
Remove --emit-relocs in loongarch-relax-tlsdesc.s
ylzsx Jan 4, 2025
d5c9d64
Modify test. Add --relax option.
ylzsx Jan 17, 2025
a39c190
Convert TLS IE to LE in the normal or medium code model.
ylzsx Jan 2, 2025
78a16b0
Test loongarch-tls-ie.s pass.
ylzsx Jan 3, 2025
4f2dca4
Add test loongarch-relax-tls-ie.s
ylzsx Jan 3, 2025
81d44f2
modify RE_LOONGARCH_GOT.
ylzsx Jan 3, 2025
31a9dab
Fix bug.
ylzsx Jan 21, 2025
83d8b7e
Support relaxation during IE to LE conversion.
ylzsx Jan 3, 2025
6b79432
Modify loongarch-relax-tls-ie.s when relaxation is enabled.
ylzsx Jan 3, 2025
9d99de8
Modify test. Add --relax option.
ylzsx Jan 17, 2025
dff3031
[lld][LoongArch] Implement TLSDESC GD/LD to IE/LE.
ylzsx Jan 3, 2025
459e25d
Modify loongarch-tlsdesc.s and loongarch-tlsdesc-pcrel20-s2.s
ylzsx Jan 3, 2025
894a97a
Modify loongarch-relax-tlsdesc.s init.
ylzsx Jan 4, 2025
5262935
Modify loongarch-relax-tlsdesc.s
ylzsx Jan 4, 2025
653281c
Add comments.
ylzsx Jan 21, 2025
2a30b6c
Revert "Add comments."
ylzsx Jan 21, 2025
0c6ba1d
Delete the wrong flag NEEDS_TLSGD_TO_IE in the extreme code model.
ylzsx Jan 22, 2025
63a756b
Support relaxation during TLSDESC GD/LD to IE/LE conversion.
ylzsx Jan 4, 2025
99a1e07
Modify loongarch-relax-tlsdesc.s.
ylzsx Jan 4, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Modify test loongarch-relax-tlsdesc.s
  • Loading branch information
ylzsx committed Jan 20, 2025
commit 576773c8e2c67bc89cd653f3a52b894446ef590e
319 changes: 209 additions & 110 deletions lld/test/ELF/loongarch-relax-tlsdesc.s
Original file line number Diff line number Diff line change
Expand Up @@ -3,166 +3,265 @@
# 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 -shared -soname=c.64.so c.64.o -o c.64.so
# RUN: llvm-mc -filetype=obj -triple=loongarch32 -mattr=+relax --defsym ELF32=1 a.s -o a.32.o
# RUN: llvm-mc -filetype=obj -triple=loongarch32 -mattr=+relax --defsym ELF32=1 c.s -o c.32.o
# RUN: ld.lld -shared -soname=c.32.so c.32.o -o c.32.so

## Test the TLSDESC relaxation. Also check --emit-relocs.
# RUN: ld.lld -shared --emit-relocs -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 a.64.so | FileCheck %s --check-prefix=GD64
# RUN: llvm-objdump --no-show-raw-insn -dr -h a.64.so | FileCheck %s --check-prefix=GD64

## FIXME: The transition frome TLSDESC to IE/LE has not yet been implemented.
## Keep the dynamic relocations and hand them over to dynamic linker.

# 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 | FileCheck --check-prefix=LE64-RELA %s
# RUN: llvm-objdump --no-show-raw-insn -d a.64.le | FileCheck %s --check-prefix=LE64
# RUN: llvm-objdump --no-show-raw-insn -dr -h a.64.le | FileCheck %s --check-prefix=LE64

# RUN: ld.lld -e 0 -z now --no-relax 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 -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 -d a.64.ie | FileCheck %s --check-prefix=IE64

## 32-bit code is mostly the same. We only test a few variants.
# RUN: llvm-objdump --no-show-raw-insn -dr -h a.64.ie | FileCheck %s --check-prefix=IE64

# RUN: ld.lld -shared -z now a.32.o c.32.o -o rel.32.so -z rel
# RUN: llvm-readobj -r -x .got rel.32.so | FileCheck --check-prefix=GD32-REL %s
# RUN: ld.lld -e 0 -z now --no-relax 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: 0x20448 R_LARCH_TLS_DESC64 - 0x7FF
# GD64-RELA-NEXT: 0x20418 R_LARCH_TLS_DESC64 a 0x0
# GD64-RELA-NEXT: 0x20428 R_LARCH_TLS_DESC64 c 0x0
# GD64-RELA-NEXT: 0x20438 R_LARCH_TLS_DESC64 d 0x0
# 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: 0x00020418 00000000 00000000 00000000 00000000 .
# GD64-RELA-NEXT: 0x00020428 00000000 00000000 00000000 00000000 .
# GD64-RELA-NEXT: 0x00020438 00000000 00000000 00000000 00000000 .
# GD64-RELA-NEXT: 0x00020448 00000000 00000000 00000000 00000000 .
# 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]-. = 0x20418 - 0x10318 = 16448<<2
# GD64: 10318: pcaddi $a0, 16448
## &.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]-. = 0x20418+48 - 0x10328 = 16456<<2
# GD64: 10328: pcaddi $a0, 16456
## &.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]-. = 0x20418+16 - 0x10338 = 16444<<2
# GD64: 10338: pcaddi $a0, 16
## &.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]-. = 0x20418+32 - 0x10348 = 16444<<2
# GD64: 10348: pcaddi $a0, 16444
## &.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: .rela.dyn {
# LE64-RELA-NEXT: 0x30268 R_LARCH_TLS_DESC64 - 0x8
# LE64-RELA-NEXT: 0x30278 R_LARCH_TLS_DESC64 - 0x800
# LE64-RELA-NEXT: 0x30288 R_LARCH_TLS_DESC64 - 0x1000
# LE64-RELA-NEXT: 0x30298 R_LARCH_TLS_DESC64 - 0x7FF
# LE64-RELA-NEXT: 0x30280 R_LARCH_TLS_DESC64 - 0x8
# LE64-RELA-NEXT: 0x30290 R_LARCH_TLS_DESC64 - 0x800
# LE64-RELA-NEXT: 0x302A0 R_LARCH_TLS_DESC64 - 0x1000
# LE64-RELA-NEXT: 0x302B0 R_LARCH_TLS_DESC64 - 0x7FF
# LE64-RELA-NEXT: }
# LE64-RELA: Hex dump of section '.got':
# LE64-RELA-NEXT: 0x00030268 00000000 00000000 00000000 00000000 .
# LE64-RELA-NEXT: 0x00030278 00000000 00000000 00000000 00000000 .
# LE64-RELA-NEXT: 0x00030288 00000000 00000000 00000000 00000000 .
# LE64-RELA-NEXT: 0x00030298 00000000 00000000 00000000 00000000 .

# LE64-LABEL: <.text>:
## &.got[a]-. = 0x30268 - 0x20228 = 16400<<2
# LE64-NEXT: 20228: pcaddi $a0, 16400
# LE64-NEXT: ld.d $ra, $a0, 0
# LE64-NEXT: jirl $ra, $ra, 0
# LE64-NEXT: add.d $a1, $a0, $tp
## &.got[b]-. = 0x30298 - 0x20238 = 16408<<2
# LE64-NEXT: 20238: pcaddi $a0, 16408
# LE64-NEXT: ld.d $ra, $a0, 0
# LE64-NEXT: jirl $ra, $ra, 0
# LE64-NEXT: add.d $a2, $a0, $tp
## &.got[c]-. = 0x30278 - 0x20248 = 16396<<2
# LE64-NEXT: 20248: pcaddi $a0, 16396
# LE64-NEXT: ld.d $ra, $a0, 0
# LE64-NEXT: jirl $ra, $ra, 0
# LE64-NEXT: add.d $a3, $a0, $tp
## &.got[d]-. = 0x30288 - 0x20258 = 16396<<2
# LE64-NEXT: 20258: pcaddi $a0, 16396
# LE64-NEXT: ld.d $ra, $a0, 0
# LE64-NEXT: jirl $ra, $ra, 0
# LE64-NEXT: add.d $a4, $a0, $tp
# LE64-RELA-NEXT: 0x00030280 00000000 00000000 00000000 00000000 .
# LE64-RELA-NEXT: 0x00030290 00000000 00000000 00000000 00000000 .
# LE64-RELA-NEXT: 0x000302a0 00000000 00000000 00000000 00000000 .
# LE64-RELA-NEXT: 0x000302b0 00000000 00000000 00000000 00000000 .

# LE64: .got 00000040 0000000000030280

## &.got[a]-. = 0x30280 - 0x20228 = 16406<<2
# LE64: 20228: pcaddi $a0, 16406
# LE64-NEXT: ld.d $ra, $a0, 0
# LE64-NEXT: jirl $ra, $ra, 0
# LE64-NEXT: add.d $a1, $a0, $tp

## &.got[b]-. = 0x30280+48 - 0x20238: 0x10 pages, page offset 0x2b0
## R_LARCH_RELAX does not appear in pairs. No relaxation.
# LE64: 20238: pcalau12i $a0, 16
# LE64-NEXT: addi.d $a0, $a0, 688
# LE64-NEXT: ld.d $ra, $a0, 0
# LE64-NEXT: jirl $ra, $ra, 0
# LE64-NEXT: add.d $a2, $a0, $tp

## &.got[c]-. = 0x30280+16 - 0x2024c: 0x10 pages, page offset 0x290
## Without R_LARCH_RELAX relocation. No relaxation.
# LE64: 2024c: pcalau12i $a0, 16
# LE64-NEXT: addi.d $t0, $zero, 0
# LE64-NEXT: addi.d $a0, $a0, 656
# LE64-NEXT: addi.d $t0, $t0, 1
# LE64-NEXT: ld.d $ra, $a0, 0
# LE64-NEXT: addi.d $t0, $t0, 1
# LE64-NEXT: jirl $ra, $ra, 0
# LE64-NEXT: add.d $a3, $a0, $tp

## &.got[d]-. = 0x30280+32 - 0x2026c = 16397<<2
# LE64: 2026c: pcaddi $a0, 16397
# LE64-NEXT: ld.d $ra, $a0, 0
# LE64-NEXT: jirl $ra, $ra, 0
# LE64-NEXT: add.d $a4, $a0, $tp

# LE64-NORELAX: .got 00000040 0000000000030288

## &.got[a]-. = 0x30288 - 0x20228 = 0x10 pages, page offset 0x288
# LE64-NORELAX: 20228: pcalau12i $a0, 16
# LE64-NORELAX-NEXT: addi.d $a0, $a0, 648
# LE64-NORELAX-NEXT: ld.d $ra, $a0, 0
# LE64-NORELAX-NEXT: jirl $ra, $ra, 0
# LE64-NORELAX-NEXT: add.d $a1, $a0, $tp

## &.got[b]-. = 0x30288+48 - 0x2023c: 0x10 pages, page offset 0x2b8
## R_LARCH_RELAX does not appear in pairs. No relaxation.
# LE64-NORELAX: 2023c: pcalau12i $a0, 16
# LE64-NORELAX-NEXT: addi.d $a0, $a0, 696
# LE64-NORELAX-NEXT: ld.d $ra, $a0, 0
# LE64-NORELAX-NEXT: jirl $ra, $ra, 0
# LE64-NORELAX-NEXT: add.d $a2, $a0, $tp

## &.got[c]-. = 0x30288+16 - 0x20250: 0x10 pages, page offset 0x298
## Without R_LARCH_RELAX relocation. No relaxation.
# LE64-NORELAX: 20250: pcalau12i $a0, 16
# LE64-NORELAX-NEXT: addi.d $t0, $zero, 0
# LE64-NORELAX-NEXT: addi.d $a0, $a0, 664
# LE64-NORELAX-NEXT: addi.d $t0, $t0, 1
# LE64-NORELAX-NEXT: ld.d $ra, $a0, 0
# LE64-NORELAX-NEXT: addi.d $t0, $t0, 1
# LE64-NORELAX-NEXT: jirl $ra, $ra, 0
# LE64-NORELAX-NEXT: add.d $a3, $a0, $tp

## &.got[d]-. = 0x30288+32 - 0x20270: 0x10 pages, page offset 0x2a8
# LE64-NORELAX: 20270: pcalau12i $a0, 16
# LE64-NORELAX-NEXT: addi.d $a0, $a0, 680
# LE64-NORELAX-NEXT: ld.d $ra, $a0, 0
# LE64-NORELAX-NEXT: jirl $ra, $ra, 0
# LE64-NORELAX-NEXT: add.d $a4, $a0, $tp

# IE64-RELA: .rela.dyn {
# IE64-RELA-NEXT: 0x30418 R_LARCH_TLS_DESC64 - 0x8
# IE64-RELA-NEXT: 0x30448 R_LARCH_TLS_DESC64 - 0x7FF
# IE64-RELA-NEXT: 0x30428 R_LARCH_TLS_DESC64 c 0x0
# IE64-RELA-NEXT: 0x30438 R_LARCH_TLS_DESC64 d 0x0
# IE64-RELA-NEXT: 0x30430 R_LARCH_TLS_DESC64 - 0x8
# IE64-RELA-NEXT: 0x30460 R_LARCH_TLS_DESC64 - 0x7FF
# IE64-RELA-NEXT: 0x30440 R_LARCH_TLS_DESC64 c 0x0
# IE64-RELA-NEXT: 0x30450 R_LARCH_TLS_DESC64 d 0x0
# IE64-RELA-NEXT: }
# IE64-RELA: Hex dump of section '.got':
# IE64-RELA-NEXT: 0x00030418 00000000 00000000 00000000 00000000 .
# IE64-RELA-NEXT: 0x00030428 00000000 00000000 00000000 00000000 .
# IE64-RELA-NEXT: 0x00030438 00000000 00000000 00000000 00000000 .
# IE64-RELA-NEXT: 0x00030448 00000000 00000000 00000000 00000000 .
# IE64-RELA-NEXT: 0x00030430 00000000 00000000 00000000 00000000 .
# IE64-RELA-NEXT: 0x00030440 00000000 00000000 00000000 00000000 .
# IE64-RELA-NEXT: 0x00030450 00000000 00000000 00000000 00000000 .
# IE64-RELA-NEXT: 0x00030460 00000000 00000000 00000000 00000000 .

# IE64: .got 00000040 0000000000030430

## a and b are optimized to use LE. c and d are optimized to IE.
# IE64-LABEL: <.text>:
## &.got[a]-. = 0x30418 - 0x202f8 = 16456<<2
# IE64-NEXT: 202f8: pcaddi $a0, 16456
# IE64-NEXT: ld.d $ra, $a0, 0
# IE64-NEXT: jirl $ra, $ra, 0
# IE64-NEXT: add.d $a1, $a0, $tp
## &.got[b]-. = 0x30448 - 0x20308 = 16464<<2
# IE64-NEXT: 20308: pcaddi $a0, 16464
# IE64-NEXT: ld.d $ra, $a0, 0
# IE64-NEXT: jirl $ra, $ra, 0
# IE64-NEXT: add.d $a2, $a0, $tp
## &.got[c]-. = 0x30428 - 0x20318 = 16452<<2
# IE64-NEXT: 20318: pcaddi $a0, 16452
# IE64-NEXT: ld.d $ra, $a0, 0
# IE64-NEXT: jirl $ra, $ra, 0
# IE64-NEXT: add.d $a3, $a0, $tp
## &.got[d]-. = 0x30438 - 0x20328 = 16452<<2
# IE64-NEXT: 20328: pcaddi $a0, 16452
# IE64-NEXT: ld.d $ra, $a0, 0
# IE64-NEXT: jirl $ra, $ra, 0
# IE64-NEXT: add.d $a4, $a0, $tp

# GD32-REL: .rel.dyn {
# GD32-REL-NEXT: 0x202A4 R_LARCH_TLS_DESC32 -
# GD32-REL-NEXT: 0x2028C R_LARCH_TLS_DESC32 a
# GD32-REL-NEXT: 0x20294 R_LARCH_TLS_DESC32 c
# GD32-REL-NEXT: 0x2029C R_LARCH_TLS_DESC32 d
# GD32-REL-NEXT: }
# GD32-REL: Hex dump of section '.got':
# GD32-REL-NEXT: 0x0002028c 00000000 00000000 00000000 00000000 .
# GD32-REL-NEXT: 0x0002029c 00000000 00000000 00000000 ff070000 .
## &.got[a]-. = 0x30430 - 0x202f8 = 16462<<2
# IE64: 202f8: pcaddi $a0, 16462
# IE64-NEXT: ld.d $ra, $a0, 0
# IE64-NEXT: jirl $ra, $ra, 0
# IE64-NEXT: add.d $a1, $a0, $tp

#--- a.s
.macro add dst, src1, src2
.ifdef ELF32
add.w \dst, \src1, \src2
.else
add.d \dst, \src1, \src2
.endif
.endm
## &.got[b]-. = 0x30430+48 - 0x20308: 0x10 pages, page offset 0x460
## R_LARCH_RELAX does not appear in pairs. No relaxation.
# IE64: 20308: pcalau12i $a0, 16
# IE64-NEXT: addi.d $a0, $a0, 1120
# IE64-NEXT: ld.d $ra, $a0, 0
# IE64-NEXT: jirl $ra, $ra, 0
# IE64-NEXT: add.d $a2, $a0, $tp

## &.got[c]-. = 0x30430+16 - 0x2031c: 0x10 pages, page offset 0x440
## Without R_LARCH_RELAX relocation. No relaxation.
# IE64: 2031c: pcalau12i $a0, 16
# IE64-NEXT: addi.d $t0, $zero, 0
# IE64-NEXT: addi.d $a0, $a0, 1088
# IE64-NEXT: addi.d $t0, $t0, 1
# IE64-NEXT: ld.d $ra, $a0, 0
# IE64-NEXT: addi.d $t0, $t0, 1
# IE64-NEXT: jirl $ra, $ra, 0
# IE64-NEXT: add.d $a3, $a0, $tp

## &.got[d]-. = 0x30430+32 - 0x2033c = 16453<<2
# IE64: 2033c: pcaddi $a0, 16453
# IE64-NEXT: ld.d $ra, $a0, 0
# IE64-NEXT: jirl $ra, $ra, 0
# IE64-NEXT: add.d $a4, $a0, $tp

# IE64-NORELAX: .got 00000040 0000000000030438

## &.got[a]-. = 0x30438 - 0x202f8 = 0x10 pages, page offset 0x438
# IE64-NORELAX: 202f8: pcalau12i $a0, 16
# IE64-NORELAX-NEXT: addi.d $a0, $a0, 1080
# IE64-NORELAX-NEXT: ld.d $ra, $a0, 0
# IE64-NORELAX-NEXT: jirl $ra, $ra, 0
# IE64-NORELAX-NEXT: add.d $a1, $a0, $tp

## &.got[b]-. = 0x30438+48 - 0x2030c: 0x10 pages, page offset 0x468
## R_LARCH_RELAX does not appear in pairs. No relaxation.
# IE64-NORELAX: 2030c: pcalau12i $a0, 16
# IE64-NORELAX-NEXT: addi.d $a0, $a0, 1128
# IE64-NORELAX-NEXT: ld.d $ra, $a0, 0
# IE64-NORELAX-NEXT: jirl $ra, $ra, 0
# IE64-NORELAX-NEXT: add.d $a2, $a0, $tp

## &.got[c]-. = 0x30438+16 - 0x20320: 0x10 pages, page offset 0x448
## Without R_LARCH_RELAX relocation. No relaxation.
# IE64-NORELAX: 20320: pcalau12i $a0, 16
# IE64-NORELAX-NEXT: addi.d $t0, $zero, 0
# IE64-NORELAX-NEXT: addi.d $a0, $a0, 1096
# IE64-NORELAX-NEXT: addi.d $t0, $t0, 1
# IE64-NORELAX-NEXT: ld.d $ra, $a0, 0
# IE64-NORELAX-NEXT: addi.d $t0, $t0, 1
# IE64-NORELAX-NEXT: jirl $ra, $ra, 0
# IE64-NORELAX-NEXT: add.d $a3, $a0, $tp

## &.got[d]-. = 0x30438+32 - 0x20340: 0x10 pages, page offset 0x458
# IE64-NORELAX: 20340: pcalau12i $a0, 16
# IE64-NORELAX-NEXT: addi.d $a0, $a0, 1112
# IE64-NORELAX-NEXT: ld.d $ra, $a0, 0
# IE64-NORELAX-NEXT: jirl $ra, $ra, 0
# IE64-NORELAX-NEXT: add.d $a4, $a0, $tp

#--- a.s
la.tls.desc $a0, a
add $a1, $a0, $tp
add.d $a1, $a0, $tp

la.tls.desc $a0, b
add $a2, $a0, $tp
# ADDI.D does not have R_LARCH_RELAX. No relaxation.
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

la.tls.desc $a0, c
add $a3, $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

la.tls.desc $a0, d
add $a4, $a0, $tp
# PCALAU12I and ADDI.D have R_LARCH_RELAX. We preform 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
Expand Down