diff options
Diffstat (limited to 'lib/VMCore/iSwitch.cpp')
-rw-r--r-- | lib/VMCore/iSwitch.cpp | 74 |
1 files changed, 13 insertions, 61 deletions
diff --git a/lib/VMCore/iSwitch.cpp b/lib/VMCore/iSwitch.cpp index 2a1eec2..e5e3c50 100644 --- a/lib/VMCore/iSwitch.cpp +++ b/lib/VMCore/iSwitch.cpp @@ -10,72 +10,24 @@ #include "llvm/Type.h" #endif -SwitchInst::SwitchInst(Value *V, BasicBlock *DefV) - : TerminatorInst(Instruction::Switch), - DefaultDest(DefV, this), Val(V, this) { - assert(Val && DefV); +SwitchInst::SwitchInst(Value *V, BasicBlock *DefDest) + : TerminatorInst(Instruction::Switch) { + assert(V && DefDest); + Operands.push_back(Use(V, this)); + Operands.push_back(Use(DefDest, this)); } SwitchInst::SwitchInst(const SwitchInst &SI) - : TerminatorInst(Instruction::Switch), DefaultDest(SI.DefaultDest), - Val(SI.Val) { + : TerminatorInst(Instruction::Switch) { + Operands.reserve(SI.Operands.size()); - for (dest_const_iterator I = SI.Destinations.begin(), - end = SI.Destinations.end(); I != end; ++I) - Destinations.push_back(dest_value(ConstPoolUse(I->first, this), - BasicBlockUse(I->second, this))); + for (unsigned i = 0, E = SI.Operands.size(); i != E; i+=2) { + Operands.push_back(Use(SI.Operands[i], this)); + Operands.push_back(Use(SI.Operands[i+1], this)); + } } - void SwitchInst::dest_push_back(ConstPoolVal *OnVal, BasicBlock *Dest) { - Destinations.push_back(dest_value(ConstPoolUse(OnVal, this), - BasicBlockUse(Dest, this))); -} - -void SwitchInst::dropAllReferences() { - Val = 0; - DefaultDest = 0; - Destinations.clear(); -} - -const BasicBlock *SwitchInst::getSuccessor(unsigned idx) const { - if (idx == 0) return DefaultDest; - if (idx > Destinations.size()) return 0; - return Destinations[idx-1].second; -} - -unsigned SwitchInst::getNumOperands() const { - return 2+Destinations.size(); -} - -const Value *SwitchInst::getOperand(unsigned i) const { - if (i == 0) return Val; - else if (i == 1) return DefaultDest; - - unsigned slot = (i-2) >> 1; - if (slot >= Destinations.size()) return 0; - - if (i & 1) return Destinations[slot].second; - return Destinations[slot].first; -} - -bool SwitchInst::setOperand(unsigned i, Value *V) { - if (i == 0) { Val = V; return true; } - else if (i == 1) { - assert(V->getType() == Type::LabelTy); - DefaultDest = (BasicBlock*)V; - return true; - } - - unsigned slot = (i-2) >> 1; - if (slot >= Destinations.size()) return 0; - - if (i & 1) { - assert(V->getType() == Type::LabelTy); - Destinations[slot].second = (BasicBlock*)V; - } else { - // TODO: assert constant - Destinations[slot].first = (ConstPoolVal*)V; - } - return true; + Operands.push_back(Use(OnVal, this)); + Operands.push_back(Use(Dest, this)); } |