Browse Source

Remove vector of basic blocks from Compiler.

cl-refactor
Paweł Bylica 10 years ago
parent
commit
215ea7dde5
  1. 7
      evmjit/libevmjit/BasicBlock.cpp
  2. 2
      evmjit/libevmjit/BasicBlock.h
  3. 32
      evmjit/libevmjit/Compiler.cpp
  4. 5
      evmjit/libevmjit/Compiler.h

7
evmjit/libevmjit/BasicBlock.cpp

@ -20,14 +20,11 @@ namespace eth
namespace jit
{
static const char* jumpDestName = "JmpDst.";
static const char* basicBlockName = "Instr.";
BasicBlock::BasicBlock(instr_idx _firstInstrIdx, code_iterator _begin, code_iterator _end, llvm::Function* _mainFunc, bool isJumpDest):
BasicBlock::BasicBlock(instr_idx _firstInstrIdx, code_iterator _begin, code_iterator _end, llvm::Function* _mainFunc):
m_firstInstrIdx{_firstInstrIdx},
m_begin(_begin),
m_end(_end),
m_llvmBB(llvm::BasicBlock::Create(_mainFunc->getContext(), {isJumpDest ? jumpDestName : basicBlockName, std::to_string(_firstInstrIdx)}, _mainFunc))
m_llvmBB(llvm::BasicBlock::Create(_mainFunc->getContext(), {"Instr.", std::to_string(_firstInstrIdx)}, _mainFunc))
{}
LocalStack::LocalStack(Stack& _globalStack):

2
evmjit/libevmjit/BasicBlock.h

@ -65,7 +65,7 @@ private:
class BasicBlock
{
public:
explicit BasicBlock(instr_idx _firstInstrIdx, code_iterator _begin, code_iterator _end, llvm::Function* _mainFunc, bool isJumpDest);
explicit BasicBlock(instr_idx _firstInstrIdx, code_iterator _begin, code_iterator _end, llvm::Function* _mainFunc);
BasicBlock(BasicBlock&&) = default;
BasicBlock& operator=(BasicBlock&&) = default;

32
evmjit/libevmjit/Compiler.cpp

@ -36,7 +36,7 @@ Compiler::Compiler(Options const& _options):
Type::init(m_builder.getContext());
}
void Compiler::createBasicBlocks(code_iterator _codeBegin, code_iterator _codeEnd, llvm::SwitchInst& _jumpTable)
std::vector<BasicBlock> Compiler::createBasicBlocks(code_iterator _codeBegin, code_iterator _codeEnd, llvm::SwitchInst& _jumpTable)
{
/// Helper function that skips push data and finds next iterator (can be the end)
auto skipPushDataAndGetNext = [](code_iterator _curr, code_iterator _end)
@ -54,8 +54,9 @@ void Compiler::createBasicBlocks(code_iterator _codeBegin, code_iterator _codeEn
if (*(_codeEnd - 1) != static_cast<byte>(Instruction::STOP))
break;
std::vector<BasicBlock> blocks;
auto begin = _codeBegin; // begin of current block
bool nextJumpDest = false;
for (auto curr = begin, next = begin; curr != _codeEnd; curr = next)
{
next = skipPushDataAndGetNext(curr, _codeEnd);
@ -71,10 +72,6 @@ void Compiler::createBasicBlocks(code_iterator _codeBegin, code_iterator _codeEn
isEnd = true;
break;
case Instruction::JUMPDEST:
nextJumpDest = true;
break;
default:
break;
}
@ -86,13 +83,14 @@ void Compiler::createBasicBlocks(code_iterator _codeBegin, code_iterator _codeEn
if (isEnd)
{
auto beginIdx = begin - _codeBegin;
m_basicBlocks.emplace_back(beginIdx, begin, next, m_mainFunc, nextJumpDest);
if (nextJumpDest)
_jumpTable.addCase(Constant::get(beginIdx), m_basicBlocks.back().llvm());
nextJumpDest = false;
blocks.emplace_back(beginIdx, begin, next, m_mainFunc);
if (Instruction(*begin) == Instruction::JUMPDEST)
_jumpTable.addCase(Constant::get(beginIdx), blocks.back().llvm());
begin = next;
}
}
return blocks;
}
void Compiler::fillJumpTable()
@ -134,7 +132,7 @@ std::unique_ptr<llvm::Module> Compiler::compile(code_iterator _begin, code_itera
m_builder.SetInsertPoint(entryBlock);
createBasicBlocks(_begin, _end, jumpTable);
auto blocks = createBasicBlocks(_begin, _end, jumpTable);
// Init runtime structures.
RuntimeManager runtimeManager(m_builder, _begin, _end);
@ -159,17 +157,15 @@ std::unique_ptr<llvm::Module> Compiler::compile(code_iterator _begin, code_itera
auto normalFlow = m_builder.CreateICmpEQ(r, m_builder.getInt32(0));
runtimeManager.setJmpBuf(jmpBuf);
auto firstBB = m_basicBlocks.empty() ? m_stopBB : m_basicBlocks.front().llvm();
auto firstBB = blocks.empty() ? m_stopBB : blocks.front().llvm();
m_builder.CreateCondBr(normalFlow, firstBB, m_abortBB, Type::expectTrue);
for (auto basicBlockPairIt = m_basicBlocks.begin(); basicBlockPairIt != m_basicBlocks.end(); ++basicBlockPairIt)
for (auto it = blocks.begin(); it != blocks.end(); ++it)
{
// TODO: Rewrite
auto& basicBlock = *basicBlockPairIt;
auto iterCopy = basicBlockPairIt;
++iterCopy;
auto nextBasicBlock = (iterCopy != m_basicBlocks.end()) ? iterCopy->llvm() : nullptr;
compileBasicBlock(basicBlock, runtimeManager, arith, memory, ext, gasMeter, nextBasicBlock, stack, jumpTable);
auto nextIt = it + 1;
auto nextBasicBlock = (nextIt != blocks.end()) ? nextIt->llvm() : nullptr; // TODO: What with Stop block?
compileBasicBlock(*it, runtimeManager, arith, memory, ext, gasMeter, nextBasicBlock, stack, jumpTable);
}
// Code for special blocks:

5
evmjit/libevmjit/Compiler.h

@ -28,7 +28,7 @@ public:
private:
void createBasicBlocks(code_iterator _begin, code_iterator _end, llvm::SwitchInst& _switchInst);
std::vector<BasicBlock> createBasicBlocks(code_iterator _begin, code_iterator _end, llvm::SwitchInst& _switchInst);
void compileBasicBlock(BasicBlock& _basicBlock, class RuntimeManager& _runtimeManager, class Arith256& _arith, class Memory& _memory, class Ext& _ext, class GasMeter& _gasMeter,
llvm::BasicBlock* _nextBasicBlock, class Stack& _globalStack, llvm::SwitchInst& _jumpTable);
@ -41,9 +41,6 @@ private:
/// Helper class for generating IR
llvm::IRBuilder<> m_builder;
/// Maps a program counter pc to a basic block that starts at pc (if any).
std::vector<BasicBlock> m_basicBlocks;
/// Stop basic block - terminates execution with STOP code (0)
llvm::BasicBlock* m_stopBB = nullptr;

Loading…
Cancel
Save