在运行时使用LLVM-IR段错误生成的代码

问题描述 投票:0回答:1

我正在编写一个玩具编译器,并且使用llvm 10作为它的后端。我想要拥有的功能之一是链表类型,就像函数式编程一样。我在下面提供的IR由我的编译器生成,

我不能给你代码,因为它有几千行,而且是生锈的。我用断言编译了llvm,所以我认为问题不存在。我很确定我会生成某种奇怪的返回值,因为仅当我返回list_type时程序才会出现段错误。

此代码malloc分配内存,它不释放任何数据。那是因为我稍后会更改它以使用垃圾收集器,这也不是问题。

问题是,您能否找到它在运行时出现段错误的原因?我也可以提供Windows可执行文件(有人需要)。

def main():
            list[int] j
            int i 
            def list[int] test():
                list[int] j
                j := 5 # j
                j := 10 # j
                return j
            end
            j := test()
            i := head(j)
            puti(head(j))
        end

生成的LLVM-IR代码为here

segmentation-fault compiler-construction llvm llvm-ir
1个回答
0
投票

感谢@arnt,我找到了解决方案。我基本上生成了错误的llvm-ir,因为我要一个接一个地创建2条返回指令。这会使llvm导致未定义的行为,因此我建议使用llvm随附的verifier在编译之前检查所生成代码的完整性。

© www.soinside.com 2019 - 2024. All rights reserved.