CodegenVisitor.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. #ifndef QLOW_CODEGEN_VISITOR_H
  2. #define QLOW_CODEGEN_VISITOR_H
  3. #include <llvm/IR/Value.h>
  4. #include <llvm/IR/IRBuilder.h>
  5. #include <llvm/IR/BasicBlock.h>
  6. #include "Visitor.h"
  7. #include "Semantic.h"
  8. #include "Scope.h"
  9. #include "Type.h"
  10. #include "Cast.h"
  11. #include <memory>
  12. namespace qlow
  13. {
  14. namespace gen
  15. {
  16. class FunctionGenerator;
  17. }
  18. }
  19. namespace qlow
  20. {
  21. class ExpressionCodegenVisitor;
  22. class LValueVisitor;
  23. class StatementVisitor;
  24. class CastGenerator;
  25. }
  26. class qlow::ExpressionCodegenVisitor :
  27. public Visitor<
  28. llvm::Value*,
  29. llvm::IRBuilder<>,
  30. sem::LocalVariableExpression,
  31. sem::UnaryOperation,
  32. sem::BinaryOperation,
  33. sem::CastExpression,
  34. sem::NewExpression,
  35. sem::NewArrayExpression,
  36. sem::MethodCallExpression,
  37. sem::FieldAccessExpression,
  38. sem::AddressExpression,
  39. sem::IntConst,
  40. sem::ThisExpression
  41. >
  42. {
  43. public:
  44. gen::FunctionGenerator& fg;
  45. inline ExpressionCodegenVisitor(gen::FunctionGenerator& fg) :
  46. fg{ fg }
  47. {
  48. }
  49. llvm::Value* visit(sem::LocalVariableExpression& node, llvm::IRBuilder<>&) override;
  50. llvm::Value* visit(sem::UnaryOperation& node, llvm::IRBuilder<>&) override;
  51. llvm::Value* visit(sem::BinaryOperation& node, llvm::IRBuilder<>&) override;
  52. llvm::Value* visit(sem::CastExpression& node, llvm::IRBuilder<>&) override;
  53. llvm::Value* visit(sem::NewExpression& node, llvm::IRBuilder<>&) override;
  54. llvm::Value* visit(sem::NewArrayExpression& node, llvm::IRBuilder<>&) override;
  55. llvm::Value* visit(sem::MethodCallExpression& node, llvm::IRBuilder<>&) override;
  56. llvm::Value* visit(sem::FieldAccessExpression& node, llvm::IRBuilder<>&) override;
  57. llvm::Value* visit(sem::AddressExpression& node, llvm::IRBuilder<>&) override;
  58. llvm::Value* visit(sem::IntConst& node, llvm::IRBuilder<>&) override;
  59. llvm::Value* visit(sem::ThisExpression& node, llvm::IRBuilder<>&) override;
  60. };
  61. class qlow::LValueVisitor :
  62. public Visitor<
  63. llvm::Value*,
  64. qlow::gen::FunctionGenerator,
  65. sem::Expression,
  66. sem::LocalVariableExpression,
  67. sem::FieldAccessExpression
  68. >
  69. {
  70. public:
  71. llvm::Value* visit(sem::Expression& node, qlow::gen::FunctionGenerator& fg) override;
  72. llvm::Value* visit(sem::LocalVariableExpression& node, qlow::gen::FunctionGenerator& fg) override;
  73. llvm::Value* visit(sem::FieldAccessExpression& node, qlow::gen::FunctionGenerator& fg) override;
  74. };
  75. class qlow::StatementVisitor :
  76. public Visitor<
  77. llvm::Value*,
  78. gen::FunctionGenerator,
  79. sem::DoEndBlock,
  80. sem::IfElseBlock,
  81. sem::WhileBlock,
  82. sem::AssignmentStatement,
  83. sem::ReturnStatement,
  84. sem::FeatureCallStatement
  85. >
  86. {
  87. public:
  88. llvm::Value* visit(sem::DoEndBlock& node, gen::FunctionGenerator&) override;
  89. llvm::Value* visit(sem::IfElseBlock& node, gen::FunctionGenerator&) override;
  90. llvm::Value* visit(sem::WhileBlock& node, gen::FunctionGenerator&) override;
  91. llvm::Value* visit(sem::AssignmentStatement& node, gen::FunctionGenerator&) override;
  92. llvm::Value* visit(sem::ReturnStatement& node, gen::FunctionGenerator&) override;
  93. llvm::Value* visit(sem::FeatureCallStatement& node, gen::FunctionGenerator&) override;
  94. };
  95. class qlow::CastGenerator
  96. {
  97. sem::Cast cast;
  98. public:
  99. inline CastGenerator(const sem::Cast& cast) :
  100. cast{ cast }
  101. {
  102. }
  103. llvm::Value* generateCast(llvm::Value* toCast, llvm::IRBuilder<>& b);
  104. };
  105. #endif // QLOW_CODEGEN_VISITOR_H