【发布时间】:2014-10-03 13:48:45
【问题描述】:
我是 llvm 的新手。我想通过写一个 llvm 传递来计算对用户定义变量的访问次数。
我需要知道如何获取源文件中的所有变量,而不是 llvm ir 生成的临时变量。我知道我可以遍历所有指令并查看它是否是加载存储指令[或可以从内存写入或读取的指令]。但是我怎么知道哪些变量是用户定义的,哪些是临时变量?
【问题讨论】:
标签: compiler-construction llvm
我是 llvm 的新手。我想通过写一个 llvm 传递来计算对用户定义变量的访问次数。
我需要知道如何获取源文件中的所有变量,而不是 llvm ir 生成的临时变量。我知道我可以遍历所有指令并查看它是否是加载存储指令[或可以从内存写入或读取的指令]。但是我怎么知道哪些变量是用户定义的,哪些是临时变量?
【问题讨论】:
标签: compiler-construction llvm
您需要解决此问题的关键是使用模块中嵌入的the source-level debug information。
如果您想解决未优化代码的问题,您可能应该查看所有alloca 指令,并针对与变量关联的每条指令(通过llvm.dbg.declare)跟踪所有存储和加载到该变量记忆。
优化代码的事情变得更加混乱 - 不仅因为现在您需要考虑llvm.dbg.value,而且因为对该变量的访问大多是间接的,因此您必须做的不仅仅是检查哪里该值已被使用。
【讨论】:
DebugInfoFinder 中找到有关如何迭代这些(和其他调试结构)的示例实现。