Added if/else code gen

This commit is contained in:
Rafał Grodziński
2025-06-06 16:58:38 +09:00
parent 3e1311513f
commit 99acdfc260
2 changed files with 42 additions and 0 deletions

View File

@@ -70,6 +70,8 @@ llvm::Value *ModuleBuilder::valueForExpression(shared_ptr<Expression> expression
return valueForExpression(dynamic_pointer_cast<ExpressionGrouping>(expression)->getExpression());
case Expression::Kind::BINARY:
return valueForBinary(dynamic_pointer_cast<ExpressionBinary>(expression));
case Expression::Kind::IF_ELSE:
return valueForIfElse(dynamic_pointer_cast<ExpressionIfElse>(expression));
default:
exit(1);
}
@@ -112,3 +114,42 @@ llvm::Value *ModuleBuilder::valueForBinary(shared_ptr<ExpressionBinary> expressi
return builder->CreateSRem(leftValue, rightValue);
}
}
llvm::Value *ModuleBuilder::valueForIfElse(shared_ptr<ExpressionIfElse> expression) {
shared_ptr<ExpressionBinary> conditionExpression = dynamic_pointer_cast<ExpressionBinary>(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;
}

View File

@@ -33,6 +33,7 @@ private:
llvm::Value *valueForLiteral(shared_ptr<ExpressionLiteral> expression);
llvm::Value *valueForGrouping(shared_ptr<ExpressionGrouping> expression);
llvm::Value *valueForBinary(shared_ptr<ExpressionBinary> expression);
llvm::Value *valueForIfElse(shared_ptr<ExpressionIfElse> expression);
public:
ModuleBuilder(vector<shared_ptr<Statement>> statements);