Add virtual add for Type

This commit is contained in:
Sofia 2026-04-10 16:53:10 +03:00
parent ea9bb1fcb9
commit dcb6e60a3b
3 changed files with 11 additions and 1 deletions

View File

@ -53,7 +53,7 @@ namespace AST {
return rhs; return rhs;
case BinOp::Add: case BinOp::Add:
return codegen::StackValue{ return codegen::StackValue{
builder.builder->CreateAdd(lhs.value, rhs.value, "add"), lhs.ty->add(builder, lhs.value, rhs.value),
lhs.ty lhs.ty
}; };
default: default:

View File

@ -10,6 +10,14 @@ namespace types {
default: default:
return "Unknown"; 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");
}
} }
} }

View File

@ -16,6 +16,7 @@ namespace types {
virtual ~Type() = default; virtual ~Type() = default;
virtual std::string formatted() = 0; virtual std::string formatted() = 0;
virtual llvm::Type* codegen(codegen::Builder& builder) = 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 { class FundamentalType : public Type {
@ -26,6 +27,7 @@ namespace types {
virtual ~FundamentalType() override = default; virtual ~FundamentalType() override = default;
virtual std::string formatted() override; virtual std::string formatted() override;
virtual llvm::Type* codegen(codegen::Builder& builder) override; virtual llvm::Type* codegen(codegen::Builder& builder) override;
virtual llvm::Value* add(codegen::Builder& builder, llvm::Value* lhs, llvm::Value* rhs) override;
}; };
} }