【问题标题】:How to generate metadata for LLVM IR?如何为 LLVM IR 生成元数据?
【发布时间】:2016-10-17 09:07:35
【问题描述】:

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

谁能告诉我如何修改上面的代码来生成所需形式的元数据

【问题讨论】:

    标签: c++ llvm llvm-ir


    【解决方案1】:

    您的元数据将是一个包含 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-07
      相关资源
      最近更新 更多