[Arch64AsmParser] better diagnostic for isb

Instruction isb takes as an operand either 'sy' or an immediate value. This
improves the diagnostic when the string is not 'sy' and adds a test case for
this which was missing. This also adds tests to check invalid inputs for dsb
and dmb.

Differential Revision: https://reviews.llvm.org/D32227

llvm-svn: 301165
This commit is contained in:
Sjoerd Meijer 2017-04-24 08:22:20 +00:00
parent b70e88bdec
commit e5b8557d5b
2 changed files with 17 additions and 7 deletions

View File

@ -2473,16 +2473,14 @@ AArch64AsmParser::tryParseBarrierOperand(OperandVector &Operands) {
return MatchOperand_ParseFail;
}
auto DB = AArch64DB::lookupDBByName(Tok.getString());
if (!DB) {
TokError("invalid barrier option name");
return MatchOperand_ParseFail;
}
// The only valid named option for ISB is 'sy'
if (Mnemonic == "isb" && DB->Encoding != AArch64DB::sy) {
auto DB = AArch64DB::lookupDBByName(Tok.getString());
if (Mnemonic == "isb" && (!DB || DB->Encoding != AArch64DB::sy)) {
TokError("'sy' or #imm operand expected");
return MatchOperand_ParseFail;
} else if (!DB) {
TokError("invalid barrier option name");
return MatchOperand_ParseFail;
}
Operands.push_back(AArch64Operand::CreateBarrier(

View File

@ -3273,29 +3273,41 @@
dsb #-1
dsb #16
dsb foo
dmb #-1
dmb #16
dmb foo
// CHECK-ERROR-NEXT: error: {{Invalid immediate for instruction|barrier operand out of range}}
// CHECK-ERROR-NEXT: dsb #-1
// CHECK-ERROR-NEXT: ^
// CHECK-ERROR-NEXT: error: {{Invalid immediate for instruction|barrier operand out of range}}
// CHECK-ERROR-NEXT: dsb #16
// CHECK-ERROR-NEXT: ^
// CHECK-ERROR-NEXT: error: invalid barrier option name
// CHECK-ERROR-NEXT: dsb foo
// CHECK-ERROR-NEXT: ^
// CHECK-ERROR-NEXT: error: {{Invalid immediate for instruction|barrier operand out of range}}
// CHECK-ERROR-NEXT: dmb #-1
// CHECK-ERROR-NEXT: ^
// CHECK-ERROR-NEXT: error: {{Invalid immediate for instruction|barrier operand out of range}}
// CHECK-ERROR-NEXT: dmb #16
// CHECK-ERROR-NEXT: ^
// CHECK-ERROR-NEXT: error: invalid barrier option name
// CHECK-ERROR-NEXT: dmb foo
// CHECK-ERROR-NEXT: ^
isb #-1
isb #16
isb foo
// CHECK-ERROR-NEXT: error: {{Invalid immediate for instruction|barrier operand out of range}}
// CHECK-ERROR-NEXT: isb #-1
// CHECK-ERROR-NEXT: ^
// CHECK-ERROR-NEXT: error: {{Invalid immediate for instruction|barrier operand out of range}}
// CHECK-ERROR-NEXT: isb #16
// CHECK-ERROR-NEXT: ^
// CHECK-ERROR-NEXT: error: 'sy' or #imm operand expected
// CHECK-ERROR-NEXT: isb foo
// CHECK-ERROR-NEXT: ^
msr daifset, x4
msr spsel, #-1