mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-26 23:24:34 +00:00
Split the TargetAsmParser "ParseInstruction" interface in half:
the new ParseInstruction method just parses and returns a list of target operands. A new MatchInstruction interface is used to turn the operand list into an MCInst. This requires new/deleting all the operands, but it also gives targets the ability to use polymorphic operands if they want to. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@93469 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -18,6 +18,7 @@
|
||||
#include "llvm/MC/MCContext.h"
|
||||
#include "llvm/MC/MCExpr.h"
|
||||
#include "llvm/MC/MCInst.h"
|
||||
#include "llvm/MC/MCParsedAsmOperand.h"
|
||||
#include "llvm/MC/MCSectionMachO.h"
|
||||
#include "llvm/MC/MCStreamer.h"
|
||||
#include "llvm/MC/MCSymbol.h"
|
||||
@ -710,16 +711,34 @@ bool AsmParser::ParseStatement() {
|
||||
return false;
|
||||
}
|
||||
|
||||
MCInst Inst;
|
||||
if (getTargetParser().ParseInstruction(IDVal, IDLoc, Inst))
|
||||
|
||||
SmallVector<MCParsedAsmOperand*, 8> ParsedOperands;
|
||||
if (getTargetParser().ParseInstruction(IDVal, IDLoc, ParsedOperands))
|
||||
// FIXME: Leaking ParsedOperands on failure.
|
||||
return true;
|
||||
|
||||
if (Lexer.isNot(AsmToken::EndOfStatement))
|
||||
// FIXME: Leaking ParsedOperands on failure.
|
||||
return TokError("unexpected token in argument list");
|
||||
|
||||
// Eat the end of statement marker.
|
||||
Lexer.Lex();
|
||||
|
||||
|
||||
MCInst Inst;
|
||||
|
||||
bool MatchFail = getTargetParser().MatchInstruction(ParsedOperands, Inst);
|
||||
|
||||
// Free any parsed operands.
|
||||
for (unsigned i = 0, e = ParsedOperands.size(); i != e; ++i)
|
||||
delete ParsedOperands[i];
|
||||
|
||||
if (MatchFail) {
|
||||
// FIXME: We should give nicer diagnostics about the exact failure.
|
||||
Error(IDLoc, "unrecognized instruction");
|
||||
return true;
|
||||
}
|
||||
|
||||
// Instruction is good, process it.
|
||||
Out.EmitInstruction(Inst);
|
||||
|
||||
|
Reference in New Issue
Block a user