mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-22 04:36:42 +00:00
Detect endianness without boost help
This commit is contained in:
parent
b1765749f5
commit
b07f25da4a
2 changed files with 17 additions and 18 deletions
|
|
@ -12,12 +12,21 @@ namespace eth
|
||||||
namespace jit
|
namespace jit
|
||||||
{
|
{
|
||||||
|
|
||||||
llvm::Value* Endianness::bswap(llvm::IRBuilder<>& _builder, llvm::Value* _word)
|
llvm::Value* Endianness::bswapIfLE(llvm::IRBuilder<>& _builder, llvm::Value* _word)
|
||||||
{
|
{
|
||||||
// TODO: Native is Little Endian
|
union tester
|
||||||
assert(_word->getType() == Type::Word);
|
{
|
||||||
auto bswap = llvm::Intrinsic::getDeclaration(_builder.GetInsertBlock()->getParent()->getParent(), llvm::Intrinsic::bswap, Type::Word);
|
unsigned int x;
|
||||||
return _builder.CreateCall(bswap, _word);
|
unsigned char isLE;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (tester{1}.isLE)
|
||||||
|
{
|
||||||
|
// OPT: Cache func declaration?
|
||||||
|
auto bswapFunc = llvm::Intrinsic::getDeclaration(_builder.GetInsertBlock()->getParent()->getParent(), llvm::Intrinsic::bswap, Type::Word);
|
||||||
|
return _builder.CreateCall(bswapFunc, _word);
|
||||||
|
}
|
||||||
|
return _word;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,6 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <boost/detail/endian.hpp>
|
|
||||||
|
|
||||||
#include <llvm/IR/IRBuilder.h>
|
#include <llvm/IR/IRBuilder.h>
|
||||||
|
|
||||||
namespace dev
|
namespace dev
|
||||||
|
|
@ -14,19 +12,11 @@ namespace jit
|
||||||
|
|
||||||
struct Endianness
|
struct Endianness
|
||||||
{
|
{
|
||||||
|
static llvm::Value* toBE(llvm::IRBuilder<>& _builder, llvm::Value* _word) { return bswapIfLE(_builder, _word); }
|
||||||
#if defined(BOOST_LITTLE_ENDIAN)
|
static llvm::Value* toNative(llvm::IRBuilder<>& _builder, llvm::Value* _word) { return bswapIfLE(_builder, _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); }
|
|
||||||
|
|
||||||
#elif defined(BOOST_BIG_ENDIAN)
|
|
||||||
static llvm::Value* toBE(llvm::IRBuilder<>&, llvm::Value* _word) { return _word; }
|
|
||||||
static llvm::Value* toNative(llvm::IRBuilder<>&, llvm::Value* _word) { return _word; }
|
|
||||||
|
|
||||||
#endif // Add support for PDP endianness if needed
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static llvm::Value* bswap(llvm::IRBuilder<>& _builder, llvm::Value* _word);
|
static llvm::Value* bswapIfLE(llvm::IRBuilder<>& _builder, llvm::Value* _word);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue