[ms-inline asm] Do not report a Parser error when matching inline assembly.

llvm-svn: 162306
This commit is contained in:
Chad Rosier 2012-08-21 19:36:59 +00:00
parent f737cb3b92
commit 3d4bc62a5c
2 changed files with 27 additions and 15 deletions

View File

@ -89,7 +89,8 @@ public:
MatchInstruction(SMLoc IDLoc,
SmallVectorImpl<MCParsedAsmOperand*> &Operands,
SmallVectorImpl<MCInst> &MCInsts,
unsigned &OrigErrorInfo) {
unsigned &OrigErrorInfo,
bool matchingInlineAsm = false) {
OrigErrorInfo = ~0x0;
return true;
}

View File

@ -39,7 +39,9 @@ private:
MCAsmLexer &getLexer() const { return Parser.getLexer(); }
bool Error(SMLoc L, const Twine &Msg,
ArrayRef<SMRange> Ranges = ArrayRef<SMRange>()) {
ArrayRef<SMRange> Ranges = ArrayRef<SMRange>(),
bool matchingInlineAsm = false) {
if (matchingInlineAsm) return true;
return Parser.Error(L, Msg, Ranges);
}
@ -68,7 +70,8 @@ private:
bool MatchInstruction(SMLoc IDLoc,
SmallVectorImpl<MCParsedAsmOperand*> &Operands,
SmallVectorImpl<MCInst> &MCInsts,
unsigned &OrigErrorInfo);
unsigned &OrigErrorInfo,
bool matchingInlineAsm = false);
/// isSrcOp - Returns true if operand is either (%rsi) or %ds:%(rsi)
/// in 64bit mode or (%esi) or %es:(%esi) in 32bit mode.
@ -1525,11 +1528,12 @@ MatchAndEmitInstruction(SMLoc IDLoc,
bool X86AsmParser::
MatchInstruction(SMLoc IDLoc,
SmallVectorImpl<MCParsedAsmOperand*> &Operands,
SmallVectorImpl<MCInst> &MCInsts,
unsigned &OrigErrorInfo) {
SmallVectorImpl<MCInst> &MCInsts, unsigned &OrigErrorInfo,
bool matchingInlineAsm) {
assert(!Operands.empty() && "Unexpect empty operand list!");
X86Operand *Op = static_cast<X86Operand*>(Operands[0]);
assert(Op->isToken() && "Leading operand should always be a mnemonic!");
ArrayRef<SMRange> EmptyRanges = ArrayRef<SMRange>();
// First, handle aliases that expand to multiple instructions.
// FIXME: This should be replaced with a real .td file alias mechanism.
@ -1578,10 +1582,12 @@ MatchInstruction(SMLoc IDLoc,
MCInsts.push_back(Inst);
return false;
case Match_MissingFeature:
Error(IDLoc, "instruction requires a CPU feature not currently enabled");
Error(IDLoc, "instruction requires a CPU feature not currently enabled",
EmptyRanges, matchingInlineAsm);
return true;
case Match_ConversionFail:
return Error(IDLoc, "unable to convert operands to instruction");
return Error(IDLoc, "unable to convert operands to instruction",
EmptyRanges, matchingInlineAsm);
case Match_InvalidOperand:
WasOriginallyInvalidOperand = true;
break;
@ -1660,7 +1666,7 @@ MatchInstruction(SMLoc IDLoc,
OS << "'" << Base << MatchChars[i] << "'";
}
OS << ")";
Error(IDLoc, OS.str());
Error(IDLoc, OS.str(), EmptyRanges, matchingInlineAsm);
return true;
}
@ -1672,30 +1678,33 @@ MatchInstruction(SMLoc IDLoc,
(Match3 == Match_MnemonicFail) && (Match4 == Match_MnemonicFail)) {
if (!WasOriginallyInvalidOperand) {
return Error(IDLoc, "invalid instruction mnemonic '" + Base + "'",
Op->getLocRange());
Op->getLocRange(), matchingInlineAsm);
}
// Recover location info for the operand if we know which was the problem.
if (OrigErrorInfo != ~0U) {
if (OrigErrorInfo >= Operands.size())
return Error(IDLoc, "too few operands for instruction");
return Error(IDLoc, "too few operands for instruction",
EmptyRanges, matchingInlineAsm);
X86Operand *Operand = (X86Operand*)Operands[OrigErrorInfo];
if (Operand->getStartLoc().isValid()) {
SMRange OperandRange = Operand->getLocRange();
return Error(Operand->getStartLoc(), "invalid operand for instruction",
OperandRange);
OperandRange, matchingInlineAsm);
}
}
return Error(IDLoc, "invalid operand for instruction");
return Error(IDLoc, "invalid operand for instruction", EmptyRanges,
matchingInlineAsm);
}
// If one instruction matched with a missing feature, report this as a
// missing feature.
if ((Match1 == Match_MissingFeature) + (Match2 == Match_MissingFeature) +
(Match3 == Match_MissingFeature) + (Match4 == Match_MissingFeature) == 1){
Error(IDLoc, "instruction requires a CPU feature not currently enabled");
Error(IDLoc, "instruction requires a CPU feature not currently enabled",
EmptyRanges, matchingInlineAsm);
return true;
}
@ -1703,12 +1712,14 @@ MatchInstruction(SMLoc IDLoc,
// operand failure.
if ((Match1 == Match_InvalidOperand) + (Match2 == Match_InvalidOperand) +
(Match3 == Match_InvalidOperand) + (Match4 == Match_InvalidOperand) == 1){
Error(IDLoc, "invalid operand for instruction");
Error(IDLoc, "invalid operand for instruction", EmptyRanges,
matchingInlineAsm);
return true;
}
// If all of these were an outright failure, report it in a useless way.
Error(IDLoc, "unknown use of instruction mnemonic without a size suffix");
Error(IDLoc, "unknown use of instruction mnemonic without a size suffix",
EmptyRanges, matchingInlineAsm);
return true;
}