diff options
| author | Baitinq <[email protected]> | 2025-02-12 00:34:07 +0100 |
|---|---|---|
| committer | Baitinq <[email protected]> | 2025-02-12 00:34:58 +0100 |
| commit | f3c740b42df6a1d46d664707d362e30a4f5806a1 (patch) | |
| tree | d4a3f647411a9294cbf378b2cd63d884b8a3f3c4 | |
| parent | Misc: Update flake (diff) | |
| download | interpreter-f3c740b42df6a1d46d664707d362e30a4f5806a1.tar.gz interpreter-f3c740b42df6a1d46d664707d362e30a4f5806a1.tar.bz2 interpreter-f3c740b42df6a1d46d664707d362e30a4f5806a1.zip | |
Codegen: Fix generating function params
| -rw-r--r-- | examples/8.src | 2 | ||||
| -rw-r--r-- | src/codegen.zig | 28 |
2 files changed, 21 insertions, 9 deletions
diff --git a/examples/8.src b/examples/8.src index 4c5774e..33323f7 100644 --- a/examples/8.src +++ b/examples/8.src @@ -13,5 +13,3 @@ let main = () => { print(result); return result; }; - -/* TODO */ diff --git a/src/codegen.zig b/src/codegen.zig index 81ff1dd..ddc34cc 100644 --- a/src/codegen.zig +++ b/src/codegen.zig @@ -260,6 +260,7 @@ pub const CodeGen = struct { const function_entry = core.LLVMAppendBasicBlock(function, "entrypoint") orelse return CodeGenError.CompilationError; core.LLVMPositionBuilderAtEnd(self.builder, function_entry); + // Needed for recursive functions if (name != null) { try self.environment.add_variable(name.?, try self.create_variable(.{ .value = function, @@ -272,12 +273,17 @@ pub const CodeGen = struct { var parameters_index: usize = 0; for (params) |p| { + defer parameters_index += 1; const xdd = function_definition.parameters[parameters_index]; + + const x = try std.fmt.allocPrintZ(self.arena, "{s}", .{xdd.PRIMARY_EXPRESSION.IDENTIFIER.name}); + const alloca = core.LLVMBuildAlloca(self.builder, core.LLVMInt64Type(), x); + _ = core.LLVMBuildStore(self.builder, p, alloca); + try self.environment.add_variable(xdd.PRIMARY_EXPRESSION.IDENTIFIER.name, try self.create_variable(.{ - .value = p, + .value = alloca, .type = core.LLVMInt64Type(), })); - parameters_index += 1; } for (function_definition.statements) |stmt| { @@ -290,11 +296,19 @@ pub const CodeGen = struct { }); }, .FUNCTION_CALL_STATEMENT => |*fn_call| { - const r = try self.generate_function_call_statement(@ptrCast(fn_call)); - return try self.create_variable(.{ - .value = r, - .type = core.LLVMInt64Type(), - }); + if (name != null) { + const ptr = self.environment.get_variable(name.?) orelse unreachable; + const r = try self.generate_function_call_statement(@ptrCast(fn_call)); + _ = core.LLVMBuildStore(self.builder, r, ptr.value) orelse return CodeGenError.CompilationError; + ptr.type = core.LLVMInt64Type(); + return ptr; + } else { + const r = try self.generate_function_call_statement(@ptrCast(fn_call)); + return try self.create_variable(.{ + .value = r, + .type = core.LLVMInt64Type(), + }); + } }, .PRIMARY_EXPRESSION => |primary_expression| switch (primary_expression) { .NUMBER => |n| { |