Codegen for-loops

This commit is contained in:
Sofia 2026-04-28 01:45:29 +03:00
parent 6247bc91f6
commit 941e19d4dd
2 changed files with 33 additions and 3 deletions

View File

@ -139,7 +139,7 @@ namespace AST {
std::string ForStatement::formatted() { std::string ForStatement::formatted() {
std::stringstream out{ "" }; std::stringstream out{ "" };
out << "("; out << "for (";
if (this->m_init) if (this->m_init)
out << (*this->m_init)->formatted(); out << (*this->m_init)->formatted();
out << ";"; out << ";";

View File

@ -557,13 +557,43 @@ namespace AST {
builder.builder->SetInsertPoint(after_block); builder.builder->SetInsertPoint(after_block);
} }
void ForStatement::codegen(codegen::Builder& builder, codegen::Scope&, codegen::StackAllocator&) { void ForStatement::codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) {
if (!builder.block) if (!builder.block)
return; return;
builder.builder->SetInsertPoint(builder.block); builder.builder->SetInsertPoint(builder.block);
throw CompileError("TODO", this->m_meta); if (this->m_init)
(*this->m_init)->codegen(builder, scope, allocator);
auto function = builder.block->getParent();
auto cond_bb = llvm::BasicBlock::Create(*builder.context, "for-cond", function);
auto inner_bb = llvm::BasicBlock::Create(*builder.context, "for-inner", function);
auto after_bb = llvm::BasicBlock::Create(*builder.context, "for-after", function);
builder.builder->CreateBr(cond_bb);
// Loop conditional
builder.builder->SetInsertPoint(cond_bb);
if (this->m_cond) {
auto cond_res = (*this->m_cond)->codegen(builder, scope, allocator);
builder.builder->CreateCondBr(cond_res.value, inner_bb, after_bb);
}
else {
builder.builder->CreateBr(inner_bb);
}
// Loop inner block
builder.block = inner_bb;
builder.builder->SetInsertPoint(inner_bb);
this->m_loop->codegen(builder, scope, allocator);
if (this->m_after)
(*this->m_after)->codegen(builder, scope, allocator);
builder.builder->CreateBr(cond_bb);
// Loop after
builder.block = after_bb;
builder.builder->SetInsertPoint(after_bb);
} }