From c0ddfaa134fe60c09686906b3a8f489531653453 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 28 Oct 2010 17:23:41 +0000 Subject: [PATCH] rearrange ParseRegisterList. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@117560 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/ARM/AsmParser/ARMAsmParser.cpp | 46 +++++++++++++++-------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/lib/Target/ARM/AsmParser/ARMAsmParser.cpp index b2df045a16c..e0d7762ed5c 100644 --- a/lib/Target/ARM/AsmParser/ARMAsmParser.cpp +++ b/lib/Target/ARM/AsmParser/ARMAsmParser.cpp @@ -52,7 +52,7 @@ private: ARMOperand *MaybeParseRegister(bool ParseWriteBack); - bool ParseRegisterList(OwningPtr &Op); + ARMOperand *ParseRegisterList(); bool ParseMemory(OwningPtr &Op); @@ -383,9 +383,9 @@ ARMOperand *ARMAsmParser::MaybeParseRegister(bool ParseWriteBack) { return ARMOperand::CreateReg(RegNum, Writeback, S, E); } -/// Parse a register list, return false if successful else return true or an -/// error. The first token must be a '{' when called. -bool ARMAsmParser::ParseRegisterList(OwningPtr &Op) { +/// Parse a register list, return it if successful else return null. The first +/// token must be a '{' when called. +ARMOperand *ARMAsmParser::ParseRegisterList() { SMLoc S, E; assert(Parser.getTok().is(AsmToken::LCurly) && "Token is not an Left Curly Brace"); @@ -394,11 +394,16 @@ bool ARMAsmParser::ParseRegisterList(OwningPtr &Op) { const AsmToken &RegTok = Parser.getTok(); SMLoc RegLoc = RegTok.getLoc(); - if (RegTok.isNot(AsmToken::Identifier)) - return Error(RegLoc, "register expected"); + if (RegTok.isNot(AsmToken::Identifier)) { + Error(RegLoc, "register expected"); + return 0; + } int RegNum = MatchRegisterName(RegTok.getString()); - if (RegNum == -1) - return Error(RegLoc, "register expected"); + if (RegNum == -1) { + Error(RegLoc, "register expected"); + return 0; + } + Parser.Lex(); // Eat identifier token. unsigned RegList = 1 << RegNum; @@ -409,11 +414,15 @@ bool ARMAsmParser::ParseRegisterList(OwningPtr &Op) { const AsmToken &RegTok = Parser.getTok(); SMLoc RegLoc = RegTok.getLoc(); - if (RegTok.isNot(AsmToken::Identifier)) - return Error(RegLoc, "register expected"); + if (RegTok.isNot(AsmToken::Identifier)) { + Error(RegLoc, "register expected"); + return 0; + } int RegNum = MatchRegisterName(RegTok.getString()); - if (RegNum == -1) - return Error(RegLoc, "register expected"); + if (RegNum == -1) { + Error(RegLoc, "register expected"); + return 0; + } if (RegList & (1 << RegNum)) Warning(RegLoc, "register duplicated in register list"); @@ -425,12 +434,16 @@ bool ARMAsmParser::ParseRegisterList(OwningPtr &Op) { Parser.Lex(); // Eat identifier token. } const AsmToken &RCurlyTok = Parser.getTok(); - if (RCurlyTok.isNot(AsmToken::RCurly)) - return Error(RCurlyTok.getLoc(), "'}' expected"); + if (RCurlyTok.isNot(AsmToken::RCurly)) { + Error(RCurlyTok.getLoc(), "'}' expected"); + return 0; + } E = RCurlyTok.getLoc(); Parser.Lex(); // Eat left curly brace token. - return false; + // FIXME: Need to return an operand! + Error(E, "FIXME: register list parsing not implemented"); + return 0; } /// Parse an arm memory expression, return false if successful else return true @@ -654,7 +667,8 @@ bool ARMAsmParser::ParseOperand(OwningPtr &Op) { case AsmToken::LBrac: return ParseMemory(Op); case AsmToken::LCurly: - return ParseRegisterList(Op); + Op.reset(ParseRegisterList()); + return Op.get() == 0; case AsmToken::Hash: // #42 -> immediate. // TODO: ":lower16:" and ":upper16:" modifiers after # before immediate