rpcs3/Utilities/JIT.h

78 lines
1.5 KiB
C
Raw Normal View History

#pragma once
#ifdef LLVM_AVAILABLE
#include <memory>
#include <string>
#include <unordered_map>
#include "types.h"
2017-06-24 15:36:49 +00:00
#include "mutex.h"
2017-01-28 12:32:45 +00:00
#include "restore_new.h"
#ifdef _MSC_VER
#pragma warning(push, 0)
#endif
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
#include "llvm/ExecutionEngine/ExecutionEngine.h"
#ifdef _MSC_VER
#pragma warning(pop)
#endif
2017-01-28 12:32:45 +00:00
#include "define_new_memleakdetect.h"
// Temporary compiler interface
class jit_compiler final
{
2017-06-24 15:36:49 +00:00
// Local LLVM context
llvm::LLVMContext m_context;
// JIT Event Listener
std::unique_ptr<struct EventListener> m_jit_el;
// Execution instance
std::unique_ptr<llvm::ExecutionEngine> m_engine;
2017-06-24 15:36:49 +00:00
// Link table
std::unordered_map<std::string, u64> m_link;
2017-02-26 15:56:31 +00:00
// Arch
std::string m_cpu;
public:
jit_compiler(const std::unordered_map<std::string, u64>& _link, const std::string& _cpu);
~jit_compiler();
2017-06-24 15:36:49 +00:00
// Get LLVM context
auto& get_context()
{
return m_context;
}
2017-07-15 09:20:40 +00:00
// Add module (path to obj cache dir)
void add(std::unique_ptr<llvm::Module> module, const std::string& path);
2017-07-15 09:20:40 +00:00
// Add object (path to obj file)
void add(const std::string& path);
// Finalize
2017-06-24 15:36:49 +00:00
void fin();
2017-02-26 15:56:31 +00:00
// Get compiled function address
2017-06-24 15:36:49 +00:00
u64 get(const std::string& name);
// Add functions directly to the memory manager (name -> code)
static std::unordered_map<std::string, u64> add(std::unordered_map<std::string, std::string>);
2017-02-26 15:56:31 +00:00
// Get CPU info
static std::string cpu(const std::string& _cpu);
2017-06-29 14:25:39 +00:00
// Check JIT purpose
bool is_primary() const
{
return !m_link.empty();
}
};
#endif