From b87d0abefeeeed4d9ce981971a5e33a6d0932529 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Thu, 4 Feb 2016 14:02:37 -0700 Subject: [PATCH] fix debug info for bool type --- src/analyze.cpp | 30 +++++++++++++++--------------- src/codegen.cpp | 33 ++++++++++++++++++++++++--------- src/parseh.cpp | 6 +++--- src/zig_llvm.cpp | 12 ++++++++++++ src/zig_llvm.hpp | 3 +++ 5 files changed, 57 insertions(+), 27 deletions(-) diff --git a/src/analyze.cpp b/src/analyze.cpp index 7e63a43366..cc6990ab57 100644 --- a/src/analyze.cpp +++ b/src/analyze.cpp @@ -211,7 +211,7 @@ TypeTableEntry *get_pointer_to_type(CodeGen *g, TypeTableEntry *child_type, bool if (!entry->zero_bits) { entry->type_ref = LLVMPointerType(child_type->type_ref, 0); - uint64_t debug_size_in_bits = LLVMSizeOfTypeInBits(g->target_data_ref, entry->type_ref); + uint64_t debug_size_in_bits = 8*LLVMStoreSizeOfType(g->target_data_ref, entry->type_ref); uint64_t debug_align_in_bits = 8*LLVMABISizeOfType(g->target_data_ref, entry->type_ref); assert(child_type->di_type); entry->di_type = LLVMZigCreateDebugPointerType(g->dbuilder, child_type->di_type, @@ -262,16 +262,16 @@ TypeTableEntry *get_maybe_type(CodeGen *g, TypeTableEntry *child_type) { LLVMZigTag_DW_structure_type(), buf_ptr(&entry->name), compile_unit_scope, di_file, line); - uint64_t val_debug_size_in_bits = LLVMSizeOfTypeInBits(g->target_data_ref, child_type->type_ref); + uint64_t val_debug_size_in_bits = 8*LLVMStoreSizeOfType(g->target_data_ref, child_type->type_ref); uint64_t val_debug_align_in_bits = 8*LLVMABISizeOfType(g->target_data_ref, child_type->type_ref); uint64_t val_offset_in_bits = 8*LLVMOffsetOfElement(g->target_data_ref, entry->type_ref, 0); TypeTableEntry *bool_type = g->builtin_types.entry_bool; - uint64_t maybe_debug_size_in_bits = LLVMSizeOfTypeInBits(g->target_data_ref, bool_type->type_ref); + uint64_t maybe_debug_size_in_bits = 8*LLVMStoreSizeOfType(g->target_data_ref, bool_type->type_ref); uint64_t maybe_debug_align_in_bits = 8*LLVMABISizeOfType(g->target_data_ref, bool_type->type_ref); uint64_t maybe_offset_in_bits = 8*LLVMOffsetOfElement(g->target_data_ref, entry->type_ref, 1); - uint64_t debug_size_in_bits = LLVMSizeOfTypeInBits(g->target_data_ref, entry->type_ref); + uint64_t debug_size_in_bits = 8*LLVMStoreSizeOfType(g->target_data_ref, entry->type_ref); uint64_t debug_align_in_bits = 8*LLVMABISizeOfType(g->target_data_ref, entry->type_ref); LLVMZigDIType *di_element_types[] = { @@ -336,15 +336,15 @@ static TypeTableEntry *get_error_type(CodeGen *g, TypeTableEntry *child_type) { LLVMZigTag_DW_structure_type(), buf_ptr(&entry->name), compile_unit_scope, di_file, line); - uint64_t tag_debug_size_in_bits = LLVMSizeOfTypeInBits(g->target_data_ref, g->err_tag_type->type_ref); + uint64_t tag_debug_size_in_bits = 8*LLVMStoreSizeOfType(g->target_data_ref, g->err_tag_type->type_ref); uint64_t tag_debug_align_in_bits = 8*LLVMABISizeOfType(g->target_data_ref, g->err_tag_type->type_ref); uint64_t tag_offset_in_bits = 8*LLVMOffsetOfElement(g->target_data_ref, entry->type_ref, 0); - uint64_t value_debug_size_in_bits = LLVMSizeOfTypeInBits(g->target_data_ref, child_type->type_ref); + uint64_t value_debug_size_in_bits = 8*LLVMStoreSizeOfType(g->target_data_ref, child_type->type_ref); uint64_t value_debug_align_in_bits = 8*LLVMABISizeOfType(g->target_data_ref, child_type->type_ref); uint64_t value_offset_in_bits = 8*LLVMOffsetOfElement(g->target_data_ref, entry->type_ref, 1); - uint64_t debug_size_in_bits = LLVMSizeOfTypeInBits(g->target_data_ref, entry->type_ref); + uint64_t debug_size_in_bits = 8*LLVMStoreSizeOfType(g->target_data_ref, entry->type_ref); uint64_t debug_align_in_bits = 8*LLVMABISizeOfType(g->target_data_ref, entry->type_ref); LLVMZigDIType *di_element_types[] = { @@ -393,7 +393,7 @@ TypeTableEntry *get_array_type(CodeGen *g, TypeTableEntry *child_type, uint64_t buf_resize(&entry->name, 0); buf_appendf(&entry->name, "[%" PRIu64 "]%s", array_size, buf_ptr(&child_type->name)); - uint64_t debug_size_in_bits = LLVMSizeOfTypeInBits(g->target_data_ref, entry->type_ref); + uint64_t debug_size_in_bits = 8*LLVMStoreSizeOfType(g->target_data_ref, entry->type_ref); uint64_t debug_align_in_bits = 8*LLVMABISizeOfType(g->target_data_ref, entry->type_ref); entry->di_type = LLVMZigCreateDebugArrayType(g->dbuilder, debug_size_in_bits, @@ -471,7 +471,7 @@ static TypeTableEntry *get_slice_type(CodeGen *g, TypeTableEntry *child_type, bo g->builtin_types.entry_isize->di_type, }; LLVMZigDIScope *compile_unit_scope = LLVMZigCompileUnitToScope(g->compile_unit); - uint64_t debug_size_in_bits = LLVMSizeOfTypeInBits(g->target_data_ref, entry->type_ref); + uint64_t debug_size_in_bits = 8*LLVMStoreSizeOfType(g->target_data_ref, entry->type_ref); uint64_t debug_align_in_bits = 8*LLVMABISizeOfType(g->target_data_ref, entry->type_ref); entry->di_type = LLVMZigCreateDebugStructType(g->dbuilder, compile_unit_scope, buf_ptr(&entry->name), g->dummy_di_file, 0, debug_size_in_bits, debug_align_in_bits, 0, @@ -944,7 +944,7 @@ static void resolve_enum_type(CodeGen *g, ImportTableEntry *import, TypeTableEnt continue; } - uint64_t debug_size_in_bits = LLVMSizeOfTypeInBits(g->target_data_ref, field_type->type_ref); + uint64_t debug_size_in_bits = 8*LLVMStoreSizeOfType(g->target_data_ref, field_type->type_ref); uint64_t debug_align_in_bits = 8*LLVMABISizeOfType(g->target_data_ref, field_type->type_ref); union_inner_di_types[gen_field_index] = LLVMZigCreateDebugMemberType(g->dbuilder, @@ -991,7 +991,7 @@ static void resolve_enum_type(CodeGen *g, ImportTableEntry *import, TypeTableEnt LLVMStructSetBody(enum_type->type_ref, root_struct_element_types, 2, false); // create debug type for tag - uint64_t tag_debug_size_in_bits = LLVMSizeOfTypeInBits(g->target_data_ref, tag_type_entry->type_ref); + uint64_t tag_debug_size_in_bits = 8*LLVMStoreSizeOfType(g->target_data_ref, tag_type_entry->type_ref); uint64_t tag_debug_align_in_bits = 8*LLVMABISizeOfType(g->target_data_ref, tag_type_entry->type_ref); LLVMZigDIType *tag_di_type = LLVMZigCreateDebugEnumerationType(g->dbuilder, LLVMZigTypeToScope(enum_type->di_type), "AnonEnum", import->di_file, decl_node->line + 1, @@ -1030,7 +1030,7 @@ static void resolve_enum_type(CodeGen *g, ImportTableEntry *import, TypeTableEnt }; - uint64_t debug_size_in_bits = LLVMSizeOfTypeInBits(g->target_data_ref, enum_type->type_ref); + uint64_t debug_size_in_bits = 8*LLVMStoreSizeOfType(g->target_data_ref, enum_type->type_ref); uint64_t debug_align_in_bits = 8*LLVMABISizeOfType(g->target_data_ref, enum_type->type_ref); LLVMZigDIType *replacement_di_type = LLVMZigCreateDebugStructType(g->dbuilder, LLVMZigFileToScope(import->di_file), @@ -1047,7 +1047,7 @@ static void resolve_enum_type(CodeGen *g, ImportTableEntry *import, TypeTableEnt enum_type->type_ref = tag_type_entry->type_ref; // create debug type for tag - uint64_t tag_debug_size_in_bits = LLVMSizeOfTypeInBits(g->target_data_ref, tag_type_entry->type_ref); + uint64_t tag_debug_size_in_bits = 8*LLVMStoreSizeOfType(g->target_data_ref, tag_type_entry->type_ref); uint64_t tag_debug_align_in_bits = 8*LLVMABISizeOfType(g->target_data_ref, tag_type_entry->type_ref); LLVMZigDIType *tag_di_type = LLVMZigCreateDebugEnumerationType(g->dbuilder, LLVMZigFileToScope(import->di_file), buf_ptr(&decl_node->data.struct_decl.name), @@ -1155,7 +1155,7 @@ static void resolve_struct_type(CodeGen *g, ImportTableEntry *import, TypeTableE TypeTableEntry *field_type = type_struct_field->type_entry; - uint64_t debug_size_in_bits = LLVMSizeOfTypeInBits(g->target_data_ref, field_type->type_ref); + uint64_t debug_size_in_bits = 8*LLVMStoreSizeOfType(g->target_data_ref, field_type->type_ref); uint64_t debug_align_in_bits = 8*LLVMABISizeOfType(g->target_data_ref, field_type->type_ref); uint64_t debug_offset_in_bits = 8*LLVMOffsetOfElement(g->target_data_ref, struct_type->type_ref, gen_field_index); @@ -1171,7 +1171,7 @@ static void resolve_struct_type(CodeGen *g, ImportTableEntry *import, TypeTableE } - uint64_t debug_size_in_bits = LLVMSizeOfTypeInBits(g->target_data_ref, struct_type->type_ref); + uint64_t debug_size_in_bits = 8*LLVMStoreSizeOfType(g->target_data_ref, struct_type->type_ref); uint64_t debug_align_in_bits = 8*LLVMABISizeOfType(g->target_data_ref, struct_type->type_ref); LLVMZigDIType *replacement_di_type = LLVMZigCreateDebugStructType(g->dbuilder, LLVMZigFileToScope(import->di_file), diff --git a/src/codegen.cpp b/src/codegen.cpp index e0a2784e95..f8a07a20b3 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -3104,7 +3104,22 @@ static void define_builtin_types(CodeGen *g) { buf_resize(&entry->name, 0); buf_appendf(&entry->name, "%c%d", u_or_i, size_in_bits); - uint64_t debug_size_in_bits = LLVMSizeOfTypeInBits(g->target_data_ref, entry->type_ref); + unsigned dwarf_tag; + if (is_signed) { + if (size_in_bits == 8) { + dwarf_tag = LLVMZigEncoding_DW_ATE_signed_char(); + } else { + dwarf_tag = LLVMZigEncoding_DW_ATE_signed(); + } + } else { + if (size_in_bits == 8) { + dwarf_tag = LLVMZigEncoding_DW_ATE_unsigned_char(); + } else { + dwarf_tag = LLVMZigEncoding_DW_ATE_unsigned(); + } + } + + uint64_t debug_size_in_bits = 8*LLVMStoreSizeOfType(g->target_data_ref, entry->type_ref); uint64_t debug_align_in_bits = 8*LLVMABISizeOfType(g->target_data_ref, entry->type_ref); entry->di_type = LLVMZigCreateDebugBasicType(g->dbuilder, buf_ptr(&entry->name), debug_size_in_bits, debug_align_in_bits, @@ -3133,7 +3148,7 @@ static void define_builtin_types(CodeGen *g) { buf_init_from_str(&entry->name, info->name); - uint64_t debug_size_in_bits = LLVMSizeOfTypeInBits(g->target_data_ref, entry->type_ref); + uint64_t debug_size_in_bits = 8*LLVMStoreSizeOfType(g->target_data_ref, entry->type_ref); uint64_t debug_align_in_bits = 8*LLVMABISizeOfType(g->target_data_ref, entry->type_ref); entry->di_type = LLVMZigCreateDebugBasicType(g->dbuilder, buf_ptr(&entry->name), debug_size_in_bits, @@ -3150,12 +3165,12 @@ static void define_builtin_types(CodeGen *g) { TypeTableEntry *entry = new_type_table_entry(TypeTableEntryIdBool); entry->type_ref = LLVMInt1Type(); buf_init_from_str(&entry->name, "bool"); - uint64_t debug_size_in_bits = LLVMSizeOfTypeInBits(g->target_data_ref, entry->type_ref); + uint64_t debug_size_in_bits = 8*LLVMStoreSizeOfType(g->target_data_ref, entry->type_ref); uint64_t debug_align_in_bits = 8*LLVMABISizeOfType(g->target_data_ref, entry->type_ref); entry->di_type = LLVMZigCreateDebugBasicType(g->dbuilder, buf_ptr(&entry->name), debug_size_in_bits, debug_align_in_bits, - LLVMZigEncoding_DW_ATE_unsigned()); + LLVMZigEncoding_DW_ATE_boolean()); g->builtin_types.entry_bool = entry; g->primitive_type_table.put(&entry->name, entry); } @@ -3166,7 +3181,7 @@ static void define_builtin_types(CodeGen *g) { entry->data.integral.is_signed = true; entry->data.integral.bit_count = g->pointer_size_bytes * 8; - uint64_t debug_size_in_bits = LLVMSizeOfTypeInBits(g->target_data_ref, entry->type_ref); + uint64_t debug_size_in_bits = 8*LLVMStoreSizeOfType(g->target_data_ref, entry->type_ref); uint64_t debug_align_in_bits = 8*LLVMABISizeOfType(g->target_data_ref, entry->type_ref); entry->di_type = LLVMZigCreateDebugBasicType(g->dbuilder, buf_ptr(&entry->name), debug_size_in_bits, @@ -3182,7 +3197,7 @@ static void define_builtin_types(CodeGen *g) { entry->data.integral.is_signed = false; entry->data.integral.bit_count = g->pointer_size_bytes * 8; - uint64_t debug_size_in_bits = LLVMSizeOfTypeInBits(g->target_data_ref, entry->type_ref); + uint64_t debug_size_in_bits = 8*LLVMStoreSizeOfType(g->target_data_ref, entry->type_ref); uint64_t debug_align_in_bits = 8*LLVMABISizeOfType(g->target_data_ref, entry->type_ref); entry->di_type = LLVMZigCreateDebugBasicType(g->dbuilder, buf_ptr(&entry->name), debug_size_in_bits, @@ -3197,7 +3212,7 @@ static void define_builtin_types(CodeGen *g) { buf_init_from_str(&entry->name, "f32"); entry->data.floating.bit_count = 32; - uint64_t debug_size_in_bits = LLVMSizeOfTypeInBits(g->target_data_ref, entry->type_ref); + uint64_t debug_size_in_bits = 8*LLVMStoreSizeOfType(g->target_data_ref, entry->type_ref); uint64_t debug_align_in_bits = 8*LLVMABISizeOfType(g->target_data_ref, entry->type_ref); entry->di_type = LLVMZigCreateDebugBasicType(g->dbuilder, buf_ptr(&entry->name), debug_size_in_bits, @@ -3212,7 +3227,7 @@ static void define_builtin_types(CodeGen *g) { buf_init_from_str(&entry->name, "f64"); entry->data.floating.bit_count = 64; - uint64_t debug_size_in_bits = LLVMSizeOfTypeInBits(g->target_data_ref, entry->type_ref); + uint64_t debug_size_in_bits = 8*LLVMStoreSizeOfType(g->target_data_ref, entry->type_ref); uint64_t debug_align_in_bits = 8*LLVMABISizeOfType(g->target_data_ref, entry->type_ref); entry->di_type = LLVMZigCreateDebugBasicType(g->dbuilder, buf_ptr(&entry->name), debug_size_in_bits, @@ -3227,7 +3242,7 @@ static void define_builtin_types(CodeGen *g) { buf_init_from_str(&entry->name, "c_long_double"); entry->data.floating.bit_count = 80; - uint64_t debug_size_in_bits = LLVMSizeOfTypeInBits(g->target_data_ref, entry->type_ref); + uint64_t debug_size_in_bits = 8*LLVMStoreSizeOfType(g->target_data_ref, entry->type_ref); uint64_t debug_align_in_bits = 8*LLVMABISizeOfType(g->target_data_ref, entry->type_ref); entry->di_type = LLVMZigCreateDebugBasicType(g->dbuilder, buf_ptr(&entry->name), debug_size_in_bits, diff --git a/src/parseh.cpp b/src/parseh.cpp index 30e9d4598d..272dada3d9 100644 --- a/src/parseh.cpp +++ b/src/parseh.cpp @@ -793,7 +793,7 @@ static void visit_enum_decl(Context *c, const EnumDecl *enum_decl) { // create debug type for tag unsigned line = c->source_node ? (c->source_node->line + 1) : 0; - uint64_t debug_size_in_bits = LLVMSizeOfTypeInBits(c->codegen->target_data_ref, enum_type->type_ref); + uint64_t debug_size_in_bits = 8*LLVMStoreSizeOfType(c->codegen->target_data_ref, enum_type->type_ref); uint64_t debug_align_in_bits = 8*LLVMABISizeOfType(c->codegen->target_data_ref, enum_type->type_ref); LLVMZigDIType *tag_di_type = LLVMZigCreateDebugEnumerationType(c->codegen->dbuilder, LLVMZigFileToScope(c->import->di_file), buf_ptr(bare_name), @@ -914,7 +914,7 @@ static TypeTableEntry *resolve_record_decl(Context *c, const RecordDecl *record_ return struct_type; } - uint64_t debug_size_in_bits = LLVMSizeOfTypeInBits(c->codegen->target_data_ref, field_type->type_ref); + uint64_t debug_size_in_bits = 8*LLVMStoreSizeOfType(c->codegen->target_data_ref, field_type->type_ref); uint64_t debug_align_in_bits = 8*LLVMABISizeOfType(c->codegen->target_data_ref, field_type->type_ref); uint64_t debug_offset_in_bits = 8*LLVMOffsetOfElement(c->codegen->target_data_ref, struct_type->type_ref, i); di_element_types[i] = LLVMZigCreateDebugMemberType(c->codegen->dbuilder, @@ -937,7 +937,7 @@ static TypeTableEntry *resolve_record_decl(Context *c, const RecordDecl *record_ LLVMStructSetBody(struct_type->type_ref, element_types, field_count, false); - uint64_t debug_size_in_bits = LLVMSizeOfTypeInBits(c->codegen->target_data_ref, struct_type->type_ref); + uint64_t debug_size_in_bits = 8*LLVMStoreSizeOfType(c->codegen->target_data_ref, struct_type->type_ref); uint64_t debug_align_in_bits = 8*LLVMABISizeOfType(c->codegen->target_data_ref, struct_type->type_ref); LLVMZigDIType *replacement_di_type = LLVMZigCreateDebugStructType(c->codegen->dbuilder, LLVMZigFileToScope(c->import->di_file), diff --git a/src/zig_llvm.cpp b/src/zig_llvm.cpp index f770909556..b0e32e8b6b 100644 --- a/src/zig_llvm.cpp +++ b/src/zig_llvm.cpp @@ -324,6 +324,18 @@ unsigned LLVMZigEncoding_DW_ATE_float(void) { return dwarf::DW_ATE_float; } +unsigned LLVMZigEncoding_DW_ATE_boolean(void) { + return dwarf::DW_ATE_boolean; +} + +unsigned LLVMZigEncoding_DW_ATE_unsigned_char(void) { + return dwarf::DW_ATE_unsigned_char; +} + +unsigned LLVMZigEncoding_DW_ATE_signed_char(void) { + return dwarf::DW_ATE_signed_char; +} + unsigned LLVMZigLang_DW_LANG_C99(void) { return dwarf::DW_LANG_C99; } diff --git a/src/zig_llvm.hpp b/src/zig_llvm.hpp index 39c6a8d6fe..74b2499276 100644 --- a/src/zig_llvm.hpp +++ b/src/zig_llvm.hpp @@ -90,6 +90,9 @@ LLVMZigDIType *LLVMZigCreateSubroutineType(LLVMZigDIBuilder *dibuilder_wrapped, unsigned LLVMZigEncoding_DW_ATE_unsigned(void); unsigned LLVMZigEncoding_DW_ATE_signed(void); unsigned LLVMZigEncoding_DW_ATE_float(void); +unsigned LLVMZigEncoding_DW_ATE_boolean(void); +unsigned LLVMZigEncoding_DW_ATE_unsigned_char(void); +unsigned LLVMZigEncoding_DW_ATE_signed_char(void); unsigned LLVMZigLang_DW_LANG_C99(void); unsigned LLVMZigTag_DW_auto_variable(void); unsigned LLVMZigTag_DW_arg_variable(void);