From e5b8557d5bc58c96f590b7aa400f9e75e0a3b22f Mon Sep 17 00:00:00 2001 From: Sjoerd Meijer Date: Mon, 24 Apr 2017 08:22:20 +0000 Subject: [PATCH] [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 --- .../Target/AArch64/AsmParser/AArch64AsmParser.cpp | 12 +++++------- llvm/test/MC/AArch64/basic-a64-diagnostics.s | 12 ++++++++++++ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp index d7bbc2bcd22c..4dbcc9581a84 100644 --- a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp +++ b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp @@ -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( diff --git a/llvm/test/MC/AArch64/basic-a64-diagnostics.s b/llvm/test/MC/AArch64/basic-a64-diagnostics.s index d37c0d5aba2a..ab3e50e374e7 100644 --- a/llvm/test/MC/AArch64/basic-a64-diagnostics.s +++ b/llvm/test/MC/AArch64/basic-a64-diagnostics.s @@ -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