diff options
author | Daniel Sanders <daniel.sanders@imgtec.com> | 2014-04-01 10:40:14 +0000 |
---|---|---|
committer | Daniel Sanders <daniel.sanders@imgtec.com> | 2014-04-01 10:40:14 +0000 |
commit | 315386c0836810d27e7c156fa4921846b0cde586 (patch) | |
tree | 2be55ed58686e52fa12c59bff25c9f6bce19dd5e | |
parent | 74b2def0c5e9c0ae4c440e86303bce9b093f5ff4 (diff) | |
download | bcm5719-llvm-315386c0836810d27e7c156fa4921846b0cde586.tar.gz bcm5719-llvm-315386c0836810d27e7c156fa4921846b0cde586.zip |
[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
llvm-svn: 205297
-rw-r--r-- | llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp | 25 |
1 files changed, 10 insertions, 15 deletions
diff --git a/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp b/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp index d3bfe40fc50..12469822f71 100644 --- a/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp +++ b/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp @@ -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; |