Fix the cleanup process of exception information in JIT. Now JIT

deregisters registered by it FDE structures allowing consecutive
JIT runs to succeed.  Patch by Yuri.  Fixes PR8285.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@117004 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Duncan Sands
2010-10-21 08:57:29 +00:00
parent ba3f881007
commit b35fd448ce
3 changed files with 36 additions and 9 deletions

View File

@ -47,12 +47,12 @@ ExecutionEngine *(*ExecutionEngine::JITCtor)(
const SmallVectorImpl<std::string>& MAttrs) = 0;
ExecutionEngine *(*ExecutionEngine::InterpCtor)(Module *M,
std::string *ErrorStr) = 0;
ExecutionEngine::EERegisterFn ExecutionEngine::ExceptionTableRegister = 0;
ExecutionEngine::ExecutionEngine(Module *M)
: EEState(*this),
LazyFunctionCreator(0) {
LazyFunctionCreator(0),
ExceptionTableRegister(0),
ExceptionTableDeregister(0) {
CompilingLazily = false;
GVCompilationDisabled = false;
SymbolSearchingDisabled = false;
@ -66,6 +66,16 @@ ExecutionEngine::~ExecutionEngine() {
delete Modules[i];
}
void ExecutionEngine::DeregisterAllTables() {
if (ExceptionTableDeregister) {
std::vector<void*>::iterator it = AllExceptionTables.begin();
std::vector<void*>::iterator ite = AllExceptionTables.end();
for (; it != ite; ++it)
ExceptionTableDeregister(*it);
AllExceptionTables.clear();
}
}
namespace {
// This class automatically deletes the memory block when the GlobalVariable is
// destroyed.