Browse Source

Replace map of basic blocks with vector.

cl-refactor
Paweł Bylica 10 years ago
parent
commit
6123352295
  1. 4
      evmjit/libevmjit/BasicBlock.h
  2. 12
      evmjit/libevmjit/Compiler.cpp
  3. 4
      evmjit/libevmjit/Compiler.h

4
evmjit/libevmjit/BasicBlock.h

@ -67,8 +67,8 @@ class BasicBlock
public:
explicit BasicBlock(instr_idx _firstInstrIdx, code_iterator _begin, code_iterator _end, llvm::Function* _mainFunc, bool isJumpDest);
BasicBlock(const BasicBlock&) = delete;
BasicBlock& operator=(const BasicBlock&) = delete;
BasicBlock(BasicBlock&&) = default;
BasicBlock& operator=(BasicBlock&&) = default;
llvm::BasicBlock* llvm() { return m_llvmBB; }

12
evmjit/libevmjit/Compiler.cpp

@ -86,10 +86,9 @@ void Compiler::createBasicBlocks(code_iterator _codeBegin, code_iterator _codeEn
if (isEnd)
{
auto beginIdx = begin - _codeBegin;
auto r = m_basicBlocks.emplace(std::piecewise_construct, std::forward_as_tuple(beginIdx),
std::forward_as_tuple(beginIdx, begin, next, m_mainFunc, nextJumpDest));
m_basicBlocks.emplace_back(beginIdx, begin, next, m_mainFunc, nextJumpDest);
if (nextJumpDest)
_jumpTable.addCase(Constant::get(beginIdx), r.first->second.llvm());
_jumpTable.addCase(Constant::get(beginIdx), m_basicBlocks.back().llvm());
nextJumpDest = false;
begin = next;
}
@ -160,15 +159,16 @@ 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.begin()->second.llvm();
auto firstBB = m_basicBlocks.empty() ? m_stopBB : m_basicBlocks.front().llvm();
m_builder.CreateCondBr(normalFlow, firstBB, m_abortBB, Type::expectTrue);
for (auto basicBlockPairIt = m_basicBlocks.begin(); basicBlockPairIt != m_basicBlocks.end(); ++basicBlockPairIt)
{
auto& basicBlock = basicBlockPairIt->second;
// TODO: Rewrite
auto& basicBlock = *basicBlockPairIt;
auto iterCopy = basicBlockPairIt;
++iterCopy;
auto nextBasicBlock = (iterCopy != m_basicBlocks.end()) ? iterCopy->second.llvm() : nullptr;
auto nextBasicBlock = (iterCopy != m_basicBlocks.end()) ? iterCopy->llvm() : nullptr;
compileBasicBlock(basicBlock, runtimeManager, arith, memory, ext, gasMeter, nextBasicBlock, stack, jumpTable);
}

4
evmjit/libevmjit/Compiler.h

@ -22,8 +22,6 @@ public:
bool dumpCFG = false;
};
using ProgramCounter = uint64_t;
Compiler(Options const& _options);
std::unique_ptr<llvm::Module> compile(code_iterator _begin, code_iterator _end, std::string const& _id);
@ -44,7 +42,7 @@ private:
llvm::IRBuilder<> m_builder;
/// Maps a program counter pc to a basic block that starts at pc (if any).
std::map<ProgramCounter, BasicBlock> m_basicBlocks;
std::vector<BasicBlock> m_basicBlocks;
/// Stop basic block - terminates execution with STOP code (0)
llvm::BasicBlock* m_stopBB = nullptr;

Loading…
Cancel
Save