diff options
| author | gingerBill <bill@gingerbill.org> | 2021-03-23 22:09:16 +0000 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2021-03-23 22:09:16 +0000 |
| commit | d88d6a1fddf516533b23ca06803d239c97044a7f (patch) | |
| tree | 7888082557d515aacbe5e2a20ae310fbe83fa355 /src/llvm_backend.cpp | |
| parent | f1e13bdddbfda3297e381c9350dc7e6188951eac (diff) | |
`bit_set` support in debug symbols by treating them like a bit field of 1 bit booleans
Diffstat (limited to 'src/llvm_backend.cpp')
| -rw-r--r-- | src/llvm_backend.cpp | 186 |
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 + ); + } + } + } } |