带有数组参数的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 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

我的问题是使用LLVMAPI获取数组参数的索引。有什么想法吗? 多谢各位

编辑

这是我使用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();

由于阵列访问,我被困在了newFun的机身上。

我认为您首先需要了解IR的外观。这可以通过窥视或观察结果来实现

在任何情况下,在给定索引处访问数组元素的方法是使用(只接受常量索引)或使用。例如,这两种方法都有相应的构造函数/工厂方法和
IRBuilder
方法来构造它们

builder.CreateExtractValue(y, 3);
创建gep稍微复杂一些;我建议看一看

但是,了解如何调用LLVM API来创建所需IR的一个好方法是使用
llc
(LLVM命令行工具之一)从IR文件生成具有这些调用本身的源文件,请参见以下两个相关问题:


您能否澄清一下您想要实现的目标?您是否不确定生成的IR应该是什么样子?或者您是否理解它应该是什么样子,但需要API调用的帮助才能生成它?或者您正在使用Clang前端,但在AST中找不到数组索引?或者完全是另外一回事……嗨,我刚刚用我现在所拥有的更新了我的帖子。我被困在新乐趣的身体上。我不知道为我生成阵列访问部件的API调用。谢谢你,非常感谢,这就是我要找的。正如您所建议的,llc确实是理解api的好方法。
builder.CreateExtractValue(y, 3);