aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-03-24 23:12:54 +0000
committergingerBill <bill@gingerbill.org>2021-03-24 23:12:54 +0000
commit7c951cbf0a769c39d0f96ee7b627d7cf1fd83d49 (patch)
treeb3817f9f47df0fe5691a56188cde723dd0f8d295 /src/llvm_backend.cpp
parent2d0e2625aca7cd42030693f797ed56228ad31b4c (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.cpp83
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: