summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen
diff options
context:
space:
mode:
authorAlex Lorenz <arphaman@gmail.com>2015-06-24 17:34:58 +0000
committerAlex Lorenz <arphaman@gmail.com>2015-06-24 17:34:58 +0000
commit12b554e6a7857795a8b0a701d17fed1a2863ebd9 (patch)
tree59ec0bad48e12a49396ed117d49a0c6b733482a7 /llvm/lib/CodeGen
parent79ff564ef356de75e4d430a88c30cddc286c6e02 (diff)
downloadbcm5719-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')
-rw-r--r--llvm/lib/CodeGen/MIRParser/MILexer.cpp4
-rw-r--r--llvm/lib/CodeGen/MIRParser/MILexer.h5
-rw-r--r--llvm/lib/CodeGen/MIRParser/MIParser.cpp6
-rw-r--r--llvm/lib/CodeGen/MIRPrinter.cpp5
4 files changed, 16 insertions, 4 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) {
diff --git a/llvm/lib/CodeGen/MIRPrinter.cpp b/llvm/lib/CodeGen/MIRPrinter.cpp
index 6d62b0ad85b..801f6c25ac5 100644
--- a/llvm/lib/CodeGen/MIRPrinter.cpp
+++ b/llvm/lib/CodeGen/MIRPrinter.cpp
@@ -144,9 +144,10 @@ void MIPrinter::print(const MachineInstr &MI) {
static void printReg(unsigned Reg, raw_ostream &OS,
const TargetRegisterInfo *TRI) {
// TODO: Print Stack Slots.
- // TODO: Print no register.
// TODO: Print virtual registers.
- if (Reg < TRI->getNumRegs())
+ if (!Reg)
+ OS << '_';
+ else if (Reg < TRI->getNumRegs())
OS << '%' << StringRef(TRI->getName(Reg)).lower();
else
llvm_unreachable("Can't print this kind of register yet");
OpenPOWER on IntegriCloud