【发布时间】:2013-05-29 20:45:57
【问题描述】:
我想从两个基本的 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;
}
我的问题是使用 LLVM API 获取数组参数的索引。有任何想法吗 ? 非常感谢
已编辑
这是我使用 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 中找不到数组索引?或者也许这完全是另外一回事......
-
嗨,我刚刚更新了我的帖子,用我到目前为止所拥有的内容。我被困在 newFun 的身上。我不知道为我生成数组访问部分的 API 调用。谢谢
标签: llvm llvm-c++-api llvm-ir