向LLVM IR中的指令添加元数据

向LLVM IR中的指令添加元数据,llvm,llvm-c++-api,llvm-ir,Llvm,Llvm C++ Api,Llvm Ir,首先,我是LLVM通行证的新手 我试图在转换传递(L+VC++)之后向LVVM中添加元数据。我打算将此信息存储起来,以供工具链中的其他工具使用。关于这一点,我有两个问题 我希望我存储为元数据的信息能够提供给另一个在LLVM IR上工作的工具。元数据是个好主意吗?我打算用一些说明将字符串存储为元数据 如果元数据是正确的方法,那么我需要一些帮助来创建元数据节点。我计划使用setMedata()函数将其附加到指令。setMetadata()的哪个变量是正确的。我不确定我的数据应该是哪种类型的。我想创建

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

<>我试图在转换传递(L+VC++)之后向LVVM中添加元数据。我打算将此信息存储起来,以供工具链中的其他工具使用。关于这一点,我有两个问题

  • 我希望我存储为元数据的信息能够提供给另一个在LLVM IR上工作的工具。元数据是个好主意吗?我打算用一些说明将字符串存储为元数据

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

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

    在我看来:

    1.元数据是正确的使用机制吗? 如果你的“其他工具”本身不是一个通行证,那么是的,我认为元数据是最好的方法——将所有内容都保存在IR中,易于肉眼识别,易于手动添加以进行测试,而且——也许最重要的是——只要你不重用现有的元数据类型,就不会与任何其他内容发生冲突

    但是,如果您的“其他工具”本身就是一个过程,那么有一个替代方法:您可以使一个过程依赖于另一个过程,而不是在后面的过程中直接使用前面过程中的信息。优点是不需要修改IR

    2.如何使用自定义元数据节点? 使用
    setMetadata
    char*
    变量,如下所示:

    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();
    
    cast(Inst->getMetadata(“my.md.name”)->getOperator(0))->getString();
    
    但是,如果要从同一范围重复调用
    getMetadata
    setMetadata
    ,也可以使用
    Module::getMDKindID
    仅获取实际使用的种类,并使用这些使用种类值的方法的变体


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

    如何在LLVM中向元数据添加多个操作数?我想生成表单的元数据:!0=元数据!{void(i32)*@kernel,metadata!“kernel”,i32 1}@JohnsPaul如果您有一个新问题,即使是与此相关的问题,请单独提问。@Oak我遇到以下错误opt-7:test3。ll:68:209:error:当我运行“我的通行证”时,字段“nameTableKind”无效。您能帮助我吗?我想获得函数调用的行号,我使用以下命令clang-O0-g-S-emit llvm test3.c-o test3。ll@sunil我帮不了你,你最好用你的问题提出一个新问题。