Commit ccefa9dbf5
Changed files (1)
src
arch
x86_64
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.