diff --git a/Utilities/JIT.cpp b/Utilities/JIT.cpp index aa65008133..7b01109c80 100644 --- a/Utilities/JIT.cpp +++ b/Utilities/JIT.cpp @@ -343,22 +343,30 @@ public: LOG_SUCCESS(GENERAL, "LLVM: Created module: %s", module->getName().data()); } - std::unique_ptr getObject(const llvm::Module* module) override + static std::unique_ptr load(const std::string& path) { - std::string name = m_path; - name.append(module->getName()); - - if (fs::file cached{name, fs::read}) + if (fs::file cached{path, fs::read}) { auto buf = llvm::MemoryBuffer::getNewUninitMemBuffer(cached.size()); cached.read(const_cast(buf->getBufferStart()), buf->getBufferSize()); + return buf; + } + + return nullptr; + } + + std::unique_ptr getObject(const llvm::Module* module) override + { + std::string path = m_path; + path.append(module->getName()); + + if (auto buf = load(path)) + { LOG_SUCCESS(GENERAL, "LLVM: Loaded module: %s", module->getName().data()); return buf; } - else - { - return nullptr; - } + + return nullptr; } }; @@ -430,6 +438,11 @@ void jit_compiler::add(std::unique_ptr module, const std::string& } } +void jit_compiler::add(const std::string& path) +{ + m_engine->addObjectFile(std::move(llvm::object::ObjectFile::createObjectFile(*ObjectCache::load(path)).get())); +} + void jit_compiler::fin() { m_engine->finalizeObject(); diff --git a/Utilities/JIT.h b/Utilities/JIT.h index fc1fdfb9f1..8b7da39bc8 100644 --- a/Utilities/JIT.h +++ b/Utilities/JIT.h @@ -49,9 +49,12 @@ public: return m_context; } - // Add module + // Add module (path to obj cache dir) void add(std::unique_ptr module, const std::string& path); + // Add object (path to obj file) + void add(const std::string& path); + // Finalize void fin(); diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index 8de17968f5..f5d13f7ed5 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -1142,7 +1142,8 @@ extern void ppu_initialize(const ppu_module& info) if (fs::is_file(cache_path + obj_name)) { semaphore_lock lock(jmutex); - ppu_initialize2(*jit, part, cache_path, obj_name); + jit->add(cache_path + obj_name); + LOG_SUCCESS(PPU, "LLVM: Loaded module %s", obj_name); continue; } @@ -1173,7 +1174,7 @@ extern void ppu_initialize(const ppu_module& info) // Proceed with original JIT instance semaphore_lock lock(jmutex); - ppu_initialize2(*jit, part, cache_path, obj_name); + jit->add(cache_path + obj_name); }); } @@ -1286,8 +1287,6 @@ static void ppu_initialize2(jit_compiler& jit, const ppu_module& module_part, co std::shared_ptr dlg; - // Check cached file - if (!fs::is_file(cache_path + obj_name)) { legacy::FunctionPassManager pm(module.get());