From b66fb607bf00c8ac120f22080bcf48eb05cbc71f Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Mon, 7 Dec 2015 20:07:46 -0700 Subject: [PATCH] add debugging info for array type --- README.md | 1 + src/analyze.cpp | 12 +++++++++--- src/codegen.cpp | 18 ++++++++++++++---- src/semantic_info.hpp | 2 ++ src/zig_llvm.cpp | 12 ++++++++++++ src/zig_llvm.hpp | 5 +++++ 6 files changed, 43 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index b8ab541244..2ecd0a9c57 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,7 @@ compromises backward compatibility. ### Roadmap + * debugging for variables * structs * loops * enums diff --git a/src/analyze.cpp b/src/analyze.cpp index c62aea8bcc..763f1b8070 100644 --- a/src/analyze.cpp +++ b/src/analyze.cpp @@ -65,8 +65,10 @@ TypeTableEntry *get_pointer_to_type(CodeGen *g, TypeTableEntry *child_type, bool entry->type_ref = LLVMPointerType(child_type->type_ref, 0); buf_resize(&entry->name, 0); buf_appendf(&entry->name, "*%s %s", is_const ? "const" : "mut", buf_ptr(&child_type->name)); + entry->size_in_bits = g->pointer_size_bytes * 8; + entry->align_in_bits = g->pointer_size_bytes * 8; entry->di_type = LLVMZigCreateDebugPointerType(g->dbuilder, child_type->di_type, - g->pointer_size_bytes * 8, g->pointer_size_bytes * 8, buf_ptr(&entry->name)); + entry->size_in_bits, entry->align_in_bits, buf_ptr(&entry->name)); g->type_table.put(&entry->name, entry); *parent_pointer = entry; return entry; @@ -81,8 +83,12 @@ static TypeTableEntry *get_array_type(CodeGen *g, TypeTableEntry *child_type, in TypeTableEntry *entry = new_type_table_entry(); entry->type_ref = LLVMArrayType(child_type->type_ref, array_size); buf_resize(&entry->name, 0); - buf_appendf(&entry->name, "[%s; %ud]", buf_ptr(&child_type->name), array_size); - //entry->di_type = LLVMZigCreateDebugArrayType(g->dbuilder, ..., buf_ptr(&entry->name)); // TODO + buf_appendf(&entry->name, "[%s; %d]", buf_ptr(&child_type->name), array_size); + + entry->size_in_bits = child_type->size_in_bits * array_size; + entry->align_in_bits = child_type->align_in_bits; + entry->di_type = LLVMZigCreateDebugArrayType(g->dbuilder, entry->size_in_bits, + entry->align_in_bits, child_type->di_type, array_size); g->type_table.put(&entry->name, entry); child_type->arrays_by_size.put(array_size, entry); diff --git a/src/codegen.cpp b/src/codegen.cpp index ce3eb174ef..051062555b 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -789,7 +789,10 @@ static void define_primitive_types(CodeGen *g) { TypeTableEntry *entry = new_type_table_entry(); entry->type_ref = LLVMInt1Type(); buf_init_from_str(&entry->name, "bool"); - entry->di_type = LLVMZigCreateDebugBasicType(g->dbuilder, buf_ptr(&entry->name), 1, 8, + entry->size_in_bits = 1; + entry->align_in_bits = 8; + entry->di_type = LLVMZigCreateDebugBasicType(g->dbuilder, buf_ptr(&entry->name), + entry->size_in_bits, entry->align_in_bits, LLVMZigEncoding_DW_ATE_unsigned()); g->type_table.put(&entry->name, entry); g->builtin_types.entry_bool = entry; @@ -798,7 +801,10 @@ static void define_primitive_types(CodeGen *g) { TypeTableEntry *entry = new_type_table_entry(); entry->type_ref = LLVMInt8Type(); buf_init_from_str(&entry->name, "u8"); - entry->di_type = LLVMZigCreateDebugBasicType(g->dbuilder, buf_ptr(&entry->name), 8, 8, + entry->size_in_bits = 8; + entry->align_in_bits = 8; + entry->di_type = LLVMZigCreateDebugBasicType(g->dbuilder, buf_ptr(&entry->name), + entry->size_in_bits, entry->align_in_bits, LLVMZigEncoding_DW_ATE_unsigned()); g->type_table.put(&entry->name, entry); g->builtin_types.entry_u8 = entry; @@ -808,7 +814,10 @@ static void define_primitive_types(CodeGen *g) { TypeTableEntry *entry = new_type_table_entry(); entry->type_ref = LLVMInt32Type(); buf_init_from_str(&entry->name, "i32"); - entry->di_type = LLVMZigCreateDebugBasicType(g->dbuilder, buf_ptr(&entry->name), 32, 32, + entry->size_in_bits = 32; + entry->align_in_bits = 32; + entry->di_type = LLVMZigCreateDebugBasicType(g->dbuilder, buf_ptr(&entry->name), + entry->size_in_bits, entry->align_in_bits, LLVMZigEncoding_DW_ATE_signed()); g->type_table.put(&entry->name, entry); g->builtin_types.entry_i32 = entry; @@ -817,7 +826,8 @@ static void define_primitive_types(CodeGen *g) { TypeTableEntry *entry = new_type_table_entry(); entry->type_ref = LLVMVoidType(); buf_init_from_str(&entry->name, "void"); - entry->di_type = LLVMZigCreateDebugBasicType(g->dbuilder, buf_ptr(&entry->name), 0, 0, + entry->di_type = LLVMZigCreateDebugBasicType(g->dbuilder, buf_ptr(&entry->name), + entry->size_in_bits, entry->align_in_bits, LLVMZigEncoding_DW_ATE_unsigned()); g->type_table.put(&entry->name, entry); g->builtin_types.entry_void = entry; diff --git a/src/semantic_info.hpp b/src/semantic_info.hpp index 0ab0c01b1c..433f5f6fa0 100644 --- a/src/semantic_info.hpp +++ b/src/semantic_info.hpp @@ -18,6 +18,8 @@ struct FnTableEntry; struct TypeTableEntry { LLVMTypeRef type_ref; LLVMZigDIType *di_type; + uint64_t size_in_bits; + uint64_t align_in_bits; TypeTableEntry *pointer_child; bool pointer_is_const; diff --git a/src/zig_llvm.cpp b/src/zig_llvm.cpp index cfc4920116..6ef2cace17 100644 --- a/src/zig_llvm.cpp +++ b/src/zig_llvm.cpp @@ -149,6 +149,18 @@ LLVMZigDIType *LLVMZigCreateDebugBasicType(LLVMZigDIBuilder *dibuilder, const ch return reinterpret_cast(di_type); } +LLVMZigDIType *LLVMZigCreateDebugArrayType(LLVMZigDIBuilder *dibuilder, uint64_t size_in_bits, + uint64_t align_in_bits, LLVMZigDIType *elem_type, int elem_count) +{ + SmallVector subrange; + subrange.push_back(reinterpret_cast(dibuilder)->getOrCreateSubrange(0, elem_count - 1)); + DIType *di_type = reinterpret_cast(dibuilder)->createArrayType( + size_in_bits, align_in_bits, + reinterpret_cast(elem_type), + reinterpret_cast(dibuilder)->getOrCreateArray(subrange)); + return reinterpret_cast(di_type); +} + LLVMZigDISubroutineType *LLVMZigCreateSubroutineType(LLVMZigDIBuilder *dibuilder_wrapped, LLVMZigDIFile *file, LLVMZigDIType **types_array, int types_array_len, unsigned flags) { diff --git a/src/zig_llvm.hpp b/src/zig_llvm.hpp index 71bff360e8..604b3db364 100644 --- a/src/zig_llvm.hpp +++ b/src/zig_llvm.hpp @@ -43,6 +43,11 @@ LLVMZigDIType *LLVMZigCreateDebugPointerType(LLVMZigDIBuilder *dibuilder, LLVMZi LLVMZigDIType *LLVMZigCreateDebugBasicType(LLVMZigDIBuilder *dibuilder, const char *name, uint64_t size_in_bits, uint64_t align_in_bits, unsigned encoding); +LLVMZigDIType *LLVMZigCreateDebugArrayType(LLVMZigDIBuilder *dibuilder, + uint64_t size_in_bits, uint64_t align_in_bits, LLVMZigDIType *elem_type, + int elem_count); + + LLVMZigDISubroutineType *LLVMZigCreateSubroutineType(LLVMZigDIBuilder *dibuilder_wrapped, LLVMZigDIFile *file, LLVMZigDIType **types_array, int types_array_len, unsigned flags);