From e2104ecc2d31b5e55305a4c6a358ab8690255d19 Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Mon, 21 Sep 2020 23:29:34 +0200 Subject: [PATCH] stage1: Fix type mapping for c_longdouble A quick and dirty job to let the compiler use the correct size and alignment. --- src/stage1/codegen.cpp | 52 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/src/stage1/codegen.cpp b/src/stage1/codegen.cpp index b2fc80adcb..6c51ab78d4 100644 --- a/src/stage1/codegen.cpp +++ b/src/stage1/codegen.cpp @@ -8587,7 +8587,57 @@ static void define_builtin_types(CodeGen *g) { add_fp_entry(g, "f32", 32, LLVMFloatType(), &g->builtin_types.entry_f32); add_fp_entry(g, "f64", 64, LLVMDoubleType(), &g->builtin_types.entry_f64); add_fp_entry(g, "f128", 128, LLVMFP128Type(), &g->builtin_types.entry_f128); - add_fp_entry(g, "c_longdouble", 80, LLVMX86FP80Type(), &g->builtin_types.entry_c_longdouble); + + switch (g->zig_target->arch) { + case ZigLLVM_x86: + case ZigLLVM_x86_64: + if (g->zig_target->abi != ZigLLVM_MSVC) + add_fp_entry(g, "c_longdouble", 80, LLVMX86FP80Type(), &g->builtin_types.entry_c_longdouble); + else + add_fp_entry(g, "c_longdouble", 64, LLVMDoubleType(), &g->builtin_types.entry_c_longdouble); + break; + case ZigLLVM_arm: + case ZigLLVM_armeb: + case ZigLLVM_thumb: + case ZigLLVM_thumbeb: + add_fp_entry(g, "c_longdouble", 64, LLVMDoubleType(), &g->builtin_types.entry_c_longdouble); + break; + case ZigLLVM_aarch64: + case ZigLLVM_aarch64_be: + if (g->zig_target->os == OsWindows || target_os_is_darwin(g->zig_target->os)) + add_fp_entry(g, "c_longdouble", 64, LLVMDoubleType(), &g->builtin_types.entry_c_longdouble); + else + add_fp_entry(g, "c_longdouble", 128, LLVMFP128Type(), &g->builtin_types.entry_c_longdouble); + break; + case ZigLLVM_riscv32: + case ZigLLVM_riscv64: + add_fp_entry(g, "c_longdouble", 128, LLVMFP128Type(), &g->builtin_types.entry_c_longdouble); + break; + case ZigLLVM_wasm32: + case ZigLLVM_wasm64: + add_fp_entry(g, "c_longdouble", 128, LLVMFP128Type(), &g->builtin_types.entry_c_longdouble); + break; + case ZigLLVM_mips: + case ZigLLVM_mipsel: + // Assume o32 ABI + add_fp_entry(g, "c_longdouble", 64, LLVMDoubleType(), &g->builtin_types.entry_c_longdouble); + break; + case ZigLLVM_mips64: + case ZigLLVM_mips64el: + add_fp_entry(g, "c_longdouble", 128, LLVMFP128Type(), &g->builtin_types.entry_c_longdouble); + break; + case ZigLLVM_ppc: + case ZigLLVM_ppc64: + case ZigLLVM_ppc64le: + add_fp_entry(g, "c_longdouble", 128, LLVMFP128Type(), &g->builtin_types.entry_c_longdouble); + break; + case ZigLLVM_avr: + // It's either a float or a double, depending on a toolchain switch + add_fp_entry(g, "c_longdouble", 64, LLVMDoubleType(), &g->builtin_types.entry_c_longdouble); + break; + default: + zig_panic("TODO implement mapping for c_longdouble"); + } { ZigType *entry = new_type_table_entry(ZigTypeIdVoid);