Создание инструкции вызова с использованием IRBuilder с переменным числом аргументов - llvm 2.8 - PullRequest
1 голос
/ 03 декабря 2011

Я пытаюсь создать инструкцию вызова, используя IRBuilder llvm, как показано ниже

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 Ответ

1 голос
/ 04 декабря 2011

Я не помню ситуацию в 2.8 (сейчас она довольно древняя), но в настоящее время существует множество методов для создания вызовов с различным количеством аргументов, например, CreateCall {2,3,4,5} и универсальный CreateCall, который принимает произвольное количество аргументов. Смотрите, например http://llvm.org/doxygen/classllvm_1_1IRBuilder.html#a7e31b0c02df2aeed261b103b790cc01e

Если в 2.8 таких функций API нет, то вам нужно либо обновить до более поздней версии LLVM, либо вставить вызов вручную, то есть через CallInst :: Create (), и после этого - IRBuilder :: Insert () звонки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...