diff options
author | mengqinggang <mengqinggang@loongson.cn> | 2024-02-28 17:42:36 +0800 |
---|---|---|
committer | liuzhensong <liuzhensong@loongson.cn> | 2024-03-19 14:14:47 +0800 |
commit | 97ce7870440d6b00181c2162ff5e56bb39b2e475 (patch) | |
tree | d62f13b8a4669786eb2915077adb523fc31ea4ab /ld | |
parent | b42aa684f6ff2bce9b8bc58aa89574723f17f1ce (diff) | |
download | gdb-97ce7870440d6b00181c2162ff5e56bb39b2e475.zip gdb-97ce7870440d6b00181c2162ff5e56bb39b2e475.tar.gz gdb-97ce7870440d6b00181c2162ff5e56bb39b2e475.tar.bz2 |
LoongArch: Add relaxation for R_LARCH_CALL36
This relaxation is effective for both macro instructions (call36, tail36)
and explicit relocation instructions (pcaddu18i + jirl).
call36 f -> bl f
R_LARCH_CALL36 -> R_LARCH_B26
tail36 $t0, f -> b f
R_LARCH_CALL36 -> R_LARCH_B26
Diffstat (limited to 'ld')
-rw-r--r-- | ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-loongarch-elf/relax-medium-call-1.d | 21 | ||||
-rw-r--r-- | ld/testsuite/ld-loongarch-elf/relax-medium-call-1.s | 43 | ||||
-rw-r--r-- | ld/testsuite/ld-loongarch-elf/relax-medium-call.d | 21 | ||||
-rw-r--r-- | ld/testsuite/ld-loongarch-elf/relax-medium-call.s | 35 |
5 files changed, 122 insertions, 0 deletions
diff --git a/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp b/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp index 507b244..759acab 100644 --- a/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp +++ b/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp @@ -52,6 +52,8 @@ if [istarget "loongarch64-*-*"] { run_dump_test "underflow_s_5_20" run_dump_test "tls-le-norelax" run_dump_test "tls-le-relax" + run_dump_test "relax-medium-call" + run_dump_test "relax-medium-call-1" } if [istarget "loongarch32-*-*"] { diff --git a/ld/testsuite/ld-loongarch-elf/relax-medium-call-1.d b/ld/testsuite/ld-loongarch-elf/relax-medium-call-1.d new file mode 100644 index 0000000..c8ee933 --- /dev/null +++ b/ld/testsuite/ld-loongarch-elf/relax-medium-call-1.d @@ -0,0 +1,21 @@ +#ld: -e0 -Ttext=0x120000000 --section-start=ta=0x118000000 --section-start=tb=0x127fffffc +#objdump: -d -j .text + +.*:[ ]+file format .* + + +Disassembly of section .text: + +[ ]*0000000120000000 <__bss_start-0x4030>: +[ ]+120000000:[ ]+54000200[ ]+bl[ ]+-134217728[ ]+# 118000000 <a> +[ ]+120000004:[ ]+1fffc001[ ]+pcaddu18i[ ]+\$ra, -512 +[ ]+120000008:[ ]+4ffffc21[ ]+jirl[ ]+\$ra, \$ra, -4 +[ ]+12000000c:[ ]+50000200[ ]+b[ ]+-134217728[ ]+# 11800000c <b> +[ ]+120000010:[ ]+1fffc00c[ ]+pcaddu18i[ ]+\$t0, -512 +[ ]+120000014:[ ]+4ffffd80[ ]+jirl[ ]+\$zero, \$t0, -4 +[ ]+120000018:[ ]+1e004001[ ]+pcaddu18i[ ]+\$ra, 512 +[ ]+12000001c:[ ]+4c000421[ ]+jirl[ ]+\$ra, \$ra, 4 +[ ]+120000020:[ ]+57fffdff[ ]+bl[ ]+134217724[ ]+# 12800001c <c> +[ ]+120000024:[ ]+1e00400c[ ]+pcaddu18i[ ]+\$t0, 512 +[ ]+120000028:[ ]+4c000580[ ]+jirl[ ]+\$zero, \$t0, 4 +[ ]+12000002c:[ ]+53fffdff[ ]+b[ ]+134217724[ ]+# 128000028 <d> diff --git a/ld/testsuite/ld-loongarch-elf/relax-medium-call-1.s b/ld/testsuite/ld-loongarch-elf/relax-medium-call-1.s new file mode 100644 index 0000000..5266fda --- /dev/null +++ b/ld/testsuite/ld-loongarch-elf/relax-medium-call-1.s @@ -0,0 +1,43 @@ +.section "ta", "ax" +a: + ret + ret + ret +b: + ret + +.text + pcaddu18i $ra, %call36(a) # min offset, can relax + jirl $ra, $ra, 0 + pcaddu18i $ra, %call36(a) # overflow, not relax + jirl $ra, $ra, 0 + pcaddu18i $t0, %call36(b) # min offset, can relax + jirl $zero, $t0, 0 + pcaddu18i $t0, %call36(b) # overflow, not relax + jirl $zero, $t0, 0 + + pcaddu18i $ra, %call36(c) # overflow, not relax + jirl $ra, $ra, 0 + pcaddu18i $ra, %call36(c) # max offset, can relax + jirl $ra, $ra, 0 + pcaddu18i $t0, %call36(d) # overflow, no relax + jirl $zero, $t0, 0 + pcaddu18i $t0, %call36(d) # max offset, can relax + jirl $zero, $t0, 0 + +.section "tb", "ax" + ret + ret + ret + ret + ret + ret + ret + ret +c: + ret + ret + ret +d: + ret + diff --git a/ld/testsuite/ld-loongarch-elf/relax-medium-call.d b/ld/testsuite/ld-loongarch-elf/relax-medium-call.d new file mode 100644 index 0000000..c8ee933 --- /dev/null +++ b/ld/testsuite/ld-loongarch-elf/relax-medium-call.d @@ -0,0 +1,21 @@ +#ld: -e0 -Ttext=0x120000000 --section-start=ta=0x118000000 --section-start=tb=0x127fffffc +#objdump: -d -j .text + +.*:[ ]+file format .* + + +Disassembly of section .text: + +[ ]*0000000120000000 <__bss_start-0x4030>: +[ ]+120000000:[ ]+54000200[ ]+bl[ ]+-134217728[ ]+# 118000000 <a> +[ ]+120000004:[ ]+1fffc001[ ]+pcaddu18i[ ]+\$ra, -512 +[ ]+120000008:[ ]+4ffffc21[ ]+jirl[ ]+\$ra, \$ra, -4 +[ ]+12000000c:[ ]+50000200[ ]+b[ ]+-134217728[ ]+# 11800000c <b> +[ ]+120000010:[ ]+1fffc00c[ ]+pcaddu18i[ ]+\$t0, -512 +[ ]+120000014:[ ]+4ffffd80[ ]+jirl[ ]+\$zero, \$t0, -4 +[ ]+120000018:[ ]+1e004001[ ]+pcaddu18i[ ]+\$ra, 512 +[ ]+12000001c:[ ]+4c000421[ ]+jirl[ ]+\$ra, \$ra, 4 +[ ]+120000020:[ ]+57fffdff[ ]+bl[ ]+134217724[ ]+# 12800001c <c> +[ ]+120000024:[ ]+1e00400c[ ]+pcaddu18i[ ]+\$t0, 512 +[ ]+120000028:[ ]+4c000580[ ]+jirl[ ]+\$zero, \$t0, 4 +[ ]+12000002c:[ ]+53fffdff[ ]+b[ ]+134217724[ ]+# 128000028 <d> diff --git a/ld/testsuite/ld-loongarch-elf/relax-medium-call.s b/ld/testsuite/ld-loongarch-elf/relax-medium-call.s new file mode 100644 index 0000000..c0521b6 --- /dev/null +++ b/ld/testsuite/ld-loongarch-elf/relax-medium-call.s @@ -0,0 +1,35 @@ +.section "ta", "ax" +a: + ret + ret + ret +b: + ret + +.text + call36 a # min offset, can relax + call36 a # overflow, not relax + tail36 $t0, b # min offset, can relax + tail36 $t0, b # overflow, not relax + + call36 c # overflow, not relax + call36 c # max offset, can relax + tail36 $t0, d # overflow, no relax + tail36 $t0, d # max offset, can relax + +.section "tb", "ax" + ret + ret + ret + ret + ret + ret + ret + ret +c: + ret + ret + ret +d: + ret + |