Browse Source

Add SOA struct len/cap/allocator fields for the debug symbols

gingerBill 4 years ago
parent
commit
7c951cbf0a
1 changed files with 64 additions and 19 deletions
  1. 64 19
      src/llvm_backend.cpp

+ 64 - 19
src/llvm_backend.cpp

@@ -2063,26 +2063,71 @@ void lb_debug_complete_types(lbModule *m) {
 				}
 
 				type_set_offsets(bt);
+				{
+					isize element_offset = 0;
+					record_scope = lb_get_llvm_metadata(m, bt->Struct.scope);
+					switch (bt->Struct.soa_kind) {
+					case StructSoa_Slice:   element_offset = 1; break;
+					case StructSoa_Dynamic: element_offset = 3; break;
+					}
+					element_count = cast(unsigned)(bt->Struct.fields.count + element_offset);
+					elements = gb_alloc_array(temporary_allocator(), LLVMMetadataRef, element_count);
+					switch (bt->Struct.soa_kind) {
+					case StructSoa_Slice:
+						elements[0] = LLVMDIBuilderCreateMemberType(
+							m->debug_builder, record_scope,
+							".len", 4,
+							file, 0,
+							8*cast(u64)type_size_of(t_int), 8*cast(u32)type_align_of(t_int),
+							8*type_size_of(bt)-word_bits,
+							LLVMDIFlagZero, lb_debug_type(m, t_int)
+						);
+						break;
+					case StructSoa_Dynamic:
+						elements[0] = LLVMDIBuilderCreateMemberType(
+							m->debug_builder, record_scope,
+							".len", 4,
+							file, 0,
+							8*cast(u64)type_size_of(t_int), 8*cast(u32)type_align_of(t_int),
+							8*type_size_of(bt)-word_bits + 0*word_bits,
+							LLVMDIFlagZero, lb_debug_type(m, t_int)
+						);
+						elements[1] = LLVMDIBuilderCreateMemberType(
+							m->debug_builder, record_scope,
+							".cap", 4,
+							file, 0,
+							8*cast(u64)type_size_of(t_int), 8*cast(u32)type_align_of(t_int),
+							8*type_size_of(bt)-word_bits + 1*word_bits,
+							LLVMDIFlagZero, lb_debug_type(m, t_int)
+						);
+						elements[3] = LLVMDIBuilderCreateMemberType(
+							m->debug_builder, record_scope,
+							".allocator", 12,
+							file, 0,
+							8*cast(u64)type_size_of(t_int), 8*cast(u32)type_align_of(t_int),
+							8*type_size_of(bt)-word_bits + 2*word_bits,
+							LLVMDIFlagZero, lb_debug_type(m, t_allocator)
+						);
+						break;
+					}
 
-				record_scope = lb_get_llvm_metadata(m, bt->Struct.scope);
-				element_count = cast(unsigned)bt->Struct.fields.count;
-				elements = gb_alloc_array(temporary_allocator(), LLVMMetadataRef, element_count);
-				for_array(j, bt->Struct.fields) {
-					Entity *f = bt->Struct.fields[j];
-					String fname = f->token.string;
-
-					unsigned field_line = 0;
-					LLVMDIFlags field_flags = LLVMDIFlagZero;
-					u64 offset_in_bits = 8*cast(u64)bt->Struct.offsets[j];
-
-					elements[j] = LLVMDIBuilderCreateMemberType(
-						m->debug_builder, record_scope,
-						cast(char const *)fname.text, cast(size_t)fname.len,
-						file, field_line,
-						8*cast(u64)type_size_of(f->type), 8*cast(u32)type_align_of(f->type),
-						offset_in_bits,
-						field_flags, lb_debug_type(m, f->type)
-					);
+					for_array(j, bt->Struct.fields) {
+						Entity *f = bt->Struct.fields[j];
+						String fname = f->token.string;
+
+						unsigned field_line = 0;
+						LLVMDIFlags field_flags = LLVMDIFlagZero;
+						u64 offset_in_bits = 8*cast(u64)bt->Struct.offsets[j];
+
+						elements[element_offset+j] = LLVMDIBuilderCreateMemberType(
+							m->debug_builder, record_scope,
+							cast(char const *)fname.text, cast(size_t)fname.len,
+							file, field_line,
+							8*cast(u64)type_size_of(f->type), 8*cast(u32)type_align_of(f->type),
+							offset_in_bits,
+							field_flags, lb_debug_type(m, f->type)
+						);
+					}
 				}
 				break;
 			case Type_Union: