| //===-- llvm/BasicBlock.h - Represent a basic block in the VM ---*- C++ -*-===// | 
 | // | 
 | //                     The LLVM Compiler Infrastructure | 
 | // | 
 | // This file is distributed under the University of Illinois Open Source | 
 | // License. See LICENSE.TXT for details. | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 | // | 
 | // This file contains the declaration of the BasicBlock class. | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 |  | 
 | #ifndef LLVM_IR_BASICBLOCK_H | 
 | #define LLVM_IR_BASICBLOCK_H | 
 |  | 
 | #include "llvm/ADT/ilist.h" | 
 | #include "llvm/ADT/ilist_node.h" | 
 | #include "llvm/ADT/Twine.h" | 
 | #include "llvm/IR/Instruction.h" | 
 | #include "llvm/IR/SymbolTableListTraits.h" | 
 | #include "llvm/IR/Value.h" | 
 | #include "llvm/Support/CBindingWrapping.h" | 
 | #include "llvm-c/Types.h" | 
 | #include <cassert> | 
 | #include <cstddef> | 
 |  | 
 | namespace llvm { | 
 |  | 
 | class CallInst; | 
 | class Function; | 
 | class LandingPadInst; | 
 | class LLVMContext; | 
 | class TerminatorInst; | 
 |  | 
 | /// \brief LLVM Basic Block Representation | 
 | /// | 
 | /// This represents a single basic block in LLVM. A basic block is simply a | 
 | /// container of instructions that execute sequentially. Basic blocks are Values | 
 | /// because they are referenced by instructions such as branches and switch | 
 | /// tables. The type of a BasicBlock is "Type::LabelTy" because the basic block | 
 | /// represents a label to which a branch can jump. | 
 | /// | 
 | /// A well formed basic block is formed of a list of non-terminating | 
 | /// instructions followed by a single TerminatorInst instruction. | 
 | /// TerminatorInst's may not occur in the middle of basic blocks, and must | 
 | /// terminate the blocks. The BasicBlock class allows malformed basic blocks to | 
 | /// occur because it may be useful in the intermediate stage of constructing or | 
 | /// modifying a program. However, the verifier will ensure that basic blocks | 
 | /// are "well formed". | 
 | class BasicBlock : public Value, // Basic blocks are data objects also | 
 |                    public ilist_node_with_parent<BasicBlock, Function> { | 
 | public: | 
 |   typedef SymbolTableList<Instruction> InstListType; | 
 |  | 
 | private: | 
 |   friend class BlockAddress; | 
 |   friend class SymbolTableListTraits<BasicBlock>; | 
 |  | 
 |   InstListType InstList; | 
 |   Function *Parent; | 
 |  | 
 |   void setParent(Function *parent); | 
 |  | 
 |   /// \brief Constructor. | 
 |   /// | 
 |   /// If the function parameter is specified, the basic block is automatically | 
 |   /// inserted at either the end of the function (if InsertBefore is null), or | 
 |   /// before the specified basic block. | 
 |   explicit BasicBlock(LLVMContext &C, const Twine &Name = "", | 
 |                       Function *Parent = nullptr, | 
 |                       BasicBlock *InsertBefore = nullptr); | 
 |  | 
 | public: | 
 |   BasicBlock(const BasicBlock &) = delete; | 
 |   BasicBlock &operator=(const BasicBlock &) = delete; | 
 |   ~BasicBlock() override; | 
 |  | 
 |   /// \brief Get the context in which this basic block lives. | 
 |   LLVMContext &getContext() const; | 
 |  | 
 |   /// Instruction iterators... | 
 |   typedef InstListType::iterator iterator; | 
 |   typedef InstListType::const_iterator const_iterator; | 
 |   typedef InstListType::reverse_iterator reverse_iterator; | 
 |   typedef InstListType::const_reverse_iterator const_reverse_iterator; | 
 |  | 
 |   /// \brief Creates a new BasicBlock. | 
 |   /// | 
 |   /// If the Parent parameter is specified, the basic block is automatically | 
 |   /// inserted at either the end of the function (if InsertBefore is 0), or | 
 |   /// before the specified basic block. | 
 |   static BasicBlock *Create(LLVMContext &Context, const Twine &Name = "", | 
 |                             Function *Parent = nullptr, | 
 |                             BasicBlock *InsertBefore = nullptr) { | 
 |     return new BasicBlock(Context, Name, Parent, InsertBefore); | 
 |   } | 
 |  | 
 |   /// \brief Return the enclosing method, or null if none. | 
 |   const Function *getParent() const { return Parent; } | 
 |         Function *getParent()       { return Parent; } | 
 |  | 
 |   /// \brief Return the module owning the function this basic block belongs to, | 
 |   /// or nullptr it the function does not have a module. | 
 |   /// | 
 |   /// Note: this is undefined behavior if the block does not have a parent. | 
 |   const Module *getModule() const; | 
 |   Module *getModule(); | 
 |  | 
 |   /// \brief Returns the terminator instruction if the block is well formed or | 
 |   /// null if the block is not well formed. | 
 |   TerminatorInst *getTerminator(); | 
 |   const TerminatorInst *getTerminator() const; | 
 |  | 
 |   /// \brief Returns the call instruction calling @llvm.experimental.deoptimize | 
 |   /// prior to the terminating return instruction of this basic block, if such a | 
 |   /// call is present.  Otherwise, returns null. | 
 |   CallInst *getTerminatingDeoptimizeCall(); | 
 |   const CallInst *getTerminatingDeoptimizeCall() const { | 
 |     return const_cast<BasicBlock *>(this)->getTerminatingDeoptimizeCall(); | 
 |   } | 
 |  | 
 |   /// \brief Returns the call instruction marked 'musttail' prior to the | 
 |   /// terminating return instruction of this basic block, if such a call is | 
 |   /// present.  Otherwise, returns null. | 
 |   CallInst *getTerminatingMustTailCall(); | 
 |   const CallInst *getTerminatingMustTailCall() const { | 
 |     return const_cast<BasicBlock *>(this)->getTerminatingMustTailCall(); | 
 |   } | 
 |  | 
 |   /// \brief Returns a pointer to the first instruction in this block that is | 
 |   /// not a PHINode instruction. | 
 |   /// | 
 |   /// When adding instructions to the beginning of the basic block, they should | 
 |   /// be added before the returned value, not before the first instruction, | 
 |   /// which might be PHI. Returns 0 is there's no non-PHI instruction. | 
 |   Instruction* getFirstNonPHI(); | 
 |   const Instruction* getFirstNonPHI() const { | 
 |     return const_cast<BasicBlock*>(this)->getFirstNonPHI(); | 
 |   } | 
 |  | 
 |   /// \brief Returns a pointer to the first instruction in this block that is not | 
 |   /// a PHINode or a debug intrinsic. | 
 |   Instruction* getFirstNonPHIOrDbg(); | 
 |   const Instruction* getFirstNonPHIOrDbg() const { | 
 |     return const_cast<BasicBlock*>(this)->getFirstNonPHIOrDbg(); | 
 |   } | 
 |  | 
 |   /// \brief Returns a pointer to the first instruction in this block that is not | 
 |   /// a PHINode, a debug intrinsic, or a lifetime intrinsic. | 
 |   Instruction* getFirstNonPHIOrDbgOrLifetime(); | 
 |   const Instruction* getFirstNonPHIOrDbgOrLifetime() const { | 
 |     return const_cast<BasicBlock*>(this)->getFirstNonPHIOrDbgOrLifetime(); | 
 |   } | 
 |  | 
 |   /// \brief Returns an iterator to the first instruction in this block that is | 
 |   /// suitable for inserting a non-PHI instruction. | 
 |   /// | 
 |   /// In particular, it skips all PHIs and LandingPad instructions. | 
 |   iterator getFirstInsertionPt(); | 
 |   const_iterator getFirstInsertionPt() const { | 
 |     return const_cast<BasicBlock*>(this)->getFirstInsertionPt(); | 
 |   } | 
 |  | 
 |   /// \brief Unlink 'this' from the containing function, but do not delete it. | 
 |   void removeFromParent(); | 
 |  | 
 |   /// \brief Unlink 'this' from the containing function and delete it. | 
 |   /// | 
 |   // \returns an iterator pointing to the element after the erased one. | 
 |   SymbolTableList<BasicBlock>::iterator eraseFromParent(); | 
 |  | 
 |   /// \brief Unlink this basic block from its current function and insert it | 
 |   /// into the function that \p MovePos lives in, right before \p MovePos. | 
 |   void moveBefore(BasicBlock *MovePos); | 
 |  | 
 |   /// \brief Unlink this basic block from its current function and insert it | 
 |   /// right after \p MovePos in the function \p MovePos lives in. | 
 |   void moveAfter(BasicBlock *MovePos); | 
 |  | 
 |   /// \brief Insert unlinked basic block into a function. | 
 |   /// | 
 |   /// Inserts an unlinked basic block into \c Parent.  If \c InsertBefore is | 
 |   /// provided, inserts before that basic block, otherwise inserts at the end. | 
 |   /// | 
 |   /// \pre \a getParent() is \c nullptr. | 
 |   void insertInto(Function *Parent, BasicBlock *InsertBefore = nullptr); | 
 |  | 
 |   /// \brief Return the predecessor of this block if it has a single predecessor | 
 |   /// block. Otherwise return a null pointer. | 
 |   BasicBlock *getSinglePredecessor(); | 
 |   const BasicBlock *getSinglePredecessor() const { | 
 |     return const_cast<BasicBlock*>(this)->getSinglePredecessor(); | 
 |   } | 
 |  | 
 |   /// \brief Return the predecessor of this block if it has a unique predecessor | 
 |   /// 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 a | 
 |   /// switch statement with multiple cases having the same destination). | 
 |   BasicBlock *getUniquePredecessor(); | 
 |   const BasicBlock *getUniquePredecessor() const { | 
 |     return const_cast<BasicBlock*>(this)->getUniquePredecessor(); | 
 |   } | 
 |  | 
 |   /// \brief Return the successor of this block if it has a single successor. | 
 |   /// Otherwise return a null pointer. | 
 |   /// | 
 |   /// This method is analogous to getSinglePredecessor above. | 
 |   BasicBlock *getSingleSuccessor(); | 
 |   const BasicBlock *getSingleSuccessor() const { | 
 |     return const_cast<BasicBlock*>(this)->getSingleSuccessor(); | 
 |   } | 
 |  | 
 |   /// \brief Return the successor of this block if it has a unique successor. | 
 |   /// Otherwise return a null pointer. | 
 |   /// | 
 |   /// This method is analogous to getUniquePredecessor above. | 
 |   BasicBlock *getUniqueSuccessor(); | 
 |   const BasicBlock *getUniqueSuccessor() const { | 
 |     return const_cast<BasicBlock*>(this)->getUniqueSuccessor(); | 
 |   } | 
 |  | 
 |   //===--------------------------------------------------------------------===// | 
 |   /// Instruction iterator methods | 
 |   /// | 
 |   inline iterator                begin()       { return InstList.begin(); } | 
 |   inline const_iterator          begin() const { return InstList.begin(); } | 
 |   inline iterator                end  ()       { return InstList.end();   } | 
 |   inline const_iterator          end  () const { return InstList.end();   } | 
 |  | 
 |   inline reverse_iterator        rbegin()       { return InstList.rbegin(); } | 
 |   inline const_reverse_iterator  rbegin() const { return InstList.rbegin(); } | 
 |   inline reverse_iterator        rend  ()       { return InstList.rend();   } | 
 |   inline const_reverse_iterator  rend  () const { return InstList.rend();   } | 
 |  | 
 |   inline size_t                   size() const { return InstList.size();  } | 
 |   inline bool                    empty() const { return InstList.empty(); } | 
 |   inline const Instruction      &front() const { return InstList.front(); } | 
 |   inline       Instruction      &front()       { return InstList.front(); } | 
 |   inline const Instruction       &back() const { return InstList.back();  } | 
 |   inline       Instruction       &back()       { return InstList.back();  } | 
 |  | 
 |   /// \brief Return the underlying instruction list container. | 
 |   /// | 
 |   /// Currently you need to access the underlying instruction list container | 
 |   /// directly if you want to modify it. | 
 |   const InstListType &getInstList() const { return InstList; } | 
 |         InstListType &getInstList()       { return InstList; } | 
 |  | 
 |   /// \brief Returns a pointer to a member of the instruction list. | 
 |   static InstListType BasicBlock::*getSublistAccess(Instruction*) { | 
 |     return &BasicBlock::InstList; | 
 |   } | 
 |  | 
 |   /// \brief Returns a pointer to the symbol table if one exists. | 
 |   ValueSymbolTable *getValueSymbolTable(); | 
 |  | 
 |   /// \brief Methods for support type inquiry through isa, cast, and dyn_cast. | 
 |   static inline bool classof(const Value *V) { | 
 |     return V->getValueID() == Value::BasicBlockVal; | 
 |   } | 
 |  | 
 |   /// \brief Cause all subinstructions to "let go" of all the references that | 
 |   /// said subinstructions are maintaining. | 
 |   /// | 
 |   /// This allows one to 'delete' a whole class at a time, even though there may | 
 |   /// be circular references... first all references are dropped, and all use | 
 |   /// counts go to zero.  Then everything is delete'd for real.  Note that no | 
 |   /// operations are valid on an object that has "dropped all references", | 
 |   /// except operator delete. | 
 |   void dropAllReferences(); | 
 |  | 
 |   /// \brief Notify the BasicBlock that the predecessor \p Pred 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 called while the predecessor still refers to this block. | 
 |   void removePredecessor(BasicBlock *Pred, bool DontDeleteUselessPHIs = false); | 
 |  | 
 |   bool canSplitPredecessors() const; | 
 |  | 
 |   /// \brief Split the basic block into two basic blocks 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 original | 
 |   /// BB, and the rest of the instructions in the BB are moved to the new BB, | 
 |   /// including the old terminator.  The newly formed BasicBlock is returned. | 
 |   /// This function invalidates the specified iterator. | 
 |   /// | 
 |   /// Note that this only works on well formed basic blocks (must have a | 
 |   /// terminator), and 'I' must not be the end of instruction list (which would | 
 |   /// cause a degenerate basic block to be formed, having a terminator inside of | 
 |   /// the basic block). | 
 |   /// | 
 |   /// Also note that this doesn't preserve any passes. To split blocks while | 
 |   /// keeping loop information consistent, use the SplitBlock utility function. | 
 |   BasicBlock *splitBasicBlock(iterator I, const Twine &BBName = ""); | 
 |   BasicBlock *splitBasicBlock(Instruction *I, const Twine &BBName = "") { | 
 |     return splitBasicBlock(I->getIterator(), BBName); | 
 |   } | 
 |  | 
 |   /// \brief Returns true if there are any uses of this basic block other than | 
 |   /// direct branches, switches, etc. to it. | 
 |   bool hasAddressTaken() const { return getSubclassDataFromValue() != 0; } | 
 |  | 
 |   /// \brief Update all phi nodes in this basic block's successors to refer to | 
 |   /// basic block \p New instead of to it. | 
 |   void replaceSuccessorsPhiUsesWith(BasicBlock *New); | 
 |  | 
 |   /// \brief Return true if this basic block is an exception handling block. | 
 |   bool isEHPad() const { return getFirstNonPHI()->isEHPad(); } | 
 |  | 
 |   /// \brief Return true if this basic block is a landing pad. | 
 |   /// | 
 |   /// Being a ``landing pad'' means that the basic block is the destination of | 
 |   /// the 'unwind' edge of an invoke instruction. | 
 |   bool isLandingPad() const; | 
 |  | 
 |   /// \brief Return the landingpad instruction associated with the landing pad. | 
 |   LandingPadInst *getLandingPadInst(); | 
 |   const LandingPadInst *getLandingPadInst() const; | 
 |  | 
 | private: | 
 |   /// \brief Increment the internal refcount of the number of BlockAddresses | 
 |   /// referencing this BasicBlock by \p Amt. | 
 |   /// | 
 |   /// This is almost always 0, sometimes one possibly, but almost never 2, and | 
 |   /// inconceivably 3 or more. | 
 |   void AdjustBlockAddressRefCount(int Amt) { | 
 |     setValueSubclassData(getSubclassDataFromValue()+Amt); | 
 |     assert((int)(signed char)getSubclassDataFromValue() >= 0 && | 
 |            "Refcount wrap-around"); | 
 |   } | 
 |  | 
 |   /// \brief Shadow Value::setValueSubclassData with a private forwarding method | 
 |   /// so that any future subclasses cannot accidentally use it. | 
 |   void setValueSubclassData(unsigned short D) { | 
 |     Value::setValueSubclassData(D); | 
 |   } | 
 | }; | 
 |  | 
 | // Create wrappers for C Binding types (see CBindingWrapping.h). | 
 | DEFINE_SIMPLE_CONVERSION_FUNCTIONS(BasicBlock, LLVMBasicBlockRef) | 
 |  | 
 | } // end namespace llvm | 
 |  | 
 | #endif // LLVM_IR_BASICBLOCK_H |