[PATCH] as: fixed internal error when immediate value of relocation overflow.
Lulu Cai
cailulu@loongson.cn
Mon Oct 9 02:11:09 GMT 2023
The as reports an internal error when the relocation
overflow or is misaligned. Delete _bfd_error_handler
can avoid it and reports Reloc overflow.
---
bfd/elfxx-loongarch.c | 8 +-------
gas/testsuite/gas/loongarch/imm_overflow.d | 3 +++
gas/testsuite/gas/loongarch/imm_overflow.l | 2 ++
gas/testsuite/gas/loongarch/imm_overflow.s | 4 ++++
gas/testsuite/gas/loongarch/imm_unalign.d | 3 +++
gas/testsuite/gas/loongarch/imm_unalign.l | 2 ++
gas/testsuite/gas/loongarch/imm_unalign.s | 6 ++++++
7 files changed, 21 insertions(+), 7 deletions(-)
create mode 100644 gas/testsuite/gas/loongarch/imm_overflow.d
create mode 100644 gas/testsuite/gas/loongarch/imm_overflow.l
create mode 100644 gas/testsuite/gas/loongarch/imm_overflow.s
create mode 100644 gas/testsuite/gas/loongarch/imm_unalign.d
create mode 100644 gas/testsuite/gas/loongarch/imm_unalign.l
create mode 100644 gas/testsuite/gas/loongarch/imm_unalign.s
diff --git a/bfd/elfxx-loongarch.c b/bfd/elfxx-loongarch.c
index 0a595eb87d5..c20efe82f31 100644
--- a/bfd/elfxx-loongarch.c
+++ b/bfd/elfxx-loongarch.c
@@ -1671,7 +1671,7 @@ reloc_bits (bfd *abfd ATTRIBUTE_UNUSED,
}
static bool
-reloc_sign_bits (bfd *abfd, reloc_howto_type *howto, bfd_vma *fix_val)
+reloc_sign_bits (bfd *abfd ATTRIBUTE_UNUSED, reloc_howto_type *howto, bfd_vma *fix_val)
{
if (howto->complain_on_overflow != complain_overflow_signed)
return false;
@@ -1682,9 +1682,6 @@ reloc_sign_bits (bfd *abfd, reloc_howto_type *howto, bfd_vma *fix_val)
if (howto->rightshift
&& (val & ((((bfd_signed_vma) 1) << howto->rightshift) - 1)))
{
- (*_bfd_error_handler) (_("%pB: relocation %s right shift %d error 0x%lx"),
- abfd, howto->name, howto->rightshift, (long) val);
- bfd_set_error (bfd_error_bad_value);
return false;
}
@@ -1696,9 +1693,6 @@ reloc_sign_bits (bfd *abfd, reloc_howto_type *howto, bfd_vma *fix_val)
high part: from sign bit to highest bit. */
if ((val & ~mask) && ((val & ~mask) != ~mask))
{
- (*_bfd_error_handler) (_("%pB: relocation %s overflow 0x%lx"),
- abfd, howto->name, (long) val);
- bfd_set_error (bfd_error_bad_value);
return false;
}
diff --git a/gas/testsuite/gas/loongarch/imm_overflow.d b/gas/testsuite/gas/loongarch/imm_overflow.d
new file mode 100644
index 00000000000..1ead2c9a74f
--- /dev/null
+++ b/gas/testsuite/gas/loongarch/imm_overflow.d
@@ -0,0 +1,3 @@
+#as:
+#source: imm_overflow.s
+#warning_output: imm_overflow.l
diff --git a/gas/testsuite/gas/loongarch/imm_overflow.l b/gas/testsuite/gas/loongarch/imm_overflow.l
new file mode 100644
index 00000000000..3dd4d90ffa1
--- /dev/null
+++ b/gas/testsuite/gas/loongarch/imm_overflow.l
@@ -0,0 +1,2 @@
+.*Assembler messages:
+.*Warning: Reloc overflow
diff --git a/gas/testsuite/gas/loongarch/imm_overflow.s b/gas/testsuite/gas/loongarch/imm_overflow.s
new file mode 100644
index 00000000000..2be688bd25a
--- /dev/null
+++ b/gas/testsuite/gas/loongarch/imm_overflow.s
@@ -0,0 +1,4 @@
+.L1:
+ nop
+ .fill 0x12345, 4, 0
+ blt $r3, $r4, .L1
diff --git a/gas/testsuite/gas/loongarch/imm_unalign.d b/gas/testsuite/gas/loongarch/imm_unalign.d
new file mode 100644
index 00000000000..df1a8cf6041
--- /dev/null
+++ b/gas/testsuite/gas/loongarch/imm_unalign.d
@@ -0,0 +1,3 @@
+#as:
+#source: imm_unalign.s
+#warning_output: imm_unalign.l
diff --git a/gas/testsuite/gas/loongarch/imm_unalign.l b/gas/testsuite/gas/loongarch/imm_unalign.l
new file mode 100644
index 00000000000..3dd4d90ffa1
--- /dev/null
+++ b/gas/testsuite/gas/loongarch/imm_unalign.l
@@ -0,0 +1,2 @@
+.*Assembler messages:
+.*Warning: Reloc overflow
diff --git a/gas/testsuite/gas/loongarch/imm_unalign.s b/gas/testsuite/gas/loongarch/imm_unalign.s
new file mode 100644
index 00000000000..d97ada04d9f
--- /dev/null
+++ b/gas/testsuite/gas/loongarch/imm_unalign.s
@@ -0,0 +1,6 @@
+.L1:
+ .2byte 0x12
+
+.L2:
+ .fill 1, 4, 0
+ blt $r3, $r4, .L1
--
2.31.1
More information about the Binutils
mailing list