From 43abaa4a46f1648e0c309bd1c2caff64d9f1f4ab Mon Sep 17 00:00:00 2001 From: Sofia Date: Thu, 9 Apr 2026 17:44:22 +0300 Subject: [PATCH] Make expressions return StackValue --- src/ast.h | 8 ++++---- src/codegen.cpp | 21 ++++++++++++--------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/ast.h b/src/ast.h index 537b77f..1d64766 100644 --- a/src/ast.h +++ b/src/ast.h @@ -23,7 +23,7 @@ namespace AST { class Expression : public Node { public: - virtual llvm::Value* codegen(codegen::Builder& builder, codegen::Scope& scope) = 0; + virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope) = 0; }; class Type { @@ -45,7 +45,7 @@ namespace AST { IntLiteralExpression(int value) : m_value{ value } {} virtual ~IntLiteralExpression() override = default; virtual std::string formatted() override; - virtual llvm::Value* codegen(codegen::Builder& builder, codegen::Scope& scope) override; + virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope) override; }; class ValueReferenceExpression : public Expression { @@ -55,7 +55,7 @@ namespace AST { ValueReferenceExpression(std::string name) : m_name{ name } {} virtual ~ValueReferenceExpression() override = default; virtual std::string formatted() override; - virtual llvm::Value* codegen(codegen::Builder& builder, codegen::Scope& scope) override; + virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope) override; }; class BinaryOperationExpression : public Expression { @@ -69,7 +69,7 @@ namespace AST { } virtual ~BinaryOperationExpression() override = default; virtual std::string formatted() override; - virtual llvm::Value* codegen(codegen::Builder& builder, codegen::Scope& scope) override; + virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope) override; }; diff --git a/src/codegen.cpp b/src/codegen.cpp index 009ba8e..451ea25 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -13,19 +13,22 @@ namespace codegen { } namespace AST { - llvm::Value* IntLiteralExpression::codegen(codegen::Builder& builder, codegen::Scope& scope) { + codegen::StackValue IntLiteralExpression::codegen(codegen::Builder& builder, codegen::Scope& scope) { auto ty = builder.builder->getInt32Ty(); - return llvm::ConstantInt::get(ty, this->m_value); + return codegen::StackValue{ llvm::ConstantInt::get(ty, this->m_value), ty }; } - llvm::Value* ValueReferenceExpression::codegen(codegen::Builder& builder, codegen::Scope& scope) { + codegen::StackValue ValueReferenceExpression::codegen(codegen::Builder& builder, codegen::Scope& scope) { auto value = scope.values.find(this->m_name); if (value != scope.values.end()) { if (scope.is_lvalue) { - return value->second.value; + return value->second; } else { - return builder.builder->CreateLoad(value->second.ty, value->second.value); + return codegen::StackValue{ + builder.builder->CreateLoad(value->second.ty, value->second.value), + value->second.ty + }; } } else { @@ -33,13 +36,13 @@ namespace AST { } } - llvm::Value* BinaryOperationExpression::codegen(codegen::Builder& builder, codegen::Scope& scope) { + codegen::StackValue BinaryOperationExpression::codegen(codegen::Builder& builder, codegen::Scope& scope) { auto lvalued = scope.with_lvalue(); auto lhs = this->m_lhs->codegen(builder, lvalued); auto rhs = this->m_rhs->codegen(builder, scope); switch (this->m_binop) { case BinOp::Assignment: - builder.builder->CreateStore(rhs, lhs, false); + builder.builder->CreateStore(rhs.value, lhs.value, false); if (scope.is_lvalue) { return lhs; } @@ -58,7 +61,7 @@ namespace AST { builder.builder->SetInsertPoint(builder.block); auto value = this->m_expr->codegen(builder, scope); - builder.builder->CreateRet(value); + builder.builder->CreateRet(value.value); } void ExpressionStatement::codegen(codegen::Builder& builder, codegen::Scope& scope) { @@ -79,7 +82,7 @@ namespace AST { auto ptr = builder.builder->CreateAlloca(ty); if (this->m_expr.has_value()) { auto value = this->m_expr->get()->codegen(builder, scope); - builder.builder->CreateStore(value, ptr, false); + builder.builder->CreateStore(value.value, ptr, false); } scope.values[this->m_name] = codegen::StackValue{ ptr, ty };