| author | |
| committer | |
| log | cdb40936bd528ee92dd11cf090ab75cf08bc0fc0 |
| tree | a31dd11ee8cd3ca9d244f788c82e8f5c61939657 |
| parent | d31be31267523cadd6d59b52633f2d4a9758a3b4 |
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; |
| 1741 | 1741 |