From 8530e1162dae5ac0f520200dbd63a57bf684617f Mon Sep 17 00:00:00 2001 From: Sofia Date: Mon, 27 Apr 2026 23:07:54 +0300 Subject: [PATCH] Pass allocator in codegen --- src/ast.h | 34 +++++++++++------------ src/codegen.cpp | 72 ++++++++++++++++++++++++------------------------- 2 files changed, 53 insertions(+), 53 deletions(-) diff --git a/src/ast.h b/src/ast.h index 9446a7d..cc10f50 100644 --- a/src/ast.h +++ b/src/ast.h @@ -25,7 +25,7 @@ namespace AST { class Expression : public Node { public: Expression(token::Metadata meta) : Node{ meta } {} - virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope) = 0; + virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) = 0; virtual void codegen_alloca(codegen::StackAllocator& allocator) = 0; virtual std::shared_ptr get_codegen_type(codegen::Scope& scope) = 0; virtual void typecheck_preprocess(typecheck::Scope& scope) = 0; @@ -39,7 +39,7 @@ namespace AST { class Statement : public Node { public: Statement(token::Metadata meta) : Node{ meta } {} - virtual void codegen(codegen::Builder& builder, codegen::Scope& scope) = 0; + virtual void codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) = 0; virtual void codegen_alloca(codegen::StackAllocator& allocator) = 0; virtual void typecheck_preprocess(typecheck::Scope& scope) = 0; virtual void typecheck(typecheck::State& state, typecheck::Scope& scope) = 0; @@ -60,7 +60,7 @@ namespace AST { } virtual ~IntLiteralExpression() override = default; virtual std::string formatted() override; - virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope) override; + virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) override; virtual void codegen_alloca(codegen::StackAllocator& allocator) override; virtual std::shared_ptr get_codegen_type(codegen::Scope& scope) override; virtual void typecheck_preprocess(typecheck::Scope& scope) override; @@ -79,7 +79,7 @@ namespace AST { StringLiteralExpression(token::Metadata meta, std::string value) : Expression{ meta }, m_value{ value } {} virtual ~StringLiteralExpression() override = default; virtual std::string formatted() override; - virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope) override; + virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) override; virtual void codegen_alloca(codegen::StackAllocator& allocator) override; virtual std::shared_ptr get_codegen_type(codegen::Scope& scope) override; virtual void typecheck_preprocess(typecheck::Scope& scope) override; @@ -98,7 +98,7 @@ namespace AST { ValueReferenceExpression(token::Metadata meta, std::string name) : Expression{ meta }, m_name{ name } {} virtual ~ValueReferenceExpression() override = default; virtual std::string formatted() override; - virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope) override; + virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) override; virtual void codegen_alloca(codegen::StackAllocator& allocator) override; virtual std::shared_ptr get_codegen_type(codegen::Scope& scope) override; virtual void typecheck_preprocess(typecheck::Scope& scope) override; @@ -128,7 +128,7 @@ namespace AST { } virtual ~BinaryOperationExpression() override = default; virtual std::string formatted() override; - virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope) override; + virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) override; virtual void codegen_alloca(codegen::StackAllocator& allocator) override; virtual std::shared_ptr get_codegen_type(codegen::Scope& scope) override; virtual void typecheck_preprocess(typecheck::Scope& scope) override; @@ -155,7 +155,7 @@ namespace AST { } virtual ~FunctionCallExpression() override = default; virtual std::string formatted() override; - virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope) override; + virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) override; virtual void codegen_alloca(codegen::StackAllocator& allocator) override; virtual std::shared_ptr get_codegen_type(codegen::Scope& scope) override; virtual void typecheck_preprocess(typecheck::Scope& scope) override; @@ -182,7 +182,7 @@ namespace AST { } virtual ~CastExpression() override = default; virtual std::string formatted() override; - virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope) override; + virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) override; virtual void codegen_alloca(codegen::StackAllocator& allocator) override; virtual std::shared_ptr get_codegen_type(codegen::Scope& scope) override; virtual void typecheck_preprocess(typecheck::Scope& scope) override; @@ -206,7 +206,7 @@ namespace AST { } virtual ~RefExpression() override = default; virtual std::string formatted() override; - virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope) override; + virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) override; virtual void codegen_alloca(codegen::StackAllocator& allocator) override; virtual std::shared_ptr get_codegen_type(codegen::Scope& scope) override; virtual void typecheck_preprocess(typecheck::Scope& scope) override; @@ -230,7 +230,7 @@ namespace AST { } virtual ~DerefExpression() override = default; virtual std::string formatted() override; - virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope) override; + virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) override; virtual void codegen_alloca(codegen::StackAllocator& allocator) override; virtual std::shared_ptr get_codegen_type(codegen::Scope& scope) override; virtual void typecheck_preprocess(typecheck::Scope& scope) override; @@ -257,7 +257,7 @@ namespace AST { } virtual ~IndexAccessExpression() override = default; virtual std::string formatted() override; - virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope) override; + virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) override; virtual void codegen_alloca(codegen::StackAllocator& allocator) override; virtual std::shared_ptr get_codegen_type(codegen::Scope& scope) override; virtual void typecheck_preprocess(typecheck::Scope& scope) override; @@ -284,7 +284,7 @@ namespace AST { } virtual ~FieldAccessExpression() override = default; virtual std::string formatted() override; - virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope) override; + virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) override; virtual void codegen_alloca(codegen::StackAllocator& allocator) override; virtual std::shared_ptr get_codegen_type(codegen::Scope& scope) override; virtual void typecheck_preprocess(typecheck::Scope& scope) override; @@ -311,7 +311,7 @@ namespace AST { } virtual ~ListInitializerExpression() override = default; virtual std::string formatted() override; - virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope) override; + virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) override; virtual void codegen_alloca(codegen::StackAllocator& allocator) override; virtual std::shared_ptr get_codegen_type(codegen::Scope& scope) override; virtual void typecheck_preprocess(typecheck::Scope& scope) override; @@ -332,7 +332,7 @@ namespace AST { } virtual ~ReturnStatement() override = default; virtual std::string formatted() override; - virtual void codegen(codegen::Builder& builder, codegen::Scope& scope) override; + virtual void codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) override; virtual void codegen_alloca(codegen::StackAllocator& allocator) override; virtual void typecheck_preprocess(typecheck::Scope& scope) override; virtual void typecheck(typecheck::State& state, typecheck::Scope& scope) override; @@ -356,7 +356,7 @@ namespace AST { } virtual ~InitializationStatement() override = default; virtual std::string formatted() override; - virtual void codegen(codegen::Builder& builder, codegen::Scope& scope) override; + virtual void codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) override; virtual void codegen_alloca(codegen::StackAllocator& allocator) override; virtual void typecheck_preprocess(typecheck::Scope& scope) override; virtual void typecheck(typecheck::State& state, typecheck::Scope& scope) override; @@ -371,7 +371,7 @@ namespace AST { } virtual ~ExpressionStatement() override = default; virtual std::string formatted() override; - virtual void codegen(codegen::Builder& builder, codegen::Scope& scope) override; + virtual void codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) override; virtual void codegen_alloca(codegen::StackAllocator& allocator) override; virtual void typecheck_preprocess(typecheck::Scope& scope) override; virtual void typecheck(typecheck::State& state, typecheck::Scope& scope) override; @@ -394,7 +394,7 @@ namespace AST { } virtual ~IfStatement() override = default; virtual std::string formatted() override; - virtual void codegen(codegen::Builder& builder, codegen::Scope& scope) override; + virtual void codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) override; virtual void codegen_alloca(codegen::StackAllocator& allocator) override; virtual void typecheck_preprocess(typecheck::Scope& scope) override; virtual void typecheck(typecheck::State& state, typecheck::Scope& scope) override; diff --git a/src/codegen.cpp b/src/codegen.cpp index 66b5b45..38347a4 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -20,7 +20,7 @@ namespace AST { return this->m_ty; } - codegen::StackValue IntLiteralExpression::codegen(codegen::Builder& builder, codegen::Scope& scope) { + codegen::StackValue IntLiteralExpression::codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) { auto ty = this->m_ty->codegen(builder, scope.structs); return codegen::StackValue{ @@ -38,7 +38,7 @@ namespace AST { return std::shared_ptr {stack_type}; } - codegen::StackValue StringLiteralExpression::codegen(codegen::Builder& builder, codegen::Scope& scope) { + codegen::StackValue StringLiteralExpression::codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) { auto stack_type = new types::ArrayType{ std::make_shared(true, types::FundamentalTypeKind::Char), static_cast(this->m_value.size()) + 1, @@ -78,7 +78,7 @@ namespace AST { } } - codegen::StackValue ValueReferenceExpression::codegen(codegen::Builder& builder, codegen::Scope& scope) { + codegen::StackValue ValueReferenceExpression::codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) { auto value = scope.values.find(this->m_name); if (value != scope.values.end()) { if (scope.is_lvalue) { @@ -121,10 +121,10 @@ namespace AST { } } - codegen::StackValue BinaryOperationExpression::codegen(codegen::Builder& builder, codegen::Scope& scope) { + codegen::StackValue BinaryOperationExpression::codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) { auto lvalued = scope.with_lvalue(); - auto lhs = this->m_lhs->codegen(builder, this->m_binop == types::BinOp::Assignment ? lvalued : scope); - auto rhs = this->m_rhs->codegen(builder, scope); + auto lhs = this->m_lhs->codegen(builder, this->m_binop == types::BinOp::Assignment ? lvalued : scope, allocator); + auto rhs = this->m_rhs->codegen(builder, scope, allocator); try { switch (this->m_binop) { case types::BinOp::Assignment: @@ -155,12 +155,12 @@ namespace AST { return *fn_ty->return_type(); } - codegen::StackValue FunctionCallExpression::codegen(codegen::Builder& builder, codegen::Scope& scope) { + codegen::StackValue FunctionCallExpression::codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) { std::vector args{}; for (auto& arg : this->m_args) { - args.push_back(arg->codegen(builder, scope).value); + args.push_back(arg->codegen(builder, scope, allocator).value); } - auto function = this->m_fn_expr->codegen(builder, scope); + auto function = this->m_fn_expr->codegen(builder, scope, allocator); auto value = builder.builder->CreateCall(llvm::dyn_cast(function.ty->codegen(builder, scope.structs)), function.value, args, "call"); return codegen::StackValue{ @@ -173,12 +173,12 @@ namespace AST { return this->m_ty; } - codegen::StackValue CastExpression::codegen(codegen::Builder& builder, codegen::Scope& scope) { + codegen::StackValue CastExpression::codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) { auto expr_ty = this->m_expr->get_codegen_type(scope); if (expr_ty->m_kind == types::TypeKind::Array && this->m_ty->m_kind == types::TypeKind::Pointer) { auto lvalued = scope.with_lvalue(); - auto expr = this->m_expr->codegen(builder, lvalued); + auto expr = this->m_expr->codegen(builder, lvalued, allocator); auto cast = types::find_cast(scope.casts, expr.ty, this->m_ty); if (cast) { return codegen::StackValue{ @@ -191,7 +191,7 @@ namespace AST { } } else { - auto expr = this->m_expr->codegen(builder, scope); + auto expr = this->m_expr->codegen(builder, scope, allocator); auto cast = types::find_cast(scope.casts, expr.ty, this->m_ty); if (cast) { return codegen::StackValue{ @@ -209,9 +209,9 @@ namespace AST { }; } - codegen::StackValue RefExpression::codegen(codegen::Builder& builder, codegen::Scope& scope) { + codegen::StackValue RefExpression::codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) { auto with_lvalue = scope.with_lvalue(); - return this->m_expr->codegen(builder, with_lvalue); + return this->m_expr->codegen(builder, with_lvalue, allocator); } std::shared_ptr DerefExpression::get_codegen_type(codegen::Scope& scope) { @@ -225,8 +225,8 @@ namespace AST { } } - codegen::StackValue DerefExpression::codegen(codegen::Builder& builder, codegen::Scope& scope) { - auto value = this->m_expr->codegen(builder, scope); + codegen::StackValue DerefExpression::codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) { + auto value = this->m_expr->codegen(builder, scope, allocator); if (value.ty->m_kind == types::TypeKind::Pointer) { auto loaded = value.ty->load(builder, value.value, scope.structs); return codegen::StackValue{ @@ -255,16 +255,16 @@ namespace AST { } - codegen::StackValue IndexAccessExpression::codegen(codegen::Builder& builder, codegen::Scope& scope) { + codegen::StackValue IndexAccessExpression::codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) { auto intended_ty = this->m_expr->get_codegen_type(scope); codegen::StackValue value; if (intended_ty->m_kind != types::TypeKind::Pointer) { auto lvalued = scope.with_lvalue(); - value = this->m_expr->codegen(builder, lvalued); + value = this->m_expr->codegen(builder, lvalued, allocator); } else { - value = this->m_expr->codegen(builder, scope); + value = this->m_expr->codegen(builder, scope, allocator); } std::cout << intended_ty->formatted() << std::endl; @@ -339,9 +339,9 @@ namespace AST { } } - codegen::StackValue FieldAccessExpression::codegen(codegen::Builder& builder, codegen::Scope& scope) { + codegen::StackValue FieldAccessExpression::codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) { auto lvalued = scope.with_lvalue(); - auto struct_ptr = this->m_expr->codegen(builder, lvalued); + auto struct_ptr = this->m_expr->codegen(builder, lvalued, allocator); if (struct_ptr.ty->m_kind == types::TypeKind::Pointer) { auto ptr_ty = dynamic_cast(struct_ptr.ty.get()); if (ptr_ty->m_inner->m_kind == types::TypeKind::Struct) { @@ -392,7 +392,7 @@ namespace AST { return this->m_ty; } - codegen::StackValue ListInitializerExpression::codegen(codegen::Builder& builder, codegen::Scope& scope) { + codegen::StackValue ListInitializerExpression::codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) { auto value_ptr = builder.builder->CreateAlloca(this->m_ty->codegen(builder, scope.structs)); if (this->m_ty->m_kind == types::TypeKind::Array) { @@ -404,7 +404,7 @@ namespace AST { indices.push_back(llvm::ConstantInt::get(builder.builder->getInt32Ty(), counter++)); auto gep = builder.builder->CreateGEP( array_ty->m_inner->codegen(builder, scope.structs), value_ptr, indices, "GEP"); - builder.builder->CreateStore(expr->codegen(builder, scope).value, gep); + builder.builder->CreateStore(expr->codegen(builder, scope, allocator).value, gep); } auto ptr_ty = std::shared_ptr{ @@ -428,7 +428,7 @@ namespace AST { struct_ty->codegen(builder, scope.structs), value_ptr, i, "struct_gep" ); builder.builder->CreateStore( - this->m_expressions[i]->codegen(builder, scope).value, gep); + this->m_expressions[i]->codegen(builder, scope, allocator).value, gep); } auto ptr_ty = std::shared_ptr{ @@ -450,25 +450,25 @@ namespace AST { } - void ReturnStatement::codegen(codegen::Builder& builder, codegen::Scope& scope) { + void ReturnStatement::codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) { if (!builder.block) return; builder.builder->SetInsertPoint(builder.block); - auto value = this->m_expr->codegen(builder, scope); + auto value = this->m_expr->codegen(builder, scope, allocator); builder.builder->CreateRet(value.value); } - void ExpressionStatement::codegen(codegen::Builder& builder, codegen::Scope& scope) { + void ExpressionStatement::codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) { if (!builder.block) return; builder.builder->SetInsertPoint(builder.block); - this->m_expr->codegen(builder, scope); + this->m_expr->codegen(builder, scope, allocator); } - void InitializationStatement::codegen(codegen::Builder& builder, codegen::Scope& scope) { + void InitializationStatement::codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) { if (!builder.block) return; @@ -478,7 +478,7 @@ namespace AST { auto raw_llvm_ty = this->m_type->codegen(builder, scope.structs); auto ptr = builder.builder->CreateAlloca(raw_llvm_ty); if (this->m_expr.has_value()) { - auto value = this->m_expr->get()->codegen(builder, scope); + auto value = this->m_expr->get()->codegen(builder, scope, allocator); builder.builder->CreateStore(value.value, ptr, false); } @@ -489,7 +489,7 @@ namespace AST { auto ty = this->m_type->codegen(builder, scope.structs); auto ptr = builder.builder->CreateAlloca(ty); if (this->m_expr.has_value()) { - auto value = this->m_expr->get()->codegen(builder, scope); + auto value = this->m_expr->get()->codegen(builder, scope, allocator); builder.builder->CreateStore(value.value, ptr, false); } @@ -500,13 +500,13 @@ namespace AST { scope.values[this->m_name] = codegen::StackValue{ ptr, ptr_ty }; } - void IfStatement::codegen(codegen::Builder& builder, codegen::Scope& scope) { + void IfStatement::codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) { if (!builder.block) return; builder.builder->SetInsertPoint(builder.block); - auto condition = this->m_condition->codegen(builder, scope); + auto condition = this->m_condition->codegen(builder, scope, allocator); auto function = builder.block->getParent(); auto then_block = llvm::BasicBlock::Create(*builder.context, "then", function); @@ -521,13 +521,13 @@ namespace AST { builder.block = then_block; builder.builder->SetInsertPoint(then_block); - this->m_then->codegen(builder, scope); + this->m_then->codegen(builder, scope, allocator); builder.builder->CreateBr(after_block); if (else_block.has_value()) { builder.block = *else_block; builder.builder->SetInsertPoint(*else_block); - this->m_else->get()->codegen(builder, scope); + this->m_else->get()->codegen(builder, scope, allocator); builder.builder->CreateBr(after_block); } @@ -605,7 +605,7 @@ namespace AST { } for (auto& statement : *this->m_statements) { - statement->codegen(builder, inner_scope); + statement->codegen(builder, inner_scope, allocator); } }