Я хочу сгенерировать LLVM IR-код из двух основных функций C++, которые приведены ниже.Функция LLVM IR с параметром массива
int newFun2(int x){
int z = x + x;
return z;
}
int newFun(int *y){
int first = y[3]; //How to define it using the LLVM API?
int num = newFun2(first);
return num;
}
Моя проблема - получить индекс параметра массива с помощью API LLVM. Есть идеи ? Спасибо большое
Editted
Это мой код, используя API:
llvm::LLVMContext &context = llvm::getGlobalContext();
llvm::Module *module = new llvm::Module("AST", context);
llvm::IRBuilder<> builder(context);
//newFun2
llvm::FunctionType *newFunc2Type = llvm::FunctionType::get(builder.getInt32Ty(), builder.getInt32Ty(), false);
llvm::Function *newFunc2 = llvm::Function::Create(newFunc2Type, llvm::Function::ExternalLinkage, "newFun2", module);
llvm::Function::arg_iterator argsFun2 = newFunc2->arg_begin();
llvm::Value* x = argsFun2++;
x->setName("x");
llvm::BasicBlock* block = llvm::BasicBlock::Create(context, "entry", newFunc2);
llvm::IRBuilder<> builder2(block);
llvm::Value* tmp = builder2.CreateBinOp(llvm::Instruction::Add,
x, x, "tmp");
builder2.CreateRet(tmp);
//newFun
llvm::FunctionType *newFuncType = llvm::FunctionType::get(builder.getInt32Ty(), builder.getInt32Ty()->getPointerTo(), false);
llvm::Function *newFunc = llvm::Function::Create(newFuncType, llvm::Function::ExternalLinkage, "newFun", module);
llvm::BasicBlock* block2 = llvm::BasicBlock::Create(context, "entry", newFunc);
llvm::IRBuilder<> builder3(block2);
module->dump();
И это LLVM IR, генерируемый:
; ModuleID = 'AST'
define i32 @newFun2(i32 %x) {
entry:
%tmp = add i32 %x, %x
ret i32 %tmp
}
define i32 @newFun(i32*) {
entry:
}
Я застрял на теле newFun из-за доступа к массиву.
Не мог бы вы уточнить, что вы пытаетесь достичь? Вы не знаете, как должен выглядеть сгенерированный IR? Или вы понимаете, как это должно выглядеть, но нужна помощь в вызовах API для его создания? Или вы используете интерфейс Clang и не можете найти индекс массива в AST? Или, может быть, это совсем другое ... – Oak
привет, я только что обновил свой пост тем, что у меня есть до сих пор. Я застрял на теле newFun. Я не знаю вызова API для создания части доступа к массиву для меня. Спасибо – kayhan