diff options
author | Gordon Henriksen <gordonhenriksen@mac.com> | 2007-12-09 22:46:10 +0000 |
---|---|---|
committer | Gordon Henriksen <gordonhenriksen@mac.com> | 2007-12-09 22:46:10 +0000 |
commit | ed455c8fa25dd37a13b33f0afa66be03ac49b5bb (patch) | |
tree | 7bfa961474e22f830710a49d4ed015fe374967b7 /include/llvm/BasicBlock.h | |
parent | 46a6e79e602b23ea3478027d5bdd1f904aea7924 (diff) | |
download | llvm-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.h | 31 |
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(); |