authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-06-27 16:02:41-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-06-27 16:02:41-07:00
log8d8a5f973314cb692d543773db8d59a9001b91ad
treef430d0af10b42bb559abcaa47a0ad81846923a27
parent3b19869853282546fe290a63fc447ae88e713031

LLVM: support calls to varargs functions

closes #11944

1 files changed, 19 insertions(+), 3 deletions(-)

src/codegen/llvm.zig+19-3
...@@ -4197,7 +4197,7 @@ pub const FuncGen = struct {...@@ -4197,7 +4197,7 @@ pub const FuncGen = struct {
4197 }4197 }
41984198
4199 var it = iterateParamTypes(self.dg, fn_info);4199 var it = iterateParamTypes(self.dg, fn_info);
4200 while (it.next()) |lowering| switch (lowering) {4200 while (it.nextCall(self, args)) |lowering| switch (lowering) {
4201 .no_bits => continue,4201 .no_bits => continue,
4202 .byval => {4202 .byval => {
4203 const arg = args[it.zig_index - 1];4203 const arg = args[it.zig_index - 1];
...@@ -9004,10 +9004,26 @@ const ParamTypeIterator = struct {...@@ -9004,10 +9004,26 @@ const ParamTypeIterator = struct {
9004 slice,9004 slice,
9005 };9005 };
90069006
9007 fn next(it: *ParamTypeIterator) ?Lowering {9007 pub fn next(it: *ParamTypeIterator) ?Lowering {
9008 if (it.zig_index >= it.fn_info.param_types.len) return null;9008 if (it.zig_index >= it.fn_info.param_types.len) return null;
9009
9010 const ty = it.fn_info.param_types[it.zig_index];9009 const ty = it.fn_info.param_types[it.zig_index];
9010 return nextInner(it, ty);
9011 }
9012
9013 /// `airCall` uses this instead of `next` so that it can take into account variadic functions.
9014 pub fn nextCall(it: *ParamTypeIterator, fg: *FuncGen, args: []const Air.Inst.Ref) ?Lowering {
9015 if (it.zig_index >= it.fn_info.param_types.len) {
9016 if (it.zig_index >= args.len) {
9017 return null;
9018 } else {
9019 return nextInner(it, fg.air.typeOf(args[it.zig_index]));
9020 }
9021 } else {
9022 return nextInner(it, it.fn_info.param_types[it.zig_index]);
9023 }
9024 }
9025
9026 fn nextInner(it: *ParamTypeIterator, ty: Type) ?Lowering {
9011 if (!ty.hasRuntimeBitsIgnoreComptime()) {9027 if (!ty.hasRuntimeBitsIgnoreComptime()) {
9012 it.zig_index += 1;9028 it.zig_index += 1;
9013 return .no_bits;9029 return .no_bits;