diff options
author | Gordon Henriksen <gordonhenriksen@mac.com> | 2007-12-10 02:14:30 +0000 |
---|---|---|
committer | Gordon Henriksen <gordonhenriksen@mac.com> | 2007-12-10 02:14:30 +0000 |
commit | 14a5569f4ee2808b8d3f1ce2b3b022a8bf660874 (patch) | |
tree | e4f52be74838e7d49e82a9308e2c51b2aa48e227 /llvm/lib/VMCore/BasicBlock.cpp | |
parent | 3fbe73bef2247972615298fdc48a9d07460a2546 (diff) | |
download | bcm5719-llvm-14a5569f4ee2808b8d3f1ce2b3b022a8bf660874.tar.gz bcm5719-llvm-14a5569f4ee2808b8d3f1ce2b3b022a8bf660874.zip |
Reverting dtor devirtualization patch.
_sabre_: it has a major problem: by the time ~Value is run, all of the "parts" of the derived classes have been destroyed
_sabre_: the vtable lives to fight another day
llvm-svn: 44760
Diffstat (limited to 'llvm/lib/VMCore/BasicBlock.cpp')
-rw-r--r-- | llvm/lib/VMCore/BasicBlock.cpp | 38 |
1 files changed, 29 insertions, 9 deletions
diff --git a/llvm/lib/VMCore/BasicBlock.cpp b/llvm/lib/VMCore/BasicBlock.cpp index ad9ad4204c9..d45a1c41aa7 100644 --- a/llvm/lib/VMCore/BasicBlock.cpp +++ b/llvm/lib/VMCore/BasicBlock.cpp @@ -30,9 +30,31 @@ ilist_traits<Instruction>::getSymTab(BasicBlock *BB) { return 0; } -DummyInst::DummyInst() : Instruction(Type::VoidTy, OtherOpsEnd, 0, 0) { - // This should not be garbage monitored. - LeakDetector::removeGarbageObject(this); + +namespace { + /// DummyInst - An instance of this class is used to mark the end of the + /// instruction list. This is not a real instruction. + struct VISIBILITY_HIDDEN DummyInst : public Instruction { + DummyInst() : Instruction(Type::VoidTy, OtherOpsEnd, 0, 0) { + // This should not be garbage monitored. + LeakDetector::removeGarbageObject(this); + } + + 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)); + } + }; } Instruction *ilist_traits<Instruction>::createSentinel() { @@ -66,12 +88,10 @@ BasicBlock::BasicBlock(const std::string &Name, Function *NewParent, } -void BasicBlock::destroyThis(BasicBlock*v) -{ - assert(v->getParent() == 0 && "BasicBlock still linked into the program!"); - v->dropAllReferences(); - v->InstList.clear(); - Value::destroyThis(v); +BasicBlock::~BasicBlock() { + assert(getParent() == 0 && "BasicBlock still linked into the program!"); + dropAllReferences(); + InstList.clear(); } void BasicBlock::setParent(Function *parent) { |