|
|
@ -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> |
|
|
@ -21,6 +23,8 @@ namespace evmjit |
|
|
|
|
|
|
|
namespace |
|
|
|
{ |
|
|
|
using Guard = std::lock_guard<std::mutex>; |
|
|
|
std::mutex x_cacheMutex; |
|
|
|
CacheMode g_mode; |
|
|
|
std::unique_ptr<llvm::MemoryBuffer> g_lastObject; |
|
|
|
JITListener* g_listener; |
|
|
@ -40,6 +44,8 @@ namespace |
|
|
|
|
|
|
|
ObjectCache* Cache::init(CacheMode _mode, JITListener* _listener) |
|
|
|
{ |
|
|
|
Guard g{x_cacheMutex}; |
|
|
|
|
|
|
|
g_mode = _mode; |
|
|
|
g_listener = _listener; |
|
|
|
|
|
|
@ -59,6 +65,8 @@ ObjectCache* Cache::init(CacheMode _mode, JITListener* _listener) |
|
|
|
|
|
|
|
void Cache::clear() |
|
|
|
{ |
|
|
|
Guard g{x_cacheMutex}; |
|
|
|
|
|
|
|
using namespace llvm::sys; |
|
|
|
llvm::SmallString<256> cachePath; |
|
|
|
path::system_temp_directory(false, cachePath); |
|
|
@ -71,6 +79,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; |
|
|
@ -100,11 +110,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)) |
|
|
@ -144,12 +157,15 @@ std::unique_ptr<llvm::Module> Cache::getObject(std::string const& id) |
|
|
|
|
|
|
|
void ObjectCache::notifyObjectCompiled(llvm::Module const* _module, llvm::MemoryBufferRef _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; |
|
|
@ -169,6 +185,8 @@ void ObjectCache::notifyObjectCompiled(llvm::Module const* _module, llvm::Memory |
|
|
|
|
|
|
|
std::unique_ptr<llvm::MemoryBuffer> ObjectCache::getObject(llvm::Module const* _module) |
|
|
|
{ |
|
|
|
Guard g{x_cacheMutex}; |
|
|
|
|
|
|
|
DLOG(cache) << _module->getModuleIdentifier() << ": use\n"; |
|
|
|
return std::move(g_lastObject); |
|
|
|
} |
|
|
|