mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-14 00:32:55 +00:00
new helper class to provide more explicit management of static ctor/dtors.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@30638 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
8af24b86a8
commit
771cbf30bc
79
include/llvm/Support/ManagedStatic.h
Normal file
79
include/llvm/Support/ManagedStatic.h
Normal file
@ -0,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>);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/// llvm_shutdown - Deallocate and destroy all ManagedStatic variables.
|
||||
void llvm_shutdown();
|
||||
|
||||
}
|
||||
|
||||
#endif
|
53
lib/Support/ManagedStatic.cpp
Normal file
53
lib/Support/ManagedStatic.cpp
Normal file
@ -0,0 +1,53 @@
|
||||
//===-- ManagedStatic.cpp - Static Global wrapper -------------------------===//
|
||||
//
|
||||
// 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 implements the ManagedStatic class and llvm_shutdown().
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/Support/ManagedStatic.h"
|
||||
#include <cassert>
|
||||
using namespace llvm;
|
||||
|
||||
static const ManagedStaticBase *StaticList = 0;
|
||||
|
||||
void ManagedStaticBase::RegisterManagedStatic(void *ObjPtr,
|
||||
void (*Deleter)(void*)) const {
|
||||
assert(Ptr == 0 && DeleterFn == 0 && Next == 0 &&
|
||||
"Partially init static?");
|
||||
Ptr = ObjPtr;
|
||||
DeleterFn = Deleter;
|
||||
|
||||
// Add to list of managed statics.
|
||||
Next = StaticList;
|
||||
StaticList = this;
|
||||
}
|
||||
|
||||
void ManagedStaticBase::destroy() const {
|
||||
assert(Ptr && DeleterFn && "ManagedStatic not initialized correctly!");
|
||||
assert(StaticList == this &&
|
||||
"Not destroyed in reverse order of construction?");
|
||||
// Unlink from list.
|
||||
StaticList = Next;
|
||||
Next = 0;
|
||||
|
||||
// Destroy memory.
|
||||
DeleterFn(Ptr);
|
||||
|
||||
// Cleanup.
|
||||
Ptr = 0;
|
||||
DeleterFn = 0;
|
||||
}
|
||||
|
||||
/// llvm_shutdown - Deallocate and destroy all ManagedStatic variables.
|
||||
void llvm_shutdown() {
|
||||
while (StaticList)
|
||||
StaticList->destroy();
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user