带有数组参数的LLVM IR函数 我想从下面两个基本的C++函数生成LLVM IR代码。p> 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; }
我的问题是使用LLVMAPI获取数组参数的索引。有什么想法吗? 多谢各位 编辑 这是我使用API的代码:带有数组参数的LLVM IR函数 我想从下面两个基本的C++函数生成LLVM IR代码。p> 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,llvm-c++-api,llvm-ir,Llvm,Llvm C++ Api,Llvm Ir,我的问题是使用LLVMAPI获取数组参数的索引。有什么想法吗? 多谢各位 编辑 这是我使用API的代码: llvm::LLVMContext &context = llvm::getGlobalContext(); llvm::Module *module = new llvm::Module("AST", context); llvm::IRBuilder<> builder(context); //newFun2 llvm::FunctionType *newFunc2
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();
由于阵列访问,我被困在了newFun的机身上。我认为您首先需要了解IR的外观。这可以通过窥视或观察结果来实现 在任何情况下,在给定索引处访问数组元素的方法是使用(只接受常量索引)或使用。例如,这两种方法都有相应的构造函数/工厂方法和
IRBuilder
方法来构造它们
builder.CreateExtractValue(y, 3);
创建gep稍微复杂一些;我建议看一看
但是,了解如何调用LLVM API来创建所需IR的一个好方法是使用llc
(LLVM命令行工具之一)从IR文件生成具有这些调用本身的源文件,请参见以下两个相关问题:
builder.CreateExtractValue(y, 3);