【问题标题】:LLVM IR Function with an array parameter带有数组参数的 LLVM IR 函数
【发布时间】: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


【解决方案1】:

我认为您首先需要了解 IR 的外观。可以通过查看the language specificationusing 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 文件中生成带有这些调用本身的源文件,请参阅以下两个相关问题:

【讨论】:

  • 非常感谢,这正是我想要的。正如您所建议的,llc 确实是理解 api 的好方法。
猜你喜欢
  • 2014-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多