diff options
author | Alex Lorenz <arphaman@gmail.com> | 2015-07-16 23:37:45 +0000 |
---|---|---|
committer | Alex Lorenz <arphaman@gmail.com> | 2015-07-16 23:37:45 +0000 |
commit | 7feaf7c60be1557931549ec0f848090eb1e9da99 (patch) | |
tree | 31eabcfed68328262a73dd4a90d9d8115da6fc80 /llvm/lib/CodeGen/MIRParser/MIParser.cpp | |
parent | 9b4f6b2650fb7db7c09755dcb731a6d68e4ffe11 (diff) | |
download | bcm5719-llvm-7feaf7c60be1557931549ec0f848090eb1e9da99.tar.gz bcm5719-llvm-7feaf7c60be1557931549ec0f848090eb1e9da99.zip |
MIR Serialization: Serialize the frame index machine operands.
Reviewers: Duncan P. N. Exon Smith
llvm-svn: 242487
Diffstat (limited to 'llvm/lib/CodeGen/MIRParser/MIParser.cpp')
-rw-r--r-- | llvm/lib/CodeGen/MIRParser/MIParser.cpp | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/MIRParser/MIParser.cpp b/llvm/lib/CodeGen/MIRParser/MIParser.cpp index 62a3fbe1e5f..b2931189578 100644 --- a/llvm/lib/CodeGen/MIRParser/MIParser.cpp +++ b/llvm/lib/CodeGen/MIRParser/MIParser.cpp @@ -17,8 +17,10 @@ #include "llvm/AsmParser/SlotMapping.h" #include "llvm/CodeGen/MachineBasicBlock.h" #include "llvm/CodeGen/MachineFunction.h" +#include "llvm/CodeGen/MachineFrameInfo.h" #include "llvm/CodeGen/MachineInstr.h" #include "llvm/CodeGen/MachineInstrBuilder.h" +#include "llvm/IR/Instructions.h" #include "llvm/IR/Module.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Support/SourceMgr.h" @@ -87,6 +89,8 @@ public: bool parseImmediateOperand(MachineOperand &Dest); bool parseMBBReference(MachineBasicBlock *&MBB); bool parseMBBOperand(MachineOperand &Dest); + bool parseStackObjectOperand(MachineOperand &Dest); + bool parseFixedStackObjectOperand(MachineOperand &Dest); bool parseGlobalAddressOperand(MachineOperand &Dest); bool parseJumpTableIndexOperand(MachineOperand &Dest); bool parseMachineOperand(MachineOperand &Dest); @@ -439,6 +443,41 @@ bool MIParser::parseMBBOperand(MachineOperand &Dest) { return false; } +bool MIParser::parseStackObjectOperand(MachineOperand &Dest) { + assert(Token.is(MIToken::StackObject)); + unsigned ID; + if (getUnsigned(ID)) + return true; + auto ObjectInfo = PFS.StackObjectSlots.find(ID); + if (ObjectInfo == PFS.StackObjectSlots.end()) + return error(Twine("use of undefined stack object '%stack.") + Twine(ID) + + "'"); + StringRef Name; + if (const auto *Alloca = + MF.getFrameInfo()->getObjectAllocation(ObjectInfo->second)) + Name = Alloca->getName(); + if (!Token.stringValue().empty() && Token.stringValue() != Name) + return error(Twine("the name of the stack object '%stack.") + Twine(ID) + + "' isn't '" + Token.stringValue() + "'"); + lex(); + Dest = MachineOperand::CreateFI(ObjectInfo->second); + return false; +} + +bool MIParser::parseFixedStackObjectOperand(MachineOperand &Dest) { + assert(Token.is(MIToken::FixedStackObject)); + unsigned ID; + if (getUnsigned(ID)) + return true; + auto ObjectInfo = PFS.FixedStackObjectSlots.find(ID); + if (ObjectInfo == PFS.FixedStackObjectSlots.end()) + return error(Twine("use of undefined fixed stack object '%fixed-stack.") + + Twine(ID) + "'"); + lex(); + Dest = MachineOperand::CreateFI(ObjectInfo->second); + return false; +} + bool MIParser::parseGlobalAddressOperand(MachineOperand &Dest) { switch (Token.kind()) { case MIToken::NamedGlobalValue: { @@ -498,6 +537,10 @@ bool MIParser::parseMachineOperand(MachineOperand &Dest) { return parseImmediateOperand(Dest); case MIToken::MachineBasicBlock: return parseMBBOperand(Dest); + case MIToken::StackObject: + return parseStackObjectOperand(Dest); + case MIToken::FixedStackObject: + return parseFixedStackObjectOperand(Dest); case MIToken::GlobalValue: case MIToken::NamedGlobalValue: return parseGlobalAddressOperand(Dest); |