diff options
author | Devang Patel <dpatel@apple.com> | 2008-02-19 22:15:16 +0000 |
---|---|---|
committer | Devang Patel <dpatel@apple.com> | 2008-02-19 22:15:16 +0000 |
commit | 40a04216daaaee119665e023019c005306ec48ac (patch) | |
tree | 3b180bf2e6550fdd00ee45fefe851cdc488e4242 /lib/VMCore | |
parent | 222ebf70b7577be05c3555de0fdd16f1577a0832 (diff) | |
download | external_llvm-40a04216daaaee119665e023019c005306ec48ac.zip external_llvm-40a04216daaaee119665e023019c005306ec48ac.tar.gz external_llvm-40a04216daaaee119665e023019c005306ec48ac.tar.bz2 |
Add GetResultInst. First step for multiple return value support.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@47348 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/VMCore')
-rw-r--r-- | lib/VMCore/Instructions.cpp | 24 | ||||
-rw-r--r-- | lib/VMCore/Verifier.cpp | 6 |
2 files changed, 30 insertions, 0 deletions
diff --git a/lib/VMCore/Instructions.cpp b/lib/VMCore/Instructions.cpp index 863f011..959ac9b 100644 --- a/lib/VMCore/Instructions.cpp +++ b/lib/VMCore/Instructions.cpp @@ -2698,6 +2698,29 @@ void SwitchInst::setSuccessorV(unsigned idx, BasicBlock *B) { setSuccessor(idx, B); } +//===----------------------------------------------------------------------===// +// GetResultInst Implementation +//===----------------------------------------------------------------------===// + +GetResultInst::GetResultInst(Value *Aggr, Value *Index, + const std::string &Name, + Instruction *InsertBef) + : Instruction(Aggr->getType(), + GetResult, Ops, 2, InsertBef) { + assert(isValidOperands(Aggr, Index) && "Invalid GetResultInst operands!"); + Ops[0].init(Aggr, this); + Ops[1].init(Index, this); + setName(Name); +} + +bool GetResultInst::isValidOperands(const Value *Aggr, const Value *Index) { + if (!Aggr || !Index) + return false; + if (!isa<StructType>(Aggr->getType()) || Index->getType() != Type::Int32Ty) + return false; + return true; +} + // Define these methods here so vtables don't get emitted into every translation // unit that uses these classes. @@ -2754,3 +2777,4 @@ SwitchInst *SwitchInst::clone() const { return new SwitchInst(*this); } InvokeInst *InvokeInst::clone() const { return new InvokeInst(*this); } UnwindInst *UnwindInst::clone() const { return new UnwindInst(); } UnreachableInst *UnreachableInst::clone() const { return new UnreachableInst();} +GetResultInst *GetResultInst::clone() const { return new GetResultInst(*this); } diff --git a/lib/VMCore/Verifier.cpp b/lib/VMCore/Verifier.cpp index 98f421e..a96f39c 100644 --- a/lib/VMCore/Verifier.cpp +++ b/lib/VMCore/Verifier.cpp @@ -257,6 +257,7 @@ namespace { // Anonymous namespace for class void visitUserOp2(Instruction &I) { visitUserOp1(I); } void visitIntrinsicFunctionCall(Intrinsic::ID ID, CallInst &CI); void visitAllocationInst(AllocationInst &AI); + void visitGetResultInst(GetResultInst &GRI); void VerifyCallSite(CallSite CS); void VerifyIntrinsicPrototype(Intrinsic::ID ID, Function *F, @@ -1037,6 +1038,11 @@ void Verifier::visitAllocationInst(AllocationInst &AI) { visitInstruction(AI); } +void Verifier::visitGetResultInst(GetResultInst &GRI) { + // FIXME : Check operands. + visitInstruction(GRI); +} + /// verifyInstruction - Verify that an instruction is well formed. /// |