CodeGeneration.h 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  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::GlobalScope& objects);
  12. llvm::Function* generateFunction (llvm::Module* module, sem::Method* method);
  13. void generateObjectFile(const std::string& name, std::unique_ptr<llvm::Module> module, int optLevel);
  14. class FunctionGenerator;
  15. }
  16. }
  17. class qlow::gen::FunctionGenerator
  18. {
  19. const sem::Method& method;
  20. llvm::Module* module;
  21. std::stack<llvm::BasicBlock*> basicBlocks;
  22. public:
  23. StatementVisitor statementVisitor;
  24. ExpressionCodegenVisitor expressionVisitor;
  25. inline FunctionGenerator(const sem::Method& m, llvm::Module* module) :
  26. method{ m }, module{ module }
  27. {
  28. }
  29. llvm::Function* generate(void);
  30. inline llvm::Module* getModule(void) const { return module; }
  31. inline llvm::LLVMContext& getContext(void) const { return module->getContext(); }
  32. inline llvm::BasicBlock* getCurrentBlock(void) const { return basicBlocks.top(); }
  33. inline void pushBlock(llvm::BasicBlock* bb) { basicBlocks.push(bb); }
  34. inline llvm::BasicBlock* popBlock(void) { auto* bb = basicBlocks.top(); basicBlocks.pop(); return bb; }
  35. };
  36. #endif // QLOW_CODE_GENERATION_H