forked from OSchip/llvm-project
Clarify the ownership model of LLVMContext and Module. Namely, contexts own
modules are instantiated in them. If the context is deleted, all of its owned modules are also deleted. llvm-svn: 113374
This commit is contained in:
parent
10b9b7b4bd
commit
8e89e41faf
|
@ -20,6 +20,7 @@ namespace llvm {
|
|||
class LLVMContextImpl;
|
||||
class StringRef;
|
||||
class Instruction;
|
||||
class Module;
|
||||
template <typename T> class SmallVectorImpl;
|
||||
|
||||
/// This is an important class for using LLVM in a threaded context. It
|
||||
|
@ -37,6 +38,13 @@ public:
|
|||
LLVMContext();
|
||||
~LLVMContext();
|
||||
|
||||
/// addModule - Register a module as being instantiated in this context. If
|
||||
/// the context is deleted, the module will be deleted as well.
|
||||
void addModule(Module*);
|
||||
|
||||
/// removeModule - Unregister a module from this context.
|
||||
void removeModule(Module*);
|
||||
|
||||
// Pinned metadata names, which always have the same value. This is a
|
||||
// compile-time performance optimization, not a correctness optimization.
|
||||
enum {
|
||||
|
|
|
@ -34,6 +34,14 @@ LLVMContext::LLVMContext() : pImpl(new LLVMContextImpl(*this)) {
|
|||
}
|
||||
LLVMContext::~LLVMContext() { delete pImpl; }
|
||||
|
||||
void LLVMContext::addModule(Module *M) {
|
||||
pImpl->OwnedModules.insert(M);
|
||||
}
|
||||
|
||||
void LLVMContext::removeModule(Module *M) {
|
||||
pImpl->OwnedModules.erase(M);
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Recoverable Backend Errors
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "LLVMContextImpl.h"
|
||||
#include "llvm/Module.h"
|
||||
#include <algorithm>
|
||||
using namespace llvm;
|
||||
|
||||
|
@ -51,6 +52,15 @@ struct DropReferences {
|
|||
}
|
||||
|
||||
LLVMContextImpl::~LLVMContextImpl() {
|
||||
// NOTE: We need to delete the contents of OwnedModules, but we have to
|
||||
// duplicate it into a temporary vector, because the destructor of Module
|
||||
// will try to remove itself from OwnedModules set. This would cause
|
||||
// iterator invalidation if we iterated on the set directly.
|
||||
std::vector<Module*> Modules(OwnedModules.begin(), OwnedModules.end());
|
||||
for (std::vector<Module*>::iterator I = Modules.begin(), E = Modules.end();
|
||||
I != E; ++I)
|
||||
delete *I;
|
||||
|
||||
std::for_each(ExprConstants.map_begin(), ExprConstants.map_end(),
|
||||
DropReferences());
|
||||
std::for_each(ArrayConstants.map_begin(), ArrayConstants.map_end(),
|
||||
|
|
|
@ -115,6 +115,10 @@ public:
|
|||
|
||||
class LLVMContextImpl {
|
||||
public:
|
||||
/// OwnedModules - The set of modules instantiated in this context, and which
|
||||
/// will be automatically deleted if this context is deleted.
|
||||
SmallPtrSet<Module*, 4> OwnedModules;
|
||||
|
||||
void *InlineAsmDiagHandler, *InlineAsmDiagContext;
|
||||
|
||||
typedef DenseMap<DenseMapAPIntKeyInfo::KeyTy, ConstantInt*,
|
||||
|
|
|
@ -62,9 +62,11 @@ Module::Module(StringRef MID, LLVMContext& C)
|
|||
ValSymTab = new ValueSymbolTable();
|
||||
TypeSymTab = new TypeSymbolTable();
|
||||
NamedMDSymTab = new StringMap<NamedMDNode *>();
|
||||
Context.addModule(this);
|
||||
}
|
||||
|
||||
Module::~Module() {
|
||||
Context.removeModule(this);
|
||||
dropAllReferences();
|
||||
GlobalList.clear();
|
||||
FunctionList.clear();
|
||||
|
|
Loading…
Reference in New Issue