summaryrefslogtreecommitdiff
path: root/include/llvm/BasicBlock.h
diff options
context:
space:
mode:
authorGordon Henriksen <gordonhenriksen@mac.com>2007-12-09 22:46:10 +0000
committerGordon Henriksen <gordonhenriksen@mac.com>2007-12-09 22:46:10 +0000
commited455c8fa25dd37a13b33f0afa66be03ac49b5bb (patch)
tree7bfa961474e22f830710a49d4ed015fe374967b7 /include/llvm/BasicBlock.h
parent46a6e79e602b23ea3478027d5bdd1f904aea7924 (diff)
downloadllvm-ed455c8fa25dd37a13b33f0afa66be03ac49b5bb.tar.gz
llvm-ed455c8fa25dd37a13b33f0afa66be03ac49b5bb.tar.bz2
llvm-ed455c8fa25dd37a13b33f0afa66be03ac49b5bb.tar.xz
Devirtualizing Value destructor (PR889). Patch by Pawel Kunio!
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@44747 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/BasicBlock.h')
-rw-r--r--include/llvm/BasicBlock.h31
1 files changed, 30 insertions, 1 deletions
diff --git a/include/llvm/BasicBlock.h b/include/llvm/BasicBlock.h
index cd38b4280c..d5a1fe1c33 100644
--- a/include/llvm/BasicBlock.h
+++ b/include/llvm/BasicBlock.h
@@ -65,6 +65,9 @@ private :
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;
@@ -76,7 +79,6 @@ public:
///
explicit BasicBlock(const std::string &Name = "", Function *Parent = 0,
BasicBlock *InsertBefore = 0);
- ~BasicBlock();
/// getParent - Return the enclosing method, or null if none
///
@@ -206,6 +208,33 @@ private:
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();