[mips] Use AsmLexer::peekTok() to resolve the conflict between $reg and $sym
authorDaniel Sanders <daniel.sanders@imgtec.com>
Tue, 1 Apr 2014 10:40:14 +0000 (10:40 +0000)
committerDaniel Sanders <daniel.sanders@imgtec.com>
Tue, 1 Apr 2014 10:40:14 +0000 (10:40 +0000)
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

lib/Target/Mips/AsmParser/MipsAsmParser.cpp

index d3bfe40fc50d92eb95a1191ab607eee4d5b089d9..12469822f71656f2e70e6f8be0270095363986b1 100644 (file)
@@ -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;