aboutsummaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
authorJinyang He <hejinyang@loongson.cn>2023-09-05 10:31:28 +0800
committerliuzhensong <liuzhensong@loongson.cn>2024-02-27 11:54:34 +0800
commitb98da8583a500419c976bcfd56b80b02b1afceff (patch)
tree9f64bffba67e7b1da9b3dd97ea8ca4c55ca38f51 /ld
parent6ae2890f3b16a3d558683dd1191389e3bd5a1c58 (diff)
downloadgdb-b98da8583a500419c976bcfd56b80b02b1afceff.zip
gdb-b98da8583a500419c976bcfd56b80b02b1afceff.tar.gz
gdb-b98da8583a500419c976bcfd56b80b02b1afceff.tar.bz2
LoongArch: ld: Fix other pop relocs overflow check and add tests
Add reloc_unsign_bits() to fix others sop_pop relocs overflow check. Then add over/underflow tests for relocs B*, SOP_POP* and PCREL20_S2. bfd/ChangeLog: * bfd/elfxx-loongarch.c: Add reloc_unsign_bits(). ld/ChangeLog: * ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp: Add tests. * ld/testsuite/ld-loongarch-elf/abi1_max_imm.dd: New test. * ld/testsuite/ld-loongarch-elf/abi1_max_imm.s: New test. * ld/testsuite/ld-loongarch-elf/abi1_sops.s: New test. * ld/testsuite/ld-loongarch-elf/abi2_max_imm.s: New test. * ld/testsuite/ld-loongarch-elf/abi2_overflows.s: New test. * ld/testsuite/ld-loongarch-elf/max_imm_b16.d: New test. * ld/testsuite/ld-loongarch-elf/max_imm_b21.d: New test. * ld/testsuite/ld-loongarch-elf/max_imm_b26.d: New test. * ld/testsuite/ld-loongarch-elf/max_imm_pcrel20.d: New test. * ld/testsuite/ld-loongarch-elf/overflow_b16.d: New test. * ld/testsuite/ld-loongarch-elf/overflow_b21.d: New test. * ld/testsuite/ld-loongarch-elf/overflow_b26.d: New test. * ld/testsuite/ld-loongarch-elf/overflow_pcrel20.d: New test. * ld/testsuite/ld-loongarch-elf/overflow_s_0_10_10_16_s2.d: New test. * ld/testsuite/ld-loongarch-elf/overflow_s_0_5_10_16_s2.d: New test. * ld/testsuite/ld-loongarch-elf/overflow_s_10_12.d: New test. * ld/testsuite/ld-loongarch-elf/overflow_s_10_16.d: New test. * ld/testsuite/ld-loongarch-elf/overflow_s_10_16_s2.d: New test. * ld/testsuite/ld-loongarch-elf/overflow_s_10_5.d: New test. * ld/testsuite/ld-loongarch-elf/overflow_s_5_20.d: New test. * ld/testsuite/ld-loongarch-elf/overflow_u.d: New test. * ld/testsuite/ld-loongarch-elf/overflow_u_10_12.d: New test. * ld/testsuite/ld-loongarch-elf/underflow_b16.d: New test. * ld/testsuite/ld-loongarch-elf/underflow_b21.d: New test. * ld/testsuite/ld-loongarch-elf/underflow_b26.d: New test. * ld/testsuite/ld-loongarch-elf/underflow_pcrel20.d: New test. * ld/testsuite/ld-loongarch-elf/underflow_s_0_10_10_16_s2.d: New test. * ld/testsuite/ld-loongarch-elf/underflow_s_0_5_10_16_s2.d: New test. * ld/testsuite/ld-loongarch-elf/underflow_s_10_12.d: New test. * ld/testsuite/ld-loongarch-elf/underflow_s_10_16.d: New test. * ld/testsuite/ld-loongarch-elf/underflow_s_10_16_s2.d: New test. * ld/testsuite/ld-loongarch-elf/underflow_s_10_5.d: New test. * ld/testsuite/ld-loongarch-elf/underflow_s_5_20.d: New test.
Diffstat (limited to 'ld')
-rw-r--r--ld/testsuite/ld-loongarch-elf/abi1_max_imm.dd18
-rw-r--r--ld/testsuite/ld-loongarch-elf/abi1_max_imm.s39
-rw-r--r--ld/testsuite/ld-loongarch-elf/abi1_sops.s43
-rw-r--r--ld/testsuite/ld-loongarch-elf/abi2_max_imm.s24
-rw-r--r--ld/testsuite/ld-loongarch-elf/abi2_overflows.s24
-rw-r--r--ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp39
-rw-r--r--ld/testsuite/ld-loongarch-elf/max_imm_b16.d9
-rw-r--r--ld/testsuite/ld-loongarch-elf/max_imm_b21.d9
-rw-r--r--ld/testsuite/ld-loongarch-elf/max_imm_b26.d9
-rw-r--r--ld/testsuite/ld-loongarch-elf/max_imm_pcrel20.d9
-rw-r--r--ld/testsuite/ld-loongarch-elf/overflow_b16.d4
-rw-r--r--ld/testsuite/ld-loongarch-elf/overflow_b21.d4
-rw-r--r--ld/testsuite/ld-loongarch-elf/overflow_b26.d4
-rw-r--r--ld/testsuite/ld-loongarch-elf/overflow_pcrel20.d4
-rw-r--r--ld/testsuite/ld-loongarch-elf/overflow_s_0_10_10_16_s2.d4
-rw-r--r--ld/testsuite/ld-loongarch-elf/overflow_s_0_5_10_16_s2.d4
-rw-r--r--ld/testsuite/ld-loongarch-elf/overflow_s_10_12.d4
-rw-r--r--ld/testsuite/ld-loongarch-elf/overflow_s_10_16.d4
-rw-r--r--ld/testsuite/ld-loongarch-elf/overflow_s_10_16_s2.d4
-rw-r--r--ld/testsuite/ld-loongarch-elf/overflow_s_10_5.d4
-rw-r--r--ld/testsuite/ld-loongarch-elf/overflow_s_5_20.d4
-rw-r--r--ld/testsuite/ld-loongarch-elf/overflow_u.d4
-rw-r--r--ld/testsuite/ld-loongarch-elf/overflow_u_10_12.d4
-rw-r--r--ld/testsuite/ld-loongarch-elf/underflow_b16.d4
-rw-r--r--ld/testsuite/ld-loongarch-elf/underflow_b21.d4
-rw-r--r--ld/testsuite/ld-loongarch-elf/underflow_b26.d4
-rw-r--r--ld/testsuite/ld-loongarch-elf/underflow_pcrel20.d4
-rw-r--r--ld/testsuite/ld-loongarch-elf/underflow_s_0_10_10_16_s2.d4
-rw-r--r--ld/testsuite/ld-loongarch-elf/underflow_s_0_5_10_16_s2.d4
-rw-r--r--ld/testsuite/ld-loongarch-elf/underflow_s_10_12.d4
-rw-r--r--ld/testsuite/ld-loongarch-elf/underflow_s_10_16.d4
-rw-r--r--ld/testsuite/ld-loongarch-elf/underflow_s_10_16_s2.d4
-rw-r--r--ld/testsuite/ld-loongarch-elf/underflow_s_10_5.d4
-rw-r--r--ld/testsuite/ld-loongarch-elf/underflow_s_5_20.d4
34 files changed, 319 insertions, 0 deletions
diff --git a/ld/testsuite/ld-loongarch-elf/abi1_max_imm.dd b/ld/testsuite/ld-loongarch-elf/abi1_max_imm.dd
new file mode 100644
index 0000000..c852714
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/abi1_max_imm.dd
@@ -0,0 +1,18 @@
+#...
+.*00003c00.*
+.*00004000.*
+.*001ffc00.*
+.*00200000.*
+.*01fffc00.*
+.*02000000.*
+.*01fffc00.*
+.*02000000.*
+.*03fffc0f.*
+.*00000010.*
+.*03fffdff.*
+.*00000200.*
+.*00ffffe0.*
+.*01000000.*
+.*003ffc00.*
+.*ffffffff.*
+#pass
diff --git a/ld/testsuite/ld-loongarch-elf/abi1_max_imm.s b/ld/testsuite/ld-loongarch-elf/abi1_max_imm.s
new file mode 100644
index 0000000..02507f1
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/abi1_max_imm.s
@@ -0,0 +1,39 @@
+.macro sign_check reloc_name reloc_bits
+ .reloc off, R_LARCH_SOP_PUSH_ABSOLUTE, (1 << (\reloc_bits - 1)) - 1
+ .reloc off, \reloc_name
+ .word 0
+ .set off, off + 4
+ .reloc off, R_LARCH_SOP_PUSH_ABSOLUTE, -(1 << (\reloc_bits - 1))
+ .reloc off, \reloc_name
+ .word 0
+ .set off, off + 4
+.endm
+
+.macro sign_check_s2 reloc_name reloc_bits
+ .reloc off, R_LARCH_SOP_PUSH_ABSOLUTE, ((1 << (\reloc_bits - 1)) - 1) << 2
+ .reloc off, \reloc_name
+ .word 0
+ .set off, off + 4
+ .reloc off, R_LARCH_SOP_PUSH_ABSOLUTE, (-(1 << (\reloc_bits - 1))) << 2
+ .reloc off, \reloc_name
+ .word 0
+ .set off, off + 4
+.endm
+
+.macro unsign_check reloc_name reloc_bits
+ .reloc off, R_LARCH_SOP_PUSH_ABSOLUTE, (1 << \reloc_bits) - 1
+ .reloc off, \reloc_name
+ .word 0
+ .set off, off + 4
+.endm
+
+.set off, 0
+sign_check R_LARCH_SOP_POP_32_S_10_5 5
+sign_check R_LARCH_SOP_POP_32_S_10_12 12
+sign_check R_LARCH_SOP_POP_32_S_10_16 16
+sign_check_s2 R_LARCH_SOP_POP_32_S_10_16_S2 16
+sign_check_s2 R_LARCH_SOP_POP_32_S_0_5_10_16_S2 21
+sign_check_s2 R_LARCH_SOP_POP_32_S_0_10_10_16_S2 26
+sign_check R_LARCH_SOP_POP_32_S_5_20 20
+unsign_check R_LARCH_SOP_POP_32_U_10_12 12
+unsign_check R_LARCH_SOP_POP_32_U 32
diff --git a/ld/testsuite/ld-loongarch-elf/abi1_sops.s b/ld/testsuite/ld-loongarch-elf/abi1_sops.s
new file mode 100644
index 0000000..34f2d59
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/abi1_sops.s
@@ -0,0 +1,43 @@
+.macro sign_check reloc_sym reloc_name reloc_bits
+ .ifdef \reloc_sym
+ .ifdef overflow
+ .reloc 0, R_LARCH_SOP_PUSH_ABSOLUTE, 1 << (\reloc_bits - 1)
+ .reloc 0, \reloc_name
+ .else
+ .reloc 0, R_LARCH_SOP_PUSH_ABSOLUTE, -(1 << (\reloc_bits - 1)) - 1
+ .reloc 0, \reloc_name
+ .endif
+ .word 0
+ .endif
+.endm
+
+.macro sign_check_s2 reloc_sym reloc_name reloc_bits
+ .ifdef \reloc_sym
+ .ifdef overflow
+ .reloc 0, R_LARCH_SOP_PUSH_ABSOLUTE, (1 << (\reloc_bits - 1)) << 2
+ .reloc 0, \reloc_name
+ .else
+ .reloc 0, R_LARCH_SOP_PUSH_ABSOLUTE, (-(1 << (\reloc_bits - 1)) - 1) << 2
+ .reloc 0, \reloc_name
+ .endif
+ .word 0
+ .endif
+.endm
+
+.macro unsign_check reloc_sym reloc_name reloc_bits
+ .ifdef \reloc_sym
+ .reloc 0, R_LARCH_SOP_PUSH_ABSOLUTE, 1 << \reloc_bits
+ .reloc 0, \reloc_name
+ .word 0
+ .endif
+.endm
+
+sign_check s_10_5 R_LARCH_SOP_POP_32_S_10_5 5
+sign_check s_10_12 R_LARCH_SOP_POP_32_S_10_12 12
+sign_check s_10_16 R_LARCH_SOP_POP_32_S_10_16 16
+sign_check_s2 s_10_16_s2 R_LARCH_SOP_POP_32_S_10_16_S2 16
+sign_check_s2 s_0_5_10_16_s2 R_LARCH_SOP_POP_32_S_0_5_10_16_S2 21
+sign_check_s2 s_0_10_10_16_s2 R_LARCH_SOP_POP_32_S_0_10_10_16_S2 26
+sign_check s_5_20 R_LARCH_SOP_POP_32_S_5_20 20
+unsign_check u_10_12 R_LARCH_SOP_POP_32_U_10_12 12
+unsign_check u R_LARCH_SOP_POP_32_U 32
diff --git a/ld/testsuite/ld-loongarch-elf/abi2_max_imm.s b/ld/testsuite/ld-loongarch-elf/abi2_max_imm.s
new file mode 100644
index 0000000..f1bc386
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/abi2_max_imm.s
@@ -0,0 +1,24 @@
+ .text
+.ifdef b16
+ beq $a0, $a1, low
+ beq $a0, $a1, high
+.endif
+.ifdef b21
+ beqz $a0, low
+ beqz $a0, high
+.endif
+.ifdef b26
+ b low
+ b high
+.endif
+.ifdef pcrel20
+ .reloc 0, R_LARCH_PCREL20_S2, low
+ pcaddi $a0, 0
+ .reloc 4, R_LARCH_PCREL20_S2, high
+ pcaddi $a0, 0
+.endif
+
+ .section ".low"
+low: nop
+ .section ".high"
+high: nop
diff --git a/ld/testsuite/ld-loongarch-elf/abi2_overflows.s b/ld/testsuite/ld-loongarch-elf/abi2_overflows.s
new file mode 100644
index 0000000..1c25bd8
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/abi2_overflows.s
@@ -0,0 +1,24 @@
+ .text
+
+.set idx, 0
+.ifdef underflow
+ nop
+ .set idx, 4
+.endif
+
+.ifdef b16
+ beq $a0, $a1, local_sym
+.endif
+.ifdef b21
+ beqz $a0, local_sym
+.endif
+.ifdef b26
+ b local_sym
+.endif
+.ifdef pcrel20
+ .reloc idx, R_LARCH_PCREL20_S2, local_sym
+ pcaddi $a0, 0
+.endif
+
+ .section ".local_sym"
+local_sym: nop
diff --git a/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp b/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp
index 3ae0d9d..2ad783f 100644
--- a/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp
+++ b/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp
@@ -35,6 +35,22 @@ if [istarget "loongarch64-*-*"] {
run_dump_test "anno-sym"
run_dump_test "pcala64"
run_dump_test "tls-le"
+ run_dump_test "overflow_s_10_5"
+ run_dump_test "overflow_s_10_12"
+ run_dump_test "overflow_s_10_16"
+ run_dump_test "overflow_s_10_16_s2"
+ run_dump_test "overflow_s_0_5_10_16_s2"
+ run_dump_test "overflow_s_0_10_10_16_s2"
+ run_dump_test "overflow_s_5_20"
+ run_dump_test "overflow_u_10_12"
+ run_dump_test "overflow_u"
+ run_dump_test "underflow_s_10_5"
+ run_dump_test "underflow_s_10_12"
+ run_dump_test "underflow_s_10_16"
+ run_dump_test "underflow_s_10_16_s2"
+ run_dump_test "underflow_s_0_5_10_16_s2"
+ run_dump_test "underflow_s_0_10_10_16_s2"
+ run_dump_test "underflow_s_5_20"
}
if [istarget "loongarch32-*-*"] {
@@ -95,6 +111,16 @@ if [istarget "loongarch64-*-*"] {
{} \
"medium-call" \
] \
+ [list \
+ "abi1_max_imm" \
+ "-e 0x0" "" \
+ "" \
+ {abi1_max_imm.s} \
+ [list \
+ [list objdump -D abi1_max_imm.dd] \
+ ] \
+ "abi1_max_imm" \
+ ] \
]
}
@@ -108,3 +134,16 @@ if [istarget "loongarch64-*-*"] {
run_dump_test "desc-relax"
}
}
+
+run_dump_test "max_imm_b16"
+run_dump_test "max_imm_b21"
+run_dump_test "max_imm_b26"
+run_dump_test "max_imm_pcrel20"
+run_dump_test "overflow_b16"
+run_dump_test "overflow_b21"
+run_dump_test "overflow_b26"
+run_dump_test "overflow_pcrel20"
+run_dump_test "underflow_b16"
+run_dump_test "underflow_b21"
+run_dump_test "underflow_b26"
+run_dump_test "underflow_pcrel20"
diff --git a/ld/testsuite/ld-loongarch-elf/max_imm_b16.d b/ld/testsuite/ld-loongarch-elf/max_imm_b16.d
new file mode 100644
index 0000000..2c3f6cd
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/max_imm_b16.d
@@ -0,0 +1,9 @@
+#source: abi2_max_imm.s
+#as: --defsym b16=1
+#ld: -e 0 -Ttext 0x20000000 --section-start=.low=0x1ffe0000 --section-start=.high=0x20020000
+#objdump: -s
+
+#...
+Contents of section .text:
+ 20000000 8500005a 85fcff59.*
+#pass
diff --git a/ld/testsuite/ld-loongarch-elf/max_imm_b21.d b/ld/testsuite/ld-loongarch-elf/max_imm_b21.d
new file mode 100644
index 0000000..5861fb4
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/max_imm_b21.d
@@ -0,0 +1,9 @@
+#source: abi2_max_imm.s
+#as: --defsym b21=1
+#ld: -e 0 -Ttext 0x20000000 --section-start=.low=0x1fc00000 --section-start=.high=0x20400000
+#objdump: -s
+
+#...
+Contents of section .text:
+ 20000000 90000040 8ffcff43.*
+#pass
diff --git a/ld/testsuite/ld-loongarch-elf/max_imm_b26.d b/ld/testsuite/ld-loongarch-elf/max_imm_b26.d
new file mode 100644
index 0000000..f475ccb
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/max_imm_b26.d
@@ -0,0 +1,9 @@
+#source: abi2_max_imm.s
+#as: --defsym b26=1
+#ld: -e 0 -Ttext 0x20000000 --section-start=.low=0x18000000 --section-start=.high=0x28000000
+#objdump: -s
+
+#...
+Contents of section .text:
+ 20000000 00020050 fffdff53.*
+#pass
diff --git a/ld/testsuite/ld-loongarch-elf/max_imm_pcrel20.d b/ld/testsuite/ld-loongarch-elf/max_imm_pcrel20.d
new file mode 100644
index 0000000..4bd9d2f
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/max_imm_pcrel20.d
@@ -0,0 +1,9 @@
+#source: abi2_max_imm.s
+#as: --defsym pcrel20=1
+#ld: -e 0 -Ttext 0x20000000 --section-start=.low=0x1fe00000 --section-start=.high=0x20200000
+#objdump: -s
+
+#...
+Contents of section .text:
+ 20000000 04000019 e4ffff18.*
+#pass
diff --git a/ld/testsuite/ld-loongarch-elf/overflow_b16.d b/ld/testsuite/ld-loongarch-elf/overflow_b16.d
new file mode 100644
index 0000000..26cad41
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/overflow_b16.d
@@ -0,0 +1,4 @@
+#source: abi2_overflows.s
+#as: --defsym overflow=1 --defsym b16=1
+#ld: -e 0 --section-start=.local_sym=0x20020000 -Ttext 0x20000000
+#error: .*relocation truncated to fit: R_LARCH_B16 against `local_sym'
diff --git a/ld/testsuite/ld-loongarch-elf/overflow_b21.d b/ld/testsuite/ld-loongarch-elf/overflow_b21.d
new file mode 100644
index 0000000..826856f
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/overflow_b21.d
@@ -0,0 +1,4 @@
+#source: abi2_overflows.s
+#as: --defsym overflow=1 --defsym b21=1
+#ld: -e 0 --section-start=.local_sym=0x20400000 -Ttext 0x20000000
+#error: .*relocation truncated to fit: R_LARCH_B21 against `local_sym'
diff --git a/ld/testsuite/ld-loongarch-elf/overflow_b26.d b/ld/testsuite/ld-loongarch-elf/overflow_b26.d
new file mode 100644
index 0000000..474e575
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/overflow_b26.d
@@ -0,0 +1,4 @@
+#source: abi2_overflows.s
+#as: --defsym overflow=1 --defsym b26=1
+#ld: -e 0 --section-start=.local_sym=0x28000000 -Ttext 0x20000000
+#error: .*relocation truncated to fit: R_LARCH_B26 against `local_sym'
diff --git a/ld/testsuite/ld-loongarch-elf/overflow_pcrel20.d b/ld/testsuite/ld-loongarch-elf/overflow_pcrel20.d
new file mode 100644
index 0000000..420be72
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/overflow_pcrel20.d
@@ -0,0 +1,4 @@
+#source: abi2_overflows.s
+#as: --defsym overflow=1 --defsym pcrel20=1
+#ld: -e 0 --section-start=.local_sym=0x20200000 -Ttext 0x20000000
+#error: .*relocation truncated to fit: R_LARCH_PCREL20_S2 against `local_sym'
diff --git a/ld/testsuite/ld-loongarch-elf/overflow_s_0_10_10_16_s2.d b/ld/testsuite/ld-loongarch-elf/overflow_s_0_10_10_16_s2.d
new file mode 100644
index 0000000..621054b
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/overflow_s_0_10_10_16_s2.d
@@ -0,0 +1,4 @@
+#source: abi1_sops.s
+#as: --defsym overflow=1 --defsym s_0_10_10_16_s2=1
+#ld: -e 0
+#error: .*relocation truncated to fit: R_LARCH_SOP_POP_32_S_0_10_10_16_S2 against `<nameless>' \ No newline at end of file
diff --git a/ld/testsuite/ld-loongarch-elf/overflow_s_0_5_10_16_s2.d b/ld/testsuite/ld-loongarch-elf/overflow_s_0_5_10_16_s2.d
new file mode 100644
index 0000000..348f5ae
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/overflow_s_0_5_10_16_s2.d
@@ -0,0 +1,4 @@
+#source: abi1_sops.s
+#as: --defsym overflow=1 --defsym s_0_5_10_16_s2=1
+#ld: -e 0
+#error: .*relocation truncated to fit: R_LARCH_SOP_POP_32_S_0_5_10_16_S2 against `<nameless>' \ No newline at end of file
diff --git a/ld/testsuite/ld-loongarch-elf/overflow_s_10_12.d b/ld/testsuite/ld-loongarch-elf/overflow_s_10_12.d
new file mode 100644
index 0000000..dcadff7
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/overflow_s_10_12.d
@@ -0,0 +1,4 @@
+#source: abi1_sops.s
+#as: --defsym overflow=1 --defsym s_10_12=1
+#ld: -e 0
+#error: .*relocation truncated to fit: R_LARCH_SOP_POP_32_S_10_12 against `<nameless>' \ No newline at end of file
diff --git a/ld/testsuite/ld-loongarch-elf/overflow_s_10_16.d b/ld/testsuite/ld-loongarch-elf/overflow_s_10_16.d
new file mode 100644
index 0000000..3677415
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/overflow_s_10_16.d
@@ -0,0 +1,4 @@
+#source: abi1_sops.s
+#as: --defsym overflow=1 --defsym s_10_16=1
+#ld: -e 0
+#error: .*relocation truncated to fit: R_LARCH_SOP_POP_32_S_10_16 against `<nameless>' \ No newline at end of file
diff --git a/ld/testsuite/ld-loongarch-elf/overflow_s_10_16_s2.d b/ld/testsuite/ld-loongarch-elf/overflow_s_10_16_s2.d
new file mode 100644
index 0000000..24ffa81
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/overflow_s_10_16_s2.d
@@ -0,0 +1,4 @@
+#source: abi1_sops.s
+#as: --defsym overflow=1 --defsym s_10_16_s2=1
+#ld: -e 0
+#error: .*relocation truncated to fit: R_LARCH_SOP_POP_32_S_10_16_S2 against `<nameless>' \ No newline at end of file
diff --git a/ld/testsuite/ld-loongarch-elf/overflow_s_10_5.d b/ld/testsuite/ld-loongarch-elf/overflow_s_10_5.d
new file mode 100644
index 0000000..7881457
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/overflow_s_10_5.d
@@ -0,0 +1,4 @@
+#source: abi1_sops.s
+#as: --defsym overflow=1 --defsym s_10_5=1
+#ld: -e 0
+#error: .*relocation truncated to fit: R_LARCH_SOP_POP_32_S_10_5 against `<nameless>' \ No newline at end of file
diff --git a/ld/testsuite/ld-loongarch-elf/overflow_s_5_20.d b/ld/testsuite/ld-loongarch-elf/overflow_s_5_20.d
new file mode 100644
index 0000000..5f06eed
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/overflow_s_5_20.d
@@ -0,0 +1,4 @@
+#source: abi1_sops.s
+#as: --defsym overflow=1 --defsym s_5_20=1
+#ld: -e 0
+#error: .*relocation truncated to fit: R_LARCH_SOP_POP_32_S_5_20 against `<nameless>' \ No newline at end of file
diff --git a/ld/testsuite/ld-loongarch-elf/overflow_u.d b/ld/testsuite/ld-loongarch-elf/overflow_u.d
new file mode 100644
index 0000000..96906f6
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/overflow_u.d
@@ -0,0 +1,4 @@
+#source: abi1_sops.s
+#as: --defsym overflow=1 --defsym u=1
+#ld: -e 0
+#error: .*relocation truncated to fit: R_LARCH_SOP_POP_32_U against `<nameless>' \ No newline at end of file
diff --git a/ld/testsuite/ld-loongarch-elf/overflow_u_10_12.d b/ld/testsuite/ld-loongarch-elf/overflow_u_10_12.d
new file mode 100644
index 0000000..9d8e090
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/overflow_u_10_12.d
@@ -0,0 +1,4 @@
+#source: abi1_sops.s
+#as: --defsym overflow=1 --defsym u_10_12=1
+#ld: -e 0
+#error: .*relocation truncated to fit: R_LARCH_SOP_POP_32_U_10_12 against `<nameless>' \ No newline at end of file
diff --git a/ld/testsuite/ld-loongarch-elf/underflow_b16.d b/ld/testsuite/ld-loongarch-elf/underflow_b16.d
new file mode 100644
index 0000000..e2e2194
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/underflow_b16.d
@@ -0,0 +1,4 @@
+#source: abi2_overflows.s
+#as: --defsym underflow=1 --defsym b16=1
+#ld: -e 0 --section-start=.local_sym=0x1ffe0000 -Ttext 0x20000000
+#error: .*relocation truncated to fit: R_LARCH_B16 against `local_sym'
diff --git a/ld/testsuite/ld-loongarch-elf/underflow_b21.d b/ld/testsuite/ld-loongarch-elf/underflow_b21.d
new file mode 100644
index 0000000..6f56526
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/underflow_b21.d
@@ -0,0 +1,4 @@
+#source: abi2_overflows.s
+#as: --defsym underflow=1 --defsym b21=1
+#ld: -e 0 --section-start=.local_sym=0x1fc00000 -Ttext 0x20000000
+#error: .*relocation truncated to fit: R_LARCH_B21 against `local_sym'
diff --git a/ld/testsuite/ld-loongarch-elf/underflow_b26.d b/ld/testsuite/ld-loongarch-elf/underflow_b26.d
new file mode 100644
index 0000000..5756cc1
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/underflow_b26.d
@@ -0,0 +1,4 @@
+#source: abi2_overflows.s
+#as: --defsym underflow=1 --defsym b26=1
+#ld: -e 0 --section-start=.local_sym=0x18000000 -Ttext 0x20000000
+#error: .*relocation truncated to fit: R_LARCH_B26 against `local_sym'
diff --git a/ld/testsuite/ld-loongarch-elf/underflow_pcrel20.d b/ld/testsuite/ld-loongarch-elf/underflow_pcrel20.d
new file mode 100644
index 0000000..e65c60a
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/underflow_pcrel20.d
@@ -0,0 +1,4 @@
+#source: abi2_overflows.s
+#as: --defsym underflow=1 --defsym pcrel20=1
+#ld: -e 0 --section-start=.local_sym=0x1fe00000 -Ttext 0x20000000
+#error: .*relocation truncated to fit: R_LARCH_PCREL20_S2 against `local_sym'
diff --git a/ld/testsuite/ld-loongarch-elf/underflow_s_0_10_10_16_s2.d b/ld/testsuite/ld-loongarch-elf/underflow_s_0_10_10_16_s2.d
new file mode 100644
index 0000000..3e7715a
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/underflow_s_0_10_10_16_s2.d
@@ -0,0 +1,4 @@
+#source: abi1_sops.s
+#as: --defsym underflow=1 --defsym s_0_10_10_16_s2=1
+#ld: -e 0
+#error: .*relocation truncated to fit: R_LARCH_SOP_POP_32_S_0_10_10_16_S2 against `<nameless>' \ No newline at end of file
diff --git a/ld/testsuite/ld-loongarch-elf/underflow_s_0_5_10_16_s2.d b/ld/testsuite/ld-loongarch-elf/underflow_s_0_5_10_16_s2.d
new file mode 100644
index 0000000..14be5a9
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/underflow_s_0_5_10_16_s2.d
@@ -0,0 +1,4 @@
+#source: abi1_sops.s
+#as: --defsym underflow=1 --defsym s_0_5_10_16_s2=1
+#ld: -e 0
+#error: .*relocation truncated to fit: R_LARCH_SOP_POP_32_S_0_5_10_16_S2 against `<nameless>' \ No newline at end of file
diff --git a/ld/testsuite/ld-loongarch-elf/underflow_s_10_12.d b/ld/testsuite/ld-loongarch-elf/underflow_s_10_12.d
new file mode 100644
index 0000000..ed9fe9b
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/underflow_s_10_12.d
@@ -0,0 +1,4 @@
+#source: abi1_sops.s
+#as: --defsym underflow=1 --defsym s_10_12=1
+#ld: -e 0
+#error: .*relocation truncated to fit: R_LARCH_SOP_POP_32_S_10_12 against `<nameless>' \ No newline at end of file
diff --git a/ld/testsuite/ld-loongarch-elf/underflow_s_10_16.d b/ld/testsuite/ld-loongarch-elf/underflow_s_10_16.d
new file mode 100644
index 0000000..03b851b
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/underflow_s_10_16.d
@@ -0,0 +1,4 @@
+#source: abi1_sops.s
+#as: --defsym underflow=1 --defsym s_10_16=1
+#ld: -e 0
+#error: .*relocation truncated to fit: R_LARCH_SOP_POP_32_S_10_16 against `<nameless>' \ No newline at end of file
diff --git a/ld/testsuite/ld-loongarch-elf/underflow_s_10_16_s2.d b/ld/testsuite/ld-loongarch-elf/underflow_s_10_16_s2.d
new file mode 100644
index 0000000..c0e4ca0
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/underflow_s_10_16_s2.d
@@ -0,0 +1,4 @@
+#source: abi1_sops.s
+#as: --defsym underflow=1 --defsym s_10_16_s2=1
+#ld: -e 0
+#error: .*relocation truncated to fit: R_LARCH_SOP_POP_32_S_10_16_S2 against `<nameless>' \ No newline at end of file
diff --git a/ld/testsuite/ld-loongarch-elf/underflow_s_10_5.d b/ld/testsuite/ld-loongarch-elf/underflow_s_10_5.d
new file mode 100644
index 0000000..77d0eb0
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/underflow_s_10_5.d
@@ -0,0 +1,4 @@
+#source: abi1_sops.s
+#as: --defsym underflow=1 --defsym s_10_5=1
+#ld: -e 0
+#error: .*relocation truncated to fit: R_LARCH_SOP_POP_32_S_10_5 against `<nameless>' \ No newline at end of file
diff --git a/ld/testsuite/ld-loongarch-elf/underflow_s_5_20.d b/ld/testsuite/ld-loongarch-elf/underflow_s_5_20.d
new file mode 100644
index 0000000..c458bb8
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/underflow_s_5_20.d
@@ -0,0 +1,4 @@
+#source: abi1_sops.s
+#as: --defsym underflow=1 --defsym s_5_20=1
+#ld: -e 0
+#error: .*relocation truncated to fit: R_LARCH_SOP_POP_32_S_5_20 against `<nameless>' \ No newline at end of file