Fix #4005 regression

Delay unregister EH frames (Linux)
This commit is contained in:
Nekotekina 2018-01-01 10:40:57 +03:00
parent 383c501a35
commit 198e9dce1d
2 changed files with 29 additions and 3 deletions

View File

@ -71,6 +71,8 @@ static void* s_next = s_memory;
#ifdef _WIN32
static std::deque<std::vector<RUNTIME_FUNCTION>> s_unwater;
static std::vector<std::vector<RUNTIME_FUNCTION>> s_unwind; // .pdata
#else
static std::deque<std::tuple<u8*, u64, std::size_t>> s_unfire;
#endif
// Reset memory manager
@ -87,7 +89,30 @@ extern void jit_finalize()
s_unwind.clear();
#else
// TODO: unregister EH frames if necessary
struct MemoryManager : llvm::RTDyldMemoryManager
{
u8* allocateCodeSection(std::uintptr_t size, uint align, uint sec_id, llvm::StringRef sec_name) override
{
return nullptr;
}
u8* allocateDataSection(std::uintptr_t size, uint align, uint sec_id, llvm::StringRef sec_name, bool is_ro) override
{
return nullptr;
}
bool finalizeMemory(std::string* = nullptr) override
{
return false;
}
} mem;
for (auto&& t : s_unfire)
{
mem.deregisterEHFrames(std::get<0>(t), std::get<1>(t), std::get<2>(t));
}
s_unfire.clear();
#endif
utils::memory_decommit(s_memory, s_memory_size);
@ -261,6 +286,8 @@ struct MemoryManager : llvm::RTDyldMemoryManager
{
s_unwind.emplace_back(std::move(pdata));
}
#else
s_unfire.push_front(std::make_tuple(addr, load_addr, size));
#endif
return RTDyldMemoryManager::registerEHFrames(addr, load_addr, size);
@ -268,7 +295,6 @@ struct MemoryManager : llvm::RTDyldMemoryManager
void deregisterEHFrames(u8* addr, u64 load_addr, std::size_t size) override
{
return RTDyldMemoryManager::deregisterEHFrames(addr, load_addr, size);
}
};

View File

@ -1181,7 +1181,7 @@ extern void ppu_initialize(const ppu_module& info)
// Initialize compiler instance
if (!jit)
{
jit = fxm::get_always<jit_compiler>(s_link_table, g_cfg.core.llvm_cpu);
jit = std::make_shared<jit_compiler>(s_link_table, g_cfg.core.llvm_cpu);
}
// First function in current module part