17ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens//===-- llvm/BasicBlock.h - Represent a basic block in the VM ---*- C++ -*-===// 27ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens// 37ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens// The LLVM Compiler Infrastructure 47ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens// 57ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens// This file is distributed under the University of Illinois Open Source 67ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens// License. See LICENSE.TXT for details. 77ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens// 87ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens//===----------------------------------------------------------------------===// 97ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens// 107ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens// This file contains the declaration of the BasicBlock class. 117ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens// 127ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens//===----------------------------------------------------------------------===// 137ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 147ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens#ifndef LLVM_IR_BASICBLOCK_H 157ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens#define LLVM_IR_BASICBLOCK_H 167ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 177ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens#include "llvm/ADT/ilist.h" 182df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#include "llvm/ADT/ilist_node.h" 192df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#include "llvm/ADT/Twine.h" 207ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens#include "llvm/IR/Instruction.h" 217ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens#include "llvm/IR/SymbolTableListTraits.h" 222df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#include "llvm/IR/Value.h" 237ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens#include "llvm/Support/CBindingWrapping.h" 242df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#include "llvm-c/Types.h" 252df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#include <cassert> 262df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#include <cstddef> 277ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 287ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capensnamespace llvm { 297ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 307ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capensclass CallInst; 312df178997d17474042e8c3704cc93ab2db6619bfNicolas Capensclass Function; 327ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capensclass LandingPadInst; 337ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capensclass LLVMContext; 342df178997d17474042e8c3704cc93ab2db6619bfNicolas Capensclass TerminatorInst; 357ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 367ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens/// \brief LLVM Basic Block Representation 377ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens/// 387ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens/// This represents a single basic block in LLVM. A basic block is simply a 397ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens/// container of instructions that execute sequentially. Basic blocks are Values 407ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens/// because they are referenced by instructions such as branches and switch 417ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens/// tables. The type of a BasicBlock is "Type::LabelTy" because the basic block 427ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens/// represents a label to which a branch can jump. 437ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens/// 447ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens/// A well formed basic block is formed of a list of non-terminating 457ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens/// instructions followed by a single TerminatorInst instruction. 467ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens/// TerminatorInst's may not occur in the middle of basic blocks, and must 477ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens/// terminate the blocks. The BasicBlock class allows malformed basic blocks to 487ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens/// occur because it may be useful in the intermediate stage of constructing or 497ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens/// modifying a program. However, the verifier will ensure that basic blocks 507ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens/// are "well formed". 517ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capensclass BasicBlock : public Value, // Basic blocks are data objects also 527ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens public ilist_node_with_parent<BasicBlock, Function> { 537ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capenspublic: 547ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens typedef SymbolTableList<Instruction> InstListType; 557ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 567ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capensprivate: 572df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens friend class BlockAddress; 582df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens friend class SymbolTableListTraits<BasicBlock>; 592df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 607ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens InstListType InstList; 617ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens Function *Parent; 627ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 637ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens void setParent(Function *parent); 647ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 657ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Constructor. 667ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 677ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// If the function parameter is specified, the basic block is automatically 687ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// inserted at either the end of the function (if InsertBefore is null), or 697ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// before the specified basic block. 707ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens explicit BasicBlock(LLVMContext &C, const Twine &Name = "", 717ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens Function *Parent = nullptr, 727ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens BasicBlock *InsertBefore = nullptr); 732df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 747ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capenspublic: 752df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens BasicBlock(const BasicBlock &) = delete; 762df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens BasicBlock &operator=(const BasicBlock &) = delete; 772df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens ~BasicBlock() override; 782df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 797ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Get the context in which this basic block lives. 807ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens LLVMContext &getContext() const; 817ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 827ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Instruction iterators... 837ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens typedef InstListType::iterator iterator; 847ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens typedef InstListType::const_iterator const_iterator; 857ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens typedef InstListType::reverse_iterator reverse_iterator; 867ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens typedef InstListType::const_reverse_iterator const_reverse_iterator; 877ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 887ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Creates a new BasicBlock. 897ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 907ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// If the Parent parameter is specified, the basic block is automatically 917ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// inserted at either the end of the function (if InsertBefore is 0), or 927ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// before the specified basic block. 937ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens static BasicBlock *Create(LLVMContext &Context, const Twine &Name = "", 947ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens Function *Parent = nullptr, 957ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens BasicBlock *InsertBefore = nullptr) { 967ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return new BasicBlock(Context, Name, Parent, InsertBefore); 977ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 987ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 997ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Return the enclosing method, or null if none. 1007ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens const Function *getParent() const { return Parent; } 1017ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens Function *getParent() { return Parent; } 1027ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 1037ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Return the module owning the function this basic block belongs to, 1047ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// or nullptr it the function does not have a module. 1057ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 1067ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Note: this is undefined behavior if the block does not have a parent. 1077ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens const Module *getModule() const; 1087ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens Module *getModule(); 1097ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 1107ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Returns the terminator instruction if the block is well formed or 1117ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// null if the block is not well formed. 1127ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens TerminatorInst *getTerminator(); 1137ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens const TerminatorInst *getTerminator() const; 1147ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 1157ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Returns the call instruction calling @llvm.experimental.deoptimize 1167ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// prior to the terminating return instruction of this basic block, if such a 1177ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// call is present. Otherwise, returns null. 1187ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens CallInst *getTerminatingDeoptimizeCall(); 1197ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens const CallInst *getTerminatingDeoptimizeCall() const { 1207ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return const_cast<BasicBlock *>(this)->getTerminatingDeoptimizeCall(); 1217ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 1227ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 1237ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Returns the call instruction marked 'musttail' prior to the 1247ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// terminating return instruction of this basic block, if such a call is 1257ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// present. Otherwise, returns null. 1267ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens CallInst *getTerminatingMustTailCall(); 1277ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens const CallInst *getTerminatingMustTailCall() const { 1287ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return const_cast<BasicBlock *>(this)->getTerminatingMustTailCall(); 1297ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 1307ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 1317ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Returns a pointer to the first instruction in this block that is 1327ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// not a PHINode instruction. 1337ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 1347ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// When adding instructions to the beginning of the basic block, they should 1357ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// be added before the returned value, not before the first instruction, 1367ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// which might be PHI. Returns 0 is there's no non-PHI instruction. 1377ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens Instruction* getFirstNonPHI(); 1387ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens const Instruction* getFirstNonPHI() const { 1397ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return const_cast<BasicBlock*>(this)->getFirstNonPHI(); 1407ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 1417ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 1427ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Returns a pointer to the first instruction in this block that is not 1437ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// a PHINode or a debug intrinsic. 1447ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens Instruction* getFirstNonPHIOrDbg(); 1457ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens const Instruction* getFirstNonPHIOrDbg() const { 1467ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return const_cast<BasicBlock*>(this)->getFirstNonPHIOrDbg(); 1477ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 1487ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 1497ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Returns a pointer to the first instruction in this block that is not 1507ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// a PHINode, a debug intrinsic, or a lifetime intrinsic. 1517ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens Instruction* getFirstNonPHIOrDbgOrLifetime(); 1527ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens const Instruction* getFirstNonPHIOrDbgOrLifetime() const { 1537ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return const_cast<BasicBlock*>(this)->getFirstNonPHIOrDbgOrLifetime(); 1547ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 1557ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 1567ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Returns an iterator to the first instruction in this block that is 1577ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// suitable for inserting a non-PHI instruction. 1587ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 1597ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// In particular, it skips all PHIs and LandingPad instructions. 1607ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens iterator getFirstInsertionPt(); 1617ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens const_iterator getFirstInsertionPt() const { 1627ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return const_cast<BasicBlock*>(this)->getFirstInsertionPt(); 1637ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 1647ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 1657ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Unlink 'this' from the containing function, but do not delete it. 1667ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens void removeFromParent(); 1677ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 1687ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Unlink 'this' from the containing function and delete it. 1697ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 1707ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens // \returns an iterator pointing to the element after the erased one. 1717ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens SymbolTableList<BasicBlock>::iterator eraseFromParent(); 1727ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 1737ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Unlink this basic block from its current function and insert it 1747ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// into the function that \p MovePos lives in, right before \p MovePos. 1757ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens void moveBefore(BasicBlock *MovePos); 1767ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 1777ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Unlink this basic block from its current function and insert it 1787ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// right after \p MovePos in the function \p MovePos lives in. 1797ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens void moveAfter(BasicBlock *MovePos); 1807ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 1817ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Insert unlinked basic block into a function. 1827ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 1837ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Inserts an unlinked basic block into \c Parent. If \c InsertBefore is 1847ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// provided, inserts before that basic block, otherwise inserts at the end. 1857ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 1867ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \pre \a getParent() is \c nullptr. 1877ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens void insertInto(Function *Parent, BasicBlock *InsertBefore = nullptr); 1887ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 1897ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Return the predecessor of this block if it has a single predecessor 1907ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// block. Otherwise return a null pointer. 1917ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens BasicBlock *getSinglePredecessor(); 1927ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens const BasicBlock *getSinglePredecessor() const { 1937ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return const_cast<BasicBlock*>(this)->getSinglePredecessor(); 1947ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 1957ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 1967ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Return the predecessor of this block if it has a unique predecessor 1977ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// block. Otherwise return a null pointer. 1987ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 1997ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Note that unique predecessor doesn't mean single edge, there can be 2007ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// multiple edges from the unique predecessor to this block (for example a 2017ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// switch statement with multiple cases having the same destination). 2027ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens BasicBlock *getUniquePredecessor(); 2037ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens const BasicBlock *getUniquePredecessor() const { 2047ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return const_cast<BasicBlock*>(this)->getUniquePredecessor(); 2057ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 2067ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 2077ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Return the successor of this block if it has a single successor. 2087ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Otherwise return a null pointer. 2097ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 2107ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// This method is analogous to getSinglePredecessor above. 2117ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens BasicBlock *getSingleSuccessor(); 2127ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens const BasicBlock *getSingleSuccessor() const { 2137ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return const_cast<BasicBlock*>(this)->getSingleSuccessor(); 2147ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 2157ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 2167ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Return the successor of this block if it has a unique successor. 2177ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Otherwise return a null pointer. 2187ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 2197ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// This method is analogous to getUniquePredecessor above. 2207ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens BasicBlock *getUniqueSuccessor(); 2217ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens const BasicBlock *getUniqueSuccessor() const { 2227ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return const_cast<BasicBlock*>(this)->getUniqueSuccessor(); 2237ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 2247ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 2257ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens //===--------------------------------------------------------------------===// 2267ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Instruction iterator methods 2277ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 2287ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens inline iterator begin() { return InstList.begin(); } 2297ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens inline const_iterator begin() const { return InstList.begin(); } 2307ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens inline iterator end () { return InstList.end(); } 2317ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens inline const_iterator end () const { return InstList.end(); } 2327ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 2337ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens inline reverse_iterator rbegin() { return InstList.rbegin(); } 2347ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens inline const_reverse_iterator rbegin() const { return InstList.rbegin(); } 2357ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens inline reverse_iterator rend () { return InstList.rend(); } 2367ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens inline const_reverse_iterator rend () const { return InstList.rend(); } 2377ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 2387ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens inline size_t size() const { return InstList.size(); } 2397ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens inline bool empty() const { return InstList.empty(); } 2407ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens inline const Instruction &front() const { return InstList.front(); } 2417ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens inline Instruction &front() { return InstList.front(); } 2427ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens inline const Instruction &back() const { return InstList.back(); } 2437ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens inline Instruction &back() { return InstList.back(); } 2447ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 2457ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Return the underlying instruction list container. 2467ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 2477ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Currently you need to access the underlying instruction list container 2487ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// directly if you want to modify it. 2497ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens const InstListType &getInstList() const { return InstList; } 2507ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens InstListType &getInstList() { return InstList; } 2517ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 2527ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Returns a pointer to a member of the instruction list. 2537ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens static InstListType BasicBlock::*getSublistAccess(Instruction*) { 2547ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return &BasicBlock::InstList; 2557ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 2567ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 2577ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Returns a pointer to the symbol table if one exists. 2587ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens ValueSymbolTable *getValueSymbolTable(); 2597ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 2607ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Methods for support type inquiry through isa, cast, and dyn_cast. 2617ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens static inline bool classof(const Value *V) { 2627ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return V->getValueID() == Value::BasicBlockVal; 2637ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 2647ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 2657ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Cause all subinstructions to "let go" of all the references that 2667ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// said subinstructions are maintaining. 2677ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 2687ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// This allows one to 'delete' a whole class at a time, even though there may 2697ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// be circular references... first all references are dropped, and all use 2707ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// counts go to zero. Then everything is delete'd for real. Note that no 2717ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// operations are valid on an object that has "dropped all references", 2727ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// except operator delete. 2737ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens void dropAllReferences(); 2747ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 2757ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Notify the BasicBlock that the predecessor \p Pred is no longer 2767ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// able to reach it. 2777ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 2787ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// This is actually not used to update the Predecessor list, but is actually 2797ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// used to update the PHI nodes that reside in the block. Note that this 2807ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// should be called while the predecessor still refers to this block. 2817ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens void removePredecessor(BasicBlock *Pred, bool DontDeleteUselessPHIs = false); 2827ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 2837ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens bool canSplitPredecessors() const; 2847ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 2857ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Split the basic block into two basic blocks at the specified 2867ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// instruction. 2877ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 2887ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Note that all instructions BEFORE the specified iterator stay as part of 2897ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// the original basic block, an unconditional branch is added to the original 2907ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// BB, and the rest of the instructions in the BB are moved to the new BB, 2917ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// including the old terminator. The newly formed BasicBlock is returned. 2927ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// This function invalidates the specified iterator. 2937ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 2947ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Note that this only works on well formed basic blocks (must have a 2957ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// terminator), and 'I' must not be the end of instruction list (which would 2967ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// cause a degenerate basic block to be formed, having a terminator inside of 2977ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// the basic block). 2987ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 2997ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Also note that this doesn't preserve any passes. To split blocks while 3007ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// keeping loop information consistent, use the SplitBlock utility function. 3017ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens BasicBlock *splitBasicBlock(iterator I, const Twine &BBName = ""); 3027ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens BasicBlock *splitBasicBlock(Instruction *I, const Twine &BBName = "") { 3037ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return splitBasicBlock(I->getIterator(), BBName); 3047ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 3057ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 3067ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Returns true if there are any uses of this basic block other than 3077ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// direct branches, switches, etc. to it. 3087ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens bool hasAddressTaken() const { return getSubclassDataFromValue() != 0; } 3097ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 3107ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Update all phi nodes in this basic block's successors to refer to 3117ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// basic block \p New instead of to it. 3127ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens void replaceSuccessorsPhiUsesWith(BasicBlock *New); 3137ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 3147ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Return true if this basic block is an exception handling block. 3157ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens bool isEHPad() const { return getFirstNonPHI()->isEHPad(); } 3167ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 3177ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Return true if this basic block is a landing pad. 3187ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 3197ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Being a ``landing pad'' means that the basic block is the destination of 3207ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// the 'unwind' edge of an invoke instruction. 3217ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens bool isLandingPad() const; 3227ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 3237ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Return the landingpad instruction associated with the landing pad. 3247ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens LandingPadInst *getLandingPadInst(); 3257ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens const LandingPadInst *getLandingPadInst() const; 3267ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 3277ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capensprivate: 3287ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Increment the internal refcount of the number of BlockAddresses 3297ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// referencing this BasicBlock by \p Amt. 3307ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 3317ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// This is almost always 0, sometimes one possibly, but almost never 2, and 3327ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// inconceivably 3 or more. 3337ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens void AdjustBlockAddressRefCount(int Amt) { 3347ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens setValueSubclassData(getSubclassDataFromValue()+Amt); 3357ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens assert((int)(signed char)getSubclassDataFromValue() >= 0 && 3367ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens "Refcount wrap-around"); 3377ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 3382df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 3397ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Shadow Value::setValueSubclassData with a private forwarding method 3407ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// so that any future subclasses cannot accidentally use it. 3417ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens void setValueSubclassData(unsigned short D) { 3427ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens Value::setValueSubclassData(D); 3437ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 3447ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens}; 3457ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 3467ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens// Create wrappers for C Binding types (see CBindingWrapping.h). 3477ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas CapensDEFINE_SIMPLE_CONVERSION_FUNCTIONS(BasicBlock, LLVMBasicBlockRef) 3487ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 3492df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens} // end namespace llvm 3507ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 3512df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#endif // LLVM_IR_BASICBLOCK_H 352