|
|
@ -31,8 +31,8 @@ Memory::Memory(RuntimeManager& _runtimeManager, GasMeter& _gasMeter): |
|
|
|
auto i64Ty = m_builder.getInt64Ty(); |
|
|
|
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); |
|
|
|
m_memDump = llvm::Function::Create(dumpTy, llvm::GlobalValue::LinkageTypes::ExternalLinkage, |
|
|
|
"evmccrt_memory_dump", module); |
|
|
|
|
|
|
|
m_data = new llvm::GlobalVariable(*module, Type::BytePtr, false, llvm::GlobalVariable::PrivateLinkage, llvm::UndefValue::get(Type::BytePtr), "mem.data"); |
|
|
|
m_data->setUnnamedAddr(true); // Address is not important
|
|
|
@ -103,7 +103,7 @@ llvm::Function* Memory::createFunc(bool _isStore, llvm::Type* _valueType, GasMet |
|
|
|
m_builder.SetInsertPoint(llvm::BasicBlock::Create(func->getContext(), {}, func)); |
|
|
|
llvm::Value* index = func->arg_begin(); |
|
|
|
index->setName("index"); |
|
|
|
|
|
|
|
|
|
|
|
auto valueSize = _valueType->getPrimitiveSizeInBits() / 8; |
|
|
|
this->require(index, Constant::get(valueSize)); |
|
|
|
auto data = m_builder.CreateLoad(m_data, "data"); |
|
|
@ -175,7 +175,7 @@ void Memory::require(llvm::Value* _offset, llvm::Value* _size) |
|
|
|
} |
|
|
|
|
|
|
|
void Memory::copyBytes(llvm::Value* _srcPtr, llvm::Value* _srcSize, llvm::Value* _srcIdx, |
|
|
|
llvm::Value* _destMemIdx, llvm::Value* _reqBytes) |
|
|
|
llvm::Value* _destMemIdx, llvm::Value* _reqBytes) |
|
|
|
{ |
|
|
|
auto zero256 = llvm::ConstantInt::get(Type::i256, 0); |
|
|
|
|
|
|
@ -218,38 +218,38 @@ void Memory::dump(uint64_t _begin, uint64_t _end) |
|
|
|
extern "C" |
|
|
|
{ |
|
|
|
|
|
|
|
using namespace dev::eth::jit; |
|
|
|
|
|
|
|
EXPORT uint8_t* mem_resize(Runtime* _rt, i256* _size) |
|
|
|
{ |
|
|
|
auto size = _size->a; // Trunc to 64-bit
|
|
|
|
auto& memory = _rt->getMemory(); |
|
|
|
memory.resize(size); |
|
|
|
return memory.data(); |
|
|
|
} |
|
|
|
|
|
|
|
EXPORT void evmccrt_memory_dump(uint64_t _begin, uint64_t _end) |
|
|
|
{ |
|
|
|
//if (_end == 0)
|
|
|
|
// _end = Runtime::getMemory().size();
|
|
|
|
|
|
|
|
//std::cerr << "MEMORY: active size: " << std::dec
|
|
|
|
// << Runtime::getMemory().size() / 32 << " words\n";
|
|
|
|
//std::cerr << "MEMORY: dump from " << std::dec
|
|
|
|
// << _begin << " to " << _end << ":";
|
|
|
|
//if (_end <= _begin)
|
|
|
|
// return;
|
|
|
|
using namespace dev::eth::jit; |
|
|
|
|
|
|
|
//_begin = _begin / 16 * 16;
|
|
|
|
//for (size_t i = _begin; i < _end; i++)
|
|
|
|
//{
|
|
|
|
// if ((i - _begin) % 16 == 0)
|
|
|
|
// std::cerr << '\n' << std::dec << i << ": ";
|
|
|
|
EXPORT uint8_t* mem_resize(Runtime* _rt, i256* _size) |
|
|
|
{ |
|
|
|
auto size = _size->a; // Trunc to 64-bit
|
|
|
|
auto& memory = _rt->getMemory(); |
|
|
|
memory.resize(size); |
|
|
|
return memory.data(); |
|
|
|
} |
|
|
|
|
|
|
|
// auto b = Runtime::getMemory()[i];
|
|
|
|
// std::cerr << std::hex << std::setw(2) << static_cast<int>(b) << ' ';
|
|
|
|
//}
|
|
|
|
//std::cerr << std::endl;
|
|
|
|
} |
|
|
|
EXPORT void evmccrt_memory_dump(uint64_t _begin, uint64_t _end) |
|
|
|
{ |
|
|
|
//if (_end == 0)
|
|
|
|
// _end = Runtime::getMemory().size();
|
|
|
|
|
|
|
|
//std::cerr << "MEMORY: active size: " << std::dec
|
|
|
|
// << Runtime::getMemory().size() / 32 << " words\n";
|
|
|
|
//std::cerr << "MEMORY: dump from " << std::dec
|
|
|
|
// << _begin << " to " << _end << ":";
|
|
|
|
//if (_end <= _begin)
|
|
|
|
// return;
|
|
|
|
|
|
|
|
//_begin = _begin / 16 * 16;
|
|
|
|
//for (size_t i = _begin; i < _end; i++)
|
|
|
|
//{
|
|
|
|
// if ((i - _begin) % 16 == 0)
|
|
|
|
// std::cerr << '\n' << std::dec << i << ": ";
|
|
|
|
|
|
|
|
// auto b = Runtime::getMemory()[i];
|
|
|
|
// std::cerr << std::hex << std::setw(2) << static_cast<int>(b) << ' ';
|
|
|
|
//}
|
|
|
|
//std::cerr << std::endl;
|
|
|
|
} |
|
|
|
|
|
|
|
} // extern "C"
|
|
|
|
} // extern "C"
|
|
|
|