我想从两个基本的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获取数组参数的索引。有任何想法吗 ? 非常感谢你
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的主体上。
答案 0 :(得分:4)
我认为您首先需要了解IR的外观。可以通过查看the language specification或using Clang to compile the C code into IR并查看结果来完成。
在任何情况下,访问给定索引处的数组元素的方式是使用extractvalue(仅接受常量索引)或使用gep。这两个都有相应的构造函数/工厂方法和IRBuilder
方法来构造它们,例如
builder.CreateExtractValue(y, 3);
创建一个gep有点复杂;我建议您查看the gep guide。
但是,了解如何调用LLVM API来创建所需IR的一种好方法是使用llc
(LLVM命令行工具之一)生成源文件,这些调用本身来自IR文件,请参阅以下两个相关问题: