From c82b80f2e16461869e5e3f187884de46293c4003 Mon Sep 17 00:00:00 2001 From: Osama Ahmad Date: Sun, 29 Oct 2023 00:27:38 +0200 Subject: [PATCH] Support while loops --- src/code_generation/llvm/generator.rs | 23 +++++++++++++-------- src/tests/while.c | 29 +++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 8 deletions(-) create mode 100644 src/tests/while.c diff --git a/src/code_generation/llvm/generator.rs b/src/code_generation/llvm/generator.rs index f4dc3cc..19d8fe5 100644 --- a/src/code_generation/llvm/generator.rs +++ b/src/code_generation/llvm/generator.rs @@ -57,7 +57,7 @@ impl<'ctx> LLVMGenerator<'ctx> { ExpressionNode(expression) => self.generate_expression(expression).as_any_value_enum(), Scope(..) => self.generate_scope(node).as_any_value_enum(), If(..) => self.generate_if_statement(node).as_any_value_enum(), - // While(..) => self.generate_while(node), + While(..) => self.generate_while(node).as_any_value_enum(), // DoWhile(..) => self.generate_do_while(node), ExpressionStatement(..) => self.generate_expression_statement(node).as_any_value_enum(), // For(..) => self.generate_for(node), @@ -565,16 +565,18 @@ impl<'ctx> LLVMGenerator<'ctx> { let cond_result = self.generate_expression(condition); let zero = self.context.i32_type().const_int(0, false); - let i32_value = self.builder.build_int_z_extend(cond_result.into_int_value(), self.context.i32_type(), "extended_condition").unwrap(); - let bool_value = self + let i32_value = self .builder - .build_int_compare( - inkwell::IntPredicate::NE, - i32_value, - zero, - "bool_value", + .build_int_z_extend( + cond_result.into_int_value(), + self.context.i32_type(), + "extended_condition", ) .unwrap(); + let bool_value = self + .builder + .build_int_compare(inkwell::IntPredicate::NE, i32_value, zero, "bool_value") + .unwrap(); self.builder .build_conditional_branch(bool_value, then_block, else_block) .unwrap(); @@ -719,6 +721,11 @@ mod tests { run_tests_from_file("./src/tests/if.c"); } + #[test] + fn test_while() { + run_tests_from_file("./src/tests/while.c"); + } + #[test] fn test_assignment() { run_tests_from_file("./src/tests/assignment.c"); diff --git a/src/tests/while.c b/src/tests/while.c new file mode 100644 index 0000000..c70c9fc --- /dev/null +++ b/src/tests/while.c @@ -0,0 +1,29 @@ +// CASE Basic while loop +// RETURNS 5 + +int main() { + int x = 0; + int y = 5; + while (y > 0) { + y = y - 1; + x = x + 1; + } + return x; +} + +// CASE 45th Fibonacci +// RETURNS 1836311903 + +int main() { + int x = 45; + int a = 0; + int b = 1; + int c; + while (x) { + c = a + b; + a = b; + b = c; + x = x - 1; + } + return c; +} \ No newline at end of file