| ... | @@ -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) { |
| 8279 | | 8279 | |
| 8280 | static X64CABIClass type_windows_abi_x86_64_class(CodeGen *g, ZigType *ty, size_t ty_size) { | 8280 | static 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-2017 | 8281 | // 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 | } |
| 8300 | | 8330 | |
| 8301 | static X64CABIClass type_system_V_abi_x86_64_class(CodeGen *g, ZigType *ty, size_t ty_size) { | 8331 | static 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 |
| 8374 | | 8404 | |
| 8375 | X64CABIClass type_c_abi_x86_64_class(CodeGen *g, ZigType *ty) { | 8405 | X64CABIClass 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; |
| 8383 | | 8417 | |
| 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 | } |
| 8991 | | 9023 | |
| 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 | } |
| 8995 | | 9031 | |
| 8996 | // This is to be used instead of void for debug info types, to avoid tripping | 9032 | // This is to be used instead of void for debug info types, to avoid tripping |