mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-05 10:27:02 +00:00
[ms-inline asm] Extend the MC AsmParser API to match MCInsts (but not emit).
This new API will be used by clang to parse ms-style inline asms. One goal of this project is to use this style of inline asm for targets other then x86. Therefore, this API needs to be implemented for non-x86 targets at some point in the future. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@161624 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
f5ecf02d59
commit
3246176838
@ -79,6 +79,19 @@ public:
|
||||
/// \param DirectiveID - the identifier token of the directive.
|
||||
virtual bool ParseDirective(AsmToken DirectiveID) = 0;
|
||||
|
||||
/// MatchInstruction - Recognize a series of operands of a parsed instruction
|
||||
/// as an actual MCInst. This returns false on success and returns true on
|
||||
/// failure to match.
|
||||
///
|
||||
/// On failure, the target parser is responsible for emitting a diagnostic
|
||||
/// explaining the match failure.
|
||||
virtual bool
|
||||
MatchInstruction(SMLoc IDLoc,
|
||||
SmallVectorImpl<MCParsedAsmOperand*> &Operands,
|
||||
SmallVectorImpl<MCInst> &MCInsts) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/// MatchAndEmitInstruction - Recognize a series of operands of a parsed
|
||||
/// instruction as an actual MCInst and emit it to the specified MCStreamer.
|
||||
/// This returns false on success and returns true on failure to match.
|
||||
|
@ -65,6 +65,10 @@ private:
|
||||
SmallVectorImpl<MCParsedAsmOperand*> &Operands,
|
||||
MCStreamer &Out);
|
||||
|
||||
bool MatchInstruction(SMLoc IDLoc,
|
||||
SmallVectorImpl<MCParsedAsmOperand*> &Operands,
|
||||
SmallVectorImpl<MCInst> &MCInsts);
|
||||
|
||||
/// isSrcOp - Returns true if operand is either (%rsi) or %ds:%(rsi)
|
||||
/// in 64bit mode or (%esi) or %es:(%esi) in 32bit mode.
|
||||
bool isSrcOp(X86Operand &Op);
|
||||
@ -1508,6 +1512,18 @@ bool X86AsmParser::
|
||||
MatchAndEmitInstruction(SMLoc IDLoc,
|
||||
SmallVectorImpl<MCParsedAsmOperand*> &Operands,
|
||||
MCStreamer &Out) {
|
||||
SmallVector<MCInst, 2> Insts;
|
||||
bool Error = MatchInstruction(IDLoc, Operands, Insts);
|
||||
if (!Error)
|
||||
for (unsigned i = 0, e = Insts.size(); i != e; ++i)
|
||||
Out.EmitInstruction(Insts[i]);
|
||||
return Error;
|
||||
}
|
||||
|
||||
bool X86AsmParser::
|
||||
MatchInstruction(SMLoc IDLoc,
|
||||
SmallVectorImpl<MCParsedAsmOperand*> &Operands,
|
||||
SmallVectorImpl<MCInst> &MCInsts) {
|
||||
assert(!Operands.empty() && "Unexpect empty operand list!");
|
||||
X86Operand *Op = static_cast<X86Operand*>(Operands[0]);
|
||||
assert(Op->isToken() && "Leading operand should always be a mnemonic!");
|
||||
@ -1523,7 +1539,7 @@ MatchAndEmitInstruction(SMLoc IDLoc,
|
||||
MCInst Inst;
|
||||
Inst.setOpcode(X86::WAIT);
|
||||
Inst.setLoc(IDLoc);
|
||||
Out.EmitInstruction(Inst);
|
||||
MCInsts.push_back(Inst);
|
||||
|
||||
const char *Repl =
|
||||
StringSwitch<const char*>(Op->getToken())
|
||||
@ -1557,7 +1573,7 @@ MatchAndEmitInstruction(SMLoc IDLoc,
|
||||
;
|
||||
|
||||
Inst.setLoc(IDLoc);
|
||||
Out.EmitInstruction(Inst);
|
||||
MCInsts.push_back(Inst);
|
||||
return false;
|
||||
case Match_MissingFeature:
|
||||
Error(IDLoc, "instruction requires a CPU feature not currently enabled");
|
||||
@ -1615,7 +1631,7 @@ MatchAndEmitInstruction(SMLoc IDLoc,
|
||||
(Match3 == Match_Success) + (Match4 == Match_Success);
|
||||
if (NumSuccessfulMatches == 1) {
|
||||
Inst.setLoc(IDLoc);
|
||||
Out.EmitInstruction(Inst);
|
||||
MCInsts.push_back(Inst);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user