diff --git a/lib/std/Target.zig b/lib/std/Target.zig index 20d37b893943aa313d4addea7065fec1ba01cf3f..b99e2b366ed7aab50451f750c8d449d7394f3731 100644 --- a/lib/std/Target.zig +++ b/lib/std/Target.zig @@ -1787,6 +1787,7 @@ pub const Cpu = struct { => unreachable, .x86_64_sysv, + .x86_64_x32, .x86_64_win, .x86_64_regcall_v3_sysv, .x86_64_regcall_v4_win, @@ -3632,7 +3633,10 @@ pub fn cCallingConvention(target: *const Target) ?std.builtin.CallingConvention return switch (target.cpu.arch) { .x86_64 => switch (target.os.tag) { .windows, .uefi => .{ .x86_64_win = .{} }, - else => .{ .x86_64_sysv = .{} }, + else => switch (target.abi) { + .gnuabin32, .muslabin32 => .{ .x86_64_x32 = .{} }, + else => .{ .x86_64_sysv = .{} }, + }, }, .x86 => switch (target.os.tag) { .windows, .uefi => .{ .x86_win = .{} }, diff --git a/lib/std/builtin.zig b/lib/std/builtin.zig index ed4a39b8bb59737b80271da4f9b73db60f65e3af..6feacbc8c89f0f7cff41739ba4f18451d582c00f 100644 --- a/lib/std/builtin.zig +++ b/lib/std/builtin.zig @@ -204,6 +204,7 @@ pub const CallingConvention = union(enum(u8)) { // Calling conventions for the `x86_64` architecture. x86_64_sysv: CommonOptions, + x86_64_x32: CommonOptions, x86_64_win: CommonOptions, x86_64_regcall_v3_sysv: CommonOptions, x86_64_regcall_v4_win: CommonOptions, diff --git a/src/Sema.zig b/src/Sema.zig index be4b777eebeb16b0acc82c8e395492af7aa8af0d..47b53392228816a78977f7fc62345c41b9316d32 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -9035,6 +9035,7 @@ pub fn handleExternLibName( /// functions or there are no more other calling conventions that support variadic functions. const calling_conventions_supporting_var_args = [_]std.builtin.CallingConvention.Tag{ .x86_64_sysv, + .x86_64_x32, .x86_64_win, .x86_sysv, .x86_win, diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 8c6f5f973f8fd012fbc431f61d77378ac33aff2c..3b3febf27e8f0b47906fb16f1280d6b99d8862db 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -11919,6 +11919,7 @@ fn toLlvmCallConvTag(cc_tag: std.builtin.CallingConvention.Tag, target: *const s .x86_sysv, .x86_win, .x86_thiscall_mingw, + .x86_64_x32, .aarch64_aapcs, .aarch64_aapcs_darwin, .aarch64_aapcs_win, diff --git a/test/cases/compile_errors/invalid_variadic_function.zig b/test/cases/compile_errors/invalid_variadic_function.zig index 08e1eb0148eae16e6bebacab859cc55f5d9f5f43..a5f2c2f89324a38609d0f39a0b85212bdf824ccc 100644 --- a/test/cases/compile_errors/invalid_variadic_function.zig +++ b/test/cases/compile_errors/invalid_variadic_function.zig @@ -12,6 +12,6 @@ comptime { // target=x86_64-linux // // :1:8: error: variadic function does not support 'auto' calling convention -// :1:8: note: supported calling conventions: 'x86_64_sysv', 'x86_64_win' +// :1:8: note: supported calling conventions: 'x86_64_sysv', 'x86_64_x32', 'x86_64_win' // :2:16: error: variadic function does not support 'inline' calling convention -// :2:16: note: supported calling conventions: 'x86_64_sysv', 'x86_64_win' +// :2:16: note: supported calling conventions: 'x86_64_sysv', 'x86_64_x32', 'x86_64_win' diff --git a/test/cases/compile_errors/reify_type.Fn_with_is_var_args_true_and_non-C_callconv.zig b/test/cases/compile_errors/reify_type.Fn_with_is_var_args_true_and_non-C_callconv.zig index e72dc41b6ea87368681a9dc424b3183122dcafa9..f74b89ae87194056e22b4c923be5d39273a4372f 100644 --- a/test/cases/compile_errors/reify_type.Fn_with_is_var_args_true_and_non-C_callconv.zig +++ b/test/cases/compile_errors/reify_type.Fn_with_is_var_args_true_and_non-C_callconv.zig @@ -15,4 +15,4 @@ comptime { // target=x86_64-linux // // :1:13: error: variadic function does not support 'auto' calling convention -// :1:13: note: supported calling conventions: 'x86_64_sysv', 'x86_64_win' +// :1:13: note: supported calling conventions: 'x86_64_sysv', 'x86_64_x32', 'x86_64_win'