From 8e5f1d4de286c5443a1f0034fb9f8921b99b5f4c 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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@301165 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp | 12 +++++------- test/MC/AArch64/basic-a64-diagnostics.s | 12 ++++++++++++ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp b/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp index d7bbc2bcd22..4dbcc9581a8 100644 --- a/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp +++ b/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/test/MC/AArch64/basic-a64-diagnostics.s b/test/MC/AArch64/basic-a64-diagnostics.s index d37c0d5aba2..ab3e50e374e 100644 --- a/test/MC/AArch64/basic-a64-diagnostics.s +++ b/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 -- 2.40.0