authorgravatar for sahnvour@pm.meSahnvour <sahnvour@pm.me> 2019-03-19 22:08:19+01:00
committergravatar for sahnvour@pm.meSahnvour <sahnvour@pm.me> 2019-03-19 22:08:19+01:00
logc17b1635ca40488a0b0a804126d0bdd2212bdf6b
tree6bac60e02009effc95de74c9dcbfdd635f5b98e4
parentae9b90cf6ea1d3f214a9058be8e147911b745f00

c_abi: when compiling for x86_64, differenciate between system V and windows ABI


1 files changed, 34 insertions(+), 4 deletions(-)

src/analyze.cpp+34-4
......@@ -6699,10 +6699,28 @@ Error file_fetch(CodeGen *g, Buf *resolved_path, Buf *contents) {
66996699 }
67006700}
67016701
6702X64CABIClass type_c_abi_x86_64_class(CodeGen *g, ZigType *ty) {
6703 size_t ty_size = type_size(g, ty);
6704 if (get_codegen_ptr_type(ty) != nullptr)
6705 return X64CABIClass_INTEGER;
6702static X64CABIClass type_windows_abi_x86_64_class(CodeGen *g, ZigType *ty, size_t ty_size) {
6703 // https://docs.microsoft.com/en-gb/cpp/build/x64-calling-convention?view=vs-2017
6704 switch (ty->id) {
6705 case ZigTypeIdEnum:
6706 case ZigTypeIdInt:
6707 case ZigTypeIdBool:
6708 return X64CABIClass_INTEGER;
6709 case ZigTypeIdFloat:
6710 case ZigTypeIdVector:
6711 return X64CABIClass_SSE;
6712 case ZigTypeIdStruct:
6713 case ZigTypeIdUnion: {
6714 if (ty_size <= 8)
6715 return X64CABIClass_INTEGER;
6716 return X64CABIClass_MEMORY;
6717 }
6718 default:
6719 return X64CABIClass_Unknown;
6720 }
6721}
6722
6723static X64CABIClass type_system_V_abi_x86_64_class(CodeGen *g, ZigType *ty, size_t ty_size) {
67066724 switch (ty->id) {
67076725 case ZigTypeIdEnum:
67086726 case ZigTypeIdInt:
......@@ -6770,6 +6788,18 @@ X64CABIClass type_c_abi_x86_64_class(CodeGen *g, ZigType *ty) {
67706788 }
67716789}
67726790
6791X64CABIClass type_c_abi_x86_64_class(CodeGen *g, ZigType *ty) {
6792 const size_t ty_size = type_size(g, ty);
6793 if (get_codegen_ptr_type(ty) != nullptr)
6794 return X64CABIClass_INTEGER;
6795
6796 if (g->zig_target->os == OsWindows || g->zig_target->os == OsUefi) {
6797 return type_windows_abi_x86_64_class(g, ty, ty_size);
6798 } else {
6799 return type_system_V_abi_x86_64_class(g, ty, ty_size);
6800 }
6801}
6802
67736803// NOTE this does not depend on x86_64
67746804bool type_is_c_abi_int(CodeGen *g, ZigType *ty) {
67756805 return (ty->id == ZigTypeIdInt ||