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.";
|
||||
|
||||
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_end(_end),
|
||||
// TODO: Add begin index to name
|
||||
m_llvmBB(llvm::BasicBlock::Create(_mainFunc->getContext(), NamePrefix, _mainFunc)),
|
||||
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_stack(*this),
|
||||
m_builder(_builder)
|
||||
m_builder(_builder),
|
||||
m_isJumpDest(isJumpDest)
|
||||
{}
|
||||
|
||||
BasicBlock::LocalStack::LocalStack(BasicBlock& _owner) :
|
||||
|
|
|
|||
|
|
@ -53,8 +53,8 @@ public:
|
|||
/// Basic block name prefix. The rest is instruction index.
|
||||
static const char* NamePrefix;
|
||||
|
||||
explicit BasicBlock(bytes::const_iterator _begin, bytes::const_iterator _end, llvm::Function* _mainFunc, llvm::IRBuilder<>& _builder);
|
||||
explicit BasicBlock(std::string _name, 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, bool isJumpDest);
|
||||
|
||||
BasicBlock(const BasicBlock&) = delete;
|
||||
void operator=(const BasicBlock&) = delete;
|
||||
|
|
@ -66,7 +66,6 @@ public:
|
|||
bytes::const_iterator end() { return m_end; }
|
||||
|
||||
bool isJumpDest() const { return m_isJumpDest; }
|
||||
void markAsJumpDest() { m_isJumpDest = true; }
|
||||
|
||||
LocalStack& localStack() { return m_stack; }
|
||||
|
||||
|
|
@ -113,7 +112,7 @@ private:
|
|||
|
||||
/// Is the basic block a valid jump destination.
|
||||
/// 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)
|
||||
{
|
||||
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));
|
||||
if (nextJumpDest)
|
||||
p.first->second.markAsJumpDest();
|
||||
m_basicBlocks.emplace(std::piecewise_construct, std::forward_as_tuple(beginIdx),
|
||||
std::forward_as_tuple(begin, next, m_mainFunc, m_builder, nextJumpDest));
|
||||
nextJumpDest = false;
|
||||
begin = next;
|
||||
}
|
||||
|
|
@ -98,7 +97,7 @@ llvm::BasicBlock* Compiler::getJumpTableBlock()
|
|||
{
|
||||
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};
|
||||
m_builder.SetInsertPoint(m_jumpTableBlock->llvm());
|
||||
auto dest = m_jumpTableBlock->localStack().pop();
|
||||
|
|
@ -116,7 +115,7 @@ llvm::BasicBlock* Compiler::getBadJumpBlock()
|
|||
{
|
||||
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};
|
||||
m_builder.SetInsertPoint(m_badJumpBlock->llvm());
|
||||
m_builder.CreateRet(Constant::get(ReturnCode::BadJumpDestination));
|
||||
|
|
|
|||
Loading…
Reference in a new issue