[Asm] Improve "too few operands" errors
authorOliver Stannard <oliver.stannard@arm.com>
Tue, 21 Nov 2017 15:16:50 +0000 (15:16 +0000)
committerOliver Stannard <oliver.stannard@arm.com>
Tue, 21 Nov 2017 15:16:50 +0000 (15:16 +0000)
- 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
llvm/test/MC/ARM/diagnostics.s
llvm/test/MC/ARM/ldrd-strd-gnu-bad-inst.s
llvm/test/MC/ARM/thumb-diagnostics.s
llvm/test/MC/ARM/thumb2-diagnostics.s
llvm/utils/TableGen/AsmMatcherEmitter.cpp

index 1d59cd1..2690eed 100644 (file)
@@ -10168,6 +10168,7 @@ ARMAsmParser::FilterNearMisses(SmallVectorImpl<NearMissInfo> &NearMissesIn,
   // to only report the widest one.
   std::multimap<unsigned, unsigned> OperandMissesSeen;
   SmallSet<uint64_t, 4> 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<NearMissInfo> &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:
index 92272f6..42e8b6a 100644 (file)
@@ -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
index 49c7eb1..e080538 100644 (file)
@@ -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]
index dd543b1..51658ce 100644 (file)
 @ 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
index 851afb8..b784d79 100644 (file)
@@ -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
index 4fe060b..72fb530 100644 (file)
@@ -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";