diff --git a/src/codegen.c b/src/codegen.c index 874e24f..c9d95f3 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -642,9 +642,41 @@ static void CompileIfStatement(LLVMBuilderRef builder, LLVMValueRef function, No for (i = 0; i < ifStatement->children[1]->childCount; i += 1) { CompileStatement(builder, function, ifStatement->children[1]->children[i]); - LLVMBuildBr(builder, afterCond); } + LLVMBuildBr(builder, afterCond); + LLVMPositionBuilderAtEnd(builder, afterCond); +} + +static void CompileIfElseStatement(LLVMBuilderRef builder, LLVMValueRef function, Node *ifElseStatement) +{ + uint32_t i; + LLVMValueRef conditional = CompileExpression(builder, ifElseStatement->children[0]->children[0]); + + LLVMBasicBlockRef ifBlock = LLVMAppendBasicBlock(function, "ifBlock"); + LLVMBasicBlockRef elseBlock = LLVMAppendBasicBlock(function, "elseBlock"); + LLVMBasicBlockRef afterCond = LLVMAppendBasicBlock(function, "afterCond"); + + LLVMBuildCondBr(builder, conditional, ifBlock, elseBlock); + + LLVMPositionBuilderAtEnd(builder, ifBlock); + + for (i = 0; i < ifElseStatement->children[0]->children[1]->childCount; i += 1) + { + CompileStatement(builder, function, ifElseStatement->children[0]->children[1]->children[i]); + } + + LLVMBuildBr(builder, afterCond); + + LLVMPositionBuilderAtEnd(builder, elseBlock); + + for (i = 0; i < ifElseStatement->children[1]->childCount; i += 1) + { + CompileStatement(builder, function, ifElseStatement->children[1]->children[i]); + } + + LLVMBuildBr(builder, afterCond); + LLVMPositionBuilderAtEnd(builder, afterCond); } @@ -668,6 +700,10 @@ static uint8_t CompileStatement(LLVMBuilderRef builder, LLVMValueRef function, N CompileIfStatement(builder, function, statement); return 0; + case IfElseStatement: + CompileIfElseStatement(builder, function, statement); + return 0; + case Return: CompileReturn(builder, statement); return 1;