如何为LLVM IR生成元数据?

时间:2016-10-17 09:07:36

标签: c++ llvm llvm-ir

我正在尝试为我生成的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);

有人可以告诉我如何修改上述代码以生成所需表单的元数据

1 个答案:

答案 0 :(得分:1)

您的元数据将是一个包含3个元素的元组。第一个是全局值,当在元数据层次结构中插入时,它被包装为&#34; ValueAsMetadata&#34; (我们可以使用Constant子类,因为GlobalValues是常量)。第二个是MDString,你有这个。最后一个包裹为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); 。 这应该看起来大致如下

\d+