Browse Source

Workaround for linker removing JIT callback functions

cl-refactor
Paweł Bylica 10 years ago
parent
commit
f281e5ea26
  1. 16
      libevmjit-cpp/JitVM.cpp
  2. 2
      libevmjit/Common.h

16
libevmjit-cpp/JitVM.cpp

@ -11,6 +11,8 @@ namespace dev
namespace eth
{
extern "C" void env_sload(); // fake declaration for linker symbol stripping workaround, see a call below
bytesConstRef JitVM::go(ExtVMFace& _ext, OnOpFunc const& _onOp, uint64_t _step)
{
using namespace jit;
@ -65,6 +67,9 @@ bytesConstRef JitVM::go(ExtVMFace& _ext, OnOpFunc const& _onOp, uint64_t _step)
BOOST_THROW_EXCEPTION(StackTooSmall());
case ReturnCode::BadInstruction:
BOOST_THROW_EXCEPTION(BadInstruction());
case ReturnCode::LinkerWorkaround: // never happens
env_sload(); // but forces linker to include env_* JIT callback functions
break;
default:
break;
}
@ -75,14 +80,3 @@ bytesConstRef JitVM::go(ExtVMFace& _ext, OnOpFunc const& _onOp, uint64_t _step)
}
}
namespace
{
// MSVS linker ignores export symbols in Env.cpp if nothing points at least one of them
extern "C" void env_sload();
void linkerWorkaround()
{
env_sload();
(void)&linkerWorkaround; // suppress unused function warning from GCC
}
}

2
libevmjit/Common.h

@ -44,6 +44,8 @@ enum class ReturnCode
LLVMLinkError = -103,
UnexpectedException = -111,
LinkerWorkaround = -299,
};
/// Representation of 256-bit value binary compatible with LLVM i256

Loading…
Cancel
Save