diff options
| author | gingerBill <bill@gingerbill.org> | 2021-03-24 23:12:54 +0000 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2021-03-24 23:12:54 +0000 |
| commit | 7c951cbf0a769c39d0f96ee7b627d7cf1fd83d49 (patch) | |
| tree | b3817f9f47df0fe5691a56188cde723dd0f8d295 /src/llvm_backend.cpp | |
| parent | 2d0e2625aca7cd42030693f797ed56228ad31b4c (diff) | |
Add SOA struct len/cap/allocator fields for the debug symbols
Diffstat (limited to 'src/llvm_backend.cpp')
| -rw-r--r-- | src/llvm_backend.cpp | 83 |
1 files changed, 64 insertions, 19 deletions
diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 95f512873..548b629d1 100644 --- a/src/llvm_backend.cpp +++ b/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: |