[binutils-gdb] LoongArch: ld: Fix other pop relocs overflow check and add tests

liu & zhensong liuzhensong@sourceware.org
Tue Feb 27 03:59:14 GMT 2024


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=b98da8583a500419c976bcfd56b80b02b1afceff

commit b98da8583a500419c976bcfd56b80b02b1afceff
Author: Jinyang He <hejinyang@loongson.cn>
Date:   Tue Sep 5 10:31:28 2023 +0800

    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.

Diff:
---
 bfd/elfxx-loongarch.c                              | 34 ++++++++++++-----
 ld/testsuite/ld-loongarch-elf/abi1_max_imm.dd      | 18 +++++++++
 ld/testsuite/ld-loongarch-elf/abi1_max_imm.s       | 39 ++++++++++++++++++++
 ld/testsuite/ld-loongarch-elf/abi1_sops.s          | 43 ++++++++++++++++++++++
 ld/testsuite/ld-loongarch-elf/abi2_max_imm.s       | 24 ++++++++++++
 ld/testsuite/ld-loongarch-elf/abi2_overflows.s     | 24 ++++++++++++
 ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp | 39 ++++++++++++++++++++
 ld/testsuite/ld-loongarch-elf/max_imm_b16.d        |  9 +++++
 ld/testsuite/ld-loongarch-elf/max_imm_b21.d        |  9 +++++
 ld/testsuite/ld-loongarch-elf/max_imm_b26.d        |  9 +++++
 ld/testsuite/ld-loongarch-elf/max_imm_pcrel20.d    |  9 +++++
 ld/testsuite/ld-loongarch-elf/overflow_b16.d       |  4 ++
 ld/testsuite/ld-loongarch-elf/overflow_b21.d       |  4 ++
 ld/testsuite/ld-loongarch-elf/overflow_b26.d       |  4 ++
 ld/testsuite/ld-loongarch-elf/overflow_pcrel20.d   |  4 ++
 .../ld-loongarch-elf/overflow_s_0_10_10_16_s2.d    |  4 ++
 .../ld-loongarch-elf/overflow_s_0_5_10_16_s2.d     |  4 ++
 ld/testsuite/ld-loongarch-elf/overflow_s_10_12.d   |  4 ++
 ld/testsuite/ld-loongarch-elf/overflow_s_10_16.d   |  4 ++
 .../ld-loongarch-elf/overflow_s_10_16_s2.d         |  4 ++
 ld/testsuite/ld-loongarch-elf/overflow_s_10_5.d    |  4 ++
 ld/testsuite/ld-loongarch-elf/overflow_s_5_20.d    |  4 ++
 ld/testsuite/ld-loongarch-elf/overflow_u.d         |  4 ++
 ld/testsuite/ld-loongarch-elf/overflow_u_10_12.d   |  4 ++
 ld/testsuite/ld-loongarch-elf/underflow_b16.d      |  4 ++
 ld/testsuite/ld-loongarch-elf/underflow_b21.d      |  4 ++
 ld/testsuite/ld-loongarch-elf/underflow_b26.d      |  4 ++
 ld/testsuite/ld-loongarch-elf/underflow_pcrel20.d  |  4 ++
 .../ld-loongarch-elf/underflow_s_0_10_10_16_s2.d   |  4 ++
 .../ld-loongarch-elf/underflow_s_0_5_10_16_s2.d    |  4 ++
 ld/testsuite/ld-loongarch-elf/underflow_s_10_12.d  |  4 ++
 ld/testsuite/ld-loongarch-elf/underflow_s_10_16.d  |  4 ++
 .../ld-loongarch-elf/underflow_s_10_16_s2.d        |  4 ++
 ld/testsuite/ld-loongarch-elf/underflow_s_10_5.d   |  4 ++
 ld/testsuite/ld-loongarch-elf/underflow_s_5_20.d   |  4 ++
 35 files changed, 344 insertions(+), 9 deletions(-)

diff --git a/bfd/elfxx-loongarch.c b/bfd/elfxx-loongarch.c
index fe19ec836f9..e1d3b65bb69 100644
--- a/bfd/elfxx-loongarch.c
+++ b/bfd/elfxx-loongarch.c
@@ -55,6 +55,8 @@ static bool
 reloc_bits (bfd *abfd, reloc_howto_type *howto, bfd_vma *val);
 static bool
 reloc_sign_bits (bfd *abfd, reloc_howto_type *howto, bfd_vma *fix_val);
+static bool
+reloc_unsign_bits (bfd *abfd, reloc_howto_type *howto, bfd_vma *fix_val);
 
 static bfd_reloc_status_type
 loongarch_elf_add_sub_reloc (bfd *, arelent *, asymbol *, void *,
@@ -415,7 +417,7 @@ static loongarch_reloc_howto_type loongarch_howto_table[] =
 	 0x7c00,				  /* dst_mask */
 	 false,					  /* pcrel_offset */
 	 BFD_RELOC_LARCH_SOP_POP_32_S_10_5,	  /* bfd_reloc_code_real_type */
-	 reloc_bits,				  /* adjust_reloc_bits */
+	 reloc_sign_bits,			  /* adjust_reloc_bits */
 	 NULL),					  /* larch_reloc_type_name */
 
   LOONGARCH_HOWTO (R_LARCH_SOP_POP_32_U_10_12,	  /* type (39).  */
@@ -432,7 +434,7 @@ static loongarch_reloc_howto_type loongarch_howto_table[] =
 	 0x3ffc00,				  /* dst_mask */
 	 false,					  /* pcrel_offset */
 	 BFD_RELOC_LARCH_SOP_POP_32_U_10_12,	  /* bfd_reloc_code_real_type */
-	 reloc_bits,				  /* adjust_reloc_bits */
+	 reloc_unsign_bits,			  /* adjust_reloc_bits */
 	 NULL),					  /* larch_reloc_type_name */
 
   LOONGARCH_HOWTO (R_LARCH_SOP_POP_32_S_10_12,	  /* type (40).  */
@@ -449,7 +451,7 @@ static loongarch_reloc_howto_type loongarch_howto_table[] =
 	 0x3ffc00,				  /* dst_mask */
 	 false,					  /* pcrel_offset */
 	 BFD_RELOC_LARCH_SOP_POP_32_S_10_12,	  /* bfd_reloc_code_real_type */
-	 reloc_bits,				  /* adjust_reloc_bits */
+	 reloc_sign_bits,			  /* adjust_reloc_bits */
 	 NULL),					  /* larch_reloc_type_name */
 
   LOONGARCH_HOWTO (R_LARCH_SOP_POP_32_S_10_16,	  /* type (41).  */
@@ -466,7 +468,7 @@ static loongarch_reloc_howto_type loongarch_howto_table[] =
 	 0x3fffc00,				  /* dst_mask */
 	 false,					  /* pcrel_offset */
 	 BFD_RELOC_LARCH_SOP_POP_32_S_10_16,	  /* bfd_reloc_code_real_type */
-	 reloc_bits,				  /* adjust_reloc_bits */
+	 reloc_sign_bits,			  /* adjust_reloc_bits */
 	 NULL),					  /* larch_reloc_type_name */
 
   LOONGARCH_HOWTO (R_LARCH_SOP_POP_32_S_10_16_S2, /* type (42).  */
@@ -500,7 +502,7 @@ static loongarch_reloc_howto_type loongarch_howto_table[] =
 	 0x1ffffe0,				  /* dst_mask */
 	 false,					  /* pcrel_offset */
 	 BFD_RELOC_LARCH_SOP_POP_32_S_5_20,	  /* bfd_reloc_code_real_type */
-	 reloc_bits,				  /* adjust_reloc_bits */
+	 reloc_sign_bits,			  /* adjust_reloc_bits */
 	 NULL),					  /* larch_reloc_type_name */
 
   LOONGARCH_HOWTO (R_LARCH_SOP_POP_32_S_0_5_10_16_S2,
@@ -554,7 +556,7 @@ static loongarch_reloc_howto_type loongarch_howto_table[] =
 	 0x00000000ffffffff,			/* dst_mask */
 	 false,					/* pcrel_offset */
 	 BFD_RELOC_LARCH_SOP_POP_32_U,		/* bfd_reloc_code_real_type */
-	 reloc_bits,				/* adjust_reloc_bits */
+	 reloc_unsign_bits,			/* adjust_reloc_bits */
 	 NULL),					/* larch_reloc_type_name */
 
   /* 8-bit in-place addition, for local label subtraction.  */
