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