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