Обнаружение массива в списке функций arg LLVM opt pass
Предположим, у меня есть следующий LLVM IR
определить void @foo(i32* %a, i32* %m) существительное { ...
и я вызываю foo, передавая массив для первого аргумента и передавая адрес переменной для m. Теперь мне нужно проанализировать список аргументов foo и определить, какой аргумент передается массиву, а какой - просто адрес указателя. Я знаю, что оба они на самом деле являются адресами, но предоставляет ли LLVM какие-то метаданные, чтобы я мог статически определить тип передаваемого сообщения.
Примечание: я пишу пропуск
1 ответ
Вы, вероятно, можете использовать тип "указатель на массив":
define void @foo([0 x i32]* %a, i32* %m)
Массив нулевого размера вполне допустим, и документация llvm гласит:
Нет ограничений на индексирование за пределами массива, подразумеваемого статическим типом