//
// 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 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_BASICBLOCK_H
#include "llvm/Instruction.h"
#include "llvm/SymbolTableListTraits.h"
-#include "llvm/ADT/ilist"
+#include "llvm/ADT/ilist.h"
#include "llvm/Support/DataTypes.h"
namespace llvm {
BasicBlock(const BasicBlock &); // Do not implement
void operator=(const BasicBlock &); // Do not implement
-protected:
- static void destroyThis(BasicBlock*);
- friend class Value;
-public:
- /// Instruction iterators...
- typedef InstListType::iterator iterator;
- typedef InstListType::const_iterator const_iterator;
-
/// BasicBlock ctor - 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(const std::string &Name = "", Function *Parent = 0,
BasicBlock *InsertBefore = 0);
+public:
+ /// Instruction iterators...
+ typedef InstListType::iterator iterator;
+ typedef InstListType::const_iterator const_iterator;
+
+ // allocate space for exactly zero operands
+ static BasicBlock *Create(const std::string &Name = "", Function *Parent = 0,
+ BasicBlock *InsertBefore = 0) {
+ return new BasicBlock(Name, Parent, InsertBefore);
+ }
+ ~BasicBlock();
/// getParent - Return the enclosing method, or null if none
///
/// 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();
+ }
/// removeFromParent - This method unlinks 'this' from the containing
/// function, but does not delete it.
const BasicBlock *getPrev() const { return Prev; }
};
-/// DummyInst - An instance of this class is used to mark the end of the
-/// instruction list. This is not a real instruction.
-class DummyInst : public Instruction {
-protected:
- static void destroyThis(DummyInst* v) {
- Instruction::destroyThis(v);
- }
- friend class Value;
-public:
- DummyInst();
-
- Instruction *clone() const {
- assert(0 && "Cannot clone EOL");abort();
- return 0;
- }
- const char *getOpcodeName() const { return "*end-of-list-inst*"; }
-
- // Methods for support type inquiry through isa, cast, and dyn_cast...
- static inline bool classof(const DummyInst *) { return true; }
- static inline bool classof(const Instruction *I) {
- return I->getOpcode() == OtherOpsEnd;
- }
- static inline bool classof(const Value *V) {
- return isa<Instruction>(V) && classof(cast<Instruction>(V));
- }
-};
-
inline int
ilist_traits<Instruction>::getListOffset() {
return BasicBlock::getInstListOffset();