From cdb40936bd528ee92dd11cf090ab75cf08bc0fc0 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Tue, 13 Sep 2022 03:03:34 -0700 Subject: [PATCH] properly annotate nullability of ZigLLVMCreateDebugForwardDeclType This bug manifested as a segfault in stage1 when calling this function. The C++ code looks like this: ```c++ entry->llvm_di_type = ZigLLVMCreateDebugForwardDeclType(g->dbuilder, ZigLLVMTag_DW_structure_type(), full_name, import ? ZigLLVMFileToScope(import->data.structure.root_struct->di_file) : nullptr, import ? import->data.structure.root_struct->di_file : nullptr, line); ``` There is actually no problem here - what happened is that because cross-language LTO was enabled between zig and c++ code, and because Zig annotated the file parameter (3rd line) as being non-null, the C++ code assumed that parameter could not be null, and eagerly dereferenced `import->...`, causing a segfault, since it was null. I verified that this commit fixed the problem and I also verified this hypothesis by disabling LTO and noticing that it indeed avoided the problem. --- src/codegen/llvm/bindings.zig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/codegen/llvm/bindings.zig b/src/codegen/llvm/bindings.zig index d1a386ac60..81e722bed8 100644 --- a/src/codegen/llvm/bindings.zig +++ b/src/codegen/llvm/bindings.zig @@ -1734,8 +1734,8 @@ pub const DIBuilder = opaque { dib: *DIBuilder, tag: c_uint, name: [*:0]const u8, - scope: *DIScope, - file: *DIFile, + scope: ?*DIScope, + file: ?*DIFile, line: c_uint, ) *DIType;