mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-19 02:12:23 +00:00
evmc: Load VM dynamically
This commit is contained in:
parent
d1439fdc92
commit
68eea63083
1 changed files with 53 additions and 5 deletions
|
|
@ -18,8 +18,9 @@ package vm
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
#include <libaleth-interpreter/interpreter.h>
|
#include <evmc/evmc.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <dlfcn.h>
|
||||||
|
|
||||||
|
|
||||||
static const struct evmc_context_fn_table* get_context_fn_table()
|
static const struct evmc_context_fn_table* get_context_fn_table()
|
||||||
|
|
@ -80,8 +81,16 @@ static void add_result_releaser(struct evmc_result* result)
|
||||||
result->release = free_result_output;
|
result->release = free_result_output;
|
||||||
}
|
}
|
||||||
|
|
||||||
#cgo CFLAGS: -I/home/chfast/Projects/ethereum/cpp-ethereum -I/home/chfast/Projects/ethereum/cpp-ethereum/evmc/include
|
typedef struct evmc_instance* (*evmc_create_fn)();
|
||||||
#cgo LDFLAGS: -laleth-interpreter -lstdc++ -lm -ldl -L/home/chfast/Projects/ethereum/cpp-ethereum/build/interpreter/libaleth-interpreter
|
|
||||||
|
static struct evmc_instance* create(void* create_symbol)
|
||||||
|
{
|
||||||
|
evmc_create_fn fn = (evmc_create_fn)create_symbol;
|
||||||
|
return fn();
|
||||||
|
}
|
||||||
|
|
||||||
|
#cgo CFLAGS: -I/home/chfast/Projects/ethereum/cpp-ethereum/evmc/include
|
||||||
|
#cgo LDFLAGS: -ldl
|
||||||
*/
|
*/
|
||||||
import "C"
|
import "C"
|
||||||
|
|
||||||
|
|
@ -96,6 +105,7 @@ import (
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/ethereum/go-ethereum/crypto"
|
||||||
"github.com/ethereum/go-ethereum/params"
|
"github.com/ethereum/go-ethereum/params"
|
||||||
|
"github.com/ethereum/go-ethereum/log"
|
||||||
)
|
)
|
||||||
|
|
||||||
type EVMJIT struct {
|
type EVMJIT struct {
|
||||||
|
|
@ -116,9 +126,47 @@ type ContextWrapper struct {
|
||||||
index int
|
index int
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var loadMu sync.Mutex
|
||||||
|
var createSymbol unsafe.Pointer
|
||||||
|
var loaded = false
|
||||||
|
|
||||||
|
func loadVM(path string) {
|
||||||
|
if len(path) == 0 {
|
||||||
|
panic("EVMC path not provided, use --vm flag")
|
||||||
|
}
|
||||||
|
|
||||||
|
loadMu.Lock()
|
||||||
|
defer loadMu.Unlock()
|
||||||
|
|
||||||
|
if loaded {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
cpath := C.CString(path)
|
||||||
|
defer C.free(unsafe.Pointer(cpath))
|
||||||
|
handle := C.dlopen(cpath, C.RTLD_LAZY)
|
||||||
|
if handle == nil {
|
||||||
|
panic(fmt.Sprintf("cannot open %s", path))
|
||||||
|
}
|
||||||
|
|
||||||
|
centrypoint := C.CString("evmc_create")
|
||||||
|
defer C.free(unsafe.Pointer((centrypoint)))
|
||||||
|
|
||||||
|
C.dlerror()
|
||||||
|
createSymbol = C.dlsym(handle, centrypoint)
|
||||||
|
err := C.dlerror()
|
||||||
|
if err != nil {
|
||||||
|
panic(fmt.Sprintf("cannot find evmc_create in %s", path))
|
||||||
|
}
|
||||||
|
loaded = true
|
||||||
|
log.Info("EVMC VM loaded", "path", path)
|
||||||
|
}
|
||||||
|
|
||||||
func NewJit(env *EVM, cfg Config) *EVMJIT {
|
func NewJit(env *EVM, cfg Config) *EVMJIT {
|
||||||
// FIXME: Destroy the jit later.
|
loadVM(cfg.EVMCPath)
|
||||||
return &EVMJIT{C.evmc_create_interpreter(), env, nil, false, nil}
|
// FIXME: Destroy the instance later.
|
||||||
|
// FIXME: Create the instance once.
|
||||||
|
return &EVMJIT{C.create(createSymbol), env, nil, false, nil}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue