This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] ia64: enhance error messages for alloc operands


When one of the supposedly immediate operands of alloc weren't
constant,
the output operand wasn't be parsed at all, resulting in error
messages
about wrong operands to always refer to that operand.

Built and tested on ia64-unknown-linux-gnu.

Jan

gas/
2005-09-27  Jan Beulich  <jbeulich@novell.com>

	* config/tc-ia64.c (parse_operands): Always parse first operand
of
	alloc.

gas/testsuite/
2005-09-27  Jan Beulich  <jbeulich@novell.com>

	* gas/ia64/alloc.[sl]: New.
	* gas/ia64/ia64.exp: Run new test.

---
/home/jbeulich/src/binutils/mainline/2005-09-27/gas/config/tc-ia64.c	2005-09-26
08:41:21.000000000 +0200
+++ 2005-09-27/gas/config/tc-ia64.c	2005-09-26 11:14:53.000000000
+0200
@@ -6278,34 +6278,38 @@ parse_operands (idesc)
   if (idesc->operands[2] == IA64_OPND_SOF
       || idesc->operands[1] == IA64_OPND_SOF)
     {
-      /* map alloc r1=ar.pfs,i,l,o,r to alloc
r1=ar.pfs,(i+l+o),(i+l),r */
+      /* Map alloc r1=ar.pfs,i,l,o,r to alloc
r1=ar.pfs,(i+l+o),(i+l),r.
+	 Note, however, that due to that mapping operand numbers in
error
+	 messages for any of the constant operands will not be correct. 
*/
       know (strcmp (idesc->name, "alloc") == 0);
-      i = (CURR_SLOT.opnd[1].X_op == O_register
-          && CURR_SLOT.opnd[1].X_add_number == REG_AR + AR_PFS) ? 2 :
1;
-      if (num_operands == i + 3 /* first_arg not included in this
count! */
-	  && CURR_SLOT.opnd[i].X_op == O_constant
-	  && CURR_SLOT.opnd[i + 1].X_op == O_constant
-	  && CURR_SLOT.opnd[i + 2].X_op == O_constant
-	  && CURR_SLOT.opnd[i + 3].X_op == O_constant)
-	{
-	  sof = set_regstack (CURR_SLOT.opnd[i].X_add_number,
-			      CURR_SLOT.opnd[i + 1].X_add_number,
-			      CURR_SLOT.opnd[i + 2].X_add_number,
-			      CURR_SLOT.opnd[i + 3].X_add_number);
-
-	  /* now we can parse the first arg:  */
-	  saved_input_pointer = input_line_pointer;
-	  input_line_pointer = first_arg;
-	  sep = parse_operand (CURR_SLOT.opnd + 0, '=');
-	  if (sep != '=')
-	    --num_outputs;	/* force error */
-	  input_line_pointer = saved_input_pointer;
-
-	  CURR_SLOT.opnd[i].X_add_number = sof;
-	  CURR_SLOT.opnd[i + 1].X_add_number
-	    = sof - CURR_SLOT.opnd[i + 2].X_add_number;
-	  CURR_SLOT.opnd[i + 2] = CURR_SLOT.opnd[i + 3];
-	}
+      /* The first operand hasn't been parsed/initialized, yet (but
+	 num_operands intentionally doesn't account for that).  */
+      i = num_operands > 4 ? 2 : 1;
+#define FORCE_CONST(n) (CURR_SLOT.opnd[n].X_op == O_constant \
+			? CURR_SLOT.opnd[n].X_add_number \
+			: 0)
+      sof = set_regstack (FORCE_CONST(i),
+			  FORCE_CONST(i + 1),
+			  FORCE_CONST(i + 2),
+			  FORCE_CONST(i + 3));
+#undef FORCE_CONST
+
+      /* now we can parse the first arg:  */
+      saved_input_pointer = input_line_pointer;
+      input_line_pointer = first_arg;
+      sep = parse_operand (CURR_SLOT.opnd + 0, '=');
+      if (sep != '=')
+	--num_outputs;	/* force error */
+      input_line_pointer = saved_input_pointer;
+
+      CURR_SLOT.opnd[i].X_add_number = sof;
+      if (CURR_SLOT.opnd[i + 1].X_op == O_constant
+	  && CURR_SLOT.opnd[i + 2].X_op == O_constant)
+	CURR_SLOT.opnd[i + 1].X_add_number
+	  = sof - CURR_SLOT.opnd[i + 2].X_add_number;
+      else
+	CURR_SLOT.opnd[i + 1].X_op = O_illegal;
+      CURR_SLOT.opnd[i + 2] = CURR_SLOT.opnd[i + 3];
     }
 
   highest_unmatched_operand = -4;
---
/home/jbeulich/src/binutils/mainline/2005-09-27/gas/testsuite/gas/ia64/alloc.l	1970-01-01
01:00:00.000000000 +0100
+++ 2005-09-27/gas/testsuite/gas/ia64/alloc.l	2005-09-15
10:53:54.000000000 +0200
@@ -0,0 +1,11 @@
+# Currently in the error messages the operand numbers for the
constants
+# aren't correct, which is why the patterns only check for ranges.
+.*: Assembler messages:
+.*:7: Error: Operand [345] of .alloc. should be .*
+.*:8: Error: Operand [345] of .alloc. should be .*
+.*:9: Error: Operand [345] of .alloc. should be .*
+.*:10: Error: Operand [56] of .alloc. should be .*
+.*:11: Error: Operand [234] of .alloc. should be .*
+.*:12: Error: Operand [234] of .alloc. should be .*
+.*:13: Error: Operand [234] of .alloc. should be .*
+.*:14: Error: Operand [45] of .alloc. should be .*
---
/home/jbeulich/src/binutils/mainline/2005-09-27/gas/testsuite/gas/ia64/alloc.s	1970-01-01
01:00:00.000000000 +0100
+++ 2005-09-27/gas/testsuite/gas/ia64/alloc.s	2005-09-15
10:54:04.000000000 +0200
@@ -0,0 +1,14 @@
+// Make sure error messages on 'alloc' don't needlessly refer to
operand 1
+// (which gets parsed late) when only one of the other operands is
wrong.
+
+	.text
+
+alloc:
+	alloc		r2 = ar.pfs, x, 0, 0, 0
+	alloc		r2 = ar.pfs, 0, x, 0, 0
+	alloc		r2 = ar.pfs, 0, 0, x, 0
+	alloc		r2 = ar.pfs, 0, 0, 0, x
+	alloc		r3 = x, 0, 0, 0
+	alloc		r3 = 0, x, 0, 0
+	alloc		r3 = 0, 0, x, 0
+	alloc		r3 = 0, 0, 0, x
---
/home/jbeulich/src/binutils/mainline/2005-09-27/gas/testsuite/gas/ia64/ia64.exp	2005-06-16
17:01:14.000000000 +0200
+++ 2005-09-27/gas/testsuite/gas/ia64/ia64.exp	2005-09-26
11:46:26.000000000 +0200
@@ -76,6 +76,7 @@ if [istarget "ia64-*"] then {
 	run_dump_test "group-2"
     }
 
+    run_list_test "alloc" ""
     run_dump_test "bundling"
     run_list_test "label" ""
     run_list_test "last" ""

Attachment: binutils-mainline-ia64-alloc-diag.patch
Description: Binary data


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]