diff options
-rw-r--r-- | include/llvm/Instructions.h | 8 | ||||
-rw-r--r-- | lib/VMCore/Instructions.cpp | 17 |
2 files changed, 25 insertions, 0 deletions
diff --git a/include/llvm/Instructions.h b/include/llvm/Instructions.h index d337002e0b..82d58162f6 100644 --- a/include/llvm/Instructions.h +++ b/include/llvm/Instructions.h @@ -1870,6 +1870,10 @@ public: /// getNumClauses - Get the number of clauses for this landing pad. unsigned getNumClauses() const { return getNumOperands() - 1; } + /// reserveClauses - Grow the size of the operand list to accomodate the new + /// number of clauses. + void reserveClauses(unsigned Size); + // Methods for support type inquiry through isa, cast, and dyn_cast: static inline bool classof(const LandingPadInst *) { return true; } static inline bool classof(const Instruction *I) { @@ -2474,6 +2478,10 @@ public: Op<-1>() = reinterpret_cast<Value*>(B); } + // getLandingPad - Get the landingpad instruction from the landing pad block + // (the unwind destination). + LandingPadInst *getLandingPad() const; + BasicBlock *getSuccessor(unsigned i) const { assert(i < 2 && "Successor # out of range for invoke!"); return i == 0 ? getNormalDest() : getUnwindDest(); diff --git a/lib/VMCore/Instructions.cpp b/lib/VMCore/Instructions.cpp index e7dd40d059..9398c7f872 100644 --- a/lib/VMCore/Instructions.cpp +++ b/lib/VMCore/Instructions.cpp @@ -214,6 +214,20 @@ void LandingPadInst::growOperands() { Use::zap(OldOps, OldOps + e, true); } +void LandingPadInst::reserveClauses(unsigned Size) { + unsigned e = getNumOperands() + Size; + if (ReservedSpace >= e) return; + ReservedSpace = e; + + Use *NewOps = allocHungoffUses(ReservedSpace); + Use *OldOps = OperandList; + for (unsigned i = 0; i != e; ++i) + NewOps[i] = OldOps[i]; + + OperandList = NewOps; + Use::zap(OldOps, OldOps + e, true); +} + void LandingPadInst::addClause(ClauseType CT, Value *ClauseVal) { unsigned OpNo = getNumOperands(); if (OpNo + 1 > ReservedSpace) @@ -551,6 +565,9 @@ void InvokeInst::removeAttribute(unsigned i, Attributes attr) { setAttributes(PAL); } +LandingPadInst *InvokeInst::getLandingPad() const { + return cast<LandingPadInst>(getUnwindDest()->getFirstNonPHI()); +} //===----------------------------------------------------------------------===// // ReturnInst Implementation |