CodeGeneration.h 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. #ifndef QLOW_CODE_GENERATION_H
  2. #define QLOW_CODE_GENERATION_H
  3. #include "Semantic.h"
  4. #include "CodegenVisitor.h"
  5. #include <stack>
  6. #include <llvm/IR/Module.h>
  7. namespace qlow
  8. {
  9. namespace gen
  10. {
  11. std::unique_ptr<llvm::Module> generateModule(const sem::SymbolTable<sem::Class>& classes);
  12. void generateObjectFile(const std::string& name, std::unique_ptr<llvm::Module> module);
  13. class FunctionGenerator;
  14. }
  15. }
  16. class qlow::gen::FunctionGenerator
  17. {
  18. const sem::Method& method;
  19. llvm::Module* module;
  20. std::stack<llvm::BasicBlock*> basicBlocks;
  21. public:
  22. StatementVisitor statementVisitor;
  23. ExpressionVisitor expressionVisitor;
  24. inline FunctionGenerator(const sem::Method& m, llvm::Module* module) :
  25. method{ m }, module{ module }
  26. {
  27. }
  28. llvm::Function* generate(void);
  29. inline llvm::Module* getModule(void) const { return module; }
  30. inline llvm::LLVMContext& getContext(void) const { return module->getContext(); }
  31. inline llvm::BasicBlock* getCurrentBlock(void) const { return basicBlocks.top(); }
  32. inline void pushBlock(llvm::BasicBlock* bb) { basicBlocks.push(bb); }
  33. inline llvm::BasicBlock* popBlock(void) { auto* bb = basicBlocks.top(); basicBlocks.pop(); return bb; }
  34. };
  35. #endif // QLOW_CODE_GENERATION_H