X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FBasicBlock.h;h=2b1c3e0eea708c3a61fc64920ac62979a72e444f;hb=bca81448ac8e19c588c9a4ad16fc70732b76327c;hp=1a996bcf265ee597fed78f06f9b672eafdf10401;hpb=072ddb1dac5afbf5c789a4ea7c7a2a4205508011;p=oota-llvm.git diff --git a/include/llvm/BasicBlock.h b/include/llvm/BasicBlock.h index 1a996bcf265..2b1c3e0eea7 100644 --- a/include/llvm/BasicBlock.h +++ b/include/llvm/BasicBlock.h @@ -6,24 +6,23 @@ // the University of Illinois Open Source License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// -/// -/// \class BasicBlock -/// -/// This file contains the declaration of the BasicBlock class, which represents -/// a single basic block in the VM. -/// -/// Note that basic blocks themselves are Value's, because they are referenced -/// by instructions like branches and can go in switch tables and stuff... -/// +// +// +// This file contains the declaration of the BasicBlock class, which represents +// a single basic block in the VM. +// +// Note that basic blocks themselves are Value's, because they are referenced +// by instructions like branches and can go in switch tables and stuff... +// ///===---------------------------------------------------------------------===// -/// -/// Note that well formed basic blocks are formed of a list of instructions -/// followed by a single TerminatorInst instruction. TerminatorInst's may not -/// occur in the middle of basic blocks, and must terminate the blocks. -/// -/// This code allows malformed basic blocks to occur, because it may be useful -/// in the intermediate stage modification to a program. -/// +// +// Note that well formed basic blocks are formed of a list of instructions +// followed by a single TerminatorInst instruction. TerminatorInst's may not +// occur in the middle of basic blocks, and must terminate the blocks. +// +// This code allows malformed basic blocks to occur, because it may be useful +// in the intermediate stage modification to a program. +// //===----------------------------------------------------------------------===// #ifndef LLVM_BASICBLOCK_H @@ -31,20 +30,24 @@ #include "llvm/Instruction.h" #include "llvm/SymbolTableListTraits.h" -#include "Support/ilist" +#include "llvm/ADT/ilist" + +namespace llvm { class TerminatorInst; -template class SuccIterator; // Successor Iterator -template class PredIterator; +template class SuccIterator; // Successor Iterator +template class PredIterator; template<> struct ilist_traits : public SymbolTableListTraits { - // createNode is used to create a node that marks the end of the list... - static Instruction *createNode(); + // createSentinel is used to create a node that marks the end of the list... + static Instruction *createSentinel(); + static void destroySentinel(Instruction *I) { delete I; } static iplist &getList(BasicBlock *BB); }; -struct BasicBlock : public Value { // Basic blocks are data objects also +class BasicBlock : public Value { // Basic blocks are data objects also +public: typedef iplist InstListType; private : InstListType InstList; @@ -60,19 +63,17 @@ private : public: /// Instruction iterators... - typedef InstListType::iterator iterator; - typedef InstListType::const_iterator const_iterator; + typedef InstListType::iterator iterator; + typedef InstListType::const_iterator const_iterator; typedef std::reverse_iterator const_reverse_iterator; typedef std::reverse_iterator reverse_iterator; /// BasicBlock ctor - If the function parameter is specified, the basic block - /// is automatically inserted at the end of the function. + /// is automatically inserted at either the end of the function (if + /// InsertBefore is null), or before the specified basic block. /// - BasicBlock(const std::string &Name = "", Function *Parent = 0); - - /// BasicBlock ctor - If the InsertBefore parameter is specified, the basic - /// block is automatically inserted right before the specified block. - BasicBlock(const std::string &Name, BasicBlock *InsertBefore); + BasicBlock(const std::string &Name = "", Function *Parent = 0, + BasicBlock *InsertBefore = 0); ~BasicBlock(); // Specialize setName to take care of symbol table majik @@ -96,6 +97,18 @@ public: TerminatorInst *getTerminator(); const TerminatorInst *const getTerminator() const; + /// removeFromParent - This method unlinks 'this' from the containing + /// function, but does not delete it. + /// + void removeFromParent(); + + /// eraseFromParent - This method unlinks 'this' from the containing function + /// and deletes it. + /// + void eraseFromParent(); + + + //===--------------------------------------------------------------------===// /// Instruction iterator methods /// @@ -109,12 +122,12 @@ public: inline reverse_iterator rend () { return InstList.rend(); } inline const_reverse_iterator rend () const { return InstList.rend(); } - inline unsigned size() const { return InstList.size(); } + 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(); } + inline const Instruction &back() const { return InstList.back(); } + inline Instruction &back() { return InstList.back(); } /// getInstList() - Return the underlying instruction list container. You /// need to access it directly if you want to modify it currently. @@ -131,13 +144,6 @@ public: return V->getValueType() == Value::BasicBlockVal; } - /// hasConstantReferences() - This predicate is true if there is a - /// reference to this basic block in the constant pool for this method. For - /// example, if a block is reached through a switch table, that table resides - /// in the constant pool, and the basic block is reference from it. - /// - bool hasConstantReferences() const; - /// dropAllReferences() - This function causes all the subinstructions to "let /// go" of all references that they are maintaining. This allows one to /// 'delete' a whole class at a time, even though there may be circular @@ -171,4 +177,6 @@ public: BasicBlock *splitBasicBlock(iterator I, const std::string &BBName = ""); }; +} // End llvm namespace + #endif