【问题标题】:how to represent functional language debug information in llvm source level debug information?如何在 llvm 源级调试信息中表示功能语言调试信息?
【发布时间】:2013-05-01 00:46:54
【问题描述】:

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

【问题讨论】:

  • 我不知道,但也许用constllvm-gcc -g -O0 编译一些C++,看看它会产生什么?
  • @EliBendersky F# 是一种静态类型语言。 “值”指的是 F# 中的不可变变量。

标签: debugging f# functional-programming llvm


【解决方案1】:

对于 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 和 @llvm.dbg.declare 编写一些 IR,然后运行 ​​mem2reg pass 以查看调试信息在转换为 SSA 时如何变化。

【讨论】:

    猜你喜欢
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    相关资源
    最近更新 更多