Есть ли в 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).


person iBug    schedule 20.11.2019    source источник
comment
Кстати, я взял ссылку со страницы вашего профиля и теперь добавил ее в свой собственный.   -  person arnt    schedule 20.11.2019


Ответы (1)


Имена не являются частью типа. С точки зрения типов, все i32 одинаковы. Однако вы можете установить имя аргумента функции, не влияя на тип, точно так же, как вы можете установить имя функции. Я взял цикл for из мезозойской версии LLVM и добавил вызов setName(), и это сработало:

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

Я предполагаю, что теперь есть более красивый способ написать этот цикл.

person arnt    schedule 20.11.2019