From 1e73e95f3c82fcfdd9cd817d0b5989b697e4b05d Mon Sep 17 00:00:00 2001 From: Oliver Stannard Date: Tue, 21 Nov 2017 15:16:50 +0000 Subject: [PATCH] [Asm] Improve "too few operands" errors - We can still emit this error if the actual instruction has two or more operands missing compared to the expected one. - We should only emit this error once per instruction. Differential revision: https://reviews.llvm.org/D36746 llvm-svn: 318770 --- llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp | 10 +++++++--- llvm/test/MC/ARM/diagnostics.s | 6 ++++++ llvm/test/MC/ARM/ldrd-strd-gnu-bad-inst.s | 16 ++++++++-------- llvm/test/MC/ARM/thumb-diagnostics.s | 9 +++++++++ llvm/test/MC/ARM/thumb2-diagnostics.s | 6 ++++++ llvm/utils/TableGen/AsmMatcherEmitter.cpp | 2 +- 6 files changed, 37 insertions(+), 12 deletions(-) diff --git a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp index 1d59cd1..2690eed 100644 --- a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp +++ b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp @@ -10168,6 +10168,7 @@ ARMAsmParser::FilterNearMisses(SmallVectorImpl &NearMissesIn, // to only report the widest one. std::multimap OperandMissesSeen; SmallSet FeatureMissesSeen; + bool ReportedTooFewOperands = false; // Process the near-misses in reverse order, so that we see more general ones // first, and so can avoid emitting more specific ones. @@ -10288,9 +10289,12 @@ ARMAsmParser::FilterNearMisses(SmallVectorImpl &NearMissesIn, break; } case NearMissInfo::NearMissTooFewOperands: { - SMLoc EndLoc = ((ARMOperand &)*Operands.back()).getEndLoc(); - NearMissesOut.emplace_back( - NearMissMessage{ EndLoc, StringRef("too few operands for instruction") }); + if (!ReportedTooFewOperands) { + SMLoc EndLoc = ((ARMOperand &)*Operands.back()).getEndLoc(); + NearMissesOut.emplace_back(NearMissMessage{ + EndLoc, StringRef("too few operands for instruction")}); + ReportedTooFewOperands = true; + } break; } case NearMissInfo::NoNearMiss: diff --git a/llvm/test/MC/ARM/diagnostics.s b/llvm/test/MC/ARM/diagnostics.s index 92272f6..42e8b6a 100644 --- a/llvm/test/MC/ARM/diagnostics.s +++ b/llvm/test/MC/ARM/diagnostics.s @@ -736,3 +736,9 @@ foo2: @ CHECK-ERRORS: error: immediate operand must an even number in the range [0, 30] @ CHECK-ERRORS: error: immediate operand must a number in the range [0, 255] @ CHECK-ERRORS: error: immediate operand must an even number in the range [0, 30] + + @ Generic error for too few operands + adds + adds r0 +@ CHECK-ERRORS: error: too few operands for instruction +@ CHECK-ERRORS: error: too few operands for instruction diff --git a/llvm/test/MC/ARM/ldrd-strd-gnu-bad-inst.s b/llvm/test/MC/ARM/ldrd-strd-gnu-bad-inst.s index 49c7eb12..e080538 100644 --- a/llvm/test/MC/ARM/ldrd-strd-gnu-bad-inst.s +++ b/llvm/test/MC/ARM/ldrd-strd-gnu-bad-inst.s @@ -2,26 +2,26 @@ .text .thumb -@ CHECK: error: invalid instruction +@ CHECK: error: too few operands for instruction strd -@ CHECK: error: invalid instruction +@ CHECK: error: too few operands for instruction ldrd -@ CHECK: error: invalid instruction +@ CHECK: error: too few operands for instruction strd r0 -@ CHECK: error: invalid instruction +@ CHECK: error: too few operands for instruction ldrd r0 @ CHECK: error: invalid instruction strd s0, [r0] @ CHECK: error: invalid instruction ldrd s0, [r0] .arm -@ CHECK: error: invalid instruction +@ CHECK: error: too few operands for instruction strd -@ CHECK: error: invalid instruction +@ CHECK: error: too few operands for instruction ldrd -@ CHECK: error: invalid instruction +@ CHECK: error: too few operands for instruction strd r0 -@ CHECK: error: invalid instruction +@ CHECK: error: too few operands for instruction ldrd r0 @ CHECK: error: invalid instruction strd s0, [r0] diff --git a/llvm/test/MC/ARM/thumb-diagnostics.s b/llvm/test/MC/ARM/thumb-diagnostics.s index dd543b1..51658ce 100644 --- a/llvm/test/MC/ARM/thumb-diagnostics.s +++ b/llvm/test/MC/ARM/thumb-diagnostics.s @@ -351,3 +351,12 @@ @ CHECK-ERRORS: error: invalid instruction @ CHECK-ERRORS: error: invalid instruction @ CHECK-ERRORS: error: invalid instruction + +@------------------------------------------------------------------------------ +@ Generic error for too few operands +@------------------------------------------------------------------------------ + + adds + adds r0 +@ CHECK-ERRORS: error: too few operands for instruction +@ CHECK-ERRORS: error: too few operands for instruction diff --git a/llvm/test/MC/ARM/thumb2-diagnostics.s b/llvm/test/MC/ARM/thumb2-diagnostics.s index 851afb8..b784d79 100644 --- a/llvm/test/MC/ARM/thumb2-diagnostics.s +++ b/llvm/test/MC/ARM/thumb2-diagnostics.s @@ -145,3 +145,9 @@ foo2: @ CHECK-ERRORS-V7: error: instruction requires: arm-mode @ CHECK-ERRORS-V8: error: invalid instruction @ CHECK-ERRORS-V8: error: invalid instruction + + @ Generic error for too few operands + adds + adds r0 +@ CHECK-ERRORS: error: too few operands for instruction +@ CHECK-ERRORS: error: too few operands for instruction diff --git a/llvm/utils/TableGen/AsmMatcherEmitter.cpp b/llvm/utils/TableGen/AsmMatcherEmitter.cpp index 4fe060b..72fb530 100644 --- a/llvm/utils/TableGen/AsmMatcherEmitter.cpp +++ b/llvm/utils/TableGen/AsmMatcherEmitter.cpp @@ -3313,7 +3313,7 @@ void AsmMatcherEmitter::run(raw_ostream &OS) { OS << " DEBUG_WITH_TYPE(\"asm-matcher\", dbgs() << \"recording too-few-operands near miss\\n\");\n"; OS << " OperandNearMiss =\n"; OS << " NearMissInfo::getTooFewOperands(Formal, it->Opcode);\n"; - OS << " } else {\n"; + OS << " } else if (OperandNearMiss.getKind() != NearMissInfo::NearMissTooFewOperands) {\n"; OS << " // If more than one operand is invalid, give up on this match entry.\n"; OS << " DEBUG_WITH_TYPE(\n"; OS << " \"asm-matcher\",\n"; -- 2.7.4