diff options
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp | 10 | ||||
-rw-r--r-- | llvm/test/MC/ARM/diagnostics.s | 6 | ||||
-rw-r--r-- | llvm/test/MC/ARM/ldrd-strd-gnu-bad-inst.s | 16 | ||||
-rw-r--r-- | llvm/test/MC/ARM/thumb-diagnostics.s | 9 | ||||
-rw-r--r-- | llvm/test/MC/ARM/thumb2-diagnostics.s | 6 | ||||
-rw-r--r-- | 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 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"; |