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

时间:2020-04-20 18:49:09

标签: segmentation-fault compiler-construction llvm llvm-ir

我正在编写一个玩具编译器,并且使用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

1 个答案:

答案 0 :(得分:0)

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