【问题标题】:access user variable names in llvm ir pass在 llvm ir pass 中访问用户变量名
【发布时间】:2014-10-03 13:48:45
【问题描述】:

我是 llvm 的新手。我想通过写一个 llvm 传递来计算对用户定义变量的访问次数。

我需要知道如何获取源文件中的所有变量,而不是 llvm ir 生成的临时变量。我知道我可以遍历所有指令并查看它是否是加载存储指令[或可以从内存写入或读取的指令]。但是我怎么知道哪些变量是用户定义的,哪些是临时变量?

【问题讨论】:

    标签: compiler-construction llvm


    【解决方案1】:

    您需要解决此问题的关键是使用模块中嵌入的the source-level debug information

    如果您想解决未优化代码的问题,您可能应该查看所有alloca 指令,并针对与变量关联的每条指令(通过llvm.dbg.declare)跟踪所有存储和加载到该变量记忆。

    优化代码的事情变得更加混乱 - 不仅因为现在您需要考虑llvm.dbg.value,而且因为对该变量的访问大多是间接的,因此您必须做的不仅仅是检查哪里该值已被使用。

    【讨论】:

    • 感谢您的回复!由于我使用的是未优化的代码,我可以简单地遍历所有 alloca 指令并存储变量名称......但这不只适用于局部变量吗?据我所知,全局变量没有关联的 allca 指令!
    • @killx 正确,全局变量的工作方式不同。只需检查所有这些 - they appear in the debug metadata - 并检查存储和加载到这些值。顺便说一句,您可以在the implementation of DebugInfoFinder 中找到有关如何迭代这些(和其他调试结构)的示例实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 2021-07-18
    • 2018-10-30
    • 1970-01-01
    • 2017-05-31
    相关资源
    最近更新 更多