@@ -1991,9 +1993,11 @@ reloc_bits (bfd *abfd ATTRIBUTE_UNUSED,
 }
 
 static bool
-reloc_sign_bits (bfd *abfd, reloc_howto_type *howto, bfd_vma *fix_val)
+reloc_bits_sanity (bfd *abfd, reloc_howto_type *howto, bfd_vma *fix_val,
+		   unsigned int sign)
 {
-  if (howto->complain_on_overflow != complain_overflow_signed)
+  if ((sign && howto->complain_on_overflow != complain_overflow_signed)
+      || (!sign && howto->complain_on_overflow != complain_overflow_unsigned))
     return false;
 
   bfd_signed_vma val = (bfd_signed_vma)(*fix_val);
@@ -2014,7 +2018,7 @@ reloc_sign_bits (bfd *abfd, reloc_howto_type *howto, bfd_vma *fix_val)
     }
 
   bfd_signed_vma mask = ((bfd_signed_vma)0x1 << (howto->bitsize
-			  + howto->rightshift - 1)) - 1;
+			  + howto->rightshift - sign)) - 1;
 
   /* Positive number: high part is all 0;
      Negative number: if high part is not all 0, high part must be all 1.
@@ -2064,6 +2068,18 @@ reloc_sign_bits (bfd *abfd, reloc_howto_type *howto, bfd_vma *fix_val)
   return true;
 }
 
+static bool
+reloc_sign_bits (bfd *abfd, reloc_howto_type *howto, bfd_vma *fix_val)
+{
+  return reloc_bits_sanity (abfd, howto, fix_val, 1);
+}
+
+static bool
+reloc_unsign_bits (bfd *abfd, reloc_howto_type *howto, bfd_vma *fix_val)
+{
+  return reloc_bits_sanity (abfd, howto, fix_val, 0);
+}
+
 bool
 loongarch_adjust_reloc_bitsfield (bfd *abfd, reloc_howto_type *howto,
 				  bfd_vma *fix_val)
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 00000000000..c852714087b
--- /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 00000000000..02507f19cf9
--- /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 00000000000..34f2d592064
--- /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 00000000000..f1bc3868f73
--- /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 00000000000..1c25bd8c577
--- /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 3ae0d9df3b4..2ad783fbae1 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 00000000000..2c3f6cdbd8c
--- /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 00000000000..5861fb464a3
--- /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 00000000000..f475ccb324f
--- /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 00000000000..4bd9d2f1169
--- /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 00000000000..26cad414bf1
--- /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 00000000000..826856f2066
--- /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 00000000000..474e575103e
--- /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 00000000000..420be7290f5
--- /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 00000000000..621054b1d7a
--- /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 00000000000..348f5ae93aa
--- /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 00000000000..dcadff7e0aa
--- /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 00000000000..3677415afbb
--- /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 00000000000..24ffa811af1
--- /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 00000000000..7881457d05e
--- /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 00000000000..5f06eed8c6a
--- /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 00000000000..96906f64399
--- /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 00000000000..9d8e0905652
--- /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 00000000000..e2e21949ba0
--- /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 00000000000..6f56526b5b4
--- /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 00000000000..5756cc14c07
--- /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 00000000000..e65c60ad7aa
--- /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 00000000000..3e7715a274b
--- /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 00000000000..14be5a9c6f6
--- /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 00000000000..ed9fe9b70e3
--- /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 00000000000..03b851b57b6
--- /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 00000000000..c0e4ca039e6
--- /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 00000000000..77d0eb04e5a
--- /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 00000000000..c458bb815a5
--- /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


More information about the Binutils-cvs mailing list