如何通过LLVM C API将类型传递给getelementptr?

时间:2018-03-29 04:55:24

标签: llvm

我想实现一个函数f,它的唯一参数是指向2 int向量的指针,并返回向量的第二个元素。那是f :: <2 * i32> * --> int

我认为它应该生成如下代码: getelementptr i32, <2 x i32>* %a, i32 1

我正在使用LLVM C API,我无法管理它以生成上面的代码。我发现LLVMBuildGEP已实现为wrap(unwrap(B)->CreateGEP(nullptr, unwrap(Pointer), IdxList, Name));。如果我们使用LLVM C API,是否只能将nullptr传递给CreateGEP

如何使用LLVM C API生成上述代码?

非常感谢。

1 个答案:

答案 0 :(得分:0)

http://llvm.org/doxygen/IR_2Core_8cpp_source.html core.cpp:2897

 LLVMValueRef LLVMBuildGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
                           LLVMValueRef *Indices, unsigned NumIndices,
                           const char *Name) {
   ArrayRef<Value *> IdxList(unwrap(Indices), NumIndices);
   return wrap(unwrap(B)->CreateGEP(nullptr, unwrap(Pointer), IdxList, Name));
 }

如果您使用的是LLVMBuildGEP(C-API),则需要传递BuilderRef,Pointer(指向您的向量的指针),Indices(在您的情况下是i32 1),Numindices(也是一个)和名称。 core.cpp中的代码是一个包装器,它打开C-API调用并调用c ++调用。

现在说了。 我强烈反对使用GEP进行向量元素提取。它会导致某些组合(个人体验)的优化出现问题。 您可以使用extractelement(LLVMBuildExtractElement C-interface)来提取vector元素。

如果您有兴趣,可以在此处详细了解GEP。https://llvm.org/docs/LangRef.html#extractelement-instruction 并在此处完成C-interface列表http://llvm.org/doxygen/group__LLVMCCoreInstructionBuilder.html#gaf392c575dd594d83894d3e71a520ffa4
P.S.:不确定以上链接是否更新。