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) {...@@ -6699,10 +6699,28 @@ Error file_fetch(CodeGen *g, Buf *resolved_path, Buf *contents) {
6699 }6699 }
6700}6700}
67016701
6702X64CABIClass type_c_abi_x86_64_class(CodeGen *g, ZigType *ty) {6702static X64CABIClass type_windows_abi_x86_64_class(CodeGen *g, ZigType *ty, size_t ty_size) {
6703 size_t ty_size = type_size(g, ty);6703 // https://docs.microsoft.com/en-gb/cpp/build/x64-calling-convention?view=vs-2017
6704 if (get_codegen_ptr_type(ty) != nullptr)6704 switch (ty->id) {
6705 return X64CABIClass_INTEGER;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) {
6706 switch (ty->id) {6724 switch (ty->id) {
6707 case ZigTypeIdEnum:6725 case ZigTypeIdEnum:
6708 case ZigTypeIdInt:6726 case ZigTypeIdInt:
...@@ -6770,6 +6788,18 @@ X64CABIClass type_c_abi_x86_64_class(CodeGen *g, ZigType *ty) {...@@ -6770,6 +6788,18 @@ X64CABIClass type_c_abi_x86_64_class(CodeGen *g, ZigType *ty) {
6770 }6788 }
6771}6789}
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
6773// NOTE this does not depend on x86_646803// NOTE this does not depend on x86_64
6774bool type_is_c_abi_int(CodeGen *g, ZigType *ty) {6804bool type_is_c_abi_int(CodeGen *g, ZigType *ty) {
6775 return (ty->id == ZigTypeIdInt ||6805 return (ty->id == ZigTypeIdInt ||