From dcb6e60a3bfafb87f26605925aeb866e4538b2f7 Mon Sep 17 00:00:00 2001 From: Sofia Date: Fri, 10 Apr 2026 16:53:10 +0300 Subject: [PATCH] Add virtual add for Type --- src/codegen.cpp | 2 +- src/types.cpp | 8 ++++++++ src/types.h | 2 ++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/codegen.cpp b/src/codegen.cpp index d5b61d3..c1896c9 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -53,7 +53,7 @@ namespace AST { return rhs; case BinOp::Add: return codegen::StackValue{ - builder.builder->CreateAdd(lhs.value, rhs.value, "add"), + lhs.ty->add(builder, lhs.value, rhs.value), lhs.ty }; default: diff --git a/src/types.cpp b/src/types.cpp index 41e1f7b..ecb067d 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -10,6 +10,14 @@ namespace types { default: return "Unknown"; } + } + llvm::Value* FundamentalType::add(codegen::Builder& builder, llvm::Value* lhs, llvm::Value* rhs) { + switch (this->m_ty) { + case FundamentalTypeKind::Int: + return builder.builder->CreateAdd(lhs, rhs); + default: + throw std::runtime_error("Invalid type for add"); + } } } \ No newline at end of file diff --git a/src/types.h b/src/types.h index af0ca05..34a1389 100644 --- a/src/types.h +++ b/src/types.h @@ -16,6 +16,7 @@ namespace types { virtual ~Type() = default; virtual std::string formatted() = 0; virtual llvm::Type* codegen(codegen::Builder& builder) = 0; + virtual llvm::Value* add(codegen::Builder& builder, llvm::Value* lhs, llvm::Value* rhs) = 0; }; class FundamentalType : public Type { @@ -26,6 +27,7 @@ namespace types { virtual ~FundamentalType() override = default; virtual std::string formatted() override; virtual llvm::Type* codegen(codegen::Builder& builder) override; + virtual llvm::Value* add(codegen::Builder& builder, llvm::Value* lhs, llvm::Value* rhs) override; }; }