aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend_debug.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2024-02-22 15:55:20 +0000
committergingerBill <bill@gingerbill.org>2024-02-22 15:55:54 +0000
commita4b8c1ea1779ce93349b203aaf56c5aeca316b61 (patch)
tree3252615386a0d4840f87210286dca6a484176d3b /src/llvm_backend_debug.cpp
parentb12ba1508eb5d7f53f0952e0267eb7b5b3dce463 (diff)
Begin work adding `bit_field`
Diffstat (limited to 'src/llvm_backend_debug.cpp')
-rw-r--r--src/llvm_backend_debug.cpp36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/llvm_backend_debug.cpp b/src/llvm_backend_debug.cpp
index f45cf0cbc..7d3692a53 100644
--- a/src/llvm_backend_debug.cpp
+++ b/src/llvm_backend_debug.cpp
@@ -461,6 +461,42 @@ gb_internal LLVMMetadataRef lb_debug_type_internal(lbModule *m, Type *type) {
lb_debug_type(m, type->Matrix.elem),
subscripts, gb_count_of(subscripts));
}
+
+ case Type_BitField: {
+ LLVMMetadataRef parent_scope = nullptr;
+ LLVMMetadataRef scope = nullptr;
+ LLVMMetadataRef file = nullptr;
+ unsigned line = 0;
+ u64 size_in_bits = 8*cast(u64)type_size_of(type);
+ u32 align_in_bits = 8*cast(u32)type_align_of(type);
+ LLVMDIFlags flags = LLVMDIFlagZero;
+
+ unsigned element_count = cast(unsigned)type->BitField.fields.count;
+ LLVMMetadataRef *elements = gb_alloc_array(permanent_allocator(), LLVMMetadataRef, element_count);
+
+ u64 offset_in_bits = 0;
+ for (unsigned i = 0; i < element_count; i++) {
+ Entity *f = type->BitField.fields[i];
+ u8 bit_size = type->BitField.bit_sizes[i];
+ GB_ASSERT(f->kind == Entity_Variable);
+ String name = f->token.string;
+ unsigned field_line = 0;
+ LLVMDIFlags field_flags = LLVMDIFlagZero;
+ elements[i] = LLVMDIBuilderCreateBitFieldMemberType(m->debug_builder, scope, cast(char const *)name.text, name.len, file, field_line,
+ bit_size, offset_in_bits, offset_in_bits,
+ field_flags, lb_debug_type(m, f->type)
+ );
+
+ offset_in_bits += bit_size;
+ }
+
+
+ return LLVMDIBuilderCreateStructType(m->debug_builder, parent_scope, "", 0, file, line,
+ size_in_bits, align_in_bits, flags,
+ nullptr, elements, element_count, 0, nullptr,
+ "", 0
+ );
+ }
}
GB_PANIC("Invalid type %s", type_to_string(type));