about summary refs log tree commit diff
path: root/src/codegen.zig
diff options
context:
space:
mode:
authorBaitinq <[email protected]>2025-03-25 00:21:56 +0100
committerBaitinq <[email protected]>2025-03-25 00:21:56 +0100
commite4a1bc33759f2bc39379a93002ac632741cb5f8a (patch)
tree3a089cd55a808fc907b0930cf66c2ce34779f010 /src/codegen.zig
parentFeature: Add "proper" pointer types (diff)
downloadpry-lang-e4a1bc33759f2bc39379a93002ac632741cb5f8a.tar.gz
pry-lang-e4a1bc33759f2bc39379a93002ac632741cb5f8a.tar.bz2
pry-lang-e4a1bc33759f2bc39379a93002ac632741cb5f8a.zip
Feature: Add basic support for varargs
Diffstat (limited to 'src/codegen.zig')
-rw-r--r--src/codegen.zig7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/codegen.zig b/src/codegen.zig
index fc956a5..d9312a3 100644
--- a/src/codegen.zig
+++ b/src/codegen.zig
@@ -524,10 +524,15 @@ pub const CodeGen = struct {
             .FUNCTION_TYPE => |t| {
                 const return_type = try self.get_llvm_type(t.return_type);
                 var paramtypes = std.ArrayList(llvm.LLVMTypeRef).init(self.arena);
+                var is_varargs: i8 = 0;
                 for (t.parameters) |param| {
+                    if (param.TYPE == .SIMPLE_TYPE and std.mem.eql(u8, param.TYPE.SIMPLE_TYPE.name, "varargs")) {
+                        is_varargs = 1;
+                        continue;
+                    }
                     try paramtypes.append(try self.get_llvm_type(param));
                 }
-                const function_type = llvm.LLVMFunctionType(return_type, paramtypes.items.ptr, @intCast(paramtypes.items.len), 0) orelse unreachable;
+                const function_type = llvm.LLVMFunctionType(return_type, paramtypes.items.ptr, @intCast(paramtypes.items.len), is_varargs) orelse unreachable;
                 return function_type;
             },
             .POINTER_TYPE => |t| {