summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp10
-rw-r--r--llvm/test/MC/ARM/diagnostics.s6
-rw-r--r--llvm/test/MC/ARM/ldrd-strd-gnu-bad-inst.s16
-rw-r--r--llvm/test/MC/ARM/thumb-diagnostics.s9
-rw-r--r--llvm/test/MC/ARM/thumb2-diagnostics.s6
-rw-r--r--llvm/utils/TableGen/AsmMatcherEmitter.cpp2
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 1d59cd1a745..2690eed45cd 100644
--- a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
+++ b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
@@ -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:
diff --git a/llvm/test/MC/ARM/diagnostics.s b/llvm/test/MC/ARM/diagnostics.s
index 92272f68da5..42e8b6a6128 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 49c7eb12a91..e080538eeac 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 dd543b1ac80..51658cec48a 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 851afb81633..b784d79fa43 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 4fe060b05fa..72fb53053fd 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";
OpenPOWER on IntegriCloud