mirror of
https://github.com/ziglang/zig.git
synced 2026-01-20 22:35:24 +00:00
x86_64: implement calling var args functions
This commit is contained in:
parent
ac68d72d24
commit
ccefa9dbf5
@ -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.
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user