mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-21 12:16:44 +00:00
Handle endianness of MSTORE & MLOAD [#79877740]
This commit is contained in:
parent
51fc9adfab
commit
5db2038111
5 changed files with 20 additions and 3 deletions
1
evmcc/test/mem/mstore1.evm
Normal file
1
evmcc/test/mem/mstore1.evm
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
6001600054
|
||||||
6
evmcc/test/mem/mstore1.lll
Normal file
6
evmcc/test/mem/mstore1.lll
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
|
||||||
|
(asm ;; []
|
||||||
|
1
|
||||||
|
0
|
||||||
|
MSTORE ;; [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1]
|
||||||
|
)
|
||||||
|
|
@ -12,9 +12,10 @@ namespace eth
|
||||||
namespace jit
|
namespace jit
|
||||||
{
|
{
|
||||||
|
|
||||||
llvm::Value* Endianness::toBE(llvm::IRBuilder<>& _builder, llvm::Value* _word)
|
llvm::Value* Endianness::bswap(llvm::IRBuilder<>& _builder, llvm::Value* _word)
|
||||||
{
|
{
|
||||||
// TODO: Native is Little Endian
|
// TODO: Native is Little Endian
|
||||||
|
assert(_word->getType() == Type::i256);
|
||||||
auto bswap = llvm::Intrinsic::getDeclaration(_builder.GetInsertBlock()->getParent()->getParent(), llvm::Intrinsic::bswap, Type::i256);
|
auto bswap = llvm::Intrinsic::getDeclaration(_builder.GetInsertBlock()->getParent()->getParent(), llvm::Intrinsic::bswap, Type::i256);
|
||||||
return _builder.CreateCall(bswap, _word);
|
return _builder.CreateCall(bswap, _word);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,12 @@ class Endianness
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
static llvm::Value* toBE(llvm::IRBuilder<>& _builder, llvm::Value* _word);
|
static llvm::Value* toBE(llvm::IRBuilder<>& _builder, llvm::Value* _word) { return bswap(_builder, _word); }
|
||||||
|
|
||||||
|
static llvm::Value* toNative(llvm::IRBuilder<>& _builder, llvm::Value* _word) { return bswap(_builder, _word); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
static llvm::Value* bswap(llvm::IRBuilder<>& _builder, llvm::Value* _word);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@
|
||||||
#include "Type.h"
|
#include "Type.h"
|
||||||
#include "Runtime.h"
|
#include "Runtime.h"
|
||||||
#include "GasMeter.h"
|
#include "GasMeter.h"
|
||||||
|
#include "Endianness.h"
|
||||||
|
|
||||||
namespace dev
|
namespace dev
|
||||||
{
|
{
|
||||||
|
|
@ -117,12 +118,15 @@ llvm::Function* Memory::createFunc(bool _isStore, llvm::Type* _valueType, GasMet
|
||||||
{
|
{
|
||||||
llvm::Value* value = ++func->arg_begin();
|
llvm::Value* value = ++func->arg_begin();
|
||||||
value->setName("value");
|
value->setName("value");
|
||||||
|
if (isWord)
|
||||||
|
value = Endianness::toBE(m_builder, value);
|
||||||
m_builder.CreateStore(value, ptr);
|
m_builder.CreateStore(value, ptr);
|
||||||
m_builder.CreateRetVoid();
|
m_builder.CreateRetVoid();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
auto ret = m_builder.CreateLoad(ptr);
|
llvm::Value* ret = m_builder.CreateLoad(ptr);
|
||||||
|
ret = Endianness::toNative(m_builder, ret);
|
||||||
m_builder.CreateRet(ret);
|
m_builder.CreateRet(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue