forked from OSchip/llvm-project
[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
This commit is contained in:
parent
6e94331259
commit
1e73e95f3c
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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";
|
||||
|
|
Loading…
Reference in New Issue