//===--- GenControl.cpp - IR Generation for Control Flow ------------------===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See https://swift.org/LICENSE.txt for license information // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// // // This file implements general IR generation for control flow. // //===----------------------------------------------------------------------===// #include "llvm/ADT/STLExtras.h" #include "llvm/IR/Function.h" #include "IRGenFunction.h" #include "IRGenModule.h" #include "swift/Basic/Assertions.h" using namespace swift; using namespace irgen; /// Insert the given basic block after the IP block and move the /// insertion point to it. Only valid if the IP is valid. void IRBuilder::emitBlock(llvm::BasicBlock *BB) { assert(ClearedIP == nullptr); llvm::BasicBlock *CurBB = GetInsertBlock(); assert(CurBB && "current insertion point is invalid"); CurBB->getParent()->insert(std::next(CurBB->getIterator()), BB); IRBuilderBase::SetInsertPoint(BB); } /// Create a new basic block with the given name. The block is not /// automatically inserted into the function. llvm::BasicBlock * IRGenFunction::createBasicBlock(const llvm::Twine &Name) { return llvm::BasicBlock::Create(IGM.getLLVMContext(), Name); }