On Wed, 2006-09-27 at 19:32 -0500, Chris Lattner wrote: > > Changes in directory llvm/include/llvm/Support: > > ManagedStatic.h added (r1.1) > --- > Log message: > > new helper class to provide more explicit management of static ctor/dtors.
Looks like an interesting approach to this problem. One question .. below > > > --- > Diffs of the changes: (+79 -0) > > ManagedStatic.h | 79 > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 files changed, 79 insertions(+) > > > Index: llvm/include/llvm/Support/ManagedStatic.h > diff -c /dev/null llvm/include/llvm/Support/ManagedStatic.h:1.1 > *** /dev/null Wed Sep 27 19:32:05 2006 > --- llvm/include/llvm/Support/ManagedStatic.h Wed Sep 27 19:31:55 2006 > *************** > *** 0 **** > --- 1,79 ---- > + //===-- llvm/Support/ManagedStatic.h - Static Global wrapper ----*- C++ > -*-===// > + // > + // The LLVM Compiler Infrastructure > + // > + // This file was developed by Chris Lattner and is distributed under > + // the University of Illinois Open Source License. See LICENSE.TXT for > details. > + // > + > //===----------------------------------------------------------------------===// > + // > + // This file defines the ManagedStatic class and the llvm_shutdown() > function. > + // > + > //===----------------------------------------------------------------------===// > + > + #ifndef LLVM_SUPPORT_MANAGED_STATIC_H > + #define LLVM_SUPPORT_MANAGED_STATIC_H > + > + namespace llvm { > + > + /// object_deleter - Helper method for ManagedStatic. > + /// > + template<class C> > + void object_deleter(void *Ptr) { > + delete (C*)Ptr; > + } > + > + /// ManagedStaticBase - Common base class for ManagedStatic instances. > + class ManagedStaticBase { > + protected: > + // This should only be used as a static variable, which guarantees that > this > + // will be zero initialized. > + mutable void *Ptr; > + mutable void (*DeleterFn)(void*); > + mutable const ManagedStaticBase *Next; > + > + void RegisterManagedStatic(void *ObjPtr, void (*deleter)(void*)) const; > + public: > + void destroy() const; > + }; > + > + /// ManagedStatic - This transparently changes the behavior of global > statics to > + /// be lazily constructed on demand (good for reducing startup times of > dynamic > + /// libraries that link in LLVM components) and for making destruction be > + /// explicit through the llvm_shutdown() function call. > + /// > + template<class C> > + class ManagedStatic : public ManagedStaticBase { > + public: > + > + // Accessors. > + C &operator*() { > + if (!Ptr) LazyInit(); > + return *static_cast<C*>(Ptr); > + } > + C *operator->() { > + if (!Ptr) LazyInit(); > + return static_cast<C*>(Ptr); > + } > + const C &operator*() const { > + if (!Ptr) LazyInit(); > + return *static_cast<C*>(Ptr); > + } > + const C *operator->() const { > + if (!Ptr) LazyInit(); > + return static_cast<C*>(Ptr); > + } > + > + public: > + void LazyInit() const { > + RegisterManagedStatic(new C(), object_deleter<C>); This requires a default constructor for class "C". How would that work for things like: static PrimType TheVoidTy ("void" , Type::VoidTyID); in Type.cpp ? Reid. _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits