LLVM 中是否有带命名参数的 FunctionType?
Is there a FunctionType with named arguments in LLVM?
在 LLVM 中,函数如下所示:
define i32 @foo(i32, i32)
通过玩 lli
,我注意到这也被接受:
define i32 @foo(i32 %first-arg, i32 %second-arg)
然后可以从给定的名称访问参数。
我应该如何使用 C++ API 生成这样一个带有命名参数的函数?我检查了文档,似乎无法为 FunctionType::get
提供名称,因为它的第二个参数是 ArrayRef<Type *>
类型,其中没有名称字段(或 Twine
)。
名称不是类型的一部分。在类型方面,每个 i32 都是相同的。但是,您可以在不影响类型的情况下设置函数参数的名称,就像您可以设置函数的名称一样。我从 LLVM 的中生代版本中抄写了一个 for 循环并添加了一个 setName() 调用,并且成功了:
for (Function::arg_iterator a = foo->arg_begin(), ae = foo->arg_end();
a != ae;
++a) {
…
a->setName(bar->name);
…
}
我假设现在有一种更漂亮的方式来编写该循环。
在 LLVM 中,函数如下所示:
define i32 @foo(i32, i32)
通过玩 lli
,我注意到这也被接受:
define i32 @foo(i32 %first-arg, i32 %second-arg)
然后可以从给定的名称访问参数。
我应该如何使用 C++ API 生成这样一个带有命名参数的函数?我检查了文档,似乎无法为 FunctionType::get
提供名称,因为它的第二个参数是 ArrayRef<Type *>
类型,其中没有名称字段(或 Twine
)。
名称不是类型的一部分。在类型方面,每个 i32 都是相同的。但是,您可以在不影响类型的情况下设置函数参数的名称,就像您可以设置函数的名称一样。我从 LLVM 的中生代版本中抄写了一个 for 循环并添加了一个 setName() 调用,并且成功了:
for (Function::arg_iterator a = foo->arg_begin(), ae = foo->arg_end();
a != ae;
++a) {
…
a->setName(bar->name);
…
}
我假设现在有一种更漂亮的方式来编写该循环。