mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-22 04:36:42 +00:00
Set "jump dest" flag in constructor of BasicBlock
This commit is contained in:
parent
f0008a3124
commit
6fee45a3e3
3 changed files with 13 additions and 13 deletions
|
|
@ -20,19 +20,21 @@ namespace jit
|
||||||
|
|
||||||
const char* BasicBlock::NamePrefix = "Instr.";
|
const char* BasicBlock::NamePrefix = "Instr.";
|
||||||
|
|
||||||
BasicBlock::BasicBlock(bytes::const_iterator _begin, bytes::const_iterator _end, llvm::Function* _mainFunc, llvm::IRBuilder<>& _builder) :
|
BasicBlock::BasicBlock(bytes::const_iterator _begin, bytes::const_iterator _end, llvm::Function* _mainFunc, llvm::IRBuilder<>& _builder, bool isJumpDest) :
|
||||||
m_begin(_begin),
|
m_begin(_begin),
|
||||||
m_end(_end),
|
m_end(_end),
|
||||||
// TODO: Add begin index to name
|
// TODO: Add begin index to name
|
||||||
m_llvmBB(llvm::BasicBlock::Create(_mainFunc->getContext(), NamePrefix, _mainFunc)),
|
m_llvmBB(llvm::BasicBlock::Create(_mainFunc->getContext(), NamePrefix, _mainFunc)),
|
||||||
m_stack(*this),
|
m_stack(*this),
|
||||||
m_builder(_builder)
|
m_builder(_builder),
|
||||||
|
m_isJumpDest(isJumpDest)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
BasicBlock::BasicBlock(std::string _name, llvm::Function* _mainFunc, llvm::IRBuilder<>& _builder) :
|
BasicBlock::BasicBlock(std::string _name, llvm::Function* _mainFunc, llvm::IRBuilder<>& _builder, bool isJumpDest) :
|
||||||
m_llvmBB(llvm::BasicBlock::Create(_mainFunc->getContext(), _name, _mainFunc)),
|
m_llvmBB(llvm::BasicBlock::Create(_mainFunc->getContext(), _name, _mainFunc)),
|
||||||
m_stack(*this),
|
m_stack(*this),
|
||||||
m_builder(_builder)
|
m_builder(_builder),
|
||||||
|
m_isJumpDest(isJumpDest)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
BasicBlock::LocalStack::LocalStack(BasicBlock& _owner) :
|
BasicBlock::LocalStack::LocalStack(BasicBlock& _owner) :
|
||||||
|
|
|
||||||
|
|
@ -53,8 +53,8 @@ public:
|
||||||
/// Basic block name prefix. The rest is instruction index.
|
/// Basic block name prefix. The rest is instruction index.
|
||||||
static const char* NamePrefix;
|
static const char* NamePrefix;
|
||||||
|
|
||||||
explicit BasicBlock(bytes::const_iterator _begin, bytes::const_iterator _end, llvm::Function* _mainFunc, llvm::IRBuilder<>& _builder);
|
explicit BasicBlock(bytes::const_iterator _begin, bytes::const_iterator _end, llvm::Function* _mainFunc, llvm::IRBuilder<>& _builder, bool isJumpDest);
|
||||||
explicit BasicBlock(std::string _name, llvm::Function* _mainFunc, llvm::IRBuilder<>& _builder);
|
explicit BasicBlock(std::string _name, llvm::Function* _mainFunc, llvm::IRBuilder<>& _builder, bool isJumpDest);
|
||||||
|
|
||||||
BasicBlock(const BasicBlock&) = delete;
|
BasicBlock(const BasicBlock&) = delete;
|
||||||
void operator=(const BasicBlock&) = delete;
|
void operator=(const BasicBlock&) = delete;
|
||||||
|
|
@ -66,7 +66,6 @@ public:
|
||||||
bytes::const_iterator end() { return m_end; }
|
bytes::const_iterator end() { return m_end; }
|
||||||
|
|
||||||
bool isJumpDest() const { return m_isJumpDest; }
|
bool isJumpDest() const { return m_isJumpDest; }
|
||||||
void markAsJumpDest() { m_isJumpDest = true; }
|
|
||||||
|
|
||||||
LocalStack& localStack() { return m_stack; }
|
LocalStack& localStack() { return m_stack; }
|
||||||
|
|
||||||
|
|
@ -113,7 +112,7 @@ private:
|
||||||
|
|
||||||
/// Is the basic block a valid jump destination.
|
/// Is the basic block a valid jump destination.
|
||||||
/// JUMPDEST is the first instruction of the basic block.
|
/// JUMPDEST is the first instruction of the basic block.
|
||||||
bool m_isJumpDest = false;
|
bool const m_isJumpDest = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -83,9 +83,8 @@ void Compiler::createBasicBlocks(bytes const& _bytecode)
|
||||||
if (isEnd)
|
if (isEnd)
|
||||||
{
|
{
|
||||||
auto beginIdx = begin - _bytecode.begin();
|
auto beginIdx = begin - _bytecode.begin();
|
||||||
auto p = m_basicBlocks.emplace(std::piecewise_construct, std::forward_as_tuple(beginIdx), std::forward_as_tuple(begin, next, m_mainFunc, m_builder));
|
m_basicBlocks.emplace(std::piecewise_construct, std::forward_as_tuple(beginIdx),
|
||||||
if (nextJumpDest)
|
std::forward_as_tuple(begin, next, m_mainFunc, m_builder, nextJumpDest));
|
||||||
p.first->second.markAsJumpDest();
|
|
||||||
nextJumpDest = false;
|
nextJumpDest = false;
|
||||||
begin = next;
|
begin = next;
|
||||||
}
|
}
|
||||||
|
|
@ -98,7 +97,7 @@ llvm::BasicBlock* Compiler::getJumpTableBlock()
|
||||||
{
|
{
|
||||||
if (!m_jumpTableBlock)
|
if (!m_jumpTableBlock)
|
||||||
{
|
{
|
||||||
m_jumpTableBlock.reset(new BasicBlock("JumpTable", m_mainFunc, m_builder));
|
m_jumpTableBlock.reset(new BasicBlock("JumpTable", m_mainFunc, m_builder, true));
|
||||||
InsertPointGuard g{m_builder};
|
InsertPointGuard g{m_builder};
|
||||||
m_builder.SetInsertPoint(m_jumpTableBlock->llvm());
|
m_builder.SetInsertPoint(m_jumpTableBlock->llvm());
|
||||||
auto dest = m_jumpTableBlock->localStack().pop();
|
auto dest = m_jumpTableBlock->localStack().pop();
|
||||||
|
|
@ -116,7 +115,7 @@ llvm::BasicBlock* Compiler::getBadJumpBlock()
|
||||||
{
|
{
|
||||||
if (!m_badJumpBlock)
|
if (!m_badJumpBlock)
|
||||||
{
|
{
|
||||||
m_badJumpBlock.reset(new BasicBlock("BadJump", m_mainFunc, m_builder));
|
m_badJumpBlock.reset(new BasicBlock("BadJump", m_mainFunc, m_builder, true));
|
||||||
InsertPointGuard g{m_builder};
|
InsertPointGuard g{m_builder};
|
||||||
m_builder.SetInsertPoint(m_badJumpBlock->llvm());
|
m_builder.SetInsertPoint(m_badJumpBlock->llvm());
|
||||||
m_builder.CreateRet(Constant::get(ReturnCode::BadJumpDestination));
|
m_builder.CreateRet(Constant::get(ReturnCode::BadJumpDestination));
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue