diff options
| -rw-r--r-- | examples/0.src | 4 | ||||
| -rw-r--r-- | examples/1.src | 2 | ||||
| -rw-r--r-- | examples/10.src | 2 | ||||
| -rw-r--r-- | examples/11.src | 2 | ||||
| -rw-r--r-- | examples/12.src | 2 | ||||
| -rw-r--r-- | examples/13.src | 2 | ||||
| -rw-r--r-- | examples/16.src | 2 | ||||
| -rw-r--r-- | examples/4.src | 2 | ||||
| -rw-r--r-- | examples/5.src | 2 | ||||
| -rw-r--r-- | examples/6.5.src | 2 | ||||
| -rw-r--r-- | examples/6.src | 2 | ||||
| -rw-r--r-- | examples/7.src | 2 | ||||
| -rw-r--r-- | examples/8.src | 2 | ||||
| -rw-r--r-- | examples/9.src | 2 | ||||
| -rw-r--r-- | src/codegen.zig | 7 |
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| { |