|
@@ -98,6 +98,18 @@ VRegInfo &PerFunctionMIParsingState::getVRegInfo(unsigned Num) {
|
|
|
return *I.first->second;
|
|
|
}
|
|
|
|
|
|
+VRegInfo &PerFunctionMIParsingState::getVRegInfoNamed(StringRef RegName) {
|
|
|
+ assert(RegName != "" && "Expected named reg.");
|
|
|
+
|
|
|
+ auto I = VRegInfosNamed.insert(std::make_pair(RegName.str(), nullptr));
|
|
|
+ if (I.second) {
|
|
|
+ VRegInfo *Info = new (Allocator) VRegInfo;
|
|
|
+ Info->VReg = MF.getRegInfo().createIncompleteVirtualRegister(RegName);
|
|
|
+ I.first->second = Info;
|
|
|
+ }
|
|
|
+ return *I.first->second;
|
|
|
+}
|
|
|
+
|
|
|
namespace {
|
|
|
|
|
|
/// A wrapper struct around the 'MachineOperand' struct that includes a source
|
|
@@ -182,6 +194,7 @@ public:
|
|
|
|
|
|
bool parseNamedRegister(unsigned &Reg);
|
|
|
bool parseVirtualRegister(VRegInfo *&Info);
|
|
|
+ bool parseNamedVirtualRegister(VRegInfo *&Info);
|
|
|
bool parseRegister(unsigned &Reg, VRegInfo *&VRegInfo);
|
|
|
bool parseRegisterFlag(unsigned &Flags);
|
|
|
bool parseRegisterClassOrBank(VRegInfo &RegInfo);
|
|
@@ -949,7 +962,18 @@ bool MIParser::parseNamedRegister(unsigned &Reg) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+bool MIParser::parseNamedVirtualRegister(VRegInfo *&Info) {
|
|
|
+ assert(Token.is(MIToken::NamedVirtualRegister) && "Expected NamedVReg token");
|
|
|
+ StringRef Name = Token.stringValue();
|
|
|
+ // TODO: Check that the VReg name is not the same as a physical register name.
|
|
|
+ // If it is, then print a warning (when warnings are implemented).
|
|
|
+ Info = &PFS.getVRegInfoNamed(Name);
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
bool MIParser::parseVirtualRegister(VRegInfo *&Info) {
|
|
|
+ if (Token.is(MIToken::NamedVirtualRegister))
|
|
|
+ return parseNamedVirtualRegister(Info);
|
|
|
assert(Token.is(MIToken::VirtualRegister) && "Needs VirtualRegister token");
|
|
|
unsigned ID;
|
|
|
if (getUnsigned(ID))
|
|
@@ -965,6 +989,7 @@ bool MIParser::parseRegister(unsigned &Reg, VRegInfo *&Info) {
|
|
|
return false;
|
|
|
case MIToken::NamedRegister:
|
|
|
return parseNamedRegister(Reg);
|
|
|
+ case MIToken::NamedVirtualRegister:
|
|
|
case MIToken::VirtualRegister:
|
|
|
if (parseVirtualRegister(Info))
|
|
|
return true;
|
|
@@ -1952,6 +1977,7 @@ bool MIParser::parseMachineOperand(MachineOperand &Dest,
|
|
|
case MIToken::underscore:
|
|
|
case MIToken::NamedRegister:
|
|
|
case MIToken::VirtualRegister:
|
|
|
+ case MIToken::NamedVirtualRegister:
|
|
|
return parseRegisterOperand(Dest, TiedDefIdx);
|
|
|
case MIToken::IntegerLiteral:
|
|
|
return parseImmediateOperand(Dest);
|