|
|
@ -1,5 +1,7 @@ |
|
|
|
#include "Cache.h" |
|
|
|
|
|
|
|
#include <mutex> |
|
|
|
|
|
|
|
#include "preprocessor/llvm_includes_start.h" |
|
|
|
#include <llvm/IR/Module.h> |
|
|
|
#include <llvm/IR/LLVMContext.h> |
|
|
@ -23,6 +25,8 @@ namespace jit |
|
|
|
|
|
|
|
namespace |
|
|
|
{ |
|
|
|
using Guard = std::lock_guard<std::mutex>; |
|
|
|
std::mutex x_cacheMutex; |
|
|
|
CacheMode g_mode; |
|
|
|
llvm::MemoryBuffer* g_lastObject; |
|
|
|
ExecutionEngineListener* g_listener; |
|
|
@ -43,6 +47,9 @@ namespace |
|
|
|
ObjectCache* Cache::getObjectCache(CacheMode _mode, ExecutionEngineListener* _listener) |
|
|
|
{ |
|
|
|
static ObjectCache objectCache; |
|
|
|
|
|
|
|
Guard g{x_cacheMutex}; |
|
|
|
|
|
|
|
g_mode = _mode; |
|
|
|
g_listener = _listener; |
|
|
|
return &objectCache; |
|
|
@ -50,6 +57,8 @@ ObjectCache* Cache::getObjectCache(CacheMode _mode, ExecutionEngineListener* _li |
|
|
|
|
|
|
|
void Cache::clear() |
|
|
|
{ |
|
|
|
Guard g{x_cacheMutex}; |
|
|
|
|
|
|
|
using namespace llvm::sys; |
|
|
|
llvm::SmallString<256> cachePath; |
|
|
|
path::system_temp_directory(false, cachePath); |
|
|
@ -62,6 +71,8 @@ void Cache::clear() |
|
|
|
|
|
|
|
void Cache::preload(llvm::ExecutionEngine& _ee, std::unordered_map<std::string, uint64_t>& _funcCache) |
|
|
|
{ |
|
|
|
Guard g{x_cacheMutex}; |
|
|
|
|
|
|
|
// TODO: Cache dir should be in one place
|
|
|
|
using namespace llvm::sys; |
|
|
|
llvm::SmallString<256> cachePath; |
|
|
@ -92,11 +103,14 @@ void Cache::preload(llvm::ExecutionEngine& _ee, std::unordered_map<std::string, |
|
|
|
|
|
|
|
std::unique_ptr<llvm::Module> Cache::getObject(std::string const& id) |
|
|
|
{ |
|
|
|
Guard g{x_cacheMutex}; |
|
|
|
|
|
|
|
if (g_mode != CacheMode::on && g_mode != CacheMode::read) |
|
|
|
return nullptr; |
|
|
|
|
|
|
|
if (g_listener) |
|
|
|
g_listener->stateChanged(ExecState::CacheLoad); |
|
|
|
// TODO: Disabled because is not thread-safe.
|
|
|
|
//if (g_listener)
|
|
|
|
// g_listener->stateChanged(ExecState::CacheLoad);
|
|
|
|
|
|
|
|
DLOG(cache) << id << ": search\n"; |
|
|
|
if (!CHECK(!g_lastObject)) |
|
|
@ -136,12 +150,15 @@ std::unique_ptr<llvm::Module> Cache::getObject(std::string const& id) |
|
|
|
|
|
|
|
void ObjectCache::notifyObjectCompiled(llvm::Module const* _module, llvm::MemoryBuffer const* _object) |
|
|
|
{ |
|
|
|
Guard g{x_cacheMutex}; |
|
|
|
|
|
|
|
// Only in "on" and "write" mode
|
|
|
|
if (g_mode != CacheMode::on && g_mode != CacheMode::write) |
|
|
|
return; |
|
|
|
|
|
|
|
if (g_listener) |
|
|
|
g_listener->stateChanged(ExecState::CacheWrite); |
|
|
|
// TODO: Disabled because is not thread-safe.
|
|
|
|
// if (g_listener)
|
|
|
|
// g_listener->stateChanged(ExecState::CacheWrite);
|
|
|
|
|
|
|
|
auto&& id = _module->getModuleIdentifier(); |
|
|
|
llvm::SmallString<256> cachePath; |
|
|
@ -161,6 +178,8 @@ void ObjectCache::notifyObjectCompiled(llvm::Module const* _module, llvm::Memory |
|
|
|
|
|
|
|
llvm::MemoryBuffer* ObjectCache::getObject(llvm::Module const* _module) |
|
|
|
{ |
|
|
|
Guard g{x_cacheMutex}; |
|
|
|
|
|
|
|
DLOG(cache) << _module->getModuleIdentifier() << ": use\n"; |
|
|
|
auto o = g_lastObject; |
|
|
|
g_lastObject = nullptr; |
|
|
|