使用IRBuilder创建一个调用指令,以获得可变数量的参数 - llvm 2.8

时间:2011-12-03 15:16:15

标签: llvm

我正在尝试使用llvm IRBuilder创建一个调用指令,如下所示

llvm::Value* FunctionCall::genLLVM(GenLLVM* g){
    std::vector<llvm::Value*> paramArrayRef;
    std::list<Value*> paramList = getParamList();
    std::list<Value*>::iterator paramIter = paramList.begin();
    unsigned int i = 0;
    for(; paramIter != paramList.end(); ++paramIter, ++i)
        paramArrayRef.push_back((*paramIter)->genLLVM(g));

    llvm::FunctionType *FT = &getFunctionType(getFunction());
    llvm::Function *F = static_cast<llvm::Function*>(g->getModule().getOrInsertFunction(getFunction().getName(), FT));

    return g->getBuilder().CreateCall(F, paramArrayRef,"");
}

./genllvm.cpp:67: error: no matching function for call to ‘llvm::IRBuilder<true, llvm::ConstantFolder, llvm::IRBuilderDefaultInserter<true> >::CreateCall(llvm::Function*&, std::vector<llvm::Value*, std::allocator<llvm::Value*> >&, const char [1])’
/usr/include/llvm/Support/IRBuilder.h:891: note: candidates are: llvm::CallInst* llvm::IRBuilder<preserveNames, T, Inserter>::CreateCall(llvm::Value*, const llvm::Twine&) [with bool preserveNames = true, T = llvm::ConstantFolder, Inserter = llvm::IRBuilderDefaultInserter<true>]
/usr/include/llvm/Support/IRBuilder.h:894: note:                 llvm::CallInst* llvm::IRBuilder<preserveNames, T, Inserter>::CreateCall(llvm::Value*, llvm::Value*, const llvm::Twine&) [with bool preserveNames = true, T = llvm::ConstantFolder, Inserter = llvm::IRBuilderDefaultInserter<true>]

我浏览了IRBuilder.h文件,但找不到任何可以接受变量参数的函数。是否有一个函数创建一个带有可变数量参数的函数调用。顺便说一下,我正在使用llvm 2.8

1 个答案:

答案 0 :(得分:1)

我不记得2.8中的情况(现在已经非常古老了),但是目前有很多方法可以用不同数量的参数创建调用,例如: CreateCall {2,3,4,5}和通用的CreateCall,它接受任意数量的args。参见例如http://llvm.org/doxygen/classllvm_1_1IRBuilder.html#a7e31b0c02df2aeed261b103b790cc01e

如果2.8中没有这样的API函数,那么你需要更新到更新版本的LLVM,或者手动插入调用,即通过CallInst :: Create()然后再调用 - IRBuilder :: Insert ()来电。