From 198e9dce1d8ceea61226d5806e52d6a39e5fa8c7 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Mon, 1 Jan 2018 10:40:57 +0300 Subject: [PATCH] Fix #4005 regression Delay unregister EH frames (Linux) --- Utilities/JIT.cpp | 30 ++++++++++++++++++++++++++++-- rpcs3/Emu/Cell/PPUThread.cpp | 2 +- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/Utilities/JIT.cpp b/Utilities/JIT.cpp index d8d7bc7505..2b262d0531 100644 --- a/Utilities/JIT.cpp +++ b/Utilities/JIT.cpp @@ -71,6 +71,8 @@ static void* s_next = s_memory; #ifdef _WIN32 static std::deque> s_unwater; static std::vector> s_unwind; // .pdata +#else +static std::deque> 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); } }; diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index d3ba303925..8fd75fff2f 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -1181,7 +1181,7 @@ extern void ppu_initialize(const ppu_module& info) // Initialize compiler instance if (!jit) { - jit = fxm::get_always(s_link_table, g_cfg.core.llvm_cpu); + jit = std::make_shared(s_link_table, g_cfg.core.llvm_cpu); } // First function in current module part