ARM: fix assert on unpredictable POP instruction.

POP instructions are aliased to the ARM LDM variants but have different syntax.
This caused two problems: we tried to access a non-existent operand to annotate
the '!', and the error message didn't make much sense.

With some vigorous hand-waving in the error message both problems can be
fixed.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@193322 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Tim Northover 2013-10-24 09:37:18 +00:00
parent 1a03bec227
commit cdd776d13f
3 changed files with 9 additions and 8 deletions

View File

@ -5466,9 +5466,8 @@ validateInstruction(MCInst &Inst,
case ARM::t2STMIA_UPD: case ARM::t2STMIA_UPD:
case ARM::t2STMDB_UPD: { case ARM::t2STMDB_UPD: {
if (listContainsReg(Inst, 3, Inst.getOperand(0).getReg())) if (listContainsReg(Inst, 3, Inst.getOperand(0).getReg()))
return Error(Operands[4]->getStartLoc(), return Error(Operands.back()->getStartLoc(),
"writeback operator '!' not allowed when base register " "writeback register not allowed in register list");
"in register list");
break; break;
} }
case ARM::tMUL: { case ARM::tMUL: {

View File

@ -433,6 +433,8 @@
ldm r2!, {r2, r3} ldm r2!, {r2, r3}
ldmdb r2!, {r2, r3} ldmdb r2!, {r2, r3}
ldmda r2!, {r2, r3} ldmda r2!, {r2, r3}
@ CHECK-ERRORS: error: writeback operator '!' not allowed when base register in register list popeq {sp}
@ CHECK-ERRORS: error: writeback operator '!' not allowed when base register in register list @ CHECK-ERRORS: error: writeback register not allowed in register list
@ CHECK-ERRORS: error: writeback operator '!' not allowed when base register in register list @ CHECK-ERRORS: error: writeback register not allowed in register list
@ CHECK-ERRORS: error: writeback register not allowed in register list
@ CHECK-ERRORS: error: writeback register not allowed in register list

View File

@ -71,7 +71,7 @@ error: invalid operand for instruction
@ CHECK-ERRORS-V8: error: writeback operator '!' not allowed when base register in register list @ CHECK-ERRORS-V8: error: writeback operator '!' not allowed when base register in register list
@ CHECK-ERRORS-V8: ldm r2!, {r2, r3, r4, r10} @ CHECK-ERRORS-V8: ldm r2!, {r2, r3, r4, r10}
@ CHECK-ERRORS-V8: ^ @ CHECK-ERRORS-V8: ^
@ CHECK-ERRORS-V8: error: writeback operator '!' not allowed when base register in register list @ CHECK-ERRORS-V8: error: writeback register not allowed in register list
@ CHECK-ERRORS-V8: ldmdb r2!, {r2, r3, r4} @ CHECK-ERRORS-V8: ldmdb r2!, {r2, r3, r4}
@ CHECK-ERRORS-V8: ^ @ CHECK-ERRORS-V8: ^
@ -100,7 +100,7 @@ error: invalid operand for instruction
@ CHECK-ERRORS-V8: error: writeback operator '!' not allowed when base register in register list @ CHECK-ERRORS-V8: error: writeback operator '!' not allowed when base register in register list
@ CHECK-ERRORS-V8: stm r2!, {r2, r9} @ CHECK-ERRORS-V8: stm r2!, {r2, r9}
@ CHECK-ERRORS-V8: ^ @ CHECK-ERRORS-V8: ^
@ CHECK-ERRORS-V8: error: writeback operator '!' not allowed when base register in register list @ CHECK-ERRORS-V8: error: writeback register not allowed in register list
@ CHECK-ERRORS-V8: stmdb r2!, {r0, r2} @ CHECK-ERRORS-V8: stmdb r2!, {r0, r2}
@ CHECK-ERRORS-V8: ^ @ CHECK-ERRORS-V8: ^