X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FBasicBlock.h;h=ad509bb2cc5c976432965f6c8270f65cddcfef0d;hb=1327c5ab990c76bb4f02e5e12434580ce108123e;hp=f4c75f1134043a46a75bbd5aff62b2c229b0084b;hpb=c6c804b0d2b858d5ecded8c29fe6b086404ec0c9;p=oota-llvm.git diff --git a/include/llvm/BasicBlock.h b/include/llvm/BasicBlock.h index f4c75f11340..ad509bb2cc5 100644 --- a/include/llvm/BasicBlock.h +++ b/include/llvm/BasicBlock.h @@ -1,22 +1,28 @@ -//===-- llvm/BasicBlock.h - Represent a basic block in the VM ----*- C++ -*--=// -/// -/// \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... -/// +//===-- llvm/BasicBlock.h - Represent a basic block in the VM ---*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file was developed by the LLVM research group and is distributed under +// the University of Illinois Open Source License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// +// 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 @@ -24,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; @@ -53,24 +63,19 @@ 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 - virtual void setName(const std::string &name, SymbolTable *ST = 0); - /// getParent - Return the enclosing method, or null if none /// const Function *getParent() const { return InstList.getParent(); } @@ -89,16 +94,23 @@ public: TerminatorInst *getTerminator(); const TerminatorInst *const getTerminator() const; - // Provide a scoped predecessor and successor iterator - typedef PredIterator pred_iterator; - typedef PredIterator pred_const_iterator; - - typedef SuccIterator succ_iterator; - typedef SuccIterator succ_const_iterator; - - + /// 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(); + + /// getSinglePredecessor - If this basic block has a single predecessor block, + /// return the block, otherwise return a null pointer. + BasicBlock *getSinglePredecessor(); + const BasicBlock *getSinglePredecessor() const { + return const_cast(this)->getSinglePredecessor(); + } + //===--------------------------------------------------------------------===// /// Instruction iterator methods /// @@ -112,12 +124,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. @@ -125,7 +137,8 @@ public: const InstListType &getInstList() const { return InstList; } InstListType &getInstList() { return InstList; } - virtual void print(std::ostream &OS) const; + virtual void print(std::ostream &OS) const { print(OS, 0); } + void print(std::ostream &OS, AssemblyAnnotationWriter *AAW) const; /// Methods for support type inquiry through isa, cast, and dyn_cast: static inline bool classof(const BasicBlock *BB) { return true; } @@ -133,13 +146,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 @@ -173,4 +179,6 @@ public: BasicBlock *splitBasicBlock(iterator I, const std::string &BBName = ""); }; +} // End llvm namespace + #endif