3

我正在为基于 F#(一种函数式语言)的语言开发 llvm 前端。好吧,函数式语言匹配值的概念,而不是变量。F# 还支持所谓的“可变值”变量,我可以将其建模为 %llvm.dbg.declare() 来跟踪值。但我不知道如何跟踪价值。一个值不是由 alloca 创建的,它只是一个值,不会改变。并且这些示例都说明了诸如 C 之类的命令式语言的实现,它没有这个不可变的值概念。有人对功能样式语言的调试信息有一些建议或提示吗?

4

1 回答 1

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 实践而言,这可能已经过时,因此您可以使用allocas 和编写一些 IR @llvm.dbg.declare,然后运行 ​​mem2reg 传递以查看调试信息在转换为 SSA 时如何变化。

于 2013-09-20T15:31:03.717 回答