diff options
| author | Alex Lorenz <arphaman@gmail.com> | 2015-06-24 17:34:58 +0000 |
|---|---|---|
| committer | Alex Lorenz <arphaman@gmail.com> | 2015-06-24 17:34:58 +0000 |
| commit | 12b554e6a7857795a8b0a701d17fed1a2863ebd9 (patch) | |
| tree | 59ec0bad48e12a49396ed117d49a0c6b733482a7 /llvm/lib/CodeGen/MIRParser | |
| parent | 79ff564ef356de75e4d430a88c30cddc286c6e02 (diff) | |
| download | bcm5719-llvm-12b554e6a7857795a8b0a701d17fed1a2863ebd9.tar.gz bcm5719-llvm-12b554e6a7857795a8b0a701d17fed1a2863ebd9.zip | |
MIR Serialization: Serialize the null register operands.
This commit serializes the null register machine operands.
It uses the '_' keyword to represent them, but the parser
also allows the '%noreg' named register syntax.
Reviewers: Duncan P. N. Exon Smith
Differential Revision: http://reviews.llvm.org/D10580
llvm-svn: 240558
Diffstat (limited to 'llvm/lib/CodeGen/MIRParser')
| -rw-r--r-- | llvm/lib/CodeGen/MIRParser/MILexer.cpp | 4 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/MIRParser/MILexer.h | 5 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/MIRParser/MIParser.cpp | 6 |
3 files changed, 13 insertions, 2 deletions
diff --git a/llvm/lib/CodeGen/MIRParser/MILexer.cpp b/llvm/lib/CodeGen/MIRParser/MILexer.cpp index 0933ae138f2..3383d1f5cf5 100644 --- a/llvm/lib/CodeGen/MIRParser/MILexer.cpp +++ b/llvm/lib/CodeGen/MIRParser/MILexer.cpp @@ -64,7 +64,9 @@ static Cursor lexIdentifier(Cursor C, MIToken &Token) { auto Range = C; while (isIdentifierChar(C.peek())) C.advance(); - Token = MIToken(MIToken::Identifier, Range.upto(C)); + auto Identifier = Range.upto(C); + Token = MIToken(Identifier == "_" ? MIToken::underscore : MIToken::Identifier, + Identifier); return C; } diff --git a/llvm/lib/CodeGen/MIRParser/MILexer.h b/llvm/lib/CodeGen/MIRParser/MILexer.h index df8b6cb2026..f9cc97cb34e 100644 --- a/llvm/lib/CodeGen/MIRParser/MILexer.h +++ b/llvm/lib/CodeGen/MIRParser/MILexer.h @@ -34,6 +34,7 @@ struct MIToken { // Tokens with no info. comma, equal, + underscore, // Identifier tokens Identifier, @@ -58,7 +59,9 @@ public: bool isError() const { return Kind == Error; } - bool isRegister() const { return Kind == NamedRegister; } + bool isRegister() const { + return Kind == NamedRegister || Kind == underscore; + } bool is(TokenKind K) const { return Kind == K; } diff --git a/llvm/lib/CodeGen/MIRParser/MIParser.cpp b/llvm/lib/CodeGen/MIRParser/MIParser.cpp index 33f306945cb..07aac674ffb 100644 --- a/llvm/lib/CodeGen/MIRParser/MIParser.cpp +++ b/llvm/lib/CodeGen/MIRParser/MIParser.cpp @@ -174,6 +174,9 @@ bool MIParser::parseInstruction(unsigned &OpCode) { bool MIParser::parseRegister(unsigned &Reg) { switch (Token.kind()) { + case MIToken::underscore: + Reg = 0; + break; case MIToken::NamedRegister: { StringRef Name = Token.stringValue().drop_front(1); // Drop the '%' if (getRegisterByName(Name, Reg)) @@ -211,6 +214,7 @@ bool MIParser::parseImmediateOperand(MachineOperand &Dest) { bool MIParser::parseMachineOperand(MachineOperand &Dest) { switch (Token.kind()) { + case MIToken::underscore: case MIToken::NamedRegister: return parseRegisterOperand(Dest); case MIToken::IntegerLiteral: @@ -245,6 +249,8 @@ bool MIParser::parseInstrName(StringRef InstrName, unsigned &OpCode) { void MIParser::initNames2Regs() { if (!Names2Regs.empty()) return; + // The '%noreg' register is the register 0. + Names2Regs.insert(std::make_pair("noreg", 0)); const auto *TRI = MF.getSubtarget().getRegisterInfo(); assert(TRI && "Expected target register info"); for (unsigned I = 0, E = TRI->getNumRegs(); I < E; ++I) { |

