首页 > 解决方案 > LLVM 中是否有带有命名参数的 FunctionType?

问题描述

在 LLVM 中,函数如下所示:

define i32 @foo(i32, i32)

通过玩lli,我注意到这也被接受:

define i32 @foo(i32 %first-arg, i32 %second-arg)

然后可以从给定的名称访问参数。

我应该如何使用 C++ API 生成这样一个带有命名参数的函数?我检查了文档,似乎没有办法提供名称,FunctionType::get因为它的第二个参数是ArrayRef<Type *>没有名称(或Twine)字段的类型。

标签: llvmllvm-c++-api

解决方案


名称不是类型的一部分。在类型方面,每个 i32 都是相同的。但是,您可以设置函数参数的名称而不影响类型,就像您可以设置函数的名称一样。我从 LLVM 的中生代版本中抄写了一个 for 循环,并添加了一个 setName() 调用,这很有效:

for (Function::arg_iterator a = foo->arg_begin(), ae = foo->arg_end();
     a != ae;
     ++a) {
  …
  a->setName(bar->name);
  …
}

我认为现在有一种更漂亮的方法来编写该循环。


推荐阅读