使用IRBuilder创建具有可变参数数的调用指令-llvm 2.8

使用IRBuilder创建具有可变参数数的调用指令-llvm 2.8,llvm,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.be

我正在尝试使用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>]
llvm::Value*FunctionCall::genLLVM(genLLVM*g){
std::vector paramArrayRef;
std::list paramList=getParamList();
std::list::iterator paramIter=paramList.begin();
无符号整数i=0;
对于(;paramIter!=paramList.end();++paramIter,++i)
paramArrayRef.push_back((*paramIter)->genLLVM(g));
llvm::FunctionType*FT=&getFunctionType(getFunction());
llvm::Function*F=static_cast(g->getModule().getOrInsertFunction(getFunction().getName(),FT));
返回g->getBuilder().CreateCall(F,paramArrayRef,“”);
}
./genllvm.cpp:67:错误:调用“llvm::IRBuilder::CreateCall(llvm::function*&,std::vector&,const char[1])时没有匹配的函数
/usr/include/llvm/Support/IRBuilder.h:891:注意:候选对象为:llvm::CallInst*llvm::IRBuilder::CreateCall(llvm::Value*,const llvm::wirel&)[带bool保留名称=true,T=llvm::ConstantFolder,Inserter=llvm::IRBuilderDefaultInserter]
/usr/include/llvm/Support/IRBuilder.h:894:注意:llvm::CallInst*llvm::IRBuilder::CreateCall(llvm::Value*,llvm::Value*,const llvm::Twine&)[带bool preserveNames=true,T=llvm::ConstantFolder,Inserter=llvm::IRBuilderDefaultInserter]

我浏览了IRBuilder.h文件,但找不到任何可以接受变量参数的函数。是否有一个函数可以创建参数数目可变的函数调用。顺便说一句,我使用的是llvm 2.8,我不记得2.8中的情况(现在已经很古老了),但是现在有很多方法可以创建具有不同数量参数的调用,例如CreateCall{2,3,4,5}和接受任意数量参数的generic CreateCall。见例


如果2.8中没有这样的API函数,那么您要么需要更新到更新版本的LLVM,要么手工插入调用,也就是通过CallInst::Create()并在此之后插入-IRBuilder::insert()调用。

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


如果2.8中没有这样的API函数,那么您要么需要更新到最新版本的LLVM,要么手工插入调用,即通过CallInst::Create()并在此之后插入-IRBuilder::insert()调用。

谢谢@Anton kornikov:!实际上,我在IRBuilder.h中找到了一个函数来创建这样一个调用-模板CallInst*CreateCall(Value*Callee,InputIterator ArgBegin,InputIterator ArgEnd,const Twine&Name=“”){return Insert(CallInst::create(Callee,ArgBegin,ArgEnd),Name);}因此,我刚刚插入了这个语句来创建这样的调用-return g->getBuilder().CreateCall(F,paramArrayRef.begin(),paramArrayRef.end(),“”);谢谢@Anton Kornikov:!实际上,我在IRBuilder.h中找到了一个函数来创建这样一个调用-模板CallInst*CreateCall(Value*Callee,InputIterator ArgBegin,InputIterator ArgEnd,const Twine&Name=“”){return Insert(CallInst::create(Callee,ArgBegin,ArgEnd),Name);}因此,我刚刚插入了这个语句来创建这样的调用-return g->getBuilder().CreateCall(F,paramArrayRef.begin(),paramArrayRef.end(),“”);