aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/llvm_backend.cpp')
-rw-r--r--src/llvm_backend.cpp186
1 files changed, 117 insertions, 69 deletions
diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp
index c703d7b16..acb60a88e 100644
--- a/src/llvm_backend.cpp
+++ b/src/llvm_backend.cpp
@@ -1682,7 +1682,7 @@ LLVMMetadataRef lb_debug_type_internal(lbModule *m, Type *type) {
case Basic_rawptr:
{
- LLVMMetadataRef void_type = LLVMDIBuilderCreateBasicType(m->debug_builder, "void", 4, 8, LLVMDWARFTypeEncoding_Unsigned, LLVMDIFlagZero);
+ LLVMMetadataRef void_type = lb_debug_type_basic_type(m, str_lit("void"), 8, LLVMDWARFTypeEncoding_Unsigned);
return LLVMDIBuilderCreatePointerType(m->debug_builder, void_type, word_bits, word_bits, LLVMDWARFTypeEncoding_Address, "rawptr", 6);
}
case Basic_string:
@@ -1694,7 +1694,7 @@ LLVMMetadataRef lb_debug_type_internal(lbModule *m, Type *type) {
}
case Basic_cstring:
{
- LLVMMetadataRef char_type = LLVMDIBuilderCreateBasicType(m->debug_builder, "char", 4, 8, 0, LLVMDIFlagZero);
+ LLVMMetadataRef char_type = lb_debug_type_basic_type(m, str_lit("char"), 8, LLVMDWARFTypeEncoding_Unsigned);
return LLVMDIBuilderCreatePointerType(m->debug_builder, char_type, word_bits, word_bits, 0, "cstring", 7);
}
case Basic_any:
@@ -1739,12 +1739,11 @@ LLVMMetadataRef lb_debug_type_internal(lbModule *m, Type *type) {
case Type_Struct:
- type_set_offsets(type);
- /*fallthrough*/
case Type_Union:
case Type_Slice:
case Type_DynamicArray:
case Type_Map:
+ case Type_BitSet:
{
unsigned tag = DW_TAG_structure_type;
if (is_type_raw_union(type) || is_type_union(type)) {
@@ -1832,12 +1831,6 @@ LLVMMetadataRef lb_debug_type_internal(lbModule *m, Type *type) {
}
break;
- case Type_BitSet: {
- LLVMMetadataRef int_type = lb_debug_type(m, bit_set_to_int(type));
- gbString name = type_to_string(type, temporary_allocator());
- return LLVMDIBuilderCreateTypedef(m->debug_builder, int_type, name, gb_string_length(name), nullptr, 0, nullptr, cast(u32)(8*type_align_of(type)));
- }
-
case Type_SimdVector:
if (type->SimdVector.is_x86_mmx) {
return LLVMDIBuilderCreateVectorType(m->debug_builder, 2, 8*cast(unsigned)type_align_of(type), lb_debug_type(m, t_f64), nullptr, 0);
@@ -1933,7 +1926,6 @@ LLVMMetadataRef lb_debug_type(lbModule *m, Type *type) {
case Type_EnumeratedArray:
case Type_Tuple:
case Type_Proc:
- case Type_BitSet:
case Type_SimdVector:
case Type_RelativePointer:
case Type_RelativeSlice:
@@ -1949,6 +1941,7 @@ LLVMMetadataRef lb_debug_type(lbModule *m, Type *type) {
case Type_Map:
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
);
@@ -2004,7 +1997,8 @@ void lb_debug_complete_types(lbModule *m) {
case Type_DynamicArray:
case Type_Map:
case Type_Struct:
- case Type_Union: {
+ case Type_Union:
+ case Type_BitSet: {
bool is_union = is_type_raw_union(bt) || is_type_union(bt);
String name = str_lit("<anonymous-struct>");
@@ -2029,15 +2023,7 @@ void lb_debug_complete_types(lbModule *m) {
// TODO(bill): location data for Type_Named
} else {
- switch (bt->kind) {
- case Type_Slice:
- case Type_DynamicArray:
- case Type_Map:
- case Type_Struct:
- case Type_Union:
- name = make_string_c(type_to_string(t, temporary_allocator()));
- break;
- }
+ name = make_string_c(type_to_string(t, temporary_allocator()));
}
@@ -2093,64 +2079,126 @@ void lb_debug_complete_types(lbModule *m) {
}
break;
case Type_Union:
- if (file == nullptr) {
- GB_ASSERT(bt->Union.node != nullptr);
- file = lb_get_llvm_metadata(m, bt->Union.node->file);
- line_number = cast(unsigned)ast_token(bt->Union.node).pos.line;
- }
-
- isize index_offset = 1;
- if (is_type_union_maybe_pointer(bt)) {
- index_offset = 0;
- }
- record_scope = lb_get_llvm_metadata(m, bt->Union.scope);
- element_count = cast(unsigned)bt->Union.variants.count;
- if (index_offset > 0) {
- element_count += 1;
- }
+ {
+ if (file == nullptr) {
+ GB_ASSERT(bt->Union.node != nullptr);
+ file = lb_get_llvm_metadata(m, bt->Union.node->file);
+ line_number = cast(unsigned)ast_token(bt->Union.node).pos.line;
+ }
- elements = gb_alloc_array(temporary_allocator(), LLVMMetadataRef, element_count);
- if (index_offset > 0) {
- Type *tag_type = union_tag_type(bt);
- unsigned field_line = 0;
- u64 offset_in_bits = 8*cast(u64)bt->Union.variant_block_size;
- LLVMDIFlags field_flags = LLVMDIFlagZero;
+ isize index_offset = 1;
+ if (is_type_union_maybe_pointer(bt)) {
+ index_offset = 0;
+ }
+ record_scope = lb_get_llvm_metadata(m, bt->Union.scope);
+ element_count = cast(unsigned)bt->Union.variants.count;
+ if (index_offset > 0) {
+ element_count += 1;
+ }
- elements[0] = LLVMDIBuilderCreateMemberType(
- m->debug_builder, record_scope,
- "tag", 3,
- file, field_line,
- 8*cast(u64)type_size_of(tag_type), 8*cast(u32)type_align_of(tag_type),
- offset_in_bits,
- field_flags, lb_debug_type(m, tag_type)
- );
- }
+ elements = gb_alloc_array(temporary_allocator(), LLVMMetadataRef, element_count);
+ if (index_offset > 0) {
+ Type *tag_type = union_tag_type(bt);
+ unsigned field_line = 0;
+ u64 offset_in_bits = 8*cast(u64)bt->Union.variant_block_size;
+ LLVMDIFlags field_flags = LLVMDIFlagZero;
+
+ elements[0] = LLVMDIBuilderCreateMemberType(
+ m->debug_builder, record_scope,
+ "tag", 3,
+ file, field_line,
+ 8*cast(u64)type_size_of(tag_type), 8*cast(u32)type_align_of(tag_type),
+ offset_in_bits,
+ field_flags, lb_debug_type(m, tag_type)
+ );
+ }
- for_array(j, bt->Union.variants) {
- Type *variant = bt->Union.variants[j];
+ for_array(j, bt->Union.variants) {
+ Type *variant = bt->Union.variants[j];
- unsigned field_index = cast(unsigned)(index_offset+j);
+ unsigned field_index = cast(unsigned)(index_offset+j);
- char name[16] = {};
- gb_snprintf(name, gb_size_of(name), "v%u", field_index);
- isize name_len = gb_strlen(name);
+ char name[16] = {};
+ gb_snprintf(name, gb_size_of(name), "v%u", field_index);
+ isize name_len = gb_strlen(name);
- unsigned field_line = 0;
- LLVMDIFlags field_flags = LLVMDIFlagZero;
- u64 offset_in_bits = 0;
+ unsigned field_line = 0;
+ LLVMDIFlags field_flags = LLVMDIFlagZero;
+ u64 offset_in_bits = 0;
- elements[field_index] = LLVMDIBuilderCreateMemberType(
- m->debug_builder, record_scope,
- name, name_len,
- file, field_line,
- 8*cast(u64)type_size_of(variant), 8*cast(u32)type_align_of(variant),
- offset_in_bits,
- field_flags, lb_debug_type(m, variant)
- );
+ elements[field_index] = LLVMDIBuilderCreateMemberType(
+ m->debug_builder, record_scope,
+ name, name_len,
+ file, field_line,
+ 8*cast(u64)type_size_of(variant), 8*cast(u32)type_align_of(variant),
+ offset_in_bits,
+ field_flags, lb_debug_type(m, variant)
+ );
+ }
}
+ break;
+ case Type_BitSet:
+ {
+ if (file == nullptr) {
+ GB_ASSERT(bt->BitSet.node != nullptr);
+ file = lb_get_llvm_metadata(m, bt->BitSet.node->file);
+ line_number = cast(unsigned)ast_token(bt->BitSet.node).pos.line;
+ }
- break;
+ LLVMMetadataRef bit_set_field_type = lb_debug_type(m, t_bool);
+ LLVMMetadataRef scope = file;
+
+ Type *elem = base_type(bt->BitSet.elem);
+ if (elem->kind == Type_Enum) {
+ element_count = cast(unsigned)elem->Enum.fields.count;
+ elements = gb_alloc_array(temporary_allocator(), LLVMMetadataRef, element_count);
+ for_array(i, elem->Enum.fields) {
+ Entity *f = elem->Enum.fields[i];
+ GB_ASSERT(f->kind == Entity_Constant);
+ i64 val = exact_value_to_i64(f->Constant.value);
+ String name = f->token.string;
+ u64 offset_in_bits = cast(u64)(val - bt->BitSet.lower);
+ elements[i] = LLVMDIBuilderCreateBitFieldMemberType(
+ m->debug_builder,
+ scope,
+ cast(char const *)name.text, name.len,
+ file, line_number,
+ 1,
+ offset_in_bits,
+ 0,
+ LLVMDIFlagZero,
+ bit_set_field_type
+ );
+ }
+ } else {
+
+ char name[32] = {};
+
+ GB_ASSERT(is_type_integer(elem));
+ i64 count = bt->BitSet.upper - bt->BitSet.lower + 1;
+ GB_ASSERT(0 <= count);
+
+ element_count = cast(unsigned)count;
+ elements = gb_alloc_array(temporary_allocator(), LLVMMetadataRef, element_count);
+ for (unsigned i = 0; i < element_count; i++) {
+ u64 offset_in_bits = i;
+ i64 val = bt->BitSet.lower + cast(i64)i;
+ gb_snprintf(name, gb_count_of(name), "%lld", val);
+ elements[i] = LLVMDIBuilderCreateBitFieldMemberType(
+ m->debug_builder,
+ scope,
+ name, gb_strlen(name),
+ file, line_number,
+ 1,
+ offset_in_bits,
+ 0,
+ LLVMDIFlagZero,
+ bit_set_field_type
+ );
+ }
+ }
+ }
}