From ea3f5905f0635d0c0cb3983ba5ca6c92859e9d81 Mon Sep 17 00:00:00 2001 From: Hannes Bredberg Date: Fri, 6 May 2022 21:32:22 +0200 Subject: [PATCH] Add Win64 calling convention Closes ziglang/zig#11585 --- lib/std/builtin.zig | 1 + src/codegen/llvm.zig | 1 + src/stage1/all_types.hpp | 1 + src/stage1/analyze.cpp | 4 ++++ src/stage1/codegen.cpp | 5 +++++ src/stage1/ir.cpp | 1 + 6 files changed, 13 insertions(+) diff --git a/lib/std/builtin.zig b/lib/std/builtin.zig index f38fc4e155..8c1e38ea09 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 800786891e..57bcbe9338 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 fbf0793d68..ba5df49c59 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 34dff556e0..8faf3c0fc9 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 03bd22b42d..d101030c33 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 f7ab5e12fa..2f4e0aa0e7 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;