aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@novell.com>2005-01-31 10:01:02 +0000
committerJan Beulich <jbeulich@novell.com>2005-01-31 10:01:02 +0000
commitd3156ecc655da60ddcc1f846ae55f943548205cb (patch)
tree33303ea8806cdd6a659f78030150dd4acb963e30 /gas
parent75e0991382fb4617434490056616fab346359fc2 (diff)
downloadgdb-d3156ecc655da60ddcc1f846ae55f943548205cb.zip
gdb-d3156ecc655da60ddcc1f846ae55f943548205cb.tar.gz
gdb-d3156ecc655da60ddcc1f846ae55f943548205cb.tar.bz2
gas/
2005-01-31 Jan Beulich <jbeulich@novell.com> * config/tc-ia64.c (parse_operands): Parse all specified operands, immediately discarding (but counting) those exceeding the maximum possible amount. Track whether output and input operand counts ever matched, and use this to better indicate which of the operands/ operand types was wrong; specifically don't default to pointing to the first operand. gas/testsuite/ 2005-01-31 Jan Beulich <jbeulich@novell.com> * gas/ia64/operands.[ls]: New. * gas/ia64/ia64.exp: Run new test.
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog9
-rw-r--r--gas/config/tc-ia64.c39
-rw-r--r--gas/testsuite/ChangeLog5
-rw-r--r--gas/testsuite/gas/ia64/ia64.exp1
-rw-r--r--gas/testsuite/gas/ia64/operands.l5
-rw-r--r--gas/testsuite/gas/ia64/operands.s6
6 files changed, 55 insertions, 10 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 0af5769..c110faf 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,5 +1,14 @@
2005-01-31 Jan Beulich <jbeulich@novell.com>
+ * config/tc-ia64.c (parse_operands): Parse all specified operands,
+ immediately discarding (but counting) those exceeding the maximum
+ possible amount. Track whether output and input operand counts ever
+ matched, and use this to better indicate which of the operands/
+ operand types was wrong; specifically don't default to pointing to
+ the first operand.
+
+2005-01-31 Jan Beulich <jbeulich@novell.com>
+
* config/tc-ia64.c (unwind): Remove proc_end (now an automatic
variable in dot_endp). Add body and insn. Make prologue,
prologue_mask, body, and insn bitfields.
diff --git a/gas/config/tc-ia64.c b/gas/config/tc-ia64.c
index 7d87cc5..f6a6002 100644
--- a/gas/config/tc-ia64.c
+++ b/gas/config/tc-ia64.c
@@ -5956,11 +5956,22 @@ parse_operands (idesc)
++num_outputs;
}
- for (; i < NELEMS (CURR_SLOT.opnd); ++i)
+ for (; ; ++i)
{
- sep = parse_operand (CURR_SLOT.opnd + i);
- if (CURR_SLOT.opnd[i].X_op == O_absent)
- break;
+ if (i < NELEMS (CURR_SLOT.opnd))
+ {
+ sep = parse_operand (CURR_SLOT.opnd + i);
+ if (CURR_SLOT.opnd[i].X_op == O_absent)
+ break;
+ }
+ else
+ {
+ expressionS dummy;
+
+ sep = parse_operand (&dummy);
+ if (dummy.X_op == O_absent)
+ break;
+ }
++num_operands;
@@ -6014,14 +6025,22 @@ parse_operands (idesc)
}
}
- highest_unmatched_operand = 0;
+ highest_unmatched_operand = -4;
curr_out_of_range_pos = -1;
error_pos = 0;
- expected_operand = idesc->operands[0];
for (; idesc; idesc = get_next_opcode (idesc))
{
if (num_outputs != idesc->num_outputs)
continue; /* mismatch in # of outputs */
+ if (highest_unmatched_operand < 0)
+ highest_unmatched_operand |= 1;
+ if (num_operands > NELEMS (idesc->operands)
+ || (num_operands < NELEMS (idesc->operands)
+ && idesc->operands[num_operands])
+ || (num_operands > 0 && !idesc->operands[num_operands - 1]))
+ continue; /* mismatch in number of arguments */
+ if (highest_unmatched_operand < 0)
+ highest_unmatched_operand |= 2;
CURR_SLOT.num_fixups = 0;
@@ -6074,10 +6093,6 @@ parse_operands (idesc)
continue;
}
- if (num_operands < NELEMS (idesc->operands)
- && idesc->operands[num_operands])
- continue; /* mismatch in number of arguments */
-
break;
}
if (!idesc)
@@ -6086,6 +6101,10 @@ parse_operands (idesc)
as_bad ("Operand %u of `%s' should be %s",
error_pos + 1, mnemonic,
elf64_ia64_operands[expected_operand].desc);
+ else if (highest_unmatched_operand < 0 && !(highest_unmatched_operand & 1))
+ as_bad ("Wrong number of output operands");
+ else if (highest_unmatched_operand < 0 && !(highest_unmatched_operand & 2))
+ as_bad ("Wrong number of input operands");
else
as_bad ("Operand mismatch");
return 0;
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index 353e3ff..860a9a9 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2005-01-31 Jan Beulich <jbeulich@novell.com>
+ * gas/ia64/operands.[ls]: New.
+ * gas/ia64/ia64.exp: Run new test.
+
+2005-01-31 Jan Beulich <jbeulich@novell.com>
+
* gas/ia64/proc.[ls]: New.
* gas/ia64/unwind-err.[ls]: New.
* gas/ia64/ia64.exp: Run new tests.
diff --git a/gas/testsuite/gas/ia64/ia64.exp b/gas/testsuite/gas/ia64/ia64.exp
index c5dc9e1..89c5d20 100644
--- a/gas/testsuite/gas/ia64/ia64.exp
+++ b/gas/testsuite/gas/ia64/ia64.exp
@@ -27,6 +27,7 @@ if [istarget "ia64-*"] then {
run_dump_test "pseudo"
run_dump_test "nop_x"
run_dump_test "mov-ar"
+ run_list_test "operands" ""
run_list_test "dv-raw-err" ""
run_list_test "dv-waw-err" ""
diff --git a/gas/testsuite/gas/ia64/operands.l b/gas/testsuite/gas/ia64/operands.l
new file mode 100644
index 0000000..440c78b
--- /dev/null
+++ b/gas/testsuite/gas/ia64/operands.l
@@ -0,0 +1,5 @@
+.*: Assembler messages:
+.*:3: Error: .* output .*
+.*:4: Error: .* input .*
+.*:5: Error: .* 1 .*
+.*:6: Error: .* 2 .*
diff --git a/gas/testsuite/gas/ia64/operands.s b/gas/testsuite/gas/ia64/operands.s
new file mode 100644
index 0000000..08f4ec1
--- /dev/null
+++ b/gas/testsuite/gas/ia64/operands.s
@@ -0,0 +1,6 @@
+ .text
+_start:
+ zxt1 r1, r2 = r3
+ zxt2 r4 = r5, r6
+ zxt4 p1 = r8
+ sxt1 r7 = 0