From de702514d93c4659648ef2b3199064250bd91749 Mon Sep 17 00:00:00 2001 From: Sofia Date: Thu, 30 Apr 2026 20:42:35 +0300 Subject: [PATCH] Fix bug in if-statements, implement continue and break correctly --- src/binops.cpp | 8 ++++---- src/codegen.cpp | 16 +++++++++++----- src/types.cpp | 2 +- test.c | 12 ++++++------ 4 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/binops.cpp b/src/binops.cpp index 2929654..bb1934e 100644 --- a/src/binops.cpp +++ b/src/binops.cpp @@ -119,7 +119,7 @@ namespace types { [](codegen::Builder& builder, std::shared_ptr ty, llvm::Value* ptr) { codegen::TypeMap structs {}; auto llvm_ty = ty->codegen(builder, structs); - auto loaded = builder.builder->CreateLoad(llvm_ty, ptr); + auto loaded = builder.builder->CreateLoad(llvm_ty, ptr, "load"); auto const_1 = llvm::ConstantInt::get(llvm_ty, 1); auto result = builder.builder->CreateAdd(loaded, const_1, "add"); builder.builder->CreateStore(result, ptr); @@ -132,7 +132,7 @@ namespace types { [](codegen::Builder& builder, std::shared_ptr ty, llvm::Value* ptr) { codegen::TypeMap structs {}; auto llvm_ty = ty->codegen(builder, structs); - auto loaded = builder.builder->CreateLoad(llvm_ty, ptr); + auto loaded = builder.builder->CreateLoad(llvm_ty, ptr, "load"); auto const_1 = llvm::ConstantInt::get(llvm_ty, 1); auto result = builder.builder->CreateAdd(loaded, const_1, "add"); builder.builder->CreateStore(result, ptr); @@ -145,7 +145,7 @@ namespace types { [](codegen::Builder& builder, std::shared_ptr ty, llvm::Value* ptr) { codegen::TypeMap structs {}; auto llvm_ty = ty->codegen(builder, structs); - auto loaded = builder.builder->CreateLoad(llvm_ty, ptr); + auto loaded = builder.builder->CreateLoad(llvm_ty, ptr, "load"); auto const_1 = llvm::ConstantInt::get(llvm_ty, 1); auto result = builder.builder->CreateSub(loaded, const_1, "sub"); builder.builder->CreateStore(result, ptr); @@ -158,7 +158,7 @@ namespace types { [](codegen::Builder& builder, std::shared_ptr ty, llvm::Value* ptr) { codegen::TypeMap structs {}; auto llvm_ty = ty->codegen(builder, structs); - auto loaded = builder.builder->CreateLoad(llvm_ty, ptr); + auto loaded = builder.builder->CreateLoad(llvm_ty, ptr, "load"); auto const_1 = llvm::ConstantInt::get(llvm_ty, 1); auto result = builder.builder->CreateSub(loaded, const_1, "sub"); builder.builder->CreateStore(result, ptr); diff --git a/src/codegen.cpp b/src/codegen.cpp index 304eb3b..2536719 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -367,7 +367,7 @@ namespace AST { } auto gep = builder.builder->CreateStructGEP( - ptr_ty->m_inner->codegen(builder, scope.structs), struct_ptr.value, idx); + ptr_ty->m_inner->codegen(builder, scope.structs), struct_ptr.value, idx, "struct_gep"); if (scope.is_lvalue) { @@ -553,13 +553,15 @@ namespace AST { builder.block = then_block; builder.builder->SetInsertPoint(then_block); this->m_then->codegen(builder, scope, allocator); - builder.builder->CreateBr(after_block); + if (builder.block->getTerminator() == nullptr) + 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, allocator); - builder.builder->CreateBr(after_block); + if (builder.block->getTerminator() == nullptr) + builder.builder->CreateBr(after_block); } builder.block = after_block; @@ -628,10 +630,14 @@ namespace AST { builder.builder->CreateBr(cond_bb); + codegen::Scope inner_scope{ scope }; + inner_scope.continue_bb = cond_bb; + inner_scope.break_bb = after_bb; + // While condition builder.builder->SetInsertPoint(cond_bb); if (this->m_cond) { - auto cond_value = (*this->m_cond)->codegen(builder, scope, allocator); + auto cond_value = (*this->m_cond)->codegen(builder, inner_scope, allocator); builder.builder->CreateCondBr(cond_value.value, inner_bb, after_bb); } else { @@ -641,7 +647,7 @@ namespace AST { // While loop builder.builder->SetInsertPoint(inner_bb); builder.block = inner_bb; - this->m_loop->codegen(builder, scope, allocator); + this->m_loop->codegen(builder, inner_scope, allocator); builder.builder->CreateBr(cond_bb); // After diff --git a/src/types.cpp b/src/types.cpp index 764c8aa..49a451b 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -151,7 +151,7 @@ namespace types { std::pair> PointerType::load(codegen::Builder& builder, llvm::Value* ptr, codegen::TypeMap& structs) { return std::pair( - builder.builder->CreateLoad(this->m_inner->codegen(builder, structs), ptr), + builder.builder->CreateLoad(this->m_inner->codegen(builder, structs), ptr, "load"), this->m_inner ); } diff --git a/test.c b/test.c index f1f0219..360eae8 100644 --- a/test.c +++ b/test.c @@ -64,12 +64,12 @@ int main() { } // Test while-loops - // int counter = 0; - // while (1) { - // if (counter > 10) - // break; - // printf("while-counter: %d\n", counter++); - // } + int counter = 0; + while (1) { + if (counter > 10) + break; + printf("while-counter: %d\n", counter++); + } return 0; } \ No newline at end of file