diff --git a/lib/std/builtin.zig b/lib/std/builtin.zig index f38fc4e1559defc4ac119c35b06552e5fc362665..8c1e38ea09a2021e7c613bb9a55310320008002d 100644 --- a/lib/std/builtin.zig +++ b/lib/std/builtin.zig @@ -147,6 +147,7 @@ pub const CallingConvention = enum { AAPCS, AAPCSVFP, SysV, + Win64, PtxKernel, }; diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 800786891e9fd7c0c4fae320ed139155ea1a552d..57bcbe93389507091d8126b0c4788bec1f14caa6 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -7940,6 +7940,7 @@ fn toLlvmCallConv(cc: std.builtin.CallingConvention, target: std.Target) llvm.Ca }, .Signal => .AVR_SIGNAL, .SysV => .X86_64_SysV, + .Win64 => .Win64, .PtxKernel => return switch (target.cpu.arch) { .nvptx, .nvptx64 => .PTX_Kernel, else => unreachable, diff --git a/src/stage1/all_types.hpp b/src/stage1/all_types.hpp index fbf0793d682118b6d1757489e92e19117e252b50..ba5df49c5930d695a0c694379b31daaec233efdc 100644 --- a/src/stage1/all_types.hpp +++ b/src/stage1/all_types.hpp @@ -84,6 +84,7 @@ enum CallingConvention { CallingConventionAAPCS, CallingConventionAAPCSVFP, CallingConventionSysV, + CallingConventionWin64, CallingConventionPtxKernel }; diff --git a/src/stage1/analyze.cpp b/src/stage1/analyze.cpp index 34dff556e0ee8931ecf4a9b7d0aa78ac0b8f8b2f..8faf3c0fc9d1dddc90b0d183897683d362a9d824 100644 --- a/src/stage1/analyze.cpp +++ b/src/stage1/analyze.cpp @@ -991,6 +991,7 @@ const char *calling_convention_name(CallingConvention cc) { case CallingConventionAAPCSVFP: return "AAPCSVFP"; case CallingConventionInline: return "Inline"; case CallingConventionSysV: return "SysV"; + case CallingConventionWin64: return "Win64"; case CallingConventionPtxKernel: return "PtxKernel"; } zig_unreachable(); @@ -1015,6 +1016,7 @@ bool calling_convention_allows_zig_types(CallingConvention cc) { case CallingConventionAAPCS: case CallingConventionAAPCSVFP: case CallingConventionSysV: + case CallingConventionWin64: return false; } zig_unreachable(); @@ -2006,6 +2008,7 @@ Error emit_error_unless_callconv_allowed_for_target(CodeGen *g, AstNode *source_ allowed_platforms = "ARM"; break; case CallingConventionSysV: + case CallingConventionWin64: if (g->zig_target->arch != ZigLLVM_x86_64) allowed_platforms = "x86_64"; break; @@ -3846,6 +3849,7 @@ static void resolve_decl_fn(CodeGen *g, TldFn *tld_fn) { case CallingConventionAAPCS: case CallingConventionAAPCSVFP: case CallingConventionSysV: + case CallingConventionWin64: case CallingConventionPtxKernel: add_fn_export(g, fn_table_entry, buf_ptr(&fn_table_entry->symbol_name), GlobalLinkageIdStrong, fn_cc); diff --git a/src/stage1/codegen.cpp b/src/stage1/codegen.cpp index 03bd22b42dd2226d1d97bd2e5b63489a42dedd83..d101030c33df8635831a80c387c64bc52b188868 100644 --- a/src/stage1/codegen.cpp +++ b/src/stage1/codegen.cpp @@ -209,6 +209,9 @@ static ZigLLVM_CallingConv get_llvm_cc(CodeGen *g, CallingConvention cc) { case CallingConventionSysV: assert(g->zig_target->arch == ZigLLVM_x86_64); return ZigLLVM_X86_64_SysV; + case CallingConventionWin64: + assert(g->zig_target->arch == ZigLLVM_x86_64); + return ZigLLVM_Win64; case CallingConventionPtxKernel: assert(g->zig_target->arch == ZigLLVM_nvptx || g->zig_target->arch == ZigLLVM_nvptx64); @@ -359,6 +362,7 @@ static bool cc_want_sret_attr(CallingConvention cc) { case CallingConventionAAPCS: case CallingConventionAAPCSVFP: case CallingConventionSysV: + case CallingConventionWin64: case CallingConventionPtxKernel: return true; case CallingConventionAsync: @@ -10033,6 +10037,7 @@ Buf *codegen_generate_builtin_source(CodeGen *g) { static_assert(CallingConventionAAPCS == 12, ""); static_assert(CallingConventionAAPCSVFP == 13, ""); static_assert(CallingConventionSysV == 14, ""); + static_assert(CallingConventionWin64 == 15, ""); static_assert(BuiltinPtrSizeOne == 0, ""); static_assert(BuiltinPtrSizeMany == 1, ""); diff --git a/src/stage1/ir.cpp b/src/stage1/ir.cpp index f7ab5e12fa6979f324b9ab5dd32e707a925d3986..2f4e0aa0e70d6b481edf692343d9c7011572a409 100644 --- a/src/stage1/ir.cpp +++ b/src/stage1/ir.cpp @@ -11743,6 +11743,7 @@ static Stage1AirInst *ir_analyze_instruction_export(IrAnalyze *ira, Stage1ZirIns case CallingConventionAAPCS: case CallingConventionAAPCSVFP: case CallingConventionSysV: + case CallingConventionWin64: case CallingConventionPtxKernel: add_fn_export(ira->codegen, fn_entry, buf_ptr(symbol_name), global_linkage_id, cc); fn_entry->section_name = section_name;