[binutils-gdb] s390: Be more verbose about missing operand type

Jens Remus jremus@sourceware.org
Fri Mar 1 12:22:41 GMT 2024


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

commit 5c97cb1c80994462632ba7c62a54a3fbecaff2ca
Author: Jens Remus <jremus@linux.ibm.com>
Date:   Fri Mar 1 12:45:14 2024 +0100

    s390: Be more verbose about missing operand type
    
    Provide expected operand type in s390-specific assembler operand parsing
    error message:
    
    "error: operand <operand-number>: missing <operand-type> operand"
    
    With <operand-type> being one of:
    - base register
    - displacement
    - [vector] index register
    - length
    - access register
    - control register
    - floating-point register
    - general-purpose register
    - vector register
    - [un]signed number
    
    gas/
            * config/tc-s390.c: Provide missing operand type in error
            message.
            * testsuite/gas/s390/zarch-base-index-0-err.l: Update test case
            result validation patterns to operand number in operand syntax
            error messages.
            * testsuite/gas/s390/zarch-omitted-base-index-err.l: Likewise.
    
    Reviewed-by: Andreas Krebbel <krebbel@linux.ibm.com>
    Signed-off-by: Jens Remus <jremus@linux.ibm.com>

Diff:
---
 gas/config/tc-s390.c                               | 38 +++++++++++++++++++++-
 gas/testsuite/gas/s390/zarch-base-index-0-err.l    | 30 ++++++++---------
 .../gas/s390/zarch-omitted-base-index-err.l        |  4 +--
 3 files changed, 54 insertions(+), 18 deletions(-)

diff --git a/gas/config/tc-s390.c b/gas/config/tc-s390.c
index a2f499bd5ba..659c6af392b 100644
--- a/gas/config/tc-s390.c
+++ b/gas/config/tc-s390.c
@@ -1329,6 +1329,41 @@ s390_elf_cons (int nbytes /* 1=.byte, 2=.word, 4=.long */)
   demand_empty_rest_of_line ();
 }
 
+static const char *
+operand_type_str(const struct s390_operand * operand)
+{
+  if (operand->flags & S390_OPERAND_BASE)
+    return _("base register");
+  else if (operand->flags & S390_OPERAND_DISP)
+    return _("displacement");
+  else if (operand->flags & S390_OPERAND_INDEX)
+    {
+      if (operand->flags & S390_OPERAND_VR)
+	return _("vector index register");
+      else
+	return _("index register");
+    }
+  else if (operand->flags & S390_OPERAND_LENGTH)
+    return _("length");
+  else if (operand->flags & S390_OPERAND_AR)
+    return _("access register");
+  else if (operand->flags & S390_OPERAND_CR)
+    return _("control register");
+  else if (operand->flags & S390_OPERAND_FPR)
+    return _("floating-point register");
+  else if (operand->flags & S390_OPERAND_GPR)
+    return _("general-purpose register");
+  else if (operand->flags & S390_OPERAND_VR)
+    return _("vector register");
+  else
+    {
+      if (operand->flags & S390_OPERAND_SIGNED)
+	return _("signed number");
+      else
+	return _("unsigned number");
+    }
+}
+
 /* Return true if all remaining operands in the opcode with
    OPCODE_FLAGS can be skipped.  */
 static bool
