mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-19 03:10:48 +00:00
Print returned memory to standard output
This commit is contained in:
parent
d073af7754
commit
edf192b52d
6 changed files with 47 additions and 21 deletions
|
|
@ -60,7 +60,7 @@ std::unique_ptr<llvm::Module> Compiler::compile(const dev::bytes& bytecode)
|
|||
|
||||
// Init stack and memory
|
||||
auto stack = Stack(builder, module.get());
|
||||
auto memory = Memory(builder, module.get());
|
||||
auto memory = Memory(builder);
|
||||
|
||||
auto ext = Ext(builder);
|
||||
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@
|
|||
#include <llvm/Support/Host.h>
|
||||
|
||||
#include "Ext.h"
|
||||
#include "Memory.h"
|
||||
|
||||
namespace evmcc
|
||||
{
|
||||
|
|
@ -68,6 +69,8 @@ int ExecutionEngine::run(std::unique_ptr<llvm::Module> _module)
|
|||
_module.release(); // Successfully created llvm::ExecutionEngine takes ownership of the module
|
||||
exec->finalizeObject();
|
||||
|
||||
auto&& memory = Memory::init();
|
||||
|
||||
auto ext = std::make_unique<dev::eth::ExtVMFace>();
|
||||
ext->myAddress = dev::Address(1122334455667788);
|
||||
ext->caller = dev::Address(0xfacefacefaceface);
|
||||
|
|
@ -90,7 +93,12 @@ int ExecutionEngine::run(std::unique_ptr<llvm::Module> _module)
|
|||
{
|
||||
auto index = intResult >> 32;
|
||||
auto size = 0xFFFFFFFF & intResult;
|
||||
// TODO: Get the data from memory
|
||||
|
||||
std::cout << "RETURN [ ";
|
||||
for (dev::bytes::const_iterator it = memory.cbegin() + index, end = it + size; it != end; ++it)
|
||||
std::cout << std::hex << std::setw(2) << std::setfill('0') << (int)*it << " ";
|
||||
std::cout << "]";
|
||||
|
||||
return 10;
|
||||
}
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -23,33 +23,40 @@ namespace evmcc
|
|||
|
||||
using MemoryImpl = dev::bytes;
|
||||
|
||||
static MemoryImpl* evmccrt_memory;
|
||||
|
||||
Memory::Memory(llvm::IRBuilder<>& _builder, llvm::Module* _module)
|
||||
|
||||
Memory::Memory(llvm::IRBuilder<>& _builder)
|
||||
: m_builder(_builder)
|
||||
{
|
||||
auto voidTy = m_builder.getVoidTy();
|
||||
auto i64Ty = m_builder.getInt64Ty();
|
||||
|
||||
auto memoryCreate = llvm::Function::Create(llvm::FunctionType::get(voidTy, false),
|
||||
llvm::GlobalValue::LinkageTypes::ExternalLinkage,
|
||||
"evmccrt_memory_create", _module);
|
||||
m_builder.CreateCall(memoryCreate);
|
||||
auto module = _builder.GetInsertBlock()->getParent()->getParent();
|
||||
|
||||
|
||||
auto memRequireTy = llvm::FunctionType::get(m_builder.getInt8PtrTy(), i64Ty, false);
|
||||
m_memRequire = llvm::Function::Create(memRequireTy,
|
||||
llvm::GlobalValue::LinkageTypes::ExternalLinkage,
|
||||
"evmccrt_memory_require", _module);
|
||||
"evmccrt_memory_require", module);
|
||||
|
||||
auto memSizeTy = llvm::FunctionType::get(i64Ty, false);
|
||||
m_memSize = llvm::Function::Create(memSizeTy,
|
||||
llvm::GlobalValue::LinkageTypes::ExternalLinkage,
|
||||
"evmccrt_memory_size", _module);
|
||||
"evmccrt_memory_size", module);
|
||||
|
||||
std::vector<llvm::Type*> argTypes = {i64Ty, i64Ty};
|
||||
auto dumpTy = llvm::FunctionType::get(m_builder.getVoidTy(), llvm::ArrayRef<llvm::Type*>(argTypes), false);
|
||||
m_memDump = llvm::Function::Create(dumpTy, llvm::GlobalValue::LinkageTypes::ExternalLinkage,
|
||||
"evmccrt_memory_dump", _module);
|
||||
"evmccrt_memory_dump", module);
|
||||
}
|
||||
|
||||
const dev::bytes& Memory::init()
|
||||
{
|
||||
evmccrt_memory = new MemoryImpl();
|
||||
std::cerr << "MEMORY: create(), initial size = " << evmccrt_memory->size()
|
||||
<< std::endl;
|
||||
|
||||
return *evmccrt_memory;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -123,15 +130,6 @@ extern "C"
|
|||
{
|
||||
using namespace evmcc;
|
||||
|
||||
static MemoryImpl* evmccrt_memory;
|
||||
|
||||
EXPORT void evmccrt_memory_create(void)
|
||||
{
|
||||
evmccrt_memory = new MemoryImpl();
|
||||
std::cerr << "MEMORY: create(), initial size = " << evmccrt_memory->size()
|
||||
<< std::endl;
|
||||
}
|
||||
|
||||
// Resizes memory to contain at least _index + 1 bytes and returns the base address.
|
||||
EXPORT uint8_t* evmccrt_memory_require(uint64_t _index)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -2,13 +2,17 @@
|
|||
|
||||
#include <llvm/IR/IRBuilder.h>
|
||||
|
||||
#include <libdevcore/Common.h>
|
||||
|
||||
namespace evmcc
|
||||
{
|
||||
|
||||
class Memory
|
||||
{
|
||||
public:
|
||||
Memory(llvm::IRBuilder<>& _builder, llvm::Module* _module);
|
||||
Memory(llvm::IRBuilder<>& _builder);
|
||||
|
||||
static const dev::bytes& init();
|
||||
|
||||
llvm::Value* loadWord(llvm::Value* _addr);
|
||||
void storeWord(llvm::Value* _addr, llvm::Value* _word);
|
||||
|
|
|
|||
1
evmcc/bytecode/return_test.evm
Normal file
1
evmcc/bytecode/return_test.evm
Normal file
|
|
@ -0,0 +1 @@
|
|||
60016064546002608454600360a45460606064f2
|
||||
15
evmcc/lll/return_test.lll
Normal file
15
evmcc/lll/return_test.lll
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
|
||||
(asm
|
||||
1
|
||||
100
|
||||
MSTORE
|
||||
2
|
||||
132
|
||||
MSTORE
|
||||
3
|
||||
164
|
||||
MSTORE
|
||||
96
|
||||
100
|
||||
RETURN
|
||||
)
|
||||
Loading…
Reference in a new issue