【问题标题】:Tracking global definitions in LLVM跟踪 LLVM 中的全局定义
【发布时间】:2014-03-06 07:33:00
【问题描述】:

我正在尝试手动构建指令列表,其中特定变量在 LLVM IR 中被赋值。

对于函数中的局部变量,我可以通过使用指令迭代器并检查特定指令的操作数轻松获得正确的指令集。这种方法似乎不适用于全局变量,因为没有与之关联的存储指令。

有没有什么方法可以在不查看元数据字段的情况下跟踪全局变量的定义位置?如果没有,有没有办法创建一个虚拟指令,可以作为全局变量初始定义的特殊标记?

【问题讨论】:

    标签: llvm llvm-ir


    【解决方案1】:

    对于函数中的局部变量,我可以通过使用指令迭代器并检查特定指令的操作数轻松获得正确的指令集。

    这并不完全准确。只要变量在内存中(并且赋值是通过 store 完成的),它就是正确的,但如果它被提升为寄存器,您将需要依赖 llvm.dbg.value 调用来跟踪其中的赋值。

    这种方法似乎不适用于全局变量,因为没有与之关联的存储指令。

    对全局变量的分配也显示为stores - 除了初始分配。

    有没有什么方法可以在不查看元数据字段的情况下跟踪全局变量的定义位置?

    如果“位置”是指在哪个源代码行中,则必须依赖调试信息元数据。

    【讨论】:

    • 我在将变量提升为寄存器之前执行此操作。我终于能够通过 getNamedValue() 方法获得全局分配的 (Value *) 并能够使用它来跟踪全局变量的重新定义。可能不是最好的解决方案,但它现在似乎可以完成这项工作。
    猜你喜欢
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    • 2011-12-22
    • 1970-01-01
    相关资源
    最近更新 更多