| ... | ... | @@ -316,7 +316,7 @@ pub fn generate( |
| 316 | 316 | defer function.mir_extra.deinit(bin_file.allocator); |
| 317 | 317 | defer if (builtin.mode == .Debug) function.mir_to_air_map.deinit(); |
| 318 | 318 | |
| 319 | | var call_info = function.resolveCallingConventionValues(fn_type) catch |err| switch (err) { |
| 319 | var call_info = function.resolveCallingConventionValues(fn_type, &.{}) catch |err| switch (err) { |
| 320 | 320 | error.CodegenFail => return Result{ .fail = function.err_msg.? }, |
| 321 | 321 | error.OutOfRegisters => return Result{ |
| 322 | 322 | .fail = try ErrorMsg.create( |
| ... | ... | @@ -5191,7 +5191,7 @@ fn airCall(self: *Self, inst: Air.Inst.Index, modifier: std.builtin.CallModifier |
| 5191 | 5191 | else => unreachable, |
| 5192 | 5192 | }; |
| 5193 | 5193 | |
| 5194 | | var info = try self.resolveCallingConventionValues(fn_ty); |
| 5194 | var info = try self.resolveCallingConventionValues(fn_ty, args[fn_ty.fnParamLen()..]); |
| 5195 | 5195 | defer info.deinit(self); |
| 5196 | 5196 | |
| 5197 | 5197 | try self.spillEflagsIfOccupied(); |
| ... | ... | @@ -8089,11 +8089,18 @@ const CallMCValues = struct { |
| 8089 | 8089 | }; |
| 8090 | 8090 | |
| 8091 | 8091 | /// Caller must call `CallMCValues.deinit`. |
| 8092 | | fn resolveCallingConventionValues(self: *Self, fn_ty: Type) !CallMCValues { |
| 8092 | fn resolveCallingConventionValues( |
| 8093 | self: *Self, |
| 8094 | fn_ty: Type, |
| 8095 | var_args: []const Air.Inst.Ref, |
| 8096 | ) !CallMCValues { |
| 8093 | 8097 | const cc = fn_ty.fnCallingConvention(); |
| 8094 | | const param_types = try self.gpa.alloc(Type, fn_ty.fnParamLen()); |
| 8098 | const param_len = fn_ty.fnParamLen(); |
| 8099 | const param_types = try self.gpa.alloc(Type, param_len + var_args.len); |
| 8095 | 8100 | defer self.gpa.free(param_types); |
| 8096 | 8101 | fn_ty.fnParamTypes(param_types); |
| 8102 | // TODO: promote var arg types |
| 8103 | for (param_types[param_len..], var_args) |*param_ty, arg| param_ty.* = self.air.typeOf(arg); |
| 8097 | 8104 | var result: CallMCValues = .{ |
| 8098 | 8105 | .args = try self.gpa.alloc(MCValue, param_types.len), |
| 8099 | 8106 | // These undefined values must be populated before returning from this function. |