From 0839dccfdc6d754cbce1041a03d16b588cfbef95 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 19 Nov 2019 23:24:49 +0000 Subject: [PATCH] Fix Compiler panic with SIMD Vector debug information #481 --- src/ir.cpp | 13 +++++++++++++ src/ir_print.cpp | 2 ++ src/types.cpp | 12 ++++++++---- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/ir.cpp b/src/ir.cpp index c28af446c..86e618187 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -2684,6 +2684,19 @@ irDebugInfo *ir_add_debug_info_type(irModule *module, Type *type, Entity *e, irD return ir_add_debug_info_type_bit_set(module, type, e, scope); } + if (is_type_simd_vector(type)) { + irDebugInfo *di = ir_alloc_debug_info(irDebugInfo_CompositeType); + di->CompositeType.size = ir_debug_size_bits(type); + di->CompositeType.align = ir_debug_align_bits(type); + di->CompositeType.tag = irDebugBasicEncoding_array_type; + di->CompositeType.array_count = (i32)type->SimdVector.count; + + map_set(&module->debug_info, hash_type(type), di); + di->CompositeType.base_type = ir_add_debug_info_type(module, type->SimdVector.elem, e, scope, file); + GB_ASSERT(base->kind != Type_Named); + return di; + } + GB_PANIC("Unreachable %s", type_to_string(type)); return nullptr; } diff --git a/src/ir_print.cpp b/src/ir_print.cpp index d47dfc898..b825d2322 100644 --- a/src/ir_print.cpp +++ b/src/ir_print.cpp @@ -1955,6 +1955,8 @@ void ir_print_instr(irFileBuffer *f, irModule *m, irValue *value) { irInstrCall *call = &instr->Call; Type *proc_type = base_type(ir_type(call->value)); GB_ASSERT(is_type_proc(proc_type)); + set_procedure_abi_types(heap_allocator(), proc_type); + bool is_c_vararg = proc_type->Proc.c_vararg; Type *result_type = call->type; if (result_type) { diff --git a/src/types.cpp b/src/types.cpp index ac78bb943..06aa211ab 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -3008,7 +3008,13 @@ gbString write_type_to_string(gbString str, Type *type) { break; case Type_Struct: { - str = gb_string_appendc(str, "struct"); + if (type->Struct.soa_elem != nullptr) { + str = gb_string_append_fmt(str, "#soa[%d]", cast(int)type->Struct.soa_count); + str = write_type_to_string(str, type->Struct.soa_elem); + break; + } + + str = gb_string_appendc(str, "struct"); if (type->Struct.is_packed) str = gb_string_appendc(str, " #packed"); if (type->Struct.is_raw_union) str = gb_string_appendc(str, " #raw_union"); str = gb_string_appendc(str, " {"); @@ -3179,10 +3185,8 @@ gbString write_type_to_string(gbString str, Type *type) { if (type->SimdVector.is_x86_mmx) { return "intrinsics.x86_mmx"; } else { - str = gb_string_appendc(str, "intrinsics.vector("); - str = gb_string_append_fmt(str, "%d, ", cast(int)type->SimdVector.count); + str = gb_string_append_fmt(str, "#vector[%d]", cast(int)type->SimdVector.count); str = write_type_to_string(str, type->SimdVector.elem); - str = gb_string_appendc(str, ")"); } break; }