diff options
author | Jan Beulich <jbeulich@novell.com> | 2005-01-31 10:01:02 +0000 |
---|---|---|
committer | Jan Beulich <jbeulich@novell.com> | 2005-01-31 10:01:02 +0000 |
commit | d3156ecc655da60ddcc1f846ae55f943548205cb (patch) | |
tree | 33303ea8806cdd6a659f78030150dd4acb963e30 /gas | |
parent | 75e0991382fb4617434490056616fab346359fc2 (diff) | |
download | gdb-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/ChangeLog | 9 | ||||
-rw-r--r-- | gas/config/tc-ia64.c | 39 | ||||
-rw-r--r-- | gas/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gas/testsuite/gas/ia64/ia64.exp | 1 | ||||
-rw-r--r-- | gas/testsuite/gas/ia64/operands.l | 5 | ||||
-rw-r--r-- | gas/testsuite/gas/ia64/operands.s | 6 |
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 |