|
@@ -1,14 +1,41 @@
|
|
|
#include "CodegenVisitor.h"
|
|
|
|
|
|
#include <llvm/IR/Constants.h>
|
|
|
+#include <llvm/IR/IRBuilder.h>
|
|
|
|
|
|
|
|
|
using namespace qlow;
|
|
|
|
|
|
-llvm::Value* CodegenVisitor::visit(sem::IntConst& node, llvm::LLVMContext& context)
|
|
|
+llvm::Value* CodegenVisitor::visit(sem::BinaryOperation& binop, llvm::IRBuilder<>& builder)
|
|
|
{
|
|
|
- return llvm::ConstantInt::get(context, llvm::APInt(32, std::to_string(node.value), 10));
|
|
|
+ using llvm::Value;
|
|
|
+ Value* left = binop.left->accept(*this, builder);
|
|
|
+ Value* right = binop.right->accept(*this, builder);
|
|
|
+ switch (binop.op) {
|
|
|
+ case ast::Operation::Operator::PLUS:
|
|
|
+ return builder.CreateAdd(left, right, "add");
|
|
|
+ case ast::Operation::Operator::MINUS:
|
|
|
+ return builder.CreateSub(left, right, "sub");
|
|
|
+ case ast::Operation::Operator::ASTERISK:
|
|
|
+ return builder.CreateMul(left, right, "mul");
|
|
|
+ case ast::Operation::Operator::SLASH:
|
|
|
+ return builder.CreateSDiv(left, right, "add");
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
|
|
|
+llvm::Value* CodegenVisitor::visit(sem::UnaryOperation& unop, llvm::IRBuilder<>& builder)
|
|
|
+{
|
|
|
+ using llvm::Value;
|
|
|
+}
|
|
|
+
|
|
|
+llvm::Value* CodegenVisitor::visit(sem::FeatureCallExpression& binop, llvm::IRBuilder<>& builder)
|
|
|
+{
|
|
|
+ using llvm::Value;
|
|
|
+}
|
|
|
+
|
|
|
+llvm::Value* CodegenVisitor::visit(sem::IntConst& node, llvm::IRBuilder<>& builder)
|
|
|
+{
|
|
|
+ return llvm::ConstantInt::get(builder.getContext(), llvm::APInt(32, std::to_string(node.value), 10));
|
|
|
+}
|
|
|
|