authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-02-08 21:11:53-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-02-08 21:11:53-07:00
loga67893b0e124b95f5e1fade0245fef7ebb28b190
tree434df2c1fe3c181ceb8114f6c8a46910768d1f4f
parente06ac9537e94cf4863de7ca64112d7a63af60008

stage1: fix x86_64-windows C ABI classification logic

16 bytes vectors are special cased because compiler-rt currently relies on this.

1 files changed, 50 insertions(+), 14 deletions(-)

src/stage1/analyze.cpp+50-14
...@@ -8279,23 +8279,53 @@ Error file_fetch(CodeGen *g, Buf *resolved_path, Buf *contents_buf) {...@@ -8279,23 +8279,53 @@ Error file_fetch(CodeGen *g, Buf *resolved_path, Buf *contents_buf) {
82798279
8280static X64CABIClass type_windows_abi_x86_64_class(CodeGen *g, ZigType *ty, size_t ty_size) {8280static X64CABIClass type_windows_abi_x86_64_class(CodeGen *g, ZigType *ty, size_t ty_size) {
8281 // https://docs.microsoft.com/en-gb/cpp/build/x64-calling-convention?view=vs-20178281 // https://docs.microsoft.com/en-gb/cpp/build/x64-calling-convention?view=vs-2017
8282 switch (ty_size) {
8283 case 1:
8284 case 2:
8285 case 4:
8286 case 8:
8287 break;
8288 case 16:
8289 return (ty->id == ZigTypeIdVector) ? X64CABIClass_SSE : X64CABIClass_MEMORY;
8290 default:
8291 return X64CABIClass_MEMORY;
8292 }
8282 switch (ty->id) {8293 switch (ty->id) {
8283 case ZigTypeIdEnum:8294 case ZigTypeIdInvalid:
8295 case ZigTypeIdMetaType:
8296 case ZigTypeIdComptimeFloat:
8297 case ZigTypeIdComptimeInt:
8298 case ZigTypeIdNull:
8299 case ZigTypeIdUndefined:
8300 case ZigTypeIdBoundFn:
8301 case ZigTypeIdOpaque:
8302 case ZigTypeIdEnumLiteral:
8303 zig_unreachable();
8304
8305 case ZigTypeIdFn:
8306 case ZigTypeIdPointer:
8284 case ZigTypeIdInt:8307 case ZigTypeIdInt:
8285 case ZigTypeIdBool:8308 case ZigTypeIdBool:
8309 case ZigTypeIdEnum:
8310 case ZigTypeIdVoid:
8311 case ZigTypeIdUnreachable:
8312 case ZigTypeIdErrorSet:
8313 case ZigTypeIdErrorUnion:
8314 case ZigTypeIdStruct:
8315 case ZigTypeIdUnion:
8316 case ZigTypeIdOptional:
8317 case ZigTypeIdFnFrame:
8318 case ZigTypeIdAnyFrame:
8286 return X64CABIClass_INTEGER;8319 return X64CABIClass_INTEGER;
8320
8287 case ZigTypeIdFloat:8321 case ZigTypeIdFloat:
8288 case ZigTypeIdVector:8322 case ZigTypeIdVector:
8289 return X64CABIClass_SSE;8323 return X64CABIClass_SSE;
8290 case ZigTypeIdStruct:8324
8291 case ZigTypeIdUnion: {8325 case ZigTypeIdArray:
8292 if (ty_size <= 8)
8293 return X64CABIClass_INTEGER;
8294 return X64CABIClass_MEMORY;
8295 }
8296 default:
8297 return X64CABIClass_Unknown;8326 return X64CABIClass_Unknown;
8298 }8327 }
8328 zig_unreachable();
8299}8329}
83008330
8301static X64CABIClass type_system_V_abi_x86_64_class(CodeGen *g, ZigType *ty, size_t ty_size) {8331static X64CABIClass type_system_V_abi_x86_64_class(CodeGen *g, ZigType *ty, size_t ty_size) {
...@@ -8374,17 +8404,19 @@ static X64CABIClass type_system_V_abi_x86_64_class(CodeGen *g, ZigType *ty, size...@@ -8374,17 +8404,19 @@ static X64CABIClass type_system_V_abi_x86_64_class(CodeGen *g, ZigType *ty, size
83748404
8375X64CABIClass type_c_abi_x86_64_class(CodeGen *g, ZigType *ty) {8405X64CABIClass type_c_abi_x86_64_class(CodeGen *g, ZigType *ty) {
8376 Error err;8406 Error err;
8377
8378 const size_t ty_size = type_size(g, ty);8407 const size_t ty_size = type_size(g, ty);
8408
8409 if (g->zig_target->os == OsWindows || g->zig_target->os == OsUefi) {
8410 return type_windows_abi_x86_64_class(g, ty, ty_size);
8411 }
8412
8379 ZigType *ptr_type;8413 ZigType *ptr_type;
8380 if ((err = get_codegen_ptr_type(g, ty, &ptr_type))) return X64CABIClass_Unknown;8414 if ((err = get_codegen_ptr_type(g, ty, &ptr_type))) return X64CABIClass_Unknown;
8381 if (ptr_type != nullptr)8415 if (ptr_type != nullptr)
8382 return X64CABIClass_INTEGER;8416 return X64CABIClass_INTEGER;
83838417
8384 if (g->zig_target->os == OsWindows || g->zig_target->os == OsUefi) {8418 if (g->zig_target->arch == ZigLLVM_aarch64 ||
8385 return type_windows_abi_x86_64_class(g, ty, ty_size);8419 g->zig_target->arch == ZigLLVM_aarch64_be)
8386 } else if (g->zig_target->arch == ZigLLVM_aarch64 ||
8387 g->zig_target->arch == ZigLLVM_aarch64_be)
8388 {8420 {
8389 X64CABIClass result = type_system_V_abi_x86_64_class(g, ty, ty_size);8421 X64CABIClass result = type_system_V_abi_x86_64_class(g, ty, ty_size);
8390 return (result == X64CABIClass_MEMORY) ? X64CABIClass_MEMORY_nobyval : result;8422 return (result == X64CABIClass_MEMORY) ? X64CABIClass_MEMORY_nobyval : result;
...@@ -8989,8 +9021,12 @@ static void resolve_llvm_types_struct(CodeGen *g, ZigType *struct_type, ResolveS...@@ -8989,8 +9021,12 @@ static void resolve_llvm_types_struct(CodeGen *g, ZigType *struct_type, ResolveS
8989 struct_type->data.structure.llvm_full_type_queue_index = SIZE_MAX;9021 struct_type->data.structure.llvm_full_type_queue_index = SIZE_MAX;
8990 }9022 }
89919023
8992 if (struct_type->abi_size <= 16 && (struct_type->data.structure.layout == ContainerLayoutExtern || struct_type->data.structure.layout == ContainerLayoutPacked))9024 if (struct_type->abi_size <= 16 &&
9025 (struct_type->data.structure.layout == ContainerLayoutExtern ||
9026 struct_type->data.structure.layout == ContainerLayoutPacked))
9027 {
8993 resolve_llvm_c_abi_type(g, struct_type);9028 resolve_llvm_c_abi_type(g, struct_type);
9029 }
8994}9030}
89959031
8996// This is to be used instead of void for debug info types, to avoid tripping9032// This is to be used instead of void for debug info types, to avoid tripping