about summary refs log tree commit diff
path: root/src/codegen.zig
diff options
context:
space:
mode:
authorBaitinq <[email protected]>2025-02-12 00:34:07 +0100
committerBaitinq <[email protected]>2025-02-12 00:34:58 +0100
commitf3c740b42df6a1d46d664707d362e30a4f5806a1 (patch)
treed4a3f647411a9294cbf378b2cd63d884b8a3f3c4 /src/codegen.zig
parentMisc: Update flake (diff)
downloadinterpreter-f3c740b42df6a1d46d664707d362e30a4f5806a1.tar.gz
interpreter-f3c740b42df6a1d46d664707d362e30a4f5806a1.tar.bz2
interpreter-f3c740b42df6a1d46d664707d362e30a4f5806a1.zip
Codegen: Fix generating function params
Diffstat (limited to '')
-rw-r--r--src/codegen.zig28
1 files changed, 21 insertions, 7 deletions
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| {