From e1ff201d60e6eb28c7e5ca5110b27b1e35194b82 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Mon, 4 Jan 2016 21:42:35 -0700 Subject: [PATCH] fix crash when struct field is invalid --- example/rand/main.zig | 2 ++ src/analyze.cpp | 26 ++++++++++++++++---------- src/analyze.hpp | 1 + 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/example/rand/main.zig b/example/rand/main.zig index e6e76aab68ff72899be6c0d07fa9243d2e98aeb7..35a1335249e3c8ed2768bee4d6f04bac759adf2e 100644 --- a/example/rand/main.zig +++ b/example/rand/main.zig @@ -1,3 +1,5 @@ +export executable "rand"; + // Mersenne Twister const ARRAY_SIZE : u16 = 624; diff --git a/src/analyze.cpp b/src/analyze.cpp index dcc2fcf42fa80e4fb609a0036a9b030735a42d7d..ada3cf4323b1008c3c7ad8650b0522998cd6ad8a 100644 --- a/src/analyze.cpp +++ b/src/analyze.cpp @@ -429,6 +429,9 @@ static void resolve_struct_type(CodeGen *g, ImportTableEntry *import, TypeTableE if (type_struct_field->type_entry->id == TypeTableEntryIdStruct) { resolve_struct_type(g, import, type_struct_field->type_entry); + } else if (type_struct_field->type_entry->id == TypeTableEntryIdInvalid) { + struct_type->data.structure.is_invalid = true; + continue; } di_element_types[i] = LLVMZigCreateDebugMemberType(g->dbuilder, @@ -451,19 +454,22 @@ static void resolve_struct_type(CodeGen *g, ImportTableEntry *import, TypeTableE } struct_type->data.structure.embedded_in_current = false; - LLVMStructSetBody(struct_type->type_ref, element_types, field_count, false); + if (!struct_type->data.structure.is_invalid) { - struct_type->align_in_bits = first_field_align_in_bits; - struct_type->size_in_bits = total_size_in_bits; + LLVMStructSetBody(struct_type->type_ref, element_types, field_count, false); - LLVMZigDIType *replacement_di_type = LLVMZigCreateDebugStructType(g->dbuilder, - LLVMZigFileToScope(import->di_file), - buf_ptr(&decl_node->data.struct_decl.name), - import->di_file, decl_node->line + 1, struct_type->size_in_bits, struct_type->align_in_bits, 0, - nullptr, di_element_types, field_count, 0, nullptr, ""); + struct_type->align_in_bits = first_field_align_in_bits; + struct_type->size_in_bits = total_size_in_bits; - LLVMZigReplaceTemporary(g->dbuilder, struct_type->di_type, replacement_di_type); - struct_type->di_type = replacement_di_type; + LLVMZigDIType *replacement_di_type = LLVMZigCreateDebugStructType(g->dbuilder, + LLVMZigFileToScope(import->di_file), + buf_ptr(&decl_node->data.struct_decl.name), + import->di_file, decl_node->line + 1, struct_type->size_in_bits, struct_type->align_in_bits, 0, + nullptr, di_element_types, field_count, 0, nullptr, ""); + + LLVMZigReplaceTemporary(g->dbuilder, struct_type->di_type, replacement_di_type); + struct_type->di_type = replacement_di_type; + } } static void preview_fn_def(CodeGen *g, ImportTableEntry *import, AstNode *node, TypeTableEntry *struct_type) { diff --git a/src/analyze.hpp b/src/analyze.hpp index a578a0f4e3e2057c4a0dc7d41868e14efe71fefd..dcb85c94a1c4364211e934cbb62d5b0282c45e3a 100644 --- a/src/analyze.hpp +++ b/src/analyze.hpp @@ -45,6 +45,7 @@ struct TypeTableEntryStruct { int field_count; TypeStructField *fields; uint64_t size_bytes; + bool is_invalid; // true if any fields are invalid // reminder: hash tables must be initialized before use HashMap fn_table; -- 2.54.0