"ghostify" the ilist<Function> sentinel

llvm-svn: 67872
This commit is contained in:
Gabor Greif 2009-03-27 22:28:33 +00:00
parent 8f5ec29b91
commit 41c8515b1b
2 changed files with 14 additions and 11 deletions

View File

@ -28,9 +28,20 @@ class FunctionType;
template<> struct ilist_traits<Function>
: public SymbolTableListTraits<Function, Module> {
// createSentinel is used to create a node that marks the end of the list.
static Function *createSentinel();
static void destroySentinel(Function *F) { delete F; }
// createSentinel is used to get hold of the node that marks the end of the
// list... (same trick used here as in ilist_traits<Instruction>)
Function *createSentinel() const {
return static_cast<Function*>(&Sentinel);
}
static void destroySentinel(Function*) {}
Function *provideInitialHead() const { return createSentinel(); }
Function *ensureHead(Function*) const { return createSentinel(); }
static void noteHead(Function*, Function*) {}
private:
mutable ilist_node<Function> Sentinel;
};
template<> struct ilist_traits<GlobalVariable>
: public SymbolTableListTraits<GlobalVariable, Module> {

View File

@ -29,14 +29,6 @@ using namespace llvm;
// Methods to implement the globals and functions lists.
//
Function *ilist_traits<Function>::createSentinel() {
FunctionType *FTy =
FunctionType::get(Type::VoidTy, std::vector<const Type*>(), false);
Function *Ret = Function::Create(FTy, GlobalValue::ExternalLinkage);
// This should not be garbage monitored.
LeakDetector::removeGarbageObject(Ret);
return Ret;
}
GlobalVariable *ilist_traits<GlobalVariable>::createSentinel() {
GlobalVariable *Ret = new GlobalVariable(Type::Int32Ty, false,
GlobalValue::ExternalLinkage);