Fix bug in if-statements, implement continue and break correctly

This commit is contained in:
Sofia 2026-04-30 20:42:35 +03:00
parent 6ca1641705
commit de702514d9
4 changed files with 22 additions and 16 deletions

View File

@ -119,7 +119,7 @@ namespace types {
[](codegen::Builder& builder, std::shared_ptr<Type> ty, llvm::Value* ptr) { [](codegen::Builder& builder, std::shared_ptr<Type> ty, llvm::Value* ptr) {
codegen::TypeMap structs {}; codegen::TypeMap structs {};
auto llvm_ty = ty->codegen(builder, 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 const_1 = llvm::ConstantInt::get(llvm_ty, 1);
auto result = builder.builder->CreateAdd(loaded, const_1, "add"); auto result = builder.builder->CreateAdd(loaded, const_1, "add");
builder.builder->CreateStore(result, ptr); builder.builder->CreateStore(result, ptr);
@ -132,7 +132,7 @@ namespace types {
[](codegen::Builder& builder, std::shared_ptr<Type> ty, llvm::Value* ptr) { [](codegen::Builder& builder, std::shared_ptr<Type> ty, llvm::Value* ptr) {
codegen::TypeMap structs {}; codegen::TypeMap structs {};
auto llvm_ty = ty->codegen(builder, 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 const_1 = llvm::ConstantInt::get(llvm_ty, 1);
auto result = builder.builder->CreateAdd(loaded, const_1, "add"); auto result = builder.builder->CreateAdd(loaded, const_1, "add");
builder.builder->CreateStore(result, ptr); builder.builder->CreateStore(result, ptr);
@ -145,7 +145,7 @@ namespace types {
[](codegen::Builder& builder, std::shared_ptr<Type> ty, llvm::Value* ptr) { [](codegen::Builder& builder, std::shared_ptr<Type> ty, llvm::Value* ptr) {
codegen::TypeMap structs {}; codegen::TypeMap structs {};
auto llvm_ty = ty->codegen(builder, 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 const_1 = llvm::ConstantInt::get(llvm_ty, 1);
auto result = builder.builder->CreateSub(loaded, const_1, "sub"); auto result = builder.builder->CreateSub(loaded, const_1, "sub");
builder.builder->CreateStore(result, ptr); builder.builder->CreateStore(result, ptr);
@ -158,7 +158,7 @@ namespace types {
[](codegen::Builder& builder, std::shared_ptr<Type> ty, llvm::Value* ptr) { [](codegen::Builder& builder, std::shared_ptr<Type> ty, llvm::Value* ptr) {
codegen::TypeMap structs {}; codegen::TypeMap structs {};
auto llvm_ty = ty->codegen(builder, 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 const_1 = llvm::ConstantInt::get(llvm_ty, 1);
auto result = builder.builder->CreateSub(loaded, const_1, "sub"); auto result = builder.builder->CreateSub(loaded, const_1, "sub");
builder.builder->CreateStore(result, ptr); builder.builder->CreateStore(result, ptr);

View File

@ -367,7 +367,7 @@ namespace AST {
} }
auto gep = builder.builder->CreateStructGEP( 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) { if (scope.is_lvalue) {
@ -553,13 +553,15 @@ namespace AST {
builder.block = then_block; builder.block = then_block;
builder.builder->SetInsertPoint(then_block); builder.builder->SetInsertPoint(then_block);
this->m_then->codegen(builder, scope, allocator); 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()) { if (else_block.has_value()) {
builder.block = *else_block; builder.block = *else_block;
builder.builder->SetInsertPoint(*else_block); builder.builder->SetInsertPoint(*else_block);
this->m_else->get()->codegen(builder, scope, allocator); 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; builder.block = after_block;
@ -628,10 +630,14 @@ namespace AST {
builder.builder->CreateBr(cond_bb); builder.builder->CreateBr(cond_bb);
codegen::Scope inner_scope{ scope };
inner_scope.continue_bb = cond_bb;
inner_scope.break_bb = after_bb;
// While condition // While condition
builder.builder->SetInsertPoint(cond_bb); builder.builder->SetInsertPoint(cond_bb);
if (this->m_cond) { 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); builder.builder->CreateCondBr(cond_value.value, inner_bb, after_bb);
} }
else { else {
@ -641,7 +647,7 @@ namespace AST {
// While loop // While loop
builder.builder->SetInsertPoint(inner_bb); builder.builder->SetInsertPoint(inner_bb);
builder.block = 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); builder.builder->CreateBr(cond_bb);
// After // After

View File

@ -151,7 +151,7 @@ namespace types {
std::pair<llvm::Value*, std::shared_ptr<Type>> PointerType::load(codegen::Builder& builder, llvm::Value* ptr, codegen::TypeMap& structs) { std::pair<llvm::Value*, std::shared_ptr<Type>> PointerType::load(codegen::Builder& builder, llvm::Value* ptr, codegen::TypeMap& structs) {
return std::pair( 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 this->m_inner
); );
} }

12
test.c
View File

@ -64,12 +64,12 @@ int main() {
} }
// Test while-loops // Test while-loops
// int counter = 0; int counter = 0;
// while (1) { while (1) {
// if (counter > 10) if (counter > 10)
// break; break;
// printf("while-counter: %d\n", counter++); printf("while-counter: %d\n", counter++);
// } }
return 0; return 0;
} }