@@ -1431,7 +1466,8 @@ md_gather_operands (char *str,
 	{
 	  if (opindex_ptr[0] == '\0')
 	    break;
-	  as_bad (_("operand %d: missing operand"), operand_number);
+	  as_bad (_("operand %d: missing %s operand"), operand_number,
+		  operand_type_str(operand));
 	}
       else if (ex.X_op == O_register || ex.X_op == O_constant)
 	{
diff --git a/gas/testsuite/gas/s390/zarch-base-index-0-err.l b/gas/testsuite/gas/s390/zarch-base-index-0-err.l
index 6332d994349..26187c93d4b 100644
--- a/gas/testsuite/gas/s390/zarch-base-index-0-err.l
+++ b/gas/testsuite/gas/s390/zarch-base-index-0-err.l
@@ -16,9 +16,9 @@
 .*:16: Error: bad expression
 .*:16: Error: operand 2: syntax error; missing '\)' after base register
 .*:17: Error: operand 1: operand out of range \(0 is not between 1 and 256\)
-.*:18: Error: operand 1: missing operand
-.*:19: Error: operand 1: missing operand
-.*:20: Error: operand 1: missing operand
+.*:18: Error: operand 1: missing length operand
+.*:19: Error: operand 1: missing length operand
+.*:20: Error: operand 1: missing length operand
 .*:21: Error: bad expression
 .*:21: Error: operand 1: operand out of range \(0 is not between 1 and 256\)
 .*:21: Error: operand 1: operand out of range \(32 is not between 0 and 15\)
@@ -31,9 +31,9 @@
 .*:22: Error: operand 1: syntax error; missing '\(' after displacement
 .*:23: Error: operand 1: invalid length field specified
 .*:26: Error: operand 1: operand out of range \(0 is not between 1 and 16\)
-.*:27: Error: operand 1: missing operand
-.*:28: Error: operand 1: missing operand
-.*:29: Error: operand 1: missing operand
+.*:27: Error: operand 1: missing length operand
+.*:28: Error: operand 1: missing length operand
+.*:29: Error: operand 1: missing length operand
 .*:30: Error: bad expression
 .*:30: Error: operand 1: operand out of range \(0 is not between 1 and 16\)
 .*:30: Error: operand 1: operand out of range \(32 is not between 0 and 15\)
@@ -42,21 +42,21 @@
 .*:30: Error: found ',', expected: '\)'
 .*:31: Error: operand 1: syntax error; missing '\(' after displacement
 .*:32: Error: operand 2: operand out of range \(0 is not between 1 and 16\)
-.*:33: Error: operand 2: missing operand
-.*:34: Error: operand 2: missing operand
-.*:35: Error: operand 2: missing operand
+.*:33: Error: operand 2: missing length operand
+.*:34: Error: operand 2: missing length operand
+.*:35: Error: operand 2: missing length operand
 .*:36: Error: bad expression
 .*:36: Error: operand 2: operand out of range \(0 is not between 1 and 16\)
 .*:36: Error: operand 2: syntax error; expected ','
 .*:37: Error: operand 2: syntax error; missing '\(' after displacement
 .*:38: Error: operand 1: operand out of range \(0 is not between 1 and 16\)
 .*:38: Error: operand 2: operand out of range \(0 is not between 1 and 16\)
-.*:39: Error: operand 1: missing operand
-.*:39: Error: operand 2: missing operand
-.*:40: Error: operand 1: missing operand
-.*:40: Error: operand 2: missing operand
-.*:41: Error: operand 1: missing operand
-.*:41: Error: operand 2: missing operand
+.*:39: Error: operand 1: missing length operand
+.*:39: Error: operand 2: missing length operand
+.*:40: Error: operand 1: missing length operand
+.*:40: Error: operand 2: missing length operand
+.*:41: Error: operand 1: missing length operand
+.*:41: Error: operand 2: missing length operand
 .*:42: Error: bad expression
 .*:42: Error: operand 1: operand out of range \(0 is not between 1 and 16\)
 .*:42: Error: operand 1: operand out of range \(32 is not between 0 and 15\)
diff --git a/gas/testsuite/gas/s390/zarch-omitted-base-index-err.l b/gas/testsuite/gas/s390/zarch-omitted-base-index-err.l
index b2ee382b0f9..9ff6392915e 100644
--- a/gas/testsuite/gas/s390/zarch-omitted-base-index-err.l
+++ b/gas/testsuite/gas/s390/zarch-omitted-base-index-err.l
@@ -6,8 +6,8 @@
 .*:11: Warning: operand 2: expected general register name as base register
 .*:12: Error: bad expression
 .*:12: Error: operand 2: syntax error; missing '\)' after base register
-.*:15: Error: operand 1: missing operand
-.*:16: Error: operand 1: missing operand
+.*:15: Error: operand 1: missing length operand
+.*:16: Error: operand 1: missing length operand
 .*:17: Error: operand 1: invalid length field specified
 .*:18: Error: bad expression
 .*:18: Error: operand 1: operand out of range \(0 is not between 1 and 256\)


More information about the Binutils-cvs mailing list