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
|
||||
{
|
||||
|
||||
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
|
||||
assert(_word->getType() == Type::Word);
|
||||
auto bswap = llvm::Intrinsic::getDeclaration(_builder.GetInsertBlock()->getParent()->getParent(), llvm::Intrinsic::bswap, Type::Word);
|
||||
return _builder.CreateCall(bswap, _word);
|
||||
union tester
|
||||
{
|
||||
unsigned int x;
|
||||
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
|
||||
|
||||
#include <boost/detail/endian.hpp>
|
||||
|
||||
#include <llvm/IR/IRBuilder.h>
|
||||
|
||||
namespace dev
|
||||
|
|
@ -14,19 +12,11 @@ namespace jit
|
|||
|
||||
struct Endianness
|
||||
{
|
||||
|
||||
#if defined(BOOST_LITTLE_ENDIAN)
|
||||
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
|
||||
static llvm::Value* toBE(llvm::IRBuilder<>& _builder, llvm::Value* _word) { return bswapIfLE(_builder, _word); }
|
||||
static llvm::Value* toNative(llvm::IRBuilder<>& _builder, llvm::Value* _word) { return bswapIfLE(_builder, _word); }
|
||||
|
||||
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