From: Chris Lattner Date: Sun, 8 Sep 2002 18:59:35 +0000 (+0000) Subject: Enable "garbage detection" of LLVM objects. Now users should be obnoxious X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=d1e693f2a3883dacf213aa2b477540c57b53b714;p=oota-llvm.git Enable "garbage detection" of LLVM objects. Now users should be obnoxious warnings. If they accidentally leak LLVM Value's. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3620 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/VMCore/BasicBlock.cpp b/lib/VMCore/BasicBlock.cpp index 4271f32e7ac..bf7191c6593 100644 --- a/lib/VMCore/BasicBlock.cpp +++ b/lib/VMCore/BasicBlock.cpp @@ -1,4 +1,4 @@ -//===-- BasicBlock.cpp - Implement BasicBlock related functions --*- C++ -*--=// +//===-- BasicBlock.cpp - Implement BasicBlock related methods -------------===// // // This file implements the BasicBlock class for the VMCore library. // @@ -11,6 +11,7 @@ #include "llvm/Constant.h" #include "llvm/iPHINode.h" #include "llvm/SymbolTable.h" +#include "Support/LeakDetector.h" #include "SymbolTableListTraitsImpl.h" #include @@ -18,7 +19,10 @@ // instruction list. This is not a real instruction. // struct DummyInst : public Instruction { - DummyInst() : Instruction(Type::VoidTy, NumOtherOps) {} + DummyInst() : Instruction(Type::VoidTy, NumOtherOps) { + // This should not be garbage monitored. + LeakDetector::removeGarbageObject(this); + } virtual Instruction *clone() const { assert(0 && "Cannot clone EOL");abort(); @@ -56,6 +60,9 @@ BasicBlock::BasicBlock(const std::string &name, Function *Parent) // Initialize the instlist... InstList.setItemParent(this); + // Make sure that we get added to a function + LeakDetector::addGarbageObject(this); + if (Parent) Parent->getBasicBlockList().push_back(this); } @@ -66,7 +73,13 @@ BasicBlock::~BasicBlock() { } void BasicBlock::setParent(Function *parent) { + if (getParent()) + LeakDetector::addGarbageObject(this); + InstList.setParent(parent); + + if (getParent()) + LeakDetector::removeGarbageObject(this); } // Specialize setName to take care of symbol table majik diff --git a/lib/VMCore/Function.cpp b/lib/VMCore/Function.cpp index 59017178f68..fb940bf804a 100644 --- a/lib/VMCore/Function.cpp +++ b/lib/VMCore/Function.cpp @@ -8,10 +8,14 @@ #include "llvm/Module.h" #include "llvm/DerivedTypes.h" #include "llvm/iOther.h" +#include "Support/LeakDetector.h" #include "SymbolTableListTraitsImpl.h" BasicBlock *ilist_traits::createNode() { - return new BasicBlock(); + BasicBlock *Ret = new BasicBlock(); + // This should not be garbage monitored. + LeakDetector::removeGarbageObject(Ret); + return Ret; } iplist &ilist_traits::getList(Function *F) { @@ -19,7 +23,10 @@ iplist &ilist_traits::getList(Function *F) { } Argument *ilist_traits::createNode() { - return new Argument(Type::IntTy); + Argument *Ret = new Argument(Type::IntTy); + // This should not be garbage monitored. + LeakDetector::removeGarbageObject(Ret); + return Ret; } iplist &ilist_traits::getList(Function *F) { @@ -38,6 +45,10 @@ template SymbolTableListTraits; Argument::Argument(const Type *Ty, const std::string &Name = "", Function *Par) : Value(Ty, Value::ArgumentVal, Name) { Parent = 0; + + // Make sure that we get added to a function + LeakDetector::addGarbageObject(this); + if (Par) Par->getArgumentList().push_back(this); } @@ -54,7 +65,11 @@ void Argument::setName(const std::string &name, SymbolTable *ST) { } void Argument::setParent(Function *parent) { + if (getParent()) + LeakDetector::addGarbageObject(this); Parent = parent; + if (getParent()) + LeakDetector::removeGarbageObject(this); } @@ -71,6 +86,9 @@ Function::Function(const FunctionType *Ty, bool isInternal, ArgumentList.setParent(this); ParentSymTab = SymTab = 0; + // Make sure that we get added to a function + LeakDetector::addGarbageObject(this); + if (ParentModule) ParentModule->getFunctionList().push_back(this); } @@ -97,7 +115,11 @@ void Function::setName(const std::string &name, SymbolTable *ST) { } void Function::setParent(Module *parent) { + if (getParent()) + LeakDetector::addGarbageObject(this); Parent = parent; + if (getParent()) + LeakDetector::removeGarbageObject(this); // Relink symbol tables together... ParentSymTab = Parent ? Parent->getSymbolTableSure() : 0; @@ -157,12 +179,18 @@ GlobalVariable::GlobalVariable(const Type *Ty, bool constant, bool isIntern, isConstantGlobal(constant) { if (Initializer) Operands.push_back(Use((Value*)Initializer, this)); + LeakDetector::addGarbageObject(this); + if (ParentModule) ParentModule->getGlobalList().push_back(this); } void GlobalVariable::setParent(Module *parent) { + if (getParent()) + LeakDetector::addGarbageObject(this); Parent = parent; + if (getParent()) + LeakDetector::removeGarbageObject(this); } // Specialize setName to take care of symbol table majik diff --git a/lib/VMCore/Instruction.cpp b/lib/VMCore/Instruction.cpp index 2c7f6eae91f..4368b7e1092 100644 --- a/lib/VMCore/Instruction.cpp +++ b/lib/VMCore/Instruction.cpp @@ -7,15 +7,25 @@ #include "llvm/Function.h" #include "llvm/SymbolTable.h" #include "llvm/Type.h" +#include "Support/LeakDetector.h" Instruction::Instruction(const Type *ty, unsigned it, const std::string &Name) : User(ty, Value::InstructionVal, Name) { Parent = 0; iType = it; + + // Make sure that we get added to a basicblock + LeakDetector::addGarbageObject(this); } void Instruction::setParent(BasicBlock *P) { + if (getParent()) + LeakDetector::addGarbageObject(this); + Parent = P; + + if (getParent()) + LeakDetector::removeGarbageObject(this); } // Specialize setName to take care of symbol table majik diff --git a/lib/VMCore/Module.cpp b/lib/VMCore/Module.cpp index a895929280d..4bd3a884b30 100644 --- a/lib/VMCore/Module.cpp +++ b/lib/VMCore/Module.cpp @@ -9,16 +9,24 @@ #include "llvm/Constants.h" #include "llvm/DerivedTypes.h" #include "Support/STLExtras.h" +#include "Support/LeakDetector.h" #include "SymbolTableListTraitsImpl.h" #include #include Function *ilist_traits::createNode() { - return new Function(FunctionType::get(Type::VoidTy,std::vector(), - false), false); + FunctionType *FTy = + FunctionType::get(Type::VoidTy, std::vector(), false); + Function *Ret = new Function(FTy, false); + // This should not be garbage monitored. + LeakDetector::removeGarbageObject(Ret); + return Ret; } GlobalVariable *ilist_traits::createNode() { - return new GlobalVariable(Type::IntTy, false, false); + GlobalVariable *Ret = new GlobalVariable(Type::IntTy, false, false); + // This should not be garbage monitored. + LeakDetector::removeGarbageObject(Ret); + return Ret; } iplist &ilist_traits::getList(Module *M) { diff --git a/lib/VMCore/Value.cpp b/lib/VMCore/Value.cpp index ad2b1806684..402171be36a 100644 --- a/lib/VMCore/Value.cpp +++ b/lib/VMCore/Value.cpp @@ -7,6 +7,7 @@ #include "llvm/InstrTypes.h" #include "llvm/SymbolTable.h" #include "llvm/DerivedTypes.h" +#include "Support/LeakDetector.h" #include //===----------------------------------------------------------------------===// @@ -39,6 +40,9 @@ Value::~Value() { } #endif assert(Uses.begin() == Uses.end()); + + // There should be no uses of this object anymore, remove it. + LeakDetector::removeGarbageObject(this); } void Value::replaceAllUsesWith(Value *D) {