Browse Source

Starting ExtVM binary interface

cl-refactor
Paweł Bylica 10 years ago
parent
commit
f3a347bdc8
  1. 3
      evmcc/Compiler.cpp
  2. 5
      evmcc/ExecutionEngine.cpp
  3. 52
      evmcc/Ext.cpp
  4. 22
      evmcc/Ext.h

3
evmcc/Compiler.cpp

@ -6,6 +6,7 @@
#include <libevmface/Instruction.h>
#include "Stack.h"
#include "Ext.h"
namespace evmcc
{
@ -56,6 +57,8 @@ std::unique_ptr<llvm::Module> Compiler::compile(const dev::bytes& bytecode)
// Init stack
auto stack = Stack(builder, module.get());
auto ext = Ext(builder);
for (auto pc = bytecode.cbegin(); pc != bytecode.cend(); ++pc)
{
using dev::eth::Instruction;

5
evmcc/ExecutionEngine.cpp

@ -13,6 +13,8 @@
#include <llvm/Support/PrettyStackTrace.h>
#include <llvm/Support/Host.h>
#include "Ext.h"
namespace evmcc
{
@ -66,6 +68,9 @@ int ExecutionEngine::run(std::unique_ptr<llvm::Module> _module)
_module.release(); // Successfully created llvm::ExecutionEngine takes ownership of the module
exec->finalizeObject();
auto ext = std::make_unique<dev::eth::ExtVMFace>();
Ext::init(std::move(ext));
auto entryFunc = module->getFunction("main");
if (!entryFunc)
{

52
evmcc/Ext.cpp

@ -0,0 +1,52 @@
#include "Ext.h"
#include <llvm/IR/Function.h>
#include <llvm/IR/TypeBuilder.h>
#ifdef _MSC_VER
#define EXPORT __declspec(dllexport)
#else
#define EXPORT
#endif
using namespace llvm;
using llvm::types::i;
using Linkage = llvm::GlobalValue::LinkageTypes;
namespace evmcc
{
std::unique_ptr<dev::eth::ExtVMFace> g_ext;
void Ext::init(std::unique_ptr<dev::eth::ExtVMFace> _ext)
{
g_ext = std::move(_ext);
}
Ext::Ext(llvm::IRBuilder<>& _builder)
: m_builder(_builder)
{
auto module = m_builder.GetInsertBlock()->getParent()->getParent();
auto&& ctx = _builder.getContext();
Function::Create(TypeBuilder<void(i<256>*, i<256>*), true>::get(ctx), Linkage::ExternalLinkage, "ext_store", module);
Function::Create(TypeBuilder<void(i<256>*, i<256>*), true>::get(ctx), Linkage::ExternalLinkage, "ext_setStore", module);
}
extern "C"
{
EXPORT void ext_store(void* _index, void* _value)
{
}
EXPORT void ext_setStore(void* _index, void* _value)
{
}
}
}

22
evmcc/Ext.h

@ -0,0 +1,22 @@
#include <llvm/IR/IRBuilder.h>
#include <libevm/ExtVMFace.h>
namespace evmcc
{
class Ext
{
public:
Ext(llvm::IRBuilder<>& _builder);
static void init(std::unique_ptr<dev::eth::ExtVMFace> _ext);
private:
llvm::IRBuilder<>& m_builder;
};
}
Loading…
Cancel
Save