mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-15 07:59:50 +00:00
[mips] Use AsmLexer::peekTok() to resolve the conflict between $reg and $sym
Summary: Parsing registers no longer consume the $ token before it's confirmed whether it really has a register or not, therefore it's no longer impossible to match symbols if registers were tried first. Depends on D3232 Reviewers: matheusalmeida, vmedic Reviewed By: matheusalmeida Differential Revision: http://llvm-reviews.chandlerc.com/D3233 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@205297 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
382fb96882
commit
1302349706
@ -1781,22 +1781,19 @@ MipsAsmParser::MatchAnyRegisterNameWithoutDollar(
|
||||
MipsAsmParser::OperandMatchResultTy
|
||||
MipsAsmParser::ParseAnyRegisterWithoutDollar(
|
||||
SmallVectorImpl<MCParsedAsmOperand *> &Operands, SMLoc S) {
|
||||
auto Token = Parser.getTok();
|
||||
auto Token = Parser.getLexer().peekTok(false);
|
||||
|
||||
if (Token.is(AsmToken::Identifier)) {
|
||||
DEBUG(dbgs() << ".. identifier\n");
|
||||
StringRef Identifier = Token.getIdentifier();
|
||||
OperandMatchResultTy ResTy =
|
||||
MatchAnyRegisterNameWithoutDollar(Operands, Identifier, S);
|
||||
if (ResTy == MatchOperand_Success)
|
||||
Parser.Lex();
|
||||
return ResTy;
|
||||
} else if (Token.is(AsmToken::Integer)) {
|
||||
DEBUG(dbgs() << ".. integer\n");
|
||||
Operands.push_back(MipsOperand::CreateNumericReg(
|
||||
Token.getIntVal(), getContext().getRegisterInfo(), S, Token.getLoc(),
|
||||
*this));
|
||||
Parser.Lex();
|
||||
return MatchOperand_Success;
|
||||
}
|
||||
|
||||
@ -1823,12 +1820,12 @@ MipsAsmParser::OperandMatchResultTy MipsAsmParser::ParseAnyRegister(
|
||||
return MatchOperand_NoMatch;
|
||||
}
|
||||
DEBUG(dbgs() << ".. $\n");
|
||||
Parser.Lex();
|
||||
Token = Parser.getTok();
|
||||
|
||||
OperandMatchResultTy ResTy = ParseAnyRegisterWithoutDollar(Operands, S);
|
||||
if (ResTy == MatchOperand_NoMatch)
|
||||
return MatchOperand_ParseFail; // We ate the $ so NoMatch isn't valid
|
||||
if (ResTy == MatchOperand_Success) {
|
||||
Parser.Lex(); // $
|
||||
Parser.Lex(); // identifier
|
||||
}
|
||||
return ResTy;
|
||||
}
|
||||
|
||||
@ -1866,18 +1863,16 @@ MipsAsmParser::OperandMatchResultTy MipsAsmParser::ParseJumpTarget(
|
||||
if (ResTy != MatchOperand_NoMatch)
|
||||
return ResTy;
|
||||
|
||||
// Registers are a valid target and have priority over symbols.
|
||||
ResTy = ParseAnyRegister(Operands);
|
||||
if (ResTy != MatchOperand_NoMatch)
|
||||
return ResTy;
|
||||
|
||||
// Consume the $ if there is one. We'll add it to the symbol below.
|
||||
bool hasConsumedDollar = false;
|
||||
if (getLexer().is(AsmToken::Dollar)) {
|
||||
Parser.Lex();
|
||||
hasConsumedDollar = true;
|
||||
|
||||
// We have an unfortunate conflict between '$sym' and '$reg' so give
|
||||
// registers a chance before we try symbols.
|
||||
// The conflict is between 'bc1t $offset', and 'bc1t $fcc, $offset'.
|
||||
OperandMatchResultTy ResTy = ParseAnyRegisterWithoutDollar(Operands, S);
|
||||
if (ResTy != MatchOperand_NoMatch)
|
||||
return ResTy;
|
||||
}
|
||||
|
||||
StringRef Identifier;
|
||||
|
Loading…
Reference in New Issue
Block a user