如何在LLVM源代码级调试信息中表示函数语言调试信息



我正在为一种基于f#的语言开发llvm前端,f#是一种函数式语言。函数式语言符合值的概念,而不是变量。f#还支持所谓的"可变值"变量,我可以将其建模为%llvm.dbg.declare()来跟踪值。但我不知道如何追踪价值。值不是由alloca创建的,它只是一个值,不会改变。这些例子都是在命令式语言上的实现,比如C语言,它没有这种不可变值的概念。有人对函数式语言的调试信息有什么建议或提示吗?

对于SSA值,使用@llvm.dbg.value()而不是@llvm.dbg.declare。首先,您必须为本地值定义元数据,就像您为@llvm.dbg.declare所做的那样,下面我假设它被定义为!4。LLVM IR看起来像

%x = ...
call void @llvm.dbg.value(metadata !{ i32 %x }, i64 0, metadata !4)

我从http://nondot.org/sabre/LLVMNotes/DebugInfoVariableInfo.txt得到了这个信息,它描述了mem2reg如何转换调试信息。对于当前的LLVM实践来说,这可能已经过时了,因此您可以使用alloca s和@llvm.dbg.declare编写一些IR,然后运行mem2reg pass,以查看转换为SSA时调试信息的变化情况。

最新更新