Browse Source

Use iterators in basic block compilation

cl-refactor
Paweł Bylica 10 years ago
parent
commit
be7713ac33
  1. 30
      libevmjit/Compiler.cpp

30
libevmjit/Compiler.cpp

@ -212,9 +212,12 @@ void Compiler::compileBasicBlock(BasicBlock& _basicBlock, bytes const& _bytecode
m_builder.SetInsertPoint(_basicBlock.llvm());
auto& stack = _basicBlock.localStack();
for (auto currentPC = _basicBlock.begin(); currentPC != _basicBlock.end(); ++currentPC)
auto begin = _bytecode.begin() + _basicBlock.begin();
auto end = _bytecode.begin() + _basicBlock.end();
for (auto it = begin; it != end; ++it)
{
auto inst = static_cast<Instruction>(_bytecode[currentPC]);
auto inst = Instruction(*it);
_gasMeter.count(inst);
@ -476,10 +479,7 @@ void Compiler::compileBasicBlock(BasicBlock& _basicBlock, bytes const& _bytecode
case Instruction::ANY_PUSH:
{
auto curr = _bytecode.begin() + currentPC; // TODO: replace currentPC with iterator
auto value = readPushData(curr, _bytecode.end());
currentPC = curr - _bytecode.begin();
auto value = readPushData(it, end);
stack.push(Constant::get(value));
break;
}
@ -554,24 +554,16 @@ void Compiler::compileBasicBlock(BasicBlock& _basicBlock, bytes const& _bytecode
if (auto constant = llvm::dyn_cast<llvm::ConstantInt>(target))
{
auto&& c = constant->getValue();
if (c.ult(_bytecode.size()))
{
auto v = c.getZExtValue();
auto it = m_basicBlocks.find(v);
if (it != m_basicBlocks.end() && it->second.isJumpDest())
targetBlock = it->second.llvm();
}
if (!targetBlock)
targetBlock = getBadJumpBlock();
auto targetIdx = c.getActiveBits() <= 64 ? c.getZExtValue() : -1;
auto it = m_basicBlocks.find(targetIdx);
targetBlock = (it != m_basicBlocks.end() && it->second.isJumpDest()) ? it->second.llvm() : getBadJumpBlock();
}
// TODO: Improve; check for constants
if (inst == Instruction::JUMP)
{
if (targetBlock)
{
// The target address is computed at compile time,
// just pop it without looking...
m_builder.CreateBr(targetBlock);
}
else
@ -607,7 +599,7 @@ void Compiler::compileBasicBlock(BasicBlock& _basicBlock, bytes const& _bytecode
case Instruction::PC:
{
auto value = Constant::get(currentPC);
auto value = Constant::get(it - _bytecode.begin());
stack.push(value);
break;
}

Loading…
Cancel
Save