about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--examples/0.src4
-rw-r--r--examples/1.src2
-rw-r--r--examples/10.src2
-rw-r--r--examples/11.src2
-rw-r--r--examples/12.src2
-rw-r--r--examples/13.src2
-rw-r--r--examples/16.src2
-rw-r--r--examples/4.src2
-rw-r--r--examples/5.src2
-rw-r--r--examples/6.5.src2
-rw-r--r--examples/6.src2
-rw-r--r--examples/7.src2
-rw-r--r--examples/8.src2
-rw-r--r--examples/9.src2
-rw-r--r--src/codegen.zig7
15 files changed, 21 insertions, 16 deletions
diff --git a/examples/0.src b/examples/0.src
index 16a0b24..8d0f7c1 100644
--- a/examples/0.src
+++ b/examples/0.src
@@ -1,7 +1,7 @@
 /* HELLO! Welcome to the unnamed language */
-extern printf = (*i64, i64) => i64;
+extern printf = (*i64, varargs) => i64;
 
-let main = (argc: i64) => i64 {
+let main = (argc: i64, argv: *i64) => i64 {
 	printf("%d", argc);
 	
 	return 2;
diff --git a/examples/1.src b/examples/1.src
index a31d791..05e0121 100644
--- a/examples/1.src
+++ b/examples/1.src
@@ -1,4 +1,4 @@
-extern printf = (*i64, i64) => i64;
+extern printf = (*i64, varargs) => i64;
 
 let main = () => i64 {
 	let s = "hello";
diff --git a/examples/10.src b/examples/10.src
index 28b621f..b196846 100644
--- a/examples/10.src
+++ b/examples/10.src
@@ -1,4 +1,4 @@
-extern printf = (*i64, i64) => i64;
+extern printf = (*i64, varargs) => i64;
 
 let main = () => i64 {
 	let counter = 0;
diff --git a/examples/11.src b/examples/11.src
index 5761b20..cfefad8 100644
--- a/examples/11.src
+++ b/examples/11.src
@@ -1,4 +1,4 @@
-extern printf = (*i64, i64) => i64;
+extern printf = (*i64, varargs) => i64;
 
 let main = () => i64 {
 	let y = (f: (i64) => i64, x: i64) => i64 {
diff --git a/examples/12.src b/examples/12.src
index 3f4822d..3ecbaa3 100644
--- a/examples/12.src
+++ b/examples/12.src
@@ -1,4 +1,4 @@
-extern printf = (*i64, i64) => i64;
+extern printf = (*i64, varargs) => i64;
 
 let main = () => i64 {
     let factorial = (n: i64) => i64 {
diff --git a/examples/13.src b/examples/13.src
index afc05ac..5bd0863 100644
--- a/examples/13.src
+++ b/examples/13.src
@@ -1,4 +1,4 @@
-extern printf = (*i64, i64) => i64;
+extern printf = (*i64, varargs) => i64;
 
 let main = () => i64 {
     /* Iterative Fibonacci using while loop. */
diff --git a/examples/16.src b/examples/16.src
index 14e31af..3fc4c13 100644
--- a/examples/16.src
+++ b/examples/16.src
@@ -1,4 +1,4 @@
-extern printf = (*i64, i64) => i64;
+extern printf = (*i64, varargs) => i64;
 extern SDL_CreateWindow = (ptr, i64, i64, i64, i64, i64) => i64;
 extern SDL_Init = (i64) => i64;
 
diff --git a/examples/4.src b/examples/4.src
index eeba36d..3ba2ef9 100644
--- a/examples/4.src
+++ b/examples/4.src
@@ -1,4 +1,4 @@
-extern printf = (*i64, i64) => i64;
+extern printf = (*i64, varargs) => i64;
 
 let main = () => i64 {
 	let print_one = () => i64 {
diff --git a/examples/5.src b/examples/5.src
index fe07d38..f149e92 100644
--- a/examples/5.src
+++ b/examples/5.src
@@ -1,5 +1,5 @@
 /* As you see, the language supports variable scopes */
-extern printf = (*i64, i64) => i64;
+extern printf = (*i64, varargs) => i64;
 
 let x = 18;
 
diff --git a/examples/6.5.src b/examples/6.5.src
index fac11da..fd645af 100644
--- a/examples/6.5.src
+++ b/examples/6.5.src
@@ -1,4 +1,4 @@
-extern printf = (*i64, i64) => i64;
+extern printf = (*i64, varargs) => i64;
 
 let main = () => i64 {
 	let x = !(1 == 1);
diff --git a/examples/6.src b/examples/6.src
index 9b85439..ccfa585 100644
--- a/examples/6.src
+++ b/examples/6.src
@@ -1,4 +1,4 @@
-extern printf = (*i64, i64) => i64;
+extern printf = (*i64, varargs) => i64;
 
 let print_input = (input_a: i64, input_b: i64) => i64 {
 	printf("%d", input_a);
diff --git a/examples/7.src b/examples/7.src
index b6c0f9b..e887d9c 100644
--- a/examples/7.src
+++ b/examples/7.src
@@ -1,4 +1,4 @@
-extern printf = (*i64, i64) => i64;
+extern printf = (*i64, varargs) => i64;
 
 let ten = () => i64 {
 	return () => i64 {
diff --git a/examples/8.src b/examples/8.src
index 165fbfd..339dcba 100644
--- a/examples/8.src
+++ b/examples/8.src
@@ -1,4 +1,4 @@
-extern printf = (*i64, i64) => i64;
+extern printf = (*i64, varargs) => i64;
 
 let main = () => i64 {
 	let fib = (n: i64) => i64 {
diff --git a/examples/9.src b/examples/9.src
index 1e50614..55b1797 100644
--- a/examples/9.src
+++ b/examples/9.src
@@ -1,4 +1,4 @@
-extern printf = (*i64, i64) => i64;
+extern printf = (*i64, varargs) => i64;
 
 let print_boolean = (b: bool) => i64 {
 	printf("%d", b);
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| {