Commit 4c38a8cce1

Andrew Kelley <andrew@ziglang.org>
2019-04-02 23:12:09
more regression fixes. empty test passes again
1 parent 5aee17e
src/analyze.cpp
@@ -6252,53 +6252,55 @@ static void resolve_llvm_types_slice(CodeGen *g, ZigType *type, ResolveStatus wa
     ZigType *ptr_type = type->data.structure.fields[slice_ptr_index].type_entry;
     ZigType *child_type = ptr_type->data.pointer.child_type;
     ZigType *usize_type = g->builtin_types.entry_usize;
-    LLVMTypeRef usize_llvm_type = get_llvm_type(g, usize_type);
-    ZigLLVMDIType *usize_llvm_di_type = get_llvm_di_type(g, usize_type);
-    ZigLLVMDIScope *compile_unit_scope = ZigLLVMCompileUnitToScope(g->compile_unit);
-    ZigLLVMDIFile *di_file = nullptr;
-    unsigned line = 0;
 
-    if (type->data.structure.resolve_status < ResolveStatusLLVMFwdDecl) {
-        bool done = false;
-        if (ptr_type->data.pointer.is_const || ptr_type->data.pointer.is_volatile ||
-            ptr_type->data.pointer.explicit_alignment != 0 || ptr_type->data.pointer.allow_zero)
+    bool done = false;
+    if (ptr_type->data.pointer.is_const || ptr_type->data.pointer.is_volatile ||
+        ptr_type->data.pointer.explicit_alignment != 0 || ptr_type->data.pointer.allow_zero)
+    {
+        ZigType *peer_ptr_type = get_pointer_to_type_extra(g, child_type, false, false,
+                PtrLenUnknown, 0, 0, 0, false);
+        ZigType *peer_slice_type = get_slice_type(g, peer_ptr_type);
+
+        assertNoError(type_resolve(g, peer_slice_type, wanted_resolve_status));
+        type->llvm_type = peer_slice_type->llvm_type;
+        type->llvm_di_type = peer_slice_type->llvm_di_type;
+        type->data.structure.resolve_status = peer_slice_type->data.structure.resolve_status;
+        done = true;
+    }
+
+    // If the child type is []const T then we need to make sure the type ref
+    // and debug info is the same as if the child type were []T.
+    if (is_slice(child_type)) {
+        ZigType *child_ptr_type = child_type->data.structure.fields[slice_ptr_index].type_entry;
+        assert(child_ptr_type->id == ZigTypeIdPointer);
+        if (child_ptr_type->data.pointer.is_const || child_ptr_type->data.pointer.is_volatile ||
+            child_ptr_type->data.pointer.explicit_alignment != 0 || child_ptr_type->data.pointer.allow_zero)
         {
-            ZigType *peer_ptr_type = get_pointer_to_type_extra(g, child_type, false, false,
+            ZigType *grand_child_type = child_ptr_type->data.pointer.child_type;
+            ZigType *bland_child_ptr_type = get_pointer_to_type_extra(g, grand_child_type, false, false,
+                    PtrLenUnknown, 0, 0, 0, false);
+            ZigType *bland_child_slice = get_slice_type(g, bland_child_ptr_type);
+            ZigType *peer_ptr_type = get_pointer_to_type_extra(g, bland_child_slice, false, false,
                     PtrLenUnknown, 0, 0, 0, false);
             ZigType *peer_slice_type = get_slice_type(g, peer_ptr_type);
 
-            type->llvm_type = get_llvm_type(g, peer_slice_type);
-            type->llvm_di_type = get_llvm_di_type(g, peer_slice_type);
+            assertNoError(type_resolve(g, peer_slice_type, wanted_resolve_status));
+            type->llvm_type = peer_slice_type->llvm_type;
+            type->llvm_di_type = peer_slice_type->llvm_di_type;
+            type->data.structure.resolve_status = peer_slice_type->data.structure.resolve_status;
             done = true;
         }
+    }
 
-        // If the child type is []const T then we need to make sure the type ref
-        // and debug info is the same as if the child type were []T.
-        if (is_slice(child_type)) {
-            ZigType *child_ptr_type = child_type->data.structure.fields[slice_ptr_index].type_entry;
-            assert(child_ptr_type->id == ZigTypeIdPointer);
-            if (child_ptr_type->data.pointer.is_const || child_ptr_type->data.pointer.is_volatile ||
-                child_ptr_type->data.pointer.explicit_alignment != 0 || child_ptr_type->data.pointer.allow_zero)
-            {
-                ZigType *grand_child_type = child_ptr_type->data.pointer.child_type;
-                ZigType *bland_child_ptr_type = get_pointer_to_type_extra(g, grand_child_type, false, false,
-                        PtrLenUnknown, 0, 0, 0, false);
-                ZigType *bland_child_slice = get_slice_type(g, bland_child_ptr_type);
-                ZigType *peer_ptr_type = get_pointer_to_type_extra(g, bland_child_slice, false, false,
-                        PtrLenUnknown, 0, 0, 0, false);
-                ZigType *peer_slice_type = get_slice_type(g, peer_ptr_type);
-
-                type->llvm_type = get_llvm_type(g, peer_slice_type);
-                type->llvm_di_type = get_llvm_di_type(g, peer_slice_type);
-                done = true;
-            }
-        }
+    if (done) return;
 
-        if (done) {
-            type->data.structure.resolve_status = ResolveStatusLLVMFull;
-            return;
-        }
+    LLVMTypeRef usize_llvm_type = get_llvm_type(g, usize_type);
+    ZigLLVMDIType *usize_llvm_di_type = get_llvm_di_type(g, usize_type);
+    ZigLLVMDIScope *compile_unit_scope = ZigLLVMCompileUnitToScope(g->compile_unit);
+    ZigLLVMDIFile *di_file = nullptr;
+    unsigned line = 0;
 
+    if (type->data.structure.resolve_status < ResolveStatusLLVMFwdDecl) {
         type->llvm_type = LLVMStructCreateNamed(LLVMGetGlobalContext(), buf_ptr(&type->name));
 
         type->llvm_di_type = ZigLLVMCreateReplaceableCompositeType(g->dbuilder,
@@ -6551,6 +6553,12 @@ static void resolve_llvm_types_enum(CodeGen *g, ZigType *enum_type) {
     assert(enum_type->data.enumeration.complete);
     if (enum_type->llvm_di_type != nullptr) return;
 
+    if (!type_has_bits(enum_type)) {
+        enum_type->llvm_type = g->builtin_types.entry_void->llvm_type;
+        enum_type->llvm_di_type = g->builtin_types.entry_void->llvm_di_type;
+        return;
+    }
+
     uint32_t field_count = enum_type->data.enumeration.src_field_count;
 
     assert(enum_type->data.enumeration.fields);
@@ -6569,6 +6577,7 @@ static void resolve_llvm_types_enum(CodeGen *g, ZigType *enum_type) {
     }
 
     ZigType *tag_int_type = enum_type->data.enumeration.tag_int_type;
+    enum_type->llvm_type = get_llvm_type(g, tag_int_type);
 
     // create debug type for tag
     AstNode *decl_node = enum_type->data.enumeration.decl_node;
@@ -6583,7 +6592,6 @@ static void resolve_llvm_types_enum(CodeGen *g, ZigType *enum_type) {
             get_llvm_di_type(g, tag_int_type), "");
 
     enum_type->llvm_di_type = tag_di_type;
-    enum_type->llvm_type = get_llvm_type(g, tag_int_type);
 }
 
 static void resolve_llvm_types_union(CodeGen *g, ZigType *union_type, ResolveStatus wanted_resolve_status) {
@@ -6764,6 +6772,7 @@ static void resolve_llvm_types_pointer(CodeGen *g, ZigType *type) {
         uint64_t debug_align_in_bits = 8*type->abi_align;
         type->llvm_di_type = ZigLLVMCreateDebugPointerType(g->dbuilder, elem_type->llvm_di_type,
                 debug_size_in_bits, debug_align_in_bits, buf_ptr(&type->name));
+        assertNoError(type_resolve(g, elem_type, ResolveStatusLLVMFull));
     } else {
         ZigType *host_int_type = get_int_type(g, false, type->data.pointer.host_int_bytes * 8);
         LLVMTypeRef host_int_llvm_type = get_llvm_type(g, host_int_type);
@@ -6939,6 +6948,12 @@ static void resolve_llvm_types_error_union(CodeGen *g, ZigType *type) {
 static void resolve_llvm_types_array(CodeGen *g, ZigType *type) {
     if (type->llvm_di_type != nullptr) return;
 
+    if (!type_has_bits(type)) {
+        type->llvm_type = g->builtin_types.entry_void->llvm_type;
+        type->llvm_di_type = g->builtin_types.entry_void->llvm_di_type;
+        return;
+    }
+
     ZigType *elem_type = type->data.array.child_type;
 
     // TODO https://github.com/ziglang/zig/issues/1424
@@ -7014,7 +7029,7 @@ static void resolve_llvm_types_fn(CodeGen *g, ZigType *fn_type) {
         gen_param_info->src_index = i;
         gen_param_info->gen_index = SIZE_MAX;
 
-        if (!type_has_bits(type_entry))
+        if (is_c_abi || !type_has_bits(type_entry))
             continue;
 
         ZigType *gen_type;
src/codegen.cpp
@@ -3566,7 +3566,9 @@ static LLVMValueRef ir_render_elem_ptr(CodeGen *g, IrExecutable *executable, IrI
         return LLVMBuildInBoundsGEP(g->builder, array_ptr, indices, 1, "");
     } else if (array_type->id == ZigTypeIdStruct) {
         assert(array_type->data.structure.is_slice);
-        if (!type_has_bits(instruction->base.value.type)) {
+
+        ZigType *ptr_type = instruction->base.value.type;
+        if (!type_has_bits(ptr_type)) {
             if (safety_check_on) {
                 assert(LLVMGetTypeKind(LLVMTypeOf(array_ptr)) == LLVMIntegerTypeKind);
                 add_bounds_check(g, subscript_value, LLVMIntEQ, nullptr, LLVMIntULT, array_ptr);
@@ -5695,6 +5697,7 @@ static void ir_render(CodeGen *g, ZigFn *fn_entry) {
             IrInstruction *instruction = current_block->instruction_list.at(instr_i);
             if (instruction->ref_count == 0 && !ir_has_side_effects(instruction))
                 continue;
+
             instruction->llvm_value = ir_render_instruction(g, executable, instruction);
         }
         current_block->llvm_exit_block = LLVMGetInsertBlock(g->builder);
@@ -6855,9 +6858,9 @@ static void do_code_gen(CodeGen *g) {
                 }
                 if (var->decl_node) {
                     var->di_loc_var = ZigLLVMCreateParameterVariable(g->dbuilder, get_di_scope(g, var->parent_scope),
-                            buf_ptr(&var->name), import->data.structure.root_struct->di_file,
-                            (unsigned)(var->decl_node->line + 1),
-                            get_llvm_di_type(g, gen_type), !g->strip_debug_symbols, 0, (unsigned)(gen_info->gen_index));
+                        buf_ptr(&var->name), import->data.structure.root_struct->di_file,
+                        (unsigned)(var->decl_node->line + 1),
+                        get_llvm_di_type(g, gen_type), !g->strip_debug_symbols, 0, (unsigned)(gen_info->gen_index+1));
                 }
 
             }
src/zig_llvm.cpp
@@ -548,6 +548,7 @@ ZigLLVMDILocalVariable *ZigLLVMCreateParameterVariable(ZigLLVMDIBuilder *dbuilde
         ZigLLVMDIType *type, bool always_preserve, unsigned flags, unsigned arg_no)
 {
     assert(flags == 0);
+    assert(arg_no != 0);
     DILocalVariable *result = reinterpret_cast<DIBuilder*>(dbuilder)->createParameterVariable(
             reinterpret_cast<DIScope*>(scope),
             name,