#pragma once #include #include #include "BasicBlock.h" namespace evmcc { class Compiler { public: using ProgramCounter = uint64_t; Compiler(); std::unique_ptr compile(const dev::bytes& bytecode); private: BasicBlock& getOrCreateBasicBlockAtPC(ProgramCounter pc); void createBasicBlocks(const dev::bytes& bytecode); /** * Maps a program counter pc to a basic block which starts at pc (if any). */ std::map basicBlocks; /** * Maps a pc at which there is a JUMP or JUMPI to the target block of the jump. */ std::map jumpTargets; private: /// Collection of basic blocks in program //std::vector m_basicBlocks; /// Main program function llvm::Function* m_mainFunc; }; }