//===--- SILSuccessor.cpp - Implementation of SILSuccessor.h --------------===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2016 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See http://swift.org/LICENSE.txt for license information // See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// #include "swift/SIL/SILSuccessor.h" #include "swift/SIL/SILBasicBlock.h" using namespace swift; void SILSuccessor::operator=(SILBasicBlock *BB) { // If we're not changing anything, we're done. if (SuccessorBlock == BB) return; assert(ContainingInst &&"init method not called after default construction?"); // If we were already pointing to a basic block, remove ourself from its // predecessor list. if (SuccessorBlock) { *Prev = Next; if (Next) Next->Prev = Prev; } // If we have a successor, add ourself to its prev list. if (BB) { Prev = &BB->PredList; Next = BB->PredList; if (Next) Next->Prev = &Next; BB->PredList = this; } SuccessorBlock = BB; } // Dereferencing the SuccIterator returns the predecessor's SILBasicBlock. SILBasicBlock *SILSuccessorIterator::operator*() { assert(Cur && "Can't deference end (or default constructed) iterator"); return Cur->ContainingInst->getParent(); }