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