【问题标题】:Adding Metadata to Instructions in LLVM IR向 LLVM IR 中的指令添加元数据
【发布时间】:2012-11-16 23:12:13
【问题描述】:

首先,我是 LLVM 通行证的新手。

我正在尝试在转换通过后将元数据添加到 LLVM 中的指令中(使用 C++ API)。我打算存储此信息以供工具链中的另一个工具使用。我对此有两个问题。

  1. 我希望将我存储为元数据的信息提供给另一个适用于 LLVM IR 的工具。那么元数据是个好主意吗?我打算将字符串存储为带有一些说明的元数据。

  2. 如果元数据是正确的方法,我需要一些帮助来创建元数据节点。我计划使用 setMedata() 函数将其附加到指令中。 setMetadata() 的哪个变体是正确的。我不确定我的数据应该属于哪个 MDKind。我想创建一个 MDString,将它附加到我的 MDNode,然后使用指令调用 setMetadata()。如果我想将元数据附加到函数内的指令,我应该在 setMedata() 中使用什么上下文。上下文与元数据的相关性是什么?

我尝试阅读论坛和 llvm doxygen 文档中的大量讨论,但我没有得到所有问题的清晰完整的答案。感谢您的帮助或一些可以帮助我理解这一点的材料。

【问题讨论】:

    标签: llvm llvm-c++-api llvm-ir


    【解决方案1】:

    在我看来:

    1。元数据是正确使用的机制吗?

    如果您的“其他工具”本身不是通行证,那么是的,我认为元数据是最好的方法 - 将所有内容保存在 IR 中,易于肉眼识别,易于手动添加以进行测试,而且 - 也许大多数重要的是 - 不会与其他任何东西发生冲突,只要您不重用现有的元数据类型。

    但是,如果您的“其他工具”本身就是一个传递,则还有另一种选择:您可以使一个传递依赖于另一个传递,而不是直接在后面的传递中使用之前的信息。优点是您不必修改 IR。

    2。如何使用自定义元数据节点?

    使用setMetadatachar* 变体,如下所示:

    LLVMContext& C = Inst->getContext();
    MDNode* N = MDNode::get(C, MDString::get(C, "my md string content"));
    Inst->setMetadata("my.md.name", N);
    

    如果这是第一次在setMetadata 中使用该字符串,它会自动将my.md.name 注册为模块中的一种新类型(我相信它在整个上下文中实际上是一致的)。您可以稍后使用以下方法检索字符串:

    cast<MDString>(Inst->getMetadata("my.md.name")->getOperand(0))->getString();
    

    如果您想在同一范围内重复调用 getMetadatasetMetadata,您也可以使用 Module::getMDKindID 来获取实际使用的种类,并使用这些使用种类值的方法的变体.

    最后,请注意,您可以将元数据节点范围限制在函数内 - 为此使用 MDNode::get(..., ..., true) 变体 - 尽管我自己从未使用过。

    【讨论】:

    • 如何在 LLVM 的元数据中添加多个操作数?我想生成以下形式的元数据: !0 = metadata !{void (i32)* @kernel, metadata !"kernel", i32 1}
    • @JohnsPaul 如果您有新问题,甚至与这个问题有关,请单独提出。
    • @Oak 我收到以下错误 opt-7: test3.ll:68:209: error: invalid field 'nameTableKind' 当我运行我的通行证时。你能帮我解决这个问题吗?我想获取我的函数调用的行号,我正在使用以下命令 clang -O0 -g -S -emit-llvm test3.c -o test3.ll
    • @sunil 我帮不了你,你最好用你的问题创建一个新问题。
    猜你喜欢
    • 2018-01-12
    • 2014-12-28
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多