zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 8d8a5f973314cb692d543773db8d59a9001b91ad (tree)
parent 3b19869853282546fe290a63fc447ae88e713031
Author: Andrew Kelley <andrew@ziglang.org>
Date:   Mon, 27 Jun 2022 16:02:41 -0700

LLVM: support calls to varargs functions

closes #11944

Diffstat:
Msrc/codegen/llvm.zig | 22+++++++++++++++++++---
1 file changed, 19 insertions(+), 3 deletions(-)

diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig @@ -4197,7 +4197,7 @@ pub const FuncGen = struct { } var it = iterateParamTypes(self.dg, fn_info); - while (it.next()) |lowering| switch (lowering) { + while (it.nextCall(self, args)) |lowering| switch (lowering) { .no_bits => continue, .byval => { const arg = args[it.zig_index - 1]; @@ -9004,10 +9004,26 @@ const ParamTypeIterator = struct { slice, }; - fn next(it: *ParamTypeIterator) ?Lowering { + pub fn next(it: *ParamTypeIterator) ?Lowering { if (it.zig_index >= it.fn_info.param_types.len) return null; - const ty = it.fn_info.param_types[it.zig_index]; + return nextInner(it, ty); + } + + /// `airCall` uses this instead of `next` so that it can take into account variadic functions. + pub fn nextCall(it: *ParamTypeIterator, fg: *FuncGen, args: []const Air.Inst.Ref) ?Lowering { + if (it.zig_index >= it.fn_info.param_types.len) { + if (it.zig_index >= args.len) { + return null; + } else { + return nextInner(it, fg.air.typeOf(args[it.zig_index])); + } + } else { + return nextInner(it, it.fn_info.param_types[it.zig_index]); + } + } + + fn nextInner(it: *ParamTypeIterator, ty: Type) ?Lowering { if (!ty.hasRuntimeBitsIgnoreComptime()) { it.zig_index += 1; return .no_bits;