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

时间:2013-05-07 06:37:14

标签: debugging f# functional-programming llvm

我正在为一种基于功能语言F#的语言开发一个llvm前端。那么,函数式语言与值的概念相匹配,而不是变量。 F#还通过所谓的“可变值”支持变量,我可以将其建模为%llvm.dbg.declare()来跟踪该值。但我不知道如何跟踪价值。 alloca不会创建一个值,它只是一个值,不会改变。这些例子都讲述了C等命令式语言的实现,它没有这个不可变的值概念。任何人对函数式语言的调试信息都有一些建议或暗示吗?

1 个答案:

答案 0 :(得分:0)

对于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@llvm.dbg.declare编写一些IR,然后运行mem2reg传递以查看调试信息在转换为SSA。