diff options
Diffstat (limited to 'lib/IR/BasicBlock.cpp')
| -rw-r--r-- | lib/IR/BasicBlock.cpp | 54 | 
1 files changed, 39 insertions, 15 deletions
diff --git a/lib/IR/BasicBlock.cpp b/lib/IR/BasicBlock.cpp index 98a30621ff4b..70ae3c398423 100644 --- a/lib/IR/BasicBlock.cpp +++ b/lib/IR/BasicBlock.cpp @@ -29,10 +29,6 @@ ValueSymbolTable *BasicBlock::getValueSymbolTable() {    return nullptr;  } -const DataLayout *BasicBlock::getDataLayout() const { -  return getParent()->getDataLayout(); -} -  LLVMContext &BasicBlock::getContext() const {    return getType()->getContext();  } @@ -98,18 +94,18 @@ void BasicBlock::removeFromParent() {    getParent()->getBasicBlockList().remove(this);  } -void BasicBlock::eraseFromParent() { -  getParent()->getBasicBlockList().erase(this); +iplist<BasicBlock>::iterator BasicBlock::eraseFromParent() { +  return getParent()->getBasicBlockList().erase(this);  } -/// moveBefore - Unlink this basic block from its current function and +/// Unlink this basic block from its current function and  /// insert it into the function that MovePos lives in, right before MovePos.  void BasicBlock::moveBefore(BasicBlock *MovePos) {    MovePos->getParent()->getBasicBlockList().splice(MovePos,                         getParent()->getBasicBlockList(), this);  } -/// moveAfter - Unlink this basic block from its current function and +/// Unlink this basic block from its current function and  /// insert it into the function that MovePos lives in, right after MovePos.  void BasicBlock::moveAfter(BasicBlock *MovePos) {    Function::iterator I = MovePos; @@ -117,6 +113,13 @@ void BasicBlock::moveAfter(BasicBlock *MovePos) {                                         getParent()->getBasicBlockList(), this);  } +const Module *BasicBlock::getModule() const { +  return getParent()->getParent(); +} + +Module *BasicBlock::getModule() { +  return getParent()->getParent(); +}  TerminatorInst *BasicBlock::getTerminator() {    if (InstList.empty()) return nullptr; @@ -210,7 +213,7 @@ void BasicBlock::dropAllReferences() {      I->dropAllReferences();  } -/// getSinglePredecessor - If this basic block has a single predecessor block, +/// If this basic block has a single predecessor block,  /// return the block, otherwise return a null pointer.  BasicBlock *BasicBlock::getSinglePredecessor() {    pred_iterator PI = pred_begin(this), E = pred_end(this); @@ -220,7 +223,7 @@ BasicBlock *BasicBlock::getSinglePredecessor() {    return (PI == E) ? ThePred : nullptr /*multiple preds*/;  } -/// getUniquePredecessor - If this basic block has a unique predecessor block, +/// If this basic block has a unique predecessor block,  /// return the block, otherwise return a null pointer.  /// Note that unique predecessor doesn't mean single edge, there can be  /// multiple edges from the unique predecessor to this block (for example @@ -239,7 +242,29 @@ BasicBlock *BasicBlock::getUniquePredecessor() {    return PredBB;  } -/// removePredecessor - This method is used to notify a BasicBlock that the +BasicBlock *BasicBlock::getSingleSuccessor() { +  succ_iterator SI = succ_begin(this), E = succ_end(this); +  if (SI == E) return nullptr; // no successors +  BasicBlock *TheSucc = *SI; +  ++SI; +  return (SI == E) ? TheSucc : nullptr /* multiple successors */; +} + +BasicBlock *BasicBlock::getUniqueSuccessor() { +  succ_iterator SI = succ_begin(this), E = succ_end(this); +  if (SI == E) return NULL; // No successors +  BasicBlock *SuccBB = *SI; +  ++SI; +  for (;SI != E; ++SI) { +    if (*SI != SuccBB) +      return NULL; +    // The same successor appears multiple times in the successor list. +    // This is OK. +  } +  return SuccBB; +} + +/// This method is used to notify a BasicBlock that the  /// specified Predecessor of the block is no longer able to reach it.  This is  /// actually not used to update the Predecessor list, but is actually used to  /// update the PHI nodes that reside in the block.  Note that this should be @@ -316,7 +341,7 @@ void BasicBlock::removePredecessor(BasicBlock *Pred,  } -/// splitBasicBlock - This splits a basic block into two at the specified +/// This splits a basic block into two at the specified  /// instruction.  Note that all instructions BEFORE the specified iterator stay  /// as part of the original basic block, an unconditional branch is added to  /// the new BB, and the rest of the instructions in the BB are moved to the new @@ -387,14 +412,13 @@ void BasicBlock::replaceSuccessorsPhiUsesWith(BasicBlock *New) {    }  } -/// isLandingPad - Return true if this basic block is a landing pad. I.e., it's +/// Return true if this basic block is a landing pad. I.e., it's  /// the destination of the 'unwind' edge of an invoke instruction.  bool BasicBlock::isLandingPad() const {    return isa<LandingPadInst>(getFirstNonPHI());  } -/// getLandingPadInst() - Return the landingpad instruction associated with -/// the landing pad. +/// Return the landingpad instruction associated with the landing pad.  LandingPadInst *BasicBlock::getLandingPadInst() {    return dyn_cast<LandingPadInst>(getFirstNonPHI());  }  | 
