commit ccefa9dbf5369e0fadc75b9e705e74ec96a02859 (tree)
parent ac68d72d244fafb601725d22631f7834fb14212c
Author: Jacob Young <jacobly0@users.noreply.github.com>
Date: Fri, 31 Mar 2023 23:47:17 -0400
x86_64: implement calling var args functions
Diffstat:
1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig
@@ -316,7 +316,7 @@ pub fn generate(
defer function.mir_extra.deinit(bin_file.allocator);
defer if (builtin.mode == .Debug) function.mir_to_air_map.deinit();
- var call_info = function.resolveCallingConventionValues(fn_type) catch |err| switch (err) {
+ var call_info = function.resolveCallingConventionValues(fn_type, &.{}) catch |err| switch (err) {
error.CodegenFail => return Result{ .fail = function.err_msg.? },
error.OutOfRegisters => return Result{
.fail = try ErrorMsg.create(
@@ -5191,7 +5191,7 @@ fn airCall(self: *Self, inst: Air.Inst.Index, modifier: std.builtin.CallModifier
else => unreachable,
};
- var info = try self.resolveCallingConventionValues(fn_ty);
+ var info = try self.resolveCallingConventionValues(fn_ty, args[fn_ty.fnParamLen()..]);
defer info.deinit(self);
try self.spillEflagsIfOccupied();
@@ -8089,11 +8089,18 @@ const CallMCValues = struct {
};
/// Caller must call `CallMCValues.deinit`.
-fn resolveCallingConventionValues(self: *Self, fn_ty: Type) !CallMCValues {
+fn resolveCallingConventionValues(
+ self: *Self,
+ fn_ty: Type,
+ var_args: []const Air.Inst.Ref,
+) !CallMCValues {
const cc = fn_ty.fnCallingConvention();
- const param_types = try self.gpa.alloc(Type, fn_ty.fnParamLen());
+ const param_len = fn_ty.fnParamLen();
+ const param_types = try self.gpa.alloc(Type, param_len + var_args.len);
defer self.gpa.free(param_types);
fn_ty.fnParamTypes(param_types);
+ // TODO: promote var arg types
+ for (param_types[param_len..], var_args) |*param_ty, arg| param_ty.* = self.air.typeOf(arg);
var result: CallMCValues = .{
.args = try self.gpa.alloc(MCValue, param_types.len),
// These undefined values must be populated before returning from this function.