CodeGeneration.h 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #ifndef QLOW_CODE_GENERATION_H
  2. #define QLOW_CODE_GENERATION_H
  3. #include "Semantic.h"
  4. #include "Builtin.h"
  5. #include "CodegenVisitor.h"
  6. #include <stack>
  7. #include <llvm/IR/Module.h>
  8. #include <llvm/IR/IRBuilder.h>
  9. namespace qlow
  10. {
  11. namespace gen
  12. {
  13. std::unique_ptr<llvm::Module> generateModule(sem::GlobalScope& objects);
  14. llvm::Function* generateFunction (llvm::Module* module, sem::Method* method);
  15. llvm::Function* generateStartFunction(llvm::Module* module, llvm::Function* start);
  16. void generateObjectFile(const std::string& name, std::unique_ptr<llvm::Module> module, int optLevel);
  17. class FunctionGenerator;
  18. }
  19. }
  20. class qlow::gen::FunctionGenerator
  21. {
  22. const sem::Method& method;
  23. llvm::Module* module;
  24. llvm::AttributeSet& attributes;
  25. std::stack<llvm::BasicBlock*> basicBlocks;
  26. public:
  27. StatementVisitor statementVisitor;
  28. ExpressionCodegenVisitor expressionVisitor;
  29. LValueVisitor lvalueVisitor;
  30. llvm::IRBuilder<> builder;
  31. inline FunctionGenerator(const sem::Method& m, llvm::Module* module,
  32. llvm::AttributeSet& attributes) :
  33. method{ m },
  34. module{ module },
  35. attributes{ attributes },
  36. expressionVisitor{ *this },
  37. builder{ module->getContext() }
  38. {
  39. }
  40. llvm::Function* generate(void);
  41. inline llvm::Module* getModule(void) const { return module; }
  42. inline llvm::LLVMContext& getContext(void) const { return module->getContext(); }
  43. inline llvm::BasicBlock* getCurrentBlock(void) const { return basicBlocks.top(); }
  44. inline void pushBlock(llvm::BasicBlock* bb) { basicBlocks.push(bb); }
  45. inline llvm::BasicBlock* popBlock(void) { auto* bb = basicBlocks.top(); basicBlocks.pop(); return bb; }
  46. };
  47. #endif // QLOW_CODE_GENERATION_H