我正在尝试为我生成的 LLVM IR 生成元数据。我想生成以下形式的元数据:
!nvvm.annotations = !{!0}
!0 = metadata !{void ()* @foo, metadata !"kernel", i32 1}
其中 foo 是我的 LLVM IR 中的一个函数。现在我只能生成以下形式的元数据:
!nvvm.annotations = !{!0}
!0 = !{!"kernel"}
我使用以下代码来生成上述元数据。
char metaDataArgument[512];
sprintf(metaDataArgument, "%s", pipelineKernelName);
llvm::NamedMDNode *nvvmMetadataNode = LLVMModule->getOrInsertNamedMetadata("nvvm.annotations");
llvm::MDNode *MDNOdeNVVM = llvm::MDNode::get(*context, llvm::MDString::get(*context, "kernel"));
nvvmMetadataNode->addOperand(MDNOdeNVVM);
有人可以告诉我如何修改上面的代码来生成所需形式的元数据
您的元数据将是一个包含 3 个元素的元组。
- 第一个是全局值,在元数据层次结构中插入时将其包装为“ValueAsMetadata”(我们可以使用 Constant 子类,因为 GlobalValues 是常量)。
- 第二个是 MDString,您得到了这个。
- 最后一个被包装为
ConstantAsMetadata
.
这应该看起来大约如下所示:
SmallVector<Metadata *, 32> Ops; // Tuple operands
GlobalValue *Foo = Mod.getNamedValue("foo");
if (!Foo) report_fatal_error("Expected foo..");
Ops.push_back(llvm::ValueAsMetadata::getConstant(Foo));
Ops.push_back(llvm::MDString::get(*context, "kernel"));
// get constant i32 1
Type *I32Ty = Type::getInt32Ty(*context);
Contant *One = ConstantInt::get(I32Ty, 1);
Ops.push_back(llvm::ValueAsMetadata::getConstant(One));
auto *Node = MDTuple::get(Context, Ops);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)