2016-10-17 4 views
1

私は生成した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

あなたのメタデータは3つの要素を持つタプルになり、必要な形式のメタデータを生成するために上記のコードを修正するために私に言うことができます。最初のものはグローバル値で、メタデータ階層に挿入すると "ValueAsMetadata"としてラップされます(GlobalValuesは定数なのでConstantサブクラスを使用できます)。 2番目はMDStringですが、これは1つです。最後のものは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); 
従うようになるはずです
関連する問題