From 03a8a16f327a80608f8c8c55afbcbb8f72abef30 Mon Sep 17 00:00:00 2001 From: Jim Grosbach Date: Thu, 14 Jul 2011 22:04:21 +0000 Subject: [PATCH] ARM diagnostic when 's' suffix on mnemonic that can't set flags. For example, "mlss r0, r1, r2, r3". The MLS instruction does not have a flag-setting variant. llvm-svn: 135203 --- llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp | 16 +++++++++------- llvm/test/MC/ARM/diagnostics.s | 6 ++++++ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp index bdcdd7966ebd..a4741270c7a5 100644 --- a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp +++ b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp @@ -2071,20 +2071,22 @@ bool ARMAsmParser::ParseInstruction(StringRef Name, SMLoc NameLoc, bool CanAcceptCarrySet, CanAcceptPredicationCode; GetMnemonicAcceptInfo(Head, CanAcceptCarrySet, CanAcceptPredicationCode); + // If we had a carry-set on an instruction that can't do that, issue an + // error. + if (!CanAcceptCarrySet && CarrySetting) { + Parser.EatToEndOfStatement(); + return Error(NameLoc, "instruction '" + Head + + "' can not set flags, but 's' suffix specified"); + } + // Add the carry setting operand, if necessary. // // FIXME: It would be awesome if we could somehow invent a location such that // match errors on this operand would print a nice diagnostic about how the // 's' character in the mnemonic resulted in a CCOut operand. - if (CanAcceptCarrySet) { + if (CanAcceptCarrySet) Operands.push_back(ARMOperand::CreateCCOut(CarrySetting ? ARM::CPSR : 0, NameLoc)); - } else { - // This mnemonic can't ever accept a carry set, but the user wrote one (or - // misspelled another mnemonic). - - // FIXME: Issue a nice error. - } // Add the predication code operand, if necessary. if (CanAcceptPredicationCode) { diff --git a/llvm/test/MC/ARM/diagnostics.s b/llvm/test/MC/ARM/diagnostics.s index 7a9d85e94492..4537a0ff6dff 100644 --- a/llvm/test/MC/ARM/diagnostics.s +++ b/llvm/test/MC/ARM/diagnostics.s @@ -3,6 +3,12 @@ @ Check for various assembly diagnostic messages on invalid input. +@ 's' bit on an instruction that can't accept it. + mlss r1, r2, r3, r4 +@ CHECK-ERRORS: error: instruction 'mls' can not set flags, +@ CHECK-ERRORS: but 's' suffix specified + + @ Out of range shift immediate values. adc r1, r2, r3, lsl #invalid adc r4, r5, r6, lsl #-1