From 51c705edf1f83b25c2997cc8a88107ed07756f92 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 23 Nov 2022 21:59:53 +0000 Subject: Add extra check to debug information of named composite types --- src/llvm_backend_debug.cpp | 41 ++++++++++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 7 deletions(-) (limited to 'src/llvm_backend_debug.cpp') diff --git a/src/llvm_backend_debug.cpp b/src/llvm_backend_debug.cpp index 60978d321..8da0697a7 100644 --- a/src/llvm_backend_debug.cpp +++ b/src/llvm_backend_debug.cpp @@ -569,14 +569,41 @@ LLVMMetadataRef lb_debug_type(lbModule *m, Type *type) { case Type_Struct: case Type_Union: case Type_BitSet: - LLVMMetadataRef temp_forward_decl = LLVMDIBuilderCreateReplaceableCompositeType( - m->debug_builder, tag, name_text, name_len, nullptr, nullptr, 0, 0, size_in_bits, align_in_bits, flags, "", 0 - ); - idt.metadata = temp_forward_decl; + { + LLVMMetadataRef temp_forward_decl = LLVMDIBuilderCreateReplaceableCompositeType( + m->debug_builder, tag, name_text, name_len, nullptr, nullptr, 0, 0, size_in_bits, align_in_bits, flags, "", 0 + ); + idt.metadata = temp_forward_decl; + + array_add(&m->debug_incomplete_types, idt); + lb_set_llvm_metadata(m, type, temp_forward_decl); + + LLVMMetadataRef dummy = nullptr; + switch (bt->kind) { + case Type_Slice: + dummy = lb_debug_type(m, bt->Slice.elem); + dummy = lb_debug_type(m, t_int); + break; + case Type_DynamicArray: + dummy = lb_debug_type(m, bt->DynamicArray.elem); + dummy = lb_debug_type(m, t_int); + dummy = lb_debug_type(m, t_allocator); + break; + case Type_Map: + dummy = lb_debug_type(m, bt->Map.key); + dummy = lb_debug_type(m, bt->Map.value); + dummy = lb_debug_type(m, t_int); + dummy = lb_debug_type(m, t_allocator); + dummy = lb_debug_type(m, t_uintptr); + break; + case Type_BitSet: + if (bt->BitSet.elem) dummy = lb_debug_type(m, bt->BitSet.elem); + if (bt->BitSet.underlying) dummy = lb_debug_type(m, bt->BitSet.underlying); + break; + } - array_add(&m->debug_incomplete_types, idt); - lb_set_llvm_metadata(m, type, temp_forward_decl); - return temp_forward_decl; + return temp_forward_decl; + } } } -- cgit v1.2.3 From 22bcf1ba70690c4ba446327a54b3ad562f2a747a Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 23 Nov 2022 22:31:21 +0000 Subject: Extra check for slices and dynamic arrays for `-debug` --- src/llvm_backend_debug.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/llvm_backend_debug.cpp') diff --git a/src/llvm_backend_debug.cpp b/src/llvm_backend_debug.cpp index 8da0697a7..768c4cd1e 100644 --- a/src/llvm_backend_debug.cpp +++ b/src/llvm_backend_debug.cpp @@ -582,10 +582,12 @@ LLVMMetadataRef lb_debug_type(lbModule *m, Type *type) { switch (bt->kind) { case Type_Slice: dummy = lb_debug_type(m, bt->Slice.elem); + dummy = lb_debug_type(m, alloc_type_pointer(bt->Slice.elem)); dummy = lb_debug_type(m, t_int); break; case Type_DynamicArray: dummy = lb_debug_type(m, bt->DynamicArray.elem); + dummy = lb_debug_type(m, alloc_type_pointer(bt->DynamicArray.elem)); dummy = lb_debug_type(m, t_int); dummy = lb_debug_type(m, t_allocator); break; -- cgit v1.2.3 From 5ac36b5f25435a495d8516d5c9df06c09d3ca20e Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 23 Nov 2022 22:46:02 +0000 Subject: HACK: Get around debugging type generation for slices and dynamic arrays of *nix systems --- src/llvm_backend_debug.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) (limited to 'src/llvm_backend_debug.cpp') diff --git a/src/llvm_backend_debug.cpp b/src/llvm_backend_debug.cpp index 768c4cd1e..65cefcd39 100644 --- a/src/llvm_backend_debug.cpp +++ b/src/llvm_backend_debug.cpp @@ -688,13 +688,25 @@ void lb_debug_complete_types(lbModule *m) { case Type_Slice: element_count = 2; elements = gb_alloc_array(temporary_allocator(), LLVMMetadataRef, element_count); - elements[0] = lb_debug_struct_field(m, str_lit("data"), alloc_type_pointer(bt->Slice.elem), 0*word_bits); + #if defined(GB_SYSTEM_WINDOWS) + elements[0] = lb_debug_struct_field(m, str_lit("data"), alloc_type_pointer(bt->Slice.elem), 0*word_bits); + #else + // FIX HACK TODO(bill): For some reason this causes a crash in *nix systems due to the reference counting + // of the debug type information + elements[0] = lb_debug_struct_field(m, str_lit("data"), t_rawptr, 0*word_bits); + #endif elements[1] = lb_debug_struct_field(m, str_lit("len"), t_int, 1*word_bits); break; case Type_DynamicArray: element_count = 4; elements = gb_alloc_array(temporary_allocator(), LLVMMetadataRef, element_count); - elements[0] = lb_debug_struct_field(m, str_lit("data"), alloc_type_pointer(bt->DynamicArray.elem), 0*word_bits); + #if defined(GB_SYSTEM_WINDOWS) + elements[0] = lb_debug_struct_field(m, str_lit("data"), alloc_type_pointer(bt->DynamicArray.elem), 0*word_bits); + #else + // FIX HACK TODO(bill): For some reason this causes a crash in *nix systems due to the reference counting + // of the debug type information + elements[0] = lb_debug_struct_field(m, str_lit("data"), t_rawptr, 0*word_bits); + #endif elements[1] = lb_debug_struct_field(m, str_lit("len"), t_int, 1*word_bits); elements[2] = lb_debug_struct_field(m, str_lit("cap"), t_int, 2*word_bits); elements[3] = lb_debug_struct_field(m, str_lit("allocator"), t_allocator, 3*word_bits); -- cgit v1.2.3