From 99acdfc26022bfa014d2dcc9e815ed1cb4ac2022 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Grodzi=C5=84ski?= Date: Fri, 6 Jun 2025 16:58:38 +0900 Subject: [PATCH] Added if/else code gen --- src/ModuleBuilder.cpp | 41 +++++++++++++++++++++++++++++++++++++++++ src/ModuleBuilder.h | 1 + 2 files changed, 42 insertions(+) diff --git a/src/ModuleBuilder.cpp b/src/ModuleBuilder.cpp index 012bd7f..3a4f710 100644 --- a/src/ModuleBuilder.cpp +++ b/src/ModuleBuilder.cpp @@ -70,6 +70,8 @@ llvm::Value *ModuleBuilder::valueForExpression(shared_ptr expression return valueForExpression(dynamic_pointer_cast(expression)->getExpression()); case Expression::Kind::BINARY: return valueForBinary(dynamic_pointer_cast(expression)); + case Expression::Kind::IF_ELSE: + return valueForIfElse(dynamic_pointer_cast(expression)); default: exit(1); } @@ -112,3 +114,42 @@ llvm::Value *ModuleBuilder::valueForBinary(shared_ptr expressi return builder->CreateSRem(leftValue, rightValue); } } + +llvm::Value *ModuleBuilder::valueForIfElse(shared_ptr expression) { + shared_ptr conditionExpression = dynamic_pointer_cast(expression->getCondition()); + + llvm::Function *fun = builder->GetInsertBlock()->getParent(); + llvm::Value *conditionValue = valueForBinary(conditionExpression); + + llvm::BasicBlock *thenBlock = llvm::BasicBlock::Create(*context, "thenBlock", fun); + llvm::BasicBlock *elseBlock = llvm::BasicBlock::Create(*context, "elseBlock"); + llvm::BasicBlock *mergeBlock = llvm::BasicBlock::Create(*context, "mergeBlock"); + + builder->CreateCondBr(conditionValue, thenBlock, elseBlock); + + // Then + builder->SetInsertPoint(thenBlock); + llvm::Value *thenValue = llvm::ConstantInt::get(int32Type, 11, true); + buildStatement(expression->getThenBlock()); + builder->CreateBr(mergeBlock); + thenBlock = builder->GetInsertBlock(); + + // Else + fun->insert(fun->end(), elseBlock); + llvm::Value *elseValue = llvm::ConstantInt::get(int32Type, 22, true); + builder->SetInsertPoint(elseBlock); + if (expression->getElseBlock() != nullptr) + buildStatement(expression->getElseBlock()); + builder->CreateBr(mergeBlock); + elseBlock = builder->GetInsertBlock(); + + // Merge + fun->insert(fun->end(), mergeBlock); + builder->SetInsertPoint(mergeBlock); + llvm::PHINode *phi = builder->CreatePHI(int32Type, 2, "phii"); + phi->addIncoming(thenValue, thenBlock); + phi->addIncoming(elseValue, elseBlock); + + //return llvm::ConstantInt::get(int32Type, 42, true); + return phi; +} diff --git a/src/ModuleBuilder.h b/src/ModuleBuilder.h index d6c6a9f..ac8c507 100644 --- a/src/ModuleBuilder.h +++ b/src/ModuleBuilder.h @@ -33,6 +33,7 @@ private: llvm::Value *valueForLiteral(shared_ptr expression); llvm::Value *valueForGrouping(shared_ptr expression); llvm::Value *valueForBinary(shared_ptr expression); + llvm::Value *valueForIfElse(shared_ptr expression); public: ModuleBuilder(vector> statements);