authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-09-13 03:03:34-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-09-13 03:09:29-07:00
logcdb40936bd528ee92dd11cf090ab75cf08bc0fc0
treea31dd11ee8cd3ca9d244f788c82e8f5c61939657
parentd31be31267523cadd6d59b52633f2d4a9758a3b4

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.

1 files changed, 2 insertions(+), 2 deletions(-)

src/codegen/llvm/bindings.zig+2-2
...@@ -1734,8 +1734,8 @@ pub const DIBuilder = opaque {...@@ -1734,8 +1734,8 @@ pub const DIBuilder = opaque {
1734 dib: *DIBuilder,1734 dib: *DIBuilder,
1735 tag: c_uint,1735 tag: c_uint,
1736 name: [*:0]const u8,1736 name: [*:0]const u8,
1737 scope: *DIScope,1737 scope: ?*DIScope,
1738 file: *DIFile,1738 file: ?*DIFile,
1739 line: c_uint,1739 line: c_uint,
1740 ) *DIType;1740 ) *DIType;
17411741