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
This commit is contained in:
Gordon Henriksen
2007-12-09 22:46:10 +00:00
parent 46a6e79e60
commit ed455c8fa2
22 changed files with 752 additions and 228 deletions

View File

@ -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();